Question

Je vim. Ouvrir un fichier. Je le modifier et je veux voir ce que j'ai édité avant de l'enregistrer.

Comment puis-je faire dans vim?

Était-ce utile?

La solution

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

  

Voici une fonction et 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 dans votre vimrc ou dans le répertoire de plug-in, ouvrez un fichier, faire quelques modifications sans les enregistrer, et 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 vue diff, vous pouvez utiliser la commande :diffoff.

     

Voici une fonction similaire, conçu pour imiter la commande 'cvs diff' ...

Autres conseils

:w !diff % -

Parce que certaines personnes ont demandé une explication au sujet 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é (par exemple presque tous les GNU / Linux, Mac OS, BSD et d'autres systèmes 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. Dans l'environnement shell émis par vim % arrive à pointer vers le nom du fichier en cours. Vous pouvez le vérifier en exécutant la commande suivante:

    :!echo %
    

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

    En utilisant cat on peut aussi produire le contenu du fichier:

    :!cat %
    

    Cela devrait renvoyer le contenu des fichiers dans son dernier état enregistré ou une erreur si elle n'a jamais été enregistré.

  4. Le programme diff est en mesure de lire à partir de l'entrée standard (stdin). Sa page de manuel stipule ce qui suit:

      

    [...] Si un fichier est '-', lisez l'entrée standard. [...]

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

    :w !cat
    

    Cela devrait toujours imprimer les fichiers de contenu en cours (ce qui aurait été écrit dans un fichier à la place).

Constituer (ou tl; dr.): Le fichier est "sauvé" à stdin, diff est exécuté avec le nom de fichier et l'entrée standard comme entrée

Sachant cela on pourrait aussi comparer des fichiers avec vimdiff faire 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

(Puis readonly ouvrir et fermer vimdiff en utilisant :qall)

J'ai toujours aime diffchanges - belles, simples, œuvres .

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 ce qui suit 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()

Pas exactement ce que vous cherchez, mais SCMDiff.vim est vraiment cool. Une pression de touche, et diff-met en évidence votre fichier en cours avec la révision de la tête dans une prise en pension de contrôle de code source. Il est destiné à travailler avec beaucoup de SCMS. Je l'utilise avec Perforce.

Il y a un plug-in, en fonction des réponses différentes ici: https://github.com/gangleri/vim -diffsaved

Il fournit la méthode :w !diff % - et plus impliqué d'une diffthis.

En dehors de cela undotree permet cela aussi, mais aussi beaucoup plus (diffs entre les différents postes de contrôle de retour) . Semblable à Gundo .

Je peux recommander histwin plugin.

Bien qu'il ne diff à la sauvé actuelle version du fichier (comme les autres réponses), il peut change Vimdiff depuis que vous avez commencé edting , et même < strong> rejeu vos modifications dans l'ordre. La différence montre si vous enregistrez intermédiairement.

En outre, il affiche une liste des branches tous undo histoire et vous permet de passer ou diff entre eux.

PS: Bien que le plug-in n'a pas suivi automatiquement des moments dans l'historique des modifications depuis chaque changement de fichier, vous pouvez explicitement « tag » le moment où vous enregistrez le fichier de telle sorte que vous pouvez ensuite vimdiff avec elle, si vous voulez que. 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:

Modifier votre .vimrc et ajouter:

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

A partir de là, vous verrez vos modifications et pouvez quitter la vue diff en utilisant qall comme dans vimdiff en appuyant sur F8 en mode commande. Remplacez F8 avec une touche que vous voulez.

Edit:. Ajouté -M pour interdire toute modification, car il est pas sauvé

Suivez le suggère-je utiliser git diff que j'aime bien au-dessus:

:w !git diff  % -
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top