ไปที่ X ไบต์จากที่นี่


9

ฉันจะย้าย X ไบต์ไปข้างหน้าโดยเริ่มจากตำแหน่งเคอร์เซอร์ปัจจุบัน (รวมถึงตัวแบ่งบรรทัด) ได้อย่างไร

[count]goสามารถใช้เพื่อเลื่อนไปข้างหน้า X ไบต์จากจุดเริ่มต้นของบัฟเฟอร์ ฉันลองShift + V, G, [count]go(สมมติว่า[count]goจะเริ่มนับจากจุดเริ่มต้นของการเลือกของฉัน) แต่น่าเสียดายที่ไม่ได้ผลเช่นกันเพราะgoเริ่มนับจากจุดเริ่มต้นของบัฟเฟอร์เท่านั้น

ฉันยังมีความพยายาม:set rulerformat=%oที่จะแสดงไบต์ชดเชยในปัจจุบัน (แนะนำโดยกระโดดไปไบต์ชดเชยและการแสดงในฐานะไบต์ชดเชย ) [count]goเพิ่มตัวเลขในหัวของฉันและออกในที่สุด ใช้งานได้ แต่มันใช้ไม่ได้จริง ...


หากทุกอย่างอยู่ในบรรทัดเดียวคุณสามารถใช้Xl(ซึ่งXเป็นจำนวนอักขระ) หรือจำนวนตัวอักษรตามด้วยลูกศรขวา
Lekensteyn

คำตอบ:


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-Cเพื่อกระโดด 40, 40, 40, 30, 30 ไบต์เป็นต้น

กดCtrl-Oเพื่อกระโดดกลับ (ดูความคิดเห็นภายในฟังก์ชั่น)


ขอบคุณสำหรับคำตอบ. ฉันกำลังมองหาก้าวไปข้างหน้า X ไบต์ไม่ใช่ตัวอักษร คุณช่วยอธิบายรูปแบบการค้นหาของคุณได้บ้างโดยอ้างอิงกับเอกสารประกอบ?
Rob W

เสร็จสิ้น นอกจากนี้ยังเป็นไปได้ที่จะทำให้[count]goกระบวนการโดยอัตโนมัติแม้ว่าจะอยู่ในฟังก์ชั่น vim (อ่านอ็อฟเซ็ตไบต์ปัจจุบัน, เพิ่มหมายเลขที่ต้องการ, ที่goนั่น)
VanLaser

... เพิ่มฟังก์ชั่นอัตโนมัติและคำสั่ง
VanLaser

ขอบคุณสำหรับการอัปเดตสิ่งนี้เริ่มดูดี! มีความแตกต่างกันเล็กน้อยระหว่าง[count]goวิธีการของคุณ: 1) [count]goเพิ่มรายการลงในรายการข้ามดังนั้นฉันสามารถใช้Ctrl+Oเพื่อข้ามกลับไปยังตำแหน่งก่อนหน้าได้อย่างรวดเร็ว 2) [count]goสามารถใช้งานได้โดยไม่มี:มันเป็นไปได้ที่จะแนะนำสิ่งใหม่[count]GOที่ทำในสิ่งที่คุณทำ คุณสามารถแก้ไขคำตอบของคุณไปยังตรงกับพฤติกรรมของที่go?
Rob W

แก้ไขสำหรับทั้งสองจุด
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>"

ขอบคุณ VanLaser สำหรับการเริ่มต้นใช้งานซึ่งทำให้ฉันไปในทิศทางที่ถูกต้อง


คำถามเดียวคุณต้องการฟังก์ชั่นนี้ที่ไหน? (BTW ฉันลงเอยด้วยการรวมโซลูชันของคุณเข้ากับการนับก่อนหน้านี้ซ้ำหากไม่มีการระบุไว้)
VanLaser

1
@VanLaser ฉันกำลังอ่านเนื้อหาดิบของไฟล์ PDF เพื่อให้เข้าใจรูปแบบไฟล์ PDF ได้ดีขึ้น ไฟล์ PDF ประกอบด้วยวัตถุจำนวนมากและวัตถุเหล่านี้จำนวนมากมีคำนำหน้ายาว ความสามารถในการข้าม X ไบต์ไปข้างหน้ามีประโยชน์สำหรับการดีบัก และก่อนที่คุณจะถามว่าทำไมฉันถึงแก้ไขไฟล์ PDF แบบดิบ: ฉันกำลังพัฒนาฟีเจอร์ใหม่สำหรับPDF.jsซึ่งต้องการความรู้เพิ่มเติมเกี่ยวกับรูปแบบไฟล์ PDF
Rob W

ขอบคุณสำหรับคำตอบ (และขอให้โชคดี)! รุ่นรวมกันอยู่ที่นี่ถ้าสนใจ: pastebin.com/7sVyiA85
VanLaser

@VanLaser ฉันได้อัปเดตคำตอบด้วยเวอร์ชันสุดท้ายแล้ว ปรากฎว่าวิธีการนับบรรทัดดั้งเดิมของคุณนั้นใช้ได้ แต่มีปัญหาใน Vim ฉันส่งแพตช์ที่ได้รับการยอมรับดังนั้นในเวอร์ชั่นล่าสุดของ Vim คำตอบของคุณก็จะใช้ได้ตามที่ตั้งใจไว้
Rob W

ดูเหมือนว่าคุณจะขุดจริงที่นั่น (ไปที่แหล่งกำเนิด) - ขอแสดงความยินดี
VanLaser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.