Eu li a página de ajuda sobre fold-expr ( :h fold-expr
), mas não explicou qual é a sintaxe usada na expressão.
Havia quatro exemplos:
:set foldexpr=getline(v:lnum)[0]==\"\\t\"
:set foldexpr=MyFoldLevel(v:lnum)
:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
:set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1
Entendi que v:lnum
é a linha que precisa de um nível de indentação e que a expressão dois é uma chamada para uma função.
e as expressões 1,3 e 4? Alguém por favor pode me explicar?
Respostas:
De
:help 'foldexpr'
:O
foldexpr
é avaliado, portanto, ele precisa ser código VimL; não há menção a "sintaxe especial" ou algo parecido. O resultado dessa avaliação controla o que o Vim considera uma dobra ou não.Valores possíveis são
Esta não é a lista completa; apenas os usados nos exemplos da sua pergunta. Veja
:help foldexpr
a lista completa.Primeiro
O primeiro é bastante simples quando adicionamos alguns espaços e removemos as barras invertidas necessárias para que isso funcione em um
:set
comando:getline(v:lnum)
recebe a linha inteira.[0]
recebe o primeiro personagem disso== "\t"
verifica se esse é um caractere de tabulação.Se você expandir isso para contar o número de guias, terá dobras baseadas em recuo (pelo menos quando
expandtab
não estiver ativado).Terceiro
O terceiro, na verdade, não é muito mais complicado que o primeiro; como no primeiro exemplo, primeiro queremos torná-lo mais legível:
getline(v:lnum)
=~
to'^\s*$'
;^
âncoras no início,\s
significa qualquer caractere de espaço em branco,*
significa repetir o zero anterior ou mais vezes e$
ancora no final. Portanto, esse regexp corresponde (retorna true) para linhas em branco ou linhas com apenas espaço em branco.getline(v:lnum + 1)
obtém a próxima linha.\S
, que corresponde a qualquer caractere que não seja um espaço em branco em qualquer lugar desta linha.<1
, caso contrário1
,. Isso é feito com o "ternário"if
conhecido a partir de C e outras linguagens:condition ? return_if_true : return_if_false
.<1
significa que uma dobra termina nessa linha e significa uma dobra no1
nível.Portanto, se encerrarmos uma dobra, se a linha estiver em branco e a próxima linha não estiver em branco. Caso contrário, estamos no nível de dobra 1. Ou, como
:h foldexpr
diz:Quarto
O quarto se comporta da mesma forma que o terceiro, mas de uma maneira ligeiramente diferente. Expandido, é:
Se a linha anterior for uma linha em branco e a linha atual for uma linha não em branco, iniciaremos uma dobra nessa linha (
>1
); caso contrário, definiremos o nível de dobra como 1.Posfácio
Portanto, a lógica dos três exemplos é realmente bastante simples. A maior parte da dificuldade está na falta de espaços e em parte do uso da barra invertida.
Suspeito que chamar uma função tenha alguma sobrecarga, e como isso é avaliado para cada linha que você deseja ter um desempenho decente. Porém, não sei quão grande é a diferença nas máquinas modernas e recomendo que você use uma função (como no segundo exemplo), a menos que tenha problemas de desempenho. Lembre-se de Knuth: "a otimização prematura é a raiz de todo mal" .
Esta pergunta também está no StackOverflow , que tem uma resposta um pouco diferente. Mas o meu é obviamente melhor ;-)
fonte
Você está basicamente perguntando quais são os outros elementos nessas expressões, que podem ser encontrados chamando-
:help
os por vez:Dividi essas expressões pelas partes abaixo para ajudar a ilustrar seu significado:
1 Retornará 1 para todas as linhas que começam com uma guia e 0 para outras linhas:
3 Termina dobras em linhas em branco após parágrafos:
4 Inicia dobras em linhas em branco começando com parágrafos:
Os significados de
<1
,>1
etc. estão logo abaixo dessas expressões em:help fold-expr
fonte
Colocou acidentalmente minha resposta como comentário e a enviei cedo. Darn mobile.
Meu entendimento é que a expressão deve retornar um número, e esse número será usado para determinar em que nível a linha especificada será dobrada. 0 não é dobrado, 1 é a dobra mais externa, 2 é uma dobra aninhada dentro de uma dobra de nível 1 e assim por diante.
As expressões nos exemplos parecem avaliadas como verdadeiras ou falsas. O VimScript não possui um tipo booleano adequado; portanto, será realmente 1 ou 0, que são níveis de dobra válidos.
Você pode escrever sua própria expressão usando o VimScript, que é tão simples quanto retornar 1 ou 0, ou mais complicado, permitindo dobras aninhadas.
fonte