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
Другие вопросы по тегам