Answers:
我想要实现相同的目标,因为在编译缓冲区中找到当前错误消息通常很痛苦。此解决方案基于Drew的建议,使用a next-error-hook
突出显示错误消息。目前,它仅突出显示错误消息中的第一行,但是我发现这已经足够了。
(defcustom next-error-message-highlight-p nil
"If non-nil, highlight the current error message in the ‘next-error’ buffer"
:type 'boolean
:group 'next-error
:version "??")
(defface next-error-message
'((t (:inherit highlight)))
"Face used to highlight the current error message in the ‘next-error’ buffer"
:group 'next-error
:version "??")
(defvar next-error-message-highlight-overlay
nil
"Overlay highlighting the current error message in the ‘next-error’ buffer")
(make-variable-buffer-local 'next-error-message-highlight-overlay)
(defun next-error-message-highlight ()
"Highlight the current error message in the ‘next-error’ buffer."
(when next-error-message-highlight-p
(with-current-buffer next-error-last-buffer
(when next-error-message-highlight-overlay
(delete-overlay next-error-message-highlight-overlay))
(save-excursion
(goto-char (point))
(let ((ol (make-overlay (line-beginning-position) (line-end-position))))
;; do not override region highlighting
(overlay-put ol 'priority -50)
(overlay-put ol 'face 'next-error-message)
(overlay-put ol 'window (get-buffer-window))
(setf next-error-message-highlight-overlay ol))))))
(add-hook 'next-error-hook 'next-error-message-highlight)
用法:
(setq next-error-message-highlight-p t)
演示:
这是一个如何修改出现在*compilation*
缓冲区(例如*grep*
结果缓冲区)左边缘的位图图像的示例:
(define-fringe-bitmap 'custom-right-arrow [128 192 96 48 24 48 96 192 128] 9 8 'center)
(put 'overlay-arrow-position 'overlay-arrow-bitmap 'custom-right-arrow)
这是如何设置边缘位图颜色的示例:
(defface right-triangle-face
'((t (:background "red" :foreground "yellow")))
"Face for `right-triangle-face`.")
(set-fringe-bitmap-face 'right-triangle 'right-triangle-face)
这是如何创建自己的条纹位图的示例:
;; AUTHOR: Nikolaj Schumacher -- https://github.com/nschum/fringe-helper.el
;;
(defun fringe-helper-convert (&rest strings)
"Convert STRINGS into a vector usable for `define-fringe-bitmap'.
Each string in STRINGS represents a line of the fringe bitmap.
Periods (.) are background-colored pixel; Xs are foreground-colored. The
fringe bitmap always is aligned to the right. If the fringe has half
width, only the left 4 pixels of an 8 pixel bitmap will be shown.
For example, the following code defines a diagonal line.
\(fringe-helper-convert
\"XX......\"
\"..XX....\"
\"....XX..\"
\"......XX\"\)"
(unless (cdr strings)
;; only one string, probably with newlines
(setq strings (split-string (car strings) "\n")))
(apply 'vector
(mapcar
(lambda (str)
(let ((num 0))
(dolist (c (string-to-list str))
(setq num (+ (* num 2) (if (eq c ?.) 0 1))))
num))
strings)))
(define-fringe-bitmap 'backslash (fringe-helper-convert
"XX......"
"XX......"
" XX....."
".XX....."
"..XX...."
"..XX...."
"...XX..."
"...XX..."
"....XX.."
"....XX.."
".....XX."
".....XX.") nil nil 'center)
是否不next-error
滚动编译错误缓冲区,以便当前错误显示为窗口的第一行?
如果不是,是否至少将光标放在当前错误行上?如果是这样,并且光标对您来说不够可见,请考虑使用hl-line-mode
突出显示当前行。或者考虑使用库crosshairs
突出显示当前行和当前列。
发表评论后更新
我以为你next-error
在缓冲中调用*compilation*
。如果这样做,则该行将滚动到顶部,如我所述。
但是,如果你正在调用next-error
的外部缓冲*compilation*
,那么你需要使用next-error-hook
到,在缓冲区*compilation*
中,突出显示当前行或条纹或什么的,以任何方式你喜欢。
这是一个简单的例子:
(defun foo ()
"..."
(with-current-buffer next-error-last-buffer
(hl-line-mode 1)))
(add-hook 'next-error-hook 'foo)
(当然,您实际上只需要hl-line-mode
在该缓冲区中打开一次即可。如上所示执行该操作是很过头的,但是并没有什么伤害。您可能会认为您可以只添加foo
到grep-mode-hook
或compilation-mode-hook
。但是当调用这些钩子时,不next-error-last-buffer
。)
注意:
有两个用户选项可控制在源缓冲区(而非编译缓冲区)中指示命中的方式:next-error-highlight
和next-error-highlight-no-select
。它们提供相同的可能性,但是它们由不同的命令使用。可能性包括使用边缘箭头或突出显示特定时间的匹配项。
但是没有这样的选项可以控制缓冲区中当前命中的指示*compilation*
。因此,Emacs为源缓冲区提供了两个选项(其中一个可能就足够了),而为编译缓冲区没有提供任何选项。
您可能会考虑提交增强请求,以获取编译(包括grep)缓冲区的类似选项:M-x report-emacs-bug
。可以将钩子与您自己的函数一起使用以突出显示是可以的,但不是必须的。
而且,如果您只想更改边缘指示器,则可以执行此操作(使用所需的任何边缘位图,而不是filled-rectangle
-请参见(消除)边缘位图以获取预定义的列表):
(defun bar ()
(with-current-buffer next-error-last-buffer
(unless (eq 'filled-rectangle (cdr (assq 'overlay-arrow fringe-indicator-alist)))
(setq fringe-indicator-alist
(cons '(overlay-arrow . filled-rectangle) fringe-indicator-alist)))))
(add-hook 'next-error-hook 'bar)
更新#2:
我刚刚发现,如果您关闭显示左边缘的功能,那么您将看到我开头所描述的行为:滚动窗口以将当前错误放在顶部。这是另一种可能性。(这是我在设置中看到的行为,因为我没有显示条纹。)
我刚刚报告了此行为有一个错误(#20829)。重要的是(当前,直到错误修复),当您执行C-x `
(next-error
)时,左边缘是否在所选窗口中显示。(当前)仅显示编译缓冲区的窗口不显示左边缘是不够的。
next-error
将当前错误行放在buffer窗口的顶部*compilation*
。当然有global-hl-line-mode
,但是您的投诉/问题据说是关于*compilation*
缓冲区的。问题变得越来越不清楚,而不是更多(恕我直言)。
*compilation*
。如果不是,那么您需要启用一个函数next-error-hook
以在buffer中*compilation*
进行突出显示(或其他操作)。我用一个例子更新了答案。
compilation-context-lines
。结果,当前选择的错误很难找到。您的解决方案救了我。