Vimdiff pour git diffs peut-il être démarré dans l'onglet du processus actuel?

Jan 20 2021

Disons que j'ai un tampon de fichier ouvert et un :terminalfractionnement ouvert en 1 page à onglet. Je voudrais créer un nouvel onglet où je cours vimdiffmais que mon git diff s'affiche. J'essaye git difftool HEAD~1d'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 terminalet 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

2 NikolasTapia Jan 20 2021 at 17:03

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 Gdiffpour 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:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. Dans l'onglet nouvellement ouvert, :vert sb 1 | windo diffthis

Explication

  1. ouvre d'abord un nouvel onglet avec tabnewet y charge le contenu de la HEAD^version du fichier dans le tampon 1.
  2. 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 showbesoin d'une entrée du formulaire <rev>:<path><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.exttel qu'il bcontient votre .gitdossier (c'est b-à- dire est la racine de votre dépôt), pour git showfonctionner correctement, vous devrez l'invoquer avec HEAD^:b/foo.e. Utiliser l'un /a/b/foo.extou l' autre ou foo.extne fonctionnera pas. J'ai donc utilisé git rev-parse --show-prefixpour obtenir le chemin du dossier actuel par rapport à la racine git (qui serait b/) dans cet exemple.

Ensuite, j'ai utilisé l' vimextension de chemin pour ajouter le nom du fichier (c'est-à-dire foo.ext). #1dit vimde récupérer le chemin de n'importe quel fichier chargé dans le tampon 1, et :textrait la "queue", qui est tout après le dernier /dans le chemin retourné par #1. Dans certains cas #1et #1:tsont égaux, mais ce n'est pas toujours le cas. Par exemple, si vous avez exécuté vim b/foo.extalors #1renverrait au b/foo.extlieu de simplement foo.ext. Consultez :help expandpour 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.