在字符串中使用字符代码

时间:2014-08-01 19:31:20

标签: string ascii common-lisp

我正在开发Linux下的终端程序。我考虑添加彩色输出。

任务并不是很难,所以我成功了以下几点:

[3]> (format t "~a[1;31mred text~a[0m" #\escape #\escape)
red text ; this text is really red and bold in terminal ;-)
NIL

但代码很难看:我不知道如何将char #\escape(十进制值27)以“内联”方式放入字符串中。例如来自this thread的C ++代码:

cout << "\033[1;31mbold red text\033[0m\n";

#\Escape\033(八进制)。 Common Lisp中有类似的内容吗?

我的努力naïf无法正常工作:

[4]> (format t "#\escape1;31mred test#\escape[0m")
#escape1;31mred test#escape[0m
NIL

1 个答案:

答案 0 :(得分:3)

您可以手动输入字符...

您不必在字符串中使用控制字符(或其他“异常”字符)做任何特殊操作。您只需要能够将它们输入编辑器即可。这将是多么容易取决于你的编辑。在Emacs和至少一些终端模拟器中,您可以按 Ctrl - Q ,然后按字母顺序插入另一个字符。因此,您可以按 Ctrl - Q ,然后按 Escape 以插入文字#\转义字符。它的出现取决于终端模拟器或编辑器。在我的终端中,文字转义字符显示为^[。因此,我最终得到:

(format t "^[[1;31mhello^[[0!")
;          **           **     
;         result of C-Q Esc

这给了我一些红色文字,如你的例子所示:

enter image description here

...或者使用库来简化它!

如果您不希望您的来源包含可能不易阅读的字符,您可能会看到像Edi Weitz的CL-INTERPOL

  

CL-INTERPOL是Common Lisp的一个库,用于修改   阅读器,以便您可以在类似于字符串的内插   Perl或Unix Shell脚本。它还提供了各种插入方式   即使你的编辑器/ IDE,任意字符也成为文字字符串   不支持他们。这是一个例子:

* (let ((a 42))
    #?"foo: \xC4\N{Latin capital letter U with diaeresis}\nbar: ${a}")
"foo: ÄÜ
bar: 42"

使用CL-INTERPOL,这变得容易:

* (interpol:enable-interpol-syntax)

* (format t #?"\e[1;31mhello\e[0m!")
hello!                                ; there's color here, honest!
NIL