web-dev-qa-db-fra.com

Puis-je voir les modifications avant d'enregistrer mon fichier dans Vim?

J'utilise Vim. J'ouvre un dossier. Je le modifie et je veux voir ce que j'ai modifié avant de le sauvegarder.

Comment puis-je faire cela dans Vim?

127
teerapap

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

Voici une fonction et une commande pour voir un diff entre le fichier actuellement édité et sa version non modifiée dans le système de fichiers. Mettez-le simplement dans votre vimrc ou dans le répertoire du plugin, ouvrez un fichier, apportez quelques modifications sans les enregistrer, et faites :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()

Pour sortir de la vue diff, vous pouvez utiliser le :diffoff commande.

Voici une fonction similaire, adaptée pour imiter le 'cvs diff' commande ...

51
Bill Lynch
:w !diff % -
144
chaos

Parce que certaines personnes ont demandé une explication de la commande

:w !diff % -

Voici ma tentative d'écrire une réponse plus détaillée:

Je suppose que vous travaillez sur un système avec cat et echo installés (par exemple, presque tous les systèmes GNU/Linux, Mac OS, BSD et autres systèmes de type UNIX).

La commande ci-dessus fonctionne comme suit:

  1. La syntaxe pour enregistrer un fichier dans vim est:

    :w <filename>
    
  2. La syntaxe pour exécuter une commande Shell dans vim est:

    :!<command>
    
  3. À l'intérieur de l'environnement Shell émis par vim % arrive à pointer vers le nom de fichier actuel. Vous pouvez le vérifier en exécutant ce qui suit:

    :!echo %
    

    Cela devrait afficher le nom de fichier (ou une erreur, si vim a été exécuté sans nom de fichier).

    En utilisant cat, nous pouvons également afficher le contenu du fichier:

    :!cat %
    

    Cela devrait retourner le contenu des fichiers dans son dernier état enregistré ou une erreur s'il n'a jamais été enregistré.

  4. Le programme diff est capable de lire à partir d'une entrée standard (stdin). Sa page de manuel indique ce qui suit:

    [...] Si un FICHIER est '-', lire l'entrée standard. [...]

  5. L'exécution de la commande save sans nom de fichier mais plutôt une commande Shell derrière elle oblige vim à écrire le contenu des fichiers dans stdin du Shell au lieu de l'enregistrer dans un fichier physique. Vous pouvez le vérifier en exécutant

    :w !cat
    

    Cela devrait toujours imprimer le contenu actuel des fichiers (qui aurait été écrit dans un fichier à la place).

Assemblage (ou tl; dr): Le fichier est "enregistré" dans stdin, diff est exécuté avec le nom de fichier et stdin en entrée.

Connaître celui-ci pourrait également comparer des fichiers avec vimdiff faisant quelque chose comme ça - c'est juste une idée que vous ne voulez pas faire:

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

(Ouvrez ensuite en lecture seule et fermez vimdiff en utilisant :qall)

88
Tobias Heinicke

J'ai toujours aimé diffchanges - Nice, simple, fonctionne.

10
Rook

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
9
0x89

Source les éléments suivants et utilisation: commande 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()
2
Mykola Golubyev

Pas exactement ce que vous cherchez mais SCMDiff.vim est vraiment cool. Une pression sur une touche, et elle met en surbrillance votre fichier actuel avec la révision de tête dans un référentiel de contrôle de source. Il est censé fonctionner avec de nombreux SCMS. Je l'utilise avec perforce.

2
prestomation

Il existe un plugin, basé sur différentes réponses ici: https://github.com/gangleri/vim-diffsaved

Il fournit le :w !diff % - et la méthode la plus impliquée diffthis.

En dehors de cela ndotree permet cela aussi, mais beaucoup plus (diffère entre les différents points de contrôle d'annulation). Similaire à Gundo .

2
blueyed

Si vous souhaitez utiliser vim pour la comparaison comme dans vimdiff, vous pouvez faire quelque chose comme ceci:

Modifiez votre .vimrc et ajoutez:

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

À partir de là, vous verrez vos modifications et pourrez quitter la vue diff en utilisant qall comme dans vimdiff en appuyant sur F8 en mode commande. Remplacez F8 par n'importe quelle clé de votre choix.

Edit: Ajout de -M pour interdire toute modification, car elle n'est pas enregistrée.

1
Tobias Heinicke

Je peux recommander le plugin histwin .

Bien qu'il ne diffère pas de la version actuellement enregistrée du fichier (comme les autres réponses), il peut modifier vimdiff depuis que vous avez commencé à éditer , et même relisez vos modifications dans l'ordre. La différence indique si vous enregistrez de façon intermédiaire.

De plus, il affiche une liste de toutes les branches d'historique d'annulation et vous permet de basculer ou de les différencier.

PS: Bien que le plugin ne suive pas automatiquement les moments de l'historique des modifications depuis chaque changement de fichier, vous pouvez explicitement "baliser" le moment où vous enregistrez le fichier de sorte que vous puissiez plus tard le vimdiff, si vous le souhaitez. Peut-être que cela pourrait être automatisé?

1
catchmeifyoutry