1" Vim syntax file
2" Language:         udev(8) rules file
3" Maintainer:       Nikolai Weibull <now@bitwi.se>
4" Latest Revision:  2006-12-18
5
6if exists("b:current_syntax")
7  finish
8endif
9
10let s:cpo_save = &cpo
11set cpo&vim
12
13" TODO: Line continuations.
14
15syn keyword udevrulesTodo       contained TODO FIXME XXX NOTE
16
17syn region  udevrulesComment    display oneline start='^\s*#' end='$'
18                                \ contains=udevrulesTodo,@Spell
19
20syn keyword udevrulesRuleKey    ACTION DEVPATH KERNEL SUBSYSTEM KERNELS
21                                \ SUBSYSTEMS DRIVERS RESULT
22                                \ nextgroup=udevrulesRuleTest
23                                \ skipwhite
24
25syn keyword udevrulesRuleKey    ATTRS nextgroup=udevrulesAttrsPath
26
27syn region  udevrulesAttrsPath  display transparent
28                                \ matchgroup=udevrulesDelimiter start='{'
29                                \ matchgroup=udevrulesDelimiter end='}'
30                                \ contains=udevrulesPath
31                                \ nextgroup=udevrulesRuleTest
32                                \ skipwhite
33
34syn keyword udevrulesRuleKey    ENV nextgroup=udevrulesEnvVar
35
36syn region  udevrulesEnvVar     display transparent
37                                \ matchgroup=udevrulesDelimiter start='{'
38                                \ matchgroup=udevrulesDelimiter end='}'
39                                \ contains=udevrulesVariable
40                                \ nextgroup=udevrulesRuleTest,udevrulesRuleEq
41                                \ skipwhite
42
43syn keyword udevrulesRuleKey    PROGRAM RESULT
44                                \ nextgroup=udevrulesEStringTest,udevrulesEStringEq
45                                \ skipwhite
46
47syn keyword udevrulesAssignKey  NAME SYMLINK OWNER GROUP RUN
48                                \ nextgroup=udevrulesEStringEq
49                                \ skipwhite
50
51syn keyword udevrulesAssignKey  MODE LABEL GOTO WAIT_FOR_SYSFS
52                                \ nextgroup=udevrulesRuleEq
53                                \ skipwhite
54
55syn keyword udevrulesAssignKey  ATTR nextgroup=udevrulesAttrsPath
56
57syn region  udevrulesAttrKey    display transparent
58                                \ matchgroup=udevrulesDelimiter start='{'
59                                \ matchgroup=udevrulesDelimiter end='}'
60                                \ contains=udevrulesKey
61                                \ nextgroup=udevrulesRuleEq
62                                \ skipwhite
63
64syn keyword udevrulesAssignKey  IMPORT nextgroup=udevrulesImport,
65                                \ udevrulesEStringEq
66                                \ skipwhite
67
68syn region  udevrulesImport     display transparent
69                                \ matchgroup=udevrulesDelimiter start='{'
70                                \ matchgroup=udevrulesDelimiter end='}'
71                                \ contains=udevrulesImportType
72                                \ nextgroup=udevrulesEStringEq
73                                \ skipwhite
74
75syn keyword udevrulesImportType program file parent
76
77syn keyword udevrulesAssignKey  OPTIONS
78                                \ nextgroup=udevrulesOptionsEq
79
80syn match   udevrulesPath       contained display '[^}]\+'
81
82syn match   udevrulesVariable   contained display '[^}]\+'
83
84syn match   udevrulesRuleTest   contained display '[=!:]='
85                                \ nextgroup=udevrulesString skipwhite
86
87syn match   udevrulesEStringTest contained display '[=!+:]='
88                                \ nextgroup=udevrulesEString skipwhite
89
90syn match   udevrulesRuleEq     contained display '+=\|=\ze[^=]'
91                                \ nextgroup=udevrulesString skipwhite
92
93syn match   udevrulesEStringEq  contained '+=\|=\ze[^=]'
94                                \ nextgroup=udevrulesEString skipwhite
95
96syn match   udevrulesOptionsEq  contained '+=\|=\ze[^=]'
97                                \ nextgroup=udevrulesOptions skipwhite
98
99syn region  udevrulesEString    contained display oneline start=+"+ end=+"+
100                                \ contains=udevrulesStrEscapes,udevrulesStrVars
101
102syn match   udevrulesStrEscapes contained '%[knpbMmcPrN%]'
103
104" TODO: This can actually stand alone (without {…}), so add a nextgroup here.
105syn region  udevrulesStrEscapes contained start='%c{' end='}'
106                                \ contains=udevrulesStrNumber
107
108syn region  udevrulesStrEscapes contained start='%s{' end='}'
109                                \ contains=udevrulesPath
110
111syn region  udevrulesStrEscapes contained start='%E{' end='}'
112                                \ contains=udevrulesVariable
113
114syn match   udevrulesStrNumber  contained '\d\++\='
115
116syn match   udevrulesStrVars    contained display '$\%(kernel\|number\|devpath\|id\|major\|minor\|result\|parent\|root\|tempnode\)\>'
117
118syn region  udevrulesStrVars    contained start='$attr{' end='}'
119                                \ contains=udevrulesPath
120
121syn region  udevrulesStrVars    contained start='$env{' end='}'
122                                \ contains=udevrulesVariable
123
124syn match   udevrulesStrVars    contained display '\$\$'
125
126syn region  udevrulesString     contained display oneline start=+"+ end=+"+
127                                \ contains=udevrulesPattern
128
129syn match   udevrulesPattern    contained '[*?]'
130syn region  udevrulesPattern    contained start='\[!\=' end='\]'
131                                \ contains=udevrulesPatRange
132
133syn match   udevrulesPatRange   contained '[^[-]-[^]-]'
134
135syn region  udevrulesOptions    contained display oneline start=+"+ end=+"+
136                                \ contains=udevrulesOption,udevrulesOptionSep
137
138syn keyword udevrulesOption     contained last_rule ignore_device ignore_remove
139                                \ all_partitions
140
141syn match   udevrulesOptionSep  contained ','
142
143hi def link udevrulesTodo       Todo
144hi def link udevrulesComment    Comment
145hi def link udevrulesRuleKey    Keyword
146hi def link udevrulesDelimiter  Delimiter
147hi def link udevrulesAssignKey  Identifier
148hi def link udevrulesPath       Identifier
149hi def link udevrulesVariable   Identifier
150hi def link udevrulesAttrKey    Identifier
151" XXX: setting this to Operator makes for extremely intense highlighting.
152hi def link udevrulesEq         Normal
153hi def link udevrulesRuleEq     udevrulesEq
154hi def link udevrulesEStringEq  udevrulesEq
155hi def link udevrulesOptionsEq  udevrulesEq
156hi def link udevrulesEString    udevrulesString
157hi def link udevrulesStrEscapes SpecialChar
158hi def link udevrulesStrNumber  Number
159hi def link udevrulesStrVars    Identifier
160hi def link udevrulesString     String
161hi def link udevrulesPattern    SpecialChar
162hi def link udevrulesPatRange   SpecialChar
163hi def link udevrulesOptions    udevrulesString
164hi def link udevrulesOption     Type
165hi def link udevrulesOptionSep  Delimiter
166hi def link udevrulesImportType Type
167
168let b:current_syntax = "udevrules"
169
170let &cpo = s:cpo_save
171unlet s:cpo_save
172