xref: /vim-8.2.3635/runtime/syntax/j.vim (revision 01a6c216)
1" Vim syntax file
2" Language:	J
3" Maintainer:	David Bürgin <[email protected]>
4" URL:		https://github.com/glts/vim-j
5" Last Change:	2015-01-11
6
7if exists('b:current_syntax')
8  finish
9endif
10
11let s:save_cpo = &cpo
12set cpo&vim
13
14syntax case match
15syntax sync minlines=100
16
17syntax cluster jStdlibItems contains=jStdlibNoun,jStdlibAdverb,jStdlibConjunction,jStdlibVerb
18syntax cluster jPrimitiveItems contains=jNoun,jAdverb,jConjunction,jVerb,jCopula
19
20syntax match jControl /\<\%(assert\|break\|case\|catch[dt]\=\|continue\|do\|else\%(if\)\=\|end\|fcase\|for\|if\|return\|select\|throw\|try\|whil\%(e\|st\)\)\./
21syntax match jControl /\<\%(for\|goto\|label\)_\a\k*\./
22
23" Standard library names. A few names need to be defined with ":syntax match"
24" because they would otherwise take precedence over the corresponding jControl
25" and jDefineExpression items.
26syntax keyword jStdlibNoun ARGV BINPATH CR CRLF DEL Debug EAV EMPTY FF FHS IF64 IFIOS IFJCDROID IFJHS IFQT IFRASPI IFUNIX IFWIN IFWINCE IFWINE IFWOW64 JB01 JBOXED JCHAR JCMPX JFL JINT JPTR JSIZES JSTR JTYPES JVERSION LF LF2 TAB UNAME UNXLIB dbhelp libjqt
27syntax keyword jStdlibAdverb define each every fapplylines inv inverse items leaf rows rxapply rxmerge table
28syntax keyword jStdlibConjunction bind cuts def on
29syntax keyword jStdlibVerb AND Endian IFDEF OR XOR anddf android_exec_am android_exec_host andunzip apply boxopen boxxopen bx calendar cd cdcb cder cderx cdf charsub chopstring cleartags clear coclass cocreate cocurrent codestroy coerase cofind cofindv cofullname coinfo coinsert compare coname conames conew conl conouns conounsx copath copathnl copathnlx coreset costate cut cutLF cutopen cutpara datatype dbctx dberm dberr dbg dbjmp dblocals dblxq dblxs dbnxt dbq dbr dbret dbrr dbrrx dbrun dbs dbsig dbsq dbss dbst dbstack dbstk dbstop dbstopme dbstopnext dbstops dbtrace dbview deb debc delstring detab dfh dir dircompare dircompares dirfind dirpath dirss dirssrplc dirtree dirused dlb dltb dltbs dquote drop dropafter dropto dtb dtbs echo empty endian erase evtloop exit expand f2utf8 fappend fappends fboxname fc fcompare fcompares fcopynew fdir ferase fetch fexist fexists fgets file2url fixdotdot fliprgb fmakex foldpara foldtext fpathcreate fpathname fputs fread freadblock freadr freads frename freplace fsize fss fssrplc fstamp fstringreplace ftype fview fwrite fwritenew fwrites getalpha getargs getdate getenv getqtbin hfd hostpathsep ic install iospath isatty isotimestamp isutf8 jcwdpath joinstring jpath jpathsep jsystemdefs launch list ljust load loadd loadtags mema memf memr memw nameclass namelist names nc nl pick quote require rjust rplc rxE rxall rxcomp rxcut rxeq rxerror rxfirst rxfree rxfrom rxhandles rxin rxindex rxinfo rxmatch rxmatches rxrplc rxutf8 script scriptd scripts setalpha setbreak shell show sign sminfo smoutput sort split splitnostring splitstring ss startupandroid startupconsole startupide stderr stdin stdout stringreplace symdat symget symset ta tagcp tagopen tagselect take takeafter taketo timespacex timestamp timex tmoutput toCRLF toHOST toJ todate todayno tolower topara toupper tsdiff tsrep tstamp type ucp ucpcount unxlib usleep utf8 uucp valdate wcsize weekday weeknumber weeksinyear winpathsep xedit
30syntax match jStdlibNoun /\<\%(adverb\|conjunction\|dyad\|monad\|noun\|verb\)\>/
31syntax match jStdlibVerb /\<\%(Note\|\%(assert\|break\|do\)\.\@!\)\>/
32
33" Numbers. Matching J numbers is difficult. In fact, the job cannot be done
34" with regular expressions alone. Below is a sketch of the pattern used. It
35" accepts most well-formed numbers and rejects most of the ill-formed ones.
36" See http://www.jsoftware.com/help/dictionary/dcons.htm for reference.
37"
38" "double1" and "double2" patterns:
39"     (_?\d+(\.\d*)?|_\.\d+)([eE]_?\d+)?
40"     (_?\d+(\.\d*)?|_\.\d+|\.\d+)([eE]_?\d+)?
41"
42" "rational1" and "rational2" patterns:
43"     \k<double1>(r\k<double2>)?|__?
44"     \k<double2>(r\k<double2>)?|__?
45"
46" "complex1" and "complex2" patterns:
47"     \k<rational1>((j|a[dr])\k<rational2>)?
48"     \k<rational2>((j|a[dr])\k<rational2>)?
49"
50" "basevalue" pattern:
51"     _?[0-9a-z]+(\.[0-9a-z]*)?|_?\.[0-9a-z]+
52"
53" all numbers:
54"     \b\k<complex1>([px]\k<complex2>)?(b\k<basevalue>)?(?![0-9A-Za-z_.])
55syntax match jNumber /\<_\.[0-9A-Za-z_.]\@!/
56syntax match jNumber /\<_\=\d\+x[0-9A-Za-z_.]\@!/
57syntax match jNumber /\<\%(__\=r_\=\d\+\|_\=\d\+r__\=\)[0-9A-Za-z_.]\@!/
58syntax match jNumber /\<\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\%(\%(j\|a[dr]\)\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\)\=\%([px]\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\%(\%(j\|a[dr]\)\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\)\=\)\=\%(b\%(_\=[0-9a-z]\+\%(\.[0-9a-z]*\)\=\|_\=\.[0-9a-z]\+\)\)\=[0-9A-Za-z_.]\@!/
59
60syntax region jString oneline start=/'/ skip=/''/ end=/'/
61
62syntax keyword jArgument contained x y u v m n
63
64" Primitives. Order is significant both within the patterns and among
65" ":syntax match" statements. Refer to "Parts of speech" in the J dictionary.
66syntax match jNoun /\<a[.:]/
67syntax match jAdverb /[}~]\|[/\\]\.\=\|\<\%([Mbft]\.\|t:\)/
68syntax match jConjunction /"\|`:\=\|[.:@&][.:]\=\|&\.:\|\<\%([dDHT]\.\|[DLS]:\)/
69syntax match jVerb /[=!\]]\|[\^?]\.\=\|[;[]:\=\|{\.\|[_/\\]:\|[<>+*\-%$|,#][.:]\=\|[~}"][.:]\|{\%[::]\|\<\%([ACeEiIjLor]\.\|p\.\.\=\|[ipqsux]:\|0:\|_\=[1-9]:\)/
70syntax match jCopula /=[.:]/
71syntax match jConjunction /;\.\|\^:\|![.:]/
72
73" Explicit noun definition. The difficulty is that the define expression can
74" occur in the middle of a line but the jNounDefine region must only start on
75" the next line. The trick is to split the problem into two regions and link
76" them with "nextgroup=". The fold wrapper provides syntax folding.
77syntax region jNounDefineFold
78    \ matchgroup=NONE start=/\%(\%(\%(^\s*Note\)\|\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>\)\@=/
79    \ keepend matchgroup=NONE end=/^\s*)\s*$/
80    \ contains=jNounDefineStart
81    \ fold
82syntax region jNounDefineStart
83    \ matchgroup=jDefineExpression start=/\%(\%(^\s*Note\)\|\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>/
84    \ keepend matchgroup=NONE end=/$/
85    \ contains=@jStdlibItems,@jPrimitiveItems,jNumber,jString,jParenGroup,jParen,jComment
86    \ contained oneline skipempty nextgroup=jDefineEnd,jNounDefine
87" These two items must have "contained", which allows them to match only after
88" jNounDefineStart thanks to the "nextgroup=" above.
89syntax region jNounDefine
90    \ matchgroup=NONE start=/^/
91    \ matchgroup=jDefineEnd end=/^\s*)\s*$/
92    \ contained
93" This match is necessary in case of an empty noun definition
94syntax match jDefineEnd contained /^\s*)\s*$/
95
96" Explicit verb, adverb, and conjunction definition
97syntax region jDefine
98    \ matchgroup=jDefineExpression start=/\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>/
99    \ matchgroup=jDefineEnd end=/^\s*)\s*$/
100    \ contains=jControl,@jStdlibItems,@jPrimitiveItems,jNumber,jString,jArgument,jParenGroup,jParen,jComment,jDefineMonadDyad
101    \ fold
102syntax match jDefineMonadDyad contained /^\s*:\s*$/
103
104" Paired parentheses. When a jDefineExpression such as "3 : 0" is
105" parenthesised it will erroneously extend jParenGroup to span over the whole
106" definition body. This situation receives a special treatment here.
107syntax match jParen /(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*)\)\@=/
108syntax match jParen contained /\%((\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*\)\@<=)/
109syntax region jParenGroup
110    \ matchgroup=jParen start=/(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>\)\@!/
111    \ matchgroup=jParen end=/)/
112    \ oneline transparent
113
114syntax keyword jTodo contained TODO FIXME XXX
115syntax match jComment /\<NB\..*$/ contains=jTodo,@Spell
116
117syntax match jSharpBang /\%^#!.*$/
118
119highlight default link jControl           Statement
120highlight default link jStdlibNoun        Identifier
121highlight default link jStdlibAdverb      Function
122highlight default link jStdlibConjunction Function
123highlight default link jStdlibVerb        Function
124highlight default link jString            String
125highlight default link jNumber            Number
126highlight default link jNoun              Constant
127highlight default link jAdverb            Normal
128highlight default link jConjunction       Normal
129highlight default link jVerb              Normal
130highlight default link jCopula            Normal
131highlight default link jArgument          Identifier
132highlight default link jParen             Delimiter
133
134highlight default link jDefineExpression  Define
135highlight default link jDefineMonadDyad   Delimiter
136highlight default link jDefineEnd         Delimiter
137highlight default link jNounDefine        Normal
138
139highlight default link jTodo              Todo
140highlight default link jComment           Comment
141highlight default link jSharpBang         PreProc
142
143let b:current_syntax = 'j'
144
145let &cpo = s:save_cpo
146unlet s:save_cpo
147