2010-08-05 3 views

ответ

45

От 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: обновлена ​​с обратной связью от Жиля

+3

Почему утиный буфер не убивается? Мне нравится удалять, что также – swdev

+0

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

+0

простая модификация, чтобы убить также Dired буфер '(DEFUN Kill-другие-буфера() "убить все другие буфера." (интерактивные) (MAPC«убить-буфер (delq (ток-буфер) (remove- if-not '(lambda (x) (или (имя-буфера-файла x) (эквалайзер «dired-mode» (буфер-локальное значение «основной режим x»))) (буферный список))))) ' – frinkr

17

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

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

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

Ах, но это близко * все * буферы. –

+6

Но это то, что я хочу ... – Droogans

76

Для более ручного подхода, вы можете получить список всех буферов с Cx Cb, отметьте буферы в списке для удаления с помощью d, а затем используйте x, чтобы удалить их.

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

м (маркировать буфер вы хотите сохранить)
т (тумблеры знаки)
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) 
+0

спасибо! это очень полезно – Cynede

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

+0

И это мои друзья, как изящные решения возникают у людей, которые делятся своими идеями. –

10

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

+2

Это особенно полезно, когда вы загружаете 1000+ буферов. – ocodo

3

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

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

Конечно, вы использовать его с Mxkill-other-buffersRETили вы вставьте следующий код в файле .emacs тоже, а затем просто нажмите CxCb

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