2010-03-10 18 views
27

Jaki jest najprostszy sposób przesłania aktualnej pełnej nazwy pliku ze ścieżką do schowka?Ścieżka do pliku do schowka w Emacs

Używam teraz bufora komunikatów: kopiuję nazwę pliku, która pojawia się tam po zapisaniu pliku. Ale, przypuszczam, powinien być znacznie prostszy sposób.

Odpowiedz

18

Używam tego:

(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

Możesz to zrobić bez bufora tymczasowego, używając "kill-new": (let ((x-select-enable-schowek t)) (kill-nowa nazwa pliku)) – sanityinc

4

Jest buffer-extension - i to ma copy-buffer-file-name-as-kill funkcję. Pyta Cię nawet, co skopiować: imię, nazwisko lub nazwę katalogu.

Edit:

Używam zmodyfikowana wersja copy-buffer-file-name-as-kill z 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

W Emacs Prelude używam:

(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

Działa to również z "zwykłym" emacs. – lifeisfoo

+0

Polecenie 'prelude-copy-file-name-to-clipboard' nie jest już częścią Prelude. Jak sugeruje komunikat zatwierdzenia dla zatwierdzenia, które go usunęło, rozważ zamiast tego użycie pakietu "' easy-kill' "(https://github.com/leoliu/easy-kill). – ack

13

Jeśli chcesz napisać nazwę/ścieżkę bieżący bufor można wpisać C-u M-:, a następnie albo (buffer-file-name) - dla pełnej ścieżki - lub (buffer-name) dla nazwy bufora.

Czyli:

M-: + ellisp expression ocenia się ellisp wyraz w mini-buforze

C-u Zapisuje wyjście do bieżącego bufora

Nie dokładnie odpowiedzieć na to pytanie, ale może być przydatna, jeśli ktoś używać tej lub innej funkcji sporadycznie i woli nie inicjować funkcji przy każdym uruchomieniu.

+1

Aby właściwie odpowiedzieć na pytanie, można później użyć 'M-- C-M-k' (zabić ostatniego seksu). Domyślam się, że jest to trochę uciążliwe, ale może być użyte jako makro. – rsenna

4

w dystrybucji Spacemacs można nacisnąć Przestrzeńfy aby wyświetlić nazwę bufora w minibufora i skopiować go do ringu zabić.

Zaimplementowano z funkcją spacemacs/show-and-copy-buffer-filename (source).