2013-04-08 3 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.)

Вы не можете избежать этого. Тем не менее, вы можете проверить для теста, так как Вьет проходит постоянное содержание фиктивного файла («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 
+0

Лентяй ! Я не смотрел содержимое файлов. Как мне сократить время выполнения команды? Я имею в виду, что vim ожидает, что выходной файл будет выглядеть определенным образом, поэтому я должен был бы позволить ему делать это, не так ли? – Tomalak

+0

Я добавил пример реализации к моему ответу. –

+0

Я полагаю, что vim читает содержимое 'v: fname_out' после первого вызова' MyDiff() ', поэтому не выполнять тестовую команду мне не поможет. – Tomalak

Смежные вопросы