コマンドラインで指定されたファイルのバッファを取得する方法は?

EMACS(24.3.1)を呼び出して、訪れるファイル名が1つだけであると仮定しましょう。 .emacsの起動時にそのファイルのバッファを取得するにはどうすればよいですか?私はそれを試み、関数(現在のバッファ)は私の<�​​em> scratch バッファを返します。

4
追加された
ビュー: 2

3 答え

You can use the variable command-line-args to get a list of elements making up the command line used to invoke emacs. If your command line consists of just two elements — "emacs" and the filename to visit — you can get the buffer associated with the file visited like this:

(get-buffer (file-name-nondirectory (cadr command-line-args)))

ただし、訪問しているファイルのバッファーがまだ使用できないため、これは .emacs の起動ファイルでは機能しません。代わりに、 .emacs ファイルにコードを追加して、コマンドライン引数の処理後に実行される emacs-startup-hook に上記のようなものを追加することができます。たとえば、このコードは、訪問先ファイルのバッファに cmd-line-file-buffer という名前の変数を設定するようにフックを強化します。

(add-hook 'emacs-startup-hook
      (lambda ()
        (if (= 2 (length command-line-args))
            (setq cmd-line-file-buffer
                  (get-buffer (file-name-nondirectory (cadr command-line-args)))))))
1
追加された

解決するには2つの問題があります: .emacs ファイルがあまりにも早く読み込まれていて、Emacsの実行中のインスタンスに複数のバッファがあります。

最初の問題は、他の答えで指摘されているように、あなたのコードを emacs-startup-hook に置くことで解決されます。 2番目の問題は、関連するファイルがないバッファをすべて無視することで解決されます。

(defun my-file-buffers ()
  (remove nil
          (mapcar #'(lambda (buffer) (and (buffer-file-name buffer) buffer))
                  (buffer-list))))

(add-hook 'emacs-startup-hook
          #'(lambda ()
              (message "The following buffers are interesting today: %s"
                       (my-file-buffers))))
1
追加された

これは、訪問するファイルがロードされる前にinitファイルがロードされて実行されているためです。 フック を使用することができます訪問するファイルが読み込まれた直後にコードを実行する-load-functions 例えば、これをあなたのinitファイルに入れます:

(add-hook 'after-load-functions (lambda (f) (setq my-buffer (current-buffer))))
0
追加された