为什么在Python文件中vim不遵循我的expandtab设置?

26
安装了Vundle之后,我的vim不再遵循我先前的expandtab设置。我的制表符设置为2个空格,但是在Python文件中现在不再这样做了。问题由此行引起:

安装了Vundle之后,我的vim不再遵循我先前的expandtab设置。我的制表符设置为2个空格,但是在Python文件中现在不再这样做了。问题由此行引起:

filetype plugin on

这行代码是干什么用的(vundle插件需要它)?另外,我该怎样确保我的设置被遵守?

谢谢!

VIMRC: pastebin.com/tGmfCi78

2个回答

30

问题在于您的设置被 Vim 的文件类型插件覆盖了。具体而言,问题出在 ftplugin/python.vim 文件中:

" As suggested by PEP8.
setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8

Python插件默认尝试使您的源代码符合PEP8规范,因此它正在调整制表位。您可能需要一些这些插件所提供的功能,但是您可能需要设置自己的自动命令来修复您不喜欢的任何内容。

有两种方法可以做到这一点。如果您有一个~/.vim文件夹,则最简单的方法是添加文件~/.vim/after/ftplugin/python.vim:

" Here, you can set the setting directly, or call a command or function
" to help you.  We'll call a command, and then implement that command in
" your top-level vimrc to help keep things in one place.
SetupPython

在你的.vimrc文件中添加:
function! SetupPython()
    " Here, you can have the final say on what is set.  So
    " fixup any settings you don't like.
    setlocal softtabstop=2
    setlocal tabstop=2
    setlocal shiftwidth=2
endfunction
command! -bar SetupPython call SetupPython()

后面的代码片段允许您在after文件中使用SetupPython而不是call SetupPython()
另一种方法是将所有内容保留在.vimrc中,但您可以使用VimEnter自动命令为python设置FileType自动命令以设置您的首选项。等到触发VimEnter时,所有其他插件都有足够的时间设置它们的自动命令,因此您的自动命令将被添加到列表的末尾。这使您能够在运行python插件的FileType自动命令之后运行并设置自己的设置。然而,这有点混乱,上述的after/机制是首选的方法。
值得一提的是,我将许多常见设置保存在一个SetupSource()函数中,以便从许多不同的FileType中调用。然后,我会让SetupPython()调用SetupSource()。这有助于使特定函数更加清晰,并减少一些重复。如果需要,可以查看我的vimfiles中的函数:https://github.com/jszakmeister/vimfiles/blob/master/vimrc#L5328

我建议在ftplugins中使用setlocal而不是set。 - FDinoff
13
请注意,最新版本的 python.vim 可以通过设置以下内容关闭 PEP-8 风格: let g:python_recommended_style=0。另请参见:https://github.com/sullyj3/vim-ftplugin-python/blob/73bf4ed079b50f6c7259f81e02b6cca42fdc4ca3/python.vim#L59 - Maarten
JFTR,当我总是使用tabstop=4时,python.vim设置了tabstop=8。 - Sérgio
1
你不想把setlocal调用放在after/python.vim中,而是在另一个文件中调用函数,这有什么原因吗? - Seth
1
@Seth 很好的问题。在我的情况下,vimfiles是由许多人共享的,因此覆盖一个函数并最终得到你想要的东西更容易。否则,没有任何优势。 - John Szakmeister

1

覆盖的设置

可能是由语言特定的设置覆盖了设置。有关更多信息,请参见http://vim.wikia.com/wiki/Keep_your_vimrc_file_clean:

快速入门的方法是将所有语言特定的内容从您的.vimrc文件中移动到名为.vim / ftplugin / language.vim(或Windows上的$ HOME / vimfiles / ftplugin / language.vim)的文件中。

在这些位置检查特定于Python的.vim文件。

Filetype on

Vundle似乎需要filetype off,我不确定是否应该重新打开它。在Vundle的github issues page上有一个线程解释为什么需要filetype on。也许这会提供一些见解。

我认为在 filetype plugin indent on 之后加上 filetype on 是多余的。根据 vim 帮助文档,前者打开文件类型检测、插件和缩进功能,而后者只打开文件类型检测,不影响插件和缩进功能:
Overview:                   *:filetype-overview*

command                     detection       plugin          indent

:filetype on                on              unchanged       unchanged
:filetype off               off             unchanged       unchanged
:filetype plugin on         on              on              unchanged
:filetype plugin off        unchanged       off             unchanged
:filetype indent on         on              unchanged       on
:filetype indent off        unchanged       unchanged       off
:filetype plugin indent on  on              on              on
:filetype plugin indent off unchanged       off             off

这是我的vimrc:http://pastebin.com/tGmfCi78。我没有任何具体的语言设置。你知道有什么问题吗? - u_ser722345
通常最好编辑您的问题以包括 .vimrc 的内容。 - Jon
那仍然是一个链接。我说的是内容。原因是pastebin可能不会一直存在。 :) - Jon
这好像有点过头了,你不觉得吗?它有60行的代码,让页面难以浏览。 - u_ser722345
请参见http://meta.stackexchange.com/questions/80978/questions-linking-to-external-web-sites-instead-of-showing-code。您应该包含内容。 - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接