Закрийте всі буфери, крім поточного, в Emacs


91

Як закрити всі, крім поточного буфера, у Emacs? Подібно до функції "Закрити інші вкладки" у сучасних веб-браузерах?

Відповіді:


99

Для більш ручного підходу ви можете перерахувати всі буфери за допомогою C-x C-b, позначити буфери у списку для видалення за допомогою d, а потім використовувати xдля їх видалення.

Я також рекомендую замінити список-буфера з більш просунутою ibuffer: (global-set-key (kbd "C-x C-b") 'ibuffer). Вищевказане буде працювати з ibuffer, але ви також можете зробити це:

m(позначте буфер, який ви хочете зберегти)
t(переключити позначки)
D(убити всі позначені буфери)

Я також використовую цей фрагмент з Вікі Emacs, який надалі впорядкує цей ручний підхід:

;; 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
alper

1
Я не впевнений, що ви запитуєте, але, можливо q? Використовуйте C-h mдля вивчення сполучень клавіш, як і в будь-якому іншому режимі.
phils

53

З EmacsWiki: Вбивство буферів :

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

Редагувати : оновлено за відгуками Жиля


3
Чому буфер, що перебуває, не вбивають? Мені подобається видаляти і це
swdev

dired buffers не встановлюються, buffer-file-nameі, отже, виклик remove-if-notу наведеному вище прикладі збереже dired буфери (а також буфер подряпин, буфери термінів, буфери довідки тощо, все, що не відвідує файл). Я не можу придумати простий тест, який би закрив як буфери файлів, так і введені буфери, вам знадобиться в основному ціле друге виклик mapc з іншим тестом для вбудованих буферів.
Робру

проста модифікація для знищення також занурених буферів (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)))))
frinkr

Схоже, на цьому відео чоловік може це зробити. Він відкриває новий буфер Slime, закриваючи буфери GNU та інші. Ви уявляєте, як він це робить? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist

Заміна cl-remove-if-notз remove-if-notроботою , але це не вбиває *helm..буфера
Альпер

21

В emacs немає способу зробити це.

Ви можете написати функцію для цього. Наступне закриє всі буфери:

(розмити буфери закрити всі ()
  (інтерактивний)
  (mapc 'буфер вбивства (список буферів)))

4
Ах, але це закриє всі буфери.
Шрідхар Ратнакумар

14

Існує вбудована команда m- x kill-some-buffers(я використовую 24.3.50) У моєму графічному інтерфейсі nextstep (не намагався в терміналі, але впевнений, що це схоже) ви можете затвердити, які буфери вбивати.


2
Це особливо корисно, коли завантажено понад 1000 буферів.
ocodo

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 кілька місяців.

Але я хочу, щоб і буфери, що входять в систему, теж видалялися. Відповіді @ Euge та @ wenjun.yan вирішують це. Але він видалить спеціальні буфери (наприклад, * git-credential-cache - демон *, * скретч *, операція керування тощо). Тож я придумав це (поточне) рішення.

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

Натхненний буферами вбивства . Ви можете додати більше conditionпро інше ім'я буфера для виключення, якщо хочете.

Сподіваюся, це допоможе :)


Див. Це для мого вдосконаленого рішення.
azzamsa

0

Вам може сподобатися і цей - убити всі буфери, крім поточного, * Повідомлення * та * скретч * (які зручно мати, я називаю їх "інструментарій"), закрийте також зайві вікна, живучи вам, яке одне вікно яке поточне буфер.

(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*"))
Стефан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.