sábado, 14 de março de 2009

Folding por expressão

Use:
:set foldmethod=expr
:set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'
[^>].*','',''))

Explicação da expressão de dentro para fora:
getline(v:lnum) - obtém a linha corrente.
substitute(...) - então substitui todos espaços por string vazio (deleta-os).
substitute(...) - então substitui tudo depois de um '>' no início da linha por string vazio (deleta-os)
strlen(...) - então conta o tamanho do string resultante, o qual é o número de '>' encontrados.

Note que um backslash (\) deve ser inserido antes de um espaço, aspas duplos e backslash no comando :set.

Para ver a expressão resultante sem backslashs use:
:set foldexpr

Para corrigir uma expressão complicada use:
:set foldexpr=<tab>
o vim preencherá o comando :set completo pronto para ser editado.

É similar ao folding por indentação, exceto que ao invés de uma indentação é usada uma função do usuário que calcula o nível de fold de uma linha.

Isso pode ser usado para textos que tem algo que indicam que certas linhas pertencem uma as outras. Por exemplo, texto de e-mail aonde um '>' antes da linha indica texto citado.

Se a expressão ficar complicada coloque-a dentro de uma função e faça 'foldexpr' chama-la.

0 comentários:

Postar um comentário