Git: czy możliwe jest stopniowanie wybranego regionu bezpośrednio z bufora plików?

14

Za pomocą Magit możesz otworzyć bufor stanu magit, naciśnij, TABaby rozwinąć różnicę (lub RETaby wyświetlić osobny bufor różnic), zaznaczyć części przystawki i nacisnąć slub, uaby wystawić / wyreżyserować region. Bardzo miły.

Chciałbym wiedzieć, czy można:

  • edytować plik
  • wybierz region, przystojniak lub kilka przystawek bezpośrednio w buforze plików
  • ustaw / ustaw scenę wybranego regionu lub przystojniaka wokół punktu
Nsukami _
źródło
Wyglądasz na trochę zdezorientowanego w kwestii przystojniak kontra region. Zredagowałem ci opis tego, co robi magit i twoje pytania. Być może jednak nie zgadłem poprawnie, o co chciałeś zapytać.
tarsjusza
@tarsius Może jestem zdezorientowany, dla mnie region jest tym, co właśnie wybrałem w buforze, a przystojniak to wybrany region gotowy do przygotowania. Czy się mylę?
Nsukami _
2
„Region” to termin Emacsa, to rzecz pomiędzy punktem i znakiem, tj. „Wybór”. „Przystojniak” jest terminem Git, zaczyna się np. „@@ -1,1 +1,1” i kończy tuż przed następnym takim nagłówkiem, który rozpoczyna nowy przystojniak. Magit podświetla bieżącą sekcję (która może być sekcją przystojniaka) w podobny sposób, w jaki Emacs ogólnie podkreśla region, co mogło przyczynić się do twojego zamieszania.
Tarsius
1
W stanie magit lub buforze zawierającym tylko różnicę możesz ustawić aktualny przystojniak, niezależnie od tego, gdzie jesteś w przystani, po prostu naciskając s. Ale możesz też wystawić tylko część przystawki, zaznaczając jej części (w taki sam sposób, jak w buforze do przeglądania plików), a następnie stwórz właśnie to.
tarsius
@tarsius dokładnie co mam na myśli, mój angielski nie jest wystarczająco ostry.
Nsukami _

Odpowiedzi:

11

Nie, Magit tego nie obsługuje. Jednak przyszłe wersje mogą. Git-Gutter obsługuje to teraz. Polecenie ma nazwę git-gutter:stage-hunk.

Tarsjusz
źródło
Chociaż to robi przystojniak, nie wystawia regionu.
ocodo
Uważam, że najlepiej jest utworzyć powiązanie, aby wystawić przystojniaka, a następnie przejść do następnego przystojniaka, etapu i powtórzyć. Istnieje również sposób na przygotowanie całego bufora, ale w tym momencie równie dobrze możesz to zrobić z wiersza poleceń. Uważam, że najlepiej jest zatwierdzać zmiany na poziomie bloku za pomocą git-gutter + magit. Większe zmiany nie są odpowiednie dla rynsztoków.
Droogans
1

Jak wspomniano wcześniej, git-gutter jest rozszerzeniem zaprojektowanym do wyświetlania informacji git bezpośrednio w pliku i działania stamtąd, podczas gdy magit koncentruje się na operowaniu na diffach.

Ta funkcja nie jest planowana w najbliższym czasie na git gutter ( https://github.com/syohex/emacs-git-gutter/issues/91 )

Jednak jest to coś, co sprawia, że ​​emacs lisp powinien być bardzo dobry w usuwaniu (przejdź przez przystojniaki w regionie i wystaw je na czas). Próbowałem tego sam, tak było prawie w tym przypadku, jedynym problemem było to, że git-rynna uruchamia proces w tle po tym, jak przygotowałeś przystojniak i nie czeka na jego zakończenie, więc musiałem dodać trochę zuchwałej magii, aby sobie z tym poradzić.

Poniższa funkcja emacs lisp powinna robić, co chcesz. Możesz powiązać go z niektórymi kluczami.

(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
źródło
UWAGA: Nie można podzielić porcji, porcje są albo całkowicie zainscenizowane, albo wcale. Jednak git-rynna ma zwykle stosunkowo małe przystawki, dlatego właśnie zaimplementowałem tę funkcję.
Att Righ