如何同时操作多个Emacs缓冲区?

5

我正在寻找Emacs中与Vim命令:bufdo相当的命令。 :bufdo需要一个参数,即另一个命令,并在所有打开的缓冲区上执行该命令。 我尚未在Emacs中找到类似的功能。

3个回答

9

根据您的命令,您可以执行以下操作:

M-: (mapc (lambda (b) (set-buffer b) (*command*)) (buffer-list))

但是,我感觉你想要的不是那么“Lispy”。看看键盘宏。首先,决定你想要做什么:

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

注意:代码未经测试。

2
最好使用“with-current-buffer”,例如(loop for buf in (buffer-list) do (with-current-buffer buf <forms>))。 - jrockway

6
你还可以尝试使用ibuffer,它允许你用m标记你想要操作的缓冲区,然后用E执行相应操作。其他常见操作也可用,例如在Q上进行query-replace。只需查看菜单或模式描述(C-h m)即可。
顺便说一句,从dired中也可以实现类似的功能,尽管它似乎没有提供eval命令。

2

看一下buffer-list(函数)。它返回所有打开的缓冲区(BUFFER对象)的列表。参见手册,其中有一个使用mapcar的简单示例(mapcar对列表中的每个元素进行操作,并累加结果)。你可能还会发现set-buffer很有用,它可以从Emacs Lisp程序中设置当前缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接