È possibile avviare vimdiff per le differenze git nella scheda del processo corrente?
Diciamo che ho un buffer di file aperto e una :terminal
suddivisione aperta in 1 scheda. Vorrei creare una nuova scheda in cui corro, vimdiff
ma viene visualizzato il mio diff git. Sto cercando di git difftool HEAD~1
presentarmi nel mio attuale processo vim, solo in un'altra pagina della scheda.
È possibile su Vim 8 senza plugin?
Mi viene in qualche modo questa illusione quando lo faccio :tab terminal
e poi corro git difftool HEAD~1
. Tuttavia, questo avvia un sottoprocesso di vim e vorrei evitarlo.
Un po 'come questa domanda: come si accede alla modalità vimdiff dato che due divisioni sono già aperte? ma per git diff.
Risposte
Anche se questo è certamente fattibile in vaniglia vim
, ti suggerisco di dare un'occhiata all'eccellente vim-fugitiveplugin di tpope . Quindi, devi semplicemente fare :tab Gdiff
per ottenere ciò che desideri.
Se davvero non si desidera installare alcun plug-in, quanto segue potrebbe funzionare supponendo che il file corrente sia nel buffer n. 1:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
- Nella scheda appena aperta,
:vert sb 1 | windo diffthis
Spiegazione
- apre prima una nuova scheda con
tabnew
e carica al suo interno il contenuto dellaHEAD^
versione del file nel buffer 1. - apre una divisione verticale contenente il buffer 1 con
vert sb 1
, quindi invia:diffthis
a tutti i buffer nella scheda per entrare in modalità diff.
modificare
L'OP ha chiesto qualche spiegazione in più sul passaggio 1. ha git show
bisogno di un input del modulo <rev>:<path>
dove <path>
deve essere relativo alla radice dell'albero di lavoro. Ad esempio, se il percorso assoluto del file nel buffer 1 è /a/b/foo.ext
tale che b
contiene la tua .git
cartella (cioè b
è la radice del tuo repository), per git show
funzionare correttamente dovresti invocarlo con HEAD^:b/foo.e
. Usando uno /a/b/foo.ext
o l'altro o foo.ext
non funzionerà. Quindi ho usato git rev-parse --show-prefix
per ottenere il percorso della cartella corrente relativo alla radice git (che sarebbe b/
) in questo esempio.
Quindi, ho usato l' vim
espansione del percorso per aggiungere il nome del file (cioè foo.ext
). #1
dice vim
di recuperare il percorso di qualunque file sia caricato nel buffer 1, ed :t
estrae la "coda", che è tutto dopo l'ultimo /
nel percorso restituito da #1
. In alcuni casi #1
e #1:t
sono uguali, ma non è sempre così. Per esempio, se è stato eseguito vim b/foo.ext
poi #1
sarebbe tornato b/foo.ext
invece di foo.ext
. Controlla :help expand
per maggiori informazioni.
Ovviamente, potresti semplicemente inserire il percorso manualmente, come in :tabnew | r! git show HEAD^:b/foo.ext
, e funzionerebbe. Ma la versione sopra è scriptabile o puoi assegnarla a una mappa.