2010-03-10 16 views
27

Qual è il modo più semplice per inviare il nome file completo corrente con il percorso del file negli appunti?Percorso file negli appunti in Emacs

Quello che sto usando ora è buffer di messaggi: copio il nome del file che appare lì dopo aver salvato un file. Ma, suppongo, ci dovrebbe essere un modo molto più semplice.

risposta

18

usa questo:

(defun my-put-file-name-on-clipboard() 
    "Put the current file name on the clipboard" 
    (interactive) 
    (let ((filename (if (equal major-mode 'dired-mode) 
         default-directory 
        (buffer-file-name)))) 
    (when filename 
     (with-temp-buffer 
     (insert filename) 
     (clipboard-kill-region (point-min) (point-max))) 
     (message filename)))) 
+3

È possibile farlo senza il buffer temporaneo, l'utilizzo di "kill-new": (let ((x-select-enable-clipboard t)) (kill-nuovo nome del file)) – sanityinc

4

C'è un buffer-extension - e ha copy-buffer-file-name-as-kill funzione. Ti chiede anche cosa copiare: nome, nome completo o nome di una directory.

Edit:

Io uso versione modificata di copy-buffer-file-name-as-kill da buffer-extension.el:

(defun copy-buffer-file-name-as-kill (choice) 
    "Copyies the buffer {name/mode}, file {name/full path/directory} to the kill-ring." 
    (interactive "cCopy (b) buffer name, (m) buffer major mode, (f) full buffer-file path, (d) buffer-file directory, (n) buffer-file basename") 
    (let ((new-kill-string) 
     (name (if (eq major-mode 'dired-mode) 
        (dired-get-filename) 
       (or (buffer-file-name) "")))) 
    (cond ((eq choice ?f) 
      (setq new-kill-string name)) 
      ((eq choice ?d) 
      (setq new-kill-string (file-name-directory name))) 
      ((eq choice ?n) 
      (setq new-kill-string (file-name-nondirectory name))) 
      ((eq choice ?b) 
      (setq new-kill-string (buffer-name))) 
      ((eq choice ?m) 
      (setq new-kill-string (format "%s" major-mode))) 
      (t (message "Quit"))) 
    (when new-kill-string 
     (message "%s copied" new-kill-string) 
     (kill-new new-kill-string)))) 
21

In Emacs Prelude io uso:

(defun prelude-copy-file-name-to-clipboard() 
    "Copy the current buffer file name to the clipboard." 
    (interactive) 
    (let ((filename (if (equal major-mode 'dired-mode) 
         default-directory 
        (buffer-file-name)))) 
    (when filename 
     (kill-new filename) 
     (message "Copied buffer file name '%s' to the clipboard." filename)))) 
+1

questo funziona anche con 'normale' emacs. – lifeisfoo

+0

Il comando 'prelude-copy-file-name-to-clipboard' non fa più parte di Prelude. Come suggerito dal messaggio di commit per il commit che lo ha rimosso, considera invece l'uso del pacchetto ['easy-kill'] (https://github.com/leoliu/easy-kill). – ack

13

Se si vuole scrivere il nome/percorso di il buffer corrente è possibile digitare C-u M-: e quindi o (buffer-file-name) - per il percorso completo - o (buffer-name) per il nome del buffer.

Cioè:

M-: + ellisp expression valuta un'espressione ellisp nel mini-buffer

C-u scrivere l'output nel buffer corrente

Non esattamente rispondere alla domanda, ma potrebbe essere utile se qualcuno utilizzare questa o altre funzioni sporadicamente e preferisce non inizializzare la funzione ad ogni avvio.

+1

Per rispondere correttamente alla domanda si può usare 'M-- C-M-k' dopo (uccidere l'ultimo sexp). Indovina che è un po 'macchinoso, ma potrebbe essere usato come una macro. – rsenna

4

Nella distribuzione Spacemacs, è possibile premere Spaziofy per visualizzare il nome del buffer nel minibuffer e copiarlo nella kill ring.

Implementato con la funzione spacemacs/show-and-copy-buffer-filename (source).