Como obter o deslocamento de bytes atual no arquivo inteiro

13

Vi que era possível exibir o deslocamento de bytes atual na linha de status usando %o, mas não encontrei nenhuma função ou comando que faça o mesmo. Existe uma maneira de obter o deslocamento atual de bytes pragmaticamente?

EvergreenTree
fonte

Respostas:

8

Tente o seguinte:

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

Isso retorna o deslocamento com base em 1 no arquivo, que é o mesmo que %oem statusline. Obviamente, você pode subtrair 1 para obter o deslocamento baseado em 0.

lcd047
fonte
Uma pergunta, col('.')na verdade, retorna o deslocamento de bytes na linha? A última vez que olhei, apenas mostrou a coluna do cursor.
EvergreenTree
@EvergreenTree De acordo com :help col(): [o] resultado é um número, que é o índice de bytes da posição da coluna fornecido com {expr} . Suponho que é o byte baseada em 1 compensado ...
lcd047
A resposta funcionará em um arquivo que possui apenas esta linha abcäb:? (Eu não tenho verificado)
VanLaser
1
@VanLaser Funciona nos meus testes rápidos. Você nos diz se ainda funciona após testes prolongados.
Lcd047 06/07/2015
Apenas testado e funciona :)
VanLaser
6

A outra resposta não funcionou para mim quando abri um arquivo binário sem final de linha. Parece que há um erro no vim quando se trata de contar bytes em um arquivo binário sem eol. (edit: sim, isso foi um bug. Enviei um patch , que foi aceito em 7.4.781 ).

Para encontrar o deslocamento de bytes, enquanto contabiliza o erro nas versões antigas do Vim, use:

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

Este bug também afeta o %oespecificador, por exemplo rulerformat.

Rob W
fonte