使用“next-error”& amp;循环查看结果。 “以前的错误”

时间:2014-01-14 22:08:26

标签: emacs elisp

我同时使用“next-error”和& “previous-error”循环结果。但是一旦到达最后一个条目,循环就不会回到顶部,依此类推。

有没有办法让自行车一旦到达底部继续到顶部,反之亦然?

4 个答案:

答案 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 caseIcicles search

  • 您可以使用C-down在相应的源代码位置之间循环。这包裹(这是你的要求)。 C-up向后(向上)循环,它也包裹着。

  • 您可以在迷你缓冲区中键入一些文本,以暂时将匹配(错误)集缩小到与您的输入匹配的那些,然后在它们之间循环。更改您的迷你缓冲输入以匹配不同的匹配子集。

  • 您无需按顺序访问源位置。您可以使用C-mouse-2单独访问其中的任何一个,也可以使用downup无控件循环访问它们,然后点击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-wrappedmy-next-error-wrapped绑定到一些方便的键上,你就可以了。模式行将使用my-modeline-flash-color暂时闪烁,包装时也会显示一条迷你消息。

这是如何运作的?

以防万一你想知道这是如何工作的解释,next-error在内部使用next-error-function的值来找到要调用的函数来获取缓冲区中的下一个错误,现在这些函数中的大多数(或者至少是我检查过的函数)尝试导航到缓冲区中的下一个错误,或者如果缓冲区中没有更多错误则发信号user-error。在上面的函数中,我们调用next-error并处理user-error。现在,如果发生user-error,我们第二次调用next-error,参数resett,这会将我们带到缓冲区中的第一个错误。您阅读了有关使用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)))))