Перейти до відповідності тегів XML у Vim


140

%Оператор 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

34
Існує якась версія matchit, яка постачається з Vim вже btw. runtime macros/matchit.vimповинен увімкнути його та дозволити %відповідати тегам XML.
Свенд

1
Здається, mtchit.vim у NeoVim увімкнено за замовчуванням.
Джеймс

Можливо, у вас вже є matchit, але він не включений за замовчуванням. Додати, packadd! matchitщоб .vimrcувімкнути це. Детальніше:help matchit
ruuter

242

Це можна зробити без додаткових плагінів:

  • помістіть курсор на тег
  • 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
Я хочу перейти до тегу, а не "вибрати" доданий вміст. І якщо я можу це зробити за допомогою 1 або 2 натискань клавіш, чому я роблю 5 натискань клавіш кожного разу, коли хочу вибрати тег? (що трапляється багато разів насправді)
кумархарш

2
Приємно, що є вбудований спосіб, хоч і заплутаний, перейти до завершальної мітки. Чи єдиний спосіб дістатися до об'їзду через візуальний режим?
Mu Mind

2
Свята молі, ти завжди дізнаєшся з Вімом нових речей! Навчитися стільки, це мені дуже допомогло, дякую!
gosukiwi

23
Зауважимо: після того, як ви вибрали вибір, ви можете перемикатися між верхом і низом "O"
Michael Gruber

3
@Geek, 't' - це 'тег'. Щоб зрозуміти "a", ви повинні спочатку зрозуміти "i". citзмінює i nterior тегу - лише вміст. catзмінити в ЛЛ тега - зміст і в LSO сам тег, як відкриття і закриття.
Едвард

37

ОП заявила, що те, що він насправді хотів зробити, - це скопіювати розділ 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означає "a"?
нілон

@nilon aозначає "усі".
Codie CodeMonkey

Я використовую мнемонічне те, що aстоїть навколо . Для мене це має більше сенсу.
Кіт Джонсон

5

Якраз моя хитрість використання "yank", "select-object" (вибір тегу) та "перейти до останнього вибитого тексту".

yit`] 

перейти вправо до закриття тегу

і

yit

перейти вправо після відкриття тегу

Примітка: це змінить вміст регістра за замовчуванням

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.