我正在寻找Emacs中与Vim命令:bufdo
相当的命令。 :bufdo
需要一个参数,即另一个命令,并在所有打开的缓冲区上执行该命令。 我尚未在Emacs中找到类似的功能。
根据您的命令,您可以执行以下操作:
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)))
看一下buffer-list(函数)。它返回所有打开的缓冲区(BUFFER对象)的列表。参见手册,其中有一个使用mapcar的简单示例(mapcar对列表中的每个元素进行操作,并累加结果)。你可能还会发现set-buffer很有用,它可以从Emacs Lisp程序中设置当前缓冲区。