Я бачив, що ви можете відображати поточне зміщення байтів у рядку стану за допомогою %o
, але я не знайшов жодної функції чи команди, яка б робила те саме. Чи є спосіб прагматично змістити поточний байт?
Я бачив, що ви можете відображати поточне зміщення байтів у рядку стану за допомогою %o
, але я не знайшов жодної функції чи команди, яка б робила те саме. Чи є спосіб прагматично змістити поточний байт?
Відповіді:
Спробуйте це:
function! FileOffset()
return line2byte(line('.')) + col('.') - 1
endfunction
Це повертає зсув 1 у файлі, такий самий, як %o
у statusline
. Звичайно, можна відняти 1, щоб отримати зміщення на основі 0.
:help col()
: [t] результатом він є число, яке є байтовим індексом стовпця, заданим символом {expr} . Я вважаю, що байт зміщений на 1 базі ...
abcäb
:? (Я не перевіряв)
Інший відповідь не працює для мене , коли я відкрив двійковий файл без лінії припинення. Здається, що існує помилка vim, коли справа стосується підрахунку байтів у двійковому файлі без eol. (редагувати: так, це помилка. Я подав патч , який було прийнято в 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('.')
справді повертає зміщення байтів у рядку? Востаннє я подивився, він просто показав стовпчик курсору.