Як закрити всі, крім поточного буфера, у Emacs? Подібно до функції "Закрити інші вкладки" у сучасних веб-браузерах?
Як закрити всі, крім поточного буфера, у Emacs? Подібно до функції "Закрити інші вкладки" у сучасних веб-браузерах?
Відповіді:
Для більш ручного підходу ви можете перерахувати всі буфери за допомогою 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)
q
? Використовуйте C-h m
для вивчення сполучень клавіш, як і в будь-якому іншому режимі.
З EmacsWiki: Вбивство буферів :
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer
(delq (current-buffer)
(remove-if-not 'buffer-file-name (buffer-list)))))
Редагувати : оновлено за відгуками Жиля
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)))))
cl-remove-if-not
з remove-if-not
роботою , але це не вбиває *helm..
буфера
В emacs немає способу зробити це.
Ви можете написати функцію для цього. Наступне закриє всі буфери:
(розмити буфери закрити всі () (інтерактивний) (mapc 'буфер вбивства (список буферів)))
(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. Сподіваюся, це допоможе :)
Я знайшов це рішення найпростішим. Це видаляє кожен буфер, крім поточного. Ви повинні додати цей код у свій .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)
Я використовую 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
про інше ім'я буфера для виключення, якщо хочете.
Сподіваюся, це допоможе :)
Вам може сподобатися і цей - убити всі буфери, крім поточного, * Повідомлення * та * скретч * (які зручно мати, я називаю їх "інструментарій"), закрийте також зайві вікна, живучи вам, яке одне вікно яке поточне буфер.
(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*"))
Це те, що ви хочете:
C-x 1
джерело: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
ibuffer
? @phils