Necesito obtener la ruta completa del archivo que estoy editando con emacs.
- ¿Hay alguna función para eso?
- Si no es así, ¿cuál sería la función elisp para conseguirlo?
- ¿Cómo puedo copiar el resultado (nombre de la ruta) en 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 () "Muestra el nombre del archivo de ruta completo en el minibúfer". (interactivo) (mensaje (nombre-archivo-búfer)) (kill-new (file-truename búfer-nombre-archivo)) ) (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.
- ¿Para qué sirve (file-truename)?
- ¿Puedo copiar el nombre de la ruta en el portapapeles del sistema (SO), no en el kill ring, para poder usar la información con las otras aplicaciones?
buffer-file-name
es una variableM-x
?funcall
para llamar a una función que se almacena como el valor de una variablefoo
, porque si lo usa(foo)
, estaría usando la ranura de función de enfoo
lugar de la ranura de valor.Para tomar prestado de la respuesta de Jérôme Radix, si solo desea ver rápidamente la ruta del archivo del búfer actual, puede hacerlo
M-: buffer-file-name
.Alternativamente, escriba
(buffer-file-name)
en el búfer en algún lugar y ejecuteC-x C-e
el paréntesis de cierre (esto funcionará en cualquier modo, no solo en modo lisp).fuente
buffer-file-name
como una función, pero no apareceM-x
, pero apareceM-:
comoemacs eval
, allí puedo ejecutar el comando, gracias a su respuesta :)M-x
solo ejecuta funciones interactivas, mientras queM-:
ejecuta cualquier función elisp.Mi truco es hacer un me
C-x C-f
gusta para abrir un archivo, rellenará previamente el minibuff con la ruta del archivo actual,C-g
para salir. Más rápido queM-: buffer-file-name
cualquier otro método, pero mucho más feo.fuente
La implementación directa de lo que desea es:
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:
Y luego, si lo quiero en el portapapeles, simplemente mato la línea ( C-a C-k). Pero podríamos copiar fácilmente el nombre verdadero al portapapeles en el comando anterior, simplemente cambie la última línea para que sea:
La parte nueva es la llamada a la
'kill-new
que pone la cadena en el anillo de muerte.fuente
No se necesitan funciones adicionales, solo
fuente
C-x C-f
, ejecutándoloM-! pwd
, luegoM-x cd
seleccionando un directorio diferente y luego ejecutándoloM-! pwd
nuevamente.Tengo el siguiente código ya en uso durante mucho tiempo. Copia la ruta completa del archivo al kill ring cuando presiono el botón central del mouse en el nombre del búfer en la línea de modo. Copia solo el nombre del búfer en el kill-ring cuando presiono shift-mouse-2 en el nombre del búfer en la línea de modo.
fuente
C-x C-d
, también invocable medianteM-x list-directory
, le mostrará el directorio de su archivo actual, y solo necesita presionar la tecla "Enter" para borrar el minibúfer. Detalles adicionales están disponibles aquí .fuente
C-x C-b
muestra una lista de búferes y la ruta del archivo para cada búfer cuando corresponda.fuente
C-u C-x C-b
enumera los búferes que actualmente visitan los archivos.fuente
Puede hacerlo si utiliza algo como xclip (Linux), pbcopy (Mac), putclip (Cygwin).
Yo personalmente uso scripts de envoltura
c
yp
para copiar y pegar respectivamente, la primera lectura de la entrada estándar, la última escritura en la salida estándar. De esa manera, esto funciona en todas mis plataformas de desarrollo:Encuentro esto más confiable y configurable que usar el soporte del portapapeles de Emacs. Por ejemplo, mi
c
comando copia la entrada a los 3 portapapeles en Linux (primario, secundario, portapapeles), por lo que puedo pegar con Ctrl-V o con un clic central.fuente
date | xclip
yxclip file
ambos funcionan como se anuncia (almacenando la fecha o el contenido del archivo en primario) si se escribe en el shell. Pero si escribo cualquiera de estos comandos después de M-! en emacs (y presione regresar) no pasa nada; el cursor permanece en el minibúfer como si esperara más entrada; y si interrumpo para recuperar el control, no se ha almacenado nada en el primario.(shell-command (format "echo '%s' | xsel -i" buffer-file-name))
- y cuando se convierte en un comando interactivo (como se sugiere en la respuesta más votada por @JeromeRadix arriba), ¡esta es una GRAN GANANCIA! ¡Gracias!La forma más sencilla y sería
Tomando prestado de Trey Jackson, se me ocurrió esto:
Puede encontrar más información en el sitio.
fuente
copy-buffer-file-name-as-kill
de [0] hace exactamente lo que necesitas, creo. También tiene la opción de copiar solo el nombre del directorio o solo el nombre del archivo.[0] http://www.emacswiki.org/emacs/download/buffer-extension.el
fuente