Pregunta

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

  • ¿Hay una función para que?
  • Si no es así, ¿cuál sería la función elisp para conseguir eso?
  • ¿Cómo puedo copiar el resultado (nombre de ruta) de un portapapeles para que pueda volver a utilizarlo?

Estoy utilizando Mac OS X y Aqumacs.

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

AÑADIDO

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

La combinación de las dos respuestas que me dieron, me podría conseguir lo que quiero. Gracias por las respuestas. Y algunas preguntas más.

  • ¿Qué hay de (archivo-nombre verdadero)?
  • ¿Puedo copiar el nombre de ruta de Sistema (OS) 's portapapeles, no de recortes para que pueda utilizar la información con las otras aplicaciones?
¿Fue útil?

Solución

Es la incorporada en buffer-file-name función que proporciona la ruta completa del archivo.

Lo mejor que puede hacer es tener su ventana de emacs para mostrar siempre su sistema de nombre y la ruta completa de la memoria intermedia de la que se está editando:

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

También puede 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

Otros consejos

Para tomar prestado de la respuesta de Jérôme Radix, si lo que desea es ver rápidamente la ruta del archivo de la memoria intermedia actual, puede hacer M-: buffer-file-name.

Mi truco es hacer un C-x C-f como para abrir un archivo, Wil llenado previo del minibuff con la ruta del archivo actual, C-g a dejar de fumar. Más rápido que M-: buffer-file-name pero muy, muy feo que cualquier otro método.

La aplicación directa de lo que desea 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, creo que es increíblemente útil para poder obtener la ruta completa de lo que está en el minibúfer, y esto es lo que yo 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 quiero en el portapapeles, acabo de matar a la línea ( C-C-k ). Pero nos podría copiar el nombre verdadero en el portapapeles en el comando anterior, sólo cambia la última línea a 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 histórico de recortes.

No hay necesidad de función extra, simplemente

M-! pwd

Tengo el siguiente código ya está en uso por un largo tiempo. Se copia la ruta de acceso completa al anillo de corte cuando se presiona el botón central del ratón sobre el nombre del búfer en el modo en línea. Se copia sólo el nombre del búfer en el anillo de corte cuando se presiona shift-ratón-2 en el buffer-name en el modo en línea.

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

C-x C-d, también se puede llamar a través de M-x list-directory, le mostrará el directorio para el archivo actual, y que sólo tenga que pulsar la tecla "Enter" para borrar el minibúfer. Detalles adicionales están disponibles href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Directories.html" aquí .

  

¿Puedo copiar el nombre de ruta de Sistema (OS) 's portapapeles, no de recortes para que pueda utilizar la información con las otras aplicaciones?

Puede si bombardear a algo así como xclip (Linux), pbcopy (Mac), putclip (Cygwin).

Yo personalmente uso de scripts envoltura c y p para copiar y pegar, respectivamente, la primera lectura de la entrada estándar, este último escrito en la salida estándar. De esa manera, esto funciona en todos mis plataformas de desarrollo:

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

Me parece esto más fiable y configurable de utilizar el apoyo portapapeles Emacs. Por ejemplo, la palabra de mi c copia la entrada a los 3 portapapeles en Linux (primaria, secundaria, portapapeles), por lo que puedo pegar, ya sea con Ctrl-V o el botón central.

C-x C-b muestra una lista de los tampones y la ruta de archivo para cada memoria intermedia cuando sea aplicable.

Listas de C-u C-x C-b tampones actualmente visitando los archivos.

La forma más sencilla 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>

Los préstamos 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)))

Se puede encontrar más información sobre sitio

copy-buffer-file-name-as-kill de [0] hace exactamente lo que necesita, creo. También tiene la opción de copiar solo nombre de directorio o nombre de archivo solo.

[0] http://www.emacswiki.org/emacs/download /buffer-extension.el

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top