Как получить текущее байтовое смещение во всем файле

13

Я видел, что вы можете отобразить текущее байтовое смещение в строке состояния, используя %o, но я не нашел функции или команды, которая делает то же самое. Есть ли способ получить текущее байтовое смещение прагматично?

Вечнозеленое дерево
источник

Ответы:

8

Попробуй это:

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

Это возвращает основанное на 1 смещение в файле, которое совпадает %oс statusline. Вы можете, конечно, вычесть 1, чтобы получить смещение на основе 0.

lcd047
источник
Один вопрос, col('.')действительно ли возвращает смещение байта в строке? Последний раз, когда я смотрел, он просто показывал столбец курсора.
EvergreenTree
@EvergreenTree Согласно :help col(): [t] он представляет собой число, которое является байтовым индексом позиции столбца, заданной с помощью {expr} . Я так понимаю, это смещение байта на основе 1 ...
lcd047
Будет ли ответ работать в файл , имеющий эту линию только: abcäb? (Я не проверял)
VanLaser
1
@VanLaser Это работает в моих быстрых тестах. Вы сообщаете нам, работает ли он после расширенного тестирования.
lcd047
Только что протестировал и все работает :)
VanLaser
6

Другой ответ не работает для меня , когда я открыл двоичный файл без линии прекращения. Кажется, что в vim есть ошибка, когда дело доходит до подсчета байтов в двоичном файле без eol. (edit: да, это была ошибка. Я представил патч , который был принят в 7.4.781 ).

Чтобы найти смещение в байтах при учете ошибки в старых версиях Vim, используйте:

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

Эта ошибка также влияет на %oспецификатор, например rulerformat.

Роб W
источник