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

46

我知道有解决方案可以让Emacs显示80列,但我不想那样干扰视觉。我只希望它在某一行超过80个字符时将其高亮显示。


1
我知道有解决方案。对于那些不知道的人,例如 https://www.emacswiki.org/emacs/FillColumnIndicator 。当问题被提出时可能还不存在,但在我看来并不会太影响,但口味嘛,这是个人喜好的问题。 - Uwe Geuder
8个回答

53

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

每一行超过81个字符的文本将会被用您选择的颜色进行高亮显示。


太棒了。我能在我的.emacs文件中启用它吗? - alexgolec
2
高亮显示是每个缓冲区的设置。但是您可以在您的.emacs文件中添加一个特定模式的钩子,如下所示:(add-hook 'emacs-lisp-mode-hook '(lambda () (highlight-lines-matching-regexp ".\{81\}" "hi-green-b")))。我没有找到一个通用的new-buffer-hook来处理所有缓冲区。 - Juancho
2
@RNAer 尝试这个:(add-hook 'c++-mode-hook '(lambda () (highlight-lines-matching-regexp ".\\{81\\}" 'hi-yellow))) - Ryan Olds
1
@Juancho 你应该找的钩子是find-file-hook - giordano
如果您“解决”了这个问题(例如应用fill-paragraph),则高亮显示仍将存在。有没有办法在每次更改时重新计算它? - ABu
显示剩余4条评论

33

请查看whitespace-mode ——它现在是Emacs的一部分,可以做更多的事情而不仅仅是突出显示长行。(当然,也可以仅用于此。)


2
你能解释一下这是怎么工作的吗?有一个斜引用到“长行”,但没有解释什么是长行。如果不是80个字符,那么如何指定80? - Gabe
你可以设置 whitespace-line-column。要获取更多选项,请使用 M-x customize-group RET whitespace RET,然后您会看到所有选项。(我只是查看源代码并编写elisp代码...) - Eli Barzilay
我之前使用了redspace.el (http://www.emacswiki.org/emacs/redspace.el),但这个似乎更好。谢谢! - GeneralBecos
我的问题是它添加了许多其他的高亮,这可能是不必要的。 - EoghanM
@EoghanM,看一下whitespace-style:你可以控制需要突出显示的内容。 - Eli Barzilay

8

这是我从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)

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

5
尝试使用“highlight-80+.el”。您可以从这里获取它。
要安装它,只需将以下内容添加到您的.emacs中:
(add-to-list 'load-path "/path/to/highlight-80+")
(require 'highlight-80+)

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

M-x highlight-80+-mode


2
highlight-80+.el 的作者表示它已经停止更新,并建议自 Emacs 23 开始使用 whitespace-modewhitespace-line-column - TacticalCoder

3

这可能不完全符合您的要求,但我曾经遇到了类似的问题,并找到了这个问答。我需要的只是在需要时插入一个视觉指南。这就是我最终得出的结果:

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

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


2

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

在代码片段中,超过fill-column(80)的文本将以红色突出显示。您可以根据自己的喜好设置面板。


也许可以使用 set-face-attributecustom-set-faces 不应该手动修改。 - xuhdev

2

以下是一些示例代码,它将使用当前的“警告”面对超出第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))

它并不会突出整行,但我觉得它还是相当有帮助的。


虽然不能与制表符一起使用。请参阅http://www.emacswiki.org/emacs/EightyColumnRule以获取更高级的正则表达式。 - nschum
我可以将其应用于特定的文件名模式而不是 *mode 吗?@acm - alper
@alper - 很抱歉,这已经超出了我的知识范围。也许您可以发起一个新的问题? - acm

1
这与其他答案类似,使用了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检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接