[英]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.py
和expandtab
:n
- 现在包含b.py
的缓冲区有noexpandtab
,另一个用expandtab
保留 vim a.py
expandtab
a.py
缓冲区 Cw v
- 垂直拆分,两个缓冲区都有a.py
和expandtab
:e b.py
- 刚刚加载的缓冲区b.py
有noexpandtab
,另一个用expandtab
保留 vim
noexpandtab
:e a.py
- 加载了a.py
,带有expandtab
:e b.py
- 加载b.py
,带有noexpandtab
vim z.txt a.py b.py
z.txt
与noexpandtab
:n
- 加载a.py
有expandtab
:n
- 加载b.py
有noexpandtab
任何人都可以理解这个吗? 甚至重现它?
正如最后两个实验所示,这不仅仅是让初始缓冲区导致这种情况的行为......第一个文件带有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:
/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.