emacsで現在のバッファのファイル名を取得する方法は?


19

Vimで私が見逃している主な機能の1つは、現在のファイルのファイル名を常に%バッファーに保存することです(詳細)。次のようなコマンドを簡単に起動できます。

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

同様の機能emacs(バージョン24、違いがあれば)、つまり、現在のバッファーで開かれているファイルの名前を簡単に挿入できるようにしたいと思います。

私がやりたいことの例

ここでは、そのようなショートカットの必要性を感じたときに、より適切に説明するために、いくつかの基本的な使用例を説明します

  1. コンパイル:M-x compileemacs と入力すると、コンパイルコマンドを要求されます。gcc (current-buffer)簡単に入りたいです。

  2. ロードファイル:.emacsファイルを編集しているときに、すぐにロードして変更をテストしたいと思います。私のやり方はそうです。M-x load-fileそれから私はいつも名前をつづり. e m a c sます。ショートカットが欲しいです。

  3. 外部プロセスを起動する:du -sh例として、シェルコマンドを実行するときにショートカットも使用できるようにしたいことを示すためだけに挙げました。M-!

これまでに見つけたもの

  • U&Lに関するこの質問。与えられた答えは基本的にバッファのファイル名を見つける場所を示しているので、キルリングに追加することができます。まさに私が探しているものではありません。使用する前にファイル名を手動で削除する必要はありません。(また、両方の回答で説明されている解決策は、emacsではスムーズに機能しないようであり、追加のキーストロークが必要なため、少し苦痛になります)。

編集:少し無関係で、なぜこれらのソリューションが機能しないのかがわかりました。良くも悪くも、IDOを有効にしています。

  • (current-buffer)関数は、マニュアルに記載カレントバッファ内のファイルの名前を返しませんが、どこにも私は上記の与えた例では、私はelispのコードを評価していません。この関数の評価の結果を(ミニ)バッファに挿入し、この方法をショートカットにバインドする方法はありますか?

このように考えるのは間違っていますか?

私は現在、Vimを何年も使用した後、emacsを使用することを学んでいます(実際には数か月かかりました)。予測可能なusing-emacs-in-a-Vim-wayトラップを避けたい。私が求めているのはあまりemacs-yではないと感じているなら、それを行うためのより良い(よりきれいな?)方法があるはずです、あなたの答えにそれを言及してください。


ファイル名については、.emacsに、(global-set-key (kbd "C-i") buffer-file-name)Ctrl + Iにする場合に入力します。.emacsについては、M-x load-file RET必要なことを行います。何も書く必要はありません。
エマニュエルベルク

2
ウィンドウの一番下の行にあるすべてのプロンプトはEmacsのバッファー(ミニバッファーと呼ばれる)にあるため、このワークフローはEmacsにうまく適合しません。したがって(buffer-file-name)、ミニバッファーに入力しているときに実行すると、ミニバッファーnilであるため、を取得(current-buffer)します。ミニバッファー内でバッファーを切り替えることもできるため、Emacsが見ているように、現在のバッファーがミニバッファーであるまでに、どのバッファーが現在のバッファーであるかを追跡するのは困難です。
ジル 'SO-悪であるのをやめる

回答:


11

次のような関数を.emacsに入れて、好きなキーにバインドできます。

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

この質問も参照してください、それは似ているようです。


4

@easybの答えのわずかな変種は、バッファにパスを配置するのではなく、キルリングへのパスをコピーすることです(読み取り専用ファイルに便利です)。

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.