Os matchit %
/ g%
são simples de usar, mas estou tendo problemas para entender os outros mapeamentos, que parecem potencialmente úteis, mas parecem não funcionar de maneira compreensível.
]% Go to [count] next unmatched group, as specified by
|b:match_words|. Similar to |]}|.
Eu esperaria que isso talvez me permitisse pular para endif
, endfunction
etc. Pegue o exemplo vimscript a seguir, usando o vim ftplugin interno ( b:match_words
parece estar definido).
function! SuperTab()
let l:part = strpart(getline('.'),col('.')-2,1)
if (l:part=~'^\W\?$')
return "\<Tab>"
else
return "\<C-n>"
endif
endfunction
[%
na maioria das vezes pula para function!
, ocasionalmente (inconsistentemente dependendo da posição do cursor) pula para if
e ignora totalmente (
s. ]%
salta para se )
nada mais. va%
se comporta de maneira idêntica [%
neste exemplo e não seleciona nada. Esse comportamento é normal? Existe algum exemplo em que esses mapeamentos fazem sentido?
]%
, quase nada. Vou ter que dar uma olhada no código.va%
((( )))
não "expande" após repetidoa%
. Eu não tenho certeza se o vim já fez, mas eu deveriaa(
.Respostas:
Eu vou assumir que você usa a
matchit
versão mais recente do plugin 1.13.3 que eu encontrei no momento no repositório github do Vim.Quando você pressiona
[%
, as:MultiMatch()
função é invocada. No final deste último, há umwhile
loop cujo número de iterações év:count1
. Esta variável armazena a contagem para o último comando normal. Aqui deve ser1
, porque você não atingiu nenhum número antes[%
. Mas no meio da função, alguns:normal
comandos são executados para salvar a tela e a posição do cursor. Esses comandos normais alteram o valor dev:count1
.Você pode verificar isso assim:
Origem deste código, e pressione
cd
, leia suas mensagens (:messages
): você deve ver1
, porque você não atingiu nenhum número antescd
. Agora, forneça este código:E faça o mesmo experimento, pressione
cd
um arquivo com mais de 3 linhas. Desta vez, nas mensagens, você deve ver3
, não1
.Por esse motivo, a
searchpair()
função dentro do loop é invocada muitas vezes, o que, suspeito, explica o comportamento que você descreveu. Pelo menos, ele faz na minha máquina (8.0
patches Linux, Vim1-134
).Para corrigir isso, você pode excluir a linha 729 :
E mova-o no início da função (antes que outros comandos, incluindo
:normal
comandos, tenham a chance de alterarv:count1
):Provavelmente, é por causa da solicitação de recebimento nº 5124 que o neovim foi mesclado há um ano. De acordo com a mensagem de confirmação, seu objetivo era impedir
matchit
a adição de uma entrada indesejada no jumplist. Para resolver isso, a confirmação mudou como as posições da tela e do cursor foram salvas. Ele não usa:normal
mais comandos, mas chama a funçãowinsaveview()
ewinrestview()
. Ao se livrar:normal
, para uma finalidade diferente, eles também corrigiram o problema que você descreveu anteriormente, porquev:count1
não é mais modificado. Embora possa ser no futuro se alguns comandos forem adicionados no meio da função.No final da
s:MultiMatch()
função, linha 722 , o padrão que descreve a parte final de um grupo de tokens é definido assim:O objetivo da substituição é substituir cada vírgula, que separa 2 grupos consecutivos de tokens, por uma barra de escape duplo que será interpretada pelo mecanismo de expressão regular do Vim como uma alternância (separação entre 2 ramificações). Penso que a substituição também deve substituir os dois pontos
:
que separam os tokens dentro de cada grupo. Então, você pode reescrever a substituição assim:Com essa alteração,
]%
mova o cursor nos vários tokens descritos emb:match_words
e&l:matchpairs
, não apenas)
. Pelo menos, faz na minha máquina.Com as alterações anteriores, em particular a 2ª,
va%
deve-se selecionar o texto entre os 2 tokens circundantes. Embora, o plug-in pareça tratar a parte do meio de um grupo de tokens (comoelse
emif|else|endif
) como uma parte final (é passada parasearchpair()
o terceiro argumento, não o segundo). Portanto, o que considera serem os tokens circundantes às vezes pode surpreendê-lo.Atualmente, o mapeamento visual
a%
é definido na linha 71, assim:Quando adiciono
o
no início do{rhs}
, para mover o cursor para o início da seleção (:h v_o
), recebo o comportamento que você deseja:Aqui está uma versão do
matchit
plugin, com as três pequenas alterações descritas até agora.E aqui está outro onde eu tentei incluir também o PR # 5124 da Neovim.
Se você deseja testar o código em sua máquina, mas não tem o direito de alterar o
matchit
plug-in padrão (ou não deseja), é possível criar o arquivo~/.vim/plugin/matchit.vim
e escrevermatchit
nele o plug-in experimental .Como no caminho de execução,
~/.vim
vem antes$VIMRUNTIME
, o Vim deve originar sua versão personalizada antes da versão padrão. E desde então, o plugin padrão tem a guarda:... apenas sua versão deve ser totalmente originada.
fonte
]%
ev_a%
mapeamentos que podem ser alteradas um pouco.