私のコードには、andを使用したときに事前定義された特殊バッファを表示できないように.emacs
するコードがあります。previous-buffer
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