1" Vim syntax file
2" Language:      Perl POD format
3" Maintainer:    vim-perl <vim-perl@googlegroups.com>
4" Previously:    Scott Bigham <dsb@killerbunnies.org>
5" Homepage:      http://github.com/vim-perl/vim-perl
6" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
7" Last Change:   2017-09-12
8
9" To add embedded POD documentation highlighting to your syntax file, add
10" the commands:
11"
12"   syn include @Pod <sfile>:p:h/pod.vim
13"   syn region myPOD start="^=pod" start="^=head" end="^=cut" keepend contained contains=@Pod
14"
15" and add myPod to the contains= list of some existing region, probably a
16" comment.  The "keepend" flag is needed because "=cut" is matched as a
17" pattern in its own right.
18
19
20" Remove any old syntax stuff hanging around (this is suppressed
21" automatically by ":syn include" if necessary).
22" quit when a syntax file was already loaded
23if exists("b:current_syntax")
24  finish
25endif
26
27let s:cpo_save = &cpo
28set cpo&vim
29
30" POD commands
31syn match podCommand    "^=encoding"  nextgroup=podCmdText contains=@NoSpell
32syn match podCommand    "^=head[1234]"  nextgroup=podCmdText contains=@NoSpell
33syn match podCommand    "^=item"        nextgroup=podCmdText contains=@NoSpell
34syn match podCommand    "^=over"        nextgroup=podOverIndent skipwhite contains=@NoSpell
35syn match podCommand    "^=back"        contains=@NoSpell
36syn match podCommand    "^=cut"         contains=@NoSpell
37syn match podCommand    "^=pod"         contains=@NoSpell
38syn match podCommand    "^=for"         nextgroup=podForKeywd skipwhite contains=@NoSpell
39syn match podCommand    "^=begin"       nextgroup=podForKeywd skipwhite contains=@NoSpell
40syn match podCommand    "^=end"         nextgroup=podForKeywd skipwhite contains=@NoSpell
41
42" Text of a =head1, =head2 or =item command
43syn match podCmdText	".*$" contained contains=podFormat,@NoSpell
44
45" Indent amount of =over command
46syn match podOverIndent	"\d\+" contained contains=@NoSpell
47
48" Formatter identifier keyword for =for, =begin and =end commands
49syn match podForKeywd	"\S\+" contained contains=@NoSpell
50
51" An indented line, to be displayed verbatim
52syn match podVerbatimLine	"^\s.*$" contains=@NoSpell
53
54" Inline textual items handled specially by POD
55syn match podSpecial	"\(\<\|&\)\I\i*\(::\I\i*\)*([^)]*)" contains=@NoSpell
56syn match podSpecial	"[$@%]\I\i*\(::\I\i*\)*\>" contains=@NoSpell
57
58" Special formatting sequences
59syn region podFormat	start="[IBSCLFX]<[^<]"me=e-1 end=">" oneline contains=podFormat,@NoSpell
60syn region podFormat	start="[IBSCLFX]<<\s" end="\s>>" oneline contains=podFormat,@NoSpell
61syn match  podFormat	"Z<>"
62syn match  podFormat	"E<\(\d\+\|\I\i*\)>" contains=podEscape,podEscape2,@NoSpell
63syn match  podEscape	"\I\i*>"me=e-1 contained contains=@NoSpell
64syn match  podEscape2	"\d\+>"me=e-1 contained contains=@NoSpell
65
66" Define the default highlighting.
67" Only when an item doesn't have highlighting yet
68
69hi def link podCommand		Statement
70hi def link podCmdText		String
71hi def link podOverIndent	Number
72hi def link podForKeywd		Identifier
73hi def link podFormat		Identifier
74hi def link podVerbatimLine	PreProc
75hi def link podSpecial		Identifier
76hi def link podEscape		String
77hi def link podEscape2		Number
78
79if exists("perl_pod_spellcheck_headings")
80  " Spell-check headings
81  syn clear podCmdText
82  syn match podCmdText    ".*$" contained contains=podFormat
83endif
84
85if exists("perl_pod_formatting")
86  " By default, escapes like C<> are not checked for spelling. Remove B<>
87  " and I<> from the list of escapes.
88  syn clear podFormat
89  syn region podFormat start="[CLF]<[^<]"me=e-1 end=">" oneline contains=podFormat,@NoSpell
90  syn region podFormat start="[CLF]<<\s" end="\s>>" oneline contains=podFormat,@NoSpell
91
92  " Don't spell-check inside E<>, but ensure that the E< itself isn't
93  " marked as a spelling mistake.
94  syn match podFormat   "E<\(\d\+\|\I\i*\)>" contains=podEscape,podEscape2,@NoSpell
95
96  " Z<> is a mock formatting code. Ensure Z<> on its own isn't marked as a
97  " spelling mistake.
98  syn match podFormat   "Z<>" contains=podEscape,podEscape2,@NoSpell
99
100  " These are required so that whatever is *within* B<...>, I<...>, etc. is
101  " spell-checked, but not the B, I, ... itself.
102  syn match podBoldOpen    "B<" contains=@NoSpell
103  syn match podItalicOpen  "I<" contains=@NoSpell
104  syn match podNoSpaceOpen "S<" contains=@NoSpell
105  syn match podIndexOpen   "X<" contains=@NoSpell
106
107  " Same as above but for the << >> syntax.
108  syn match podBoldAlternativeDelimOpen    "B<< " contains=@NoSpell
109  syn match podItalicAlternativeDelimOpen  "I<< " contains=@NoSpell
110  syn match podNoSpaceAlternativeDelimOpen "S<< " contains=@NoSpell
111  syn match podIndexAlternativeDelimOpen   "X<< " contains=@NoSpell
112
113  " Add support for spell checking text inside B<>, I<>, S<> and X<>.
114  syn region podBold start="B<[^<]"me=e end=">" oneline contains=podBoldItalic,podBoldOpen
115  syn region podBoldAlternativeDelim start="B<<\s" end="\s>>" oneline contains=podBoldAlternativeDelimOpen
116
117  syn region podItalic start="I<[^<]"me=e end=">" oneline contains=podItalicBold,podItalicOpen
118  syn region podItalicAlternativeDelim start="I<<\s" end="\s>>" oneline contains=podItalicAlternativeDelimOpen
119
120  " Nested bold/italic and vice-versa
121  syn region podBoldItalic contained start="I<[^<]"me=e end=">" oneline
122  syn region podItalicBold contained start="B<[^<]"me=e end=">" oneline
123
124  syn region podNoSpace start="S<[^<]"ms=s-2 end=">"me=e oneline contains=podNoSpaceOpen
125  syn region podNoSpaceAlternativeDelim start="S<<\s"ms=s-2 end="\s>>"me=e oneline contains=podNoSpaceAlternativeDelimOpen
126
127  syn region podIndex start="X<[^<]"ms=s-2 end=">"me=e oneline contains=podIndexOpen
128  syn region podIndexAlternativeDelim start="X<<\s"ms=s-2 end="\s>>"me=e oneline contains=podIndexAlternativeDelimOpen
129
130  " Restore this (otherwise B<> is shown as bold inside verbatim)
131  syn match podVerbatimLine	"^\s.*$" contains=@NoSpell
132
133  " Ensure formatted text can be displayed in headings and items
134  syn clear podCmdText
135
136  if exists("perl_pod_spellcheck_headings")
137    syn match podCmdText ".*$" contained contains=podFormat,podBold,
138          \podBoldAlternativeDelim,podItalic,podItalicAlternativeDelim,
139          \podBoldOpen,podItalicOpen,podBoldAlternativeDelimOpen,
140          \podItalicAlternativeDelimOpen,podNoSpaceOpen
141  else
142    syn match podCmdText ".*$" contained contains=podFormat,podBold,
143          \podBoldAlternativeDelim,podItalic,podItalicAlternativeDelim,
144          \@NoSpell
145  endif
146
147  " Specify how to display these
148  hi def podBold term=bold cterm=bold gui=bold
149
150  hi link podBoldAlternativeDelim podBold
151  hi link podBoldAlternativeDelimOpen podBold
152  hi link podBoldOpen podBold
153
154  hi link podNoSpace                 Identifier
155  hi link podNoSpaceAlternativeDelim Identifier
156
157  hi link podIndex                   Identifier
158  hi link podIndexAlternativeDelim   Identifier
159
160  hi def podItalic term=italic cterm=italic gui=italic
161
162  hi link podItalicAlternativeDelim podItalic
163  hi link podItalicAlternativeDelimOpen podItalic
164  hi link podItalicOpen podItalic
165
166  hi def podBoldItalic term=italic,bold cterm=italic,bold gui=italic,bold
167  hi def podItalicBold term=italic,bold cterm=italic,bold gui=italic,bold
168endif
169
170let b:current_syntax = "pod"
171
172let &cpo = s:cpo_save
173unlet s:cpo_save
174
175" vim: ts=8
176