2011-01-15 12 views
6

Quiero establecer una clave en emacs para realizar un comando de shell en el archivo en el búfer, y revertir el búfer sin preguntar. El comando shell es: p4 edit 'currentfilename.ext'elisp: comando de llamada en el archivo actual

(global-set-key [\C-E] (funcall 'revert-buffer 1 1 1)) 
;; my attempt above to call revert-buffer with a non-nil 
;; argument (ignoring the shell command for now) -- get an init error: 
;; Error in init file: error: "Buffer does not seem to be associated with any file" 

completamente nuevo para elisp. Desde el emacs manual, aquí es la definición de revert-buffer:

Command: revert-buffer &optional ignore-auto noconfirm preserve-modes 

Gracias!

+0

¿Desea revertir el búfer porque ya ha sido editado, o porque el comando shell corta el contenido del búfer? – zwol

+0

Porque cambia el búfer para escribir en lugar de solo lectura, y lo agrega al control de versión. – ash

Respuesta

5

El error real que está viendo se debe a que ha especificado incorrectamente la clave-conjunto-global, es decir, la llamada a la función. Lo que queremos es:

(global-set-key (kbd "C-S-e") '(lambda() (revert-buffer t t t))) 

usted tenía la funcall realidad cuando la evaluación de su .emacs estaba cargando, que es la causa del error.

Entonces, para obtener toda la cosa, puede crear un comando como:

(defun call-something-on-current-buffers-file() 
    "run a command on the current file and revert the buffer" 
    (interactive) 
    (shell-command 
    (format "/home/tjackson/bin/dummy.sh %s" 
     (shell-quote-argument (buffer-file-name)))) 
    (revert-buffer t t t)) 
(global-set-key (kbd "C-S-e") 'call-something-on-current-buffers-file) 

Obviamente personalizar el mando, y añadir la comprobación de errores, si quieres.

+1

Necesita citar el nombre de archivo para el shell de alguna manera ... 'comint-quote-filename' * se ve * como si fuera el trabajo, pero lamentablemente solo lo hace si ya está en un buffer de caparazón. Eso es lo que tengo. – zwol

+0

@Zack llamada 'comint-quote-filename' agregada. –

+0

Gracias por la respuesta. Obtengo: 'La definición de función del símbolo es nula: comint-quote-filename'. Lo reemplacé con 'shell-quote-argument' y funcionó muy bien. Nota al margen: el manual de emacs establece: "Teclas para evitar: [Ctrl] + [Shift] + [letra]. En terminales de texto, no puede distinguir versiones desplazadas y no desplazadas de dicha combinación. Funciona bien si siempre usa emacs en una GUI ambiente." Así que lo cambié a y reconocí la clave. – ash

0

Quizás utilizando el modo secundario "auto-revert-mode" es una opción. Sólo tiene que activar en el búfer en:

M-x "auto-revert-mode" 

y compruebe siempre que la memoria intermedia se guarda, antes de ejecutar un comando externo.

+0

Esto es bueno, pero el tiempo predeterminado de auto-revert-mode es de 5 segundos (muy lento). Luego, si lo cambiara a 1 segundo, verificaría cada buffer por segundo, lo cual es innecesario. – ash

Cuestiones relacionadas