3

我有一个执行多目录 grep 的个人 elisp 函数。它使用compilation-start,它创建一个带有结果的编译模式缓冲区,我可以在其中按下RET(绑定到compile-goto-error)跳转到相应的位置。

但是,compile-goto-error总是在另一个窗口中访问该位置,从而使编译缓冲区保持打开状态。有一半的时间我只是在搜索一个特定的位置,所以我想做的是绑定一些其他键(比如C-RET)来访问缓冲区中的相应位置,但留在当前窗口中,将编译缓冲区替换为位置的缓冲区。

我已经跟踪了从compile-goto-errorto next-error-internalto next-error-functionto compilation-next-error-functionto的相关执行compilation-find-file,但找不到一个很好的地方来挂钩我的不同行为。是否有一种简单的方法(或者,如果失败,一种复杂的方法)来创建一个compile-goto-error变体,该变体在保存编译缓冲区的窗口中就地切换到新缓冲区?

4

2 回答 2

3

我建议只是建议compile-goto-error函数做正确的事情,而不是创建自定义函数和键绑定。以下对我来说是正确的(遵循 Stefan 的建议):

(defadvice compile-goto-error (around my-compile-goto-error activate)
  (let ((display-buffer-overriding-action '(display-buffer-reuse-window (inhibit-same-window . nil))))
    ad-do-it))
于 2013-12-12T16:15:57.257 回答
1

我认为你应该能够通过 let-binding 得到你想要的display-buffer-overriding-action,比如:

(defun my-next-error ()
  (interactive)
  (let ((display-buffer-overriding-action '(display-buffer-same-window)))
    (next-error)))
于 2013-04-04T16:48:00.133 回答