Vraag Kan ik wijzigingen zien voordat ik mijn bestand in Vim opsla?


Ik gebruik Vim. Ik open een bestand. Ik bewerk het en ik wil zien wat ik heb bewerkt voordat ik het opsla.

Hoe kan ik dit in Vim doen?


112
2018-04-14 20:41


oorsprong


antwoorden:


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

Hier is een functie en een opdracht om een ​​verschil te zien tussen het momenteel bewerkte bestand en de niet-gemodificeerde versie ervan in het bestandssysteem. Plaats dit gewoon in uw vimrc of in de plugin-map, open een bestand, voer enkele wijzigingen uit zonder ze op te slaan en te doen :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()

Om de diff-weergave te verlaten, kunt u de :diffoff opdracht.

Hieronder is een vergelijkbare functie, aangepast om het beeld na te bootsen 'cvs diff' opdracht...


48
2018-04-14 20:46



:w !diff % -

125
2018-04-14 20:45



Omdat sommige mensen naar een verklaring voor het commando vroegen

:w !diff % -

Hier is mijn poging om een ​​meer gedetailleerd antwoord te schrijven:

Ik ga ervan uit dat je met een systeem werkt cat en echo geïnstalleerd (bijvoorbeeld bijna elke GNU / Linux, Mac OS, BSD en andere UNIX-achtige systemen).

Het bovenstaande commando werkt als volgt:

  1. De syntaxis voor het opslaan van een bestand in vim is:

    :w <filename>
    
  2. De syntaxis voor het uitvoeren van een shell-opdracht in vim is:

    :!<command>
    
  3. In de shell-omgeving uitgegeven door vim % gebeurt toevallig naar de huidige bestandsnaam. U kunt dit verifiëren door het volgende uit te voeren:

    :!echo %
    

    Dit zou de bestandsnaam moeten uitvoeren (of een fout, als vim werd uitgevoerd zonder een bestandsnaam).

    Met cat kunnen we ook de inhoud van het bestand uitvoeren:

    :!cat %
    

    Dit zou de bestanden moeten terugsturen in de laatst opgeslagen staat of een fout als het nog nooit is opgeslagen.

  4. Het programmadifferentiaal kan lezen van standaardinvoer (stdin). Op de man-pagina staat het volgende:

    [...] Als een BESTAND '-' is, lees dan de standaard invoer. [...]

  5. Het uitvoeren van de opdracht save zonder een bestandsnaam, maar eerder een shell-commando erachter, zorgt ervoor dat vim de bestanden naar de stdin van de shell schrijft in plaats van het in een fysiek bestand op te slaan. U kunt dit verifiëren door het uit te voeren

    :w !cat
    

    Dit moet altijd de huidige inhoud van de bestanden afdrukken (die in plaats daarvan naar een bestand zou zijn geschreven).

Het samenvoegen (of tl; dr): het bestand wordt "bewaard" naar stdin, diff wordt uitgevoerd met de bestandsnaam en stdin als invoer.

Als je dit weet, kun je ook bestanden vergelijken met vimdiff door zoiets te doen - dit is slechts een idee dat je dit niet wilt doen:

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

(Open dan readonly en sluit vimdiff met :qall)


66
2018-03-12 18:27



Ik heb altijd graag diffchanges - leuk, eenvoudig, werkt.


9
2018-04-14 21:24



van 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

9
2017-09-05 22:15



Bron het volgende en gebruik: DIFF-opdracht

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()

2
2018-04-14 20:54



Niet precies wat je zoekt, maar SCMDiff.vim is echt gaaf. Eén toetsaanslag, en het toont uw huidige bestand met de hoofdrevisie in een bronregelrepositie. Het is bedoeld om met veel SCMS te werken. Ik gebruik het met dwang.


2
2018-01-19 18:24



Ik kan het aanbevelen histwin inpluggen.

Hoewel het niet diff is naar de huidige opgeslagen versie van het bestand (zoals de andere antwoorden), het kan vimdiff verandert sinds je begon te herschrijvenen zelfs herhaling uw wijzigingen op volgorde. Het verschil wordt weergegeven als u tussentijds geld opslaat.

Bovendien geeft het een lijst weer van alle geschiedenistakken ongedaan maken en kunt u schakelen tussen ze.

PS: Hoewel de plug-in niet automatisch momenten in de bewerkingsgeschiedenis bijhoudt sinds elke bestandswijziging, kunt u het moment waarop u het bestand opslaat expliciet "taggen", zodat u er later mee kunt werken, als u dat wilt. Misschien kan dit worden geautomatiseerd?


1
2017-09-23 01:27



Als je vim wilt gebruiken voor vergelijking zoals in vimdiff, zou je zoiets als dit kunnen doen:

Bewerk je .vimrc en voeg toe:

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

Vanaf dat moment zie je je wijzigingen en kun je de diff-weergave verlaten met qall zoals in vimdiff door op F8 te drukken in de commandomodus. Vervang F8 door elke gewenste toets.

Bewerken: Toegevoegd -M om een ​​wijziging niet toe te staan, omdat deze niet is opgeslagen.


1
2018-03-12 19:01



Er is een plug-in, gebaseerd op verschillende antwoorden hier: https://github.com/gangleri/vim-diffsaved

Het biedt de :w !diff % - methode en de meer betrokkenen diffthis een.

Afgezien daarvan undotree staat dit ook toe, maar ook veel meer (onderscheid tussen verschillende controlepunten ongedaan maken). Gelijkwaardig aan Gundo.


1
2017-12-18 00:56