Ativando e desativando o comando `match`

Oct 10 2020

Achei essa configuração útil desta postagem, que destaca os espaços em branco à direita:

highlight ExtraWhitespace ctermbg=grey guibg=grey
noremap <F10> :match ExtraWhitespace /\s\+$/<CR>

Isso funciona quando toco em F10, mas também quero que o realce desapareça quando toco em F10 novamente. A digitação :matchfunciona, mas gostaria de saber se isso poderia ser feito a partir deste mapa de teclado em si. Tentei colocar !depois, matchmas não é permitido

Respostas

3 JakeGrossman Oct 10 2020 at 04:04

Você pode obter uma lista de todas as correspondências definidas anteriormente para a janela atual com a getmatches()função. Usando um <expr>mapeamento, você pode definir dinamicamente um mapeamento com base no tamanho da Lista retornada por getmatches()com uma expressão condicional.


Expressões condicionais em Vimscript (geralmente chamadas de expressões ternárias em outras linguagens) assumem a seguinte forma:

a ? b : c

onde a, be csão expressões. Se for aavaliada como true, então a expressão condicional como um todo será avaliada como b; caso contrário, ela será avaliada como c.

A expressão a seguir avalia ':match<CR>'se o comprimento da Lista retornada por getmatches()é maior que zero, caso contrário, será avaliado como ':match ExtraWhitespace /\s\+$/<CR>'.

len(getmatches()) > 0 ? ':match<CR>' : ':match ExtraWhitespace /\s\+$/<CR>'

Usar um <expr>mapeamento permite que você avalie uma expressão para determinar a função do mapeamento, em vez de um valor estático. O resultado da expressão deve ser uma representação em string dos comandos Ex desejados.


Então, colocando nossa expressão condicional junto com nosso <expr>mapeamento, podemos fazer o seguinte:

noremap <expr> <F10> len(getmatches()) > 0 ? ':match<CR>' : ':match ExtraWhitespace /\s\+$/<CR>'

Ajuda relevante:

:h :map-<expr>
:h getmatches()