2011-11-13 16 views
9

estoy ejecutando esta función (interactivo y en un gancho) para volver a formatear el código fuenteemacs save-excursion no restaurar el punto?

(defun a-style()                                               
    (interactive)                                               
    (save-excursion                                               
    (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t))) 

pero la Parada en excursión no parece funcionar, el punto salta siempre a 1 (el comando shell funciona sin embargo!) ¿Me estoy perdiendo algo obvio aquí?

Gracias, Mario

EDIT:

Así que finalmente hizo de la manera ingenua:

(defun a-style()                                               
    (interactive)                                               
    (setq temp-point (point))                                            
    (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t)                   
    (goto-char temp-point)) 

un poco estúpido, pero hace lo que yo quiero. Si alguien sabe de una solución mejor, estaría agradecido.

+2

¿Qué tal un formulario 'let' en lugar de' setq'? –

Respuesta

10

La documentación para shell-command-on-region dice en parte:

Si REPLACE, el quinto argumento opcional, es no-nil, eso significa insertar la salida en lugar del texto de principio a fin, punto y la marca poniendo alrededor de él.

Puesto que usted ha establecido para reemplazar a t, reemplaza todo el texto y pone punto y la marca alrededor de ella, y así ocurre con el punto a punto min. Además, creo que cuando se elimina el punto previamente guardado por save-excursion, Emacs realiza una copia de seguridad hasta el comienzo de la región eliminada, que de nuevo es punto-mínimo.

Creo que su solución está bien.

3

Sé que esta es una vieja pregunta, pero me encontré con este mismo problema. Aquí hay una macro simple que restaura el punto y el búfer:

(defmacro my-save-excursion (&rest forms) 
    `(let* (
    (oldp (point)) 
    (oldbuff (current-buffer)) 
    (retval (progn ,@forms)) 
    ) 

    (unless (eq (current-buffer) oldbuff) (switch-to-buffer oldbuff)) 
    (goto-char oldp) 
    retval 
    ) 
) 
Cuestiones relacionadas