web-dev-qa-db-ja.com

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

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

85

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)))))

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

50

より手作業の方法として、すべてのバッファーをリストできます。 C-x C-b、リスト内のバッファーに削除のマークを付けます d、そして使用する x それらを削除します。

リストバッファをより高度な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)
93
phils

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

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

(defun close-all-buffers()
(interactive)
(mapc 'kill-buffer(buffer-list)))
19
Starkey

組み込みコマンドがあります m-x kill-some-buffers(私は24.3.50を使用しています)NeXTSTEP gui(端末では試していませんが、似ていることを確認しています)では、どのバッファーを削除するかを承認できます。

13
pjammer
 (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に関する私の最初の回答です。それが役に立てば幸い :)

9
wenjun.yan

このソリューションが最も簡単なものであることがわかりました。これにより、現在のバッファを除くすべてのバッファが削除されます。このコードを.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)
3
Euge

数か月間、 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を追加できます。

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

1
azzamsa

あなたもこれを好きにすることができます-現在のもの、* 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))
0
Adam Faryna