Cara mendapatkan byte offset saat ini di seluruh file


13

Saya melihat bahwa Anda dapat menampilkan byte offset saat ini menggunakan statusline %o, tetapi saya tidak menemukan fungsi atau perintah yang melakukan hal yang sama. Apakah ada cara untuk mendapatkan byte offset saat ini secara pragmatis?

Jawaban:


8

Coba ini:

function! FileOffset()
    return line2byte(line('.')) + col('.') - 1
endfunction

Ini mengembalikan offset dalam file 1, yang sama dengan %odi statusline. Anda bisa, tentu saja, kurangi 1 untuk mendapatkan offset berbasis 0.


Satu pertanyaan, apakah col('.')sebenarnya mengembalikan byte offset di baris? Terakhir saya melihat, itu hanya menunjukkan kolom kursor.
EvergreenTree

@EvergreenTree Menurut :help col(): [t] hasilnya adalah Angka, yang merupakan indeks byte dari posisi kolom yang diberikan dengan {expr} . Saya menganggap itu byte byte 1 berbasis ...
lcd047

Akan pekerjaan jawaban dalam sebuah file yang memiliki garis ini hanya: abcäb? (Saya belum memeriksa)
VanLaser

1
@ VanLaser Berhasil dalam tes cepat saya. Anda memberi tahu kami jika masih berfungsi setelah pengujian yang diperpanjang.
lcd047

Baru diuji dan berhasil :)
VanLaser

6

The jawaban lain tidak bekerja untuk saya ketika saya membuka file biner tanpa garis akhir. Tampaknya ada bug di vim ketika datang untuk menghitung byte dalam file biner tanpa eol. (sunting: ya, ini adalah bug. Saya telah mengirimkan tambalan , yang diterima di 7.4.781 ).

Untuk menemukan byte offset, sambil menghitung bug dalam versi Vim lama, gunakan:

let offset = line2byte(line('.')) + col('.') - 1
if version < 781 && &l:binary == 1 && &l:eol == 0
    " Vim prior 7.4.781 had a bug where the line count is off by 1 or 2.
    " See https://groups.google.com/forum/#!msg/vim_dev/zX45zm-cnc0/-BWjjh5tlX8J
    let offset += 1
    let offset += line('.') == 1
endif

Bug ini juga memengaruhi %ospecifier di mis rulerformat.

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.