打开* second *文件时Vim不遵循配置

时间:2018-02-12 21:35:27

标签: ubuntu vim windows-subsystem-for-linux

基本上,我的配置似乎适用于我打开的第一个文件,但是当我打开后续文件时,它不能按预期工作。我特意遇到Python文件的问题,但考虑到问题的本质,我猜它可能存在于其他文件中。

我的.vimrc中的python配置如下

au BufNewFile,BufRead *.py
    \ set tabstop=4     |
    \ set softtabstop=4 |
    \ set shiftwidth=4  |
    \ set textwidth=89  |  " PEP-8 prefers 80
    \ set expandtab     |
    \ set autoindent    |
    \ set foldmethod=syntax
au BufNewFile *.py set fileformat=unix

当我第一次编辑新的python文件时,expandtabs设置没问题。但是,当我从vim中打开第二个python文件时,它会打开文件并将其标识为python文件(filetype=python),但expandtab已关闭!如果我打开第三,第四或第五个文件,也会发生同样的情况。

现在,如果我改为启动Vim编辑第二个python文件,expandtab已正确设置!但是,当我打开第一个python文件进行编辑时,expandtab关闭。即使我启动Vim编辑两个文件(例如从bash运行vim margins.py marginsio.py),第一个缓冲区已按预期设置expandtab,但第二个缓冲区没有设置expandtab。现在,如果我使用非python文件启动Vim然后打开python文件进行编辑,则python文件具有expandtab。但是,我打开的任何后续python文件都没有设置expandtab

最后,如果我运行vim,说vim margins.py,然后打开一个新的python文件marginsio.py(当我打开它时没有设置expandtab),然后关闭 margins.py,然后从vim中重新打开margins.py,margins.py设置了expandtab

在适用于Linux的Windows子系统(在Windows 10上)上的Ubuntu 14.04.5上运行Vim 7.4。我假设WSL在这里没有效果,但我已经使用Vim很多年了,从来没有(明知)遇到过这个问题。我的.vimrc或任何〜/ .vim / configs都没有set noexpandtab,如果我在没有插件的情况下运行vim,问题仍然存在。

2 个答案:

答案 0 :(得分:2)

我无法重现您在第一个文件中应用设置而不是后续文件的问题,但我想我可以帮您调试它。

首先,尝试在没有其他配置的情况下进行测试。创建一个名为testvimrc的文件,其中仅包含:

set nocompatible

au BufNewFile,BufRead *.py
        \ set tabstop=4     |
        \ set softtabstop=4 |
        \ set shiftwidth=4  |
        \ set textwidth=89  |
        \ set expandtab     |
        \ set autoindent    |
        \ set foldmethod=syntax
au BufNewFile *.py set fileformat=unix

然后以

开始vim
vim -u testvimrc somefile.py

看看你是否还有你所描述的行为。如果我这样做,所有Python文件都使用指定的设置,无论是通过命令行加载,还是从Vim内部手动加载。这让我相信问题出在你配置的其他地方。

要弄清楚可能发生的事情,可以使用verbose命令。回到正常的Vim配置(这次不要使用-u testvimrc)。要查看上次设置的内容expandtab

:verbose set expandtab?

应该回复类似

的内容
  expandtab
        Last set from ~/.vimrc

如果你看到其他任何内容,你就会知道它被覆盖的地方。您可能会看到类似

的内容
Last set from /usr/share/vim80/ftplugin/python.vim

这将帮助您确定有问题的插件或其他冲突源。如果是这种情况,更改.vimrc中的设置顺序可能会有所帮助。

然而,有一个更好的解决方案。

如果要覆盖特定于类型的设置,则可以使用内置支持。上面有一个提示,在python.vim行:Vim已经知道你在编辑Python文件的时候,它会查找匹配的ftplugin。首先它应用它所分配的那个(对我来说,/usr/share/vim80/ftplugin/python.vim)。然后它会在runtimepath中查找覆盖。默认情况下,runtimepath中的 last 目录为~/.vim/after,这意味着其中的任何内容都将覆盖所有先前的设置。

创建文件~/.vim/after/ftplugin/python.vim并覆盖其中的设置。您应该使用setlocal而不是set,以便它只影响Python缓冲区。把它放在里面:

setlocal tabstop=4
setlocal softtabstop=4
setlocal shiftwidth=4
setlocal textwidth=89
setlocal expandtab
setlocal autoindent
setlocal foldmethod=syntax
setlocal fileformat=unix

现在,无论何时加载或创建filetype=python的缓冲区,都会应用这些设置,覆盖任何其他插件或冲突源的设置。您可以再次运行:verbose set来验证您的设置是否正在使用。

答案 1 :(得分:0)

在尝试将我的问题缩减到基本部分时,我在原始帖子中省略了我的python配置第5行上显然非常重要的注释。 似乎当Vim遇到评论时,它会结束自动命令。由于一个未知的原因,当Vim第一次打开.py文件时,一些默认行为导致它运行expandtab。但是,第二次打开.py文件时没有发生这种情况,因此自动命令已运行,但在set textwidth=89过早结束,并且expandtab从未设置过。

根据Jim Stewart的优秀答案,我尝试将其归结为基本要素,并且在我将其分解为我自动命令之外的一堆setlocal之前没有任何运气修复。当我将这些setlocal带入一个自动命令时,我的问题得到解决!我将其缩小到唯一的区别是缺乏评论。在我的配置中查看注释似乎表明注释只是在注释所在的行上切断了自动命令。