如何在 emacs 中为文本着色?

Pet*_*r.O 12 colors emacs

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

我引用的文本存在于文件中。当我在 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)


enz*_*tib 6

以下解决方案允许读取(而不是保存)包含 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)
Run Code Online (Sandbox Code Playgroud)

  • 对于它的价值.. 这种方法与 *event_jr* 发布的完全可编辑版本相比具有更快 (~25%) **连续** 分页速度和显着更好(更好!更好)的刷新频率.. 测试文件有 45,000线。对于可编辑版本,屏幕刷新在整个文件的大约 75% 处停止,但滚动条仍在滚动。我怀疑这是因为可编辑版本中某些点/标记撤消缓冲区的一些开销。 .. 两种方法都有其优点......(*“连续”*,我的意思是持续按下 Page Up/Down 键) (2认同)