emacs elisp clipboard aquamacs

emacs - La función para mostrar la ruta completa del archivo actual en mini buffer



elisp clipboard (11)

Necesito obtener la ruta completa del archivo que estoy editando con emacs.

  • ¿Hay una función para eso?
  • Si no, ¿cuál sería la función elisp para obtener eso?
  • ¿Cómo puedo copiar el resultado (nombre de ruta) a un portapapeles para poder reutilizarlo?

Estoy usando Mac OS X y Aqumacs.

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

ADICIONAL

(defun show-file-name () "Show the full path file name in the minibuffer." (interactive) (message (buffer-file-name)) (kill-new (file-truename buffer-file-name)) ) (global-set-key "/C-cz" ''show-file-name)

Combinando las dos respuestas que obtuve, podría obtener lo que quiero. Gracias por las respuestas. Y algunas preguntas más

  • ¿Qué hay para (file-truename)?
  • ¿Puedo copiar el nombre de ruta al portapapeles del Sistema (SO), no el anillo de la muerte para que pueda usar la información con las otras aplicaciones?

¿Puedo copiar el nombre de ruta al portapapeles del Sistema (SO), no el anillo de la muerte para que pueda usar la información con las otras aplicaciones?

Puedes hacerlo si compras algo como xclip (Linux), pbcopy (Mac), putclip (Cygwin).

Personalmente, utilizo los scripts de envoltura c y p para copiar y pegar, respectivamente, la primera lectura de la entrada estándar y la última para la salida estándar. De esta forma, esto funciona en todas mis plataformas de desarrollo:

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

Encuentro esto más confiable y configurable que usando el soporte del portapapeles de Emacs. Por ejemplo, mi comando c copia la entrada a los 3 portapapeles en Linux (primario, secundario, portapapeles), de modo que puedo pegar con Ctrl-V o medio clic.


Es la función incorporada buffer-file-name que le proporciona la ruta completa de su archivo.

Lo mejor que puede hacer es tener su ventana de emacs para mostrar siempre su nombre de sistema y la ruta completa del búfer que está editando actualmente:

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

También puedes hacer algo como esto:

(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


La forma más simple y sería

(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>

Tomando prestado de Trey Jackson, se me ocurrió esto:

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

Puede encontrar más información en el site


La implementación directa de lo que quiere es:

(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))))

Dicho esto, me parece increíblemente útil poder obtener la ruta completa de lo que hay en el minibúfer, y esto es lo que 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))))

Y luego, si lo quiero en el portapapeles, simplemente mato la línea ( Ca Ck ). Pero podríamos copiar fácilmente el nombre verdadero en el portapapeles en el comando anterior, simplemente cambie la última línea para ser:

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

La parte nueva es la llamada a ''kill-new que pone la cadena en el anillo de matar.


Mi truco es hacer un Cx Cf como para abrir un archivo, va a rellenar el minibuff con la ruta del archivo actual, Cg para salir. Más rápido que M-: buffer-file-name pero mucho más feo que cualquier otro método.


No necesita funciones adicionales, solo

M-! pwd


Para tomar prestada la respuesta de Jérôme Radix, si solo quiere ver rápidamente la ruta del archivo del búfer actual, puede hacer M-: buffer-file-name .


Tengo el siguiente código en uso desde hace mucho tiempo. Copia la ruta completa del archivo al kill ring cuando presiono el botón central del mouse sobre el nombre del buffer en la línea de modo. Copia solo el nombre del buffer en el kill-ring cuando presiono shift-mouse-2 en el nombre-buffer en la línea de modo.

(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)))


Cx Cb muestra una lista de búferes y la ruta del archivo para cada búfer donde corresponda.


Cx Cd , también invocable a través de Mx list-directory , le mostrará el directorio para su archivo actual, y solo necesita presionar la tecla "Enter" para borrar el minibúfer. Detalles adicionales están disponibles here .