Закройте все устаревшие буферы


23

Иногда в моем списке буферов более 10 окон с задержкой, и в итоге я использую, buffer-menuчтобы вручную пометить и убить их все. Есть ли более быстрый способ закрыть все открытые окна?


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

Ответы:


32

Вы можете сделать следующее:

M-x ibuffer

* / отмечать буферы в режиме Dired.

D удалить их.


1
Я никогда не слышал об Ибуффере раньше. Я, безусловно , будет отображение C-x C-bна ibuffer.
Ниспио

Вы также можете нажать t( dired-toggle-marks), чтобы отметить все (если ни один не был ранее отмечен).
Caisah

@caisah dired-toggle-marks- это название команды с задержкой . Нажатие tтакже переключит все метки в ibuffer, но незаполненные буферы обычно превосходят нумерацию запомненных буферов, поэтому переключение не часто имеет смысл в этом контексте.
Ниспио

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

1
Примечание: это не работает правильно, когда нет буферов с задержкой, потому что D будет применяться не к буферам с задержкой, а к первому буферу в списке.
Даниэль Куллманн

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окно, вы можете увидеть что-то вроде этого:

example1

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

example2

затем нажмите xдля выполнения.

Я предпочитаю этот путь, потому что мне не нужно думать о том, как мне привязать свой ключ к новой функции, и мои буферы лучше организованы.


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

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

1
Да, именно это я и сделал. Не знал о группах фильтров до того, как прочитал ваш ответ, спасибо, что упомянули их;)
itsjeyd

10

У вас есть много буферов Dired, потому что вы хотели их всех в один момент? Итак, вы хотели создать каждый из них как отдельные буферы?

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

Вот как это сделать:

  1. Загрузить библиотеку Dired + ( dired+.el):

    (require 'dired+)
    
  2. Скажите Dired, чтобы повторно использовать Dired буферы:

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

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

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


Это решение, на котором я остановился сейчас. Я никогда не хотел 20 открытых буферов Dired. Спасибо за предложение (и создание).
Nispio 10.10.14

Ссылки мертвы, получая 404: (
Zelphir Kaltstahl

1
@Zelphir: Спасибо за хедз-ап. Должно быть хорошо сейчас. (Emacs Wiki обычно менял свои URL, поэтому старые сообщения, подобные этой, получали неработающие ссылки.)
Drew

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означает, что выбранные только буферы содержат строку «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.