Закройте все буферы, кроме текущего в Emacs

Как закрыть все, кроме текущего буфера в Emacs? Аналогично функции "Закрыть другие вкладки" в современных веб-браузерах?

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

 (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. Надеюсь, это поможет:)

Ответ 6

Я нашел, что это решение является самым простым. Это удаляет каждый буфер, кроме текущего. Вы должны добавить этот код в свой .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-x C-b

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