Inserisci il nome del file corrente nel minibuffer


12

Come posso inserire il nome del file del buffer di file attivo in un comando?

Quando invoco un comando che richiede un nome file, lo faccio spesso da un buffer di file e desidero il nome di quel file mentre digito il comando nel minibuffer.

Sto cercando un ipotetico C-xche posso digitare durante la formazione di una riga di comando nel minibuffer.

Quindi se, mentre il buffer corrente è un file chiamato Lorem Ipsum.txt, scrivo questo:

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

i M-xgrepRETregali un minibuffer richiesta di conferma per il grepcomando. In risposta, ho digitato l'argomento pattern regex ( 'foo') e inserito l'argomento nome file ( C-x). Quel minibuffer finirà come:

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

Quale comando esistente ottiene il nome del file del buffer del file corrente in questo modo? Qual è l'associazione chiave predefinita?


3
Sono sorpreso che nessuno sia menzionato M-n. Non funziona ovunque, ma funziona in molti posti. Inoltre, dal momento che stai prendendo in giro, ti potrebbero piacere lgrep e rgrep, che sono un po 'più interattivi, penso.
Malabarba,

Risposte:


18

Quale comando esistente ottiene il nome del file del buffer del file corrente in questo modo?

Sfortunatamente non esiste un comando già pronto per questo, ma possiamo eseguirne uno come segue:

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

La magia è nella funzione finestra selezionata del minibuffer ; fa la cosa giusta selezionando l'ultimo buffer prima dell'attivazione del minibuffer. Altrimenti usando solo il nome del file buffer non ci porterà il nome del file nel minibuffer. È interessante notare che la stessa funzione può essere utilizzata in un normale buffer o minibuffer per inserire il nome del file. Non è necessario alcun trattamento speciale.

Qual è l'associazione chiave predefinita?

Non c'è nessuno, ma puoi sceglierne uno conveniente e assegnarlo come segue:

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

Inserisci le righe di codice lisp sopra nel tuo file init.el.

Funziona nella maggior parte dei casi banali, ma è difficile prevedere quali conflitti potrebbe avere con qualsiasi modalità tu abbia attivo quando invochi questa funzione.

Cosa succede se il buffer non sta visitando un nome file valido, ad esempio il buffer scratch? Quindi questo errore viene visualizzato nell'area dell'eco:

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

Scegliere un buffer valido con un nome file appropriato prima di richiamare il collegamento eviterà tali errori.

Esistono molte altre soluzioni come la precedente, ma differiscono principalmente nel modo in cui gestiscono le eccezioni o le sostituzioni per eventuali conflitti. Ad esempio, alcuni utilizzano i hook di modalità per rendere disponibile questa funzione solo in determinate modalità.


Perché questo funzioni penso che si debba enable-recursive-minibuffers.
Dieter.Wilhelm,

Se si suppone che il comando sia usato solo nel minibuffer, al posto del (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function nome del C-c bbuffer si può usare la seguente associazione, a cui ho legato il nome corrente del buffer.
Dov Grobgeld,

2

Quando si utilizza dired-xla scorciatoia da tastiera C-x C-jè associato a dired-jump. Quindi dal tuo buffer di file finisci sulla riga con la giusta direzione e puoi copiarne il nome w. E poi sei in grado di incollarlo nel mini buffer.

Un'altra possibilità per modificare la digitazione del nome del file è il completamento standard del mini buffer Emacs. Basta digitare i primi caratteri del tuo nome file e poi TAB.


1
Puoi copiare il nome del file sulla linea Dired corrente semplicemente usando w(comando dired-copy-filename-as-kill).
Estratto il

-1

La domanda richiede un comando Emacs esistente per farlo.

Come detto in precedenza:

Sfortunatamente non esiste un comando già pronto per questo

che risulta essere la risposta a questa domanda.


Ci sono modi per alleviare il tuo caso d'uso e altri hanno suggerito soluzioni di codifica su misura, quindi penso che la tua affermazione non sia corretta. Lei non ha chiesto specificamente per un out-of-the-box modo in cui Emacs'!
Dieter.Wilhelm

Ho chiesto specificamente un comando esistente allo scopo, quindi sì, questa risposta è corretta.
Bignose il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.