So erhalten Sie den aktuellen Byte-Offset in der gesamten Datei


13

Ich habe gesehen, dass Sie den aktuellen Byte-Versatz in der Statuszeile mit anzeigen können %o, aber ich habe keine Funktion oder keinen Befehl gefunden, der das Gleiche tut. Gibt es eine Möglichkeit, das aktuelle Byte pragmatisch zu versetzen?

Antworten:


8

Versuche dies:

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

Dies gibt die 1-basierte Datei in gegenüber , die die gleiche ist wie %oin statusline. Sie können natürlich 1 subtrahieren, um den 0-basierten Versatz zu erhalten.


Eine Frage, gibt col('.')tatsächlich der Byte-Offset in der Zeile zurück? Zuletzt habe ich nur die Cursorspalte angezeigt.
EvergreenTree

@EvergreenTree Entsprechend :help col(): [t] ist das Ergebnis eine Zahl, die der Byte-Index der mit {expr} angegebenen Spaltenposition ist . Ich nehme an, das ist der 1-basierte Byte-Offset ...
lcd047

Funktioniert die Antwort nur in einer Datei mit der folgenden Zeile abcäb:? (Ich habe nicht überprüft)
VanLaser

1
@ VanLaser Es funktioniert in meinen Schnelltests. Sie sagen uns, ob es nach längeren Tests noch funktioniert.
lcd047

Gerade getestet und es funktioniert :)
VanLaser

6

Die andere Antwort hat bei mir nicht funktioniert, als ich eine Binärdatei ohne Zeilenende geöffnet habe. Es scheint, dass es einen Fehler in vim gibt, wenn es darum geht, Bytes in einer Binärdatei ohne eol zu zählen. (edit: ja, das war ein Fehler. Ich habe einen Patch eingereicht , der in 7.4.781 akzeptiert wurde ).

Verwenden Sie zum Ermitteln des Byte-Offsets unter Berücksichtigung des Fehlers in alten Vim-Versionen Folgendes:

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

Dieser Fehler betrifft auch den %oSpezifizierer in z rulerformat.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.