Geben Sie den aktuellen Dateinamen in den Minipuffer ein

12

Wie kann ich den Dateinamen des aktiven Dateipuffers in einen Befehl einfügen?

Wenn ich einen Befehl aufrufe, der einen Dateinamen benötigt, tue ich dies häufig aus einem Dateipuffer und möchte den Namen dieser Datei, während ich den Befehl in den Minipuffer eingebe.

Ich suche nach einer Hypothese C-x, die ich beim Bilden einer Befehlszeile im Minipuffer eingeben kann.

Wenn der aktuelle Puffer eine Datei mit dem Namen ist Lorem Ipsum.txt, gebe ich Folgendes ein:

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

Das M-xgrepRETzeigt einen Minibuffer, der zur Eingabe des grepBefehls auffordert . Als Antwort habe ich das Regex-Muster-Argument ( 'foo') eingegeben und das Dateinamen-Argument ( C-x) eingefügt . Dieser Minipuffer endet wie folgt:

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

Welcher vorhandene Befehl erhält den Dateinamen des aktuellen Dateipuffers wie folgt? Was ist die Standardschlüsselbindung?

große Nase
quelle
3
Ich bin überrascht, dass niemand etwas erwähnt hat M-n. Es funktioniert nicht überall, aber an vielen Orten. Außerdem, da du greppst, magst du vielleicht lgrep und rgrep, die ein bisschen interaktiver sind, denke ich.
Malabarba,

Antworten:

18

Welcher vorhandene Befehl erhält den Dateinamen des aktuellen Dateipuffers wie folgt?

Leider gibt es keinen fertigen Befehl dafür, aber wir können einen wie folgt erstellen:

(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)))))

Die Magie steckt in der Minibuffer-Selected-Window- Funktion; Es macht das Richtige, indem es den letzten Puffer auswählt, bevor der Minipuffer aktiviert wurde. Andernfalls wird der Dateiname nicht in den Minipuffer übernommen, wenn nur der Name der Pufferdatei verwendet wird. Interessanterweise kann dieselbe Funktion in einem regulären Puffer oder Minipuffer zum Einfügen des Dateinamens verwendet werden. Es ist keine besondere Behandlung erforderlich.

Was ist die Standardschlüsselbindung?

Es gibt keine, aber Sie können eine passende auswählen und sie wie folgt zuweisen:

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

Fügen Sie die obigen Lisp-Codezeilen in Ihre init.el-Datei ein.

Dies funktioniert in den meisten trivialen Fällen, ist jedoch schwer vorherzusagen, welche Konflikte möglicherweise mit den Modi auftreten, die Sie beim Aufrufen dieser Funktion aktiviert haben.

Was ist, wenn der Puffer keinen gültigen Dateinamen aufruft, z. B. den Arbeitspuffer? Dann wird dieser Fehler im Echobereich angezeigt:

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

Das Auswählen eines gültigen Puffers mit einem richtigen Dateinamen vor dem Aufrufen der Verknüpfung vermeidet solche Fehler.

Es gibt verschiedene andere Lösungen wie die oben genannten, sie unterscheiden sich jedoch hauptsächlich darin, wie sie mit Ausnahmen oder Überschreibungen für Konflikte umgehen. Einige verwenden beispielsweise Modus-Hooks, um diese Funktion nur in bestimmten Modi verfügbar zu machen.

Emacs-Benutzer
quelle
Damit dies funktioniert, denke ich, muss man enable-recursive-minibuffers.
Dieter.Wilhelm
Wenn der Befehl nur im Minipuffer verwendet werden soll, kann die folgende Bindung anstelle (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function des Puffernamens verwendet werden, an den ich gebunden habe C-c b, wodurch der aktuelle Puffername eingefügt wird .
Dov Grobgeld
2

Bei Verwendung dired-xder Tastenkombination C-x C-jist gebunden an dired-jump. So landen Sie aus Ihrem Dateipuffer in der richtigen Zeile und können den Dateinamen mit kopieren w. Und dann können Sie es in den Minipuffer einfügen.

Eine weitere Möglichkeit, die Eingabe des Dateinamens zu erleichtern, ist die standardmäßige Vervollständigung der Emacs-Minipufferdatei. Geben Sie einfach die ersten Zeichen Ihres Dateinamens und dann die Tabulatortaste ein.

Dieter.Wilhelm
quelle
1
Sie können den Namen der Datei einfach mit w(Befehl dired-copy-filename-as-kill) in die aktuelle Dired-Zeile kopieren .
Drew
-1

In der Frage wird nach einem vorhandenen Emacs-Befehl gefragt, der dies ausführt.

Wie bereits gesagt:

Leider gibt es dafür keinen fertigen Befehl

was sich als Antwort auf diese Frage herausstellt.

große Nase
quelle
Es gibt Möglichkeiten, Ihren Anwendungsfall zu lindern, und andere schlagen maßgeschneiderte Codierungslösungen vor. Ich denke, Ihre Aussage ist nicht richtig. Sie haben nicht speziell nach einem Out-of-the-Box- Emacs gefragt !
Dieter.Wilhelm
Ich habe speziell für diesen Zweck nach einem vorhandenen Befehl gefragt, also ist diese Antwort richtig.
Bignose