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
)?
無賴!我沒有看過這些文件的內容。我將如何使命令執行短路?我的意思是,vim希望輸出文件看起來有某種特定的方式,所以我不得不讓它做它的事情,對不對? – Tomalak 2013-04-08 16:38:27
我已經爲我的答案添加了一個示例實現。 – 2013-04-09 06:36:54
我想vim會在第一次調用MyDiff()後讀取'v:fname_out'的內容,所以不執行測試命令不會幫助我。 – Tomalak 2013-04-09 06:50:02