Emacsで現在のバッファー以外をすべて閉じるにはどうすればよいですか?最新のWebブラウザーの「他のタブを閉じる」機能に似ていますか?
Emacsで現在のバッファー以外をすべて閉じるにはどうすればよいですか?最新のWebブラウザーの「他のタブを閉じる」機能に似ていますか?
回答:
より手動のアプローチとして、すべてのバッファを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)
q
?C-h m
他のモードと同様に、キーバインドを学習するために使用します。
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer
(delq (current-buffer)
(remove-if-not 'buffer-file-name (buffer-list)))))
編集:Gillesからのフィードバックで更新
buffer-file-name
ため、remove-if-not
上記の例の呼び出しではdiredバッファー(およびスクラッチバッファー、termバッファー、ヘルプバッファーなど、ファイルにアクセスしないもの)が保持されます。ファイルバッファーとdiredバッファーの両方を閉じる簡単なテストを考えることはできません。基本的には、dircバッファーの別のテストでmapcを2度起動する必要があります。
(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)))))
cl-remove-if-not
してremove-if-not
動作しますが、これは殺さない*helm..
バッファを
emacsでこれを直接行う方法はありません。
これを行う関数を書くことができます。以下はすべてのバッファを閉じます:
(defun close-all-buffers() (インタラクティブ) (mapc 'kill-buffer(buffer-list)))
組み込みコマンドがありますm- x kill-some-buffers
(私は24.3.50を使用しています)次のステップのGUI(ターミナルでは試していませんが、それが似ていることを確認してください)で、どのバッファーを強制終了するかを承認できます。
(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に関する私の最初の回答です。それが役に立てば幸い :)
この解決策が最も簡単な解決策であることがわかりました。これにより、現在のバッファを除くすべてのバッファが削除されます。このコードを.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)
数か月間、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
必要に応じて、除外する他のバッファ名にさらに追加できます。
それが役に立てば幸い :)
あなたもこれを好きになることができます-現在のものを除くすべてのバッファを殺します* 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*"))
これはあなたが望むものです:
C-x 1
ソース:https : //blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
ibuffer
ますか?@phils