Закрийте всі розроблені буфери


23

Іноді мій список буферів містить 10+ вікон, і я в кінцевому підсумку використовую buffer-menuдля вручну позначення та вбивство всіх. Чи є більш швидкий спосіб закрити всі відкриті вікна?


Я прийняв відповідь, яка найбільш прямо відповідає на питання. Однак я замість цього почав застосовувати унцію профілактики: emacs.stackexchange.com/a/1041/93
nispio

Відповіді:


32

Ви можете зробити наступне:

M-x ibuffer

* / щоб позначити буфери в перенесеному режимі.

D щоб видалити їх.


1
Я ніколи раніше не чув про ibuffer. Я обов'язково буду наносити C-x C-bна карту ibuffer.
nispio

Ви також можете натиснути t( dired-toggle-marks), щоб позначити всі (якщо раніше жодного не було позначено).
caisah

@caisah dired-toggle-marks- це назва переведеної команди. Натискання tтакож перемикає всі позначки в ibuffer, але нерозроблені буфери зазвичай перевищують набрані буфери, тому перемикання часто не має сенсу в цьому контексті.
nispio

@nispio Ви маєте рацію. Я не знаю чому, але я думав, що всі буфери були переведені ...
caisah

1
Примітка: це не працює належним чином, коли немає відряджених буферів, оскільки D застосовуватиметься не до розрядних буферів, а до першого буфера у списку.
Daniel kullmann

10

Замість того, щоб додати ще одну функцію, щоб знищити всі diredбуфери, я пропоную вам скористатися групами фільтрів ibuffer, вона дозволяє групувати буфер за багатьма умовами.

Ось приклад для встановлення груп фільтрів:

(setq-default ibuffer-saved-filter-groups
              `(("Default"
                 ;; I create a group call Dired, which contains all buffer in dired-mode
                 ("Dired" (mode . dired-mode))
                 ("Temporary" (name . "\*.*\*"))
                 )))

Потім C-x C-bвідкрийте ibufferвікно, ви побачите щось подібне:

приклад1

Перемістіть курсор до [ Dired ]M-p, M-n), а потім натисніть, dщоб позначити як видалити

приклад2

потім натисніть xдля виконання.

Я вважаю за краще цей спосіб, тому що мені не потрібно думати про те, як я повинен прив’язати свій ключ до нової функції, а мої буфери краще організовані.


Групи фільтрів не відображалися для мене під час першого запуску ibufferпісля оцінки вашого коду. Мені довелося вдарити / R(зв'язано ibuffer-switch-to-saved-filter-groups), щоб отримати групи.
itsjeyd

(ibuffer-switch-to-saved-filter-groups "Default")Ви можете додати цей рядок коду в гачок ibuffer, назву груп фільтрів слід змінити, якщо це не такDefault
Rangi Lin

1
Так, це я і закінчила. Не знав про групи фільтрів, перш ніж прочитати вашу відповідь, дякую, що згадав їх;)
itsjeyd

10

Чи є у вас багато в'ялених буферів, тому що ви хотіли їх усіх в один момент? IOW, ви хотіли створити кожен з них як окремі буфери?

Якщо ні, рішення просте: скажіть Dired повторно використовувати існуючий буфер Dired, коли ви натиснете RETім'я каталогу, щоб відкрити його в Dired.

Ось як це зробити:

  1. Завантажити бібліотеку Dired + ( dired+.el):

    (require 'dired+)
    
  2. Скажіть Dired повторно використовувати подвійні буфери:

    (diredp-toggle-find-file-reuse-dir 1)
    

Ефект полягає в тому, що коли ви натискаєте RET(або клацаєте мишкою) на каталозі в Dired, find-alternate-fileвикористовується, тому оригінальний буфер Dired замінюється (видаляється) на новий.

Ви можете переключити цю поведінку в будь-який час, використовуючи C-M-R(ака C-M-S-r) в Dired.


Це рішення, яке я вирішив зараз. Я ніколи не хотів в першу чергу 20 відкритих буферів Dired. Дякуємо, що запропонували це (і створили його)
nispio

Посилання мертві, отримуючи 404: (
Зельфір Кальтшталь

1
@ Zelphir: Дякую за голову. Зараз має бути гаразд. (Emacs Wiki взагалі змінив свої URL-адреси, тому у старих публікацій на кшталт цього є непрацездатні посилання.)
Дрю

8

Щось подібне (прокрутити трохи)?

(defun kill-dired-buffers ()
     (interactive)
     (mapc (lambda (buffer) 
           (when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) 
             (kill-buffer buffer))) 
         (buffer-list)))

5

Ви також можете використовувати helm-mini:

  • Біжи M-x helm-mini.
  • Введіть у підказку: *Di(часткове слово для Dired, більше не потрібно вводити). Під час введення буфери поступово звужуються. Тепер Diredзалишився лише буфер. Натисніть, M-aщоб позначити всіх.
  • Натисніть, TABщоб перейти до меню дій, і натисніть, Kщоб вибрати дію Kill buffer(s).
  • Натисніть, RETщоб виконати дію.

Хороша річ у helm-miniтому, що він може замінити звичайний Emacs C-x b, тому вам не доведеться використовувати дві прив’язки клавіш, одну для перемикання буфера і одну для фактичного менеджера буфера. helm-miniвсе-в-одному. Детальніше читайте в моєму посібнику "Шлем-міні" .

helm-miniтакож може нечіткий буфер відповідності та дозволяє відкрити кілька буферів, позначивши їх C-SPCабо M-a(стояти за M ark a ll). Ви також можете звузити, щоб буфер містив певну рядок, додавши @перед шаблоном, наприклад, @testозначає, що виберіть лише буфери, що містять рядок "тест".


1

Я б спробував щось подібне:

(require 'dash)

(defun my-kill-dired-buffers ()
  (interactive)
  (kill-some-buffers
   (-filter (lambda (buffer)
              (save-excursion
                (set-buffer buffer)
                (eq major-mode 'dired-mode)))
            (buffer-list))))

1
Я вважаю, що -filterвимагає dash.elвід MELPA. Вам, мабуть, слід перерахувати це як вимогу.
Вамсі

1

Те, що ви насправді можете шукати, - це спосіб очищення небажаних буферів автоматично, і в цьому випадку вам слід перевірити midnight.el, що є частиною Emacs.

Але загалом кажучи, ibufferце дуже легко працювати над буферами, як це запропонував Франциско.


1

Якщо ви використовуєте Icicles , то ви можете використовувати C-x kдля знищення всіх Dired буферів або всіх буферів у будь-якому режимі.

Після натискання C-x kвикористовуйте C-x M +для збереження лише буферів у певному режимі. Натисніть, TABщоб переглянути режими, і виберіть dired-mode. Потім використовуйте C-!для знищення всіх буферів у цьому режимі.

C-x k C-x M + dired-mode C-!
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.