вторник, 14 июля 2015 г.

Emacs: удобное переключение между буферами

Emacs такая штука, что обычно в нем открыто много разный файлов одновременно. А тем более разных буферов (буфер вовсе не обязательно должен быть связан с конкретным файлом), между которыми нужно переключаться. Можно конечно это делать с помощью графического меню, но.. его может и не быть, или оно может быть, но при этом не быть мышки, которой легко кликнуть нужный пункт (скажем Emacs запущен в чоорной консоли). А еще в этом меню будет много лишнего (специальные буферы Help, Messages,..) Короче, ну его нафиг! Поэтому удобнее будет так:
(defvar wf-buffers-group1 "\\*\\(?:Help\\|Messages\\|scratch\\|Occur\\)\\*")

(global-set-key (kbd "C-b") (lambda()
         "List buffers"
         (interactive)
         (rkill-buffers wf-buffers-group1)
         (buffer-menu)
         (isearch-forward)
         ;; чтобы не жать Enter дважды
         (execute-kbd-macro (kbd "RET"))
         (rkill-buffers "\\*Buffer.List\\*")
         ))
Переключение к списку всех нужных буферов по привычной для меня комбинации Ctrl+B, после нажатия которой достаточно начать набирать имя требуемого буфера, а потом нажать Enter или Esc, или еще какую-нибудь клавишу. Или просто тупо кликнуть мышкой ;)
Функция 'rkill-buffers' (пере)оперделяет назойливое поведение kill-buffer, которая требует подтверждения закрытия любого буфера, кроме текущего:
(require 'cl)
(defun rkill-buffers (rexp)
  "Закрыть совпадающие буферы МОЛЧА"
  (flet ((kill-buffer-ask (buffer) (kill-buffer buffer)))
    (kill-matching-buffers rexp)))

Почему же так не сделано по умолчанию?- это Emacs, детка, тут каждый сам себе бог =)

Альтернативные варианты:
  • прокрутка колесом мышки на mode line - вполне юзабельно, если открыто не очень много файлов
  • tab bar mode - очевидно вкладки, вот не использую, ничего не могу сказать по поводу этого.
UPD июль 2015
Ну и отдельного упоминания заслуживает функция переключения между двумя буферами: текущим и предыдущим, после переключения на предыдущий он становится текущим, т. е. циклическое переключение:
(defun switch-to-previous-buffer ()
  (interactive)
  (switch-to-buffer (other-buffer (current-buffer) 1)))

0 коммент. :

Отправить комментарий

Следующее Предыдущее Главная страница

Blogger Template by Blogcrowds