Пропустить шаг отмены в Vim

#vim #tree #undo #3-way-merge

#vim #дерево #отменить #3-way-слияние

Вопрос:

Допустим, я нахожусь в состоянии A в моем документе. Затем я вношу изменения B, C и D (по порядку).

Есть ли способ сохранить изменения B и D, но пропустить C?

Или, допустим, я нахожусь в состоянии A в моем документе. Я вношу изменение B, отменяю его, а затем вношу изменения C и D (таким образом, Vim имеет дерево отмены с двумя ветвями). Затем я передумал и решил, что хочу использовать B и D, но не C.

Как я могу это сделать в Vim? У меня установлен gundo.vim плагин, но я не использовал его так часто.

Комментарии:

1. Режим интересного вопроса. Обычно я использую g- и g , а также множество функций yank / put. Мне было бы очень любопытно, что люди придумывают

2. Я не уверен, что это возможно в Vim. Изменение C может быть основано на B. Что вам в основном нужно, так это способ сохранения определенных состояний документа с изменениями и возможностью последующего объединения различных состояний. Похоже на то, что могут делать системы с исходными версиями ядра при выполнении операций «слияния». Я думаю, вам нужно будет попрактиковаться в использовании именованных буферов и / или сохранении альтернативных версий файла, если вам нужно быстро переключаться между версиями.

3. Я могу представить только один способ сделать это автоматически: импортировать все дерево отмены в некоторые VCS, а затем использовать его для пропуска изменений (например, git rebase -i предоставляет способ удалить некоторый коммит, даже если у него есть дочерние элементы). Но я никогда не видел таких плагинов, поэтому вам придется написать это самостоятельно.

4. Да, это звучит как редактор, который сохраняет каждый шаг в хорошем VCS, таком как Mercurial или Git. Честно говоря, я не думаю, vim что какой-либо другой редактор сможет это сделать. За исключением emacs , конечно, тех случаев, когда вы можете сделать это с помощью плагина git и небольшого написания сценариев 🙂

5. Я не думаю, что вы можете это сделать, но Gundo может оказать некоторую помощь в захвате нужных строк: sjl.bitbucket.org/gundo.vim

Ответ №1:

Что ж, я попробую разобраться в этом и скажу: Нет, я не думаю, что есть способ сделать именно то, что вы хотите с vim.

gundo.vim добавляет приятный интерфейс к отмене vim, но не изменяет его основные возможности. Итак, я взглянул на официальные документы vim, чтобы посмотреть, есть ли какие-либо намеки на то, способен ли он на это:

Ничего о слиянии двух ветвей вместе. Я думаю, что ewh и ZyX правы: чтобы получить общее решение для объединения B с D, vim потребуется либо для

  1. Bram, чтобы добавить его как отдельную функцию в будущей версии
  2. кто-нибудь, кто мог бы реализовать это в плагине путем интеграции с чем-то, что уже может выполнять слияния (например, git / hg)

Вы, конечно, можете попытаться сделать это вручную, открыв файлы с версиями B, C и D, а также несколько различий.


Примечание: Если я неправильно понял, и вам не интересно общее решение, и вы ищете помощь с конкретным примером этого, дайте мне знать, и я посмотрю, что я могу сделать 🙂

Ответ №2:

Есть ли способ сохранить изменения B и D, но пропустить C?

Вы находитесь в состоянии D. :w file.ext_D

Возврат к состоянию C. :w file_ext_C

Возврат к состоянию B. :w file.ext_B

 :!kdiff3 file.ext_B file.ext_C file.ext_D
  

Это дает трехходовое объединение различий, но все равно вам пришлось бы вручную вводить и выбирать каждую красную строку в D для каждого конфликта слияния. Не совсем простое решение.

Если вместо этого вы сделаете

 :!kdiff3 file.ext_C file.ext_B file.ext_D
  

Затем слияние происходит автоматически (за исключением отдельных строк с несколькими изменениями)

Для более сложных сценариев это становится сложнее.

Примечание: Я не уверен, насколько инструмент контроля версий может помочь. По сути, вы делаете что-то вроде создания исправления между B и D, а затем вычитаете из него исправление из C в D. Мне кажется, что системы контроля версий обычно предназначены для управления слияниями между различными источниками изменений, а не изменениями в одной ветви.

kdiff3 доступен по адресу:http://kdiff3.sourceforge.net

Комментарии:

1. ПОЧЕМУ kdiff3? Это это vim, поэтому у него есть diff. Если вы хотите просто объединить, используйте meld или любую другую cli-программу, которая легко интегрируется. Re: ... how a revision tool is much help [...] not [...] a single branch : Много работаете с микрокоммитами? Вся концепция git apply -interactive, возможно, даже ее функция индексирования, ориентирована именно на эту потребность