Pergi ke X byte dari sini


9

Bagaimana saya bisa bergerak maju X byte, mulai dari lokasi kursor saat ini (termasuk jeda baris)?

[count]godapat digunakan untuk bergerak maju X byte dari awal buffer. Saya mencoba Shift + V, G, [count]go(dengan asumsi bahwa [count]goakan mulai menghitung dari awal pilihan saya), tetapi sayangnya itu tidak berhasil karena gohanya mulai menghitung dari awal buffer.

Saya juga mencoba :set rulerformat=%omenampilkan byte byte saat ini (seperti yang disarankan oleh Jumping ke byte byte, dan menampilkan posisi sebagai byte offset ), menambahkan angka di kepala saya dan akhirnya dikeluarkan [count]go. Ini berfungsi, tetapi tidak terlalu praktis ...


Jika semuanya dalam satu baris, Anda dapat menggunakan Xl(di mana Xjumlah karakter) atau jumlah karakter diikuti oleh panah kanan.
Lekensteyn

Jawaban:


9

Pencarian ini bergerak 40 karakter (bukan byte, meskipun) maju:

/\_.\{40}/e

dengan mencari tepat 40 karakter ( \{40}) dalam bentuk apa pun, termasuk baris baru ( \_.), dan menempatkan kursor di akhir pencarian ( /e). Lihat: http://vimregex.com/#Non-Greedy , :help search-offsetdan:help \_

Juga, lihat :h 23.4untuk pengeditan biner.


Pembaruan: Berdasarkan jawaban ini , inilah fungsi yang melompat ke byte offset:

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>"

Dapat digunakan seperti ini:

:JumpToOffset 400

atau mengetik pemetaan keyboard yang dipetakan, dengan hitungan:

40CTRL-C

Jika Anda tidak menggunakan hitungan, nomor hitungan sebelumnya digunakan kembali. Jadi Anda dapat melakukan: 40CTRL-C CTRL-C CTRL-C 30CTRL-C CTRL-Cuntuk melompat 40, 40, 40, 30, 30 byte dll.

Tekan Ctrl-Ountuk melompat kembali (lihat komentar di dalam fungsi).


Terima kasih atas jawabannya. Saya benar-benar mencari untuk bergerak maju X byte, bukan karakter. Bisakah Anda menjelaskan apa yang dilakukan pola pencarian Anda, mungkin dengan referensi ke dokumentasi?
Rob W

Selesai Dimungkinkan juga untuk mengotomatiskan [count]goproses meskipun dalam fungsi vim (baca offset byte saat ini, tambahkan angka yang diinginkan, di gosana).
VanLaser

... menambahkan fungsi dan perintah otomatis.
VanLaser

Terima kasih atas pembaruannya, ini mulai terlihat bagus! Ada dua perbedaan kecil antara [count]godan metode Anda: 1) [count]gomenambahkan item ke daftar lompatan, jadi saya bisa gunakan Ctrl+Ountuk dengan cepat melompat kembali ke posisi saya sebelumnya. 2) [count]godapat digunakan tanpa :, apakah mungkin untuk memperkenalkan yang baru [count]GOyang melakukan hal Anda. Bisakah Anda mengedit jawaban Anda yang juga cocok dengan perilaku itu go?
Rob W

diedit untuk kedua poin
VanLaser

9

Saya akhirnya menggunakan solusi berikut, yang mengimplementasikan logika dari pertanyaan saya.

  • [count]GOuntuk [count]memajukan byte.
  • [count]Gountuk memindahkan [count]byte ke belakang.

Tambahkan ini ke Anda .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>"

Terima kasih kepada VanLaser untuk implementasi awalnya, yang menempatkan saya ke arah yang benar.


Satu pertanyaan, di mana tepatnya Anda membutuhkan fungsi ini? (BTW saya akhirnya menggabungkan solusi Anda dengan menggunakan kembali hitungan sebelumnya jika tidak ada yang disediakan).
VanLaser

1
@ VanLaser Saya membaca konten mentah file PDF, untuk mendapatkan pemahaman yang lebih baik tentang format file PDF. File PDF terdiri dari banyak objek, dan banyak dari objek ini memiliki awalan panjang. Mampu melompat X byte ke depan bermanfaat untuk debugging. Dan sebelum Anda bertanya mengapa saya mengedit file PDF mentah: Saya sedang mengembangkan fitur baru untuk PDF.js yang membutuhkan pengetahuan lebih dalam tentang format file PDF.
Rob W

Terima kasih atas jawabannya (dan semoga berhasil)! Versi gabungannya ada di sini, jika berminat: pastebin.com/7sVyiA85
VanLaser

@ VanLaser Saya sudah memperbarui jawaban saya dengan versi final. Ternyata metode penghitungan baris asli Anda baik-baik saja, tetapi ada bug di Vim. Saya telah mengirimkan tambalan yang diterima , jadi dalam versi terbaru Vim, jawaban Anda juga akan berfungsi sebagaimana dimaksud.
Rob W

Anda tampaknya telah melakukan penggalian nyata di sana (pergi ke sumbernya) - selamat!
VanLaser
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.