2008-10-01 5 views
296

¿Podría alguien explicarme en términos simples la manera más fácil de cambiar el comportamiento de indentación de Vim según el 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.Cambiando el comportamiento de sangría de Vim por tipo de archivo

+3

BTW - La convención PEP8 para Python dice que la etiqueta debe tener 4 espacios y las pestañas deben tener 4 espacios. ref: http://stackoverflow.com/questions/120926/why-does-python-pep-8-strongly-recommend-spaces-over-tabs-for-indentation – cgseller

Respuesta

244

Puede agregar .vim archivos para ejecutar cada vez que vim cambie a un tipo de archivo en particular.

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

setlocal shiftwidth=2 
setlocal tabstop=2 

¿Qué hace que vim a usar pestañas con una anchura de 2 caracteres para sangrar (la opción noexpandtab se establece a nivel mundial en otras partes de la configuración de mi).

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

+180

Debería poner eso en '~/.vim/after/ftplugin/html.vim' en su lugar. Pero como otros han señalado a continuación, es mucho más agradable agregar 'autocmd FileType html setlocal shiftwidth = 2 tabstop = 2' a su' .vimrc'. –

+7

Vaya, en realidad, ese/es/donde tengo ese archivo. Repararé la respuesta. 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 posterior de ftplugins. Vim cargará todos los que encuentre en su runtimepath, no solo los primeros como para los archivos de sintaxis. – graywh

52

comandos Poner autocmd basado en el sufijo de archivo en el directorio ~/.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 =

+14

¿Cuál es la ventaja de esto sobre 'FileType'? –

+3

¿Hay alguna forma de invertir el partido? – SystemParadox

+5

He tenido problemas para hacer que los tipos de archivos funcionen con archivos html (ya que el archivo .html no es realmente HTML, sino un archivo HTML de plantilla con un lenguaje de plantillas). Filetypes no parece reconocerlo como html, pero este método sí lo hará. –

21

por lo general trabajan con expandtab conjunto, pero eso es malo para makefiles. Recientemente he añadido:

:autocmd FileType make set noexpandtab 

hasta el final de mi archivo .vimrc y reconoce Makefile, makefile, y * .mk como archivos make y no se expande pestañas. Presumiblemente, puedes extender esto.

+0

La mejor opción es habilitar: filetype plugins. El predeterminado para Vim incluye: setl noet, por lo que ni siquiera necesita ese aucmd en su vimrc. – graywh

+0

OK. ¿Puedes explicar los beneficios de eso y qué implica hacerlo? ¿Por qué los plugins de tipo de archivo son mejores que autocmd? ¿Cuándo se debe usar autocmd? ¿No utilizado? –

+5

Los complementos de tipo de archivo que vienen con Vim harán cosas útiles como "setlocal noexpandtab" para makefiles, por ejemplo. Los autocomandos contra ftplugins para cosas personales como shiftwidth no importan, es solo la forma en que eliges estructurar tu configuración de vim. – graywh

134

Utilice ftplugins u órdenes automáticas para establecer las opciones. (: H ftplugin para más información)

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

setlocal sw=2 sts=2 et 

Y no se olvide de volver a conectarlos en ~/.vimrc

filetype plugin indent on 

O en ~/.vimrc

au FileType python setl sw=2 sts=2 et 

también sugeriría aprender la diferencia entre 'ts' y '' pts. Mucha gente no sabe acerca de 'pts'.

+1

Gracias! También gracias por ese poco sobre 'ts' y 'sts'. ¿Hay alguna página en particular que recomiendes que discuta esta diferencia y cómo usarla? – jvriesem

+9

@jvriesem No hay mucho que hacer: 'ts' es cómo se muestran los tabuladores; 'sts' es la cantidad de "espacios" para insertar cuando se presiona la tecla de tabulación; 'sw' es cuántos "espacios" usar por nivel de sangría; 'et' es si usar espacios o pestañas; 'sta' le permite insertar 'sw' "espacios" cuando presiona tabulador al principio de una línea. – graywh

+9

Me pregunto si sería mejor utilizar los formularios completos, para mayor claridad, en lugar de la frase breve al final. – icedwater

3

Si bien puede configurar la sangría de Vim simplemente utilizando el complemento de sangrado o manualmente usando la configuración, le recomiendo usar un script de Python llamado Vindect que establece automáticamente la configuración relevante para usted cuando abre un archivo de Python. Use this tip para hacer que el uso de Vindect sea aún más efectivo. Cuando comencé a editar archivos python creados por otros con varios estilos de sangría (tabulación frente a espacio y cantidad de espacios), fue increíblemente frustrante.Pero Vindect junto con this indent file

Recomendamos:

5

Esto podría ser conocido por la mayoría de nosotros, pero de todos modos (Yo estaba perplejo mi primera time): haciendo :set et (:set expandtabs) no cambia la t abs que ya existe en el archivo, uno tiene que hacer :retab. Por ejemplo:

:set et 
:retab 

y las pestañas en el archivo se sustituyen por espacios suficientes. Para tener pestañas hacia atrás, simplemente hacer:

:set noet 
:retab 
13

Siempre me sorprende por las personas que cambian el tamaño de las pestañas para diferentes tipos de archivos. ¿Qué diablos haces cuando miras un archivo usando menos?

Personalmente, yo uso estos ajustes en .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab 
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab 
+19

Muchos idiomas tienen convenciones establecidas hace mucho tiempo, al igual que ciertas compañías. Tome NodeJS como un ejemplo de lo primero. Las pestañas deben ser dos espacios.Dolor de cabeza, y bastante tonto, pero importante. –

+3

¿Por qué las pestañas deben ser iguales para todas las circunstancias? Para un archivo de configuración, 8 pestañas espaciales funcionan bien, pero para el código con muchas sangrías, 2 es mucho más fácil de administrar. Y luego hay convenciones fijas: node.js debe tener 2 pestañas de espacio, y python es sintácticamente inválido con cualquier cosa que no sean 4 pestañas de espacio. – felixphew

+1

@felixphew Python es perfectamente correcto con cualquier cantidad de espacios (o incluso pestañas), siempre y cuando se mantenga igual durante todo el proceso. – DJMcMayhem

51

editar su ~/.vimrc, y añadir diferentes tipos de archivos para diferentes guiones, por ejemplo. Quiero html/rb guión para 2 espacios, y js/coffee archivos de guión 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 

se refieren a: Setting Vim whitespace preferences by filetype

+0

El comentario para vimrc es simple' '' :) – sdkks

1

utilizo una utilidad que he escrito en C llamado autotab. Analiza las primeras mil líneas de un archivo que carga y determina valores para los parámetros de Vim shiftwidth, tabstop y expandtab.

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

Autotab es bastante inteligente, pero puede confundirse de vez en cuando, en particular por que se han mantenido de forma irregular 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ñas se está utilizando al considerar factores como la alineación de elementos internos en 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, C, sin mencionar las obvias líneas en blanco.

2

Hoy en día, puedes intentar editorconfig, también hay un vim plugin para él. Con esto, puede cambiar el tamaño de sangría en vim, pero en muchos otros editores, mantenga estilos de codificación coherentes.

A continuación se muestra un editor de archivos simple, como se puede ver, los archivos de Python tendrán 4 espacios para la sangría, y los archivos de plantillas de 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 
Cuestiones relacionadas