2008-12-22 8 views
24

Recientemente comencé a usar vim 7 (anteriormente vim 6) y la configuración smartindent. En su mayor parte, funciona bien, aunque estoy tan acostumbrado a escribir una pestaña después de un corchete abierto que es casi contraproducente.¿Qué configuración en vim contrarresta la negativa de smartindent a sangrar # comentarios en los guiones del intérprete de comandos?

Sin embargo, hay un comportamiento maníaco. Al editar un script de shell, intento crear un comentario en el nivel de sangría actual, pero smartindent no tendrá nada que ver con eso. Insiste en que el comentario debe estar en el nivel 0 (sin sangría). Lo que es peor, rompe shift-right ('>>' y amigos) para que no funcionen. Esto es pura insubordinación, y me gustaría saber cuál es la mejor manera de solucionarlo.

(tampoco estoy interesado en las ideas smartindent 's sobre sangría then después if.)

soluciones preferidas me salvará ataques Manual - estoy siendo perezoso. Una opción sería 'desactivar smartindent cuando edite scripts de shell (déjelo activado para el resto)'. Otra opción serían las pautas sobre cómo encontrar el script de control para smartindent y qué editar para cambiar las características que no me gustan. La última opción (que no necesito consejos sobre cómo hacerlo, solo la sugerencia de que es la mejor, o la única, forma de restablecer la cordura) es dejar smartindent desarmado.

Vi la pregunta vagamente relacionada en "(PHP and) annoying vim unindent rules"; no me proporciona la respuesta directa, aunque tal vez el cindent y los artículos relacionados mencionados allí son, de hecho, parte de la respuesta.

+1

Gran respuesta aquí: http://stackoverflow.com/questions/191201/indenting-comments-to-match-code-in-vim – Dan

Respuesta

9

encontrar el archivo de guión, (por ejemplo /usr/share/vim/vim71/indent/sh.vim en mi sistema)

Esta línea se ve como el problema:

 
setlocal indentkeys-=:,0# 

Tal vez usted puede Arregle esto en su .vimrc o cargue un archivo de sangría personalizado manualmente.

editar: Parece más complicado de lo que pensaba, pero tal vez haya algo específicamente establecido en el archivo de sangrado que necesitaría corregir.

segunda edición: Parece que yo estaba completamente equivocado, Salida:

Restoring indent after typing hash

o

howto-configure-vim-to-not-put-comments-at-the-beginning-of-lines-while-editing

+0

buenos indicadores en la dirección correcta. Hay un LÉAME.archivo txt que también proporciona algunos punteros, especialmente a ': help indent-expression', que a su vez apunta a 30.3 del manual en línea. Pero ese archivo es el que tengo que piratear, eliminar o modificar, revocar o reemplazar. ¡Gracias! –

+0

Heh ... descubrió que smartindent pone # al comienzo para las directivas del preprocesador C. Probablemente voy a cancelar las reglas de shell por completo creando ~/.vim/indent/sh.vim que contenga ': let b: did_indent = 1'. Voy a perseguir los enlaces que agregaste con la segunda edición, también. –

3

Bueno, después de explorar algunas opciones, incluyendo el uso de ':set cindent' en lugar de ':set smartindent', he terminado volviendo a usar ':set autoindent'. Probablemente haya formas de hacer que esto funcione exactamente como yo quiero, pero es lo suficientemente complicado y tímido como para no molestarme. He trabajado bien con autoindent durante los 20 años anteriores, y los beneficios de las campanas y silbatos adicionales provistos por smartindent son superados por lo que yo considero como su mala conducta.

Gracias, Juan, por su ayuda. Créalo o no, ayudó, bastante.

también descubrí un par de otros comandos ordenados, sin embargo, mientras que el seguimiento de esto:.

>i} 
>a} 

Estos desplazamiento a la derecha del bloque de código que está en los guiones 'i' versión del cuerpo y no las llaves de cierre (mi estilo preferido), y la versión 'a' sangra las llaves de cierre (la versión que se requiere en el trabajo).

Además, se puede aplicar calificativos de '%' en los comandos ejecutados en la shell:

:make %:r.o 

Esto iría a hacer en la 'raíz' del nombre del archivo actual (que es '%:r') seguido de '.o'. O, en otras palabras, si estoy editando somefile.c, esto ejecuta make somefile.o.

+0

Me alegra ayudar. Gracias por el consejo sobre cambiar bloques. Cambio los bloques todo el tiempo, pero seleccioné visualmente el texto y usé el operador de desplazamiento a la derecha (>>). –

+0

Solía ​​usar '>%' en la línea con la llave de apertura o cierre para cambiar todo. También usaría '>% <<% <<' para mover el cuerpo de un bloque a la derecha y luego desenroscar las dos llaves. Pero esos nuevos comandos parecen funcionar en el medio de un bloque, lo cual es bueno. –

1

Tengo las siguientes líneas en mi .vimrc y no observo el problema.

set smartindent 
inoremap # X^H# 

que solía tener conjunto autoindent después de estas dos líneas, pero parece que no tiene ningún efecto.

2

Añadir la siguiente línea en su .vimrc

filetype guión en

(que establecerá el modo de sangría derecha dependiendo del tipo de archivo)

2

que tenía el mismo problema durante mucho tiempo, hasta que me di cuenta de que el sangrado automático y smartindent son innecesarios si "guión tipo de archivo" se pone en su vimrc - 'filetype indent on' usa el archivo indent/sh.vim (o cualquier idioma) en su directorio vim para descubrir las reglas de sangría, y autoindent y smartindent pueden interferir con él.

No he probado esto con sh, pero Perl de repente comenzó a comportarse correctamente cuando cambié.

Nota al margen: redirección de Juan, "Restauración de guión después de escribir de hash", no es una buena solución - mientras que hace corregir el problema en una situación (código escribiendo), no cambia la forma en el editor piensa que debe se sangra, por lo que un re-sangrado (visual =, o normal ==) lo empujará hacia la izquierda.

1

La respuesta anterior sugiere:

: inoremap # X^H #

es excelente. Es la respuesta sugerida por la documentación de VIM en ": help smartindent". Tenga en cuenta que^H se ingresa usando CTRL-V CTRL-H. La sección relevante de la documentación está debajo.

When typing '#' as the first character in a new line, the indent for 
    that line is removed, the '#' is put in the first column. The indent 
    is restored for the next line. If you don't want this, use this 
    mapping: ":inoremap # X^H#", where ^H is entered with CTRL-V CTRL-H. 
    When using the ">>" command, lines starting with '#' are not shifted 
    right. 
Cuestiones relacionadas