Chama a função vim via mapeamento falha

1

Eu defini a seguinte função, que funciona bem quando chamada diretamente:

function EncloseParagraphs()
   execute "normal '>a</p>\<Esc>'<i<p>\<Esc>"
   %s/\%V\n\{2,}\%V/<\/p>\r\r<p>/ge
   nohl
endfunction

Mas quando eu uso o mapeamento a seguir

map <silent> <C-P> :call EncloseParagraphs()<CR>

Os resultados parecem com isso

<p><p><p>This is a paragraph.</p></p></p>

<p><p><p>This is a paragraph.</p>
</p></p>

Em outras palavras, várias tags p são adicionadas quando mais de um parágrafo é selecionado no modo visual. Por que a função se comporta de maneira diferente quando chamada por meio do atalho mapeado?

    
por janeden 27.09.2011 / 09:45

1 resposta

0

Na documentação de ajuda do Vim:

help :call

--snip--
When a range is given and the function doesn't handle it
itself, the function is executed for each line in the range,
with the cursor in the first column of that line.  The cursor
is left at the last line (possibly moved by the last function
call).  The arguments are re-evaluated for each line.

Parece que, como você está selecionando (realçando) um bloco de linhas e pressionando C-P, sua função é executada várias vezes para esse bloco, uma vez para cada linha selecionada.

Eu imagino que você precisará implementar a manipulação de faixas dentro de sua função para evitar a execução múltipla fornecida (!) pela função: call.

O restante da documentação de ajuda da função de chamada discute como lidar com intervalos e evitar esse problema.

    
por 27.09.2011 / 10:18

Tags