2010-08-27 12 views
8

En cperl modo de emacs, líneas que continute una declaración de una línea anterior se sangran por un nivel:¿Cómo puedo hacer que emacs 'cperl-mode sangre todas las continuación de instrucciones en un solo nivel?

my $var 
    = (1+1) 
    * (2+2) 
/(3+3); 

Sin embargo, si la declaración no comienza en cero muesca porque está dentro de un bloque, a continuación, si se rompe su estado de cuenta en una tercera línea, se obtiene otra nivel de sangría, y así sucesivamente:

sub break_my_indentation { 
    my $var 
    = (1+1) 
     * (2+2) 
     /(3+3); 
    return "Indentation is broken."; 
} 

¿hay alguna forma de solucionar este problema por lo que los estados están sangrados de la misma manera dentro de los bloques, ya que son ¿fuera de? Me gustaría que el segundo ejemplo a tener este aspecto:

sub fix_my_indentation { 
    my $var 
    = (1+1) 
    * (2+2) 
    /(3+3); 
    return "Indentation is fixed."; 
} 
+0

Gracias por impulsar esta pregunta, @Schwern. Todavía estoy interesado en encontrar una respuesta para eso. –

+0

Por lo que vale, también he visto este problema en otros modos, donde la sangría de continuación de línea funciona correctamente solo cuando la línea comienza en la columna cero. –

Respuesta

6

confirmo que el comportamiento que describes está presente, pero, a partir de la lectura de las fuentes y en funcionamiento en el depurador, no es obvio que hay una personalizaciónque recibe tú el comportamiento que tú (y yo) queremos.

Por lo tanto, creo que esto es un error en cperl-mode.

La solución es:

=== modified file 'lisp/progmodes/cperl-mode.el' 
--- lisp/progmodes/cperl-mode.el 2012-12-01 05:09:12 +0000 
+++ lisp/progmodes/cperl-mode.el 2012-12-26 16:29:19 +0000 
@@ -3120,7 +3121,9 @@ and closing parentheses and brackets." 
    ((eq 'continuation (elt i 0)) 
     ;; [continuation statement-start char-after is-block is-brace] 
     (goto-char (elt i 1))  ; statement-start 
-  (+ (if (memq (elt i 2) (append "}])" nil)) ; char-after 
+  (+ (if (or (memq (elt i 2) (append "}])" nil)) ; char-after 
+      (eq 'continuation ; do not repeat cperl-close-paren-offset 
+       (elt (cperl-sniff-for-indent parse-data) 0))) 
     0   ; Closing parenth 
      cperl-continued-statement-offset) 
     (if (or (elt i 3)  ; is-block 

Por favor, prueba este parche; si está satisfecho con él, agregaré una personalización para habilitarlo.

+0

Esto parece solucionar el error. ¡Gracias! –

+0

Puedo confirmar que lo soluciona, gracias! Voy a presionarlo hacia arriba para [cperl-mode] (https://github.com/jrockway/cperl-mode). – Schwern

+0

Lo he enviado [en cadena] (https://github.com/jrockway/cperl-mode/pull/12). – Schwern

1

cperl-mode no tienen este problema de forma predeterminada. Por defecto, los guiones de esta manera:

my $var 
    = (1+1) 
    * (2+2) 
/(3+3); 

Tienes una personalización que evita cperl-mode para sangrar correctamente. Ver cperl-indent-rules-alist variable para la configuración del sangrado.

+0

Hmm. Si la instrucción comienza en el nivel de indentación cero, funciona como dices. Sin embargo, si la declaración comienza dentro de un bloque o algo, entonces hace lo que digo.Actualizaré la pregunta. –

0

Como @ jerome-radix sugiere, el problema que está experimentando no ocurre con cperl-mode de manera predeterminada. El problema podría ciertamente por cperl-indent-rules-alist, pero hay una serie de otros lugares para buscar.

¿Qué versión del modo está utilizando? C-h v cperl-version RET

Al depurar este tipo de preguntas, debe comenzar con un par de cosas básicas para ver si puede reproducir el error. Primero deje que todos sepan qué M-x emacs-versión que está ejecutando. A continuación, eliminar sus propias personalizaciones de la ecuación mediante la ejecución de emacs -q para evitar cargar el fichero init en el arranque:

--no-init-file, -q   load neither ~/.emacs nor default.el 

Si todavía puede reproducir el problema con su propio archivo de inicio apagado, y luego ir un paso más allá y convertirlo bajar en el nivel de sistema con emacs -Q:

--quick, -Q     equivalent to: 
           -q --no-site-file --no-site-lisp --no-splash 
+0

Tienes que ponerlo en bloques para ver el problema. – Schwern

+0

Sí, puse sus bloques copiados literalmente y no experimento el problema. De hecho, cuando lo ingreso a mano con la sangría incorrecta y luego ejecuto 'indent-region' reinicia todo correctamente, por lo que le sugerí que proporcione más detalles sobre su configuración, ya que otros, incluido yo mismo, no podemos reproducir el problema. – aculich

+0

Pensé que probé esto con emacs -Q y todavía tenía el problema, pero eso fue hace varios años, así que repetiré el experimento cuando tenga la oportunidad. –

Cuestiones relacionadas