有没有办法在多个缓冲区上执行emacs命令,而无需单独选择它们并在每个缓冲区上执行它。
我经常打开与特定正则表达式匹配的多个文件,例如~/*.py
并希望启用特定模式,在每个模式上说hs-minor-mode
或glasses-mode
,或者在每个模式上执行C-c @ C-M-h
。目前我必须选择其中的每一个并单独进行。那么是否存在自动执行任务的黑客或循环。
让我说我从缓冲区列表中标记缓冲区,然后对所有标记的那些运行命令。
我尝试this但是在执行eval-expression
中的命令后,我完全失去了对迷你缓冲区的访问权限,这意味着每当我输入M-x
迷你缓冲区返回此
无法访问迷你缓冲区emacs错误“进程菜单模式不支持隐藏显示次要模式”
我被迫实际杀死整个emacs进程,因为C-x C-s
无法正常工作。
PS:我没有elisp的经验
答案 0 :(得分:10)
您可以使用ibuffer模式(它是默认Emacs发行版的一部分)。
(global-set-key "\C-x\C-b" 'ibuffer) ;; make ibuffer the default
在*Ibuffer*
中,您可以使用m
标记所需的缓冲区然后
使用E
执行每个表单。
通常,ibuffer
比通常的缓冲区列表更灵活,我认为ibuffer
应该是Emacs中的默认缓冲区列表。
如果您经常这样做,您可能希望在每次进入python模式时通过将它们附加到模式挂钩来切换这些特定模式:
(add-hook 'python-mode-hook 'hs-minor-mode)
(add-hook 'python-mode-hook 'glasses-mode)
答案 1 :(得分:2)
我不知道ibuffer有这个功能!
无论如何,对于那些更熟悉dired的人来说,这是一个同样的命令。使用m
或任何其他更强大的方法选择dired中的文件。然后执行 M-x dired-do-command
并编写一个表单或命令,就像在 M-x 中一样。
(defun dired-do-command (command)
"Run COMMAND on marked files. Any files not already open will be opened.
After this command has been run, any buffers it's modified will remain
open and unsaved."
(interactive
(list
(let ((print-level nil)
(minibuffer-history-position 0)
(minibuffer-history-sexp-flag (1+ (minibuffer-depth))))
(unwind-protect
(read-from-minibuffer
"Command: " (prin1-to-string (nth 0 command-history))
read-expression-map t
(cons 'command-history 0))
;; If command was added to command-history as a
;; string, get rid of that. We want only
;; evaluable expressions there.
(if (stringp (car command-history))
(setq command-history (cdr command-history)))))))
(dolist (filename (dired-get-marked-files))
(with-current-buffer (find-file-noselect filename)
(if (symbolp command)
(call-interactively command)
(eval command)))))