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?

È stato utile?

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:

  1. La sintassi per il salvataggio di un file in vim è:

    :w <filename>
    
  2. La sintassi per eseguire un comando di shell in vim è:

    :!<command>
    
  3. 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.

  4. 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. [...]

  5. 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  % -
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top