2013-04-08 175 views
2

我在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)?

回答

2

當您設置'diffexpr'

Vim將測試如果差異輸出看上去。

(這是:help E810

你不能避免這種情況。但是,可以檢查該測試,以Vim經過恆定僞文件內容(「第1行」和「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 
+0

無賴!我沒有看過這些文件的內容。我將如何使命令執行短路?我的意思是,vim希望輸出文件看起來有某種特定的方式,所以我不得不讓它做它的事情,對不對? – Tomalak 2013-04-08 16:38:27

+0

我已經爲我的答案添加了一個示例實現。 – 2013-04-09 06:36:54

+0

我想vim會在第一次調用MyDiff()後讀取'v:fname_out'的內容,所以不執行測試命令不會幫助我。 – Tomalak 2013-04-09 06:50:02