Cambio del comportamiento de sangría de Vim por tipo de archivo

379

¿Podría alguien explicarme en términos simples la forma más fácil de cambiar el comportamiento de sangrado de Vim en función del tipo de archivo? Por ejemplo, si abro un archivo de Python, debería sangrar con 2 espacios, pero si abro un script de Powershell, debería usar 4 espacios.

EBGreen
fuente
99
Por cierto, la convención PEP8 para Python dice que la tabulación debe ser de 4 espacios y las pestañas deben ser de 4 espacios. ref: stackoverflow.com/questions/120926/…
cgseller

Respuestas:

304

Puede agregar .vimarchivos para que se ejecuten siempre que vim cambie a un tipo de archivo en particular.

Por ejemplo, tengo un archivo ~/.vim/after/ftplugin/html.vim con este contenido:

setlocal shiftwidth=2
setlocal tabstop=2

Lo que hace que vim use pestañas con un ancho de 2 caracteres para la sangría (la noexpandtabopción se establece globalmente en otra parte de mi configuración).

Esto se describe aquí: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , desplácese hacia abajo hasta la sección de complementos de tipo de archivo.

SpoonMeiser
fuente
229
Deberías poner eso en su ~/.vim/after/ftplugin/html.vimlugar. Pero como otros han señalado a continuación, es mucho mejor agregarlo autocmd FileType html setlocal shiftwidth=2 tabstop=2a tu .vimrc.
Aristóteles Pagaltzis
10
Vaya, en realidad, ese / es / donde tengo ese archivo. Arreglaré la respuesta. Sin embargo, no estoy de acuerdo, creo que separar los comandos para diferentes tipos de archivos en archivos separados hace que todo sea mucho más fácil, especialmente si tiene requisitos para muchos tipos de archivos o muchas opciones para algunos tipos de archivos.
SpoonMeiser
3
En realidad, no hay muchas razones para usar el directorio after para ftplugins. Vim cargará todos los que encuentre en su runtimepath, no solo el primero como para los archivos de sintaxis.
graywh
36
FYI: no use js para el tipo de archivo javascript. Use javascript en su lugar. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo
13
También debe agregar filetype plugin ona su vimrc.
gatoatigrado
191

Use ftplugins o autocomandos para configurar las opciones.

ftplugin

En ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

Y no olvides activarlos en ~/.vimrc:

filetype plugin indent on

(:h ftplugin para más información)

autocomando

En ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Puede reemplazar cualquiera de los comandos largos o ajustes con sus versiones cortas:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

También sugeriría aprender la diferencia entre tabstopy softtabstop. Mucha gente no lo sabe softtabstop.

graywh
fuente
1
¡Gracias! También gracias por ese bit sobre 'ts' y 'sts'. ¿Hay alguna página en particular que recomendaría que discuta esta diferencia y cómo usarla?
jvriesem
11
@jvriesem No hay mucho: 'ts' es cómo se muestran los caracteres de tabulación; 'sts' es cuántos "espacios" insertar cuando se presiona la tecla tabulador; 'sw' es cuántos "espacios" usar por nivel de sangría; 'et' es si se usan espacios o pestañas; 'sta' le permite insertar 'sw' 'espacios' al presionar tab al comienzo de una línea.
graywh
10
Me pregunto si sería mejor usar los formularios completos, para mayor claridad, en lugar de la breve frase al final.
agua helada
23
swes corto para softwidth, stses corto para softtabstop, etes corto para expandtab, setles corto para setlocal, y aues corto para autocmd. Puede usar las formas largas en lugar de las formas cortas.
Flimm
13
Creo que se swexpande a shiftwidthmás que a softwidth.
johncip
83

edite su ~/.vimrcy agregue diferentes tipos de archivos para diferentes sangrías, por ejemplo, quiero html/rbsangría para 2 espacios y js/coffeesangría de archivos para 4 espacios:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

consulte: Configuración de las preferencias de espacios en blanco de Vim por tipo de archivo

Siwei Shen 申思维
fuente
Comentario para vimrc es único ":)
sdkks
@sdkks No lo creo. la comilla doble es un comentario, la comilla simple 'da error en todos los vim de mi Linux. (7.3+, 8.0 ...)
Siwei Shen 申思维
Si. Mi comentario dice que use un solo ", lo que significa que no lo cierre con otro ". Aunque no estoy seguro de por qué lo comenté.
sdkks
Ok, te entendí mal. Aunque la comilla simple significa' pero no se fue "sin derecha " @. @
Siwei Shen 申思维
60

Ponga comandos autocmd basados ​​en el sufijo de archivo en su ~ / .vimrc

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

Los comandos que está buscando son probablemente ts = y sw =

Paul Tomblin
fuente
18
¿Cuál es la ventaja de esto FileType?
Casey Chow
3
¿Hay alguna forma de invertir el partido?
SystemParadox
77
He tenido problemas para hacer que los tipos de archivo funcionen con archivos html (ya que el archivo .html no es realmente HTML, sino un archivo HTML de plantilla con un lenguaje de plantillas). Los tipos de archivo no parecen reconocerlo como html, pero este método lo hará.
Mark Hildreth
3
@digitxp: la ventaja es cuando la extensión utilizada no coincide con un "FileType" definido. Por ejemplo, en mi instalación, * .md significa un tipo de archivo de Modula2, mientras que lo estoy usando para rebajar. Podría (a) cambiar la configuración predeterminada de FileType (b) alterar la configuración de tipo de archivo con una configuración personalizada o (c) obtener rápidamente lo que quiero usando esta configuración en mi archivo 1 .vimrc con el que fui (c).
pdwalker
Vale la pena señalar que, suponiendo que mi lectura rápida de los documentos sea correcta, puede agregar múltiples comandos por tipo (s) de archivo de esta manera, y se garantiza que se ejecuten en el orden dado.
underscore_d
23

Normalmente trabajo con expandtabset, pero eso es malo para los makefiles. Recientemente agregué:

:autocmd FileType make set noexpandtab

al final de mi archivo .vimrc y reconoce Makefile, makefile y * .mk como makefiles y no expande las pestañas. Presumiblemente, puedes extender esto.

Jonathan Leffler
fuente
La mejor opción es habilitar: complementos de tipo de archivo. El predeterminado para Vim incluye: setl noet, por lo que ni siquiera necesita ese aucmd en su vimrc.
graywh
OKAY. ¿Puede explicar los beneficios de eso y qué implica hacerlo? ¿Por qué los complementos de tipo de archivo son mejores que autocmd? ¿Cuándo se debe usar autocmd? ¿No utilizado?
Jonathan Leffler el
55
Los complementos de tipo de archivo que vienen con Vim harán cosas útiles como "setlocal noexpandtab" para makefiles, por ejemplo. Los comandos automáticos frente a ftplugins para cosas personales como shiftwidth no importan: es solo cómo elige estructurar su configuración de vim.
graywh
17

Personalmente, uso esta configuración en .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
Nello
fuente
22
Muchos idiomas tienen convenciones establecidas desde hace mucho tiempo, al igual que ciertas empresas. Tome NodeJS como ejemplo de lo primero. Las pestañas deben ser dos espacios. Dolor de cabeza, y bastante tonto, pero importante.
Paul Hazen
3
¿Por qué las pestañas deben ser iguales para todas las circunstancias? Para un archivo de configuración, 8 pestañas de espacio funcionan bien, pero para código con muchas sangrías, 2 es mucho más fácil de administrar. Y luego hay convenciones fijas: node.js debería tener 2 pestañas de espacio, y python es en realidad sintácticamente inválido con algo más que 4 pestañas de espacio.
Felixphew
1
@felixphew Python es perfectamente correcto con cualquier número de espacios (o incluso pestañas) siempre que permanezca igual durante todo el proceso.
James
@DJMcMayhem Tienes razón: debería haber dicho "lo recomiendo encarecidamente".
Felixphew
1
+1 a Nello. El carácter de tabulación tiene una tradición establecida desde hace mucho tiempo de significar un salto a la siguiente posición en un múltiplo de 8 caracteres. Es solo porque la gente quería usar la pestaña para "el próximo guion que se ve bien en mi idioma" y porque algunos editores de texto no se molestaron en hacer la diferencia entre "agregar un carácter de tabulación" y "agregar espacios para la sangría", y las personas modificamos su editor para que se salga con la suya, que ahora tenemos este lío donde las pestañas nunca muestran la forma prevista. El código fuente es texto y el estándar para el texto son las pestañas de 8 caracteres.
Florian F
6

Esto podría ser conocido por la mayoría de nosotros, pero de todos modos (me sorprendió la primera vez): Hacer :set et( :setexpandtabs) no cambia las pestañas que ya existen en el archivo, uno tiene que hacerlo :retab. Por ejemplo:

:set et
:retab

y las pestañas en el archivo se reemplazan por suficientes espacios. Para volver a tener pestañas simplemente haz:

:set noet
:retab
Juan Lanus
fuente
4

Hoy, puedes probar editorconfig , también hay un complemento vim para ello. Con esto, no solo puede cambiar el tamaño de la sangría en vim, sino que en muchos otros editores, mantener estilos de codificación consistentes.

A continuación se muestra una configuración de editor simple, como puede ver, los archivos de Python tendrán 4 espacios para sangría, y los archivos de plantilla pug solo tendrán 2.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2
chengbo
fuente
3

Si bien puede configurar la sangría de Vim muy bien usando el complemento de sangría o manualmente usando la configuración, le recomiendo usar un script de Python llamado Vindect que establece automáticamente las configuraciones relevantes para usted cuando abre un archivo de Python. Use este consejo para hacer que usar Vindect sea aún más efectivo. Cuando comencé a editar archivos de Python creados por otros con varios estilos de sangría (tabulación versus espacio y número de espacios), fue increíblemente frustrante. Pero Vindect junto con este archivo de sangría

También recomiendo:

haridsv
fuente
2

Para aquellos que usan autocmd, es una buena práctica agruparlos. Si una agrupación está relacionada con la detección de tipo de archivo, es posible que tenga algo como esto:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

Las agrupaciones ayudan a mantener el .vimrc organización, especialmente una vez que un tipo de archivo tiene varias reglas asociadas. En el ejemplo anterior, se define un acceso directo de comentario específico para archivos .c.

La llamada inicial a autocmd!le dice a vim que elimine cualquier comando automático previamente definido en dicho grupo. Esto evitará la definición duplicada si .vimrcse obtiene de nuevo. Vea el :help augrouppara más información.

67hz
fuente
1

Yo uso una utilidad que escribí en C llamada autotab. Analiza los primeros miles de líneas de un archivo que carga y determina los valores para los parámetros de Vim shiftwidth, tabstopy expandtab.

Esto se compila utilizando, por ejemplo, gcc -O autotab.c -o autotab. Las instrucciones para integrarse con Vim se encuentran en el encabezado del comentario en la parte superior.

Autotab es bastante inteligente, pero puede confundirse de vez en cuando, en particular porque se ha mantenido de manera inconsistente utilizando diferentes estilos de sangría.

Si un archivo evidentemente usa pestañas, o una combinación de pestañas y espacios, para la sangría, Autotab descubrirá qué tamaño de pestaña se está usando considerando factores como la alineación de elementos internos a través de líneas sucesivas, como comentarios.

Funciona para una variedad de lenguajes de programación, y es indulgente con los elementos "fuera de banda" que no obedecen a los incrementos de sangría, como las directivas de preprocesamiento C, las etiquetas de instrucción C, sin mencionar las obvias líneas en blanco.

Kaz
fuente