![如何在 emacs 中给文本着色?](https://linux22.com/image/17541/%E5%A6%82%E4%BD%95%E5%9C%A8%20emacs%20%E4%B8%AD%E7%BB%99%E6%96%87%E6%9C%AC%E7%9D%80%E8%89%B2%EF%BC%9F.png)
我想在 emacs 中查看(和/或编辑)彩色文本,例如ls -l --color=always
、tree...
或其他方式输出的文本。
我引用的文本存在于一个文件中。当我在 emacs 中打开该文件时,我希望能够看到它的颜色,或者切换它以显示 ANSI (SGR) 转义序列。
ansi-color.el
似乎成为我所需要的,但我无法让它对 ANSI 转义进行任何着色序列,但我确实看到蓝色粗体代表个人控制字节(例如^A
和^[
)...我不确定这是否是 的一个功能ansi-color
,但我认为是。
根据ansi-color.el 评论,它可以处理字符串和区域,但即使这样似乎也不起作用。例如,该函数ansi-color-apply-on-region
不被 识别M-x
。它说:“不匹配”
我已经添加(require 'ansi-color)
到我的.emacs文件甚至(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
.当 emacs 启动时,我没有收到任何错误或警告,所以我陷入困境。
如何使标准函数起作用,并且可以使其在打开名称后缀为 的文件时自动应用.col
?
答案1
我认为你缺少的是形式interactive
。这就是 Emacs 区分设计为由其他函数调用的函数和设计为由用户直接调用的函数的方式。请参阅 Emacs Lisp 简介节点
现在,如果您阅读 的定义ansi-color-apply-on-region
,您会发现它不是为交互式使用而设计的。 “ansi-color”旨在过滤 comint 输出。然而,为它制作一个交互式包装器很容易。
(defun ansi-color-apply-on-region-int (beg end)
"interactive version of func"
(interactive "r")
(ansi-color-apply-on-region beg end))
下一步是您要为 .col 扩展名打开 ansi 颜色。您可以将挂钩函数添加到您想要用来编辑这些文件的任何主模式。每当您打开主模式时,该函数都会运行,因此您必须添加对正确文件后缀的检查。
或者,您可以基于“基本”模式破解快速派生模式。
(define-derived-mode fundamental-ansi-mode fundamental-mode "fundamental ansi"
"Fundamental mode that understands ansi colors."
(require 'ansi-color)
(ansi-color-apply-on-region (point-min) (point-max)))
并将其与该扩展名关联起来。
(setq auto-mode-alist
(cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
答案2
以下解决方案允许读取(而不是保存)包含 ANSI 颜色序列的文件。文件名必须有.txt
扩展名。
把图书馆tty 格式in ~/.emacs.d/site-lisp/
,然后将这些行添加到您的~/.emacs
init 文件中。
(add-to-list 'load-path "~/.emacs.d/site-lisp/")
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)
答案3
非常感谢@enzotib 提供的解决方案!
作为解决方案的补充,以下是一种使其可由用户显式调用的方法:
;; M-x display-ansi-colors to explicitly decode ANSI color escape sequences
(defun display-ansi-colors ()
(interactive)
(format-decode-buffer 'ansi-colors))
对于除 *.txt 或 README 之外的文件,自动执行:
;; decode ANSI color escape sequences for .log files
(add-to-list 'auto-mode-alist '("\\.log\\'" . display-ansi-colors))
这样,您可以用颜色替换转义序列,而无需更改原始文件,这与使用ansi-color-apply-on-region
.