Я видел, что вы можете отобразить текущее байтовое смещение в строке состояния, используя %o
, но я не нашел функции или команды, которая делает то же самое. Есть ли способ получить текущее байтовое смещение прагматично?
Я видел, что вы можете отобразить текущее байтовое смещение в строке состояния, используя %o
, но я не нашел функции или команды, которая делает то же самое. Есть ли способ получить текущее байтовое смещение прагматично?
Ответы:
Попробуй это:
function! FileOffset()
return line2byte(line('.')) + col('.') - 1
endfunction
Это возвращает основанное на 1 смещение в файле, которое совпадает %o
с statusline
. Вы можете, конечно, вычесть 1, чтобы получить смещение на основе 0.
:help col()
: [t] он представляет собой число, которое является байтовым индексом позиции столбца, заданной с помощью {expr} . Я так понимаю, это смещение байта на основе 1 ...
abcäb
? (Я не проверял)
Другой ответ не работает для меня , когда я открыл двоичный файл без линии прекращения. Кажется, что в 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
.
col('.')
действительно ли возвращает смещение байта в строке? Последний раз, когда я смотрел, он просто показывал столбец курсора.