如何使 emacs 突出显示超过 80 个字符的行?

Posted

技术标签:

【中文标题】如何使 emacs 突出显示超过 80 个字符的行?【英文标题】:How can I make emacs highlight lines that go over 80 chars? 【发布时间】:2011-09-14 17:27:05 【问题描述】:

我知道有一些解决方案可以让 emacs 显示 80 行列,但我不想要那种视觉干扰。如果超过 80 个字符,我只想让它突出显示一行。

【问题讨论】:

> 我知道有解决方案 对于那些不知道的人,例如emacswiki.org/emacs/FillColumnIndicator 。当这个问题被问到时,这可能并不存在,而且恕我直言,这并不太令人不安,但品味是,嗯,一个品味问题。 【参考方案1】:

另一个简单的选择是在表达式 .\81\ 上运行 highlight-lines-matching-regexp

包含 81 个或更多字符的每一行都将以您选择的颜色突出显示。

【讨论】:

太棒了。有什么方法可以在我的 .emacs 中启用它吗? 突出显示是每个缓冲区的设置。但是,您可以像这样在 .emacs 上添加特定于模式的挂钩:(add-hook 'emacs-lisp-mode-hook '(lambda () (highlight-lines-matching-regexp ".\81\" "hi-green-b")))。我没有找到适用于所有缓冲区的通用新缓冲区挂钩。 为什么(add-hook 'c++-mode-hook '(lambda () (highlight-lines-matching-regexp ".\81\" "hi-green-b"))) 对我不起作用? @RNAer 试试这个:(add-hook 'c++-mode-hook '(lambda () (highlight-lines-matching-regexp ".\\81\\" 'hi-yellow))) @Juancho find-file-hook 应该是你要找的钩子。【参考方案2】:

参见whitespace-mode——它现在是 Emacs 的一部分,并且可以做的不仅仅是突出显示长行。 (但当然只能用来做那个。)

【讨论】:

您能解释一下这是如何工作的吗?有一个对“长线”的倾斜引用,但在解释是什么使一条线变长时。如果不是80个字符,怎么指定80? 您可以设置whitespace-line-column。如需更多选项,请使用M-x customize-group RET whitespace RET,您将看到所有选项。 (我只是看源码,写elisp代码...) 我使用了 redspace.el (emacswiki.org/emacs/redspace.el),但这似乎更好。谢谢! 我的问题是它添加了一堆可能不需要的其他突出显示。 @EoghanM,看看whitespace-style:你可以控制要突出显示的内容。【参考方案3】:

这是我来自Emacs Dev Kit的配置:

;; whitespace-mode
;; free of trailing whitespace and to use 80-column width, standard indentation
(setq whitespace-style '(trailing lines space-before-tab
                                  indentation space-after-tab)
      whitespace-line-column 80)

基本上你只需要最后一点,但我发现其他设置非常有用(我讨厌制表符和尾随空格)。

【讨论】:

【参考方案4】:

试试highlight-80+.el。可以从here获取。

要安装它,只需将以下内容添加到您的.emacs

(add-to-list 'load-path "/path/to/highlight-80+")
(require 'highlight-80+)

然后您可以通过以下方式启用它:

M-x highlight-80+-mode

【讨论】:

highlight-80+.el 的作者说它已停产,并建议从 Emacs 23 开始使用 whitespace-mode空白行列.【参考方案5】:

这里是一些示例代码,它将突出显示位于第 80 列之外的文本以及当前的“警告”面,以及为 C++ 模式启用它的一行。

;; Turn on warn highlighting for characters outside of the 'width' char limit
(defun font-lock-width-keyword (width)
  "Return a font-lock style keyword for a string beyond width WIDTH
   that uses 'font-lock-warning-face'."
  `((,(format "^%s\\(.+\\)" (make-string width ?.))
     (1 font-lock-warning-face t))))

(font-lock-add-keywords 'c++-mode (font-lock-width-keyword 80))

它没有突出整行,但我觉得它很有帮助。

【讨论】:

但不适用于标签。有关更高级的正则表达式,请参阅 emacswiki.org/emacs/EightyColumnRule。 我可以将它应用于特定的文件名模式而不是 *mode 吗? @acm @alper - 不幸的是,我不知道。也许开始一个新问题?【参考方案6】:

这不是您想要的,但我遇到了类似的问题并找到了这个问题/答案。我想要的只是在需要时插入视觉指南。这就是我最终得到的结果:

(defun insert-80 ()
    "Insert an 80-character-wide guide at beginning of line."
    (interactive)
    (beginning-of-line)
    (insert "0         1         2         3         4         5         6         7         |")
    (newline)
    (insert "01234567890123456789012345678901234567890123456789012345678901234567890123456789|")
    (newline)
)

超级简单,但有时非常有效。

【讨论】:

【参考方案7】:

emacs-goodies-el(建议安装在终端)中有一个内置的包,叫做highlight-beyond-fill-column.el,把它加到你的.emacs或者init.el

(setq-default fill-column 80)
(add-hook 'prog-mode-hook 'highlight-beyond-fill-column)
(custom-set-faces '(highlight-beyond-fill-column-face
                    ((t (:foreground "red" )))))

sn-p 中fill-column 80 以外的文本将以red 的颜色突出显示。您可以随意设置脸部。

【讨论】:

也许使用set-face-attributecustom-set-faces 不应该被手动触摸。【参考方案8】:

这与此处的其他答案类似,具有使用fill-column 的优势,并且它在模式切换后运行。因此,每种模式都可以有自己的线宽,突出显示适当地尊重。

(add-hook 'after-change-major-mode-hook
  (lambda ()
    (when (derived-mode-p 'prog-mode)
      (let ((column-re (format "^[^\n]\\%d\\\\(.*\\)$" fill-column)))
        (font-lock-add-keywords nil
          `((,column-re 1 font-lock-warning-face prepend)))))))

您可能不想删除 prog-mode 检查您是否也希望为文本文件启用此功能。

【讨论】:

以上是关于如何使 emacs 突出显示超过 80 个字符的行?的主要内容,如果未能解决你的问题,请参考以下文章

突出显示过长的线条

如何突出显示 Emacs 缓冲区中所有出现的单词?

如何使选定的行在未聚焦的数据网格中突出显示?

Emacs:在评论中突出显示 TODO *only*

如何在 Emacs 中选择或突出显示一个块?

如何避免以特定符号开头的行中字符串的文本突出显示[java]