Может ли vim выделить соответствующие теги HTML, такие как Notepad ++?

181

VIM поддерживает сопоставление пар фигурных скобок, скобок и квадратных скобок. Это отлично подходит для редактирования языков C-стиля, таких как PHP и Javascript. Но как насчет соответствия тегов HTML?

Notepad ++ имел эту функцию, пока я использовал его. Возможность определить, где блоки HTML начинаются и заканчиваются, очень полезна. Я ищу что-то вроде этого для vim (см. Зеленые теги div):

(дополнительная функция: выделение незакрытых тегов HTML, например, красного тега на этом скриншоте).

matchit был предложен как лучшая вещь, но для ее использования требуется дополнительное нажатие клавиши. Я хотел бы видеть, где блоки HTML начинаются и заканчиваются без дополнительного нажатия клавиш.

Я бродил по интернету, чтобы найти что-то подобное для vim. Судя по всему, я не единственный, по 2 другим вопросам StackOverflow и клевать .

Я почти смирился с тем, что vim не может визуально сопоставить HTML-теги. Возможно ли это сделать для vim?

Приложение: Если в настоящее время невозможно сделать это с какими-либо существующими плагинами, есть ли у какого-либо мастера vimscript какие-либо указатели на то, как подходить к написанию подходящего плагина?

linqq
источник
Не могли бы вы объяснить, как эта функция «очень полезна»? Мне не нужно знать все обо всем в любой момент. Когда мне нужно что-то узнать, Vim разработан так, чтобы его было очень легко узнать всего за несколько нажатий клавиш.
Ромен
17
Хотя мне не нужно все знать, возможность легко узнать, когда заканчивается HTML-тег, позволяет мне понять структуру файла, с которым я работаю. Я также имею дело с большим количеством плохо написанного кода, поэтому иногда я сталкиваюсь с тегом html без закрывающего тега, который всегда должен быть исправлен.
linqq
5
@romainl Я читаю твой ответ очень часто, и мне очень нравится твоя точка зрения. Но на этот раз я должен не согласиться. Я могу считать эту функцию несущественной, но считаю, что это довольно хороший вопрос. Мне кажется странным, что нет простого способа получить это с Vim.
Люкапет
1
@ Lucapette, спасибо. На самом деле мне тоже нравится вопрос. Я никогда не использовал такую ​​функцию, и я никогда не чувствовал необходимость в ней. Но это, наверное, одна из тех вещей, без которых ты не сможешь жить, если попробуешь. Мне нравится мой рабочий процесс и рабочее пространство, чистые и сфокусированные, без «административного мусора», и я думаю , что такая функция может быть излишней. Идеальный кандидат на плагин. Возможно, в качестве отправной точки можно попытаться взять вдохновение из matchit.
Ромен
6
Вы видели этот ответ? stackoverflow.com/questions/1957083/…
Грег Секстон

Ответы:

219

Сегодня мне пришлось поработать с HTML, поэтому я решил заняться этим. Добавлен ftplugin для vim.org, который должен решить вашу проблему.

Вы можете получить это здесь на vim.org .

Вы можете получить это здесь на GitHub .

Надеюсь, это работает для вас. Дайте мне знать, если у вас есть какие-либо проблемы.

Грег Секстон
источник
1
Спасибо! Это именно та функциональность, которую я ищу. Только две незначительные ошибки, если вы хотите их исправить: 1. В настоящее время сопоставляется только противоположный тег. Можно ли будет также соответствовать тегу, на котором находится курсор? 2. В настоящее время, если html-тег имеет атрибуты, они также выбираются. Можно ли выбрать только имя тега без атрибутов?
linqq
Хорошие предложения. Об обоих следует позаботиться в версии 1.2 на vim.org. Соответствующее регулярное выражение теперь более сложное, поэтому дайте мне знать, если вы найдете какие-либо ошибки.
Грег Секстон
1
Как я и просил, я добавил этот ftplugin в github. Смотрите мой обновленный ответ по ссылке.
Грег Секстон
1
@GregSexton теперь ты официально герой;)
lucapette
7
Просто нашел это, выглядит хорошо, но учтите, что мне пришлось добавить «плагин filetype on» в мой ~ / .vimrc, чтобы включить его. Если он не работает после того, как вы поместите плагин в папку ftplugin, добавьте вышеперечисленное в ваш ~ / .vimrc, и все будет готово.
Джефф
95

Плагин Greg для MatchTag.vim великолепен, но я хотел чего-то большего. Я хотел, чтобы вмещающие теги всегда выделялись, а не только когда курсор находится на одном из тегов.

Поэтому я написал MatchTagAlways, который делает все, что делает MatchTag Грега, а также всегда выделяет вмещающий тег, независимо от того, где находится курсор в коде. Он также работает с открытыми тегами и языками шаблонов HTML, такими как Jinja или Handlebars.

Вот GIF, показывающий это в действии:

МТА в действии

Valloric
источник
4
Крутое решение - я бы, наверное, использовал оригинальную версию, но я вижу, насколько это полезно. Я хотел бы, чтобы больше ответов было в демоверсиях GIF, это здорово!
Джейсон
3
Полностью согласен с Джейсоном, +1 за удивительные хаки GIF.
Дэн Бешард
Это работает лучше, чем принятый ответ. Но я все еще не уверен, как проверить теги, которые превышают вертикальную высоту экрана. Я не могу переместить экран за курсор в vim, и разделенный экран не показывает активные теги в обоих окнах.
radix07
1
Вы абсолютная легенда, моя жизнь стала намного лучше от этого ... <3
Карл Глейзер,
1
Это намного лучше, чем
щедрый
-2

Я пришел сюда в поисках подходящих угловых скобок в стиле HTML в Vim. Это похоже на работу:

:set mps+=<:>
:help matchpairs
Крис Х
источник
7
Этот метод не является решением, он просто позволяет '<' соответствовать '>'
Даниэль YC Лин