2008-12-09 21 views
46

Cuando agrego un # en modo insertar en una línea vacía en Vim mientras edito archivos python, vim mueve el # al comienzo de la línea, pero me gustaría que el # se inserte en el nivel de pestañas donde lo ingresé.Cómo configurar vim para no poner comentarios al comienzo de las líneas al editar archivos python

Por ejemplo, al escribir esto en vim

for i in range(10): 
    # 

el # no se queda ahí donde entré en ella.

Se mueve así, por vim.

for i in range(10): 
# 

¿Alguien sabe de un elemento de configuración en vim que podría cambiar esto?

Si ayuda, estoy usando Ubuntu 8.10.

+0

Ver también: http://stackoverflow.com/questions/191201/indenting-comments-to-match-code-in-vim – Dan

Respuesta

31

He encontrado una respuesta aquí http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash

Parece que la opción smartindent vim es la causa del problema. La página de referencia anterior describe work-a-rounds pero después de leer la ayuda en smartindent en vim (: help smartindent), decidí probar cindent en lugar de smartindent.

que sustituyen

set smartindent 

con

set cindent 

en mi archivo .vimrc

y hasta ahora está funcionando perfectamente.

Esto también ha cambiado el comportamiento de '< <' y '>>' para sangrar bloques visuales que incluyen comentarios de pitón.

Hay más opciones de configuración e información sobre la sangría en la ayuda de vim para smartindent y cindent (: help smartindent y: help cindent).

+2

Ah, tengo "sangría de complemento de tipo de archivo" en mi .vimrc, tal vez sea responsable de que funcione correctamente para mí. http://vimdoc.sourceforge.net/htmldoc/filetype.html – m0j0

+0

Me salvó el día. +1! :) –

+0

¿hay alguna configuración de configuración recomendada/común para 'cindent'? –

1

La configuración de Mi Vim no hace eso. Usted puede tratar el guión python.vim disponible desde este enlace: http://www.vim.org/scripts/script.php?script_id=790

+0

Desafortunadamente, eso no funcionó en mi caso, el problema persiste durante el uso. Utilicé la versión 2.6.3 porque aún no me he actualizado a Python 3.0. Quizás el problema esté en el archivo /usr/share/vim/vim71/indent/python.vim instalado desde el paquete Ubuntu vim-runtime? –

2

Es causado por la función 'smartindent'. Si tiene :set smartindent en su .vimrc, necesita eliminarlo.

9

Tengo las siguientes líneas en mi .vimrc, parece estar instalado por defecto con mi Ubuntu 8,10

set smartindent 
inoremap # X^H# 
set autoindent 

Y yo no observan el problema. Tal vez puedas probar esto. (Tenga en cuenta que^H debe ingresarse mediante Ctrl-V Ctrl-H)

19

@PolyThinker Aunque veo esa respuesta a esta pregunta, en mi opinión, no es una buena solución. El editor todavía piensa que debe estar sangrado todo el camino hacia la izquierda; verifique esto presionando == en una línea que comience con un hash, o presionando = mientras que un bloque de código con comentarios en él se resaltará para reiniciar.

no te recomiendo filetype indent on, y quitar los set smartindent y set autoindent (o set cindent) líneas de su vimrc. Alguien más (al parecer, David Bustos) tuvo la amabilidad de escribir un analizador de sangría completo para nosotros; está ubicado en $ VIMDIRECTORY/indent/python.vim.

(solución de Pablo cindent probablemente funciona para Python, pero filetype indent on es mucho más útil en general.)

+0

Gracias - esto me ayudó. Tuve un problema, y ​​es que estaba intentando "filetype indent on" dentro de gvim (MacVim) y no vi ningún cambio de comportamiento. Una vez que comencé a probarlo agregándolo a .vimrc, luego reiniciando, vi un cambio de comportamiento. – finity

+0

Mismo problema, soluciones aceptadas (y permutaciones), colocado 'filetye indent on' al final de .vimrc, y ahora # comment'ing python no de/outdent. Pero ahora la cosa es autoindependiente para mí. Suspiro. – ChuckCottrill

+0

Desactivar smartindent no funciona para mí (en ubuntu vim y osx mac-vim). Al agregar "filetype indent on" a mi $ HOME/.vimrc y al reiniciar [g] vim, resuelvo mi problema (tanto en la edición del script de python como de bash). –

4

Mi solución a la ausencia lo de #:

Si utiliza cindent, reconocer que está diseñado para C y codificación C++. Aquí, un # significa que está creando un #DEFINE o #MACRO(), por lo que el comportamiento es correcto. Pero para otros idiomas donde # es un comentario, es irritante.

A continuación trabajó para mí:

" cindent  enable specific indenting for C code 
" set cin  nocin 
set cin 

" cinkeys  The default cinkeys causes leading # to unindent to column 0. 
"    To prevent this, remove the 0# from the definition. 
" set cinkeys=0{,0},0),:,0#,!^F,o,O,e - default 
set cinkeys=0{,0},0),:,!^F,o,O,e 
0

quité set smartindent de ~/.vimrc pero todavía no se ha desactivado smartindent. Cuando abrí un archivo .py y ejecuté :set smartindent?, se muestra smartindent.

Resulta que más abajo en el ~/.vimrc era esta línea:

autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class 
         ^^^^^^^^^^^ 

Una vez que he eliminado "smartindent" de esa línea, entonces smartindent finalmente fue desactivado y mis comentarios fueron sangría correctamente de nuevo.

2

Algunas de las otras respuestas fueron útiles, pero ninguna fue suficiente para evitar que Vim vuelva a enardecer una línea cuando '#' es el primer caracter. La respuesta de PolyThinker no funcionó para mí, pero dio una pista de que '#' podía ser reasignado para "insertar un carácter, luego #, luego eliminar el carácter adicional y poner el cursor donde debería estar". Esto es la asociación que hace que:

inoremap # X#<left><backspace><right> 

Esto es necesario porque los paquetes de sintaxis de vim parecen tratar '#' como un carácter especial, no importa cómo se establecen las opciones. Quiero que una línea comenzada con '#' sea la misma que una línea comenzada con cualquier otro personaje. La solución más confiable que he encontrado es la asignación anterior, que realmente cambia el primer carácter de la línea.

Nota: He encontrado que esta asignación causa problemas después de ejecutar I#<esc> y luego presionar "." para rehacer la inserción anterior. No he encontrado una solución todavía.

Cuestiones relacionadas