Я нашел своеобразное поведение с моим 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
Я добавил пример реализации к моему ответу. –
Я полагаю, что vim читает содержимое 'v: fname_out' после первого вызова' MyDiff() ', поэтому не выполнять тестовую команду мне не поможет. – Tomalak