Git: é possível preparar uma região selecionada diretamente do buffer do arquivo?

14

Com o Magit, você pode abrir o buffer de status do magit, pressionar TABpara expandir o diff (ou RETabrir um buffer de diff separado), marcar partes de um pedaço e pressionar sou upara encenar / desestabilizar a região. Muito legal.

Gostaria de saber se é possível:

  • editar um arquivo
  • selecione uma região, pedaço ou vários pedaços dentro do buffer de arquivo
  • encenar / desfilar a região selecionada ou o pedaço ao redor do ponto
Nsukami _
fonte
Você parece um pouco confuso sobre pedaço versus região. Editei a descrição do que o magit faz e suas perguntas. Talvez eu não tenha adivinhado corretamente o que você pretendia perguntar.
tarsius
@ tarso Talvez eu esteja confuso, para mim uma região é o que acabei de selecionar dentro do buffer, e o pedaço é a região selecionada pronta para ser encenada. Estou errado?
Nsukami _
2
"Região" é um termo do Emacs, é a coisa entre o ponto e a marca, ou seja, "a seleção". "Pedaço" é um termo do Git, que começa com, por exemplo, "@@ -1,1 +1,1" e termina logo antes do próximo cabeçalho que inicia um novo pedaço. O Magit destaca a seção atual (que pode ser uma seção do hunk) da mesma maneira que o Emacs geralmente destaca a região, de modo que pode ter contribuído para a sua confusão.
tarsius
1
Em um status magit ou buffer somente diff, você pode preparar o pedaço atual, independentemente de onde ele esteja, simplesmente pressionando s. Mas você também pode encenar apenas parte do pedaço, marcando partes dele (da mesma maneira que faria em um buffer de visita a arquivos) e depois encenar exatamente isso.
tarsius
Tarso @ exatamente o que quero dizer, meu inglês não é suficientemente nítido.
Nsukami _

Respostas:

11

Não, o Magit não suporta isso. Versões futuras podem, no entanto. O Git-Gutter suporta isso agora. O comando é nomeado git-gutter:stage-hunk.

tarso
fonte
Enquanto isso encena um pedaço, não encena uma região.
Ocodo 12/03
Acho que é melhor criar uma ligação para encenar um pedaço, depois outra para pular para o próximo pedaço, encenar e repetir. Há também uma maneira de preparar um buffer inteiro, mas nesse ponto você pode estar fazendo isso na linha de comando. Acho que é melhor fazer commits no nível do bloco com git-gutter + magit. Mudanças maiores não são adequadas para o git-sarjeta.
Droogans
1

Como mencionado anteriormente, o git-gutter é uma extensão projetada para mostrar informações git diretamente em seu arquivo e operar a partir daí, enquanto o magit se concentra em operar em diffs.

Esse recurso não está planejado para o git gutter tão cedo ( https://github.com/syohex/emacs-git-gutter/issues/91 )

No entanto, é o tipo de coisa que o emacs lisp deve ser muito bom em limpar (passar pelos pedaços de uma região e encená-los uma vez). Tentando fazer isso sozinho, esse foi quase o caso, o único problema foi o git-gutter iniciar um processo em segundo plano depois que você monta um pedaço e não espera que ele termine, então tive que adicionar um pouco de mágica hacky para lidar com isso.

A seguinte função emacs lisp deve fazer o que você deseja. Você pode querer vinculá-lo a algumas chaves.

(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
fonte
OBSERVAÇÃO: Isso não pode dividir pedaços, os pedaços são completamente encenados ou nem encenados. No entanto, o git-sarjeta tende a ter pedaços relativamente pequenos, e é exatamente por isso que implementei esse recurso.
Att Righ