1" Vim syntax file
2" Language:	SAS
3" Maintainer:	James Kidd <james.kidd@covance.com>
4" Last Change:  18 Jul 2008 by Paulo Tanimoto <ptanimoto@gmail.com>
5"               Fixed comments with * taking multiple lines.
6"               Fixed highlighting of macro keywords.
7"               Added words to cases that didn't fit anywhere.
8"             	02 Jun 2003
9"		Added highlighting for additional keywords and such;
10"		Attempted to match SAS default syntax colors;
11"		Changed syncing so it doesn't lose colors on large blocks;
12"		Much thanks to Bob Heckel for knowledgeable tweaking.
13"  For version 5.x: Clear all syntax items
14"  For version 6.x: Quit when a syntax file was already loaded
15if version < 600
16   syntax clear
17elseif exists("b:current_syntax")
18   finish
19endif
20
21syn case ignore
22
23syn region sasString	start=+"+  skip=+\\\\\|\\"+  end=+"+
24syn region sasString	start=+'+  skip=+\\\\\|\\"+  end=+'+
25
26" Want region from 'cards;' to ';' to be captured (Bob Heckel)
27syn region sasCards	start="^\s*CARDS.*" end="^\s*;\s*$"
28syn region sasCards	start="^\s*DATALINES.*" end="^\s*;\s*$"
29
30syn match sasNumber	"-\=\<\d*\.\=[0-9_]\>"
31
32" Block comment
33syn region sasComment	start="/\*"  end="\*/" contains=sasTodo
34
35" Ignore misleading //JCL SYNTAX... (Bob Heckel)
36syn region sasComment	start="[^/][^/]/\*"  end="\*/" contains=sasTodo
37
38" Previous code for comments was written by Bob Heckel
39" Comments with * may take multiple lines (Paulo Tanimoto)
40syn region sasComment start=";\s*\*"hs=s+1 end=";" contains=sasTodo
41
42" Comments with * starting after a semicolon (Paulo Tanimoto)
43syn region sasComment start="^\s*\*" end=";" contains=sasTodo
44
45" This line defines macro variables in code.  HiLink at end of file
46" defines the color scheme. Begin region with ampersand and end with
47" any non-word character offset by -1; put ampersand in the skip list
48" just in case it is used to concatenate macro variable values.
49
50" Thanks to ronald h�llwarth for this fix to an intra-versioning
51" problem with this little feature
52
53if version < 600
54   syn region sasMacroVar	start="\&" skip="[_&]" end="\W"he=e-1
55else		 " for the older Vim's just do it their way ...
56   syn region sasMacroVar	start="&" skip="[_&]" end="\W"he=e-1
57endif
58
59
60" I dont think specific PROCs need to be listed if use this line (Bob Heckel).
61syn match sasProc		"^\s*PROC \w\+"
62syn keyword sasStep		RUN QUIT DATA
63
64
65" Base SAS Procs - version 8.1
66
67syn keyword sasConditional	DO ELSE END IF THEN UNTIL WHILE
68
69syn keyword sasStatement	ABORT ARRAY ATTRIB BY CALL CARDS CARDS4 CATNAME
70syn keyword sasStatement	CONTINUE DATALINES DATALINES4 DELETE DISPLAY
71syn keyword sasStatement	DM DROP ENDSAS ERROR FILE FILENAME FOOTNOTE
72syn keyword sasStatement	FORMAT GOTO INFILE INFORMAT INPUT KEEP
73syn keyword sasStatement	LABEL LEAVE LENGTH LIBNAME LINK LIST LOSTCARD
74syn keyword sasStatement	MERGE MISSING MODIFY OPTIONS OUTPUT PAGE
75syn keyword sasStatement	PUT REDIRECT REMOVE RENAME REPLACE RETAIN
76syn keyword sasStatement	RETURN SELECT SET SKIP STARTSAS STOP TITLE
77syn keyword sasStatement	UPDATE WAITSAS WHERE WINDOW X SYSTASK
78
79" Keywords that are used in Proc SQL
80" I left them as statements because SAS's enhanced editor highlights
81" them the same as normal statements used in data steps (Jim Kidd)
82
83syn keyword sasStatement	ADD AND ALTER AS CASCADE CHECK CREATE
84syn keyword sasStatement	DELETE DESCRIBE DISTINCT DROP FOREIGN
85syn keyword sasStatement	FROM GROUP HAVING INDEX INSERT INTO IN
86syn keyword sasStatement	KEY LIKE MESSAGE MODIFY MSGTYPE NOT
87syn keyword sasStatement	NULL ON OR ORDER PRIMARY REFERENCES
88syn keyword sasStatement	RESET RESTRICT SELECT SET TABLE
89syn keyword sasStatement	UNIQUE UPDATE VALIDATE VIEW WHERE
90
91" Match declarations have to appear one per line (Paulo Tanimoto)
92syn match sasStatement	"FOOTNOTE\d"
93syn match sasStatement	"TITLE\d"
94
95" Match declarations have to appear one per line (Paulo Tanimoto)
96syn match sasMacro "%BQUOTE"
97syn match sasMacro "%NRBQUOTE"
98syn match sasMacro "%CMPRES"
99syn match sasMacro "%QCMPRES"
100syn match sasMacro "%COMPSTOR"
101syn match sasMacro "%DATATYP"
102syn match sasMacro "%DISPLAY"
103syn match sasMacro "%DO"
104syn match sasMacro "%ELSE"
105syn match sasMacro "%END"
106syn match sasMacro "%EVAL"
107syn match sasMacro "%GLOBAL"
108syn match sasMacro "%GOTO"
109syn match sasMacro "%IF"
110syn match sasMacro "%INDEX"
111syn match sasMacro "%INPUT"
112syn match sasMacro "%KEYDEF"
113syn match sasMacro "%LABEL"
114syn match sasMacro "%LEFT"
115syn match sasMacro "%LENGTH"
116syn match sasMacro "%LET"
117syn match sasMacro "%LOCAL"
118syn match sasMacro "%LOWCASE"
119syn match sasMacro "%MACRO"
120syn match sasMacro "%MEND"
121syn match sasMacro "%NRBQUOTE"
122syn match sasMacro "%NRQUOTE"
123syn match sasMacro "%NRSTR"
124syn match sasMacro "%PUT"
125syn match sasMacro "%QCMPRES"
126syn match sasMacro "%QLEFT"
127syn match sasMacro "%QLOWCASE"
128syn match sasMacro "%QSCAN"
129syn match sasMacro "%QSUBSTR"
130syn match sasMacro "%QSYSFUNC"
131syn match sasMacro "%QTRIM"
132syn match sasMacro "%QUOTE"
133syn match sasMacro "%QUPCASE"
134syn match sasMacro "%SCAN"
135syn match sasMacro "%STR"
136syn match sasMacro "%SUBSTR"
137syn match sasMacro "%SUPERQ"
138syn match sasMacro "%SYSCALL"
139syn match sasMacro "%SYSEVALF"
140syn match sasMacro "%SYSEXEC"
141syn match sasMacro "%SYSFUNC"
142syn match sasMacro "%SYSGET"
143syn match sasMacro "%SYSLPUT"
144syn match sasMacro "%SYSPROD"
145syn match sasMacro "%SYSRC"
146syn match sasMacro "%SYSRPUT"
147syn match sasMacro "%THEN"
148syn match sasMacro "%TO"
149syn match sasMacro "%TRIM"
150syn match sasMacro "%UNQUOTE"
151syn match sasMacro "%UNTIL"
152syn match sasMacro "%UPCASE"
153syn match sasMacro "%VERIFY"
154syn match sasMacro "%WHILE"
155syn match sasMacro "%WINDOW"
156
157" SAS Functions
158
159syn keyword sasFunction	ABS ADDR AIRY ARCOS ARSIN ATAN ATTRC ATTRN
160syn keyword sasFunction	BAND BETAINV BLSHIFT BNOT BOR BRSHIFT BXOR
161syn keyword sasFunction	BYTE CDF CEIL CEXIST CINV CLOSE CNONCT COLLATE
162syn keyword sasFunction	COMPBL COMPOUND COMPRESS COS COSH CSS CUROBS
163syn keyword sasFunction	CV DACCDB DACCDBSL DACCSL DACCSYD DACCTAB
164syn keyword sasFunction	DAIRY DATE DATEJUL DATEPART DATETIME DAY
165syn keyword sasFunction	DCLOSE DEPDB DEPDBSL DEPDBSL DEPSL DEPSL
166syn keyword sasFunction	DEPSYD DEPSYD DEPTAB DEPTAB DEQUOTE DHMS
167syn keyword sasFunction	DIF DIGAMMA DIM DINFO DNUM DOPEN DOPTNAME
168syn keyword sasFunction	DOPTNUM DREAD DROPNOTE DSNAME ERF ERFC EXIST
169syn keyword sasFunction	EXP FAPPEND FCLOSE FCOL FDELETE FETCH FETCHOBS
170syn keyword sasFunction	FEXIST FGET FILEEXIST FILENAME FILEREF FINFO
171syn keyword sasFunction	FINV FIPNAME FIPNAMEL FIPSTATE FLOOR FNONCT
172syn keyword sasFunction	FNOTE FOPEN FOPTNAME FOPTNUM FPOINT FPOS
173syn keyword sasFunction	FPUT FREAD FREWIND FRLEN FSEP FUZZ FWRITE
174syn keyword sasFunction	GAMINV GAMMA GETOPTION GETVARC GETVARN HBOUND
175syn keyword sasFunction	HMS HOSTHELP HOUR IBESSEL INDEX INDEXC
176syn keyword sasFunction	INDEXW INPUT INPUTC INPUTN INT INTCK INTNX
177syn keyword sasFunction	INTRR IRR JBESSEL JULDATE KURTOSIS LAG LBOUND
178syn keyword sasFunction	LEFT LENGTH LGAMMA LIBNAME LIBREF LOG LOG10
179syn keyword sasFunction	LOG2 LOGPDF LOGPMF LOGSDF LOWCASE MAX MDY
180syn keyword sasFunction	MEAN MIN MINUTE MOD MONTH MOPEN MORT N
181syn keyword sasFunction	NETPV NMISS NORMAL NOTE NPV OPEN ORDINAL
182syn keyword sasFunction	PATHNAME PDF PEEK PEEKC PMF POINT POISSON POKE
183syn keyword sasFunction	PROBBETA PROBBNML PROBCHI PROBF PROBGAM
184syn keyword sasFunction	PROBHYPR PROBIT PROBNEGB PROBNORM PROBT PUT
185syn keyword sasFunction	PUTC PUTN QTR QUOTE RANBIN RANCAU RANEXP
186syn keyword sasFunction	RANGAM RANGE RANK RANNOR RANPOI RANTBL RANTRI
187syn keyword sasFunction	RANUNI REPEAT RESOLVE REVERSE REWIND RIGHT
188syn keyword sasFunction	ROUND SAVING SCAN SDF SECOND SIGN SIN SINH
189syn keyword sasFunction	SKEWNESS SOUNDEX SPEDIS SQRT STD STDERR STFIPS
190syn keyword sasFunction	STNAME STNAMEL SUBSTR SUM SYMGET SYSGET SYSMSG
191syn keyword sasFunction	SYSPROD SYSRC SYSTEM TAN TANH TIME TIMEPART
192syn keyword sasFunction	TINV TNONCT TODAY TRANSLATE TRANWRD TRIGAMMA
193syn keyword sasFunction	TRIM TRIMN TRUNC UNIFORM UPCASE USS VAR
194syn keyword sasFunction	VARFMT VARINFMT VARLABEL VARLEN VARNAME
195syn keyword sasFunction	VARNUM VARRAY VARRAYX VARTYPE VERIFY VFORMAT
196syn keyword sasFunction	VFORMATD VFORMATDX VFORMATN VFORMATNX VFORMATW
197syn keyword sasFunction	VFORMATWX VFORMATX VINARRAY VINARRAYX VINFORMAT
198syn keyword sasFunction	VINFORMATD VINFORMATDX VINFORMATN VINFORMATNX
199syn keyword sasFunction	VINFORMATW VINFORMATWX VINFORMATX VLABEL
200syn keyword sasFunction	VLABELX VLENGTH VLENGTHX VNAME VNAMEX VTYPE
201syn keyword sasFunction	VTYPEX WEEKDAY YEAR YYQ ZIPFIPS ZIPNAME ZIPNAMEL
202syn keyword sasFunction	ZIPSTATE
203
204" Handy settings for using vim with log files
205syn keyword sasLogMsg	NOTE
206syn keyword sasWarnMsg	WARNING
207syn keyword sasErrMsg	ERROR
208
209" Always contained in a comment (Bob Heckel)
210syn keyword sasTodo	TODO TBD FIXME contained
211
212" These don't fit anywhere else (Bob Heckel).
213" Added others that were missing.
214syn match sasUnderscore	"_ALL_"
215syn match sasUnderscore "_AUTOMATIC_"
216syn match sasUnderscore	"_CHARACTER_"
217syn match sasUnderscore	"_INFILE_"
218syn match sasUnderscore	"_N_"
219syn match sasUnderscore "_NAME_"
220syn match sasUnderscore	"_NULL_"
221syn match sasUnderscore	"_NUMERIC_"
222syn match sasUnderscore "_USER_"
223syn match sasUnderscore	"_WEBOUT_"
224
225" End of SAS Functions
226
227"  Define the default highlighting.
228"  For version 5.7 and earlier: only when not done already
229"  For version 5.8 and later: only when an item doesn't have highlighting yet
230
231if version >= 508 || !exists("did_sas_syntax_inits")
232   if version < 508
233      let did_sas_syntax_inits = 1
234      command -nargs=+ HiLink hi link <args>
235   else
236      command -nargs=+ HiLink hi def link <args>
237   endif
238
239   " Default sas enhanced editor color syntax
240	hi sComment	term=bold cterm=NONE ctermfg=Green ctermbg=Black gui=NONE guifg=DarkGreen guibg=White
241	hi sCard	term=bold cterm=NONE ctermfg=Black ctermbg=Yellow gui=NONE guifg=Black guibg=LightYellow
242	hi sDate_Time	term=NONE cterm=bold ctermfg=Green ctermbg=Black gui=bold guifg=SeaGreen guibg=White
243	hi sKeyword	term=NONE cterm=NONE ctermfg=Blue  ctermbg=Black gui=NONE guifg=Blue guibg=White
244	hi sFmtInfmt	term=NONE cterm=NONE ctermfg=LightGreen ctermbg=Black gui=NONE guifg=SeaGreen guibg=White
245	hi sString	term=NONE cterm=NONE ctermfg=Magenta ctermbg=Black gui=NONE guifg=Purple guibg=White
246	hi sText	term=NONE cterm=NONE ctermfg=White ctermbg=Black gui=bold guifg=Black guibg=White
247	hi sNumber	term=NONE cterm=bold ctermfg=Green ctermbg=Black gui=bold guifg=SeaGreen guibg=White
248	hi sProc	term=NONE cterm=bold ctermfg=Blue ctermbg=Black gui=bold guifg=Navy guibg=White
249	hi sSection	term=NONE cterm=bold ctermfg=Blue ctermbg=Black gui=bold guifg=Navy guibg=White
250	hi mDefine	term=NONE cterm=bold ctermfg=White ctermbg=Black gui=bold guifg=Black guibg=White
251	hi mKeyword	term=NONE cterm=NONE ctermfg=Blue ctermbg=Black gui=NONE guifg=Blue guibg=White
252	hi mReference	term=NONE cterm=bold ctermfg=White ctermbg=Black gui=bold guifg=Blue guibg=White
253	hi mSection	term=NONE cterm=NONE ctermfg=Blue ctermbg=Black gui=bold guifg=Navy guibg=White
254	hi mText	term=NONE cterm=NONE ctermfg=White ctermbg=Black gui=bold guifg=Black guibg=White
255
256" Colors that closely match SAS log colors for default color scheme
257	hi lError	term=NONE cterm=NONE ctermfg=Red ctermbg=Black gui=none guifg=Red guibg=White
258	hi lWarning	term=NONE cterm=NONE ctermfg=Green ctermbg=Black gui=none guifg=Green guibg=White
259	hi lNote	term=NONE cterm=NONE ctermfg=Cyan ctermbg=Black gui=none guifg=Blue guibg=White
260
261
262   " Special hilighting for the SAS proc section
263
264	HiLink	sasComment	sComment
265	HiLink	sasConditional	sKeyword
266	HiLink	sasStep		sSection
267	HiLink	sasFunction	sKeyword
268	HiLink	sasMacro	mKeyword
269	HiLink	sasMacroVar	NonText
270	HiLink	sasNumber	sNumber
271	HiLink	sasStatement	sKeyword
272	HiLink	sasString	sString
273	HiLink	sasProc		sProc
274   " (Bob Heckel)
275	HiLink	sasTodo		Todo
276	HiLink	sasErrMsg	lError
277	HiLink	sasWarnMsg	lWarning
278	HiLink	sasLogMsg	lNote
279	HiLink	sasCards	sCard
280  " (Bob Heckel)
281	HiLink	sasUnderscore	PreProc
282	delcommand HiLink
283endif
284
285" Syncronize from beginning to keep large blocks from losing
286" syntax coloring while moving through code.
287syn sync fromstart
288
289let b:current_syntax = "sas"
290
291" vim: ts=8
292