在vim中使用Matlab进行自动命令?

时间:2010-03-05 15:20:44

标签: vim

我每天都使用几种不同的编程语言,并且我希望每种语言都有不同的标签宽度(空格)。例如:我使用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。我做了什么改变才能使这项工作?

3 个答案:

答案 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_perllang_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都会带有一个事件(BufReadPreFileReadPre)以及应该执行的扩展(*.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