quinta-feira, 9 de abril de 2009

Dividindo um plugin grande em funções e mapeamentos

Se um plugin fica grande você vai querer dividi-lo em partes.
Você pode usar funções ou mapeamentos para isto.

Mas você não irá querer que essas funções e mapeamentos interfiram com os dos
outros scripts.

Para evitar isso definimos a função como local ao script prefixando-a com 's:':
Por exemplo, nos definiremos uma função que adiciona um novo tipo de correção:
30 function s:Add(from, correct)
31 let to = input("type the correction for " . a:from . ": ")
32 exe ":iabbrev " . a:from . " " . to
..
36 endfunction
Agora chamaremos a função 's:Add()' de dentro do script. Se um outro script
definir um 's:Add()' também ela será local para aquele script e só pode ser
chamado de dentro do script em que ele foi definido.
Pode também existir uma função 'Add()', a qual novamente é uma outra função.

<SID> pode ser usado com mapeamentos. Ele gera um script ID, o qual identifica o
script corrente. Em nosso plugin de correção de digitação nos usamos ele assim:
24 noremap <unique> <script> <Plug>TypecorrAdd  <SID>Add
..
28 noremap <SID>Add :call <SID>Add(expand("<cword>"),1)<CR>
Assim quando um usuário digita '\a', esta sequencia é invocada:
\a −> <Plug>TypecorrAdd −> <SID>Add −> :call <SID>Add()
Se um outro script também mapear <SID>Add, ele obterá um outro script ID e assim
definirá outro mapeamento.

Note que ao invés de 's:Add()' nos usamos '<SID>Add()' aqui. Isto é porque o
mapeamento é digitado pelo usuário, assim do lado de fora do script. O <SID> é
traduzido para o script ID, para que o vim saiba em qual script procurar pela
função 'Add()'.

Isto é um pouco complicado, mas necessário para o plugin funcionar com outros
plugins. A regra básica é que você use '<SID>Add()' em mapeamentos e 's:Add()'
em outros lugares (no script em si, autocomandos e comandos do usuário).

0 comentários:

Postar um comentário