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