Vim Syntax: matches only at the beginning of a region - not subsequent ones
I have the following Vim syntax file:
" Vim syntax file
" Language: ScreenplayText - the textual source of ScreenplayXML
" Maintainer: Shlomi Fish <shlomif@iglu.org.il>
" Home: http://search.cpan.org/dist/XML-Grammar-Screenplay/
"
" Author: Shlomi Fish
" Filenames: *.screenplay-text.txt
" Last Change: Thu Jul 3 00:59:42 IDT 2008
" Version: 0.0.1
" Thanks to Andy Wokula for his help on:
" https://groups.google.com/group/vim_use/browse_thread/thread/6c0906617d67864e/a21938c5df1d15cb?show_docid=a21938c5df1d15cb
" Quit if syntax file is already loaded
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif
syntax sync minlines=50
" syntax match screenplayTextComment /<!--\_.\{-0,}-->/
" syntax match screenplayTextDescription /^ *\[\_.\{-0,}\]/
syntax region screenplayTextComment start="<!--" end="-->"
syntax region screenplayTextDescription start="^ *\[" end="]"
" syntax region screenplayTextSaying start=/\(^\s*\n\)\@<=\_^\(+\{2,\}\|[^[:+]*\):/ end=/^\s*$/ contains=screenplayTextAddress,screenplayTextInnerDesc
syntax region screenplayTextSaying start=/\(^\s*\n\)\@<=\_^\(+\{2,\}\|[^[:+]*\):/ end=/^\s*$/ contains=screenplayTextAddress
" syntax match screenplayTextAddress /\%^\(+\{2,\}\|[^[:+]*\):/ contained nextgroup=screenplayTextInnerDesc
syntax match screenplayTextAddress /[^:]\+:/ contained nextgroup=screenplayTextSayingAfterAddress
syntax region screenplayTextSayingAfterAddress contained
" syntax match screenplayTextInnerDesc /\[\_.\{-0,}\]/ contained nextgroup=screenplayTextInnerDesc
" For debugging - remove.
" hi def link screenplayTextSaying Statement
hi def link screenplayTextComment Comment
hi def link screenplayTextDescription PreProc
hi def link screenplayTextInnerDesc PreProc
hi def screenplayTextAddress term=bold cterm=bold gui=bold
It's intended for XML grammar-scripting , but screenplayTextAddress still highlights stuff in subsequent lines with ::, as in:
Kate: Of course! See, my obsession with the Bible continued throughout my
life, and later on I became a scholar: first as a married woman who just
hanged around universities and learned things from the male professors
and students, later on as someone who helped some professors with their
research and eventually got credited, and as time progressed,
I got a B.A., and then a Ph.D., and am now a professor.
The second line with the bottom ":" is still highlighted. How can I prevent it from being allocated?
Thanks for any ideas.
Hello,
- Fish Shlomi
PS: here's the repository for highlighting vim-screenplay-text (Mercurial on bitbucket) and here's the script I'm using to test it (in its git git repository).
source to share
The group screenplayTextSaying
contains two branches; I would split them into two separate areas and then use them matchgroup
to make a selection directly at the beginning of the address area, ending with a colon. Cm.:help :syn-matchgroup
syntax region screenplayTextSaying start=/\(^\s*\n\)\@<=\_^+\{2,\}:/ end=/^\s*$/
syntax region screenplayTextSaying end=/^\s*$/ matchgroup=screenplayTextAddress start=/\(^\s*\n\)\@<=\_^[^[:+]*:/
"syntax match screenplayTextAddress /[^:]\+:/ Not needed any more!
source to share
It seems the only way to recognize the first line of a paragraph is if it is followed by a blank line.
" Define blank line at first
syntax match EmptyLines "\(^\s*\n\)\+" nextgroup=FistLine, Description
" Then define Fist line
syntax region FirstLine start=+^[^\<\[]+ oneline contains=Address
" Then define Address
syntax match Address "^[^<\[]+:" contained
" Description
syntax match Description "\[[^\[]+\]"
" Comment
" Comment match code
" For the rest of text, just give them a general format
I haven't tested the code, just thought. Try it yourself. Hope this helps.
source to share