Czy vimdiff dla git diffs można uruchomić w zakładce bieżącego procesu?

Jan 20 2021

Powiedzmy, że mam otwarty bufor plików i :terminalpodzielony na 1 kartę. Chciałbym utworzyć nową kartę, na której uruchamiam, vimdiffale pokazuję mój git diff. Próbuję git difftool HEAD~1pokazać się w moim obecnym procesie vim, tylko na innej stronie karty.

Czy jest to możliwe na Vimie 8 bez wtyczek?

Mam taką iluzję, kiedy to robię, :tab terminala potem biegnę git difftool HEAD~1. Jednak to uruchamia podproces vima i chciałbym tego uniknąć.

Coś jak to pytanie: Jak wejść w tryb vimdiff, skoro dwa podziały są już otwarte? ale dla różnic git.

Odpowiedzi

2 NikolasTapia Jan 20 2021 at 17:03

Chociaż jest to z pewnością wykonalne w przypadku wanilii vim, proponuję przyjrzeć się doskonałej vim-fugitivewtyczce tpope . Następnie po prostu musisz zrobić, :tab Gdiffaby uzyskać to, czego chcesz.

Jeśli naprawdę nie chcesz instalować żadnych wtyczek, poniższe czynności mogą działać, zakładając, że bieżący plik znajduje się w buforze nr. 1:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. W nowo otwartej zakładce :vert sb 1 | windo diffthis

Wyjaśnienie

  1. najpierw otwiera nową kartę z tabnewi ładuje do niej zawartość HEAD^wersji pliku w buforze 1.
  2. otwiera pionowy podział zawierający bufor 1 za pomocą vert sb 1, a następnie wysyła :diffthisdo wszystkich buforów na karcie, aby przejść do trybu porównywania.

Edytować

Program operacyjny poprosił o więcej wyjaśnień na temat kroku 1. git showwymaga wprowadzenia formularza, <rev>:<path>gdzie <path>musi odnosić się do korzenia drzewa roboczego. Na przykład, jeśli bezwzględna ścieżka do pliku w buforze 1 jest /a/b/foo.exttaka, że bzawiera twój .gitfolder (tj. bJest katalogiem głównym repozytorium), git showaby działał poprawnie, musiałbyś go wywołać HEAD^:b/foo.e. Używanie któregoś z nich /a/b/foo.extlub foo.extnie zadziała. Więc użyłem git rev-parse --show-prefixdo uzyskania ścieżki bieżącego folderu względem katalogu głównego git (którym byłby b/) w tym przykładzie.

Następnie użyłem vimrozszerzenia ścieżki, aby dodać nazwę pliku (to znaczy foo.ext). #1mówi, vimaby pobrać ścieżkę do dowolnego pliku załadowanego do bufora 1 i :twyodrębnia „koniec”, czyli wszystko po ostatnim /w ścieżce zwróconej przez #1. W niektórych przypadkach #1i #1:tsą równe, ale nie zawsze tak jest. Na przykład, jeśli prowadził vim b/foo.extwtedy #1zwróciłby b/foo.extzamiast po prostu foo.ext. Sprawdź, :help expandaby uzyskać więcej informacji.

Oczywiście możesz po prostu wprowadzić ścieżkę ręcznie, tak jak w :tabnew | r! git show HEAD^:b/foo.ext, i to zadziała. Ale powyższa wersja jest skryptowalna lub można ją przypisać do mapy.