2010-03-10 25 views
27

¿Cuál es la forma más sencilla de enviar el nombre completo actual del archivo con la ruta del archivo al portapapeles?Ruta del archivo al portapapeles en Emacs

Lo que estoy usando ahora es el búfer de mensajes: Copio el nombre del archivo que aparece allí después de guardar un archivo. Pero, supongo, debería haber una forma mucho más simple.

Respuesta

18

Puedo usar este:

(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

Usted puede hacer eso sin el buffer temporal, el uso de "matar-nueva": (let ((x-select-enable-portapapeles t)) (kill-nuevo nombre de archivo)) – sanityinc

4

Hay una buffer-extension - y tiene copy-buffer-file-name-as-kill función. Incluso le pregunta qué copiar: nombre, nombre completo o nombre de un directorio.

Editar:

Yo uso una versión modificada de copy-buffer-file-name-as-kill de 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

En Emacs Prelude que utilizo:

(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

Esto también funciona con 'normal' emacs. – lifeisfoo

+0

El comando 'prelude-copy-file-name-to-clipboard' ya no forma parte de Prelude. Tal como lo sugiere el mensaje de confirmación para la confirmación que lo eliminó, considere usar el paquete ['easy-kill'] (https://github.com/leoliu/easy-kill) en su lugar. – ack

13

Si desea escribir el nombre/ruta de el búfer actual puede escribir C-u M-: y luego (buffer-file-name) - para la ruta completa - o (buffer-name) para el nombre del búfer.

Eso es:

M-: + ellisp expression evalúa una expresión ellisp en el mini-buffer

C-u escribir el resultado en el búfer en

No responde exactamente a la pregunta, pero podría ser útil si alguien use esta u otra función esporádicamente, y prefiere no inicializar la función en cada inicio.

+1

Para responder correctamente a la pregunta, uno podría usar 'M-- C-M-k' después (matar el último sexp). Supongo que es un poco engorroso, pero podría usarse como una macro. – rsenna

4

En la distribución Spacemacs, puede pulsar espaciofy para visualizar el nombre del búfer en el minibúfer y copiarlo en el histórico de recortes.

Implementado con la función spacemacs/show-and-copy-buffer-filename (source).