web-dev-qa-db-ja.com

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

私が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 compile_と入力すると、emacsはコンパイルコマンドを要求します。簡単にgcc (current-buffer)に入りたい。

  2. ロードファイル:.emacsファイルを編集しているときに、すぐにロードして変更をテストしたいと思います。私が行う方法は_M-x load-file_であり、常に名前を綴ります .emacs。ショートカットが欲しいのですが。

  3. 外部プロセスの起動:_du -sh_を使用してシェルコマンドを実行したときにショートカットも使用できるようにすることを示すために、例として_M-!_を指定しました

これまでに見つけたもの

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

[〜#〜] edit [〜#〜]:A私はこれらのソリューションが機能しない理由を見つけたので、少し無関係です。 IDOを有効または無効にします。

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

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

私は現在、Vimを何年も使用した後、emacs(実際には数か月前)の使用方法を学んでいます。予測可能なusing-emacs-in-a-Vim-wayトラップを回避したい。私が求めているのはemacs-yではなく、より良い(よりクリーンな)方法があるはずだと感じた場合は、答えます。

19
rahmu

次のような関数を.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)))))

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

11
easyb

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

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
4
user338519