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
.