Jak uzyskać bieżące przesunięcie bajtu w całym pliku

13

Widziałem, że możesz wyświetlić bieżące przesunięcie bajtu za pomocą linii statusu %o, ale nie znalazłem żadnej funkcji ani polecenia, które robi to samo. Czy istnieje sposób na pragmatyczne wyrównanie bieżącego bajtu?

Wiecznie zielone drzewo
źródło

Odpowiedzi:

8

Spróbuj tego:

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

Zwraca przesunięcie oparte na 1 w pliku, które jest takie samo jak %ow statusline. Możesz oczywiście odjąć 1, aby uzyskać przesunięcie oparte na 0.

lcd047
źródło
Jedno pytanie, czy col('.')faktycznie zwraca przesunięcie bajtu w linii? Ostatnio spojrzałem, po prostu pokazał kolumnę kursora.
EvergreenTree,
@EvergreenTree Zgodnie z :help col(): [t] wynikiem jest liczba, która jest indeksem bajtów pozycji kolumny podanej za pomocą {wyrażenie} . Rozumiem, że to 1-bajtowe przesunięcie ...
lcd047,
Czy praca odpowiedź w pliku mając tylko ten wiersz: abcäb? (Nie sprawdziłem)
VanLaser,
1
@VanLaser Działa w moich szybkich testach. Po rozszerzonych testach powiesz nam, czy nadal działa.
lcd047,
Właśnie przetestowałem i działa :)
VanLaser
6

Inna odpowiedź nie działa na mnie, kiedy otworzyłem plik binarny bez linia zakończona. Wydaje się, że w vimie jest błąd, jeśli chodzi o liczenie bajtów w pliku binarnym bez eol. (edycja: tak, to był błąd. Przesłałem łatkę , która została zaakceptowana w 7.4.781 ).

Aby znaleźć przesunięcie bajtu, podczas rozliczania błędu w starych wersjach Vima, użyj:

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

Ten błąd wpływa również na %ospecyfikator np rulerformat.

Rob W.
źródło