2010-03-05 11 views
5

Uso varios lenguajes de programación diferentes cada día, y me gustaría tener diferentes anchos de pestañas (en espacios) para cada uno. Por ejemplo: utilizo los 2 espacios "estándar" para Ruby, pero todo nuestro código Matlab existente usa 4 espacios.Autocomandos para Matlab in vim?

tengo esto de mi ~/.vimrc personal:

augroup lang_perl 
    au! 
    set tabstop=4 " tabstop length N in spaces 
    set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
    set expandtab " Use spaces instead of tabs 
augroup END 

augroup lang_ruby 
    au! 
    set tabstop=2 " tabstop length N in spaces 
    set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
    set expandtab " Use spaces instead of tabs 
augroup END 

Los trabajos, pero el siguiente no:

augroup lang_matlab 
    au! 
    set tabstop=4 " tabstop length N in spaces 
    set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
    set expandtab " Use spaces instead of tabs 
augroup END 

Realmente no entiendo cómo augroup lang_ruby cifras de que soy editando un archivo Ruby. (Mis búsquedas mostraron ftdetect, pero la solución no era obvia). No parece que vim sepa que estoy editando Matlab usando augroup lang_matlab. ¿Qué cambio para que esto funcione?

+0

Cuando edita un archivo matlab (.m) y escribe ': set filetype?', ¿Responde con 'filetype = matlab'? Es posible que identifique sus archivos .m como otro idioma. – jagill

Respuesta

2

Si usted quiere tener un gran número de ajustes de tipo de archivo {}, debe ponerlos en ~/.vim/ftplugin/{filetype}.vim o en un archivo que coincide con ~/.vim/ftplugin/{filetype}/**/*.vim (ejemplos: ~/.vim/ftplugin/ruby/foo.vim, ~/.vim/ftplugin/ruby/foo/bar.vim). En este caso, no necesita ningún comando automático. Si aún desea usar autocommands, use lo siguiente:

augroup lang_matlab 
    autocmd! 
    autocmd FileType matlab  setlocal ts=4 sw=4 et 
augroup END 

. Tenga en cuenta dos cosas: evento FileType (está allí y no es BufRead, BufNewFile) y setlocal en lugar de simple set. En primer lugar está destinado a ser utilizado para la configuración de tipo de archivo, segundo es cómo se deben establecer las opciones específicas del búfer.

acerca de por qué la configuración de Perl y Ruby y por qué funcionan los ajustes de MATLAB sin que: el código de ejemplo es lo mismo que

augroup lang_perl 
    autocmd! 
augroup END 
augroup lang_ruby 
    autocmd! 
augroup END 

set tabstop=4 " tabstop length N in spaces 
set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
set expandtab " Use spaces instead of tabs 

set tabstop=2 " tabstop length N in spaces 
set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
set expandtab " Use spaces instead of tabs 

Así, se establece de manera efectiva ts=2 sw=2 et. Pero el $VIMRUNTIME/ftplugin/perl.vim contiene el siguiente código:

setlocal tabstop=4 
setlocal shiftwidth=4 

así, ts=4 sw=4 de Perl se configura en ftplugin/perl.vim, no en su vimrc (si ha instalado el Perl-soporte para plugins). Puede verificarlo reemplazando tabstop=4 con tabstop=8 en vimrc.

0

No puedo decirle cómo se determina que se haya leído lang_perl o lang_ruby. Pero al mirar a la documentación AutoCommand trae a colación un ejemplo para ficheros comprimidos (:he gzip-example):

augroup gzip 
    autocmd! 
    autocmd BufReadPre,FileReadPre  *.gz set bin 
    autocmd BufReadPost,FileReadPost  *.gz '[,']!gunzip 
    autocmd BufReadPost,FileReadPost  *.gz set nobin 
    autocmd BufReadPost,FileReadPost  *.gz execute ":doautocmd BufReadPost " . expand("%:r") 
    autocmd BufWritePost,FileWritePost *.gz !mv <afile> <afile>:r 
    autocmd BufWritePost,FileWritePost *.gz !gzip <afile>:r 
    autocmd FileAppendPre    *.gz !gunzip <afile> 
    autocmd FileAppendPre    *.gz !mv <afile>:r <afile> 
    autocmd FileAppendPost    *.gz !mv <afile> <afile>:r 
    autocmd FileAppendPost    *.gz !gzip <afile>:r 
augroup END 

verlo? Cada autocmd que se especifica lleva un Evento (BufReadPre, FileReadPre) y la extensión para la cual se ejecutará (*.gz). Esto respalda mi opinión hasta el momento de que puede usar cualquier nombre para su augroup, pero tiene que especificar una extensión de la cual el augroup será responsable para que funcione correctamente.

Otra cita de :he autocmd-groups:

Normalmente, cuando se ejecuta automáticamente autocommands, Vim utiliza los autocommands para todos los grupos. El grupo solo importa al ejecutar autocomandos con ": doautocmd" o ": doautoall", o al definir o eliminar autocomandos.

Por lo tanto, con el fin de hacer una augroup para los archivos de MATLAB, éste debe hacer el truco:

augroup lang_matlab 
    autocmd! 
    autocmd BufRead  *.m set ts=4 sw=4 expandtab 
augroup END 

Y asegúrese de que estos ajustes no se sobreescriben, por cualquier augroup s que hacen algo incondicional (es decir, modificar las otras definiciones de augroup también).

+0

'autocmd BufRead * .m set ts = 4 sw = 4 expandtab' contiene dos errores: 1) use' setlocal' para configuraciones específicas de tipo de archivo como lo hace cualquier complemento en '$ VIMRUNTIME/ftplugin'; 2) no rehacer el trabajo ya hecho por '$ VIMRUNTIME/filetype.vim': use' FileType matlab' en lugar de 'BufRead * .m'. – ZyX

+0

@ZyX: Como la configuración que se establece aquí (ts, sw, expandtab) es buffer-local, creo que no será un problema. Y * error * es en mi humilde opinión una palabra demasiado grande. – eckes

+0

@ZyX: Y si la respuesta no es 100% correcta, al menos puedo decir que ** funciona ** y volví a plantear la pregunta que estaba muriendo de hambre desde marzo del año pasado :-) – eckes