Выделение несопоставимых скобок в 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