我发现我的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
现在发生这种情况:
VIdCC22.tmp
由于它不是silent execute
,我必须按Enter继续。MyDiff()
被调用两次一样。 当我将diffexpr
设置为''
时,diff shell命令只执行一次。
第二次执行来自哪里?我该怎么做才能阻止它(当然,除了不使用自定义diffexpr
之外)?
答案 0 :(得分:2)
设置'diffexpr'
如果差异输出看起来不错,Vim会做一个测试。
(来自:help E810
。)
你无法避免这种情况。但是,您可以检查测试,因为Vim传递了常量的虚拟文件内容(分别为“line1”和“line2”),并且在这种情况下使外部命令执行短路,如下所示:
if
\ getfsize(v:fname_in) <= 6 &&
\ getfsize(v:fname_new) <= 6 &&
\ readfile(v:fname_in, 0, 1)[0] ==# 'line1' &&
\ readfile(v:fname_new, 0, 1)[0] ==# 'line2'
return
endif