Печать цветных символов в Lisp/Emacs

Я пишу простую программу connect-4 на Лиспе, и в идеале каждый игрок (красный, черный) должен иметь свой цвет при отображении состояния игры. Кто-нибудь знает, как печатать цветные символы ASCII? Как это вообще делается? Я использую emacs 23, поэтому решение может быть специфичным для самого emacs.

В любом случае, я проверил гиперспек, чтобы узнать, может ли FORMAT это сделать, но пока безуспешно. Заранее спасибо.


person Limpoch    schedule 10.03.2010    source источник
comment
какой лисп? Эмакс Лисп? «HyperSpec» предназначен не для Emacs Lisp, а для Common Lisp. Печать цветного текста из Emacs Lisp должна быть описана в руководстве по Emacs. Common Lisp не имеет встроенных средств для цветного текста, потому что пользовательский интерфейс выходит за рамки стандарта Common Lisp. Обычно можно использовать графический инструментарий (например, CAPI, CLIM, ...) или что-то вроде интерфейса curses. Если вы используете Emacs Lisp, вы можете использовать встроенную функциональность Emacs. Я думаю, вы могли бы также взглянуть на некоторые игры, которые идут с Emacs для вдохновения.   -  person Rainer Joswig    schedule 10.03.2010
comment
Возможно, что en.wikipedia.org/wiki/ANSI_escape_code — это простое решение, которое вы ищете. ибо, в зависимости от того, что вы подразумеваете под Лиспом, как прокомментировал Райнер.   -  person Pascal Cuoq    schedule 10.03.2010
comment
Я использую SBCL, один из многих вариантов CL, хотя он работает на SLIME в emacs. Это должно быть описано в руководстве по emacs, верно? Спасибо за вклад, мой мир шепелявости расширяется с каждым днем.   -  person Limpoch    schedule 10.03.2010
comment
У вас есть два совершенно разных варианта: вы можете написать игру на SBCL, и в этом случае вам понадобится библиотека пользовательского интерфейса Common Lisp, или вы можете написать ее на Emacs Lisp и использовать встроенные функции Emacs. SLIME — это то, что вы используете для редактирования кода Common Lisp в emacs — как текстовый редактор, но со многими другими функциями. Ваш код Lisp не работает в Emacs. Если вы хотите, чтобы код выполнялся в Emacs (и использовал встроенную в Emacs возможность цветного текста), это должен быть Emacs Lisp. Прежде чем вы сможете решить эту проблему, вам нужно решить, каким образом вы хотите действовать.   -  person Noah Lavine    schedule 11.03.2010
comment
Вы нашли решение, которое искали?   -  person johnbakers    schedule 30.11.2013


Ответы (4)


Внешний вид текста в Emacs управляется лицами. Лицо можно изменить с помощью наложения или текстовых свойств. Вот пример использования последнего:

;; Emacs-Lisp
(insert (propertize "foo" 'font-lock-face '(:foreground "red")))

Однако, если игра реализована на SBCL, вам понадобится способ связи с Emacs из вашей программы SBCL. Поскольку кажется, что вы используете Slime, использование Swank, который является частью Slime, может быть наиболее удобным:

;; Common-Lisp
(swank::eval-in-emacs
 '(with-current-buffer (slime-repl-buffer)
    (insert (propertize "foo" 'font-lock-face '(:foreground "red")))))
person huaiyuan    schedule 10.03.2010

Бессовестная самостоятельная вставка: вы можете попробовать это, графический терминал для Common Lisp работает в веб-браузере. Он использует html для печати, поэтому вы можете сделать что-то вроде:

(gtfl-out (:p :style "color:red;" "some characters"))
person Martin Loetzsch    schedule 10.03.2010

Я только что написал определение Elisp для проверки цветов. Это может быть полезно, например, при настройке общих цветов ВТ Linux. Обратите внимание, что список цветов («черный», «красный» и т. д.) — это только то, как он условно и обычно определяется — если вы установите их как другие цвета, возможно, красный больше не будет красным. Тем не менее, это может быть полезно для тестирования.

;;;; 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

person Emanuel Berg    schedule 03.06.2013

Я ищу тот же ответ и был здесь, и через некоторое время нашел ответ по другой ссылке[Изменить цвет текста в Common Lisp REPL.

Я думаю, может быть, вам это нужно, ответ:

Цитата

Вы можете использовать escape-код ANSI для печати цветных текстов:

(format t "~c[31mabc~c[0m~%" #\ESC #\ESC) ; это печатает красный «abc» для большинства современных терминалов, хотя я не уверен, работает ли это в слизи.

Shareimprove этот ответ ответил 06 окт.

Соленое Яйцо 626412

Цитата

person A lucky person    schedule 22.08.2015
comment
Спасибо Этот пост помог мне лучше понять, как работает функция форматирования! Вы знаете, где задокументирована функция #\ESC? - person rmoro; 09.10.2016
comment
#\ESC не входит в стандарт, более переносимым выражением может быть (format t "~c[31mRed~:*~c[32mGreen~:*~c[34mBlue~:*~c[mPlain~%" (code-char 27)) - person devon; 12.07.2020