Pregunta

Yo uso Vim. Abro un archivo. Edito y yo quiero ver lo que he editado antes de guardarlo.

¿Cómo puedo hacer esto en Vim?

¿Fue útil?

Solución

http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file

  

Aquí es una función y comando para ver un diff entre el archivo que se está editando y su versión no modificada en el sistema de archivos. Sólo hay que poner esto en su vimrc o en el directorio de plugins, abrir un archivo, hacer algunas modificaciones sin guardar, y hacer :DiffSaved.

function! s:DiffWithSaved()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction
com! DiffSaved call s:DiffWithSaved()
     

Para salir de la vista diff puede utilizar el comando :diffoff.

     

A continuación se muestra una función similar, adaptado para imitar el comando 'cvs diff' ...

Otros consejos

:w !diff % -

Debido a que algunas personas preguntaron por una explicación para el comando

:w !diff % -

Aquí está mi intento de escribir una respuesta más detallada:

Estoy asumiendo que usted está trabajando en un sistema con cat y echo instalado (por ejemplo, casi cualquier GNU / Linux, Mac OS, BSD y otros sistemas similares a Unix).

El comando anterior funciona de la siguiente manera:

  1. La sintaxis para guardar un archivo en vim es:

    :w <filename>
    
  2. La sintaxis para la ejecución de un comando shell en vim es:

    :!<command>
    
  3. Dentro de la entorno de shell emitido por % vim sucede para que apunte al nombre de archivo actual. Usted puede verificar esto ejecutando el siguiente:

    :!echo %
    

    Esta debe ser la salida el nombre de archivo (o un error, si vim se ejecuta sin un nombre de archivo).

    Uso de gato también podemos emitir el contenido del archivo:

    :!cat %
    

    Esto debería devolver el contenido de los archivos en su último estado guardado o un error si nunca se ha guardado.

  4. El diff programa es capaz de leer de la entrada estándar (stdin). Su página de manual establece lo siguiente:

      

    [...] si un archivo es '-', lee la entrada estándar. [...]

  5. La ejecución del comando Guardar sin un nombre de archivo, sino más bien un comando shell detrás de él hace que vim para escribir el contenido de los archivos de entrada estándar de la cáscara en lugar de guardarlo en un archivo físico. Esto se puede comprobar mediante la ejecución

    :w !cat
    

    Esto siempre debe imprimir los archivos de contenido actual (que habría sido escrito en un archivo en su lugar).

Juntando todo (o tl; dr.): El archivo es "salvado" a la entrada estándar, diff se ejecuta con el nombre de archivo y la entrada estándar como entrada

Sabiendo esto también se podría comparar archivos con vimdiff hacer algo como esto - esto es sólo una idea que no quiere hacer esto:

:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile

(Entonces sólo lectura abierto y cerca vimdiff usando :qall)

Siempre he gusta diffchanges - simple y agradable, las obras .

de vimrc_example.vim:

" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
if !exists(":DiffOrig")
  command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
          \ | wincmd p | diffthis
endif

Fuente el siguiente y uso: comando diff

function! s:diff()
    let tmpa = tempname()
    let tmpb = tempname()
    earlier 100h
    exec 'w '.tmpa
    later 100h
    exec 'w '.tmpb
    update
    exec 'tabnew '.tmpa
    diffthis
    vert split
    exec 'edit '.tmpb
    diffthis
endfunction
command! -nargs=0 DIFF call <SID>diff()

No es exactamente lo que estás buscando, pero SCMDiff.vim es realmente bueno. Una pulsación de tecla, y diff-aspectos más destacados de su archivo actual con la revisión de cabecera en un acuerdo de recompra de control de origen. Es la intención de trabajar con muchos SCMS. Yo lo uso con Perforce.

Hay un plugin, en base a diferentes respuestas aquí: https://github.com/gangleri/vim -diffsaved

Se proporciona el método :w !diff % - y el más implicado uno diffthis.

Aparte de eso undotree permite esto también, pero también mucho más (diferenciaciones entre los diferentes puntos de control de deshacer) . Al igual que en Gundo .

Puedo recomendar el histwin plug-in.

Si bien no diff al actual guardado versión del archivo (como las otras respuestas), se puede Cambios vimdiff desde que empezó edting , e incluso < strong> replay los cambios en el orden. La diferencia muestra si se guarda de forma intermedia.

Además, se muestra una lista de todas las ramas de deshacer la historia y le permite cambiar o diff entre ellos.

PD: Mientras que el plugin no realiza un seguimiento de forma automática momentos de la historia de edición ya que cada cambio de archivo, puede explícitamente "etiqueta" el momento en que se guarda el archivo de tal manera que más tarde puede vimdiff con ella, si quieres que. Tal vez esto podría ser automatizado?

Si desea utilizar vim para la comparación como en vimdiff, se podría hacer algo como esto:

Editar su .vimrc y añadir:

nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>

A partir de ahí, verá los cambios y puede salir de la vista usando diff qall como en vimdiff pulsando F8 en modo comando. Reemplazar con cualquier tecla F8 te gusta.

Editar:. Añadido -M para no permitir ninguna modificación, ya que no está Guardar

Siga Lo anterior sugiere que uso git diff que me gusta mucho:

:w !git diff  % -
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top