杀死当前缓冲区时如何跳过特殊缓冲区?

杀死当前缓冲区时如何跳过特殊缓冲区?

我的代码中有一些代码.emacs可以防止它在使用previous-bufferand时显示一些预定义的特殊缓冲区next-buffer

(defadvice next-buffer (after avoid-messages-buffer-in-next-buffer)
  (when (string= "*Messages*" (buffer-name)) (next-buffer))
  (when (string= "*Completions*" (buffer-name)) (next-buffer))
  (when (string-match "\*tramp.*\*" (buffer-name)) (previous-buffer))
   ... and so on)

这很好用,但我希望C-x k.到目前为止,我已经尝试编写相同类型的函数(defadvice (after kill-buffer) ...),但这似乎不起作用。

我该怎么做呢?

答案1

这应该有效:

(defvar no-kill-buffers
  '("*Messages*"
    ;; ...
    ))

(defadvice kill-buffer (around no-kill-some-buffers activate)
  (unless (member (buffer-name) no-kill-buffers)
    ad-do-it))

您的建议不起作用的原因是它是“之后”建议,这意味着它直到正常kill-buffer逻辑完成后才运行。 (这就是after(after avoid-message-buffer-in-next-buffer).

around建议让您可以在建议的命令之前或之后放置自定义逻辑,甚至可以控制它是否运行。该ad-do-it符号告诉它是否以及何时运行正常kill-buffer例程。

编辑:

重新阅读你的问题后,我想我可能误解了它。如果您希望跳过在杀死缓冲区后显示的特殊缓冲区,那么您的方法基本上是正确的。你激活建议

您可以评估(ad-activate 'avoid-messages-buffer-in-next-buffer)或包含activate在参数列表的末尾,就像defadvice我在示例中所做的那样。

相关内容