Vim es muy complaciente cuando se trata de tab Vs. preferencias de espacio. Según tengo entendido, la tabstop
configuración indica el ancho de un carácter de tabulación. La shiftwidth
configuración especifica cuántas columnas aumentar / disminuir cuando se usan los comandos <<y >>, mientras que la softtabstop
configuración influye en la cantidad de espacio en blanco que se insertará cuando presione la Tabtecla en el modo de inserción. Si expandtab
está activado, la tecla de tabulación inserta un softtabstop
número de caracteres de espacio. Mientras que con expandtab
apagado, al presionar la Tabtecla se inserta el menor número posible de caracteres de tabulación + espacio que coincida softtabstop
. (Por favor corrígeme si estoy equivocado.)
Este último punto me hace preguntarme: ¿hay algún caso práctico en el que no quisieras 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 con el mismo valor, en una sola asignación. por ejemplo, llamando:
:set stab=4
que sería equivalente a ejecutar:
: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 individualmente, estoy actualizando la pregunta aquí.
Softtabstop con la pestaña de expansión apagada
Dije anteriormente que con expandtab desactivado, al presionar la tecla Tab se inserta el menor número posible de caracteres de tabulación + espacio que coincida softtabstop
. Lo mantengo, pero creo que necesito explicar lo que quise decir. Intentaré hacerlo mediante algunos ejemplos. Para seguirlo, 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 caracteres de espacio. 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 se establece en 4, por lo que un solo carácter de tabulación tiene el mismo ancho que 4 espacios.
tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab
En el modo de inserción, al presionar la tecla de tabulación se 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 usando 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 anteriormente. El ancho total es 12, y esto se logra usando 3 caracteres.
En ambos ejemplos, Vim inserta el número mínimo posible de caracteres de tabulación + espacio que coincida con softtabstop.
Si estoy trabajando con expandtab desactivado, no puedo imaginarme queriendo el control granular adicional que se puede lograr configurando softtabstop en un valor diferente de tabstop. Todavía sería útil para mí poder establecer tabstop
, softtabstop
y shiftwidth
al mismo valor con un solo comando.
¿Expandtab hace que la función 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 Eliminar, se elimina un solo espacio, por lo que debe retroceder 4 veces si presiona la tecla Tab por accidente.
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 borran 4 espacios.
Si estoy trabajando con expandtab
la tecla encendida, preferiría que la tecla de eliminación elimine la misma cantidad de espacios en blanco que la tecla de tabulación inserta. Así pues, en este caso, también, siento que sería útil poder asignar el mismo valor a tabstop
, softtabstop
y shiftwidth
al mismo tiempo.
Un atajo aún sería útil
Es genial que Vim brinde tanta flexibilidad, pero no me veo 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 'blanda' (formada por espacios). Alternar entre pestañas duras y blandas es bastante fácil ( :set expandtab!
), pero desearía que fuera más sencillo establecer el ancho de la pestaña, sin tener que jugar con 3 parámetros diferentes.
Entonces, mi sugerencia propuesta para algo como :set stab=4
todavía me suena bien.
fuente
is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?
, el propio código fuente de Vim usaset shiftwidth=4 tabstop=8 noexpandtab
. Sí, normalmente uno quiereshiftwidth == softtabstop
, pero eso es independiente del valor quetabstop
tenga.Respuestas:
Crear una
stab
opción en Vim en sí no sería fácil, pero he creado este comando / función que puede colocar en su.vimrc
(o en un archivo de complemento si está súper organizado). Use:Stab
y se le pedirá un nivel de sangría y si debe usarlo o noexpandtab
. Si presiona Intro sin darle un nuevo nivel de sangría, simplemente imprimirá la configuración actual.fuente
Este es mi primer intento de escribir VimScript, pero aquí va:
Si pongo esto en mi archivo .vimrc, puedo llamarlo ejecutando
:call Stab(X)
, donde X es el ancho de pestaña deseado. Esta es una solución adecuada por ahora, pero si alguien puede sugerir una forma de facilitar la llamada, se lo agradecería.También he creado una función que resume rápidamente la configuración actual, que he asignado a ctrl-Tab:
Bueno, ofrecí una recompensa de 100 puntos por esta respuesta, y ahora la he resuelto a medias. No estoy seguro de poder aceptar mi propia respuesta ...
fuente
En el modo de edición, también puede usar Ctrl-Tpara sangrar y Ctrl-Dquitar la sangría al siguiente nivel de sangría según lo establecido por
shiftwidth
, independientemente de la configuración detabstop
,softtabstop
oexpandtab
. Vim agregará / eliminará automáticamente espacios o pestañas para llevarlo a la columna de la derecha.Si usa estos comandos para controlar la sangría en lugar de Tab/ Backspace, no tiene que preocuparse de que todas estas configuraciones de pestañas encajen y siempre llegue al nivel de sangría correcto.
fuente
Si
expandtab
se establece entonces (como señala demasiado php), sesofttabstop
vuelve redundante. La única razón por la que podría establecer de manerashiftwidth
diferentetabstop
sería para satisfacer un hábito extraño; por ejemplo, utiliza sangrías de cuatro espacios pero prefiere tabinsertar ocho espacios.Si no
expandtab
está configurado, las cosas se vuelven más confusas. Si desea que su código tenga el mismo aspecto concat
y sin editores vim que en vim, entoncestabstop
siempre debe establecerse en 8; en este caso, estableceríasofttabstop
yshiftwidth
ambos en su nivel de sangría preferido. Si, en cambio, prefiere que cada "pestaña física" en el archivo represente un nivel de sangría, debe establecertabstop
yshiftwidth
en su nivel de sangría preferido y dejarlosofttabstop
en cero (establecerlo en igual atabstop
es equivalente, excepto que si lo cambiatabstop
se desincronizará, mientras que cero solo significa "ignore esto, por favor").fuente
softtabstop
el valor correcto, se eliminará una sangría espaciada como si fuera una pestaña. que es imprescindible para un uso sano.Su comprensión de
softtabstop
yexpandtab
es incorrecta, por lo que lastab
opción que sugiere no sería muy útil.expandtab
es para cuando desee utilizar espacios en lugar de tabulaciones para todo . Si lo configuraexpandtab
, Vim ignora lasofttabstop
opción y usatabstop
yshiftwidth
para calcular cuántos espacios insertar.softtabstop
es solo para cuando le gustaría usar una combinación de pestañas y espacios, lo que le permite sangrar con un control fino (2 o 4 espacios), mientras mantiene el ancho de la pestaña en un valor más alto (generalmente 8) para que el texto aparezca en las otras aplicaciones . La configuraciónsofttabstop=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 debe establecersofttabstop
si desea que Vim retroceda varios espacios como si fueran una pestaña.fuente
tabstop
y sesofttabstop
convierte en una variable de más cuandoextpandtab
se establece, creo que se equivoca en la prioridad. Pruébelo: configúrelots=8 sts=4 et
y presione el tabulador; el cursor estará en la columna cinco y se insertarán cuatro espacios, como si lo hubiera establecidots=4 sts=0 et
.softtabstop
el valor correcto, se eliminará una sangría espaciada como si fuera una pestaña. que es imprescindible para un uso sano.¿Está cambiando la configuración de los espacios en blanco con tanta frecuencia que realmente necesita una función para administrarlo? Si está jugando mucho con tabstop y también configurando expandtab, probablemente tendrá un lío con el tiempo al cambiar archivos con diferentes valores pasados
stab
. Hoy lo 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 editar su configuración global? En vim:
y agregue lo siguiente:
Así es como se configura mi .vimrc.
fuente
Una opción útil es
softtabstop=-1
cuál lo establecerá en el valor deshiftwidth
.También puede establecerlo
shiftwidth
en 0, en cuyo casotabstop
se utilizará el valor.fuente