Vimdiff pour git diffs peut-il être démarré dans l'onglet du processus actuel?
Disons que j'ai un tampon de fichier ouvert et un :terminal
fractionnement ouvert en 1 page à onglet. Je voudrais créer un nouvel onglet où je cours vimdiff
mais que mon git diff s'affiche. J'essaye git difftool HEAD~1
d'apparaître dans mon processus vim actuel, juste dans un autre onglet.
Est-ce possible sur Vim 8 sans plugins?
J'ai en quelque sorte cette illusion quand je le fais :tab terminal
et que je cours git difftool HEAD~1
. Cependant, cela démarre un sous-processus vim et j'aimerais éviter cela.
Un peu comme cette question: Comment puis-je entrer en mode vimdiff étant donné que deux divisions sont déjà ouvertes? mais pour git diffs.
Réponses
Bien que cela soit certainement faisable à la vanille vim
, je vous suggère de jeter un coup d'œil à l'excellent vim-fugitiveplugin de tpope . Ensuite, vous devez simplement faire :tab Gdiff
pour obtenir ce que vous voulez.
Si vous ne voulez vraiment pas installer de plug-ins, ce qui suit peut fonctionner en supposant que le fichier actuel se trouve dans le tampon no. 1:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
- Dans l'onglet nouvellement ouvert,
:vert sb 1 | windo diffthis
Explication
- ouvre d'abord un nouvel onglet avec
tabnew
et y charge le contenu de laHEAD^
version du fichier dans le tampon 1. - ouvre une division verticale contenant le tampon 1 avec
vert sb 1
, puis envoie:diffthis
à tous les tampons de l'onglet pour passer en mode diff.
Éditer
Le PO a demandé plus d'explications sur l'étape 1. a git show
besoin d'une entrée du formulaire <rev>:<path>
où <path>
doit être relative à la racine de l'arbre de travail. Par exemple, si le chemin absolu du fichier dans le tampon 1 est /a/b/foo.ext
tel qu'il b
contient votre .git
dossier (c'est b
-à- dire est la racine de votre dépôt), pour git show
fonctionner correctement, vous devrez l'invoquer avec HEAD^:b/foo.e
. Utiliser l'un /a/b/foo.ext
ou l' autre ou foo.ext
ne fonctionnera pas. J'ai donc utilisé git rev-parse --show-prefix
pour obtenir le chemin du dossier actuel par rapport à la racine git (qui serait b/
) dans cet exemple.
Ensuite, j'ai utilisé l' vim
extension de chemin pour ajouter le nom du fichier (c'est-à-dire foo.ext
). #1
dit vim
de récupérer le chemin de n'importe quel fichier chargé dans le tampon 1, et :t
extrait la "queue", qui est tout après le dernier /
dans le chemin retourné par #1
. Dans certains cas #1
et #1:t
sont égaux, mais ce n'est pas toujours le cas. Par exemple, si vous avez exécuté vim b/foo.ext
alors #1
renverrait au b/foo.ext
lieu de simplement foo.ext
. Consultez :help expand
pour plus d'informations.
Bien sûr, vous pouvez simplement entrer le chemin manuellement, comme dans :tabnew | r! git show HEAD^:b/foo.ext
, et cela fonctionnerait. Mais la version ci-dessus est scriptable ou vous pouvez l'assigner à une carte.