在Lisp / Emacs中打印彩色字符

6
我正在使用Lisp编写一个简单的连四游戏程序,理想情况下每个玩家(红色,黑色)在游戏状态显示时都有自己的颜色。有人知道如何打印彩色ASCII字符吗?通常是如何实现的?我正在使用emacs 23,因此解决方案可能特定于emacs本身。
无论如何,我已经检查了hyperspec,看看是否可以使用FORMAT,但目前为止没有运气。提前致谢。

1
什么是Lisp?Emacs Lisp?'HyperSpec'不适用于Emacs Lisp,而是适用于Common Lisp。从Emacs Lisp打印彩色文本应该在Emacs手册中有所涉及。Common Lisp没有内置的彩色文本功能,因为用户界面超出了Common Lisp标准的范围。通常,人们会使用图形工具包(如CAPI、CLIM等)或类似'curses'接口的东西。如果您正在使用Emacs Lisp,则可以使用Emacs内置功能。我猜您也可以查看一些随Emacs附带的游戏以获得灵感。 - Rainer Joswig
可能性是,根据Rainer的评论,“Lisp”的含义而定,http://en.wikipedia.org/wiki/ANSI_escape_code可能是您正在寻找的简单解决方案。 - Pascal Cuoq
我正在使用SBCL,它是许多CL的变体之一,尽管它在emacs中运行SLIME。不过,这应该已经在emacs手册中涵盖了,对吧?感谢您的输入,我的Lisp世界每天都在扩大。 - Limpoch
你有两个非常不同的选择:你可以用SBCL编写游戏,在这种情况下,你需要一个Common Lisp用户界面库;或者你可以用Emacs Lisp编写游戏,并使用Emacs的内置功能。SLIME是你在Emacs中用来编辑Common Lisp代码的工具——类似于文本编辑器,但具有更多功能。你的Lisp代码并不在Emacs中“运行”。如果你希望代码在Emacs中运行(并利用Emacs的内置彩色文本能力),那么必须使用Emacs Lisp。在解决这个问题之前,你需要决定哪种方式适合你。 - Noah Lavine
你找到了你要寻找的解决方案吗? - johnbakers
4个回答

6
在Emacs中,文本的外观由“faces”控制。面可以通过覆盖或文本属性进行更改。以下是使用后者的示例:
;; Emacs-Lisp (insert (propertize "foo" 'font-lock-face '(:foreground "red")))
然而,如果游戏是在SBCL中实现的,你需要一种从SBCL程序与Emacs通信的方式。由于似乎你正在使用Slime,使用Swank可能是最方便的:
;; Common-Lisp (swank::eval-in-emacs '(with-current-buffer (slime-repl-buffer) (insert (propertize "foo" 'font-lock-face '(:foreground "red")))))

4

不要介意我自己打广告:你可以尝试这个,它是一个在Web浏览器中运行的Common Lisp图形终端。它使用HTML来输出内容,所以你可以像这样做:

(gtfl-out (:p :style "color:red;" "some characters"))

2

我刚刚编写了一个Elisp defun来测试颜色。它可能在设置Linux VTs的通用颜色时很有用。请注意,颜色列表(“black”,“red”等)只是传统上和通常定义的方式 - 如果您将它们设置为其他颜色,则红色可能不再是红色。尽管如此,这仍然可以是一个有用的测试工具。

;;;; insert colored and/or bright text
(defun insert-colored-text (str clr bright)
  "Inserts str at point, in color clr, bright or not."
  (interactive (list (read-string " String: ")
                     (read-string " Color: ")
                     (y-or-n-p    " Bright? ") ))
  (insert (propertize str 'font-lock-face
          `(:weight ,(if bright 'bold 'normal) :foreground ,clr) )))
(defalias 'ict 'insert-colored-text)

(defun test-all-faces ()
  "Prints a test string in al colors, both normal and bright."
  (interactive)
  (let ((str "This is what it looks like"))
    (dolist (bold '(nil t) nil)
      (dolist (color
               '("black" "red" "green" "yellow" "blue"
                 "magenta" "cyan" "white") nil)
        (insert-colored-text
         (format "%s in %s (that is %sbold)\n" str color
                 (if bold "" "not ")) color bold) ))))
(defalias 'taf 'test-all-faces)

示例输出 http://user.it.uu.se/~embe8573/cols.png


2
我正在寻找相同的答案并来到这里,过了一会儿从另一个链接[改变Common Lisp REPL中文本的颜色]找到了答案。
我认为也许你需要它,答案是:
您可以使用ANSI转义代码打印彩色文本:
(format t "~c[31mabc~c[0m~%" #\ESC #\ESC) ; 这将在大多数现代终端上打印红色的 "abc" ,虽然我不确定这是否适用于slime。
分享和改进 答案由SaltyEgg于2013年10月6日16:06提供。

谢谢!这篇文章让我更深入地理解了格式化函数的工作原理!你知道 #\ESC 函数在哪里有文档记录吗? - rmoro
#\ESC 不是标准写法,更好的可移植性表达方式可能是 (format t "~c[31m红色~:*~c[32m绿色~:*~c[34m蓝色~:*~c[m无格式~%" (code-char 27)) - Devon

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