No vim, pesquise para trás chaves e parênteses correspondentes

9

Como muitos de vocês provavelmente sabem, você pode usar %a opção de procurar na linha para encontrar a próxima chave / suporte / parêntese emparelhada e passar para o parceiro correspondente:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Espero que exista uma chave semelhante que pesquise para trás na linha, por exemplo:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

A maioria dos comandos do vim tem um retorno e um retorno, então parece que deveria. Ele não tem um parceiro? Se assim for, é que, porque uma vez que está em um personagem emparelhado agiriam da mesma?

Kevin
fonte
Deve-se observar que %não apenas procura o colchete emparelhado na mesma linha, mas também mais abaixo no arquivo. Eu gosto especialmente de loops, etc, em qualquer linguagem de programa de sua escolha.
Bernhard
11
@ Bernhard Sim, mas apenas quando encontra um dos aparelhos na linha.
Kevin
Se você não se opõe aos scripts de addon, o matchit addon fornece um g%comando que parece semelhante ao que você está procurando.
Jw013
Bobo, mas sua pergunta afirma que você quer saber por que não há parceiro. Você quer dizer "existe algum parceiro que eu não conheça?" :)
rjewell
@ jewell OK, eu dividi-lo para que já não é tecnicamente pedir isso.
Kevin

Respostas:

4

Se você realmente deseja procurar por caracteres coincidentes comuns, use um destes vimcomandos específicos:

  • [(... (vá para o (caractere sem correspondência anterior )
  • [{... (vá para o {caractere sem correspondência anterior )

Esses dois comandos têm parceiros de encaminhamento correspondentes:

  • ])... (passa para o próximo )caractere sem correspondência )
  • ]}... (passa para o próximo }caractere sem correspondência )

Existem outros comandos semelhantes para #ifdefe para comentários em C.

Você pode encontrar mais quando em vimutilizando o comando :help %.

Mei
fonte
Eu sei disso, o problema é que eles encontram pares incomparáveis , preciso encontrar pares correspondentes .
Kevin
@ Kevin: Eu não entendi os documentos (suspiro). Obviamente, depois de usar %, os dois lados se encontrarão: encontrar o parceiro correspondente. Além disso, se estiver dentro de um bloco, os comandos acima encontrarão a correspondência apropriada.
Mei
3

% encontram o colchete correspondente. Portanto, se você estiver no (ou {ele pesquisará adiante.

Se você estiver em um} ou), ele pesquisará para trás.

% não é direcional, apenas encontre o colchete correspondente.

Richard Holloway
fonte
Se eu estiver atrás de um lado de um par,% descobrirá que é parceiro. Se eu estiver no final de uma linha, ele não encontrará o par mais cedo na linha.
21712 Kevin
Isso não deve ser selecionado, a resposta certa?
Jack
2

Eu apenas tentei :map ^] ^%%(com ^]= Ctrl+ v Ctrl+ 5aqui, como uma analogia com %= Shift+ 5).

Ele funciona para o caso específico fornecido, mas, como não pesquisa para trás a partir do cursor, sempre escolhe o primeiro parêntese aberto na linha e deixa o cursor no início da linha, se não encontrar nenhuma correspondência. .


Esta é uma solução melhor; é feio e provavelmente há muito espaço para simplificar, mas acho que a semântica está exatamente correta (não move o cursor se não houver parênteses abertos e passa para o primeiro parênteses aberto antes da coluna atual).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

para

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return
Sem utilidade
fonte
Isso não será exatamente o mesmo se houver dois pares não aninhados em uma linha, mas certamente é a melhor sugestão até agora, obrigado.
Kevin
Isso só funcionará dentro de um bloco, certo? Se assim for, então [(funcionaria tão bem e não requer a map.
Mei
Teria que haver um bloco começando na linha atual, sim. Porém, eu encontrei uma solução mais completa, editando ...
Inútil