Tüm dosyada geçerli bayt uzaklığını alma


13

Durum satırında geçerli bayt uzaklığını görüntüleyebildiğinizi gördüm %o, ancak aynı şeyi yapan bir işlev veya komut bulamadım. Geçerli baytın pragmatik olarak dengelenmesinin bir yolu var mı?

Yanıtlar:


8

Bunu dene:

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

Bu 1-esaslı aynı olan dosya konumunu geri %oiçinde statusline. Tabii ki, 0 tabanlı ofseti almak için 1 çıkarabilirsiniz.


Bir soru, col('.')aslında satırdaki bayt uzaklığını döndürüyor mu? Son baktım, sadece imleç sütununu gösterdi.
EvergreenTree

@EvergreenTree Buna göre :help col(): [t], {expr} ile verilen sütun konumunun bayt endeksi olan bir Sayıdır . Ben 1 tabanlı bayt ofset olduğunu ...
lcd047

Yanıt yalnızca bu satırı içeren bir dosyada çalışır abcäbmı? (Kontrol
etmedim

1
@VanLaser Hızlı testlerimde çalışıyor. Genişletilmiş testlerden sonra hala işe yarayıp yaramadığını bize bildirin.
lcd047

Sadece test edildi ve çalışıyor :)
VanLaser

6

Diğer cevap Ben çizgi bitirmeden bir ikili dosya açıldığında benim için çalışmadı. Eol olmadan bir ikili dosyada bayt sayma söz konusu olduğunda vim'de bir hata var gibi görünüyor. (düzenleme:. evet, bu bir hata ben var bir yama gönderilen var, 7.4.781 kabul ).

Bayt uzaklığını bulmak için, eski Vim sürümlerinde hatayı hesaplarken şunu kullanın:

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

Bu hata ayrıca %oörn rulerformat.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.