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

时间:2009-05-08 04:36:39

标签: vim emacs buffer

我正在寻找Emacs中:bufdo Vim命令的等效命令。 :bufdo接受一个参数 - 另一个命令 - 并在所有打开的缓冲区上执行命令。我还没有在Emacs中找到类似的功能。

3 个答案:

答案 0 :(得分:9)

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

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

但是,我有一种感觉,你想要的东西不那么lispy。看看keyboard macros。即,决定你想做什么:

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

注意:代码未经测试

答案 1 :(得分:6)

您还可以结帐ibuffer,它允许您使用m标记您想要操作的缓冲区,然后您可以使用E执行某些操作。其他常见操作也是可用的,例如, query-replace上的Q。只需查看菜单或模式说明(C-h m)。

顺便说一句,dired也可能有类似的事情,虽然它似乎没有给你eval命令。

答案 2 :(得分:2)

看一下buffer-list(函数)。它返回所有打开缓冲区(BUFFER对象)的列表。有关将其与mapcar一起使用的简单示例,请参阅the manual(它对列表的每个元素进行操作,并累积结果)。您可能还会发现set-buffer,它以编程方式设置Emacs Lisp中的当前缓冲区,非常有用。