¿Cómo ejecutar la declaración de Python para cada línea?

10

Tengo el siguiente código de muestra que modifica la línea actual usando la declaración de Python:

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

¿Cómo puedo ejecutar esta declaración para cada línea en el archivo actual?

Relacionado: ¿Cómo puedes usar Python en Vim? en stackoverflow

kenorb
fuente

Respuestas:

10

Puede usar el pydocomando disponible desde Vim 7.4, el manual describe cómo funciona mejor de lo que podría:

: [rango] pydo {cuerpo}

Ejecute la función de Python "def _vim_pydo (line, linenr): {body}" para cada línea en el [rango], con los argumentos de la función establecidos en el texto de cada línea, sin un <EOL> final, y el actual número de línea. La función debe devolver una cadena o Ninguno. Si se devuelve una cadena, se convierte en el texto de la línea en el turno actual. El valor predeterminado para [rango] es el archivo completo: "1, $".

Para su ejemplo, puede usar un comando como:

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

El linenr - 1bit está ahí porque las líneas vim.current.bufferestán indexadas en 0 pero Vim comienza a contar líneas desde 1.

Lo bueno es que puedes definir fácilmente un comando personalizado para ejecutar tu código Python en un rango de líneas:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line
toro2k
fuente
1
Está disponible desde vim 7.4.
kenorb
7

Puede obtener el búfer actual con vim.current.buffer, que es iterable; puede usar use un forbucle para obtener cada línea.

Puede cambiar las líneas asignándolas; así que, juntando eso, obtenemos

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

También vea :help python-buffer.

Martin Tournoij
fuente