Как я могу одновременно работать с несколькими буферами 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.

Другие вопросы по тегам