Как я могу одновременно работать с большим количеством буферов Emacs? - PullRequest
5 голосов
/ 08 мая 2009

Я ищу эквивалент команды :bufdo Vim в Emacs. :bufdo принимает аргумент - другую команду - и выполняет команду для всех открытых буферов. Я еще не нашел подобную функцию в Emacs.

Ответы [ 3 ]

9 голосов
/ 08 мая 2009

В зависимости от того, что ваша команда, вы можете сделать:

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)))

Примечание: код не проверен

6 голосов
/ 08 мая 2009

Вы также можете оформить заказ ibuffer , он позволяет пометить буферы, с которыми вам нравится работать, с помощью m, а затем вы можете выполнить что-то для него с помощью E. Другие общие операции также доступны, например, query-replace на Q. Просто посмотрите меню или описание режима (C-h m).

Кстати, подобные вещи также возможны из dired , хотя, похоже, он не дает вам команду eval.

2 голосов
/ 08 мая 2009

Посмотрите на список буферов (функция). Возвращает список всех открытых буферов (объектов BUFFER). См. руководство для простого примера использования его с mapcar (который работает с каждым элементом списка и собирает результаты). Возможно, вы также найдете полезными set-buffer, который программно устанавливает текущий буфер из Emacs Lisp.

...