Tecla Tabulación == 4 espacios y sangría automática después de llaves en Vim

1265

¿Cómo hago que vi - Vim nunca use pestañas (convertir espacios en pestañas, ¡mal!), Hace que la tecla de pestañas == 4 espacios, y automáticamente sangra el código después de bloques de llaves como lo hace Emacs ?

Además, ¿cómo guardo estas configuraciones para que nunca tenga que ingresarlas nuevamente?

He visto otras preguntas relacionadas con esto, pero siempre parece estar un poco alejado de lo que quiero.

mmcdole
fuente
3
Relacionado: ¿Cómo reemplazar pestañas con espacios? en Vim SE
kenorb

Respuestas:

1882

Como se ha señalado en un par de respuestas a continuación, el método preferido ahora NO es usar smartindent, sino usar lo siguiente (en su .vimrc ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

En su archivo .vimrc :

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

Los archivos de ayuda tardan un poco en acostumbrarse, pero cuanto más lees, mejor se pone Vim:

:help smartindent

Aún mejor, puede incrustar estas configuraciones en su fuente para la portabilidad:

:help auto-setting

Para ver su configuración actual:

:set all

Como graywh señala en los comentarios, smartindent ha sido reemplazado por cindent, que "funciona de manera más inteligente", aunque todavía es principalmente para lenguajes con sintaxis tipo C:

:help C-indenting

Conocer
fuente
44
Si tiene un conjunto de fichas desplegables, entonces debería usar espacios. ¿También "configura compatible"? Eso tiene varios efectos secundarios que incluyen restablecer expandtab a su valor predeterminado de "apagado"
Ken
6060
Lo sentimos, pero smartindent fue reemplazado por cindent, que en sí mismo solo es apropiado para la sintaxis de estilo C. Encender cualquiera de sus vimrc puede ser un problema al trabajar con otros idiomas. Simplemente use "filetype indent on" en su lugar.
graywh
2
Bueno, smartindent también es solo para la sintaxis de estilo C y está esencialmente en desuso.
graywh
44
si habilito expandtab, ¿hay alguna forma de ingresar el carácter de tabulación en el texto?
Daniele Segato
3
@DanieleSegato <ctrl v> <tab> debería funcionar en modo de inserción: stackoverflow.com/questions/4781070/…
Ken
236

Relacionado, si abre un archivo que usa pestañas y espacios, suponiendo que tiene

set expandtab ts=4 sw=4 ai

Puede reemplazar todas las pestañas con espacios en todo el archivo con

:%retab
netjeff
fuente
10
Para su información, si no desea que su pestaña sea reemplazada por espacios, elimine la línea expandtab.
Eno
66
¿No son las pestañas espacios en blanco? ;-)
Rob Wells
11
@ Rob-Wells: Cambié "espacios en blanco" a "espacios". ¿Eres feliz ahora? ;-)
netjeff
¿Podría explicar qué significa esa primera línea?
Financia la demanda de Mónica el
2
expandtab determina si las pestañas se expanden a espacios. ts = tabstop = Número de espacios para los que cuenta una <Tab> en el archivo. sw = shiftwidth = Número de espacios a utilizar para cada paso de sangría (auto). ai = autoindent = Copiar sangría de la línea actual al comenzar una nueva línea.
mcmacerson
89

La mejor manera de obtener una sangría específica de tipo de archivo es usarla filetype plugin indent onen su vimrc. Luego puede especificar cosas como set sw=4 sts=4 et.vim / ftplugin / c.vim, por ejemplo, sin tener que hacer que sean globales para todos los archivos que se están editando y otras sintaxis de tipo no C también se sangrarán correctamente (incluso lisps) .

graywh
fuente
99
En mi humilde opinión, mejor que la respuesta que se ha marcado como correcta. La sangría de tipo de archivo reemplaza a cindent y smartindent.
0fnt
62

Para tener pestañas de 4 espacios en la mayoría de los archivos, caracteres de pestañas reales de 8 anchos en Makefiles y sangría automática en varios archivos, incluido C / C ++, coloque esto en su ~/.vimrcarchivo:

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.
Shervin Emami
fuente
¿Por qué no necesitas un else? Me parece que las últimas líneas sobrescriben el archivo MAKE específico en todos los casos
lucidbrot
66
Hola @lucidbrot, la instrucción "autocmd FileType make" básicamente le dice a vim algunas configuraciones para usar cada vez que abre un Makefile. Mientras que las líneas debajo están configurando los valores predeterminados. En otras palabras, la configuración "tabstop = 8 ..." se aplica más tarde cuando se abre el archivo, y sobrescribirá la configuración "tabstop = 4 ..." que se aplica en la inicialización.
Shervin Emami
56

En muchos sistemas Linux, como Ubuntu, el .vimrcarchivo no existe por defecto, por lo que se recomienda que lo cree primero.

No use el .viminfoarchivo que existe en el directorio de inicio. Se usa para un propósito diferente.

Paso 1: Ve a tu directorio de inicio

cd ~

Paso 2: crea el archivo

vim .vimrc

Paso 3: agregue la configuración indicada anteriormente

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Paso 3: guarde el archivo presionando Shift+ ZZ.

Erick
fuente
11
No lo use Shift + ZZcreará un archivo .swp. uso wq.
shas
66
@shas: "ZZ" es equivalente a ": x" , que es lo mismo que ": wq", excepto que solo se guarda si el archivo ha sido cambiado ... ( Ctrl-Zes otra historia ...)
Gert van den Berg
1
@shas Eso simplemente no es cierto. Si no desea un archivo de intercambio para una sesión de edición, debe ejecutarlo vim -n <file>. Un archivo de intercambio no es algo que se genera al guardar el tiempo; eso prácticamente anularía su propósito, ya que los archivos de intercambio se vuelven útiles para recuperar sesiones de edición terminadas abruptamente.
Kaz
32

La forma recomendada es usar sangría basada en tipos de archivo y solo usar smartindent y cindent si eso no es suficiente.

Agregue lo siguiente a su .vimrc

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Espero que ayude como una respuesta diferente.

Chaudhry Junaid
fuente
12

edite su ~ / .vimrc

$ vim ~/.vimrc

agregue las siguientes líneas:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
Yusuf Ibrahim
fuente
10

De la wiki de VIM :

:set tabstop=4
:set shiftwidth=4
:set expandtab
Usuario
fuente
6

La sangría automática se basa en el modo de sintaxis actual. Yo sé que si está editando Foo.java, a continuación, entrar en una {y golpear Enterguiones la siguiente línea.

En cuanto a las pestañas, hay dos configuraciones. Dentro de Vim, escriba dos puntos y luego "set tabstop = 4" que configurará las pestañas para que se muestren como cuatro espacios. Vuelva a presionar dos puntos y escriba "set expandtab" que insertará espacios para pestañas.

Puede poner esta configuración en un .vimrc (o _vimrc en Windows) en su directorio de inicio, por lo que solo tiene que escribirlos una vez.

Joey Gibson
fuente
0

En primer lugar, no use la Tabclave en Vim para la sangría manual. Vim tiene un par de comandos en modo de inserción para aumentar o disminuir manualmente la cantidad de sangría. Esos comandos son Ctrl-Ty Ctrl-D. Estos comandos observan los valores de tabstop, shiftwidthy expandtab, y mantienen la combinación correcta de espacios y pestañas (número máximo de pestañas seguido de cualquier número necesario de espacios).

En segundo lugar, estas teclas de sangría manual no tienen que usarse mucho de todos modos si usa una sangría automática.

Si en Ctrl-Tlugar de Tabmolestarte, puedes reasignarlo:

:imap <Tab> ^T

También puede reasignar Shift-Tabpara hacer el Ctrl-Ddeindent:

:imap <S-Tab> ^D

Aquí ^ T y ^ D son caracteres de control literales que se pueden insertar como Ctrl-VCtrl-T.

Con esta asignación en su lugar, aún puede escribir Tab literal en el búfer usando Ctrl-VTab. Tenga en cuenta que si hace esto, incluso si :set expandtabestá activado, obtendrá un carácter de tabulación sin expandir.

Se <Tab>logra un efecto similar al del mapa :set smarttab, lo que también hace que el retroceso en el frente de una línea se comporte de manera inteligente.

En smarttabmodo, cuando no Tabse usa al comienzo de una línea, no tiene un significado especial. Eso es diferente de mi mapeo anterior de Taba Ctrl-T, porque un Ctrl-Tusado en cualquier parte de una línea (en modo de inserción) aumentará la sangría de esa línea.

Otras asignaciones útiles pueden ser:

:map <Tab> >
:map <S-Tab> <

Ahora podemos hacer cosas como seleccionar algunas líneas y presionar Tabpara sangrarlas. O presione Tabdos veces en una línea (en modo comando) para aumentar su sangría.

Si utiliza los comandos apropiados de gestión de la sangría, entonces todo está controlado por los tres parámetros: shiftwidth, tabstopy expandtab.

El shiftwidthparámetro controla el tamaño de la sangría; si desea cuatro sangrías de espacio, use :set shiftwidth=4o la abreviatura :set sw=4.

Si solo se hace esto, se creará una sangría usando una mezcla de espacios y pestañas, porque noexpandtabes el valor predeterminado. Uso :set expandtab. Esto hace que los caracteres de tabulación que escribe en el búfer se expandan en espacios y que la sangría administrada por Vim use solo espacios.

Cuando expandtabestá activado, y si administra su sangría a través de todos los mecanismos Vim adecuados, el valor de se tabstopvuelve irrelevante. Controla cómo aparecen las pestañas si ocurren en el archivo. Si tiene set tabstop=8 expandtaby luego introduce una pestaña dura en el archivo usando Ctrl-VTab, producirá una alineación a la siguiente posición de pestaña basada en 8 columnas, como de costumbre.

Kaz
fuente
Todas sus asignaciones deben usar las variantes no recursivas. Mapping go <C-t>puede usar esa sintaxis en lugar de literales. Por último, el mapeo <Tab>en modo normal también mapeará <C-i>(son el mismo personaje), por lo que no recomiendo que (pierdas una pieza ingeniosa de funcionalidad vim
D. Ben Knoble
@ D.BenKnoble No recomiendo nada de esto; Yo uso Ctrl-T, Ctrl-D y <> yo mismo. Eso está usando Vim según lo previsto. A la gente que solía usar Tab en otros editores podría no gustarle, eso es todo.
Kaz