vimdiff: Satırdaki bir sonraki farka geçme?


35

vimdiffdosyaları karşılaştırmak için çok kullanışlıdır. Ancak, genellikle uzun satırlı ve satırların içinde nispeten az fark bulunan dosyalarda kullanırım.

vimdiff bir çizgideki farklılıkları doğru şekilde vurgulayacaktır (bütün çizgi pembe, farklı karakterler kırmızı). Bu gibi durumlarda, çizgideki bir sonraki farka atlamak iyi olur .

"Bir sonraki fark" ( ]c) 'a atlayabilirsiniz, ancak bu farkla bir sonraki satıra atlayacaktır.

Geçerli satırın içindeki bir sonraki farklı karaktere gitmenin bir yolu var mı?

Yanıtlar:


8

İki çözüm görüyorum:

  1. Satırdaki kırmızı kısma atlamak için mevcut sözdizimi vurgulamasını test etmeniz gerekir.
  2. Geçerli satırı her iki arabellekte ayıklamanız ve imleci doğru şekilde konumlandırmak için farklı olan ilk karakteri bulmanız gerekir.

Her iki çözümün] c'den sonra uygulanması gerekir ve vim komut dosyası gerektirir.

EDIT: İşte işe yarayan ilk taslak:

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

Bundan vazgeçtim, anlaşılması kolay bir yol yok gibi görünüyor. Cevabınız istediğimi yapmak gibi göründüğü için teşekkür olarak kabul edeceğim.
sleske 12

2
O zamandan beri, kodu bu komut dosyasına koydum code.google.com/p/lh-vim/source/browse/misc/trunk/plugin/… (birkaç şey daha var) ve ne yazık ki zaman zaman meydana gelen sonsuz bir döngü gözlendi. Sonunda tamir edeceğim.
Luc Hermitte

12

Bu kolay bir geçici çözümdür:

Kullanabilirsiniz set wrap.

Bu, fark metnin eşit olmayan satır sayısına sarılmasına neden olursa sorun yaratacaktır.


1
Çabuk ve kirli, ama benim için iş yaptı.
Mobius

2

Bunu da nasıl yapacağınızı bilemiyorum vimdiff, ancak wdiffbunun yerine kontrol edebilirsiniz . Bir seferde bir kelime iki dosya arasındaki farkları gösterir.

Kaynaktan derlemek zorunda kaldım:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.