diffput для нескольких буферов?
Иногда при редактировании трех файлов vimdiff
Я хочу скопировать кусок из одного файла в оба других. Обычно это можно сделать так:
:diffput 2
:diffput 3
Тем не мение, :help diffput
говорит это:
*:diffpu* *:diffput* *E793*
:[range]diffpu[t] [bufspec]
Это делает меня любопытным, bufspec
позволяет указать более одного буфера. Я попытался использовать документы, а затем просто угадал, но не повезло.
:help bufspec
:diffput 2,3
:diffput 2 3
Можно ли указать более одного буфера в diffput
команда?
5 ответов
Принятый ответ требует от вас указать, какие буферы будут получать разницу. Исходя из формулировки вашего вопроса, это звучит так, как будто вы хотите перенести изменение в любой другой буфер (например, если у вас было 10 буферов различий - после перекомпиляции vim - вам нужно было бы преобразовать в буферы 1,2,3,4,5,6,7,8,9)
Я использую следующее, чтобы передать все буферы:
function! GetDiffBuffers()
return map(filter(range(1, winnr('$')), 'getwinvar(v:val, "&diff")'), 'winbufnr(v:val)')
endfunction
function! DiffPutAll()
for bufspec in GetDiffBuffers()
execute 'diffput' bufspec
endfor
endfunction
command! -range=-1 -nargs=* DPA call DiffPutAll()
а потом просто беги :DPA
нажать на все буферы.
Нет, это не так, но ничто не мешает вам написать собственную расширенную команду:
command! -range=-1 -nargs=+ Diffput for bufspec in [<f-args>] | execute (<count> == -1 ? '' : '<line1>,<line2>') . 'diffput' bufspec | endfor
Вот что я использую, когда сливаюсь с 3 буферами через vimdiff. Он всегда будет включать текущий буфер (как неактивный)
:diffput 1 | diffput 2 | diffput 3 | diffu
Я использую только 3 файла максимум, но если вы хотите поддерживать различные объемы буфера, вы можете использовать псевдоним вышеупомянутой команды (например, :dp3
) и затем аналогично добавьте еще несколько буферов (dp4, dp5, ...)
Как сказал @glts, нет, это невозможно.
Помощь от :exec 'helpg bufspec' | clast
говорит это
The [bufspec] argument above can be a buffer number, a pattern for a buffer
name or a part of a buffer name. Examples:
:diffget Use the other buffer which is in diff mode
:diffget 3 Use buffer 3
:diffget v2 Use the buffer which matches "v2" and is in
diff mode (e.g., "file.c.v2")
Чтобы расширить решение Инго:
command! -range=-1 -nargs=+ DG for bufspec in [<f-args>] | execute (<count> == -1 ? '' : '<line1>,<line2>') . 'diffget' bufspec | endfor
command! -range=-1 -nargs=* DGA for bufspec in map(filter(range(1, winnr('$')), 'getwinvar(v:val, "&diff")'), 'winbufnr(v:val)') | execute (<count> == -1 ? '' : '<line1>,<line2>') . 'diffget' bufspec | endfor
command! -range=-1 -nargs=+ DP for bufspec in [<f-args>] | execute (<count> == -1 ? '' : '<line1>,<line2>') . 'diffput' bufspec | endfor
command! -range=-1 -nargs=* DPA for bufspec in map(filter(range(1, winnr('$')), 'getwinvar(v:val, "&diff")'), 'winbufnr(v:val)') | execute (<count> == -1 ? '' : '<line1>,<line2>') . 'diffput' bufspec | endfor