Czy vimdiff dla git diffs można uruchomić w zakładce bieżącego procesu?
Powiedzmy, że mam otwarty bufor plików i :terminal
podzielony na 1 kartę. Chciałbym utworzyć nową kartę, na której uruchamiam, vimdiff
ale pokazuję mój git diff. Próbuję git difftool HEAD~1
pokazać 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 terminal
a 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 Gdiff
aby 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
tabnew
i ł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:diffthis
do 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 show
wymaga 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.ext
taka, że b
zawiera twój .git
folder (tj. b
Jest katalogiem głównym repozytorium), git show
aby działał poprawnie, musiałbyś go wywołać HEAD^:b/foo.e
. Używanie któregoś z nich /a/b/foo.ext
lub foo.ext
nie zadziała. Więc użyłem git rev-parse --show-prefix
do 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 vim
rozszerzenia ścieżki, aby dodać nazwę pliku (to znaczy foo.ext
). #1
mówi, vim
aby pobrać ścieżkę do dowolnego pliku załadowanego do bufora 1 i :t
wyodrębnia „koniec”, czyli wszystko po ostatnim /
w ścieżce zwróconej przez #1
. W niektórych przypadkach #1
i #1:t
są równe, ale nie zawsze tak jest. Na przykład, jeśli prowadził vim b/foo.ext
wtedy #1
zwróciłby b/foo.ext
zamiast po prostu foo.ext
. Sprawdź, :help expand
aby 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.