为什么vim不遵守python文件中的expandtab?

时间:2014-01-12 10:16:39

标签: vim indentation

安装Vundle后,我的vim不再遵循我的expandtab设置。我的标签设置为2个空格,但现在在python文件中它不再这样做。这条线正在调用这个问题:

filetype plugin on

这条线做什么(vundle要求)?另外,我该怎么做才能确保我的设置得到遵守?

谢谢!

VIMRC:pastebin.com/tGmfCi78

2 个答案:

答案 0 :(得分:22)

问题是你的设置被一个属于Vim的文件类型插件覆盖。问题出在ftplugin/python.vim

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

python插件默认尝试将源代码设置为符合PEP8,因此它正在调整tabstop。您将需要这些插件提供的一些功能,但您可能需要设置自己的自动命令来修复您不喜欢的任何内容。

有两种方法可以做到这一点。如果您有~/.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()

后一位只允许您在后文件中将该函数称为SetupPython而不是call SetupPython()

另一种方法是保留.vimrc中的所有内容,但是使用VimEnter自动命令为python设置FileType自动命令以设置首选项。通过等待VimEnter被触发,所有其他插件将有时间设置其自动命令,因此您的将被添加到列表的末尾。这允许您在python插件的FileType自动命令之后运行并设置您自己的设置。这有点乱,上面的after/机制是这样做的首选方式。

FWIW,我保留在SetupSource()函数中的许多常见设置可以从许多不同的FileType调用。然后我会SetupPython()致电SetupSource()。这有助于保持特定功能更清洁并减少一些重复。如果有帮助,请在此处查看我的vimfiles中的功能:https://github.com/jszakmeister/vimfiles/blob/master/vimrc#L5328

答案 1 :(得分:1)

重写设置

可能是语言特定设置覆盖了设置。有关详细信息,请参阅http://vim.wikia.com/wiki/Keep_your_vimrc_file_clean

  

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

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

文件类型

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

我还认为让filetype plugin indent on后跟filetype on更加重要。根据{{​​3}},前者将检测,插件和缩进打开,后者打开检测并保持插件和缩进不变:

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