Git: est-il possible de mettre en scène une région sélectionnée directement à partir du tampon de fichier?

14

Avec Magit, vous pouvez ouvrir le tampon d'état magit, appuyez sur TABpour agrandir le diff (ou RETpour faire apparaître un tampon de diff distinct), marquer des parties d'un morceau et appuyez sur sou upour mettre en scène / déchaîner la région. Vraiment sympa.

Je voudrais savoir s'il est possible de:

  • éditer un fichier
  • sélectionner une région, un morceau ou plusieurs morceaux à l'intérieur du tampon de fichiers
  • mettre en scène / déchaîner la région sélectionnée ou le morceau autour du point
Nsukami _
la source
Vous semblez un peu confus au sujet du morceau contre la région. Je vous ai édité la description de ce que fait Magit et vos questions. Je n'ai peut-être pas deviné correctement ce que vous aviez l'intention de demander, cependant.
tarsius
@tarsius Peut-être que je suis confus, pour moi une région est ce que je viens de sélectionner à l'intérieur du tampon, et le morceau est la région sélectionnée prête à être mise en scène. Ai-je tort?
Nsukami _
2
"Région" est un terme Emacs, c'est la chose entre le point et la marque, c'est-à-dire "la sélection". "Hunk" est un terme Git, il commence par exemple par "@@ -1,1 +1,1" et se termine juste avant le titre suivant qui commence un nouveau morceau. Magit met en surbrillance la section actuelle (qui peut être une section de gros morceau) de la même manière qu'Emacs met généralement en surbrillance la région, ce qui pourrait avoir contribué à votre confusion.
tarsius
1
Dans un état magit ou un tampon de diff uniquement, vous pouvez mettre en scène le morceau actuel indépendamment de l'endroit où vous vous trouvez dans le morceau en appuyant simplement sur s. Mais vous pouvez également mettre en scène juste une partie du morceau, en marquant des parties de celui-ci (de la même manière que vous le feriez dans un tampon de visite de fichier), puis mettre en scène juste cela.
tarsius
@tarsius exactement ce que je veux dire, mon anglais n'est tout simplement pas assez pointu.
Nsukami _

Réponses:

11

Non, Magit ne prend pas cela en charge. Les futures versions pourraient cependant. Git-Gutter le supporte maintenant. La commande est nommée git-gutter:stage-hunk.

tarse
la source
Bien que cela mette en scène un morceau, il ne met pas en scène une région.
ocodo
Je trouve qu'il est préférable de créer une liaison pour mettre en scène un morceau, puis une autre pour passer au morceau, à la scène et à la répétition suivants. Il existe également un moyen de mettre en scène un tampon entier, mais à ce stade, vous pouvez tout aussi bien le faire à partir de la ligne de commande. Je trouve qu'il est préférable de faire des commits au niveau du bloc avec git-gutter + magit. Les changements plus importants ne conviennent pas à Git-Gutter.
Droogans
1

Comme mentionné précédemment, git-gutter est une extension conçue pour vous montrer les informations git directement dans votre fichier, et fonctionner à partir de là, tandis que magit se concentre sur les différences.

Cette fonctionnalité n'est pas prévue pour git gutter de si tôt ( https://github.com/syohex/emacs-git-gutter/issues/91 )

Cependant, c'est le genre de chose que Emacs Lisp devrait être très bon pour essuyer (passez par les mecs d'une région et mettez-les en scène une fois). En essayant moi-même, c'était presque le cas, le seul problème était que Git-Gutter déclenche un processus d'arrière-plan après avoir mis en scène un morceau et n'attend pas qu'il se termine, j'ai donc dû ajouter un peu de magie hacky pour y faire face.

La fonction emacs lisp suivante devrait faire ce que vous voulez. Vous voudrez peut-être le lier à certaines clés.

(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
la source
REMARQUE: cela ne peut pas diviser les mecs, les mecs sont soit complètement mis en scène, soit pas du tout mis en scène. Cependant, Git-Gutter a tendance à avoir des morceaux relativement petits, c'est précisément pourquoi j'ai implémenté cette fonctionnalité.
Att Righ