我发现我的 vim 有一个特殊的行为:它执行每个 diff 命令两次,我不知道为什么。
(我在 Windows 上运行它,我怀疑这与它有关。)根据答案,它没有。
所以我在我的 vimrc 中有这个:
set diffexpr=MyDiff()
function! DoubleQuoteCond(s)
return a:s =~ ' ' ? '"' . a:s . '"' : a:s
endfunction
function! MyDiff()
if &shell =~ '\<cmd'
let prog = DoubleQuoteCond($VIMRUNTIME . '\diff')
else
let prog = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff')
endif
let opt = '-a --binary'
if &diffopt =~ 'icase' | let opt .= ' -i' | endif
if &diffopt =~ 'iwhite' | let opt .= ' -b' | endif
let file1 = DoubleQuoteCond(v:fname_in)
let file2 = DoubleQuoteCond(v:fname_new)
let file3 = DoubleQuoteCond(v:fname_out)
let cmdline = join([prog, opt, file1, file2, '>', file3], ' ')
" no silent execute for debugging reasons
execute '!' . cmdline
endfunction
构建cmdline
这样一个非常简单的函数:
"C:\Program Files\Vim\vim\diff" -a --binary C:\Temp\VIoCC20.tmp C:\Temp\VInCC21.tmp > C:\Temp\VIdCC22.tmp
现在发生这种情况:
- 执行这个cmdline,弹出一个cmd窗口,文件
VIdCC22.tmp
就创建好了。
由于不是,silent execute
我必须按 Enter 键才能继续。 - 在那之后 vim再次执行相同的操作,就好像
MyDiff()
被调用了两次一样。 - 现在 vim 获取 diff 输出并按预期显示它。
当我设置diffexpr
为''
diff 时,shell 命令只执行一次。
第二次执行从何而来?我能做些什么来防止它(当然,除了不使用 custom diffexpr
)?