我的代码中有一些代码.emacs
可以防止它在使用previous-buffer
and时显示一些预定义的特殊缓冲区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
我在示例中所做的那样。