Ir para as tags XML correspondentes no Vim

140

O %operador Vim pula para parênteses, o comentário termina e mais algumas coisas. No entanto, ele não corresponde às tags XML (ou qualquer outra tag, com o melhor de meu conhecimento).

Qual é a melhor maneira de pular para a tag XML correspondente usando o Vim?

Nota: O que realmente quero fazer é duplicar uma seção em um arquivo XML sem procurar manualmente pela tag correspondente.

Nathan Fellman
fonte
4
Ao abordar a questão original (precedendo a Nota esclarecedora :) , a combinação v + a + t parece levá-lo ao final da seleção visual. O outro lado disso parece ser o comando "o" no modo visual, que leva você ao final alternativo da sua seleção atual. Este é um truque eficaz, não apenas nos documentos XML, mas também na edição de PHP / HTML (como aconteceu comigo).
23713 Justin Justin

Respostas:

73

Existe um plugin do vim chamado matchit.vim. Você pode encontrá-lo aqui: http://www.vim.org/scripts/script.php?script_id=39 . Foi criado praticamente o propósito exato que você descreve.

Instale isso, coloque o cursor no corpo da tag (não a <>, caso contrário ela corresponderá àquelas) e pressione% para pular para a outra tag. Veja a página do script para descobrir o que mais ele combina.

sykora
fonte
4
Agradável. Está sentado no meu disco rígido o tempo todo.
InnaM'
34
Existe alguma versão do matchit, que já vem com o Vim. runtime macros/matchit.vimdeve habilitá-lo e permitir %a correspondência de tags XML.
Svend
1
O mtchit.vim parece estar ativado por padrão no NeoVim.
James
Pode ser que você já tenha o matchit, mas não está ativado por padrão. Adicione packadd! matchita .vimrcpara habilitá-lo. Leia mais:help matchit
ruuter
241

Você pode fazer isso sem plugins adicionais:

  • coloque o cursor na tag
  • vat - selecionará a tag (externa) e posicionará o cursor no final
  • Depois de selecionar sua opção, você pode alternar entre a parte superior e a inferior o( atualização com base na nota de Michael Gruber )
  • c- alterar ou, y- copiar ou, escapar para sair do modo visual ...

Outra operação útil é: vit- selecionará o conteúdo da tag (interna).

Atualizar (graças a @elrado) Exemplo: vitopermitirá selecionar o conteúdo interno da tag e posicionar o cursor no início do texto selecionado.

Referência: /superuser/182355/how-can-i-select-an-html-tags-content-in-vim

Referência do Vim (obrigado a @Geek por anotar isso):

:help visual-operators

você terá:

4. Operating on the Visual area             *visual-operators*

The objects that can be used are:
    ...
    at  a <tag> </tag> block (with tags)        |v_at|
    it  inner <tag> </tag> block            |v_it|
    ...
Robert Lujo
fonte
1
Quero pular para uma tag, não "selecionar" o conteúdo em anexo. E se eu posso fazer isso com 1 ou 2 pressionamentos de tecla, por que faço 5 pressionamentos de tecla toda vez que quiser selecionar uma tag? (o que acontece
muitas
2
É bom que exista uma maneira integrada, embora complicada, de pular para a tag de fechamento. Fazer um desvio pelo modo visual é a única maneira de chegar lá?
Mu Mente
2
Holy Molly, você sempre aprende coisas novas com o Vim! Há muito o que aprender, isso me ajudou muito, obrigado!
precisa saber é o seguinte
23
Só para nota: uma vez que você tem sua seleção você pode alternar entre a parte superior e inferior com 'o'
Michael Gruber
3
@ Geek, 't' é para 'tag'. Para entender 'a', você deve primeiro entender 'i'. citmuda o i nterior do tag - apenas o conteúdo. catalterar a ll da marca - o conteúdo e um lso a própria tag, tanto abertura e fechamento.
Edward
37

O OP afirmou que o que ele realmente queria fazer era copiar uma seção do XML sem precisar encontrar a tag correspondente. Isso é feito facilmente no modo normal com yat<motion>p, que puxa o texto para dentro e inclui as tags correspondentes e o cola. yit<motion>pé quase o mesmo, mas não inclui as tags externas.

O 'y' na string é obviamente o comando "yank" do modo normal. ( :help y)

aou ipode ser usado para seleção de objeto depois de um operador como ydentro de uma seleção visual. O símbolo após aou iespecifica o que deve ser selecionado. O tipo de objeto tusado aqui indica uma tag SGML. ( :help object-select)

Obviamente, <motion>significa apenas mover-se para algum lugar através da sua escolha e pcoloca o texto arrancado nesse local.

Codie CodeMonkey
fonte
isignifica "dentro" (ou "interno"). asignifica "a"?
Nilon 3/06
@ nilon asignifica "todos".
Codie CodeMonkey
O mnemônico que eu uso é que afica por . Faz mais sentido para mim.
Kit Johnson
5

Apenas meu truque de usar "puxar", "selecionar objeto" (selecionar tag) e "pular para o último texto arrancado".

yit`] 

pular para a direita antes de fechar a tag

e

yit

pular para a direita após abrir a tag

Nota: isso mudará o conteúdo do registro padrão

transang
fonte