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?


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 %.


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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.