6

有没有办法在多个缓冲区上执行 emacs 命令,而不必单独选择它们并在每个单独的缓冲区上执行它。

我通常会打开与特定正则表达式匹配的多个文件,例如~/*.py,并希望启用特定模式,比如在每个文件上执行,hs-minor-mode或者glasses-modeC-c @ C-M-h在每个文件上执行。目前我必须选择其中的每一个并单独进行。那么是否有黑客或循环来自动化任务。

假设我从缓冲区列表中标记缓冲区,然后为所有标记的缓冲区运行命令。

我试过这个,但在执行命令后,eval-expression我完全无法访问我的迷你缓冲区,这意味着每当我输入M-x迷你缓冲区时都会返回这个

无法访问 minibuffer emacs 错误“进程菜单模式不支持隐藏显示次要模式”

我被迫实际上杀死了整个 emacs 进程,因为C-x C-s结束任务也没有工作。

PS:我没有使用elisp的经验

4

2 回答 2

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)
于 2013-01-12T13:56:09.153 回答
2

我不知道 ibuffer 有这个功能!无论如何,对于那些更熟悉 dired 的人来说,这里有一个相同的命令。选择目录中的文件m或任何其他更强大的方法。然后做,M-xdired-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)))))
于 2013-01-12T15:44:16.990 回答