Як отримати поточне зміщення байтів у цілому файлі


13

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

Відповіді:


8

Спробуйте це:

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

Це повертає зсув 1 у файлі, такий самий, як %oу statusline. Звичайно, можна відняти 1, щоб отримати зміщення на основі 0.


Одне питання, чи col('.')справді повертає зміщення байтів у рядку? Востаннє я подивився, він просто показав стовпчик курсору.
EvergreenTree

@EvergreenTree Відповідно до :help col(): [t] результатом він є число, яке є байтовим індексом стовпця, заданим символом {expr} . Я вважаю, що байт зміщений на 1 базі ...
lcd047

Чи буде відповідь працювати у файлі, що містить лише цей рядок abcäb:? (Я не перевіряв)
VanLaser

1
@VanLaser Це працює в моїх швидких тестах. Ви скажете нам, чи все ще працює після розширеного тестування.
lcd047

Просто перевірений, і він працює :)
VanLaser

6

Інший відповідь не працює для мене , коли я відкрив двійковий файл без лінії припинення. Здається, що існує помилка 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.