2

我发现我的 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)?

4

1 回答 1

2

当你设置'diffexpr'

如果 diff 输出看起来没问题,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
于 2013-04-08T16:22:20.493 回答