Czy vim może wyróżnić pasujące znaczniki HTML, takie jak Notepad ++?

181

VIM obsługuje pasujące pary nawiasów klamrowych, nawiasów i nawiasów kwadratowych. Jest to świetne do edycji języków w stylu C, takich jak PHP i JavaScript. Ale co z dopasowanymi tagami HTML?

Notepad ++ ma tę funkcję tak długo, jak długo jej używam. Bardzo przydatna jest umiejętność rozpoznawania, gdzie zaczynają się i kończą bloki HTML. To, czego szukam, to coś takiego dla vima (zobacz zielone znaczniki div):

(funkcja dodatkowa: wyróżnianie niezamkniętych tagów HTML, takich jak czerwony znacznik na tym zrzucie ekranu).

matchit został zaproponowany jako kolejna najlepsza rzecz, ale wymaga on dodatkowego naciśnięcia klawisza, aby móc korzystać z jego funkcji. Chciałbym móc zobaczyć, gdzie bloki HTML zaczynają się i kończą bez dodatkowego naciskania.

Przeszukałem internet, by znaleźć coś takiego dla vima. Najwyraźniej nie jestem jedynym, zgodnie z 2 innymi pytaniami StackOverflow i nabble .

Prawie zrezygnowałem z tego, że vim nie jest w stanie wizualnie dopasować tagów HTML. Czy vim może to zrobić?

Dodatek: Jeśli obecnie nie jest możliwe zrobienie tego z żadnymi istniejącymi wtyczkami, czy jakiś kreator vimscript ma jakieś wskazówki, jak podejść do napisania odpowiedniej wtyczki?

linqq
źródło
Czy możesz wyjaśnić, w jaki sposób ta funkcja „jest bardzo przydatna”? Naprawdę nie muszę wszystkiego wiedzieć o wszystkim w każdej chwili. Kiedy muszę coś wiedzieć, Vim został tak zaprojektowany, aby bardzo łatwo było to wiedzieć po kilku naciśnięciach klawiszy.
romainl,
17
Chociaż nie muszę wiedzieć wszystkiego, to, że mogę łatwo wiedzieć, kiedy kończy się tag HTML, pozwala mi przeglądać strukturę pliku, z którym pracuję. Mam też do czynienia z wieloma źle napisanymi kodami, więc czasami spotykam tag HTML bez tagu zamykającego, który zawsze trzeba naprawić.
linqq,
5
@romainl Bardzo często czytam twoją odpowiedź i podoba mi się twój punkt widzenia. Ale tym razem muszę się nie zgodzić. Mogę uznać tę funkcję za nieistotną, ale uważam, że jest to całkiem miłe pytanie. Wydaje mi się dziwne, że nie ma łatwego sposobu na zdobycie go za pomocą Vima.
lucapette
1
@lucapette, dziękuję. Właściwie to też lubię to pytanie. Nigdy nie korzystałem z takiej funkcji i nigdy nie czułem takiej potrzeby. Ale to prawdopodobnie jedna z tych rzeczy, bez których nie możesz żyć, kiedy spróbujesz. Lubię przepływ pracy i obszar roboczy czysty i skoncentrowany, wolny od „śmieci administracyjnych” i myślę, że taka funkcja może być zbyteczna. Idealny kandydat na wtyczkę. Prawdopodobnie można spróbować zainspirować się matchitem jako punktem wyjścia.
romainl,
6
Widziałeś tę odpowiedź? stackoverflow.com/questions/1957083/...
Greg Sexton

Odpowiedzi:

219

Musiałem dziś pracować z trochę HTML, więc pomyślałem, że sobie z tym poradzę. Dodano ftplugin do vim.org, który powinien rozwiązać twój problem.

Możesz go pobrać tutaj na vim.org .

Możesz go pobrać tutaj na github .

Mam nadzieję, że Ci się uda. Daj mi znać, jeśli masz jakieś problemy.

Greg Sexton
źródło
1
Dziękuję Ci! Właśnie takiej funkcjonalności szukam. Tylko dwa drobne spory, jeśli masz ochotę je naprawić: 1. Obecnie dopasowywany jest tylko przeciwny tag. Czy można również dopasować tag, na którym znajduje się kursor? 2. Obecnie, jeśli znacznik html ma atrybuty, są one również wybrane. Czy można tylko wybrać nazwę znacznika bez atrybutów?
linqq
Dobre sugestie. Należy zająć się nimi w wersji 1.2 na stronie vim.org. Dopasowywanie wyrażenia regularnego jest teraz bardziej skomplikowane, więc daj mi znać, jeśli znajdziesz jakieś błędy.
Greg Sexton
1
Zgodnie z prośbą dodałem tę wtyczkę ftplugin do github. Zobacz moją zaktualizowaną odpowiedź na link.
Greg Sexton
1
@GregSexton oficjalnie jesteś teraz bohaterem;)
lucapette
7
Właśnie to znalazłem, wygląda dobrze, ale zauważ, że musiałem dodać „wtyczkę typu pliku” do mojego ~ / .vimrc, aby ją włączyć. Jeśli nie działa po umieszczeniu wtyczki w folderze ftplugin, dodaj powyższe do ~ / .vimrc i wszystko powinno być ustawione.
Geoff
95

Wtyczka Grega MatchTag.vim jest niesamowita, ale chciałem czegoś więcej. Chciałem, aby otaczające tagi były zawsze podświetlone, nie tylko wtedy, gdy kursor znajduje się na jednym z tagów.

Napisałem więc MatchTagAlways, który robi wszystko, co robi Greg's MatchTag, a także zawsze wyróżnia otaczający tag, bez względu na to, gdzie kursor znajduje się w kodzie. Działa również z niezamkniętymi tagami i językami szablonów HTML, takimi jak Jinja lub Kierownica.

Oto GIF pokazujący go w akcji:

MTA w akcji

Valloric
źródło
4
Fajne rozwiązanie - prawdopodobnie użyłbym oryginalnej wersji, ale widzę, jak to jest pomocne. Chciałbym, żeby więcej odpowiedzi zawierało prezentacje GIF, to niesamowite!
Jason
3
Całkowicie zgadzam się z Jasonem, +1 za niesamowite hacki GIF-ów.
Dan Bechard
Działa to lepiej niż zaakceptowana odpowiedź. Ale nadal nie jestem pewien, jak zweryfikować tagi, które znajdują się poza pionową wysokością ekranu. Nie mogę przesunąć ekranu poza kursor w vimie, a podzielony ekran nie pokazuje aktywnych znaczników w obu oknach.
radix07,
1
Jesteś absolutną legendą, moje życie stało się o wiele lepsze od tego ... <3
Karl Glaser
1
To o wiele lepsze niż nagroda za nagrodę
MohitC
-2

Przybyłem tutaj, szukając pasujących nawiasów kątowych w stylu HTML w Vimie. To wydaje się działać:

:set mps+=<:>
:help matchpairs
Chris X
źródło
7
Ta metoda nie jest rozwiązaniem, pozwala po prostu dopasować „<” do „>”
Daniel YC Lin