【问题标题】:Autocommands for Matlab in vim?Vim中Matlab的自动命令?
【发布时间】:2011-01-13 01:00:06
【问题描述】:

我每天都使用几种不同的编程语言,我希望每种语言都有不同的制表符宽度(以空格为单位)。例如:我对 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。我要进行哪些更改才能完成这项工作?

【问题讨论】:

  • 当您在编辑 matlab (.m) 文件并键入 :set filetype? 时,它是否以 filetype=matlab 响应?它可能会将您的 .m 文件识别为另一种语言。

标签: vim


【解决方案1】:

如果您想对 {filetype} 进行大量设置,则应将它们放入 ~/.vim/ftplugin/{filetype}.vim 或与 ~/.vim/ftplugin/{filetype}/**/*.vim 匹配的文件中(例如:~/.vim/ftplugin/ruby/foo.vim~/.vim/ftplugin/ruby/foo/bar.vim)。在这种情况下,您根本不需要任何自动命令。如果您仍想使用自动命令,请使用以下命令:

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

。注意两件事:FileType 事件(它存在,但不是 BufRead、BufNewFile)和setlocal 而不是普通的set。第一个用于文件类型设置,第二个是必须如何设置缓冲区特定选项。

关于为什么 perl 和 ruby​​ 设置有效以及为什么 matlab 设置无效:您的示例代码与

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 包含以下代码:

setlocal  tabstop=4
setlocal  shiftwidth=4

所以,ts=4 sw=4 for perl 在你的 vimrc 中设置为ftplugin/perl.vim不是(如果你已经安装了 perl-support 插件)。您可以通过在 vimrc 中将 tabstop=4 替换为 tabstop=8 来检查它。

【讨论】:

    【解决方案2】:

    我无法告诉您如何确定应读取 lang_perllang_ruby。但是查看自动命令文档会找到一个 gzipped 文件的示例 (: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
    

    并确保这些设置不会被任何无条件执行某些操作的 augroups 覆盖(即也修改其他 augroup 定义)。

    【讨论】:

    • autocmd BufRead *.m set ts=4 sw=4 expandtab 包含两个错误:1) 像$VIMRUNTIME/ftplugin 中的任何插件一样,使用setlocal 进行文件类型特定的设置; 2)不要重做$VIMRUNTIME/filetype.vim已经完成的工作:使用FileType matlab而不是BufRead *.m
    • @ZyX:由于这里设置的设置(ts、sw、expandtab)是缓冲区本地的,我认为应该没问题。 error 恕我直言,这个词太大了。
    • @ZyX:如果答案不是 100% 正确,我至少可以声称 它有效,并且我带回了自去年 3 月以来一直在挨饿的问题: -)
    • 当您开始在当前 vim 会话中编辑新文件并希望从您的 vimrc 中看到默认设置时出现问题,但实际上您看到的是 matlab 的设置。
    • 顺便说一下,*.m 扩展名指定objcmatlabmma 文件类型之一,而不仅仅是matlab。 $VIMRUNTIME/filetype.vim 知道这一点,你的脚本不知道。
    【解决方案3】:

    使用 ftplugins,配置 vim 会更容易实现。 见gVim and multiple programming languages

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多