如何在emacs中为文本着色?


11

我要查看(和/或编辑)在Emacs着色的文字,如输出的ls -l --color=alwaystree...或者别的什么东西。

我引用的文本存在于文件中。当我在emacs中打开该文件时,我希望能够看到它是彩色的,或者将其切换为显示ANSI(SGR)转义序列。

ansi-color.el 似乎正是我所需要的,但是我无法让它对ANSi转义序列进行任何着色,但是我确实看到单个contol字节(例如^A^[)为蓝色粗体...我不是确定这是否是的功能ansi-color,但我认为是。

根据ansi-color.el注释,它可以使用字符串和区域,但即使这样似乎也不起作用。例如,ansi-color-apply-on-region不能识别该函数M-x。它说:“不匹配”

我已将.emacs文件添加(require 'ansi-color)到了。emacs启动时我没有收到任何错误或警告,所以我被卡住了。 (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

我如何才能使用标准功能,并且在打开后缀名为的文件时可以使其自动应用.col

Answers:


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

接下来是您要为.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))

太棒了..仿佛被魔法迷住了!解释清楚,您的“ 使功能交互式”链接很有帮助。我开始看到Emacs的一般结构。谢谢...
Peter.O 2011年

我想知道我在做什么错。我在.emacs文件中添加了上面的所有文本,但是在调用ansi-color-apply-region-int后,突出显示的文本似乎没有变色。
SFbay007

5

以下解决方案允许读取(但不保存)包含ANSI颜色序列的文件。文件名必须具有.txt扩展名。

将库tty-format放入中~/.emacs.d/site-lisp/,然后将这些行添加到您的~/.emacsinit文件中。

(add-to-list 'load-path "~/.emacs.d/site-lisp/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)

这也是一个有用的选项。ansi-color正如您的链接所说,它利用并向前迈进了一步,“ ... tty-format.el的目的只是为了使*这样的文件可见。” * ..“ 这样的文件 ”是包含ANSI SGR的文件序列和退格 ..谢谢..
Peter.O 2011年

1
物有所值。与event_jr发布的完全可编辑版本相比,此方法具有更快的(〜25%)连续分页速度,并且刷新频率明显更好(更好!)。.测试文件有45,000行。对于可编辑版本,屏幕刷新速度停在整个文件的75%左右,但是滚动条仍在滚动。我怀疑这是由于可编辑版本中某些点/标记撤消缓冲区的开销。 ..两种方法都有其优点...(通过“连续”,我的意思是连续按住Page Up / Down键)
Peter.O 2011年

PS .. tty格式的页面在终端中的平滑和速度尽可能快(时间彼此之间相差一秒或两秒;从顶部到底部,从底部到顶部大约50秒)。
Peter.O 2011年

我不知道tty-format。它似乎优于我的包装器功能或3行派生模式。:) Emacs很难处理大量叠加,这就是ansi-color如何进行着色的方式。这里有进一步优化的机会,因为我们不需要着色整个缓冲区,而只需要显示一部分即可。
event_jr 2011年

0

非常感谢@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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.