এখান থেকে এক্স বাইটে যান


9

বর্তমান কার্সার অবস্থান (লাইন ব্রেক সহ) থেকে শুরু করে আমি কীভাবে এক্স বাইটগুলি এগিয়ে নিয়ে যেতে পারি?

[count]goবাফার শুরু থেকে এক্স বাইট এগিয়ে যেতে ব্যবহার করা যেতে পারে। আমি চেষ্টা করেছি Shift + V, G, [count]go(ধরে নিলাম যে [count]goএটি আমার নির্বাচনের শুরু থেকেই গণনা শুরু করবে), তবে দুর্ভাগ্যক্রমে এটি কার্যকর হয়নি কারণ goকেবল বাফারের শুরু থেকে গণনা শুরু হয় ।

আমি :set rulerformat=%oবর্তমান বাইট অফসেটটি প্রদর্শন করার চেষ্টা করেছি (যেমন একটি বাইট অফসেটে জাম্পিং এবং বাইট অফসেট হিসাবে অবস্থান প্রদর্শন করার পরামর্শ দিয়েছি), আমার মাথায় নম্বর যুক্ত করে অবশেষে জারি করা হয়েছে [count]go। এটি কাজ করে, তবে এটি খুব ব্যবহারিক নয় ...


সবকিছু যদি এক লাইনে থাকে তবে আপনি ব্যবহার করতে পারেন Xl( Xঅক্ষরের সংখ্যাটি কোথায় ) বা ডান তীর অনুসারে অক্ষরের সংখ্যা।
লেকেনস্টেইন

উত্তর:


9

এই অনুসন্ধান 40 টি অক্ষর (যদিও বাইট নয়) এগিয়ে নিয়ে যায়:

/\_.\{40}/e

\{40}নিউলাইন ( \_.) সহ যেকোন ধরণের ঠিক 40 টি অক্ষর ( ) অনুসন্ধান করে এবং অনুসন্ধানের শেষে কার্সারটি রেখে /e) ( )। দেখুন: http://vimregex.com/#Non- লোভী , :help search-offsetএবং:help \_

এছাড়াও, :h 23.4বাইনারি সম্পাদনার জন্য দেখুন ।


আপডেট: এই উত্তরের উপর ভিত্তি করে , এখানে একটি ফাংশন যা বাইট অফসেটে লাফ দেয়:

let s:last_jump_bytes = 0

function! JumpTo(byte_nr)
    let crt_byte = line2byte(line('.')) + col('.')
    if (a:byte_nr == 0)
        let dst_byte = crt_byte + s:last_jump_bytes
    else
        let dst_byte = crt_byte + a:byte_nr
        let s:last_jump_bytes = a:byte_nr
    endif
    let dst_line = byte2line(dst_byte)
    let dst_col = dst_byte -line2byte(dst_line)
    "remove next line if you don't want to record this for `Ctrl-O`
    execute "normal " . dst_line . "G"
    call setpos('.', [0, dst_line, dst_col])
endfunction

command! -nargs=1 JumpToOffset :call JumpTo(<f-args>)

" silly mapping to Ctrl-C (demo)
nnoremap <expr> <silent> <c-c> ":<c-u>call JumpTo(" . v:count . ")<cr>"

এটি ব্যবহার করা যেতে পারে:

:JumpToOffset 400

বা একটি গণনা সহ ম্যাপযুক্ত কীবোর্ড ম্যাপিং টাইপ করুন:

40CTRL-C

আপনি যদি কোনও গণনা ব্যবহার না করেন তবে আগের গণনা নম্বরটি পুনরায় ব্যবহৃত হবে। সুতরাং আপনি এটি করতে পারেন: 40CTRL-C CTRL-C CTRL-C 30CTRL-C CTRL-C40, 40, 40, 30, 30 বাইট ইত্যাদি লাফাতে to

হিট Ctrl-O(ফাংশন ভিতরে মন্তব্য দেখুন) ফিরে ঝাঁপ।


উত্তরের জন্য ধন্যবাদ. আমি সত্যিই এক্স বাইট এগিয়ে চলার সন্ধান করছি, যদিও অক্ষর নয়। সম্ভবত আপনি ডকুমেন্টেশনের রেফারেন্স সহ আপনার সন্ধানের প্যাটার্নটি কী করে তা ব্যাখ্যা করতে পারেন?
রব ডাব্লু

সম্পন্ন. [count]goকোনও ভিআইএম ফাংশনে (বর্তমান বাইট অফসেটটি পড়ুন, goসেখানে পছন্দসই নম্বর যুক্ত করুন ) যদিও প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চালানো সম্ভব ।
ভ্যানলেজার

... স্বয়ংক্রিয় ফাংশন এবং কমান্ড যুক্ত।
ভ্যানলেজার

আপডেটের জন্য ধন্যবাদ, এটি দেখতে ভাল লাগবে! [count]goএবং আপনার পদ্ধতির মধ্যে দুটি ছোট পার্থক্য রয়েছে : 1) [count]goজাম্প তালিকায় একটি আইটেম যুক্ত করে, তাই আমি Ctrl+Oদ্রুত আমার পূর্ববর্তী অবস্থানে ফিরে যেতে ব্যবহার করতে পারি। 2) [count]goছাড়া ব্যবহার করা যেতে পারে :, [count]GOআপনার কাজটি করে এমন কোনও নতুন পরিচয় করা সম্ভব ? সেই আচরণের সাথে মেলে কী আপনি নিজের উত্তরটি সম্পাদনা করতে পারবেন go?
রব ডাব্লু

উভয় পয়েন্টের জন্য সম্পাদিত
ভ্যানল্যাসার

9

আমি নিম্নলিখিত সমাধানটি ব্যবহার করে শেষ করেছি, যা আমার প্রশ্ন থেকে যুক্তি প্রয়োগ করে।

  • [count]GO[count]বাইটস এগিয়ে যেতে ।
  • [count]Go[count]বাইট পিছনের দিকে সরানো ।

এটি আপনার যুক্ত করুন .vimrc:

function! JumpToByte(byte_nr)
    " See https://vi.stackexchange.com/a/3911/2720 for the byte counting bug
    let crt_byte = line2byte(line('.')) + col('.') - 1
    if version < 781 && &l:binary == 1 && &l:eol == 0
        let crt_byte += 1
        let crt_byte += line('.') == 1
    endif
    let dst_byte = crt_byte + a:byte_nr
    execute "normal " . dst_byte . "go"
endfunction
nnoremap <expr> <silent> GO ":<c-u>call JumpToByte(" . v:count . ")<cr>"
nnoremap <expr> <silent> Go ":<c-u>call JumpToByte(-" . v:count . ")<cr>"

ভ্যানলেসার তার প্রাথমিক প্রয়োগের জন্য ধন্যবাদ, যা আমাকে সঠিক দিকে নিয়ে গেছে।


একটি প্রশ্ন, আপনার ঠিক কোথায় এই কার্যকারিতা দরকার? (বিটিডাব্লু আমি পূর্বের গণনা পুনরায় ব্যবহারের সাথে যদি কোনও সরবরাহ না করা হয় তবে আপনার সমাধানের সংমিশ্রণটি শেষ করেছি)।
ভ্যানল্যাসার

1
@ ভ্যানলাসার পিডিএফ ফাইলের ফর্ম্যাটটির আরও ভাল ধারণা পাওয়ার জন্য আমি একটি পিডিএফ ফাইলের কাঁচামাল পড়ছিলাম। পিডিএফ ফাইলটিতে অনেকগুলি অবজেক্ট থাকে এবং এর মধ্যে অনেকগুলি অবজেক্টের দৈর্ঘ্যের উপসর্গ থাকে। এক্স বাইট এগিয়ে যেতে সক্ষম হওয়া ডিবাগিংয়ের জন্য দরকারী। আমি কেন কাঁচা পিডিএফ ফাইলগুলি সম্পাদনা করছি তা জিজ্ঞেস করার আগে: আমি পিডিএফ.জেএস এর জন্য একটি নতুন বৈশিষ্ট্য বিকাশ করছি যার পিডিএফ ফাইল ফর্ম্যাটটির গভীর জ্ঞান প্রয়োজন।
রব ডাব্লু

উত্তরের জন্য ধন্যবাদ (এবং শুভকামনা)! সম্মিলিত সংস্করণটি এখানে থাকলে আগ্রহী: পেস্টবিন.
com/

@ ভ্যানলেজার আমি আমার উত্তরটি একটি চূড়ান্ত সংস্করণ দিয়ে আপডেট করেছি। দেখা যাচ্ছে যে আপনার মূল লাইন গণনা পদ্ধতিটি ভাল ছিল, তবে ভিমে একটি বাগ ছিল। আমি একটি প্যাচ জমা দিয়েছি যা গ্রহণযোগ্য হয়েছে , সুতরাং ভিমের সর্বশেষ সংস্করণে, আপনার উত্তরটিও যেমন ইচ্ছা তেমন কাজ করবে।
রব ডাব্লু

আপনি মনে হয় সেখানে কিছু সত্য খনন করেছেন (উত্সে যাচ্ছেন) - অভিনন্দন!
ভ্যানল্যাসার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.