現在のバッファを終了するときに特別なバッファをスキップするには?

現在のバッファを終了するときに特別なバッファをスキップするには?

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

おすすめ記事