Come ottenere l'offset di byte corrente nell'intero file


13

Ho visto che è possibile visualizzare l'offset di byte corrente nella linea di stato utilizzando %o, ma non ho trovato alcuna funzione o comando che faccia lo stesso. C'è un modo per ottenere l'offset del byte corrente pragmaticamente?

Risposte:


8

Prova questo:

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

Ciò restituisce l'offset in base 1 nel file, che è uguale a %oin statusline. Ovviamente puoi sottrarre 1 per ottenere l'offset in base 0.


Una domanda, in col('.')realtà restituisce l'offset di byte nella riga? L'ultima volta che ho guardato, mostrava solo la colonna del cursore.
EvergreenTree

@EvergreenTree Secondo :help col(): [t] il risultato è un numero, che è l'indice di byte della posizione della colonna data con {expr} .
Presumo

La risposta funzionerà in un file con solo questa riga abcäb:? (Non ho controllato)
VanLaser,

1
@VanLaser Funziona nei miei test rapidi. Diteci se funziona ancora dopo test prolungati.
lcd047

Appena testato e funziona :)
VanLaser,

6

L' altra risposta non ha funzionato per me quando ho aperto un file binario senza fine riga. Sembra che ci sia un bug in vim quando si tratta di contare byte in un file binario senza eol. (modifica: sì, si trattava di un bug. Ho inviato una patch , che è stata accettata in 7.4.781 ).

Per trovare l'offset di byte, tenendo conto del bug nelle vecchie versioni di Vim, utilizzare:

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

Questo errore influisce anche sull'identificatore %oin es rulerformat.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.