Git: возможно ли выделить выбранную область прямо из буфера файлов?

14

С помощью Magit вы можете открыть буфер состояния magit, нажать, TABчтобы увеличить различие (или RETвызвать отдельный буфер различий ), отметить части блока и нажать sили, uчтобы поставить / удалить сцену из области. Действительно мило.

Я хотел бы знать, возможно ли:

  • редактировать файл
  • выберите область, блок или несколько блоков прямо в буфере файлов
  • ставить / отключать выбранный регион или точку вокруг
Нсуками _
источник
Вы, кажется, немного сбиты с толку по поводу ломоть против региона. Я отредактировал вам описание того, что делает magit и ваши вопросы. Я, возможно, не угадал, что вы хотели спросить, хотя.
tarsius
@tarsius Возможно, я запутался, для меня регион - это то, что я только что выбрал в буфере, а кусок - это выбранный регион, готовый для постановки. Я ошибаюсь?
Nsukami _
2
«Регион» - это термин Emacs, он находится между точкой и отметкой, то есть «выделение». «Hunk» - это термин Git, он начинается, например, с «@@ -1,1 +1,1» и заканчивается прямо перед следующим таким заголовком, который начинает новый блок. Magit выделяет текущую секцию (которая может быть секцией хака) почти так же, как Emacs обычно выделяет регион, так что это могло бы привести к вашей путанице.
Tarsius
1
В состоянии magit или в буфере только для различий вы можете настроить текущий блок независимо от того, где вы находитесь внутри блока, просто нажав s. Но вы также можете поставить только часть фрагмента, пометив его части (так же, как вы делали бы это в буфере для посещения файлов), и затем выполнить только это.
Tarsius
@tarsius именно то, что я имею в виду, мой английский просто не достаточно острый.
Nsukami _

Ответы:

11

Нет, Magit не поддерживает это. Будущие версии могли бы все же. Git-Gutter поддерживает это сейчас. Команда названа git-gutter:stage-hunk.

Tarsius
источник
В то время как это действительно ставит ломоть, это не ставит регион.
ocodo
Я считаю, что лучше создать привязку для создания фрагмента, а затем - для перехода к следующему фрагменту, этапу и повторению. Есть также способ создания целого буфера, но в этот момент вы можете сделать это из командной строки. Я считаю, что лучше делать коммиты на уровне блоков с помощью git-gutter + magit. Большие изменения не подходят для мерзавца.
Дрооганс
1

Как упоминалось ранее, git-gutter - это расширение, предназначенное для отображения информации о git непосредственно в вашем файле и работы с ней, тогда как magit фокусируется на работе с diff.

Эта функция не планируется для git gutter в ближайшее время ( https://github.com/syohex/emacs-git-gutter/issues/91 )

Тем не менее, emacs lisp хорошо подходит для того, чтобы вытереть его (пройтись по кусочкам в регионе и постепенно убрать их). Попробовав это сам, это был почти тот случай, единственной проблемой было то, что git-gutter запускает фоновый процесс после того, как вы установили блок, и не ждет его завершения, поэтому мне пришлось добавить немного хакерской магии, чтобы справиться с этим.

Следующая функция emacs lisp должна делать то, что вы хотите. Возможно, вы захотите связать его с некоторыми клавишами.

(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
источник
ПРИМЕЧАНИЕ: это не может разделить фрагменты, фрагменты либо полностью организованы, либо вообще не организованы. Однако, у мерзавца есть относительно небольшие куски, именно поэтому я реализовал эту функцию.
Att Righ