Git: ¿es posible organizar una región seleccionada directamente desde el búfer de archivo?

14

Con Magit puede abrir el búfer de estado de magit, presione TABpara expandir el diff (o RETpara abrir un búfer de diff separado), marque partes de un trozo y presione so upara escenificar / desestabilizar la región. Muy agradable.

Me gustaría saber si es posible:

  • editar un archivo
  • seleccione una región, trozo o varios trozos directamente dentro del búfer de archivos
  • escenificar / desestabilizar la región seleccionada o el punto de trozo
Nsukami _
fuente
Pareces un poco confundido sobre hunk vs. region. Te he editado la descripción de lo que hace magit y tus preguntas. Sin embargo, es posible que no haya adivinado correctamente lo que pretendías preguntar.
tarsius
@tarsius Tal vez estoy confundido, para mí una región es lo que acabo de seleccionar dentro del búfer, y el trozo es la región seleccionada lista para ser puesta en escena. ¿Me equivoco?
Nsukami _
2
"Región" es un término de Emacs, es la cosa entre el punto y la marca, es decir, "la selección". "Hunk" es un término Git, comienza con, por ejemplo, "@@ -1,1 +1,1" y termina justo antes del siguiente encabezado que comienza con un nuevo trozo. Magit resalta la sección actual (que puede ser una sección de trozos) de la misma manera que Emacs generalmente resalta la región, por lo que podría haber contribuido a su confusión.
tarsius
1
En un estado de magit o en un búfer de solo diferencia, puede organizar el trozo actual independientemente de dónde se encuentre dentro del trozo simplemente presionando s. Pero también puede organizar solo una parte del trozo, marcando partes del mismo (de la misma manera que lo haría en un búfer de visita de archivos) y luego escenificar solo eso.
tarsius
@tarsius exactamente lo que quiero decir, mi inglés no es lo suficientemente agudo.
Nsukami _

Respuestas:

11

No, Magit no lo admite. Sin embargo, las versiones futuras podrían. Git-Gutter lo soporta ahora. El comando se llama git-gutter:stage-hunk.

tarsius
fuente
Si bien esto representa un trozo, no representa una región.
ocodo
Creo que es mejor crear un enlace para organizar un trozo, luego otro para saltar al siguiente trozo, escenario y repetir. También hay una manera de organizar un búfer completo, pero en ese punto también podría hacerlo desde la línea de comandos. Creo que es mejor hacer commits a nivel de bloque con git-gutter + magit. Los cambios más grandes no son adecuados para git-gutter.
Droogans
1

Como se mencionó anteriormente, git-gutter es una extensión diseñada para mostrarle información de git directamente en su archivo y operar desde allí, mientras que magit se enfoca en operar en diffs.

Esta característica no está planificada para git gutter en el corto plazo ( https://github.com/syohex/emacs-git-gutter/issues/91 )

Sin embargo, es el tipo de cosas que emacs lisp debería ser muy bueno para limpiar (ir a través de los trozos en una región y organizarlos en un momento). Probar esto yo mismo fue casi el caso, el único problema fue que git-gutter inicia un proceso en segundo plano después de que colocas un trozo y no espera a que termine, así que tuve que agregar un poco de magia hacky para lidiar con esto.

La siguiente función de emacs lisp debe hacer lo que desee. Es posible que desee vincularlo a algunas teclas.

(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
fuente
NOTA: Esto no puede dividir trozos, los trozos están completamente organizados o no montados en absoluto. Sin embargo, git-gutter tiende a tener trozos relativamente pequeños, razón por la cual implementé esta característica.
Att Righ