我正在寻找Emacs中:bufdo
Vim命令的等效命令。 :bufdo
接受一个参数 - 另一个命令 - 并在所有打开的缓冲区上执行命令。我还没有在Emacs中找到类似的功能。
答案 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中的当前缓冲区,非常有用。