Come ottenere il nome file del buffer corrente in emacs?


19

Una delle caratteristiche principali che mi manca di Vim è che salva sempre il nome del file corrente nel %buffer ( maggiori informazioni ). Ciò consente di avviare comandi facilmente come:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Vorrei avere funzionalità simili in emacs(versione 24, se questo fa alcuna differenza), vale a dire un modo semplice per inserire il nome del file aperto nel buffer corrente.

Esempi di ciò che voglio fare

Qui descrivo alcuni casi d'uso di base da spiegare meglio quando sento la necessità di tale scorciatoia

  1. Compila: quando inserisco M-x compileemacs mi chiede un comando di compilazione. Vorrei entrare gcc (current-buffer)facilmente.

  2. Load-file: quando sto modificando il mio file .emacs, vorrei caricarlo subito per testare le modifiche. Il modo in cui lo faccio è M-x load-filee quindi scrivo sempre il nome . e m a c s. Vorrei avere una scorciatoia.

  3. Avvia processi esterni: ho fornito du -shcome esempio, solo per illustrare che voglio che il collegamento sia disponibile anche quando eseguo i comandi della shell conM-!

Quello che ho trovato finora

  • Questa domanda qui su U&L. Le risposte fornite mostrano sostanzialmente dove trovare il nome file di un buffer in modo da poterlo aggiungere al kill-ring. Non è esattamente quello che sto cercando, non voglio uccidere manualmente il nome file prima di usarlo. (Anche le soluzioni descritte in entrambe le risposte non sembrano funzionare in modo uniforme nei miei emacs e richiedono tasti aggiuntivi che li rendono un po 'una seccatura).

EDIT : Un po 'estraneo, ho scoperto perché queste soluzioni non funzionano. Ho IDO abilitato, nel bene o nel male.

  • La (current-buffer)funzione descritta nel manuale restituisce il nome del file nel buffer corrente, ma da nessuna parte negli esempi che ho dato sopra, sto valutando il codice elisp. C'è un modo per inserire il risultato della valutazione di questa funzione in un (mini) buffer e associare in questo modo un collegamento?

Sbaglio a pensare in questo modo?

Attualmente sto imparando a usare emacs (sono passati alcuni mesi in realtà) dopo anni di utilizzo di Vim. Voglio evitare una trappola prevedibile usando-emacs-in-a-Vim-way . Se ritieni che ciò che sto chiedendo non sia molto emacs-y , e ci dovrebbe essere un modo migliore (più pulito?) Di farlo, per favore, menzionalo nelle tue risposte.


A proposito di nome file, in .emacs, inserisci (global-set-key (kbd "C-i") buffer-file-name)se desideri che sia Ctrl + I. A proposito di .emacs, M-x load-file RETfa quello che vuoi; non hai bisogno di scrivere nulla.
Emanuel Berg,

2
Questo flusso di lavoro non si combina molto bene con Emacs, poiché tutti i prompt nella riga inferiore della finestra si trovano in un buffer in Emacs (chiamato minibuffer). Quindi, se corri (buffer-file-name)mentre digiti il ​​minibuffer, ottieni nil, perché (current-buffer)è il minibuffer. Puoi anche cambiare buffer mentre sei nel minibuffer, quindi è difficile tenere traccia di quale buffer è quello che pensi del buffer corrente quando il buffer corrente, come lo vede Emacs, è il minibuffer.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


11

Puoi inserire una funzione come segue nel tuo .emacs e associarla a qualsiasi tasto ti piaccia.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Vedi anche questa domanda , sembra essere simile.


4

Una leggera variante della risposta di @ easyb è quella di copiare il percorso sul tuo kill ring invece di inserirlo nel buffer (utile per i file di sola lettura):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
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.