Подсветка непревзойденных скобок в vim - PullRequest
12 голосов
/ 12 февраля 2009

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

Пример кода C с непревзойденными паренами:

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

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

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

Edit:

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

Обновление:

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

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

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

Ответы [ 7 ]

8 голосов
/ 13 февраля 2009

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

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

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

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

4 голосов
/ 02 марта 2009

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

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

4 голосов
/ 13 февраля 2009

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

:imap ( ()<C-[>i

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

2 голосов
/ 13 февраля 2009

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

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

РЕДАКТИРОВАТЬ: Как насчет этого:

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

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

РЕДАКТИРОВАТЬ # 2:

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

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

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

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

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

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

1 голос
/ 02 марта 2009

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

0 голосов
/ 17 июня 2016

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


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

0 голосов
/ 19 февраля 2009

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

...