Emacsで現在のバッファ以外のすべてのバッファを閉じます


91

Emacsで現在のバッファー以外をすべて閉じるにはどうすればよいですか?最新のWebブラウザーの「他のタブを閉じる」機能に似ていますか?

回答:


99

より手動のアプローチとして、すべてのバッファをC-x C-bで一覧表示し、リスト内のバッファにで削除のマークを付けd、を使用xしてそれらを削除できます。

また、list-buffersをより高度なibufferに置き換えることをお勧めします(global-set-key (kbd "C-x C-b") 'ibuffer)。上記はibufferで動作しますが、これを行うこともできます。

m(保持するバッファにマークを付ける)
t(トグルマーク)
D(マークされたすべてのバッファを削除する)

Emacs Wikiのこのスニペットも使用します。これにより、この手動のアプローチがさらに効率化されます。

;; Ensure ibuffer opens with point at the current buffer's entry.
(defadvice ibuffer
  (around ibuffer-point-to-most-recent) ()
  "Open ibuffer with cursor pointed to most recent buffer name."
  (let ((recent-buffer-name (buffer-name)))
    ad-do-it
    (ibuffer-jump-to-buffer recent-buffer-name)))
(ad-activate 'ibuffer)

どうすれば戻ることができibufferますか?@phils
アルパー

1
あなたが何を求めているのか分かりませんが、たぶんqC-h m他のモードと同様に、キーバインドを学習するために使用します。
フィル

53

EmacsWikiから:Killing Buffers

(defun kill-other-buffers ()
    "Kill all other buffers."
    (interactive)
    (mapc 'kill-buffer 
          (delq (current-buffer) 
                (remove-if-not 'buffer-file-name (buffer-list)))))

編集:Gillesからのフィードバックで更新


3
なぜdiredバッファは殺されないのですか?私もそれを削除したい
swdev

diredバッファーは設定されないbuffer-file-nameため、remove-if-not上記の例の呼び出しではdiredバッファー(およびスクラッチバッファー、termバッファー、ヘルプバッファーなど、ファイルにアクセスしないもの)が保持されます。ファイルバッファーとdiredバッファーの両方を閉じる簡単なテストを考えることはできません。基本的には、dircバッファーの別のテストでmapcを2度起動する必要があります。
robru

diredバッファも(defun kill-other-buffers () "Kill all other buffers." (interactive) (mapc 'kill-buffer (delq (current-buffer) (remove-if-not '(lambda (x) (or (buffer-file-name x) (eq 'dired-mode (buffer-local-value 'major-mode x)))) (buffer-list)))))
削除

このビデオでは、男性がそれを実行できるように見えます。彼は、GNUバッファーなどを閉じながら、新しいSlimeバッファーを開きます。彼がどうやってそれをやっているのかあなたは何か知っていますか?youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist 2017年

交換cl-remove-if-notしてremove-if-not動作しますが、これは殺さない*helm..バッファを
アルパース

21

emacsでこれを直接行う方法はありません。

これを行う関数を書くことができます。以下はすべてのバッファを閉じます:

(defun close-all-buffers()
  (インタラクティブ)
  (mapc 'kill-buffer(buffer-list)))

4
ああ、でもこれはすべてのバッファを閉じます。
Sridhar Ratnakumar

14

組み込みコマンドがありますm- x kill-some-buffers(私は24.3.50を使用しています)次のステップのGUI(ターミナルでは試していませんが、それが似ていることを確認してください)で、どのバッファーを強制終了するかを承認できます。


2
これは、1000以上のバッファがロードされている場合に特に便利です。
ocodo 2015

10
 (defun only-current-buffer () 
   (interactive)
   (let ((tobe-killed (cdr (buffer-list (current-buffer)))))
     (while tobe-killed
       (kill-buffer (car tobe-killed))
       (setq tobe-killed (cdr tobe-killed)))))

期待どおりに動作します。

そして、@ Starkeyの答えを読んだ後、私はこれがより良いと思います:

(defun only-current-buffer () 
  (interactive)                                                                   
    (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))

(buffer-list(current-buffer))は、現在のバッファーをリストの先頭にして、既存のすべてのバッファーを含むリストを返します。

これがStackOverflowに関する私の最初の回答です。それが役に立てば幸い :)


2
そして、これが私の友人であり、人々がアイデアを共有することからどのようにエレガントな解決策が生まれるかです
クリスクラーク

4

この解決策が最も簡単な解決策であることがわかりました。これにより、現在のバッファを除くすべてのバッファが削除されます。このコードを.emacsファイルに追加する必要があります

(defun kill-other-buffers ()
      "Kill all other buffers."
      (interactive)
      (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))

もちろん、それを一緒に使用するM-x kill-other-buffers RET 、次のコードも.emacsファイルに貼り付けて、単にC-xC-b

(global-set-key (kbd "C-x C-b") 'kill-other-buffers)

1

数か月間、crux-kill-other-buffersを使用しています。

しかし、私はdiredバッファも削除して欲しいです。@Eugeと@ wenjun.yanの回答はこれを解決します。しかし、それは特別なバッファ(例えば* git-credential-cache--daemon *、* scratch *、helm操作など)を削除します。だから私はこの(現在の)解決策を思いつきました。

(defun aza-kill-other-buffers ()
  "Kill all buffers but current buffer and special buffers"
  (interactive)
  (dolist (buffer (delq (current-buffer) (buffer-list)))
    (let ((name (buffer-name buffer)))
      (when (and name (not (string-equal name ""))
             (/= (aref name 0) ?\s)
             (string-match "^[^\*]" name))
        (funcall 'kill-buffer buffer)))))

kill-matching-buffersに触発されました。condition必要に応じて、除外する他のバッファ名にさらに追加できます。

それが役に立てば幸い :)


改善されたソリューションについては、こちらをご覧ください。
azzamsa 2018

0

あなたもこれを好きになることができます-現在のものを除くすべてのバッファを殺します* Messages *と* scratch *(これは便利です。私はそれらを「ツールキット」と呼びます)、冗長ウィンドウも閉じて、どのウィンドウが現在のウィンドウであるかを生きますバッファ。

(defun my/kill-all-buffers-except-toolbox ()
  "Kill all buffers except current one and toolkit (*Messages*, *scratch*). Close other windows."
  (interactive)
  (mapc 'kill-buffer (remove-if
                       (lambda (x)
                         (or
                           (string-equal (buffer-name) (buffer-name x))
                           (string-equal "*Messages*" (buffer-name x))
                           (string-equal "*scratch*" (buffer-name x))))
                       (buffer-list)))
  (delete-other-windows))

(string-equal (buffer-name) (buffer-name x))と同じですが、(eq x (current-buffer))効率が低下します。残りorは、次のように簡略化できます(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.