Каков рекомендуемый способ копирования изменений с помощью vimdiff?

117

При сравнении файлов и обновлении репозитория исходного кода мне нравится использовать vimdiff. Чтобы скопировать изменения, сделанные из одного файла в другой, я обычно использую последовательность клавиш, например:

Shift + V (select line)
k or j; { or }; Up or down arrow keys (select more lines)
y  (copy selected lines)
Ctrl + w, left/right arrow (move to other pane)
p (paste lines)

Vim, будучи мастером сочетаний клавиш, наверняка должен иметь более простой способ выполнения этой же задачи. Есть один? Что вы используете для ручного обновления изменений исходного кода?

Алекс Лич
источник
2
Спасибо за то, что вложили мое смутное чувство «это не то, что должно быть» в значимый вопрос. Полученный ответ - это то, что я должен был узнать давным-давно.
Калеб
1
Лучшие ответы на ваш вопрос здесь: stackoverflow.com/questions/5288875/…
Эрик

Ответы:

181

do(diff получить) и dp(diff put) это то, что вам нужно. Вот небольшой список других полезных команд обычного режима в этом контексте.

]c               - advance to the next block with differences
[c               - reverse search for the previous block with differences
do (diff obtain) - bring changes from the other file to the current file
dp (diff put)    - send changes from the current file to the other file
zo               - unfold/unhide text
zc               - refold/rehide text
zr               - unfold both files completely
zm               - fold both files completely

ПРИМЕЧАНИЕ: и то и
другое работает, если вы находитесь в блоке или в одной строке под блоком в обычном режиме, но не в визуальном режиме. При выборе строк текста в визуальном режиме вы должны использовать обычные командыdodp

  • :'<,'>diffget а также
  • :'<,'>diffput,

Смотрите также :h copy-diffs.

:diffupdate повторно проверит файлы на наличие изменений.

Marco
источник
4
Правда. Сначала я находил это довольно запутанным, так как целые (смежные) блоки копируются. Что, наряду с автоматическим скрытием идентичных линий в режиме diff, я подумал: «Что, черт возьми, только что произошло?», Перед тройной проверкой каждого хода в обеих панелях. Скажем, вы изменили отступ в одном из файлов; тогда я представляю, что все будет перенесено. Для более тонкого контроля (т.е. визуального выбора) я обнаружил, что полные команды :[range]diffgetи :[range]diffputнужны.
Алекс Лич
8
Вы можете использовать визуальный режим вместе с diffgetи diffput: ① Введите визуальный режим и отметить некоторый текст / линию. Type Затем введите, :diffputчтобы вставить выбранные строки в другой файл или :diffgetполучить выбранные строки из другого файла.
Эрик
6
Привет, кто-нибудь знает, есть ли эквивалент "do" (получить разницу) только для одной строки? Допустим, у вас есть блок кодов (более одной строки), которые отличаются, «делайте» с курсором, либо на любой строке этих кодов только для строки под этим кодом получите разницу для всего блока кода --- Но Я просто хочу получить разницу для одной линии. Каждый раз, когда мне нужно визуально выбрать эту строку, а затем "diffget", немного утомительно ...
Wiswit
12
Важно отметить, что команда отмены будет работать только в том буфере, который был изменен, поэтому, если вы используете dpи передумаете, вам нужно переключиться на другой буфер для отмены.
Random832
1
@wiswit: Vвыбрать целую строку, а затем doскопировать определенную строку в текущем vim (8.0), чего бы это ни стоило.
dannysauer