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à.
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.