Перейти к соответствующим тегам XML в Vim

142

%Оператор Vim переходит к соответствующим круглым скобкам, концам комментариев и многим другим вещам. Однако он не соответствует тегам XML (или любому другому тегу, насколько мне известно).

Как лучше всего перейти к соответствующему тегу XML с помощью Vim?

Примечание. На самом деле я хочу продублировать раздел в XML-файле, не ища вручную соответствующий тег.

Натан Феллман
источник
4
При решении оригинальный вопрос (перед уточнением Примечание: ), то комбинация v + а + т , кажется, высадить вас в нижней части визуального выделения. Другой стороной этого, кажется, является команда «o» в визуальном режиме, которая переносит вас в альтернативный конец текущего выделения. Это эффективный прием не только в XML-документах, но и при редактировании PHP / HTML (как это случилось со мной).
Джастин Белл

Ответы:

73

Существует плагин vim под названием matchit.vim. Вы можете найти его здесь: http://www.vim.org/scripts/script.php?script_id=39 . Он был создан в точности с той целью, которую вы описываете.

Установите его, поместите курсор в тело тега (не на <>, иначе он будет соответствовать им) и нажмите%, чтобы перейти к другому тегу. См. Страницу сценария, чтобы узнать, что еще он соответствует.

сикора
источник
4
Хороший. Все время сидел на моем жестком диске.
innaM 01
36
Есть версия matchit, которая, кстати, уже поставляется с Vim. runtime macros/matchit.vimдолжен включить его и разрешить %сопоставление тегов XML.
Svend
1
mtchit.vim по умолчанию включен в NeoVim.
Джеймс
Возможно, у вас уже есть matchit, но он не включен по умолчанию. Добавьте, packadd! matchitчтобы .vimrcвключить его. Подробнее:help matchit
ruuter
matchitне работает в большом источнике html. github.com/andymass/vim-matchup преуспевает в источнике.
chmn
247

Вы можете сделать это без дополнительных плагинов:

  • поместите курсор на тег
  • vat - выберет (внешний) тег и поместит курсор в конец
  • как только вы сделали свой выбор, вы можете переключаться между верхним и нижним с помощью o( обновление на основе примечания Майкла Грубера )
  • c- изменить или, y- скопировать или, выйти для выхода из визуального режима ...

Еще одна полезная операция: vit- выделит содержимое тега (внутренний).

Обновление (спасибо @elrado) Пример: vitoпозволит вам выбрать внутреннее содержимое тега и поместить курсор в начало выделенного текста.

Ссылка: /superuser/182355/how-can-i-select-an-html-tags-content-in-vim

Ссылка на Vim (спасибо @Geek за то, что это заметили):

:help visual-operators

ты получишь:

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|
    ...
Роберт Луджо
источник
1
Я хочу перейти к тегу, а не «выбирать» вложенный контент. И если я могу сделать это одним или двумя нажатиями клавиш, почему я буду нажимать 5 клавиш каждый раз, когда хочу выбрать тег? (что на самом деле происходит МНОГО раз)
kumarharsh
2
Приятно, что есть встроенный способ, хотя и запутанный, для перехода к закрывающему тегу. Является ли объезд через визуальный режим единственным способом добраться туда?
Mu Mind
2
Святая Молли, с Vim ты всегда узнаешь что-то новое! Так много всего нужно узнать, это мне очень помогло, спасибо!
gosukiwi
25
Просто обратите внимание: как только вы сделали свой выбор, вы можете переключаться между верхом и низом с помощью «о»
Майкл Грубер
3
@Geek, «t» означает «тег». Чтобы понять «а», вы должны сначала понять «я». citизменяет я nterior тега - только содержание. catизменить в ЛЛ тега - содержание и в LSO сам тег, как открытие и закрытие.
Эдвард
37

OP заявил, что на самом деле он хотел скопировать раздел XML без необходимости искать соответствующий тег. Это легко сделать в обычном режиме с помощью yat<motion>p, который извлекает текст внутри и включает соответствующие теги, а затем вставляет его. yit<motion>pпочти то же самое, но не включает внешние теги.

'Y' в строке, конечно же, является командой "yank" нормального режима. ( :help y)

aили iможет использоваться для выбора объекта после оператора, такого как yили внутри визуального выбора. Символ после aили iуказывает, что следует выбрать. tИспользуемый здесь тип объекта указывает тег SGML. ( :help object-select).

Конечно, <motion>просто означает переместиться куда-нибудь по вашему выбору и pпоместить извлеченный текст в это место.

Коди Обезьяна
источник
iозначает «внутри» (или «внутренний»). aозначает "а"?
nilon 03
@nilon aозначает «все».
Codie CodeMonkey
Мнемоника, которую я использую, aозначает « вокруг» . Для меня это имеет больше смысла.
Кит Джонсон
5

Просто мой трюк с использованием «yank», «object-select» (выбор тега) и «перехода к последнему восстановленному тексту».

yit`] 

перейти вправо перед закрывающим тегом

а также

yit

перейти сразу после открытия тега

Примечание: это изменит содержимое регистра по умолчанию

трансанг
источник