我有一个执行多目录grep的个人elisp函数。它使用compilation-start
,它创建一个包含结果的编译模式缓冲区,我可以按RET
(绑定到compile-goto-error
)跳转到相应的位置。
但是,compile-goto-error
始终访问另一个窗口中的位置,保留编译缓冲区。有一半的时间我只是在搜索一个特定的位置,所以我想要做的是绑定一些其他键(比如C-RET
)来访问缓冲区中的相应位置,但保留在当前窗口中,替换带位置缓冲区的编译缓冲区。
我已追踪从compile-goto-error
到next-error-internal
到next-error-function
到compilation-next-error-function
到compilation-find-file
的相关执行情况,但无法找到一个好地方挂钩我的不同行为。是否有一种简单的方法(或者,失败,复杂的方法)创建一个compile-goto-error
变体,在保存编译缓冲区的窗口中就地切换到新的缓冲区?
答案 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)))