Vim elimina automáticamente la sangría en los comentarios de Python

Estoy usando Vim y editando scripts de Python.

Autoindent funciona bastante bien en general, pero cuando comienzo una nueva línea y escribo ‘#’ para escribir un comentario, Vim desactiva esa línea para mí.

Por ejemplo, si tiene

def foo(): 

y presiono enter, Vim sangrará correctamente

 def foo(): pass 

pero, si en lugar de escribir pass , escribo # , se desactiva automáticamente

 def foo(): # comment class Thing(): def __init__(self): pass # comment line gets unindented all the way 

Mi archivo .vimrc sigue. Alguien sabe por qué esto está pasando?

 set tabstop=4 set smartindent set shiftwidth=4 set expandtab set backspace=indent,eol,start set scrolloff=3 set statusline=%f%m%r%h%w\ [%Y\ %{&ff}]\ [%l/%L\ (%p%%)] set laststatus=2 

Poner smartindent en hace que Vim se comporte como me describiste, mientras que con nosmartindent (que es lo que tiendo a usar) se comporta como te gustaría.

Actualización: De los documentos en smartindent :

Al escribir ‘#’ como el primer carácter en una nueva línea, se elimina la sangría para esa línea, el ‘#’ se coloca en la primera columna. La sangría se restaura para la siguiente línea. Si no desea esto, use esta asignación: “: inoremap # X ^ H #”, donde ^ H se ingresa con CTRL-V CTRL-H. Cuando se usa el comando “>>”, las líneas que comienzan con ‘#’ no se desplazan a la derecha.

Eso parece ser eso.


Actualización: Probablemente no tenga que preocuparse por lo siguiente … Lo dejaré aquí por el valor informativo agregado. 😉

Si la configuración de nosmartindent no ayuda, quizás podría usar el comando :set , sin parámetros, para obtener la lista de todas las configuraciones vigentes en su sesión de Vim, luego pegarla en algún lugar (quizás en Pastie ). Hay algunas otras opciones que afectan la sangría automática, que yo recuerde.

Si bien la publicación de Michał explica lo que hace smartindent, puedes hacer mucho mejor que simplemente apagarlo. Puede configurarlo más a su gusto, o mejor aún, dejar que Vim elija una sangría mejor para usted. Con lo siguiente en su vimrc en lugar de otras configuraciones de sangría:

 filetype indent on 

Vim utilizará automáticamente el complemento de sangría adecuado para python. Esto es mucho mejor que no separar una línea #, casi todo debería estar correctamente sangrado.

Puedes probar una opción solo para archivos python:

 autocmd BufRead *.py inoremap # X# 

Por alguna razón desconocida, el comportamiento anterior fue causado cuando tenía cindent . Apagándolo lo arreglé para mí. Ninguna de las otras correcciones anteriores ayudó.

Si instala este script, obtendrá una sangría adecuada de python (pep8):

http://www.vim.org/scripts/script.php?script_id=974