Puedo ver los cambios antes de guardar mi archivo en Vim?
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?
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:
-
La sintaxis para guardar un archivo en vim es:
:w <filename>
-
La sintaxis para la ejecución de un comando shell en vim es:
:!<command>
-
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.
-
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. [...]
-
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 % -