vimdiff: पंक्ति के अंदर अगले अंतर पर जाएं?


35

vimdiffफ़ाइलों की तुलना करने के लिए बहुत उपयोगी है। हालांकि, मैं अक्सर इसका उपयोग लंबी लाइनों वाली फाइलों पर करता हूं और लाइनों के अंदर कुछ अंतर होता है।

vimdiff सही ढंग से एक रेखा के अंदर मतभेदों को उजागर करेगा (पूरी लाइन गुलाबी, अलग-अलग वर्ण लाल)। इन मामलों में, लाइन के अंदर अगले अंतर पर कूदने में सक्षम होना अच्छा होगा ।

आप "अगले अंतर" पर जा सकते हैं ( ]c), लेकिन यह अंतर के साथ अगली पंक्ति में कूद जाएगा।

क्या वर्तमान लाइन के अंदर अगले अलग चरित्र पर जाने का एक तरीका है?

जवाबों:


8

मैं दो समाधान देखता हूं:

  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

मैंने इसे छोड़ दिया है, क्योंकि ऐसा लगता है कि इसे पूरा करने का कोई आसान तरीका नहीं है। चूँकि आपका उत्तर वही करना चाहता है जो मैं चाहता था, मैं इसे धन्यवाद के रूप में स्वीकार करूँगा।
साल्स्के

2
तब से, मैंने इस स्क्रिप्ट कोड में कोड डाल दिया है। Googlep/lh-vim/source/browse/misc/trunk/plugin/… (जो कुछ अन्य चीजें करता है), और दुर्भाग्य से, मैंने एक अनंत लूप देखा जो समय-समय पर होता है। मैं अंत में इसे ठीक कर दूंगा।
ल्यूक हर्मिट्टे

12

यह एक आसान तरीका है:

आप उपयोग कर सकते हैं set wrap

यह समस्या पैदा करेगा यदि अंतर पाठ को असमान संख्या में लाइनों में लपेटने का कारण बनता है।


1
त्वरित और गंदा, लेकिन इसने मेरे लिए काम किया।
मोबियस

2

मैं यह पता नहीं लगा सकता कि यह कैसे करना है 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

प्रलेखन द्वारा देखते हुए, यह नहीं किया जा सकता है।


2
दिलचस्प। आपको डॉक्स में यह कहां से मिला? मुझे वहां कुछ नहीं मिला।
सिल्के

1
विम में मैंने टाइप किया::help vimdiff
नाथन फेलमैन ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.