如何配置vim以条件性设置软制表符?
我现在会用Python和Ruby这两种语言,想要根据我正在使用的文件类型来调整我的.vimrc文件里的设置。
对于Ruby,我需要把tabstop=2
和softtabstop=2
设置成2;而对于Python,我需要把tabstop=4
和softtabstop=4
设置成4。我在网上找了很多资料,但还是不知道该怎么做。有没有人知道怎么判断文件的扩展名?
3 个回答
你需要根据文件类型来设置,像这样:
au FileType ruby set tabstop=2 softtabstop=2
au FileType python set expandtab tabstop=4 softtabstop=4
这段代码应该放在你的 .vimrc 文件里,或者放在任何在它之后加载的文件中。
首先,比较麻烦的方法:
autocmd FileType ruby setlocal tabstop=2 softtabstop=2
autocmd FileType python setlocal expandtab tabstop=4 softtabstop=4
你需要使用 setlocal
来确保这些设置不会影响到其他的缓冲区。
接下来,稍微好一点的方法:
augroup filetypes
autocmd!
autocmd FileType ruby setlocal tabstop=2 softtabstop=2
autocmd FileType python setlocal expandtab tabstop=4 softtabstop=4
augroup END
使用命名的 augroup
可以帮助你更好地整理你的 ~/.vimrc
文件,而且在需要的时候也可以一次性启用或禁用。
当你重新加载你的 ~/.vimrc
文件时,尤其是你经常修改的时候,autocmd
不会替换掉之前的命令,而是会不断地添加,这可能会导致一些严重的问题。使用 autocmd!
可以在添加新的命令之前,先清除当前 augroup
中的所有 autocmd
,这样可以避免出现问题。
最后,比较干净的方法:
在 ~/.vim/after/ftplugin/ruby.vim
文件中添加以下几行:
setlocal tabstop=2
setlocal softtabstop=2
在 ~/.vim/after/ftplugin/python.vim
文件中添加以下几行:
setlocal expandtab
setlocal tabstop=4
setlocal softtabstop=4
即使你把它们整理得很干净,并且使用 autocmd!
来防止命令堆积,绑定到 FileType
事件的 autocmd
仍然会出现问题:它们会重复 Vim 内置的文件类型检测机制。假设你在 ~/.vimrc
中启用了 filetype plugin indent on
,这个机制会根据你缓冲区的 FileType
来反应,并尝试加载 ~/.vim/ftplugin/
和 ~/.vim/after/ftplugin/
中的脚本。
这些地方是设置特定文件类型的最合适位置。
确保你的 ~/.vimrc
文件里有以下内容:
filetype plugin on
然后在 ~/.vim/ftplugin
目录下创建这两个文件:
在 ~/.vim/ftplugin/python.vim
文件里:
setlocal tabstop=4 softtabstop=4 shiftwidth=4 expandtab
在 ~/.vim/ftplugin/ruby.vim
文件里:
setlocal tabstop=2 softtabstop=2 shiftwidth=2 expandtab
(我添加了 shiftwidth
和 expandtab
,因为你几乎肯定也想要这些设置。)
Vim 会自动识别文件类型,然后根据文件类型运行相应的配置文件。这很好,因为这样可以让你的 ~/.vimrc
文件保持简洁。你可以为 Vim 识别的任何文件类型这样做。当你在编辑文件时,可以使用 :set filetype?
来查看 Vim 认为这是什么类型的文件。