2009-09-27 7 views
12

voglio ottenere l'offset diGet offset del buffer corrente nella vim (in particolare, tramite script pitone)

  1. posizione del cursore
  2. di selezione corrente

in vim , a partire dall'inizio del file. Lo faccio in Python, quindi suggerire come farlo con lo scripting python di Vim sarebbe molto utile.

Ho usato vim.current .. prima per fare lo scripting, ma usa linee e colonne piuttosto che un offset generale.

Dovrei calcolare la quantità di tutte le lunghezze di riga precedenti + la riga corrente oppure esiste un metodo più semplice?

risposta

13

Se il vim viene compilato con l'opzione +byte_offset, poi in uno script Python dopo la consueta import vim, è possibile utilizzare, ad esempio:

vim.eval('line2byte(line("."))+col(".")') 

per ottenere il byte di offset dall'inizio del file della posizione del cursore e allo stesso modo per altri marchi. Più in generale, se si ha una coppia linea/colonna (supponendo che +byte_offset sia il modo in cui è stato compilato il tuo vim) è il modo per ottenere un offset di byte (c'è anche una funzione byte2line per andare nella direzione opposta).

Mentre il modulo vim fa fare un sacco di funzionalità disponibili direttamente agli script Python in vim, ho trovato che vim.eval e vim.command sono spesso il più comodo (e talvolta l'unico modo per ottenere ;-) in poco profonda come necessaria ;-). Oh, e cerco sempre di avere una vim compilata con + justabouteverything ogni volta che posso ;-).

+0

Grazie, è molto, molto utile !! Ho il sospetto che ci sia un modo in cui l'API effettiva non lo supporta :-) –

+3

o direttamente: ': echo eval (line2byte (line (". ")) + Col (". "))' – mykhal

11

Si potrebbe anche voler guardare l'impostazione statusline. Questo aggiungerà l'offset al statusline bye:

set statusline+=%o 

Vedi :h statusline

Basta essere attenti perché la linea di status di default è vuota, e aggiungendo il% o ad esso, si perderanno tutte le impostazioni predefinite.

+2

Per visualizzare la riga di stato quando apri hai una finestra: 'set laststatus = 2' – kizzx2