Comment obtenir le décalage d'octet actuel dans tout le fichier


13

J'ai vu que vous pouviez afficher le décalage d'octet actuel dans la ligne d'état en utilisant %o, mais je n'ai trouvé aucune fonction ou commande qui fasse de même. Existe-t-il un moyen d'obtenir un décalage pragmatique de l'octet actuel?

Réponses:


8

Essaye ça:

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

Cela renvoie le décalage basé sur 1 dans le fichier, qui est le même que %odans statusline. Vous pouvez, bien sûr, soustraire 1 pour obtenir le décalage basé sur 0.


Une question, col('.')retourne réellement le décalage d'octet dans la ligne? La dernière fois que j'ai regardé, il a juste montré la colonne du curseur.
EvergreenTree

@EvergreenTree Selon :help col(): [le] résultat est un nombre, qui est l'indice d'octet de la position de colonne donnée avec {expr} . Je
suppose

La réponse fonctionnera-t-elle dans un fichier ayant cette ligne uniquement abcäb:? (Je n'ai pas vérifié)
VanLaser

1
@VanLaser Cela fonctionne dans mes tests rapides. Vous nous dites si cela fonctionne toujours après des tests prolongés.
lcd047

Vient de tester et ça marche :)
VanLaser

6

L' autre réponse n'a pas fonctionné pour moi lorsque j'ai ouvert un fichier binaire sans fin de ligne. Il semble qu'il y ait un bug dans vim quand il s'agit de compter les octets dans un fichier binaire sans eol. (edit: oui, c'était un bug. J'ai soumis un patch , qui a été accepté en 7.4.781 ).

Pour trouver le décalage d'octet, tout en tenant compte du bogue dans les anciennes versions de Vim, utilisez:

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

Ce bogue affecte également le %ospécificateur dans eg rulerformat.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.