想要在当前窗口中替换编译缓冲区的compile-goto-error变体

时间:2013-04-04 14:26:24

标签: elisp

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

但是,compile-goto-error始终访问另一个窗口中的位置,保留编译缓冲区。有一半的时间我只是在搜索一个特定的位置,所以我想要做的是绑定一些其他键(比如C-RET)来访问缓冲区中的相应位置,但保留在当前窗口中,替换带位置缓冲区的编译缓冲区。

我已追踪从compile-goto-errornext-error-internalnext-error-functioncompilation-next-error-functioncompilation-find-file的相关执行情况,但无法找到一个好地方挂钩我的不同行为。是否有一种简单的方法(或者,失败,复杂的方法)创建一个compile-goto-error变体,在保存编译缓冲区的窗口中就地切换到新的缓冲区?

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

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

(defun my-next-error ()
  (interactive)
  (let ((display-buffer-overriding-action '(display-buffer-same-window)))
    (next-error)))