Come eseguire l'istruzione python per ogni riga?


10

Ho il seguente codice di esempio che modifica la riga corrente usando l'istruzione Python:

:py import vim; vim.current.line="["+vim.current.line+"]"

Come posso eseguire questa istruzione per ogni riga nel file corrente?

Correlati: Come puoi usare Python in Vim? su stackoverflow

Risposte:


10

Puoi usare il pydocomando disponibile da Vim 7.4, il manuale descrive come funziona meglio di quanto potrei:

: [range] pydo {body}

Esegui la funzione Python "def _vim_pydo (line, linenr): {body}" per ogni riga nell'intervallo [,], con gli argomenti della funzione impostati sul testo di ogni riga a turno, senza <EOL> finale e l'attuale numero di riga. La funzione dovrebbe restituire una stringa o None. Se viene restituita una stringa, questa diventa il testo della riga nel turno corrente. L'impostazione predefinita per [intervallo] è l'intero file: "1, $".

Per il tuo esempio puoi usare un comando come:

:python import vim
:pydo vim.current.buffer[linenr - 1] = '[%s]' % line

Il linenr - 1bit è lì perché le linee in vim.current.buffersono indicizzate 0 ma Vim inizia a contare le linee da 1.

La cosa bella è che puoi facilmente definire un comando personalizzato per eseguire il tuo codice Python su un intervallo di linee:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line

1
È disponibile da vim 7.4.
Kenorb,

7

È possibile ottenere il buffer corrente con vim.current.buffer, che è un iterabile; puoi usare un forciclo per ottenere ogni riga.

Puoi cambiare le linee assegnandole; quindi mettendo insieme, otteniamo:

:py from vim import *
:py for i, line in enumerate(current.buffer): current.buffer[i] = '[%s]' % line

Vedere anche :help python-buffer.

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.