如何配置vim以条件性设置软制表符?

10 投票
3 回答
923 浏览
提问于 2025-04-17 20:51

我现在会用Python和Ruby这两种语言,想要根据我正在使用的文件类型来调整我的.vimrc文件里的设置。

对于Ruby,我需要把tabstop=2softtabstop=2设置成2;而对于Python,我需要把tabstop=4softtabstop=4设置成4。我在网上找了很多资料,但还是不知道该怎么做。有没有人知道怎么判断文件的扩展名?

3 个回答

3

你需要根据文件类型来设置,像这样:

au FileType ruby set tabstop=2 softtabstop=2
au FileType python set expandtab tabstop=4 softtabstop=4

这段代码应该放在你的 .vimrc 文件里,或者放在任何在它之后加载的文件中。

4

首先,比较麻烦的方法:

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/ 中的脚本。

这些地方是设置特定文件类型的最合适位置。

9

确保你的 ~/.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

(我添加了 shiftwidthexpandtab,因为你几乎肯定也想要这些设置。)

Vim 会自动识别文件类型,然后根据文件类型运行相应的配置文件。这很好,因为这样可以让你的 ~/.vimrc 文件保持简洁。你可以为 Vim 识别的任何文件类型这样做。当你在编辑文件时,可以使用 :set filetype? 来查看 Vim 认为这是什么类型的文件。

撰写回答