VIM собственный синтаксис школы рока - PullRequest
1 голос
/ 12 октября 2011

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

{Dm,4}Don't cry, don't {C/D,4}raise your eye
It's {Bb/D,2}on-ly {Am,2} teen-age {Dm,4hold}waste-land

Я просто хочу, чтобы аккорд называл один цвет, а обозначение времени - другой цвет ... В двух словах, это все между {и следующим, как один цвет, затем до следующего}, как второй цвет. Может быть, скобки тоже должны быть другого цвета. Я сосу регулярные выражения, но этот форум может направить меня в правильном направлении, чтобы в конечном итоге овладеть ими, я надеюсь.

1 Ответ

2 голосов
/ 12 октября 2011

Вот очень простая версия, которая просто выделит целые блоки {...}. Поместите в ${HOME}/.vim/syntax/rock.vim следующее:

if exists("b:current_syntax")
    finish
endif

syntax match rockNotation      "{[^}]*}"

highlight link rockNotation    String

И следующее в ${HOME}/.vim/ftdetect/rock.vim:

autocmd BufRead,BufNewFile *.rock set filetype=rock

Теперь, когда вы открываете файл .rock, аккорды должны быть выделены. (Если обнаружение не работает, попробуйте установить :set filetype=rock вручную, посмотрите, не изменит ли оно что-либо.) Обратите внимание, что если вы редактировали эти файлы из Vim, вам может потребоваться перезапустить его, чтобы применить эффекты.

Вот более длинная версия, в которой аккорды и индикация времени выделены разными цветами:

if exists("b:current_syntax")
    finish
endif

syntax clear
syntax case match

setlocal iskeyword+=#                                                                         
setlocal iskeyword+=-
setlocal iskeyword+=+

syntax match rockChord /\<[A-G]\(b\|#\)\=\(m\|-\|dim\|+\|aug\|7\|m7\|Maj7\|m7b5\)\=\(\/[A-G]\(b\|#\)\=\)\=\>/ contained
syntax match rockDuration /[1-9][0-9]*\(hold\|mute\)\=/ contained

syntax region rockAnnotRegion start=/{/ end=/}/ contains=rockChord,rockDuration

highlight link rockChord          Type
highlight link rockDuration       Constant
highlight link rockAnnotRegion    Delimiter

Как видите, мое выражение для аккордов стало немного диким. Он поддерживает такие вещи, как A#m7b5/Db, что, конечно, не имеет большого смысла (и звучит ужасно), но вы поняли.

...