6

有时在使用编辑三个文件时,vimdiff我想将一个文件中的一个大块复制到另外两个文件中。通常这会像这样完成:

:diffput 2
:diffput 3

然而,:help diffput这样说:

                        *:diffpu* *:diffput* *E793*
:[range]diffpu[t] [bufspec]

这让我很好奇是否bufspec允许您指定多个缓冲区。我尝试使用文档,然后只是猜测,但没有运气。

:help bufspec
:diffput 2,3
:diffput 2 3

是否可以在一个命令中指定多个缓冲区diffput

4

5 回答 5

3

不,它没有,但没有什么能阻止您编写自己的扩展命令:

command! -range=-1 -nargs=+ Diffput for bufspec in [<f-args>] | execute (<count> == -1 ? '' : '<line1>,<line2>') . 'diffput' bufspec | endfor
于 2013-10-25T18:52:45.253 回答
2

接受的答案要求您指定哪些缓冲区将接收差异。从您的问题措辞来看,听起来您想将更改推送到每个其他缓冲区(例如,如果您有 10 个差异缓冲区 - 在重新编译 vim 之后 - 您需要 diffput 到缓冲区 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以推送到所有缓冲区。

于 2013-11-11T20:22:45.307 回答
1

这是我通过 vimdiff 与 3 个缓冲区合并时使用的内容。它总是包含当前缓冲区(作为无操作)

:diffput 1 | diffput 2 | diffput 3 | diffu

我最多只使用 3 个文件,但如果您想支持各种缓冲量,您可以为上述命令(例如:dp3)起别名,然后类似地为更多缓冲量(dp4、dp5、...)起别名

于 2017-10-17T00:20:29.623 回答
0

正如@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")
于 2013-10-25T18:40:06.150 回答
0

要扩展 Ingo 的解决方案:

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
于 2015-02-20T15:40:35.740 回答