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

5 vim emacs buffer

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

Tre*_*son 9

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

M-: (mapc (lambda (b) (set-buffer b) (*command*)) (buffer-list))
Run Code Online (Sandbox Code Playgroud)

但是,我有一种感觉,你想要的东西不那么lispy.看看键盘宏.即,决定你想做什么:

C-x ( <do-your-command> C-x )
M-: (mapc (lambda (b) (set-buffer b) (kmacro-end-and-call-macro)) (buffer-list))
Run Code Online (Sandbox Code Playgroud)

如果您使用它,您可能希望将最后一个部分定义为函数:

(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)))
Run Code Online (Sandbox Code Playgroud)

注意:代码未经测试

  • 可能最好使用"with-current-buffer",比如(缓冲区列表中的buf循环do(with-current-buffer buf <forms>)). (2认同)

dan*_*poe 6

您也可以签出ibuffer,它允许您标记您喜欢的缓冲区m,然后您可以使用它执行某些操作E.其他常见的操作也可以,例如query-replaceQ.只需查看菜单或模式说明(C-h m)即可.

顺便说一句,类似的东西也可以来自dired,虽然它似乎没有给你一个eval命令.