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?

Pohon cemara
sumber

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.

lcd047
sumber
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.

Rob W
sumber