Закройте все буферы, кроме текущего в Emacs - PullRequest
84 голосов
/ 05 августа 2010

Как мне закрыть все, кроме текущего буфера в Emacs?Похожа ли функция «Закрыть другие вкладки» в современных веб-браузерах?

Ответы [ 8 ]

92 голосов
/ 06 августа 2010

Для более ручного подхода вы можете перечислить все буферы с помощью Cx Cb , отметить буферы в списке для удаления с помощью 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)
50 голосов
/ 05 августа 2010

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

Редактировать : обновлено с отзывами Жиля

19 голосов
/ 05 августа 2010

В emacs нет прямого способа сделать это.

Вы можете написать функцию для этого. Следующее закроет все буферы:

(defun close-all-buffers ()
  (interactive)
  (mapc 'kill-buffer (buffer-list)))
12 голосов
/ 25 августа 2013

Есть встроенная команда m - x kill-some-buffers (я использую 24.3.50) в моем интерфейсе nextstep (не пробовал в терминале, но уверен, что он похож ) затем вы можете одобрить, какие буферы убивать.

9 голосов
/ 04 января 2013
 (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)))))

Это работает, как вы ожидали.

И после прочтения ответа @ Старки, я думаю, что это будет лучше:

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

(список буферов (текущий-буфер)) вернет список, содержащий все существующие буферы, с текущим буфером в начале списка.

Это мой первый ответ на StackOverflow. Надеюсь, это поможет:)

3 голосов
/ 17 марта 2017

Я нашел это решение самым простым. Это удаляет каждый буфер, кроме текущего. Вы должны добавить этот код в ваш .emacs файл

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

Конечно, затем вы используете его с Mx kill-other-buffers RET или , вы также вставляете следующий код в файл .emacs и затем просто нажмите Cx Cb

(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
1 голос
/ 22 сентября 2018

Я использую crux-kill-other-buffers в течение нескольких месяцев.

Но я хочу, чтобы удаленные буферы тоже были удалены. Ответы @ Euge's и @ 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)))))

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

Надеюсь, это поможет:)

0 голосов
/ 30 июля 2018

Вам также может понравиться этот - убить все буферы, кроме текущего, * 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))
...