Який рекомендований спосіб копіювання змін за допомогою 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)

Вім, будучи майстром комбінацій клавіш, безумовно, повинен мати простіший спосіб виконання цього самого завдання. Чи є такий? Що ви використовуєте для оновлення змін у вихідному коді вручну?


2
Дякую за те, що я поставив моє розпливче відчуття "це не те, що повинно бути" у змістовне запитання. Відповідь, яку я отримала, - це те, чого я мав би давно дізнатися.
Калеб

1
Найкращі відповіді на ваше запитання можна знайти тут: stackoverflow.com/questions/5288875/…
erik

Відповіді:


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

ПРИМІТКА.
І те, doі dpви працюєте, якщо ви перебуваєте на блоці або просто на одній лінії під блоком у звичайному режимі, але не у візуальному. Вибираючи рядки тексту у візуальному режимі, ви повинні використовувати звичайні команди

  • :'<,'>diffget і
  • :'<,'>diffput.

Дивіться також :h copy-diffs.

:diffupdate повторно сканує файли на предмет змін.


4
Правда. Спочатку я вважав це досить заплутаним, оскільки цілі (суміжні) блоки копіюються поперек. Що, поряд із автоматичним приховуванням однакових ліній різницевого режиму, я почував себе на думці "Що, до біса, що трапилося?", Перш ніж потрійну перевірку кожного ходу, на обох панелях. Скажіть, що ви змінили відступ на одному з файлів; тоді я думаю, що все буде переміщено поперек. Для більш тонкого контролю (тобто візуального вибору) я виявив, що всі команди потрібні :[range]diffgetі :[range]diffputпотрібні.
Алекс Ліч

8
Ви можете використовувати візуальний режим разом із diffgetта diffput: ① Введіть візуальний режим та позначте текст / рядки. ② Потім введіть :diffputдля переміщення вибраних рядків до іншого файлу або :diffgetдля отримання вибраних рядків з іншого файлу.
erik

6
Привіт, хтось знає, чи існує еквівалент "робити" (отримати різницю) для РОСТІ одного рядка? Скажімо, у вас є код кодів (більш ніж один рядок), які відрізняються, "зробіть" курсором або в будь-якому рядку цих кодів лише для рядка нижче цього коду, ви отримаєте різницю для всього блоку коду --- Але Я просто хочу отримати різницю для одного рядка. Кожен раз, коли мені доводиться візуально вибирати цей рядок, після чого слід "diffget", трохи нудно ...
wiswit

12
Важливо зауважити, що команда відміни працюватиме лише в буфері, який було змінено, тому, якщо ви використовуєте dpта передумаєте, вам потрібно скасувати інший буфер.
Випадково832

1
@wiswit: Vщоб вибрати весь рядок, потім doпрацює над копіюванням певного рядка в поточний vim (8.0), на скільки це варто.
dannysauer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.