Combinazione di magit con annulla struttura per una facile navigazione nella cronologia


16

Adoro undo-tree(screenshot qui sotto). Esso fornisce un modo semplice per navigare tra le diverse versioni di un file (finestra superiore) lasciando all'utente di spostarsi intorno albero della storia del file in una finestra separata (finestra in basso) con le chiavi semplici come n, ped C-be C-fall'interruttore attraverso discendenti della stessa genitore.

In particolare, undo-treeaggiorna automaticamente il buffer contenente il file con la versione corrispondente in base alla selezione nella vista ad albero.

Naturalmente, magitè fenomenale per git, e sarebbe sorprendente se avesse una capacità simile, vale a dire consentire agli utenti di navigare in modo interattivo nella cronologia git di un file mentre contemporaneamente aggiorna il buffer contenente automaticamente il file.

Questo è possibile con magitoggi?

inserisci qui la descrizione dell'immagine


Non so se è possibile con magit ma dai un'occhiata a github.com/pidu/git-timemachine
clemera

Non sono sicuro, ma penso che undo-treeusi un albero (è nel nome :-p), mentre la storia di Git è un grafico aciclico diretto . Potrebbe essere non banale.
suvayu,

2
Magit supporta qualcosa di simile, ma al momento sto cambiando il modo in cui la funzione è attivata. Pubblicherò una risposta quando avrò finito.
tarsius

Risposte:


7

Recentemente Magit ha ottenuto il supporto per qualcosa del genere, ma la funzionalità è ancora un po 'approssimativa e deve essere abilitata esplicitamente.


Una funzionalità simile esiste da molto tempo: quando si passa da un commit a un altro in un buffer di log e un'altra finestra nello stesso frame è il buffer di revisione del repository, quel buffer viene aggiornato per mostrare quel commit invece di qualunque commit stava mostrando in precedenza.

Fino a poco tempo fa il buffer di revisione è stato creato quando si è passati da un commit a un altro. Ho modificato questo comportamento e ora il buffer di revisione è sempre e solo aggiornato . Se nessuna finestra nello stesso frame mostra già quel buffer, lo spostamento nel registro non causerà più la visualizzazione del buffer in una nuova finestra o in una finestra esistente che in precedenza visualizzava un altro buffer.

Quindi ora è necessario premere SPCuna volta per visualizzare il buffer di revisione. Solo allora inizierà ad essere aggiornato quando si sposta il buffer di registro.

Se non si desidera aggiornare il buffer di revisione, procedere come segue:

(remove-hook 'magit-section-movement-hook
             'magit-log-maybe-update-revision-buffer)

Se d'altra parte si desidera anche aggiornare il buffer di revisione quando ci si sposta nel buffer di stato, utilizzare questo:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-revision-buffer)

È ora possibile aggiornare automaticamente un buffer BLOB in modo simile. Per prima cosa aggiungi questo:

(add-hook 'magit-section-movement-hook
          'magit-log-maybe-update-blob-buffer)

E forse anche:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-blob-buffer)

Quindi, all'interno di un buffer di registro (o stato), premere RETper visualizzare o aggiornare il buffer di revisione e anche passare a quel buffer. Passa al file che ti interessa e premi di RETnuovo. Ora ci si trova in un buffer "BLOB-visiting", che è simile a un buffer di file-visiting, tranne per il fatto che non visita il file nell'albero di lavoro ma il file come in alcuni commit.

Tornare al buffer del registro (o dello stato) e passare a un altro commit. Il buffer BLOB è in fase di aggiornamento.


Si noti che la visualizzazione di un altro BLOB non riutilizza effettivamente il buffer BLOB esistente. Invece crea un nuovo buffer che visita quel BLOB e quindi visualizza quel buffer nella finestra che in precedenza visualizzava l'altro buffer BLOB. L'altro buffer non viene eliminato, il che sfortunatamente significa che un certo numero di buffer può accumularsi in un breve periodo di tempo. Quale sarebbe uno di quei bordi irregolari, di cui ho parlato prima. La pressione qin un buffer BLOB lo elimina, quindi è possibile ripulire andando alla finestra utilizzata per visualizzare i vari buffer BLOB e continuare a premere qfino a quando tutti i buffer non sono stati eliminati.

Inoltre è possibile passare al BLOB successivo o precedente dall'interno di un buffer BLOB usando pe n. Presumo che nella maggior parte dei casi inizi con un BLOB recente e poi passi indietro ai BLOB più vecchi usando p. Se lo fai e poi vuoi spostarti nella direzione opposta, ti consiglio di usare qper eliminare il buffer corrente e quindi passare al buffer precedente , cioè al BLOB successivo .

Si noti inoltre che non è necessario visitare prima una revisione per poter visitare un BLOB. Puoi anche usarlo M-x magit-find-file RET <revision> RET <file> RETdirettamente, ma lo trovo meno conveniente.


Grazie tarsio. Sto lavorando con Magit 20151014.231(l'ultimo per quanto ne so). Ho provato a seguire i passaggi sopra descritti. Sono andato a quello magit-log-buffer-fileche mi permette di navigare su e giù con i commit ne pma quando premo SPCo RETsu uno di essi ottengo:Symbol's value as variable is void: magit-blame-mode
Amelio Vazquez-Reina

Probabilmente hai aggiunto magit-blame-maybe-update-revision-bufferper magit-section-movement-hookerrore.
tarsius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.