我正在开发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
答案 0 :(得分:3)
您不必在字符串中使用控制字符(或其他“异常”字符)做任何特殊操作。您只需要能够将它们输入编辑器即可。这将是多么容易取决于你的编辑。在Emacs和至少一些终端模拟器中,您可以按 Ctrl - Q ,然后按字母顺序插入另一个字符。因此,您可以按 Ctrl - Q ,然后按 Escape 以插入文字#\转义字符。它的出现取决于终端模拟器或编辑器。在我的终端中,文字转义字符显示为^[
。因此,我最终得到:
(format t "^[[1;31mhello^[[0!")
; ** **
; result of C-Q Esc
这给了我一些红色文字,如你的例子所示:
如果您不希望您的来源包含可能不易阅读的字符,您可能会看到像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