¿Cómo uso vim como herramienta diff?


102

Yo uso vim como mi editor principal.

También me gustaría usar vim para archivos diff y modificar los archivos mientras hago el diff para corregir cambios fáciles (en lugar de la mayoría de las técnicas diff que son un ciclo de diff / fix / diff / fix).

Además, existen formas fáciles de integrar vim en las herramientas diff utilizadas por las herramientas / sitios de control de código fuente (estoy pensando específicamente en git pero estoy seguro de que otras personas estarían interesadas en integrarse con otras herramientas / sitios de control de código fuente).


1
deberías probar vim-fugitive, agrega los comandos :Gdiffy :Gvdiffambos comandos te permiten ver la diferencia lado a lado del búfer actual si tu git actual maneja tu búfer actual. También le ayuda a resolver conflictos en un diseño de tres ventanas cuando tiene conflictos de fusión en algunos archivos
rbernabe

Tengo esta función simple en mi bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }y la invoco con vd file1 file2. Se utiliza diffpara determinar si los archivos difieren y solo se abre vimdiffsi es así. De lo contrario, me quedo en la cáscara. También deshabilito el resaltado de sintaxis en Vim porque me parece que distrae cuando difiero. Solo funciona con dos archivos.
Rolf

Respuestas:


122

vim tiene esta funcionalidad incorporada (con el indicador de línea de comando correcto).

vim -d <file1> <file2>

Esto abre cada archivo en una vista y resalta las diferencias.
Cualquier código que sea idéntico está foldedausente, por lo que no necesita mirar código idéntico o desplazarse a través de enormes fragmentos de código idéntico.

Pero también hay una aplicación de contenedor vimdiffque invoca correctamente vim con los indicadores correctos.

vimdiff source1.cpp source2.cpp

Si está utilizando git, puede configurar una herramienta de diferencia externa. Por lo tanto, es fácil configurar vimdiff para que sea la herramienta diff de git.

git config --global diff.tool vimdiff

Al usar vimdiff, puede editar cualquier lado y el resaltado de diferencias mantiene el ritmo para mostrarle las diferencias.

Nota: Al editar desde un git diff. Si intenta editar la versión almacenada del repositorio del archivo, sus cambios se descartarán cuando salga (git no le confía el original, por lo que difiere de una copia tmp), pero puede editar la copia local al contenido de su corazón y guárdelo sobre su versión actual.

Algunos comandos básicos que son útiles en vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

Otras configuraciones de vim que uso para trabajar resaltando con vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Esto desactiva el resaltado de los bits de código que se cambian. Entonces, la línea que se cambia se resalta para que pueda detectar los cambios, pero el texto real que ha cambiado se destaca en la línea (ya que no está resaltado).


También maneja hasta 4 buffers, lo que lo hace ideal para comparar archivos de configuración
Izkata

34
También puede usar el :diffthiscomando para iniciar un diff cuando Vim ya se está ejecutando.
Rico

11
Y: se apaga para apagarlo. Creo que un enlace a la documentación de vim sería beneficioso: vimdoc.sourceforge.net/htmldoc/diff.html
Encuesta Cody

1
Para mí, incluso después git config --global diff.tool vimdiff, git difftodavía muestra todo como si no cambiara nada.
Hola Ángel

2
intentargit difftool
Martin York

13

Si está editando un archivo abierto y desea compararlo con otro archivo sin cerrar el actual:

Abra el nuevo archivo en pantalla dividida:

Para división vertical:

:vs otherFile

o división horizontal:

:split otherFile

Cambia los cursores a diferentes pantallas divididas:

ctrl+w ctrl+w

Invoque el "modo diff" en el archivo:

:diffthis

Cambie a otro archivo e invoque el "modo diff":

:diffthis

Para desactivar el "modo diff":

:diffoff

55
Para evitar el cambio entre las memorias intermedias se pueden utilizar :windo diffthistambién
statox

4

Puede colocar la configuración mencionada a continuación en el .gitconfigarchivo que se encuentra en el directorio %homepath%(o %userprofile%) del usuario actualmente conectado:

[diff]
    tool = vimdiff

Esto permitirá que la herramienta git bash comience a usar vimdiff como la herramienta de diferencia externa también.



2

Solo puedo ver tres situaciones para usar vim como herramienta de difusión. Se describen brevemente a continuación:

  • Para git difftool, ponga lo siguiente en su ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Para abrir vim como una herramienta de diferencias para dos archivos, puede hacer lo siguiente:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Para obtener una vista diferencial de los buffers que están activos actualmente, es decir, todos los buffers que tienen una ventana asignada en la pestaña activa actualmente, puede hacer lo siguiente:

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

Para más información, ver :h diff


1

esto es lo que hago:

  • abra una ventana con el primer archivo (o contenido de texto si está pegando datos)
  • abra el siguiente archivo / ventana usando :vnew(para tener ambas ventanas una al lado de la otra) o :new(para tener las ventanas arriba y abajo). Si tiene un archivo específico para abrir en la segunda ventana, puede incluir la ruta de esta manera::vnew /path/to/secondfile.txt
  • use F8 para alternar una función personalizada que activa y desactiva el modo diff

Aquí está la función personalizada que está en mi ~/.vimrc:

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction

puede usar el comando :diffthisy, diffoff!por lo tanto, no tiene que establecer todas las opciones de diferencias usted mismo (p. ej., la combinación de cursores también se establece mediante diffmode)
Christian Brabandt