2011-02-23 7 views
13

He estado usando emacs 23 (python.el) durante poco más de un mes y no estoy satisfecho con la configuración predeterminada de auto-sangría.emacs 23 python.el estilo de autoguiado: ¿se puede configurar?

Actualmente, mis archivos de Python se-sangría automática de la siguiente manera:

x = a_function_with_dict_parameter({ 
            'test' : 'Here is a value', 
            'second' : 'Another value', 
            }) 
a_function_with_multiline_parameters(on='First', line='Line', 
            now_on='Second', next_line='Line', 
            next='Third', finally='Line') 

yo preferiría si pudiera establecer la configuración automática de sangría por lo que el mismo código podría fácilmente ser formateado:

x = a_function_with_dict_parameter({ 
    'test' : 'Here is a value', 
    'second' : 'Another value', 
}) 
a_function_with_multiline_parameters(on='First', line='Line', 
    now_on='Second', next_line='Line', next='Third', finally='Line') 

Parece que la lógica de cómo me gustaría que la sangría automática funcione es:

Si el último carácter (sin comentario/espacio en blanco) de la línea anterior es a, aumente t él sangra el nivel por 1. De lo contrario, use el mismo nivel de sangría.

Pero usando esa lógica, TAB necesitaría realmente aumentar el nivel de sangría de la línea actual. (Actualmente, TAB solo mueve la línea al nivel de sangría automática)

¿Alguien sabe cómo puedo modificar la autodentación de emacs para lograr el estilo deseado?

Respuesta

1

Pruebe con la última versión de fgallina python.el. Contiene muchos otros improvements.

Uso esta versión y TAB tiene el comportamiento que desea, pero hice varias modificaciones a python.el, por lo que no puedo estar seguro de que obtendrá el mismo comportamiento. Si es así, házmelo saber.

+0

Desafortunadamente, esto no funciona del todo como lo describí. Después de sangría automática, presionar continuamente '' TAB'' hace que la línea se desplace por niveles de sangría negativos (hacia el margen). Además, si manipulo manualmente un nivel de sangría, las líneas subsiguientes no permanecen en el mismo nivel. La buena noticia es que puedo revisar la fuente de python.el y ver si puedo descubrir cómo funcionan las cosas y, posiblemente, averiguar cómo modificarlo yo mismo. – brildum

-1

Mx-personalizar grupo RET RET pitón

3

Usted puede tratar de esta paz de código:

(require 'python) 

; indentation 
(defadvice python-calculate-indentation (around outdent-closing-brackets) 
    "Handle lines beginning with a closing bracket and indent them so that 
    they line up with the line containing the corresponding opening bracket." 
(save-excursion 
    (beginning-of-line) 
    (let ((syntax (syntax-ppss))) 
    (if (and (not (eq 'string (syntax-ppss-context syntax))) 
      (python-continuation-line-p) 
      (cadr syntax) 
      (skip-syntax-forward "-") 
      (looking-at "\\s)")) 
     (progn 
      (forward-char 1) 
      (ignore-errors (backward-sexp)) 
      (setq ad-return-value (current-indentation))) 
     ad-do-it)))) 

(ad-activate 'python-calculate-indentation) 

Ahora, un simple dict pitón de esta manera:

a = {'foo': 'bar', 
    'foobar': 'barfoo' 
    } 

se convierte en ..

a = {'foo': 'bar', 
    'foobar': 'barfoo' 
} 
+0

¿Podría esta pregunta tener una actualización para emacs 24? La función 'python-calculate-indentation' ya no existe, la sustitución más cercana parece ser' python-indent-calculate-indentation', pero la semántica de cómo funciona esta función parece haber cambiado. – barik

Cuestiones relacionadas