6

複数のバッファーで emacs コマンドを実行する方法はありますか?それらを個別に選択して個々のバッファーで実行する必要はありません。

私は通常、特定の正規表現に一致する複数のファイルを開きます。たとえば~/*.py、特定のモードを有効にしたい、たとえば、hs-minor-modeまたはglasses-modeそれぞれで、またはそれぞれで実行するC-c @ C-M-hとします。現在、私はそれらのそれぞれを選択し、個別に行う必要があります。タスクを自動化するためのハックまたはループがあります。

buffer-list からバッファをマークし、マークされたすべてのバッファに対してコマンドを実行するとします。

これを試しましたが、コマンドを実行した後eval-expression、ミニバッファーへのアクセスが完全に失われました。つまり、ミニバッファーを入力するたびにM-xこれが返されました

ミニバッファemacsエラーにアクセスできません「プロセスメニューモードはHideshowマイナーモードをサポートしていません」

C-x C-sそして、終了タスクも機能していなかったため、実際にemacsプロセス全体を強制終了することを余儀なくされました。

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 に詳しい人のために、同じことを行うコマンドを次に示します。diredmまたはその他のより強力な方法でファイルを選択します。次に、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 に答える