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.


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.


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.


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


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 =


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.


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

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

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

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:


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.