vimdiff: перейти к следующей разнице внутри строки?

20524
sleske

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

vimdiff правильно выделит различия внутри строки (вся линия розовая, отличающиеся красные символы). В этих случаях было бы неплохо иметь возможность перейти к следующему различию в строке .

Вы можете перейти к «следующему отличию» ( ]c), но это позволит перейти к следующей строке с разницей.

Есть ли способ перейти к следующему другому символу внутри текущей строки?

32

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

10
Parag Jain

Это простой обходной путь:

Вы можете использовать set wrap.

Это создаст проблемы, если различие приведет к тому, что текст будет перенесен на неравное количество строк.

Быстро и грязно, но это сделало всю работу за меня. Mobius 8 лет назад 0
8
Luc Hermitte

Я вижу два решения:

  1. вам нужно проверить текущую подсветку синтаксиса, чтобы перейти к красной части строки.
  2. вам придется извлечь текущую строку в обоих буферах и найти первый символ, который отличается для правильного позиционирования курсора

Оба решения должны быть выполнены после] c и требуют сценариев vim.

РЕДАКТИРОВАТЬ: Вот первый проект, который, кажется, работает:

nnoremap <expr> <silent> <F3> (&diff ? "]c:call \<sid>NextDiff()\<cr>" : ":cn\<cr>")  function! s:GotoWinline(w_l) normal! H while winline() < a:w_l normal! j endwhile " todo: beware of cases where the window is too little endfunction  " Better ]c, [c jump function! s:NextDiff() if ! &diffopt =~ 'filler' | return | endif  let ignore_blanks = &diffopt =~ 'iwhite'  " Assert: called just after a ]c or a [c " Forces the cursos to be synchronized in all synced windows " let diff_l = line() try  let foldenable = &foldenable set nofoldenable  let w_l = winline() " problematic with enabled lines (from diff...) " echomsg w_l.'|'.line('.').'|'.getline('.')  let lines = {} windo if &diff | call <sid>GotoWinline(w_l) | let lines[winnr()]={'text':getline('.'), 'number':line('.')} | endif finally let &foldenable = foldenable endtry  " echomsg string(lines) if len(lines) < 2 | return | endif  let indices = repeat([0], len(lines)) let tLines = values(lines) let found = 0 " infinite loop on two empty texts... while ! found let c = '' let next_idx = [] let i = 0 while i != len(indices) let crt_line = tLines[i].text let n = indices[i] if len(crt_line) == n let found = 1 break endif  let c2 = (len(crt_line) == n) ? 'EOL' : crt_line[n] if empty(c)  let c = c2 endif  " checks match let n += 1 if c =~ '\s' if (c2 != c) && (ignore_blanks && c2 !~ '\s') let found = 1 break else " advance while ignore_blanks && (n == len(crt_line) || crt_line[n] =~ '\s') let n += 1 endwhile endif else if c2 != c let found = 1 break endif endif let next_idx += [n]  let i += 1 endwhile if found | break | endif  let indices = next_idx endwhile  " now goto the right column let windows = keys(lines) " Assert len(windows) == len(indices) let w = 0 while w != len(windows) " echomsg 'W#'.windows[w].' -> :'(tLines[w].number).'normal! '.(indices[w]+1).'|' exe windows[w].'wincmd w' silent! exe (tLines[w].number).'normal! 0'.(indices[w]).'l' let w += 1 endwhile " echomsg string(indices) endfunction 
Я отказался от этого, так как, кажется, нет простого способа сделать это. Поскольку ваш ответ, кажется, делает то, что я хотел, я приму это в качестве благодарности. sleske 13 лет назад 0
С тех пор я поместил код в этот скрипт http://code.google.com/p/lh-vim/source/browse/misc/trunk/plugin/searchfile.vim?r=320 (который выполняет несколько другие вещи), и, к сожалению, я наблюдал бесконечный цикл, который происходит время от времени. Я в конце концов исправлю это. Luc Hermitte 13 лет назад 2
2
David Winiecki

Я не могу понять, как это сделать vimdiff, но вы можете проверить wdiffвместо этого. Он показывает различия между двумя файлами по одному слову за раз.

Я должен был скомпилировать его из источника:

curl http://ftp.gnu.org/gnu/wdiff/wdiff-1.2.1.tar.gz > wdiff-1.2.1.tar.gz tar -xzvf wdiff-1.2.1.tar.gz cd wdiff-1.2.1 ./configure make make install 
1
Nathan Fellman

Судя по документации, это невозможно сделать.

Интересно. Где вы нашли это в документах? Я не мог найти там ничего. sleske 14 лет назад 2
В Vim я набрал: `: help vimdiff` Nathan Fellman 14 лет назад 1

Похожие вопросы