Como executar a instrução python para cada linha?

10

Eu tenho o seguinte código de exemplo que modifica a linha atual usando a instrução Python:

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

Como posso executar esta instrução para cada linha no arquivo atual?

Relacionado: Como você pode usar o Python no Vim? no stackoverflow

kenorb
fonte

Respostas:

10

Você pode usar o pydocomando disponível desde o Vim 7.4, o manual descreve como funciona melhor do que eu:

: [range] pydo {body}

Execute a função Python "def _vim_pydo (linha, roupa): {body}" para cada linha no [range], com os argumentos da função sendo definidos no texto de cada linha, sem um <EOL> à direita, e o atual número da linha. A função deve retornar uma sequência ou Nenhuma. Se uma string for retornada, ela se tornará o texto da linha na curva atual. O padrão para [range] é o arquivo inteiro: "1, $".

Para o seu exemplo, você pode usar um comando como:

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

O linenr - 1bit existe porque as linhas vim.current.buffersão indexadas em 0, mas o Vim começa a contar as linhas de 1.

O bom é que você pode definir facilmente um comando personalizado para executar seu código Python em várias linhas:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line
toro2k
fonte
11
Está disponível desde o vim 7.4.
Kenorb
7

Você pode obter o buffer atual com vim.current.buffer, que é iterável; você pode usar um forloop para obter cada linha.

Você pode alterar as linhas atribuindo a elas; então, juntando isso, obtemos:

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

Veja também :help python-buffer.

Martin Tournoij
fonte