Vim语法:仅在区域的开头匹配 - 而不是后续的匹配

时间:2013-02-19 08:36:56

标签: syntax vim

我有以下Vim语法文件:

" 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

它适用于XML-Grammar-Screenplay,但是screenplayTextAddress仍然使用“:”突出显示后续行中的内容,如:

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.

带有“:”冒号的第二行仍会突出显示。如何防止它被突出显示?

感谢您的任何见解。

此致

- Shlomi Fish

P.S。:这里是the repository for the vim-screenplay-text highlighting(位于bitbucket上的Mercurial),这里是the screenplay I use to test it(在其GitHub git存储库中)。

2 个答案:

答案 0 :(得分:2)

screenplayTextSaying组包含两个分支;我将它们分成两个独立的区域,然后使用matchgroup直接在以冒号结尾的地址的区域开头处突出显示。见: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!

答案 1 :(得分:0)

似乎识别段落第一行的唯一方法是它遵循一个空行。

" 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

我没有测试代码,只是提供了一个想法。请自己尝试一下。希望这会有所帮助。