現在のファイル名をミニバッファーに入れます


12

アクティブなファイルバッファのファイル名をコマンドに挿入するにはどうすればよいですか?

ファイル名を必要とするコマンドを呼び出すとき、ファイルバッファーから頻繁に呼び出しており、ミニバッファーにコマンドを入力するときにそのファイルの名前が必要です。

C-xミニバッファーでコマンドラインを作成するときに入力できる仮説を探しています。

したがって、現在のバッファーがという名前のファイルである場合、次のようLorem Ipsum.txtに入力します。

M-x grep RET 'foo' SPC C-x … RET

M-xgrepRETプレゼントは、ミニバッファは、入力を求めるgrepコマンド。応答として、正規表現パターン引数('foo')を入力し、ファイル名引数(C-x)を挿入しました。そのミニバッファは次のようになります:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

このような現在のファイルバッファのファイル名を取得する既存のコマンドは何ですか?デフォルトのキーバインディングは何ですか?


3
誰も言及していないことに驚いていM-nます。それはどこでも動作しませんが、多くの場所で動作します。また、grepしているので、lgrepとrgrepが好きかもしれません。これらはもう少しインタラクティブです。
マラバルバ

回答:


18

このような現在のファイルバッファのファイル名を取得する既存のコマンドは何ですか?

残念ながら、このための既製のコマンドはありませんが、次のように作成できます。

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

魔法はミニバッファー選択ウィンドウ関数にあります。ミニバッファがアクティブになる前に最後のバッファを選択することで正しいことを行います。そうしないと、buffer-file-nameだけを使用しても、ミニバッファーにファイル名が入りません。興味深いことに、同じ関数を通常のバッファまたはミニバッファで使用して、ファイル名を挿入できます。特別な処理は必要ありません。

デフォルトのキーバインディングは何ですか?

ありませんが、便利なものを選択して、次のように割り当てることができます。

(global-set-key (kbd "C-c f") 'name-of-the-file)

上記のlispコード行をinit.elファイルに入れます。

これはほとんどの些細なケースで機能しますが、この関数を呼び出すときにアクティブにするモードと競合する可能性があるものを予測するのは困難です。

バッファがスクラッチバッファなどの有効なファイル名にアクセスしていない場合はどうなりますか?次に、このエラーがエコーエリアに表示されます。

name-of-the-file: Wrong type argument: char-or-string-p, nil

ショートカットを呼び出す前に適切なファイル名で有効なバッファーを選択すると、このようなエラーを回避できます。

上記のような他のソリューションもいくつかありますが、それらは主に、例外の処理方法または競合のオーバーライド方法が異なります。たとえば、モードフックを使用して、特定のモードでのみこの機能を使用できるようにするものもあります。


これが機能するためには1つが必要だと思うenable-recursive-minibuffers
ディーター。ウィルヘルム

コマンドがミニバッファーでのみ使用されることになっている場合、現在のバッファー名を挿入する(define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function ためにバインドしたname-of-the-buffer`の代わりに、次のバインディングを使用できますC-c b
ドブグロブゲルド

2

dired-xキーボードショートカットを使用する場合C-x C-jはにバインドされdired-jumpます。そのため、ファイルバッファから正しいdired行に移動し、ファイル名をでコピーできますw。そして、それをミニバッファに貼り付けることができます。

ファイル名の入力を省略する別の可能性は、標準のEmacsミニバッファーファイル補完です。ファイル名の最初の文字を入力してから、TABを入力します。


1
w(command dired-copy-filename-as-kill)を使用するだけで、現在のDired行にファイルの名前をコピーできます。
ドリュー

-1

質問は、これを行うために既存のEmacsコマンドを要求します。

前述のとおり:

残念ながら、このための既製のコマンドはありません

これがこの質問に対する答えであることがわかりました。


ユースケースを軽減する方法や、別注のコーディングソリューションを提案する方法があるので、あなたの声明は正しくないと思います。すぐに使えるEmacsの方法を具体的に要求したわけではありません!
ディーター。ウィルヘルム

その目的のために既存のコマンドを具体的に求めたので、はい、この答えは正しいです。
bignose
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.