1

我在 .emacs 文件中输入了以下代码以突出显示不需要的空格。

(require 'whitespace)
(setq whitespace-style '(face empty tabs lines-tail trailing))
(global-whitespace-mode t)

这显示 (1) 缓冲区开头和结尾处的空行 (2) 制表符 (3) 超过 80 个字符限制的行 (4) 尾随空格

我希望 emacs 自动突出显示“2 个或更多空行”。关于如何实现这一点的任何想法?我确实找到了一篇博客文章,解释了一种借助正则表达式的方法,但我不确定如何在 .emacs 文件中实现这一点。

编辑1:找到了一种删除多余空行的方法,但这仍然不能帮助我自动突出显示多个空行。删除emacs中多余的空行

编辑2:将以下内容添加到 .emacs 似乎有效,但只有在我在缓冲区中保存并重新打开文件之后。

(add-hook 'change-major-mode-hook '(lambda () (highlight-regexp "\\(^\\s-*$\\)\n" 'hi-yellow)))

编辑 3:(global-hi-lock-mode 1)在编辑 2 中的行之前添加到 .emacs 文件后,似乎突出显示缓冲区中的 1 个或多个空行。我不确定如何修改正则表达式,使其只接受 2 个或更多空行。

4

2 回答 2

2

只需使用库Highlight ( highlight.el)。这就是它的用途。

使用命令hlt-highlight-regexp-region( C-x X h x) 或hlt-highlight-regexp-to-end( C-x X h e)。(要取消突出显示正则表达式,请使用C-x X u xC-x X u e。)

以交互方式,您输入要在 Emacs 中照常使用的正则表达式(C-q C-j用于匹配换行符,并且不需要双反斜杠),因此您键入\(^\s-*$\) C-q C-j.

于 2014-01-13T23:29:27.747 回答
2

您的highlight-regexp-solution 可以使用以下省略号(例如,在您的.emacs文件中)变成次要模式。

您可以通过右键单击模式行中的模式名称之一,然后选择来激活次要模式nl2-mode。您可以通过单击nl2模式行中的 并选择来停用次要模式Turn off minor mode

要了解代码,请参阅define-minor-modedefine-key(例如,C-h f define-minor-mode RET)的帮助。请注意,在 emacs 中,菜单中的鼠标点击也算作击键。

(define-minor-mode nl2-mode
  "Highlight two successive newlines."
  :global t
  :lighter " nl2"
  (if nl2-mode
      (highlight-regexp "\\(^\\s-*$\\)\n" 'hi-yellow)
    (unhighlight-regexp "\\(^\\s-*$\\)\n")))

(define-key mode-line-mode-menu [nl2-mode]
  `(menu-item ,(purecopy "nl2-mode") nl2-mode
  :help "Highlight two succesive newlines."
  :button (:toggle . (bound-and-true-p nl2-mode))))

有几个事实使得突出显示两个连续的空行更加复杂(font-lock往往只突出非空区域,换行符是区域重新字体化的限制,需要在缓冲区更改后重新字体化)。以下代码显示了一种方法。也许,有更简单的方法。

(require 'font-lock)
(global-font-lock-mode)

(defface jit-lock-nl2-face '((default :background "yellow"))
  "Face to indicate two or more successive newlines."
  :group 'jit-lock)

(defun jit-nl2-extend (start end &optional old)
  "Extend region to be re-fontified"
  (save-excursion
    (save-match-data
      ;; trailing:
      (goto-char end)
      (skip-chars-forward "[[:blank:]]\n")
      (setq jit-lock-end (point))
      ;; leading:
      (goto-char start)
      (beginning-of-line)
      (skip-chars-backward "[[:blank:]]\n")
      (unless (bolp) (forward-line))
      (setq jit-lock-start (point)))))

(defun jit-nl2 (jit-lock-start jit-lock-end)
  "Highlight two or more successive newlines."
  (save-excursion
    (save-match-data
      (jit-nl2-extend jit-lock-start jit-lock-end)
      ;; cleanup
      (remove-text-properties jit-lock-start jit-lock-end '(font-lock-face jit-lock-nl2-face))
      ;; highlight
      (while (< (point) jit-lock-end)
    (if (looking-at "[[:blank:]]*\n\\([[:blank:]]*\n\\)+")
        (progn (put-text-property (match-beginning 0) (match-end 0) 'font-lock-face 'jit-lock-nl2-face)
           (goto-char (match-end 0)))
      (forward-line))))))


(add-hook 'after-change-major-mode-hook (lambda ()
                      (add-hook 'jit-lock-after-change-extend-region-functions 'jit-nl2-extend)
                      (jit-lock-register 'jit-nl2)
                      (jit-lock-mode 1)
                      ))
于 2014-01-13T21:54:02.593 回答