Vim中的expandtab - 特别是在Python文件中

时间:2017-05-20 17:19:08

标签: python vim

我完全剥离了我的配置,我留下了以下的CONFIG_PREEMPT_NONE

~/.vimrc

如果我打开一个python文件,然后检查filetype plugin indent on 设置,我会看到它继承了正确的设置(我认为来自expandtab):

/usr/share/vim/vim74/ftplugin/python.vim:49

问题是当我在命令行上打开多个文件时(例如:setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8 ),或者当我从vim a.py b.py内打开多个窗口时。

以下是我进行实验的一些步骤,以及vim的相应结果。

  • :set expandtab?
    • 显示一个包含vim a.py b.py a.py
    • 的缓冲区
    • expandtab - 纵向拆分,两个缓冲区都有C-w va.py
    • expandtab - 现在包含:n的缓冲区为b.py,其他缓冲区为noexpandtab
  • expandtab
    • 显示一个包含vim a.py a.py
    • 的缓冲区
    • expandtab - 纵向拆分,两个缓冲区都有C-w va.py
    • expandtab - 刚刚加载:e b.py的缓冲区为b.py,另一个保留为noexpandtab
  • expandtab
    • 一个空缓冲区,vim
    • noexpandtab - 加载:e a.pya.py
    • expandtab - 加载:e b.pyb.py
  • noexpandtab
    • 显示一个包含vim z.txt a.py b.py z.txt
    • 的缓冲区
    • noexpandtab - 已加载:na.py
    • expandtab - 已加载:nb.py

有人能理解这个吗?甚至重现它?

正如最后两个实验所示,不仅仅是离开初始缓冲区导致此行为的行为...... noexpandtab的第一个文件表现出来,其他文件没有。

以下是filetype=python的输出,我正在运行Ubuntu Server 14.04.5 LTS。

vim --version

1 个答案:

答案 0 :(得分:0)

问题是由于/usr/share/vim/vim74/ftplugin/python.vim中包含在Ubuntu 14.04.5(可能还有其他版本)中的错误。

要纠正,我已应用以下补丁: see pastebin(对于标签来说并不好用)

curl https://pastebin.com/raw/RyVB9mJH | sudo patch -d /usr/share/vim/vim74 -p1

我要感谢@DanLowe:

  1. 确认他可以重现这个,
  2. 从OSX安装中提供他的/usr/share/vim个文件供我查看
  3. 说明:

    Ubuntu打包的ftplugin/python.vim包含以下内容:

    if exists('*<SID>Python_jump') | finish | endif
    

    这将检查是否存在名为Python_jump的脚本本地函数 - 如果它存在,它将会纾困。

    稍后在文件中我们找到了有用的配置,特别是:

    setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8
    

    这完全解释了为什么第一个Python文件有expandtab,而其他所有文件都有noexpandtab

    相比之下,Dan提供的ftplugin/python.vim的OSX版本在测试中包含脚本本地Python_jump声明,如果它已经定义,则只是跳过它,并继续其余设置。

    if !exists('*<SID>Python_jump')
      fun! <SID>Python_jump(motion) range
          let cnt = v:count1
          let save = @/    " save last search pattern
          mark '
          while cnt > 0
              silent! exe a:motion
              let cnt = cnt - 1
          endwhile
          call histdel('/', -1)
          let @/ = save    " restore last search pattern
      endfun
    endif
    

    vim74/debian.vim中的以下行显示了这种蛮力的努力:

    set runtimepath=~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/vim74,/usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after
    

    是的,这是正确的......您可能正在设置的VIM环境变量被强行覆盖。 Yay \ o /