Выделение непревзойденных скобок в vim

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

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

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

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

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

Edit:

Я использую python для генерации кода на С++ (язык, который любит круглые скобки и точки с запятой). У меня неприятная привычка оставлять трейлинг-код при вызове метода file.write(). Было бы неплохо, если бы я смог заставить vim сделать эту ошибку более визуально очевидной.

Update:

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

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

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

Ответы

Ответ 1

Если я правильно понял и вы пытаетесь посмотреть на несовпадающие скобки в C-коде (который был сгенерирован на python), я бы порекомендовал вам установить rainbow.vim из Сайт Dr Chip. Это будет отображать фигурные скобки разных цветов в зависимости от уровней отступов и будет выделять красные фигурные скобки красным цветом, как вы просили. Снимок экрана 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, но это немного больше, но вы можете использовать что-то строки (модифицированная версия кода радуги доктора Чипа):

syn cluster pyParenGroup contains=pythonString,pythonRawString,pythonEscape,pythonNumber,pythonBuiltin,pythonException
syn match pyParenError display ')'
syn region  pyParen     transparent matchgroup=hlLevel0 start='(' end=')' [email protected],pyParen1
syn region  pyParen1        transparent matchgroup=hlLevel1 start='(' end=')' [email protected],pyParen2
syn region  pyParen2        transparent matchgroup=hlLevel2 start='(' end=')' [email protected],pyParen3
syn region  pyParen3        transparent matchgroup=hlLevel3 start='(' end=')' [email protected],pyParen4
syn region  pyParen4        transparent matchgroup=hlLevel4 start='(' end=')' [email protected],pyParen5
syn region  pyParen5        transparent matchgroup=hlLevel5 start='(' end=')' [email protected],pyParen6
syn region  pyParen6        transparent matchgroup=hlLevel6 start='(' end=')' [email protected],pyParen7
syn region  pyParen7        transparent matchgroup=hlLevel7 start='(' end=')' [email protected],pyParen8
syn region  pyParen8        transparent matchgroup=hlLevel8 start='(' end=')' [email protected],pyParen9
syn region  pyParen9        transparent matchgroup=hlLevel9 start='(' end=')' [email protected],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/ (это версии Windows Vim 7.0). Я распаковал два файла в новый каталог и запустил gvim.exe из vim/vim70/gvim.exe. я не иметь любую конфигурацию vim, хранящуюся в "C:\Documents and Settings", поэтому запуск этого vim аналогичен настройке 'vanilla'. Затем я загрузил pyprint.py из amk.ca/python/simple/pyprint.html как часть примера кода и скопировал вышеуказанный код в файл с именем code.vim. В gVim я ввел :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

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

Ответ 2

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

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

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

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

Ответ 3

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

:imap ( ()<C-[>i

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

Ответ 4

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

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

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

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

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

EDIT # 2:

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

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

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

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

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

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

Ответ 5

Вы пытались использовать matchit.vim? Он поддерживает всевозможные совпадения, и он должен работать в Python.

Ответ 6

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

Ответ 7

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


Цвет подсветки изменяется на основе вашей цветовой схемы