La funzione per mostrare il percorso completo del file corrente nel mini buffer


98

Ho bisogno di ottenere il percorso completo del file che sto modificando con emacs.

  • C'è una funzione per questo?
  • In caso contrario, quale sarebbe la funzione elisp per ottenerlo?
  • Come posso copiare il risultato (nome del percorso) negli appunti in modo da poterlo riutilizzare?

Sto usando Mac OS X e Aqumacs.

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???

AGGIUNTO

(defun nome-file-spettacolo ()
  "Mostra il nome file del percorso completo nel minibuffer."
  (interattivo)
  (messaggio (nome-file-buffer))
  (kill-new (file-truename buffer-file-name))
)
(chiave-set-globale "\ C-cz" 'mostra-nome-file)

Combinando le due risposte che ho ottenuto, potrei ottenere quello che voglio. Grazie per le risposte. E ancora qualche domanda.

  • A cosa serve (file-truename)?
  • Posso copiare il nome del percorso negli appunti del sistema (OS), non nel kill ring in modo da poter utilizzare le informazioni con le altre app?

Risposte:


91

È la funzione integrata buffer-file-nameche ti fornisce il percorso completo del tuo file.

La cosa migliore da fare è avere la finestra di emacs per mostrare sempre il nome del tuo sistema e il percorso completo del buffer che stai attualmente modificando:

(setq frame-title-format
      (list (format "%s %%S: %%j " (system-name))
        '(buffer-file-name "%f" (dired-directory dired-directory "%b"))))

Puoi anche fare qualcosa del genere:

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))

(global-set-key [C-f1] 'show-file-name) ; Or any other key you want

7
In emacs 24 buffer-file-nameè una variabile
barracel

5
... ma anche ancora una funzione
phils

16
Se è una funzione, perché non compare in M-x?
asmeurer

8
asmeurer - perché non è interattivo
Ben Fitzgerald

2
@Talespin_Kit Sì, assolutamente. Elisp è un "lisp-2" al contrario di un "lisp-1", il che significa che ci sono due spazi dei nomi indipendenti (variabili e funzioni). Ciascun simbolo ha quindi uno "slot di funzione" e uno "slot di valore" e lo slot a cui si accede dipende dal contesto. Ci sono molti esempi nella pratica (ad esempio, qualsiasi nome di modalità minore sarà sia una funzione che una variabile). Questo è anche il motivo per cui è necessario utilizzare simili funcallper chiamare una funzione che è memorizzata come valore di una variabile foo, perché se si usasse (foo)si utilizzerebbe lo slot della funzione foopiuttosto che lo slot del valore.
phils

73

Per prendere in prestito dalla risposta di Jérôme Radix, se vuoi solo vedere rapidamente il percorso del file del buffer corrente, puoi farlo M-: buffer-file-name.

In alternativa, digita (buffer-file-name)il buffer da qualche parte ed esegui C-x C-esulla parentesi di chiusura (funzionerà in qualsiasi modalità, non solo in modalità lisp).


3
Grazie, ho pensato buffer-file-namecome funzione, ma non appare M-x, ma appare M-:come emacs eval, lì posso eseguire il comando, grazie alla tua risposta :)
PeterZD

6
Sì, M-xesegue solo funzioni interattive, mentre M-:esegue qualsiasi funzione elisp.
asmeurer

40

Il mio trucco è fare un C-x C-fsimile per aprire un file, precompilerà il minibuff con il percorso del file corrente, C-gper uscire. Più veloce di M-: buffer-file-namema di gran lunga più brutto di qualsiasi altro metodo.


Anch'io lo faccio. Non è così hardcore emacs-y, ma se tutto quello che mi interessa è il percorso del file corrente, funziona.
andrunix

Se apri un file, dì A, e poi salti a un altro file, dì B, ad esempio usando qualche funzionalità di salto alla definizione di un plugin, questo metodo mostra il percorso di A, non B! Pertanto, questa risposta non offre sempre ciò che il PO chiede.
Abhishek Anand,

4
Cx Cv ti mostrerà non solo il percorso corrente ma anche il nome del file corrente
kuzzooroo

@kuzzooroo che è giusto per gli utenti non in modalità ido (il nome viene visualizzato in Cx Cf con tu usi ido-mode).
Julien Palard

16

L'implementazione diretta di ciò che desideri è:

(defun copy-full-path-to-kill-ring ()
  "copy buffer's full path to kill ring"
  (interactive)
  (when buffer-file-name
    (kill-new (file-truename buffer-file-name))))

Detto questo, trovo incredibilmente utile essere in grado di ottenere il percorso completo di ciò che è nel minibuffer, e questo è ciò che uso:

(define-key minibuffer-local-completion-map "\C-r" 'resolve-sym-link)
(defun resolve-sym-link ()
  "Try to resolve symbolic links into true paths."
  (interactive)
  (beginning-of-line)
  (let* ((file (buffer-substring (point)
                                 (save-excursion (end-of-line) (point))))
         (file-dir (file-name-directory file))
         (file-true-dir (file-truename file-dir))
         (file-name (file-name-nondirectory file)))
    (delete-region (point) (save-excursion (end-of-line) (point)))
    (insert (concat file-true-dir file-name))))

E poi se lo voglio negli appunti, uccido semplicemente la riga ( C-a C-k). Ma potremmo facilmente copiare il vero nome negli appunti nel comando sopra, basta cambiare l'ultima riga in:

(insert (kill-new (concat file-true-dir file-name)))))

La parte nuova è la chiamata a 'kill-newcui mette la stringa nel kill ring.


Puoi spiegarci come utilizzare queste impostazioni? E cosa significa "\ Cr"?
modellista

Non importa. L'avevo capito. Penso che sia utile quando sono in modalità ido e sto indicando un file, quindi premo semplicemente Cr per ottenere il percorso completo di quel file. Davvero utile. Tuttavia non so ancora perché usare \ C invece di C.
modellatore

11

Non c'è bisogno di funzioni extra, solo

M-! pwd

Sebbene possa funzionare, non funzionerà sui sistemi Windows e non tiene conto del fatto che la directory di lavoro corrente di emacs può essere diversa dalla directory del file del buffer corrente. Puoi vederlo da solo visitando un file con C-x C-f, in esecuzione M-! pwd, quindi M-x cde selezionando una directory diversa, quindi eseguendo di M-! pwdnuovo.
josaphatv

3

Ho il seguente codice già in uso da molto tempo. Copia il percorso completo del file al kill ring quando premo il pulsante centrale del mouse sul nome del buffer nella riga della modalità. Copia solo il nome del buffer nel kill-ring quando premo shift-mouse-2 sul nome del buffer nella riga della modalità.

(defun copy-buffer-file-name (event &optional bufName)
  "Copy buffer file name to kill ring.
If no file is associated with buffer just get buffer name.
"
  (interactive "eP")
  (save-selected-window
    (message "bufName: %S" bufName)
    (select-window (posn-window (event-start event)))
    (let ((name (or (unless bufName (buffer-file-name)) (buffer-name))))
      (message "Saved file name \"%s\" in killring." name)
      (kill-new name)
      name)))

(define-key mode-line-buffer-identification-keymap [mode-line mouse-2] 'copy-buffer-file-name)
(define-key mode-line-buffer-identification-keymap [mode-line S-mouse-2] '(lambda (e) (interactive "e") (copy-buffer-file-name e 't)))

3

C-x C-d, richiamabile anche tramite M-x list-directory, ti mostrerà la directory per il tuo file corrente, e dovrai solo premere il tasto "Invio" per cancellare il minibuffer. Ulteriori dettagli sono disponibili qui .


la mia risposta preferita, semplice, veloce e facile!
ticktock

2

C-x C-b mostra un elenco di buffer e il percorso del file per ogni buffer, ove applicabile.


2

C-u C-x C-b elenca i buffer attualmente in visita ai file.


1

Posso copiare il nome del percorso negli appunti del sistema (OS), non nel kill ring in modo da poter utilizzare le informazioni con le altre app?

Puoi sborsare qualcosa come xclip (Linux), pbcopy (Mac), putclip (Cygwin).

Io personalmente uso script wrapper ce rispettivamente pper copia e incolla, la prima lettura dallo standard input, la seconda scrive sullo standard output. In questo modo, funziona su tutte le mie piattaforme di sviluppo:

(shell-command (format "echo '%s' | c" buffer-file-name))

Lo trovo più affidabile e configurabile rispetto all'utilizzo del supporto per appunti di Emacs. Ad esempio, il mio ccomando copia l'input in tutti e 3 gli appunti su Linux (principale, secondario, appunti), quindi posso incollare con Ctrl-V o clic centrale.


Questo dovrebbe funzionare ma non per me. (Ubuntu 14.04.1.) Vale a dire, date | xcliped xclip fileentrambi funzionano come pubblicizzato (memorizzando la data o il contenuto del file su primario) se digitati nella shell. Ma se digito uno di questi comandi dopo M-! in emacs (e premi Invio) non succede nulla; il cursore rimane nel minibuffer come se si aspettasse più input; e se interrompo per riprendere il controllo, niente è stato memorizzato nella primaria.
Silvio Levy

OK, la tua idea funziona bene con xsel invece di xclip: (shell-command (format "echo '%s' | xsel -i" buffer-file-name))- e quando trasformata in un comando interattivo (come suggerito nella risposta più votata da @JeromeRadix sopra), questa è una GRANDE VITTORIA! Grazie!
Silvio Levy

0

Il modo più semplice e sarebbe

(buffer-name)<(C-x)(C-e)> for the file name to appear in the echo area

(buffer-name)<(C-u)(C-x)(C-e)> would print the location <here>

Prendendo in prestito da Trey Jackson mi è venuto in mente questo:

(defun buffer-kill-path ()
  "copy buffer's full path to kill ring"
  (interactive)
  (kill-new (buffer-file-name)))

Puoi trovare maggiori informazioni su sito


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.