È possibile avviare vimdiff per le differenze git nella scheda del processo corrente?

Jan 20 2021

Diciamo che ho un buffer di file aperto e una :terminalsuddivisione aperta in 1 scheda. Vorrei creare una nuova scheda in cui corro, vimdiffma viene visualizzato il mio diff git. Sto cercando di git difftool HEAD~1presentarmi 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 terminale 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

2 NikolasTapia Jan 20 2021 at 17:03

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

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. Nella scheda appena aperta, :vert sb 1 | windo diffthis

Spiegazione

  1. apre prima una nuova scheda con tabnewe carica al suo interno il contenuto della HEAD^versione del file nel buffer 1.
  2. apre una divisione verticale contenente il buffer 1 con vert sb 1, quindi invia :diffthisa tutti i buffer nella scheda per entrare in modalità diff.

modificare

L'OP ha chiesto qualche spiegazione in più sul passaggio 1. ha git showbisogno 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.exttale che bcontiene la tua .gitcartella (cioè bè la radice del tuo repository), per git showfunzionare correttamente dovresti invocarlo con HEAD^:b/foo.e. Usando uno /a/b/foo.exto l'altro o foo.extnon funzionerà. Quindi ho usato git rev-parse --show-prefixper ottenere il percorso della cartella corrente relativo alla radice git (che sarebbe b/) in questo esempio.

Quindi, ho usato l' vimespansione del percorso per aggiungere il nome del file (cioè foo.ext). #1dice vimdi recuperare il percorso di qualunque file sia caricato nel buffer 1, ed :testrae la "coda", che è tutto dopo l'ultimo /nel percorso restituito da #1. In alcuni casi #1e #1:tsono uguali, ma non è sempre così. Per esempio, se è stato eseguito vim b/foo.extpoi #1sarebbe tornato b/foo.extinvece di foo.ext. Controlla :help expandper 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.