Как закрыть все, кроме текущего буфера в Emacs? Аналогично функции «Закрыть другие вкладки» в современных веб-браузерах?Закройте все буферы, кроме текущего, в Emacs
ответ
От 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: обновлена с обратной связью от Жиля
В emacs нет прямого способа сделать это.
Вы можете написать функцию для этого. Ниже будет закрыть все буферы:
(defun close-all-buffers() (interactive) (mapc 'kill-buffer (buffer-list)))
Ах, но это близко * все * буферы. –
Но это то, что я хочу ... – Droogans
Для более ручного подхода, вы можете получить список всех буферов с 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)
спасибо! это очень полезно – Cynede
(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. Надеюсь, что это помогает :)
И это мои друзья, как изящные решения возникают у людей, которые делятся своими идеями. –
Существует встроенный в команде м - хkill-some-buffers
(я использую 24.3.50) В моей NeXTstep появились гуй (не пробовал в терминале, но уверен, что это похоже), то вы можете утверждать, какие буферы убивать.
Это особенно полезно, когда вы загружаете 1000+ буферов. – ocodo
Я нашел это решение самым простым. Это удаляет каждый буфер, кроме текущего.Вы должны добавить этот код в ваш .emacs
файл
(defun kill-other-buffers()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
Конечно, вы использовать его с Mxkill-other-buffers
RETили вы вставьте следующий код в файле .emacs
тоже, а затем просто нажмите CxCb
(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
Почему утиный буфер не убивается? Мне нравится удалять, что также – swdev
Dired buffers не устанавливают 'buffer-file-name', и, таким образом, вызов метода remove-if-not в приведенном выше примере сохранит обработанные буферы (а также буфер с буфером, терминальные буферы, буферы поддержки и т. д., ничего, что не посещает файл). Я не могу придумать легкий тест, который бы закрывал как файловые буферы, так и обработанные буферы, вам понадобилось бы в основном целый второй вызов mapc с другим тестом для обработанных буферов. – robru
простая модификация, чтобы убить также Dired буфер '(DEFUN Kill-другие-буфера() "убить все другие буфера." (интерактивные) (MAPC«убить-буфер (delq (ток-буфер) (remove- if-not '(lambda (x) (или (имя-буфера-файла x) (эквалайзер «dired-mode» (буфер-локальное значение «основной режим x»))) (буферный список))))) ' – frinkr