Как я могу одновременно работать с несколькими буферами Emacs?
Я ищу эквивалент :bufdo
Команда Vim в Emacs. :bufdo
принимает аргумент - другую команду - и выполняет команду для всех открытых буферов. Я еще не нашел подобную функцию в Emacs.
3 ответа
В зависимости от того, что ваша команда, вы можете сделать:
M-: (mapc (lambda (b) (set-buffer b) (*command*)) (buffer-list))
Но у меня такое чувство, что ты хочешь что-то не очень жалкое. Посмотрите на макросы клавиатуры. А именно, решите, что вы хотите сделать:
C-x ( <do-your-command> C-x )
M-: (mapc (lambda (b) (set-buffer b) (kmacro-end-and-call-macro)) (buffer-list))
Вы, вероятно, захотите определить эту последнюю часть как функцию, если будете много ее использовать:
(defun bufdo ()
"execute last macro on all buffers, ala bufdo from vi"
(interactive)
(mapc (lambda (b)
(with-current-buffer b
(kmacro-end-and-call-macro)))
(buffer-list)))
Примечание: код не проверен
Вы также можете оформить заказ ibuffer, он позволяет отмечать буферы, с которыми вы хотите работать m
и тогда вы можете выполнить что-то на нем с E
, Другие общие операции также доступны, например, query-replace
на Q
, Просто проверьте меню или описание режима (C-h m
).
Кстати, подобные вещи также возможны от Dired, хотя это, кажется, не дает вам eval
команда.
Посмотрите на список буферов (функция). Возвращает список всех открытых буферов (объектов BUFFER). В руководстве приведен простой пример использования его с mapcar (который работает с каждым элементом списка и накапливает результаты). Возможно, вы также найдете полезными set-buffer, который программно устанавливает текущий буфер из Emacs Lisp.