vim两次执行diff命令

时间:2013-04-08 15:58:24

标签: vim diff

我发现我的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命令只执行一次。

第二次执行来自哪里?我该怎么做才能阻止它(当然,除了不使用自定义diffexpr之外)?

1 个答案:

答案 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