我要查看(和/或编辑)在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
?
eve*_*_jr 15
我认为你缺少的部分是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))
Run Code Online (Sandbox Code Playgroud)
下一点是您要为 .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)))
Run Code Online (Sandbox Code Playgroud)
并将其与该扩展名相关联。
(setq auto-mode-alist
(cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
Run Code Online (Sandbox Code Playgroud)
以下解决方案允许读取(而不是保存)包含 ANSI 颜色序列的文件。文件名必须有.txt
扩展名。
将库tty-format放入 中~/.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)
Run Code Online (Sandbox Code Playgroud)