ভিমডিফ: লাইনের অভ্যন্তরে পরবর্তী পার্থক্যটিতে ঝাঁপ দাও?


35

vimdiffফাইল তুলনা করার জন্য খুব সুবিধাজনক। যাইহোক, আমি প্রায়শই এটি দীর্ঘ লাইন এবং লাইনের অভ্যন্তরে তুলনামূলকভাবে কয়েকটি পার্থক্যযুক্ত ফাইলগুলিতে ব্যবহার করি।

ভিমডিফ একটি লাইনের অভ্যন্তরে পার্থক্যকে সঠিকভাবে হাইলাইট করবে (পুরো লাইন গোলাপী, ভিন্ন বর্ণগুলি লাল)। এই ক্ষেত্রেগুলিতে লাইনের পরবর্তী পার্থক্যে ঝাঁপিয়ে পড়তে পেরে ভাল লাগবে ।

আপনি "পরবর্তী পার্থক্য" ( ]c) এ ঝাঁপ দিতে পারেন তবে এটি একটি পার্থক্য সহ পরবর্তী লাইনে লাফিয়ে যাবে।

বর্তমান লাইনের অভ্যন্তরে পরবর্তী ভিন্ন চরিত্রটিতে যাওয়ার কোনও উপায় আছে কি?

উত্তর:


8

আমি দুটি সমাধান দেখতে পাচ্ছি:

  1. লাইনের লাল অংশে যাওয়ার জন্য আপনাকে বর্তমানের সিনট্যাক্স হাইলাইট করে পরীক্ষা করতে হবে।
  2. আপনাকে উভয় বাফারে বর্তমান লাইনটি বের করতে হবে এবং প্রথম অক্ষরটি সঠিকভাবে কার্সারের অবস্থান থেকে পৃথক হতে হবে

উভয় সমাধানের জন্য] সি পরে কার্যকর করা দরকার, এবং ভিম স্ক্রিপ্টিং প্রয়োজন require

সম্পাদনা: এখানে একটি প্রথম খসড়া কাজ করা বলে মনে হচ্ছে:

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

2
তার পর থেকে, আমি এই স্ক্রিপ্ট কোড কোড. com / .com//lh-vim / source / browse / misc / trunk / plugin/… (যা অন্য কয়েকটি জিনিস করে) তে কোডটি রেখেছি এবং দুর্ভাগ্যক্রমে, আমি একটি অসীম লুপ পর্যবেক্ষণ করে যা সময়ে সময়ে ঘটে। আমি শেষ পর্যন্ত এটি ঠিক করব।
লুক হার্মিট

12

এটি একটি সহজ কাজ:

আপনি ব্যবহার করতে পারেন set wrap

এটি যদি সমস্যাগুলি তৈরি করে তবে পার্থক্যটি পাঠ্যকে অসম সংখ্যার লাইনে আবদ্ধ করে তোলে।


1
দ্রুত এবং নোংরা, তবে এটি আমার জন্য কাজ করেছে।
মোবিয়াস 25'16

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
নাথান ফেলম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.