Posso vedere le modifiche prima di salvare il mio file in Vim?
Domanda
Io uso Vim. Apro un file. I modificarlo e voglio vedere quello che ho modificato prima di salvarlo.
Come posso fare questo in Vim?
Soluzione
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
Ecco una funzione e comando per vedere un diff tra il file attualmente modificato e la sua versione non modificata nel filesystem. Basta mettere questo nel vostro vimrc o nella directory dei plugin, aprire un file, apportare alcune modifiche senza salvarle, e fare
: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()
Per uscire di vista diff è possibile utilizzare il comando
:diffoff
.Segue una funzione simile, atto a simulare il comando
'cvs diff'
...
Altri suggerimenti
:w !diff % -
Perché alcune persone hanno chiesto circa una spiegazione per il comando
:w !diff % -
Qui è il mio tentativo di scrivere una risposta più dettagliata:
Io parto dal presupposto che si sta lavorando su un sistema con cat
e echo
installato (ad esempio quasi tutti GNU / Linux, Mac OS, BSD e altri sistemi UNIX-like).
Il comando sopra funziona nel seguente modo:
-
La sintassi per il salvataggio di un file in vim è:
:w <filename>
-
La sintassi per eseguire un comando di shell in vim è:
:!<command>
-
All'interno della shell emesso da
%
vim accade per puntare al nome del file corrente. È possibile verificare questo eseguendo il seguente::!echo %
Questo dovrebbe uscita il nome del file (o un errore, se Vim è stato eseguito senza un nome di file).
Utilizzare cat possiamo anche uscita il contenuto del file:
:!cat %
Questo dovrebbe restituire il contenuto dei file nel suo ultimo stato salvato o un errore se non è mai stato salvato.
-
Il diff programma è in grado di leggere da standard input (stdin). La sua pagina man afferma quanto segue:
[...] Se un file è '-', legge lo standard input. [...]
-
L'esecuzione del comando Salva, senza un nome di file, ma piuttosto un comando di shell dietro di esso provoca vim per scrivere il contenuto dei file per stdin del guscio, invece di salvarlo in un file fisico. È possibile verificare questo eseguendo
:w !cat
Questo dovrebbe sempre stampare i file contenuto corrente (che sarebbe stato scritto in un file, invece).
Mettere insieme (o tl; dr):. Il file viene "salvato" per stdin, diff è gestito con il nome del file e stdin come input
Sapendo questo si potrebbe anche confrontare i file con vimdiff fare qualcosa di simile - questo è solo un'idea che non vuole fare questo:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(in sola lettura Poi aprire e chiudere vimdiff utilizzando :qall
)
Ho sempre piaccio diffchanges - bella, semplice, opere .
da 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
Fonte il seguente ed impiego: 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()
Non è esattamente quello che stai cercando, ma SCMDiff.vim è davvero cool. Un solo tasto, ed è diff-evidenzia il file corrente con la revisione testa in un repo controllo del codice sorgente. E 'pensato per lavorare con molti SCMS. Io lo uso con per forza.
C'è un plugin, in base a diverse risposte qui: https://github.com/gangleri/vim -diffsaved
Si fornisce il metodo :w !diff % -
e diffthis
più coinvolto uno.
Oltre a questo undotree permette anche questo, ma anche molto più (diff tra diversi punti di controllo di annullamento) . Simile a Gundo .
Posso consigliare il histwin plugin.
Anche se non si diff al corrente salvato versione del file (come le altre risposte), è possibile modifiche vimdiff da quando hai cominciato edting , e anche < strong> riproduzione le modifiche in ordine. La differenza si vede se si salva intermedia.
Inoltre, viene visualizzato un elenco di tutti annulla storia filiali e permette di muoversi o diff tra di loro.
PS: Mentre il plugin non tiene automaticamente momenti della storia di modifica in quanto ogni modifica di file, è possibile in modo esplicito "tag" il momento in cui si salva il file in modo tale che in seguito sarà possibile vimdiff con esso, se si desidera che. Forse questo potrebbe essere automatizzato?
Se si desidera utilizzare vim per il confronto come in vimdiff, si potrebbe fare qualcosa di simile:
Modifica il tuo Vimrc e aggiungere:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
Da lì in poi si vedrà le modifiche e può uscire la vista diff utilizzando qall
come in vimdiff premendo F8 in modalità di comando. Sostituire F8 con un tasto che ti piace.
Modifica:. Aggiunto -M per non consentire alcuna modifica, perché non è salvare
Seguire quanto sopra suggerisce che uso diff git che mi piace molto:
:w !git diff % -