vim: diff due sezioni in due file, ma non l'intero file?


14

Ho aggiornato un sistema da Nagios 2 a Nagios 3 e ora sto confrontando alcune differenze tra i file di configurazione vecchi e nuovi.

Ci sono modifiche significative ai file di configurazione e non voglio eseguire una diff sull'intero file perché vimdiff mi mostra troppe differenze irrilevanti e ha problemi a gestire i #commenti all'inizio delle righe, ecc.

Posso usare vim o una funzionalità simile a vimdiff per eseguire una diff su due sezioni particolari in due file diversi?

Ad esempio, voglio diff solo le linee che assomigliano a questo:

# Define a service to check the load on the local machine. 

define service{
    use                             local-service         ; Name of service template to use
    host_name                       localhost
    service_description             Blah Blah
    check_command                   Blah Blah
    }

Risposte:


18

Sembra di allineato.vim potrebbe essere quello che vuoi: "Esegui un diff interattivo su due blocchi di testo".

Specifichi ogni blocco (intervallo di linee) con il suo :Linediffcomando (ad esempio :4,10Linediff, oppure fai prima una selezione visiva, quindi digita :Linediff(che viene fuori come :'<,'>LineDiff)). Gli intervalli possono essere dallo stesso file / buffer o diversi. Dopo aver specificato due intervalli, viene aperta una nuova scheda con due nuovi buffer modalità diff (in una divisione) per gli intervalli specificati. È possibile modificare e :win uno di questi buffer per aggiornare gli intervalli originali. Al termine, :quscire dai buffer diff e :LinediffResetliberarsi degli identificatori di intervallo nei buffer originali.

La risposta StackOverflow dove ho appreso per la prima volta dilinediff.vim suggerisce anche un paio di mappature. Altre risposte a questa domanda menzionano anche una soluzione personalizzata e un altro plug-in che può risolvere lo stesso problema.


6

Non ho trovato un modo molto semplice per farlo, ma ho avuto un discreto successo con il plugin NrrwRgn (Narrow Region), http://www.vim.org/scripts/script.php?script_id=3075 . Ti consente di selezionare una regione di un buffer e aprire quella regione in un nuovo buffer. È possibile modificare quel nuovo buffer e quando lo si chiude, il plug-in copia automaticamente il testo modificato nella regione da cui proviene nel file originale. È inoltre possibile copiare diverse aree di uno o più file in nuovi buffer, quindi differli con questi nuovi buffer. È così che di solito uso il plug-in per verificare le differenze tra funzioni simili definite in un file.

Nel tuo caso, puoi aprire entrambi i file in Vim, quindi utilizzare Vper selezionare la sezione di interesse nel primo file e digitare \nrper copiare quella sezione in un nuovo buffer. Ripetere l'operazione per la sezione simile nell'altro file. Quindi, in ciascuno dei due nuovi buffer, eseguire :diffthis.


Grazie! Cosa farà \nr?
Stefan Lasiewski,

1
Il plug-in mappa <Leader>nr, dove per <Leader>impostazione predefinita è `\`, al comando del plug-in che copia la regione selezionata in un nuovo buffer.
garyjohn,

@garyjohn come organizzi le NrrrRgndivisioni?
dev

1
@dev: ho le seguenti due righe di configurazione NrrwRgn nel mio ~ / .vimrc: let g:nrrw_rgn_vert = 1e let g:nrrw_rgn_protect = 'n'. Con il primo, NrrwRgn si apre a sinistra della finestra corrente. Ho dimenticato se si aprono immediatamente a sinistra o all'estrema sinistra. Detto questo, non uso più NrrwRgn per questo, avendo trovato qualcosa di meglio: Linediff. Apre le nuove regioni in una nuova scheda, che trovo più ordinata e più conveniente. Puoi trovare LInediff su http://www.vim.org/scripts/script.php?script_id=3745o https://github.com/AndrewRadev/linediff.vim.
garyjohn,

Mille grazie @garyjohn. NrrwRgnfa l'estrema sinistra o in alto, il che rende le divisioni praticamente ingestibili. Ho anche provato le !varianti ma si sono rivelate molto fragili (errori di script + nessun modo pulito per tornare al file originale). Darà linediff.vimuna prova troppo, anche se mi auguro NrrwRgndi migliorare in futuro.
dev

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.