Как мне только дп или сделать только строки, а не весь блок в Vim diff?

10739
hobbes3

В настоящее время я использую MacVim (Снимок 64), пункт меню «Split Diff by ...».

Файл Django's my settings.pyот версии 1.3.1 до свежего файла версии 1.4.

Скриншот

Я знаю две основные команды

  1. do «получить» (и заменить) блок с другой стороны.
  2. dp «положить» (и заменить) блок на другую сторону.

Но эти две команды записывают весь блок, который в MacVim выделяется фиолетовым цветом.

Если вы посмотрите на 2-й блок, вы увидите, что в строках 2 и 3 есть только 2 разных слова: mysiteи hobbes3. Я просто хочу заменить каждую строку, а не весь блок.

Так, что есть команда, чтобы заменить do doи в dpкаждой строке, в отличие от целого блока, или мне нужно вводить ее вручную?

Бонусный вопрос : я заметил, что, когда я вручную редактирую блок, я теряю фиолетовую подсветку. Как мне снова «обновить» diff, чтобы включить блики без повторного открытия файла?

Пожалуйста, постарайтесь сохранить ответы Vim-general, а не Mac-Vim.

25

2 ответа на вопрос

27
garyjohn

Есть несколько способов сделать это.

  1. Выберите диапазон строк в целевом буфере, который вы хотите получить из исходного буфера, и используйте его :diffget. Например, вы можете визуально выбрать диапазон строк V, а затем набрать :diffget.
  2. Выберите диапазон строк в исходном буфере, который вы хотите поместить в целевой буфер и использовать :diffput. Например, чтобы поместить текущую строку в другой буфер, введите :.diffput.
  3. Используйте янки и положите. Выберите диапазон строк в исходном буфере, который вы хотите скопировать в буфер назначения, перетяните их с помощью Y, переместите курсор в буфер назначения и поместите их туда, где вы хотите, с их помощью pили P, затем удалите строки, которые вам не нужны.
  4. Нажмите, как указано выше, но в целевом буфере визуально выберите диапазон строк, которые вы хотите заменить (необязательно то же количество строк), и введите "0p. При этом используется регистр 0 (ноль), который всегда содержит текст самого последнего янка.

Чтобы «обновить» дисплей, чтобы показать правильную подсветку, выполните :diffupdateили просто :diffu. Иногда этого недостаточно, и вам нужно переместить курсор в другое окно, чтобы завершить обновление.

Вы можете прочитать больше о копировании различий в

:help copy-diffs 
3
lucky85dog

Я также хотел изменить одну строку в данный момент во время сравнения. Поэтому я создал простую карту и поместил их в мой файл vimrc.

nnoremap <silent> <leader>dp V:diffput<cr> nnoremap <silent> <leader>dg V:diffget<cr> 

Вы можете использовать do вместо dg, но я больше привык думать «diffget» вместо [o] btain.

Для вашего бонуса я просто дважды использую другую простую карту:

nnoremap <silent> <leader>df :call DiffToggle()<CR> 

Теперь, df выключит / включит diffmode, так что я просто выключаю и снова включаю.

И бонусный вариант заключается в добавлении

nmap <silent> <leader>du :wincmd w<cr>:normal u<cr>:wincmd w<cr> 

Это позволит вам отменить опечатку или нежелательные изменения в другом файле / окне, потому что: отменить только вы будете отменять только изменения в текущем окне.