vim: diff dos secciones en dos archivos, pero no todo el archivo?

14

Actualicé un sistema de Nagios 2 a Nagios 3, y ahora estoy comparando algunas diferencias en los archivos de configuración antiguos y nuevos.

Hay cambios significativos en los archivos de configuración, y no quiero realizar una diferencia en todo el archivo porque vimdiff me muestra demasiadas diferencias irrelevantes y tiene problemas para tratar los #comentarios al comienzo de las líneas, etc.

¿Puedo usar vim o una funcionalidad similar a vimdiff para realizar una diferencia en dos secciones particulares en dos archivos diferentes?

Por ejemplo, quiero diferenciar solo las líneas que se parecen a esto:

# 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
    }
Stefan Lasiewski
fuente

Respuestas:

18

Parece que linediff.vim podría ser lo que desea: "Realizar una diferencia interactiva en dos bloques de texto".

Usted especifica cada bloque (rango de línea) con su :Linediffcomando (por ejemplo :4,10Linediff, o hace una selección visual primero, luego escribe :Linediff(que sale como :'<,'>LineDiff)). Los rangos pueden ser del mismo archivo / búfer o diferentes. Una vez que haya especificado dos rangos, se abrirá una nueva pestaña que tiene dos nuevos buffers de modo diferencial (en una división) para los rangos especificados. Puede editar y :wen cualquiera de estos búferes para actualizar los rangos originales. Cuando haya terminado, :qsalga de los búferes de diferencia y :LinediffResetelimine los especificadores de rango en los búferes originales.

La respuesta de Stackoverflow donde supe por primera vez de linediff.vim también sugiere un par de asignaciones. Otras respuestas a esa pregunta también mencionan una solución personalizada y otro complemento que puede abordar este mismo problema.

Chris Johnsen
fuente
6

No he encontrado una manera realmente sencilla de hacer esto, pero he tenido bastante éxito con el complemento NrrwRgn (Región Estrecha), http://www.vim.org/scripts/script.php?script_id=3075 . Le permite seleccionar una región de un búfer y abrir esa región en un nuevo búfer. Puede editar ese nuevo búfer y, cuando lo cierre, el complemento copiará automáticamente el texto editado en la región de la que proviene en el archivo original. También puede copiar diferentes regiones de uno o más archivos en nuevos buffers, y luego diferir esos nuevos buffers. Así es como generalmente uso el complemento: para verificar las diferencias entre funciones similares definidas en un archivo.

En su caso, puede abrir ambos archivos en Vim, luego usar Vpara seleccionar la sección de interés en el primer archivo y escribir \nrpara copiar esa sección en un nuevo búfer. Repita para la sección similar en el otro archivo. Luego, en cada uno de los dos nuevos buffers, ejecute :diffthis.

garyjohn
fuente
¡Gracias! Que va a \nrhacer
Stefan Lasiewski
1
El complemento se asigna <Leader>nr, donde el valor <Leader>predeterminado es `\`, al comando del complemento que copia la región seleccionada en un nuevo búfer.
garyjohn
@garyjohn, ¿cómo organizas las NrrrRgndivisiones?
dev
1
@dev: Tengo las siguientes dos líneas de configuración NrrwRgn en mi ~ / .vimrc: let g:nrrw_rgn_vert = 1y let g:nrrw_rgn_protect = 'n'. Con el primero, las divisiones NrrwRgn se abren a la izquierda de la ventana actual. He olvidado si se abren inmediatamente a la izquierda o al extremo izquierdo. Dicho esto, ya no uso NrrwRgn para esto, después de haber encontrado algo mejor: Linediff. Abre las nuevas regiones en una nueva pestaña, que me parece más ordenada y conveniente. Puede encontrar LInediff en http://www.vim.org/scripts/script.php?script_id=3745o https://github.com/AndrewRadev/linediff.vim.
garyjohn
Muchas gracias @garyjohn. NrrwRgnhace el extremo izquierdo o superior, lo que hace que las divisiones sean prácticamente inmanejables. Incluso probé las !variantes pero resultaron muy frágiles (errores de script + no hay una forma limpia de volver al archivo original). Dará linediff.vimuna oportunidad también, aunque espero NrrwRgnmejorar en el futuro.
dev