pagina oficial from cancel and vim whitespace preferences

oficial - vim cancel edit



Pestaña Vs Preferencias de espacio en Vim (7)

¿Está cambiando la configuración de espacios en blanco tan a menudo que realmente necesita una función para administrar eso? Si estás jugando mucho con tabstop y también estableciendo expandtab, es probable que tengas problemas con el tiempo a medida que cambias los archivos con diferentes valores pasados ​​a stab . Hoy uso :call stab (4) , mañana es :call stab (2) y la semana pasada fue :call stab (8) . Parece que incluso si lo escribe, pronto dejará de usarlo.

Si planea pasar siempre el mismo valor para apuñalar, ¿por qué no edita su configuración global? En vim:

:e $MYVIMRC

y agrega lo siguiente:

set tabstop=4 set shiftwidth=4 "tabs are 4 spaces wide (default = 8) set expandtab "Convert tabs to spaces

Así es como mi .vimrc está configurado.

Vim es muy servicial cuando se trata de tab. preferencias de espacio Según tengo entendido, la configuración de tabstop indica el ancho de un carácter de tabulación. La configuración del shiftwidth especifica cuántas columnas se deben shiftwidth / disminuir cuando se utilizan los comandos << y >> , mientras que la configuración de softtabstop influye en la cantidad de espacios en blanco que se insertarán al presionar la tecla Tab en el modo de inserción. Si expandtab está expandtab , la tecla de tabulación inserta softtabstop de espacio de softtabstop . Mientras que con expandtab desactivado, presionar la tecla Tab inserta la menor cantidad posible de caracteres de tabulación + espacio que coincidan con softtabstop . (Por favor corrígeme si estoy equivocado.)

Este último punto hace que me pregunte: ¿hay algún caso práctico en el que no desee shiftwidth == tabstop && tabstop == softtabstop ? No puedo pensar en uno. En lo que a mí respecta, sería más conveniente si pudiera establecer los 3 de estos para el mismo valor, en una sola tarea. por ejemplo, llamando

:set stab=4

que sería equivalente a correr:

:set tabstop=4 softtabstop=4 shiftwidth=4

¿Alguien puede sugerir cómo se podría hacer esto?

ACTUALIZAR

Gracias por las respuestas hasta ahora de demasiado php , hobbs y kaiser.se . En lugar de responder a cada uno de manera individual, estoy actualizando la pregunta aquí.

Softtabstop con expandtab desactivado

Dije anteriormente que con expandtab desactivado, presionar la tecla Tab inserta la menor cantidad posible de caracteres de tabulación + espacio que coincidan con softtabstop . Estoy de acuerdo con eso, pero creo que necesito explicar lo que quise decir. Intentaré hacerlo a través de algunos ejemplos. Para seguir, ejecute :set list para que pueda ver los caracteres de tabulación.

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

En el modo de inserción, al presionar la tecla de tabulación se insertan 2 espacios de caracteres. Presione la tecla de tabulación por segunda vez, y en lugar de insertar dos caracteres de espacio más (para un total de 4 caracteres de espacio) reemplaza los 2 espacios anteriores con un solo carácter de tabulación. Tabstop está configurado en 4, por lo que un carácter de sola pestaña tiene el mismo ancho que 4 espacios.

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

En el modo de inserción, presionar la tecla de tabulación inserta 1 carácter de tabulación más 2 espacios. El carácter de tabulación tiene un ancho de 4, por lo que el ancho total es 6, y esto se logra con 3 caracteres. Al presionar la tecla de tabulación por segunda vez, se insertan dos caracteres de tabulación y se eliminan los dos espacios que se insertaron previamente. El ancho total es 12, y esto se logra usando 3 caracteres.

En ambos ejemplos, Vim inserta la cantidad mínima posible de caracteres de tabulación + espacio que coincidan con softtabstop.

Si estoy trabajando con expandtab desactivado, no puedo ver que desee el control extra granular que se puede lograr al establecer softtabstop a un valor diferente de la punta de la ficha. Todavía sería útil para mí poder establecer tabstop , softtabstop y shiftwidth con el mismo valor con un solo comando.

¿Expandtab hace que el softtabstop sea redundante?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

En el modo de inserción, al presionar la tecla de tabulación se insertan 4 espacios. Al presionar la tecla Supr borra un espacio simple, por lo que debe retroceder 4 veces si toca accidentalmente la tecla de tabulación.

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

En el modo de inserción, al presionar la tecla de tabulación se insertan 4 espacios. Al presionar la tecla de retroceso, se eliminan 4 espacios.

Si estoy trabajando con expandtab encendido, preferiría que la tecla de eliminar elimine la misma cantidad de espacios en blanco que se inserta en la tecla de tabulación. Entonces, en este caso, también, creo que sería útil poder asignar el mismo valor a tabstop , softtabstop y shiftwidth simultáneamente.

Un atajo aún sería útil

Es genial que Vim brinde tanta flexibilidad, pero no me veo a mí mismo necesitándolo. Solo quiero poder elegir el ancho de una pestaña, y si es una pestaña ''dura'' (usando un carácter de pestaña) o una pestaña ''suave'' (compuesta de espacios). Alternar entre pestañas duras y suaves es bastante fácil ( :set expandtab! ), Pero me gustaría que fuera más sencillo establecer el ancho de la pestaña, sin tener que manipular 3 parámetros diferentes.

Así que mi sugerencia propuesta para algo así como :set stab=4 todavía me parece bien.


Crear una opción de stab blanca en Vim no sería fácil, pero he creado este comando / función que puedes colocar en tu .vimrc (o un archivo de complemento si estás súper organizado). Use :Stab y se le pedirá un nivel de sangría y si usar o no expandtab . Si presiona ingresar sin darle un nuevo nivel de sangría, solo imprimirá la configuración actual.

" put all this in your .vimrc or a plugin file command! -nargs=* Stab call Stab() function! Stab() let l:tabstop = 1 * input(''set shiftwidth='') if l:tabstop > 0 " do we want expandtab as well? let l:expandtab = confirm(''set expandtab?'', "&Yes/n&No/n&Cancel") if l:expandtab == 3 " abort? return endif let &l:sts = l:tabstop let &l:ts = l:tabstop let &l:sw = l:tabstop if l:expandtab == 1 setlocal expandtab else setlocal noexpandtab endif endif " show the selected options try echohl ModeMsg echon ''set tabstop='' echohl Question echon &l:ts echohl ModeMsg echon '' shiftwidth='' echohl Question echon &l:sw echohl ModeMsg echon '' sts='' echohl Question echon &l:sts . '' '' . (&l:et ? '' '' : ''no'') echohl ModeMsg echon ''expandtab'' finally echohl None endtry endfunction


En el modo de edición, también puede usar Ctrl-T para sangrar y Ctrl-D para definir el siguiente nivel de sangría establecido por shiftwidth , independientemente de la tabstop de tabstop , softtabstop o expandtab . Vim agregará / eliminará espacios o pestañas automáticamente para llevarlo a la columna de la derecha.

Si utiliza estos comandos para controlar la sangría en lugar de Tab / Retroceso , no tiene que preocuparse de que todas estas configuraciones de tabulación se ajusten juntas y siempre lleguen al nivel de sangría correcto.


Este es mi primer intento de escribir VimScript, pero aquí va:

function! Stab(value) let &shiftwidth = a:value let &softtabstop = a:value let &tabstop = a:value endfunc

Si pongo esto en mi archivo .vimrc, puedo llamarlo ejecutando :call Stab(X) , donde X es el ancho de la pestaña deseada. Esta es una solución adecuada por ahora, pero si alguien puede sugerir una forma de hacer que sea más fácil llamar, le estaría agradecido.

También he creado una función que resume rápidamente la configuración actual, que he asignado a ctrl-Tab:

nmap <C-Tab> :call TabParams()<CR> function! TabParams() echo "tabstop: ".&tabstop echo "shiftwidth: ".&shiftwidth echo "softtabstop: ".&softtabstop endfunc

Bueno, puse una recompensa de 100 puntos por esta respuesta, y ahora lo he solucionado a medias. No estoy seguro si puedo aceptar mi propia respuesta ...


Si expandtab está configurado entonces (como señala demasiado php), softtabstop vuelve redundante. La única razón por la que puede establecer el shiftwidth de tabstop de forma diferente a la de la tabstop sería atender un hábito extraño; por ejemplo, utiliza sangrías de cuatro espacios pero prefiere tabular para insertar ocho espacios.

Si expandtab está configurado, las cosas se ponen más borrosas. Si desea que su código se vea igual en los editores cat y no vim que en vim, entonces el tabstop siempre debe configurarse en 8; en este caso, establecerá softtabstop y shiftwidth para su nivel preferido de sangría. Si prefiere que cada "pestaña física" en el archivo represente un nivel de sangría, establecería tabstop y shiftwidth a su nivel de sangría preferido y dejará softtabstop en cero (establecerlo igual a tabstop es equivalente, excepto que si cambia tabstop lo hará salirse de sincronía, mientras que cero solo significa "ignorar esto por favor").


Su comprensión de softtabstop y expandtab es incorrecta, por lo que la opción de stab que sugiera no sería muy útil.

expandtab es para cuando quieres usar espacios en lugar de pestañas para todo . Si configura expandtab , entonces Vim ignora la opción softtabstop y usa tabstop y shiftwidth para calcular cuántos espacios insertar.

softtabstop es solo para cuando desea utilizar una combinación de pestañas y espacios, lo que le permite aplicar un control fino (2 o 4 espacios), manteniendo el ancho de la pestaña en un valor más alto (generalmente 8) para que el texto aparezca en el otro aplicaciones. Configuración de softtabstop=tabstop no logra nada porque Vim siempre usará pestañas para sangrar.

Actualización: Como ha señalado kaizer.se , si está utilizando expandtab , aún necesita establecer softtabstop si desea que Vim haga retroceder espacios múltiples como si fueran una pestaña.


Una opción útil es softtabstop=-1 que lo establecerá en el valor de shiftwidth . También puede establecer el shiftwidth de shiftwidth a 0, en cuyo caso se tabstop valor de la tabstop .