Comment puis-je uniquement dp ou faire uniquement les lignes, pas le bloc entier dans Vim diff?

28

J'utilise actuellement MacVim (Snapshot 64) l'option de menu "Diviser les diff par ...".

Le fichier est Django's my settings.pyde la version 1.3.1 à un nouveau fichier de la version 1.4.

Capture d'écran

Je connais deux commandes de base

  1. do pour "obtenir" (et remplacer) un bloc de l'autre côté.
  2. dp pour "mettre" (et remplacer) un bloc de l'autre côté.

Mais ces deux commandes écrivent le bloc entier, qui dans MacVim est les reflets violets.

Si vous regardez le 2ème bloc, vous pouvez voir que de la ligne 2 et 3 n'a que 2 mots différents: mysiteet hobbes3. Je veux juste remplacer par ligne et non le bloc entier.

Alors, quelle est la commande pour remplacer do doet dppar ligne par opposition à un bloc entier ou dois-je le taper manuellement?

Question bonus : j'ai remarqué qu'une fois que je modifiais manuellement un bloc, je perdais la surbrillance violette. Comment «actualiser» à nouveau le diff pour inclure les surbrillances sans rouvrir le fichier?

Veuillez essayer de conserver les réponses Vim-général comme opposées à MacVim-spécifiques.

hobbes3
la source

Réponses:

30

Il y a un certain nombre de façons de le faire.

  1. Sélectionnez la plage de lignes du tampon de destination que vous souhaitez obtenir du tampon source et utilisez :diffget. Par exemple, vous pouvez sélectionner visuellement une plage de lignes avec V, puis taper :diffget.
  2. Sélectionnez la plage de lignes dans le tampon source que vous souhaitez mettre dans le tampon de destination et utilisez :diffput. Par exemple, pour mettre la ligne actuelle dans l'autre tampon, tapez :.diffput.
  3. Utilisez yank et mettez. Sélectionnez la plage de lignes du tampon source que vous souhaitez copier dans le tampon de destination, tirez-les à l'aide de Y, déplacez le curseur vers le tampon de destination et placez-les où vous le souhaitez avec pou P, puis supprimez les lignes dont vous ne voulez pas.
  4. Yank comme ci-dessus, mais dans le tampon de destination, sélectionnez visuellement la plage de lignes que vous souhaitez remplacer (pas nécessairement le même nombre de lignes) et tapez "0p. Celui-ci utilise le registre 0 (zéro) qui contient toujours le texte du coup sec le plus récent.

Pour "rafraîchir" l'affichage pour montrer la surbrillance appropriée, exécutez :diffupdateou simplement :diffu. Parfois, cela ne suffit pas et vous devez déplacer le curseur sur l'autre fenêtre pour terminer l'actualisation.

Vous pouvez en savoir plus sur la copie des différences dans

:help copy-diffs
garyjohn
la source
3

Je voulais aussi modifier une ligne à un moment donné lors d'un diff. J'ai donc créé une carte simple et les ai mis dans mon fichier vimrc.

nnoremap <silent> <leader>dp V:diffput<cr>
nnoremap <silent> <leader>dg V:diffget<cr>

Vous pouvez utiliser do au lieu de dg, mais je suis plus habitué à penser "diffget" au lieu de [o] btain.

Pour votre bonus, j'utilise simplement une autre carte simple deux fois:

nnoremap <silent> <leader>df :call DiffToggle()<CR>

Maintenant, df va désactiver / activer le diffmode, donc je viens de l'éteindre et de le rallumer.

Et une option bonus consiste à ajouter

nmap <silent> <leader>du :wincmd w<cr>:normal u<cr>:wincmd w<cr>

Cela vous permettra d'annuler une faute de frappe ou une modification indésirable sur l'autre fichier / fenêtre, car: l'annulation de simplement u annulera uniquement une modification dans la fenêtre actuelle.

lucky85dog
la source