Como escapar de palavras-chave vim em mapeamentos?

1

Em outro tópico , esse mapeamento fantástico foi sugerido como um caminho para palavras-chave SQL maiúsculas:

noremap <leader>s <Esc>:s/\v<select>\|<from>\|<insert>\|<into>\|<table>\|<where>\|<delete>\|<limit>\|<order>\|<by>\|<asc>\|<desc>\|<set>\|<update>/\U
noremap <leader>s <Esc>:s/\v<select>\|<from>\|<insert>\|<into>\|<table>\|<where>\|<delete>\|<limit>\|<order>\|<by>\|<asc>\|<desc>\|<set>\|<update>/\U%pre%/g<Return>
/g<Return>

No entanto, parece que <insert> e <delete> são palavras-chave VIM. Como alguém consegue escapar deles? A tentativa óbvia de precedê-los com \ não funciona!

Obrigado.

    
por dotancohen 26.10.2012 / 16:58

2 respostas

3

Sim, escapar dos colchetes é provavelmente o caminho certo a seguir.

Minha proposta original usou \v para reduzir o número de barras invertidas no padrão de pesquisa, mas não levou em consideração os requisitos de mapeamento.

A solução é, portanto, remover o \v e entrar no frenesi da contrabarra para terminar com algo como:

nnoremap <F9> :s/\<insert\>\|\<delete\>/\U
nnoremap <F9> :s/\<insert\>\|\<delete\>/\U%pre%<cr>
<cr>
    
por 26.10.2012 / 17:37
4

Nesse caso, como isso ocorre em uma expressão regular, você pode contornar esse problema dividindo essas sequências usando o agrupamento para compartilhar o < > personagens:

noremap <leader>s <Esc>:s/\v<(select\|from\|insert\|into\|table\|where\|delete\|limit\|order\|by\|asc\|desc\|set\|update)>/\U
noremap <leader>s <Esc>:s/\v<(select\|from\|insert\|into\|table\|where\|delete\|limit\|order\|by\|asc\|desc\|set\|update)>/\U%pre%/g<Return>
/g<Return>

Mais geralmente, você pode substituir os caracteres < (todos eles ou apenas os anteriores às palavras problemáticas) com <Char-0x3c> , 0x3c sendo o valor ASCII para o caractere < .

    
por 26.10.2012 / 17:55

Tags