Czy vimdiff dla git diffs można uruchomić w zakładce bieżącego procesu?
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
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:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t- W nowo otwartej zakładce
:vert sb 1 | windo diffthis
Wyjaśnienie
- najpierw otwiera nową kartę z
tabnewi ładuje do niej zawartośćHEAD^wersji pliku w buforze 1. - 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.