Выделение несопоставимых скобок в vim

Я получаю ожоги неоднократно непревзойденными скобками при написании кода python в vim. Мне нравится, как они обрабатываются для C - кода-Vim выделяет красным все фигурные скобки, следующие за непревзойденным paren. Я посмотрел на c.vim файл синтаксиса кратко, чтобы попытаться понять его, но раздел, который обрабатывает ошибки скобок, очень сложен. Может ли кто-нибудь объяснить, как работает этот код и предложить, как я могу написать что-то подобное для кода python?

пример кода C с бесподобные родители:

int main(void
{  /* brace highlighted in red */
}  /* brace highlighted in red */

поскольку код python не имеет фигурных скобок для выделения, нам придется выбрать что-то еще (возможно, другие круглые скобки).

кстати, я пробовал этот плагин vim но меня не устраивало такое поведение.

Edit:

Я использую python для генерации кода C++ (язык, который любит круглые скобки и точки с запятой). У меня есть отвратительная привычка оставлять парена позади!--3--> вызов метода. Было бы хорошо, если бы я мог заставить ВИМ сделать эту ошибку более очевидной.

обновление:

хорошо, вот что я пробовал до сих пор.

:syn region pParen transparent start="(" end=")" contains=ALL
:syn match pError display ")"
:hi def link pError Error

к сожалению, все это делает выделение в качестве ошибки правильного парена всех сбалансированной скобки, противоположные тому, что я хочу сделать. Я действительно не понимаю, что я здесь делаю (просто скопировал существующий файл синтаксиса C). Если бы кто-нибудь мог объяснить, что я сделал (неправильно), я бы ценить это.

7 ответов


если я правильно понимаю, и вы пытаетесь посмотреть на несоответствующие скобки в коде C (который был сгенерирован в python), я бы рекомендовал вам установить rainbow.ВИМ от сайт доктора чипа. Это выделит фигурные скобки в разных цветах в зависимости от уровня отступа и выделит несогласованные фигурные скобки красным цветом, как вы просили. Скриншот http://img294.imageshack.us/img294/8586/rainbow.jpg http://img294.imageshack.us/img294/8586/rainbow.jpg

установить, скачать rainbow.vim и в vimfiles/after/syntax/c/ (создайте этот каталог, если его нет).

в Linux это будет ~/.vim/after/syntax/c/rainbow.vim

на Windows, это может быть c:\vim\vimfiles\after\syntax\c\rainbow.vim или, возможно, где-то еще, см. :help runtimepath.

обратите внимание, что есть некоторые плагины, которые конфликтуют с rainbow.vim, но не слишком сложно заставить их сотрудничать.

если вы не пытаясь выделить несоответствующие скобки в коде python, вы можете изменить rainbow.vim для использования синтаксических кластеров python вместо C, но это немного сложнее, но вы можете использовать что-то вроде (модифицированная версия кода радуги Dr Chip):

syn cluster pyParenGroup contains=pythonString,pythonRawString,pythonEscape,pythonNumber,pythonBuiltin,pythonException
syn match pyParenError display ')'
syn region  pyParen     transparent matchgroup=hlLevel0 start='(' end=')' contains=@pyParenGroup,pyParen1
syn region  pyParen1        transparent matchgroup=hlLevel1 start='(' end=')' contains=@pyParenGroup,pyParen2
syn region  pyParen2        transparent matchgroup=hlLevel2 start='(' end=')' contains=@pyParenGroup,pyParen3
syn region  pyParen3        transparent matchgroup=hlLevel3 start='(' end=')' contains=@pyParenGroup,pyParen4
syn region  pyParen4        transparent matchgroup=hlLevel4 start='(' end=')' contains=@pyParenGroup,pyParen5
syn region  pyParen5        transparent matchgroup=hlLevel5 start='(' end=')' contains=@pyParenGroup,pyParen6
syn region  pyParen6        transparent matchgroup=hlLevel6 start='(' end=')' contains=@pyParenGroup,pyParen7
syn region  pyParen7        transparent matchgroup=hlLevel7 start='(' end=')' contains=@pyParenGroup,pyParen8
syn region  pyParen8        transparent matchgroup=hlLevel8 start='(' end=')' contains=@pyParenGroup,pyParen9
syn region  pyParen9        transparent matchgroup=hlLevel9 start='(' end=')' contains=@pyParenGroup,pyParen
hi link pyParenError Error

if &bg == "dark"
    hi default   hlLevel0 ctermfg=red         guifg=red1
    hi default   hlLevel1 ctermfg=yellow      guifg=orange1      
    hi default   hlLevel2 ctermfg=green       guifg=yellow1      
    hi default   hlLevel3 ctermfg=cyan        guifg=greenyellow  
    hi default   hlLevel4 ctermfg=magenta     guifg=green1       
    hi default   hlLevel5 ctermfg=red         guifg=springgreen1 
    hi default   hlLevel6 ctermfg=yellow      guifg=cyan1        
    hi default   hlLevel7 ctermfg=green       guifg=slateblue1   
    hi default   hlLevel8 ctermfg=cyan        guifg=magenta1     
    hi default   hlLevel9 ctermfg=magenta     guifg=purple1
else
    hi default   hlLevel0 ctermfg=red         guifg=red3
    hi default   hlLevel1 ctermfg=darkyellow  guifg=orangered3
    hi default   hlLevel2 ctermfg=darkgreen   guifg=orange2
    hi default   hlLevel3 ctermfg=blue        guifg=yellow3
    hi default   hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
    hi default   hlLevel5 ctermfg=red         guifg=green4
    hi default   hlLevel6 ctermfg=darkyellow  guifg=paleturquoise3
    hi default   hlLevel7 ctermfg=darkgreen   guifg=deepskyblue4
    hi default   hlLevel8 ctermfg=blue        guifg=darkslateblue
    hi default   hlLevel9 ctermfg=darkmagenta guifg=darkviolet
endif

EDIT:

в качестве теста, я скачал gvim70.zip и vim70rt.zip от ftp://ftp.vim.org/pub/vim/pc/ (Это окна версий Vim 7.0). Я распаковал два файла в новый каталог и запустил gvim.exe С vim/vim70/gvim.exe. Я!--23-->не имейте любую конфигурацию vim, хранящуюся в "C:\Documents и настройки", поэтому запуск этого vim совпадает с запуском конфигурации "ванили". Затем я скачал pyprint.py от amk.ca/python/simple/pyprint.html в качестве образца кода и скопировал приведенный выше код в файл под названием code.напор. В гвим я вошел :e pyprint.py. Она открылась на белом фоне. окно, без подсветки синтаксиса. Затем я вошел :syntax on, который включил подсветку синтаксиса по умолчанию. Я добавил второй ) символ в строке 8. Наконец я вошел :source code.vim, который сделал второй ) символ будет выделен красным цветом.

я также провел этот тест на Linux (с Vim 7.2), введя следующую последовательность команд:

cd ~
mv .vimrc old_dot_vimrc
mv .gvimrc old_dot_gvimrc
mv .vim old_dot_vim
vim pyprint.py
:e pyprint.py
" Add extra bracket here!
:syntax on
:source code.vim

опять же, вторая скобка выделена, и все остальное кажется нормальным.


вы можете заставить vim сделать противоположное: сделать

: установить showmatch

и он будет выделять соответствующие parens. Вы будете знать, когда вы неуравновешенны, когда он не выделяет что-то.

Я также предполагаю, что вы знакомы с командой"%", которая отскакивает от вас к соответствующему элементу.


остановить разрыв решение:

:imap ( ()<C-[>i

это сделает его так каждый раз, когда вы набираете левый парен он будет автоматически помещать в правом и поставить вас в положение ввода между ними.


не уверен, что это будет более или менее запутанным для вас, но вы можете посмотреть на lisp.vim файл синтаксиса (особенно часть, где g:lisp_rainbow обрабатывается), чтобы увидеть, как вы можете выделить соответствующие parens.

Если вам удастся выделить все соответствующие parens, вы можете иметь оставшиеся parens (т. е. непревзойденные parens) имеют выделение ошибок по умолчанию. Это то, что делает файл lisp.

EDIT: как насчет этого:

syn match parenError ")"
syn region matchingParens transparent start="(" end=")" contains=matchingParens
hi parenError guifg=red

если вы :syn clear и запустить их, похоже, работает. Обратите внимание, что порядок syn команды выполняются. Пер :h :syn-priority правило соответствуют последние это тот, который вступает в силу, поэтому ваши правила выделили все конечные родители в файле.

EDIT #2:

что c.vim на самом деле делает выделение любой {} внутри (), все ли правильно закрыли или нет. Попробуйте ввести ({}) в режиме C он все еще выделяет {} как ошибка.

я не думаю, что этот подход можно использовать для тестирования непосредственно для ( С непревзойденной ), потому что :syn region не волнует, есть ли конечный шаблон или нет.

таким образом, вы должны найти что-то специфичное для Python, которое никогда не должно принадлежать внутри (). Тогда матч против "(\_[^)]*the_forbidden_something". Я не знаю Python достаточно, чтобы знать, что это может быть.

если ничего другого, вы можете do:

syn match openParen "(\_[^)]*\%$"

который соответствует открытому paren без закрытия parens до конца файла. Это не удается, если он находит какой-либо закрывающий парен вообще, что означает, что он даже не поймает (()<EOF>.


вы пробовали использовать matchit.ВИМ? Он поддерживает все виды матчей, и это должны работа в Python.


в качестве обходного пути, я нашел этот абзац скрипт на веб-сайте vim, который предположительно делает лучшую работу по отступу кода Python. Когда вы заканчиваете строку с неуравновешенными родителями, она отступает в следующую строку, чтобы выровняться с открытым paren.


плагин vim-matchopen делает то, что вы ищете


Цвет подсветки изменяется в зависимости от вашего colorscheme