Czy istnieje sposób na „wzięcie obu” podczas używania Vima jako narzędzia do scalania?

11

Używam Vima jako 3-kierunkowego połączenia z Git i czasami muszę wprowadzać zmiany zarówno z lokalnych, jak i zdalnych oddziałów. kdiff3można to zrobić za pomocą kilku naciśnięć klawiszy, czy jest na to sposób w Vimie?

synapsa
źródło

Odpowiedzi:

6

Niezupełnie to, o co prosiłeś, ale może okazać się przydatne: Wtyczka splice: wtyczka Vima do rozwiązywania konfliktów podczas łączenia trójstronnego . Ma fajny zrzut ekranu demonstracyjnego na Vimeo .

Jeśli masz zamiar pozostać przy domyślnym vimdiff, możesz utworzyć funkcję pobierania numeru bufora dla otaczających go okien i użyć ich do :diffgetdwukrotnego wywołania :

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

Możesz użyć mapowania, aby przypisać wywołanie tej funkcji do klawiszy, w których byłeś używany kdiff3.

Możesz znaleźć dalsze informacje na temat tego vimcastu .

mMontu
źródło
3

yank i put może działać bez żadnych wtyczek i dodatkowych funkcji, choć może jest to nieco mniej wygodne niż dglubdp

Po prostu skopiuj potrzebne bity z buforów nadrzędnych i wklej je w odpowiednie miejsce w scalonym buforze. Jest to również przydatne, jeśli chcesz tylko część bloku różnicowego, a nie całość.

Czasami możesz potrzebować zmusić Vima do zaktualizowania podświetlania różnic :diffupdate.

8bittree
źródło
1

Aby połączyć zmiany z gałęzi docelowej i scalającej w jednym poleceniu:

Możesz po prostu usunąć linie ze znacznikami konfliktu Git. Poniższe dwie metody usuną wszystkie linie zaczynające się od:

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

Metoda 1: Ręczne wprowadzanie i wykonywanie polecenia

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

Metoda 2: Implementacja polecenia zdefiniowanego przez użytkownika

"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 i diffput wybiorą tylko jedną gałąź lub drugą. Tak więc jedynym prawdziwym rozwiązaniem innym niż to podane powyżej jest ręczne szarpanie i wklejanie obu plików do kopii roboczej.

użytkownik3751385
źródło
Podaj powód, dla którego zamierzasz głosować negatywnie.
user3751385
To wszystko, co robię - wystarczy usunąć znaczniki.
Aaron McMillin