यहां से एक्स बाइट्स पर जाएं


9

वर्तमान कर्सर स्थान (लाइन ब्रेक सहित) से शुरू करके मैं X बाइट्स को कैसे आगे बढ़ा सकता हूं?

[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-Greedy , :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 बाइट्स आदि कूदने के लिए।

Ctrl-Oवापस कूदने के लिए मारो (फ़ंक्शन के अंदर टिप्पणियां देखें)।


जवाब के लिए धन्यवाद। मैं वास्तव में आगे एक्स बाइट्स की तलाश कर रहा हूं, हालांकि चार्ट नहीं। क्या आप बता सकते हैं कि आपका खोज पैटर्न क्या करता है, संभवतः प्रलेखन के संदर्भ में?
रॉब डब्ल्यू

किया हुआ। हालांकि यह भी संभव है कि इस [count]goप्रक्रिया को स्वचालित रूप से चालू किया जाए (वर्तमान बाइट ऑफसेट पढ़ें, वांछित संख्या जोड़ें, goवहां)।
वैनलेसर

... स्वचालित फ़ंक्शन और कमांड जोड़ा गया।
वनलेसर

अद्यतन के लिए धन्यवाद, यह अच्छा लग रहा है! [count]goआपके और आपकी विधि के बीच दो छोटे अंतर हैं : 1) [count]goकूद सूची में एक आइटम जोड़ता है, इसलिए मैं Ctrl+Oजल्दी से अपने पिछले स्थान पर वापस कूदने के लिए उपयोग कर सकता हूं। 2) के [count]goबिना इस्तेमाल किया जा सकता है :, क्या यह एक नई शुरुआत करना संभव है [count]GOजो आपकी बात करता है। क्या आप उस व्यवहार से मेल खाने के लिए अपने उत्तर को संपादित कर सकते हैं go?
रॉब डब्ल्यू।

दोनों बिंदुओं के लिए संपादित
VanLaser

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
@VanLaser मैं पीडीएफ फाइल प्रारूप की बेहतर समझ प्राप्त करने के लिए, एक पीडीएफ फाइल की कच्ची सामग्री को पढ़ रहा था। एक पीडीएफ फाइल में कई ऑब्जेक्ट होते हैं, और इनमें से कई ऑब्जेक्ट की लंबाई उपसर्ग होती है। डिबगिंग के लिए आगे एक्स बाइट्स कूदने में सक्षम होने के नाते उपयोगी था। और इससे पहले कि आप से पूछना कारण है कि मैं कच्चे पीडीएफ फाइलों को संपादित किया जा रहा है: मैं के लिए एक नई सुविधा के विकास कर रहा हूँ PDF.js जो पीडीएफ फाइल प्रारूप की एक गहरी ज्ञान की आवश्यकता है।
रॉब डब्ल्यू

उत्तर के लिए धन्यवाद (और शुभकामनाएँ)! संयुक्त संस्करण यहाँ है, अगर दिलचस्पी है: pastebin.com/7sVyiA85
VanLaser

@VanLaser मैंने अंतिम संस्करण के साथ अपना उत्तर अपडेट कर दिया है। यह पता चला है कि आपकी मूल पंक्ति की गिनती विधि ठीक थी, लेकिन विम में एक बग था। मैंने एक पैच प्रस्तुत किया है जो स्वीकार किया गया है , इसलिए विम के नवीनतम संस्करण में, आपका उत्तर भी इरादा के अनुसार काम करेगा।
रॉब डब्ल्यू

आपको लगता है कि वहाँ कुछ वास्तविक खुदाई हुई है (स्रोत पर जा रही है) - बधाई!
वैनसेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.