Git: ist es möglich eine ausgewählte region direkt aus dem dateipuffer zu inszenieren?

14

Mit Magit können Sie den Magit-Statuspuffer öffnen, drücken TAB, um das Diff zu erweitern (oder RETum einen separaten Diff-Puffer aufzurufen ), Teile eines Hunks zu markieren und soder udrücken, um die Region zu inszenieren / zu entfernen. Wirklich nett.

Ich würde gerne wissen, ob es möglich ist:

  • eine Datei bearbeiten
  • Wählen Sie eine Region, ein Stück oder mehrere Stücke direkt im Dateipuffer aus
  • Bühne / Bühne die ausgewählte Region oder das Stück um Punkt
Nsukami _
quelle
Sie scheinen ein bisschen verwirrt über Hunk vs. Region. Ich habe deine Beschreibung über das, was magit tut und deine Fragen bearbeitet. Vielleicht habe ich nicht richtig geraten, was Sie fragen wollten.
Tarsius
@tarsius Vielleicht bin ich verwirrt, für mich ist eine Region das, was ich gerade im Puffer ausgewählt habe, und der Hunk ist die ausgewählte Region, die für die Inszenierung bereit ist. Liege ich falsch?
Nsukami _
2
"Region" ist ein Emacs-Begriff, es ist das Ding zwischen Punkt und Marke, dh "die Auswahl". "Hunk" ist ein Git-Begriff, der mit "@@ -1,1 +1,1" beginnt und direkt vor der nächsten Überschrift endet, in der ein neues Stück beginnt. Magit hebt den aktuellen Abschnitt (der möglicherweise ein Blockabschnitt ist) auf die gleiche Weise hervor, wie Emacs im Allgemeinen die Region hervorhebt, was möglicherweise zu Ihrer Verwirrung beigetragen hat.
Tarsius
1
In einem Magit-Status oder einem Diff-Only-Buffer können Sie das aktuelle Stück unabhängig von der Position innerhalb des Stücks einfach durch Drücken von inszenieren s. Sie können aber auch nur einen Teil des Hunks inszenieren, indem Sie Teile davon markieren (auf die gleiche Weise, wie Sie dies in einem Dateibesuchspuffer tun würden) und dann genau das inszenieren.
Tarsius
@tarsius genau das, was ich meine, mein Englisch ist einfach nicht scharf genug.
Nsukami _

Antworten:

11

Nein, Magit unterstützt das nicht. Zukünftige Versionen könnten jedoch. Git-Gutter unterstützt es jetzt. Der Befehl heißt git-gutter:stage-hunk.

Tarsius
quelle
Während dies ein Stück inszeniert, inszeniert es keine Region.
ocodo
Ich finde, es ist am besten, eine Bindung zu erstellen, um ein Stück zu inszenieren, und dann eine andere, um zum nächsten Stück zu springen, zu inszenieren und zu wiederholen. Es gibt auch eine Möglichkeit, einen gesamten Puffer bereitzustellen, aber an diesem Punkt können Sie dies genauso gut über die Befehlszeile tun. Ich finde es am besten, Commits auf Blockebene mit git-gutter + magit zu machen. Größere Änderungen eignen sich nicht für Git-Rinnen.
Droogans
1

Wie bereits erwähnt, ist git-gutter eine Erweiterung, mit der Sie Git-Informationen direkt in Ihrer Datei anzeigen und von dort aus arbeiten können, während sich magit auf die Arbeit mit Diffs konzentriert.

Diese Funktion ist in Kürze nicht mehr für Git-Rinnen vorgesehen ( https://github.com/syohex/emacs-git-gutter/issues/91 ).

Allerdings ist es die Art von Dingen, die Emacs Lispel sehr gut abwischen können (durch die Kerle in einer Region gehen und sie eine Zeit lang in Szene setzen). Als ich das selbst versuchte, war das fast der Fall, das einzige Problem war, dass Git-Gutt einen Hintergrundprozess auslöste, nachdem Sie ein Stück inszeniert hatten und nicht darauf gewartet hatten, dass es zu Ende war.

Die folgende Emacs Lisp-Funktion sollte tun, was Sie wollen. Möglicherweise möchten Sie es an einige Schlüssel binden.

(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)))))
Att Righ
quelle
HINWEIS: Dies kann keine Hunks aufteilen. Hunks werden entweder vollständig oder gar nicht bereitgestellt. Git-Rinne neigt jedoch dazu, relativ kleine Kerle zu haben, weshalb ich diese Funktion implementiert habe.
Att Righ