Чи існує спосіб "взяти обидва" при використанні Vim як інструмента злиття?


11

Я також використовую Vim як тристоронній злиття з Git, і іноді потрібно вносити зміни як з місцевих, так і з віддалених гілок. kdiff3можна зробити це за допомогою декількох натискань клавіш, чи є спосіб це зробити у Vim?

Відповіді:


6

Не зовсім те, що ви просили, але це може бути корисним: Splice plugin: плагін Vim для вирішення конфліктів під час тристороннього злиття . Він має хороший демонстраційний показ на Vimeo .

Якщо ви збираєтеся дотримуватися вимдіффа за замовчуванням, ви можете створити функцію для отримання номера буфера для вікон, що надходять, і використовувати їх для виклику :diffgetдвічі:

                            *:diffg* *:diffget*
:[range]diffg[et] [bufspec]
        Modify the current buffer to undo difference with another
        buffer.  If [bufspec] is given, that buffer is used.  If
        [bufspec] refers to the current buffer then nothing happens.
        Otherwise this only works if there is one other buffer in diff

(...)

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")

Ви можете їм скористатися зіставленням, щоб призначити виклик цій функції клавішам, у яких ви використовувались kdiff3.

Додаткову інформацію можна знайти на цьому vimcast .


3

yank і put можуть працювати без плагінів чи додаткових функцій, хоча це, мабуть, трохи менш зручно, ніж dgабоdp

Просто скопіюйте потрібні біти з батьківських буферів і вставте їх у потрібне місце у об'єднаному буфері. Це також корисно, якщо ви хочете лише частину розрізного блоку, а не всю справу.

Можливо, вам часом доведеться змусити Vim оновлювати підсвічування різниці :diffupdate.


1

Щоб об'єднати зміни як із цільовими, так і злитими гілками в одній команді:

Ви можете просто видалити рядки за допомогою маркерів конфлікту Git. Наступні два способи видалити всі рядки, які починаються з:

<<<<<<<
=======
>>>>>>>

Спосіб 1: Введення вручну та виконання команди

:g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d

Спосіб 2: Реалізація визначеної користувачем команди

"Delete all Git conflict markers
"Creates the command :GremoveConflictMarkers
function! RemoveConflictMarkers() range
  echom a:firstline.'-'.a:lastline
  execute a:firstline.','.a:lastline . ' g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d'
endfunction
"-range=% default is whole file
command! -range=% GremoveConflictMarkers <line1>,<line2>call RemoveConflictMarkers()

Vim diffget і diffput будуть вибирати лише одну гілку або іншу. Тож єдине реальне рішення, окрім наведеного вище, - це вручну витягнути та вставити з обох файлів у робочу копію.


Укажіть причину, якщо ви збираєтесь звернутись до голосування.
користувач3751385

Це все, що я роблю - просто видаляю маркери.
Аарон Макміллін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.