Pregunta:
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 se puede usar Python en Vim? en stackoverflow
Respuesta:
Puede usar el comando pydo
disponible desde Vim 7.4, el manual describe cómo funciona mejor que yo:
: [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 configurados 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 - 1
está ahí porque las líneas en vim.current.buffer
están indexadas con 0, pero Vim comienza a contar líneas desde 1.
Lo bueno es que puede definir fácilmente un comando personalizado para ejecutar su código Python en un rango de líneas:
command! -range=% BracketLines
\ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line