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

J’utilise Vim. J’ouvre un fichier. Je le modifie et je veux voir ce que j’ai édité avant de le sauvegarder.

Comment puis-je faire cela dans Vim?

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 en cours d’édition et sa version non modifiée dans le système de fichiers. Il suffit de mettre ceci dans votre vimrc ou dans le répertoire du plugin, d’ouvrir un fichier, d’apporter des modifications sans les enregistrer et de faire :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 l’affichage, vous pouvez utiliser la commande :diffoff .

Ci-dessous une fonction similaire, adaptée pour imiter la commande 'cvs diff'

 :w !diff % - 

Parce que certaines personnes ont demandé une explication pour 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é (par exemple, presque tous les systèmes GNU / Linux, Mac OS, BSD et autres systèmes UNIX).

La commande ci-dessus fonctionne comme suit:

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

     :w  
  2. La syntaxe pour exécuter une commande shell dans vim est la suivante:

     :! 
  3. Dans l’environnement shell créé par vim, il arrive que le nom du fichier en cours soit indiqué. Vous pouvez le vérifier en exécutant ce qui suit:

     :!echo % 

    Cela devrait générer le nom du fichier (ou une erreur si vim était exécuté sans nom de fichier).

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

     :!cat % 

    Cela devrait renvoyer le contenu du fichier dans son dernier état enregistré ou une erreur s’il n’a jamais été enregistré.

  4. Le programme diff peut lire depuis l’entrée standard (stdin). Sa page de manuel indique ce qui suit:

    […] Si un fichier est ‘-‘, lisez l’entrée standard. […]

  5. L’exécution de la commande save sans nom de fichier, mais plutôt une commande shell derrière, 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.

Sachant que 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 ceci:

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

(Ensuite, ouvrez readonly et fermez vimdiff en utilisant :qall )

J’ai toujours aimé les échanges – sympa, simple, fonctionne.

à partir 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 

Source suivante et utiliser: 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 diff() 

Pas exactement ce que vous cherchez, mais SCMDiff.vim est vraiment cool. Un appui sur une touche, et il met en surbrillance votre fichier actuel avec la révision de la tête dans un référentiel de contrôle de source. Il est conçu pour fonctionner avec de nombreux SCMS. Je l’utilise avec perforce.

Je peux recommander le plugin histwin .

Bien qu’il ne diffère pas de la version enregistrée actuelle du fichier (comme les autres réponses), il peut changer depuis que vous avez commencé à éditer , et même rejouer vos modifications dans l’ordre. La différence indique si vous économisez par intermittence.

En outre, il affiche une liste de toutes les twigs de l’historique des annulations et vous permet de basculer entre elles.

PS: Bien que le plug-in ne suive pas automatiquement les moments de l’historique des modifications depuis chaque modification de fichier, vous pouvez explicitement “tagger” le moment où vous enregistrez le fichier de façon à pouvoir le consulter ultérieurement. Peut-être que cela pourrait être automatisé?

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

Modifiez votre fichier .vimrc et ajoutez:

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

À partir de là, vous verrez vos modifications et vous pourrez quitter l’affichage des différences en utilisant qall comme dans vimdiff en appuyant sur F8 en mode commande. Remplacez F8 par n’importe quelle touche.

Edit: Ajout de -M pour interdire toute modification, car il n’est pas enregistré.

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

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

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

Suivez les suggestions ci-dessus, j’utilise git diff que j’aime beaucoup:

 :w !git diff % -