C'è un modo per "prendere entrambi" quando si utilizza Vim come strumento di unione?


11

Sto usando Vim come unione a 3 vie anche con Git e a volte ho bisogno di prendere le modifiche da entrambe le filiali locali e remote. kdiff3posso farlo con un paio di pressioni di tasti, c'è un modo per farlo in Vim?

Risposte:


6

Non esattamente quello che hai chiesto, ma potresti trovare questo utile: Plugin Splice: un plug-in Vim per la risoluzione dei conflitti durante l'unione a tre vie . Ha una bella demo screencast su Vimeo .

Se hai intenzione di rimanere con il vimdiff predefinito puoi creare una funzione per recuperare il numero di buffer per le finestre circostanti e usarli per chiamare :diffgetdue volte:

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

Potresti usare una mappatura per assegnare una chiamata a questa funzione ai tasti in cui sei stato usato kdiff3.

Puoi trovare ulteriori informazioni su questo vimcast .


3

yank e put possono funzionare senza plug-in o funzioni extra, sebbene, forse, sia un po 'meno conveniente di dgodp

Basta copiare i bit necessari dai buffer principali e incollarli nel punto corretto nel buffer unito. Questo è utile anche se vuoi solo una parte di un blocco diff, piuttosto che il tutto.

A volte, potrebbe essere necessario forzare Vim per aggiornare l'evidenziazione differenziale con :diffupdate.


1

Per combinare le modifiche da entrambi i rami di destinazione e unire in un singolo comando:

Puoi semplicemente eliminare le linee con i marker di conflitto Git. I seguenti due metodi elimineranno tutte le righe che iniziano con:

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

Metodo 1: inserimento manuale ed esecuzione di un comando

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

Metodo 2: implementazione di un comando definito dall'utente

"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 e diffput sceglieranno solo un ramo o l'altro. Quindi l'unica vera soluzione diversa da quella indicata sopra è quella di strappare e incollare manualmente da entrambi i file nella copia di lavoro.


Fornisci una ragione se deciderai di votare.
user3751385,

Questo è tutto ciò che faccio: basta eliminare i marker.
Aaron McMillin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.