繁体   English   中英

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

[英]expandtab in Vim - specifically in Python files

我完全剥离了我的配置,我留下了以下的简单~/.vimrc

filetype plugin indent on

如果我打开一个python文件,然后检查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
    • 显示一个包含带有expandtab a.py缓冲区
    • Cw v - 垂直拆分,两个缓冲区都有a.pyexpandtab
    • :n - 现在包含b.py的缓冲区有noexpandtab ,另一个用expandtab保留
  • vim a.py
    • 显示一个包含带有expandtab a.py缓冲区
    • Cw v - 垂直拆分,两个缓冲区都有a.pyexpandtab
    • :e b.py - 刚刚加载的缓冲区b.pynoexpandtab ,另一个用expandtab保留
  • vim
    • 一个空缓冲区,带有noexpandtab
    • :e a.py - 加载了a.py ,带有expandtab
    • :e b.py - 加载b.py ,带有noexpandtab
  • vim z.txt a.py b.py
    • 一个缓冲器显示包含z.txtnoexpandtab
    • :n - 加载a.pyexpandtab
    • :n - 加载b.pynoexpandtab

任何人都可以理解这个吗? 甚至重现它?

正如最后两个实验所示,这不仅仅是让初始缓冲区导致这种情况的行为......第一个文件带有filetype=python ,其他文件没有。


下面是vim --version的输出,我正在运行Ubuntu Server 14.04.5 LTS。

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:43:18)
Included patches: 1-52
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Huge version without GUI.  Features included (+) or not (-):
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
-balloon_eval    +float           +mouse_urxvt     -tag_any_white
-browse          +folding         +mouse_xterm     -tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+cindent         +gettext         -mzscheme        +textobjects
-clientserver    -hangul_input    +netbeans_intg   +title
-clipboard       +iconv           +path_extra      -toolbar
+cmdline_compl   +insert_expand   -perl            +user_commands
+cmdline_hist    +jumplist        +persistent_undo +vertsplit
+cmdline_info    +keymap          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con      -lua             +rightleft       +windows
+diff            +menu            -ruby            +writebackup
+digraphs        +mksession       +scrollbind      -X11
-dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     -xim
+emacs_tags      -mouseshape      -sniff           -xsmp
+eval            +mouse_dec       +startuptime     -xterm_clipboard
+ex_extra        +mouse_gpm       +statusline      -xterm_save
+extra_search    -mouse_jsbterm   -sun_workshop    -xpm
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Linking: gcc   -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed -o vim        -lm -ltinfo -lnsl  -lselinux  -lacl -lattr -lgpm -ldl    -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions      

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

为了纠正,我已经应用了以下补丁: 请参阅pastebin (SO与标签不兼容)

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

我要感谢@DanLowe:

  1. 确认他可以重现这一点,并且
  2. 从OSX安装中提供他/usr/share/vim文件供我查看

说明:

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提供的OSX版本的ftplugin/python.vim在测试中包含脚本本地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环境变量被强行覆盖。 耶/ o /

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM