¿Cómo obtener el nombre de archivo del búfer actual en emacs?


19

Una de las características principales que extraño de Vim es que siempre guarda el nombre del archivo actual en el %búfer ( más información ). Eso permite ejecutar comandos fácilmente como:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

Me gustaría tener una funcionalidad similar en emacs(versión 24, si eso hace alguna diferencia), es decir, tener una manera fácil de insertar el nombre del archivo abierto en el búfer actual.

Ejemplos de lo que quiero hacer.

Aquí describo algunos casos de uso básicos para explicar mejor cuando siento la necesidad de tal atajo

  1. Compilar: cuando entro en M-x compileemacs me pide un comando de compilación. Me gustaría entrar gcc (current-buffer)fácilmente.

  2. Cargar archivo: cuando estoy editando mi archivo .emacs, me gustaría cargarlo de inmediato para probar los cambios. La forma en que lo hago es M-x load-filey luego siempre deletreo el nombre . e m a c s. Me gustaría tener un atajo.

  3. Iniciar procesos externos: di du -shcomo ejemplo, solo para ilustrar que quiero que el acceso directo también esté disponible cuando ejecuto comandos de shell conM-!

Lo que encontré hasta ahora

  • Esta pregunta aquí en U&L. Las respuestas dadas básicamente muestran dónde encontrar el nombre de archivo de un búfer para poder agregarlo al anillo de eliminación. No es exactamente lo que estoy buscando, no quiero tener que eliminar manualmente el nombre de archivo antes de que quiera usarlo. (Además, las soluciones descritas en ambas respuestas no parecen funcionar tan bien en mis emacs y requieren pulsaciones de teclas adicionales, lo que las hace un poco molestas).

EDITAR : Un poco no relacionado, descubrí por qué estas soluciones no funcionan. Tengo IDO habilitado, para bien o para mal.

  • La (current-buffer)función descrita en el manual devuelve el nombre del archivo en el búfer actual, pero en ninguna parte de los ejemplos que di arriba, estoy evaluando el código elisp. ¿Hay alguna manera de insertar el resultado de la evaluación de esta función en un búfer (mini) y vincularlo así a un acceso directo?

¿Me equivoco al pensar de esta manera?

Actualmente estoy aprendiendo a usar emacs (han pasado unos meses en realidad) después de años de usar Vim. Quiero evitar una trampa predecible usando-emacs-in-a-Vim-way . Si siente que lo que estoy pidiendo no es muy emacs-y , y debería haber una mejor manera (¿más limpia?) De hacerlo, por favor mencione en sus respuestas.


Sobre el nombre del archivo, en .emacs, ingrese (global-set-key (kbd "C-i") buffer-file-name)si desea que sea Ctrl + I. Acerca de .emacs, M-x load-file REThace lo que quieres; No necesitas escribir nada.
Emanuel Berg, el

2
Este flujo de trabajo no encaja muy bien con Emacs, porque todas las indicaciones en la línea inferior de la ventana están en un búfer en Emacs (llamado minibúfer). Entonces, si corres (buffer-file-name)mientras escribes en el minibúfer, obtienes nil, porque (current-buffer)es el minibúfer. También puede cambiar los búferes mientras está en el minibúfer, por lo que es difícil hacer un seguimiento de qué búfer es lo que piensa del búfer actual para cuando el búfer actual, como lo ve Emacs, es el minibúfer.
Gilles 'SO- deja de ser malvado'

Respuestas:


11

Puede poner una función como sigue en sus .emacs y vincularla a cualquier tecla que desee.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

También vea esta pregunta , parece ser similar.


4

Una ligera variante en la respuesta de @ easyb es copiar la ruta a su anillo de eliminación en lugar de colocarlo en su búfer (útil para archivos de solo lectura):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.