sábado, 11 de abril de 2009

Criando um plugin que carrega rapidamente

Um plugin pode crescer e se tornar muito grande.
O tempo de inicialização pode se tornar perceptível, mesmo que você raramente use o
plugin.

É o momento para um plugin de carga rápida.

A ideia básica é que o plugin seja carregado duas vezes.

A primeira vez os comandos do usuário e mapeamentos são definidos para que
ofereçam a funcionalidade.
A segunda vez as funções que implementam a funcionalidade são definidas.

Pode parecer surpreendente que para carregar rápido um plugin signifique
carregar o script duas vezes.
O que se busca é que ele carregue rapidamente a primeira vez, postergando o
grosso do script para a segunda vez, o que acontece quando você realmente o
utiliza.
Sempre que você utilizar a funcionalidade ele fica na realidade mais lento!

Note que desde do Vim 7 existe uma alternativa para o explicado aqui: use a funcionalidade 'autoload'.

O exemplo mostra como é feito:
" Vim global plugin for demonstrating quick loading
" Last Change: 2005 Feb 25
" Maintainer: Bram Moolenaar <Bram@vim.org>
" License: This file is placed in the public domain.
if !exists("s:did_load")
      command −nargs=* BNRead call BufNetRead(<f−args>)
      map <F19> :call BufNetWrite('something')<CR>
      let s:did_load = 1
      exe 'au FuncUndefined BufNet* source ' . expand('<sfile>')
      finish
endif
function BufNetRead(...)
      echo 'BufNetRead(' .
      string(a:000) . ')'
      " read functionality here
endfunction
function BufNetWrite(...)
      echo 'BufNetWrite(' . string(a:000) . ')'
      " write functionality here
endfunction
Quando o script é carregado pela primeira vez 's:did_load' não está definido. Os
comandos entre 'if' e 'endif' serão executados. Isto acaba em um comando
':finish', assim o resto do script não é executado.

A segunda vez que o script é carregado 's:did_load' existe e os comandos depois
de 'endif' são executados. Estes definem (possivelmente longas) funções
'BufNetRead()' e 'BufNetWrite()'.

Se você jogar esse script no seu diretório plugin Vim o executará na
inicialização. Esta é a sequencia de eventos que acontecem:

1. O comando 'BNread' é definido e a tecla <F19> é mapeada quando o script é
sourced na inicialização. Um autocomando 'FuncUndefined' é definido. O comando
':finish' faz com que o script termine antes.

2. O usuário digita o comando 'BNRead' ou pressiona a tecla <F19>. A função
'BufNetRead()' ou 'BufNetWrite()' será chamada.

3. O Vim não acha a função e dispara o evento do autocomando 'FuncUndefined'.
Desde que o padrão 'BufNet*' corresponde à função invocada, o comando 'source
fname' será executado. 'fname' será o nome do script, não importando ao está
localizado, pois ele vem da expansão de '<sfile>.

4. O script é novamente sourced, a variável 's:did_load' existe e as funções
estão definidas.

Note que funções que são carregadas depois correspondem ao padrão no autocomando
'FuncUndefined'. Você deve estar certo que nenhum outro plugin define funções
que correspondem a esse padrão.

0 comentários:

Postar um comentário