我每天都使用几种不同的编程语言,并且我希望每种语言都有不同的标签宽度(空格)。例如:我使用Ruby的“标准”2空格,但我们现有的所有Matlab代码都使用4个空格。
我的个人~/.vimrc
:
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
那些工作,但以下不是:
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
我真的不明白augroup lang_ruby
如何弄清楚我正在编辑一个Ruby文件。 (我的搜索结果为ftdetect
,但解决方案并不明显。)vim
似乎不知道我正在使用augroup lang_matlab
编辑Matlab。我做了什么改变才能使这项工作?
答案 0 :(得分:2)
如果您想为{filetype}设置大量设置,则应将其放入~/.vim/ftplugin/{filetype}.vim
或与~/.vim/ftplugin/{filetype}/**/*.vim
匹配的文件中(示例:~/.vim/ftplugin/ruby/foo.vim
,{{1 }})。在这种情况下,您根本不需要任何自动命令。如果您仍想使用自动命令,请使用以下命令:
~/.vim/ftplugin/ruby/foo/bar.vim
。注意两件事:FileType事件(它在那里,它不是BufRead,BufNewFile)和augroup lang_matlab
autocmd!
autocmd FileType matlab setlocal ts=4 sw=4 et
augroup END
而不是普通setlocal
。第一个用于文件类型设置,第二个是如何设置特定于缓冲区的选项。
关于为什么perl和ruby设置有效以及为什么matlab设置不起作用:您的示例代码与
相同set
因此,您有效地设置了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
。但ts=2 sw=2 et
包含以下代码:
$VIMRUNTIME/ftplugin/perl.vim
因此,perl的setlocal tabstop=4
setlocal shiftwidth=4
在vimrc中设置为ts=4 sw=4
,不(如果已安装perl-support插件)。您可以将ftplugin/perl.vim
替换为vimrc中的tabstop=4
来检查。
答案 1 :(得分:0)
我无法告诉您如何确定应该阅读lang_perl
或lang_ruby
。但是查看自动命令文档会为gzip压缩文件(: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
看到了吗?指定的每个autocmd
都会带有一个事件(BufReadPre
,FileReadPre
)以及应该执行的扩展(*.gz
)。这是为了支持我迄今为止的意见,即您可以使用augroup
的任何名称,但必须指定augroup
应负责的扩展名才能使其正常运行。
:he autocmd-groups
的另一个引用:
通常,当自动执行自动命令时,Vim使用自动命令 适用于所有团体。 该组仅在执行自动命令时很重要 “:doautocmd”或“:doautoall”,或者在定义或删除自动命令时。
因此,为了为matlab文件制作augroup
,这个应该可以解决这个问题:
augroup lang_matlab
autocmd!
autocmd BufRead *.m set ts=4 sw=4 expandtab
augroup END
并确保这些设置不被任何无条件的augroup
覆盖(即修改其他augroup
定义)。
答案 2 :(得分:0)
使用ftplugins,配置vim会更容易实现。 见gVim and multiple programming languages