Cómo obtener el desplazamiento de bytes actual en todo el archivo

13

Vi que podía mostrar el desplazamiento de bytes actual en la línea de estado usando %o, pero no encontré ninguna función o comando que haga lo mismo. ¿Hay alguna manera de hacer que el byte actual se compense pragmáticamente?

Árbol de hoja perenne
fuente

Respuestas:

8

Prueba esto:

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

Esto devuelve el desplazamiento basado en 1 en el archivo, que es el mismo que %oen statusline. Por supuesto, puede restar 1 para obtener el desplazamiento basado en 0.

lcd047
fuente
Una pregunta, ¿ col('.')realmente devuelve el desplazamiento de bytes en la línea? Lo último que miré, solo mostró la columna del cursor.
EvergreenTree
@EvergreenTree De acuerdo con :help col(): [l] l resultado es un Número, que es el índice de bytes de la posición de la columna dada con {expr} . Supongo que es el desplazamiento de byte basado en 1 ...
lcd047
¿La respuesta funcionará en un archivo que solo tenga esta línea abcäb:? (No lo he comprobado)
VanLaser
1
@ VanLaser Funciona en mis pruebas rápidas. Usted nos dice si aún funciona después de una prueba extendida.
lcd047
Acabo de probar y funciona :)
VanLaser
6

La otra respuesta no funcionó para mí cuando abrí un archivo binario sin final de línea. Parece que hay un error en vim cuando se trata de contar bytes en un archivo binario sin eol. (editar: sí, esto fue un error. He enviado un parche , que fue aceptado en 7.4.781 ).

Para encontrar el desplazamiento de bytes, mientras se tiene en cuenta el error en las versiones antiguas de 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 error también afecta al %oespecificador en, por ejemplo rulerformat.

Rob W
fuente