2010-10-08 11 views
9

Chciałbym napisać funkcję w vimscript, która znajduje ostatni otwarty nawias lub nawias w linii. To niekoniecznie jest łatwym problemem, ponieważ musi być w stanie obsłużyć wszystkie z poniższych kryteriów:Vimscript: znajdź ostatni otwarty nawias lub nawias

function(abc 
function(abc, [def 
function(abc, [def], "string(" 
function(abc, [def], "string(", ghi(

Jak widać, zagnieżdżonych nawiasów, różne symbole, a ciąg żetonów wszystkie muszą być traktowane w sposób inteligentny. Czy to możliwe? Czy istnieją narzędzia z wyrażeniami regularnymi vimscript do wyszukiwania kontekstowego, które znają różnicę między niezafałszowanymi nawiasami a nawiasami w łańcuchach?

Biorąc pod uwagę, że można podświetlić składnie niewyważone nawiasy, powinno być możliwe znalezienie ostatniego niezamkniętego nawiasu/nawiasu na linii. Jak to zrobić?

+1

Jedna połowa pary nawiasów nazywana jest nawiasem. –

+0

Jeśli celem jest pomoc w wyróżnieniu, zanotuj pytanie i odpowiedź tutaj: http://superuser.com/questions/545278/how-to-have-vim-show-unclosed-parenthesis. Wtyczka 'vim-matchopen' podświetla ostatni nawias, nawias i klamr w stosunku do kursora (zamkniętego lub niezamkniętego). –

Odpowiedz

4

Tak więc, w zasadzie, musisz znaleźć ostatni nawias, który nie jest w komentarzu, a nie w ciągu znaków.

Nie jestem pewien, co to składnia jest więc umieścić te linie w buforze i zrobił

:set ft=javascript 

dostać strings podkreślając

function(abc 
function(abc, [def 
function(abc, [def], "string(" 
function(abc, [def], "string(", ghi(

Teraz umieścić kursor na 3. linia otwartym Parenthese i wydaj następującą komendę:

:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)' 

To będzie echo "1", a to oznacza, że ​​c pod kursorem znajduje się komentarz lub ciąg znaków.

Jeśli umieścisz kursor na ostatniej kolumnie ostatniej linii i wykonasz to samo polecenie, otrzymasz "0".

Teraz możesz przechodzić wstecz do nawiasów i testować je względem "komentarza" i "ciągu" i uzyskać ostatni otwarty nawias.

Możesz sprawdzić this archive of "LISP: Balance unmatched parentheses in Vim", aby zobaczyć, jak zamknąć niedopasowane nawiasy używając vimscript.

+0

Dzięki!Nadal jest nieco bardziej skomplikowany (pomyśl o linii kończącej się na "function (abc, def(), ghi", ostatni nawias nie jest ostatnim nieposiadającym nawiasów), ale synIDattr jest dokładnie tym, czego potrzebowałem, aby móc wykonać resztę pracy. – So8res

1

Nie mam żadnej bezpośredniej odpowiedzi dla ciebie, ale możesz chcieć sprawdzić kod w wtyczce matchparen.vim, która jest standardową wtyczką zawartą w instalacjach Vima (w katalogu wtyczek). Ta wtyczka jest używana do podświetlania pasujących parenów, jeśli ta funkcja jest włączona. Kod jest bardziej ogólny niż to, czego potrzebujesz, ponieważ pasuje do wielu linii, ale możesz być w stanie z nim pracować i sprawdzić, czy znajdzie dopasowanie w tej samej linii, lub przynajmniej uzyskać pewne pomysły ze swojego kodu.

4

Zastosowanie [( i ]):

[(   go to [count] previous unmatched '('. 
])   go to [count] next unmatched ')'. 

Dla nawiasach klamrowych: [{ i [}.

+1

Interesujące. W jaki sposób jest to realizowane? Czy istnieje odpowiednik wyszukiwania niedopasowanych nawiasów kwadratowych? Czy jest jakiś łatwy sposób mogę użyć tego w funkcji vimscript, bez przesuwania kursora? – So8res

+3

Wyszukaj 'searchpair()' w pomocy/dokumentacji. – Jeet

Powiązane problemy