在Common Lisp REPL中更改文本的颜色

7
我希望能够控制在Common Lisp中显示的文本颜色。 类似于以下伪代码:
(print-color (:red "hello") (:blue "world"))

有没有办法实现这个功能?我使用SBCL,我的REPL在Emacs中。


1
我认为SLIME的scratch-buffer已经有了着色,那不是一个替代方案吗?REPL中的一些面孔与语言语义无关(用于调用一些SLIME函数进行内省/反射),因此我不会急于更改它们。 - user797257
@wvxvw SLIME刮擦缓冲区是什么?这与Emacs中的scratch缓冲区有所不同吗?如果是这样,我该如何调用它?我想控制REPL中的颜色是为了帮助测试我的程序 - 我正在做一个棋盘游戏。 - S4M
M-x slime-scratch http://common-lisp.net/project/slime/doc/html/Scratch-Buffer.html - Baggers
我不知道Slime Scratch如何帮助颜色,但如果您已经安装了Slime,则已经拥有了Slime Scratch。如果您不使用emacs和slime,则无法单独安装它。如果您想了解如何安装Slime和Emacs,请查看此处:http://www.youtube.com/watch?v=VnWVu8VVDbI&feature=share&list=PL2VAYZE_4wRIoHsU5cEBIxCYcbHzy4Ypj 请注意,这是关于Lisp开发的,我不知道Slime Scratch与彩色输出有什么关系。 - Baggers
我想说的是,当你在草稿缓冲区中编写代码时,它具有与常规缓冲区相同的语法突出显示(不像REPL,其中语法突出显示传达不同的含义-它标记了SLIME可以内省或以其他方式交互的对象)。 - user797257
显示剩余3条评论
3个回答

10
您可以使用ANSI转义码来打印彩色文本:
(format t "~c[31mabc~c[0m~%" #\ESC #\ESC) ; this prints a red "abc" for most modern terminals

我不确定这个在 Slime 中是否有效。



1
在Slime中无法工作,但可以在处于comint-mode的*inferior-lisp*缓冲区中工作。如果slime-repl-mode是从comint-mode派生而来(应该是这样),那么这个问题就可以避免重复、重新发明和功能滞后,例如下面描述的slime-repl-ansi-color功能。 - Devon

2
为了启用 ANSI 颜色转义序列,请加载 http://melpa.org/#/slime-repl-ansi-color 包 — 但由于一个错误,您可能需要在 REPL 缓冲区中执行 M-x slime-repl-ansi-color-mode RET。从各种已弃用的有缺陷版本中提取出最佳和最新版本,请访问 https://gitlab.com/augfab/slime-repl-ansi-color

slime-repl-ansi-color.el

(require 'ansi-color)
(require 'slime)

(define-minor-mode slime-repl-ansi-color-mode
  "Process ANSI colors in Lisp output."
  nil
  :lighter " SlimeANSI")

(define-slime-contrib slime-repl-ansi-color
  "Turn on ANSI colors in REPL output"
  (:authors "Max Mikhanosha")
  (:license "GPL")
  (:slime-dependencies slime-repl)
  (:on-load
   (add-hook 'slime-repl-mode-hook 'slime-repl-ansi-color-mode)))

(defadvice slime-repl-emit (around slime-repl-ansi-colorize activate compile)
  "Process ANSI colors in the Lisp output."
  (with-current-buffer (slime-output-buffer)
    (let ((start slime-output-start))
      (setq ad-return-value ad-do-it)
      (when slime-repl-ansi-color-mode
        (ansi-color-apply-on-region start slime-output-end)))))

(provide 'slime-repl-ansi-color)

在你的.emacs初始化文件中,类似以下内容:
(add-to-list 'slime-contribs 'slime-repl-ansi-color)

应该启用Slime REPL表达式。
(format t "~c[31mRed~:*~c[32mGreen~:*~c[34mBlue~:*~c[mPlain~%" (code-char 27))

产生多彩输出。请尝试。
(ql:quickload :cl-ansi-text)

(cl-ansi-text:with-color (:green :style :background)
  (cl-ansi-text:with-color (:yellow :effect :bright)
    (princ " Yellow on Green ")))

(princ (cl-ansi-text:green
        (cl-ansi-text:yellow " Yellow on Green " :effect :bright)
        :style :background))

0
(defun color-text (string color); ANSI escape code 
 (let((color
  (cond
    ((string= color "red") "31")
    ((string= color "green") "32")
    ((string= color "yellow") "33")
    ((string= color "white") "37")
    ((string= color "bright blue") "94")
    ((string= color "bright yellow") "93")
    ((string= color "bright cyan") "96")
    ((string= color "bright magneta") "95")
    (t "90")
 )))  
  (format t (concatenate 'string "~c[" color "m" ) #\ESC )
   (eval(read-from-string string))
  (format t (concatenate 'string "~c[" color "m~c[0m"  ) #\ESC #\ESC))
); (color-text "(format t \"~a\" \"ADASDASDASDA dsfsdf\")" "red")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接