Estou escrevendo uma função VimL que, no modo de inserção, permite que uma <BS>
parte da abertura de um par ( [
, {
etc.) exclua a parte de fechamento do par se for o próximo caractere após o cursor (como pares automáticos e vim-autoclose ). Esta função será diferente porque a parte de fechamento do par não será excluída se houver pares desequilibrados.
Exemplos:
O formato é <initial> => <result-after-backspace>
onde meu cursor está na frente do |
.
((|) => (|)
((|)) => (|)
(|) => |
(defn => (defn
(|) |)
Como posso determinar se os pares estão desequilibrados antes de prosseguir e excluir o par final?
Eu testei os pares automáticos e o vim-autoclose . Nos dois plugins, a parte de fechamento do par é sempre excluída.
vimscript
delimiter-matching
200_success
fonte
fonte
Respostas:
Se entendi sua pergunta corretamente, a chave é determinar se o caractere no cursor é um delimitador correspondente.
Considere os comandos do modo normal
v%"zy
ev%%"zy
.@z
. O segundo puxará uma sequência de comprimento exatamente 1 - novamente, o próprio delimitador - para dentro@z
.@z
. Abortar.@z
. Abortar.@z
. Abortar.Assim, temos o seguinte resultado:
Dicas para o VimL:
:norm ...
estrlen(@z)
ajudará aqui.fonte
(|)
:, pressionar<BS>
deve excluir os dois. No entanto, se o formulário de nível superior estiver desequilibrado, desta forma:,(defn (|)
pressionar<BS>
deve excluir apenas o que normalmente seria excluído - nesse caso, deixando-nos com(defn |)
.Ok, então acabei passando pelo paredit.vim e retirando algumas funções para criar isso: vim-pear . Ele insere e exclui delimitadores em pares, mantendo um estado equilibrado.
fonte