Git: è possibile mettere in scena una regione selezionata direttamente dal buffer di file?


14

Con Magit è possibile aprire il buffer di stato magit, premere TABper espandere il diff (o RETper richiamare un buffer diff separato), contrassegnare parti di un pezzo e premere so uper mettere in scena / non-stage la regione. Veramente bello.

Vorrei sapere se è possibile:

  • modifica un file
  • seleziona una regione, un pezzo o più blocchi all'interno del buffer di file
  • mette in scena / non scena la regione selezionata o il pezzo intorno al punto

Sembri un po 'confuso riguardo a hunk vs. region. Ti ho modificato la descrizione di ciò che fa Magit e le tue domande. Tuttavia, potrei non aver indovinato correttamente ciò che intendevi chiedere.
Tarsius

@tarsius Forse sono confuso, per me una regione è ciò che ho appena selezionato all'interno del buffer e l'hunk è la regione selezionata pronta per essere messa in scena. Ho sbagliato?
Nsukami _

2
"Regione" è un termine Emacs, è la cosa tra il punto e il segno, cioè "la selezione". "Hunk" è un termine Git, inizia con ad es. "@@ -1,1 +1,1" e termina immediatamente prima dell'intestazione successiva che inizia un nuovo hunk. Magit evidenzia la sezione corrente (che potrebbe essere una sezione di hunk) allo stesso modo in cui Emacs evidenzia generalmente la regione, quindi ciò potrebbe aver contribuito alla tua confusione.
tarsius

1
In uno stato magit o in un buffer solo diff puoi mettere in scena il pezzo corrente indipendentemente da dove ti trovi semplicemente premendo s. Ma puoi anche mettere in scena solo una parte del pezzo, contrassegnandone alcune parti (nello stesso modo in cui lo faresti in un buffer per la visita di file) e quindi mettere in scena solo quello.
tarsius

@tarsius esattamente cosa intendo, il mio inglese non è abbastanza nitido.
Nsukami _

Risposte:


11

No, Magit non lo supporta. Le versioni future potrebbero però. Git-Gutter ora lo supporta. Il comando è chiamato git-gutter:stage-hunk.


Mentre questo mette in scena un pezzo, non mette in scena una regione.
ocodo

Trovo che sia meglio creare un'associazione per mettere in scena un pezzo, poi un altro per saltare al pezzo successivo, palco e ripetere. C'è anche un modo per mettere in scena un intero buffer, ma a quel punto potresti anche farlo dalla riga di comando. Trovo che sia meglio effettuare commit a livello di blocco con git-gutter + magit. Le modifiche più grandi non sono adatte per git-gutter.
Droogans,

1

Come accennato in precedenza, git-gutter è un'estensione progettata per mostrarti le informazioni git direttamente nel tuo file e operare da lì, mentre magit si concentra sull'operare su diff.

Questa funzione non è pianificata per Git Gutter presto ( https://github.com/syohex/emacs-git-gutter/issues/91 )

Tuttavia è il genere di cose che emacs lisp dovrebbe essere molto bravo a ripulire (passare attraverso gli hunk in una regione e metterli in scena una volta). Provando questo da solo questo era quasi il caso, l'unico problema era che git-gutter avvia un processo in background dopo aver messo in scena un pezzo e non aspetta che finisca, quindi ho dovuto aggiungere un po 'di magia azzurrata per affrontarlo.

La seguente funzione emacs lisp dovrebbe fare quello che vuoi. Potresti voler associarlo ad alcune chiavi.

(defun my-git-stage-region ()
  (interactive)
  (let ((git-gutter:ask-p nil)
        (start (region-beginning))
        (end (region-end)))
    (save-excursion
      (goto-char start)
      (git-gutter:next-hunk 1)
      (while (< (point) end)
        (git-gutter:stage-hunk)
        ;; This is a hack to wait for git-gutter to finish
        ;; updating information (git-gutter kicks
        ;; of a process to update the diff information
        ;; and does not block)
        (while (get-buffer (git-gutter:diff-process-buffer (git-gutter:base-file)))
          (sit-for 0.05))
        (git-gutter:next-hunk 1)))))

NOTA: questo non può suddividere gli hunk, gli hunk sono completamente messi in scena o non vengono affatto messi in scena. Tuttavia git-gutter tende ad avere blocchi relativamente piccoli, motivo per cui ho implementato questa funzione.
Att Righ,
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.