Come posso solo fare il dp o fare solo le linee, non l'intero blocco in Vim diff?


28

Attualmente sto usando l'opzione di menu "Split Diff by ..." di MacVim (Snapshot 64).

Il file è il mio Django settings.pydalla versione 1.3.1 a un nuovo file dalla versione 1.4.

Immagine dello schermo

Conosco due comandi di base

  1. do per "ottenere" (e sostituire) un blocco dall'altra parte.
  2. dp per "mettere" (e sostituire) un blocco sull'altro lato.

Ma quei due comandi scrivono l'intero blocco, che in MacVim sono i punti salienti viola.

Se guardi il secondo blocco, puoi vedere che dalla riga 2 e 3 ha solo 2 parole che sono diverse: mysitee hobbes3. Voglio solo sostituire per riga non l'intero blocco.

Quindi, cosa c'è un comando per sostituire do doe dpper line invece di un intero blocco o devo scriverlo manualmente?

Domanda bonus : ho notato che una volta modificato manualmente un blocco, perdo l'evidenziazione viola. Come posso "aggiornare" di nuovo il diff per includere i momenti salienti senza riaprire il file?

Si prega di provare a mantenere le risposte a Vim-generale anziché a Mac-specifico.

Risposte:


30

Esistono diversi modi per farlo.

  1. Selezionare l'intervallo di righe nel buffer di destinazione che si desidera ottenere dal buffer di origine e utilizzare :diffget. Ad esempio, è possibile selezionare visivamente un intervallo di linee con V, quindi digitare :diffget.
  2. Selezionare l'intervallo di righe nel buffer di origine che si desidera inserire nel buffer di destinazione e utilizzare :diffput. Ad esempio, per inserire la riga corrente nell'altro buffer, digitare :.diffput.
  3. Usa yank e put. Selezionare l'intervallo di righe nel buffer di origine che si desidera copiare nel buffer di destinazione, trascinarle utilizzando Y, spostare il cursore sul buffer di destinazione e posizionarle nel punto desiderato po P, quindi eliminare le righe che non si desidera.
  4. Yank come sopra, ma nel buffer di destinazione, selezionare visivamente l'intervallo di righe che si desidera sostituire (non necessariamente lo stesso numero di righe) e digitare "0p. Questo utilizza il registro 0 (zero) che contiene sempre il testo dell'ultimo yank.

Per "aggiornare" il display per mostrare l'evidenziazione corretta, eseguire :diffupdateo semplicemente :diffu. A volte ciò non è sufficiente ed è necessario spostare il cursore sull'altra finestra per completare l'aggiornamento.

Puoi leggere di più sulla copia delle differenze in

:help copy-diffs

3

Volevo anche modificare una riga in un dato momento durante una diff. Quindi ho creato una semplice mappa e li ho inseriti nel mio file vimrc.

nnoremap <silent> <leader>dp V:diffput<cr>
nnoremap <silent> <leader>dg V:diffget<cr>

Potresti usare do invece di dg, ma sono più abituato a pensare "diffget" anziché [o] btain.

Per il tuo bonus, uso due volte un'altra semplice mappa:

nnoremap <silent> <leader>df :call DiffToggle()<CR>

Ora, df spegnerà / accenderà la modalità diff, quindi lo spengo e riaccendo.

E un'opzione bonus è quella di aggiungere

nmap <silent> <leader>du :wincmd w<cr>:normal u<cr>:wincmd w<cr>

Ciò ti consentirà di annullare un errore di battitura o una modifica indesiderata sull'altro file / finestra, perché: annullare solo u annullerà solo una modifica nella finestra corrente.

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.