我正在寻找与:bufdo
Emacs 中的 Vim 命令等效的功能。:bufdo
接受一个参数 - 另一个命令 - 并在所有打开的缓冲区上执行该命令。我还没有在 Emacs 中找到类似的功能。
Leonard
问问题
435 次
3 回答
9
根据您的命令是什么,您可以执行以下操作:
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)))
注意:代码未经测试
于 2009-05-08T05:26:21.593 回答
6
您还可以签出 ibuffer,它允许您标记您喜欢操作的缓冲区m
,然后您可以在其上执行某些操作E
。其他常见操作也可用,例如query-replace
on Q
。只需查看菜单或模式说明 ( C-h m
)。
顺便说一句, dired也可能发生类似的事情,尽管它似乎没有给你eval
命令。
于 2009-05-08T07:37:36.880 回答
2
看一下缓冲区列表(函数)。它返回所有打开的缓冲区(BUFFER 对象)的列表。有关将它与 mapcar 一起使用的简单示例,请参阅手册(它对列表的每个元素进行操作,并累积结果)。您可能还会发现 set-buffer,它以编程方式从 Emacs Lisp 设置当前缓冲区,很有用。
于 2009-05-08T05:29:37.187 回答