我同时使用“next-error”和& “previous-error”循环结果。但是一旦到达最后一个条目,循环就不会回到顶部,依此类推。
有没有办法让自行车一旦到达底部继续到顶部,反之亦然?
答案 0 :(得分:5)
一个简单的解决方案是点击C-u
并调用next-error重新开始。
我之前尝试了以下但是它显然不起作用,我们不能总是设置REVERT参数......
(defun my-nexterrorloop ()
(interactive)
(next-error 1 t))
我用C-h a next-error RET
检查了该函数的文档,我读到:
«
(next-error &optional ARG RESET)
The RESET argument specifies that we should restart from the beginning.
»
答案 1 :(得分:1)
替代方案:
在编译缓冲区中使用Icicles键C-`(控制反引号)(例如*grep*
)。它会将所有编译错误(例如grep
匹配)显示为完成候选项。这是special case的Icicles search。
您可以使用C-down
在相应的源代码位置之间循环。这包裹(这是你的要求)。 C-up
向后(向上)循环,它也包裹着。
您可以在迷你缓冲区中键入一些文本,以暂时将匹配(错误)集缩小到与您的输入匹配的那些,然后在它们之间循环。更改您的迷你缓冲输入以匹配不同的匹配子集。
您无需按顺序访问源位置。您可以使用C-mouse-2
单独访问其中的任何一个,也可以使用down
或up
无控件循环访问它们,然后点击RET
进行选择。没有按下Control的循环循环当前完成候选。循环使用Control按下会在候选人之间循环时打开每个相应的源位置。
您甚至可以replace出现在搜索命中(错误)中的文字。
答案 2 :(得分:1)
我写了一些elisp来实现这一点,在这里
(defvar my-modeline-flash-color "#af00d7")
(defun my-indicate-error-nav-wrapped (direction)
"Display a message in minibuffer indicating that we wrapped
also flash the mode-line"
(let ((mode-line-color (face-background 'mode-line)))
(message "Wrapped %s error" (symbol-name direction))
(set-face-background 'mode-line my-modeline-flash-color)
(sit-for 0.3)
(set-face-background 'mode-line mode-line-color)))
(defun my-next-error-wrapped (&optional arg reset)
"Jumps to previous error if at first error jump to last error instead.
Prefix argument ARG says how many error messages to move forwards (or
backwards, if negative). With just C-u as prefix moves to first error"
(interactive "P")
(condition-case nil
(call-interactively 'next-error)
('user-error (progn (next-error 1 t)
(my-indicate-error-nav-wrapped 'next)))))
(defun my-jump-to-last-error (buffer)
"Jump to last error in the BUFFER, this assumes that
the error is at last but third line"
(save-selected-window
(select-window (get-buffer-window buffer))
(goto-char (point-max))
(forward-line -3)
(call-interactively 'compile-goto-error)))
(defun my-previous-error-wrapped (&optional arg)
"Jumps to previous error if at first error jump to last error instead.
Prefix argument ARG says how many error messages to move backwards (or
forwards, if negative)."
(interactive "P")
(condition-case nil
(if (compilation-buffer-p (current-buffer))
(compilation-previous-error 1)
(call-interactively 'previous-error))
('user-error (progn
(let ((error-buffer (next-error-find-buffer)))
;; If the buffer has an associated error buffer use it to
;; to move to last error
(if (and (not (eq (current-buffer) error-buffer))
(compilation-buffer-p error-buffer))
(my-jump-to-last-error error-buffer)
;; Otherwise move to last point and invoke previous error
(goto-char (point-max))
(call-interactively 'previous-error))
(my-indicate-error-nav-wrapped 'previous))))))
将函数my-previous-error-wrapped
和my-next-error-wrapped
绑定到一些方便的键上,你就可以了。模式行将使用my-modeline-flash-color
暂时闪烁,包装时也会显示一条迷你消息。
这是如何运作的?
以防万一你想知道这是如何工作的解释,next-error
在内部使用next-error-function
的值来找到要调用的函数来获取缓冲区中的下一个错误,现在这些函数中的大多数(或者至少是我检查过的函数)尝试导航到缓冲区中的下一个错误,或者如果缓冲区中没有更多错误则发信号user-error
。在上面的函数中,我们调用next-error
并处理user-error
。现在,如果发生user-error
,我们第二次调用next-error
,参数reset
为t
,这会将我们带到缓冲区中的第一个错误。您阅读了有关使用next-error
传递C-h f next-error RET
的参数的更多信息。阅读this以了解有关elisp错误的更多信息。希望有所帮助
答案 3 :(得分:1)
我以这种简单的方式安排了我的下一个错误f2键:
(global-set-key [f2]
'(lambda () (interactive)
(condition-case nil (next-error)
(error (next-error 1 t)))))