Каков рекомендуемый способ копирования изменений с помощью 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 повторно проверит файлы на наличие изменений.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.