xref: /vim-8.2.3635/runtime/syntax/j.vim (revision 09c6f265)
1baca7f70SBram Moolenaar" Vim syntax file
2baca7f70SBram Moolenaar" Language:	J
3*09c6f265SBram Moolenaar" Maintainer:	David Bürgin <[email protected]>
4*09c6f265SBram Moolenaar" URL:		https://gitlab.com/glts/vim-j
5*09c6f265SBram Moolenaar" Last Change:	2019-11-12
6baca7f70SBram Moolenaar
7a6878375SBram Moolenaarif exists('b:current_syntax')
8baca7f70SBram Moolenaar  finish
9baca7f70SBram Moolenaarendif
10baca7f70SBram Moolenaar
1175b8156aSBram Moolenaarlet s:save_cpo = &cpo
1275b8156aSBram Moolenaarset cpo&vim
1375b8156aSBram Moolenaar
14baca7f70SBram Moolenaarsyntax case match
157d76c804SBram Moolenaarsyntax sync minlines=100
16baca7f70SBram Moolenaar
1775b8156aSBram Moolenaarsyntax cluster jStdlibItems contains=jStdlibNoun,jStdlibAdverb,jStdlibConjunction,jStdlibVerb
1875b8156aSBram Moolenaarsyntax cluster jPrimitiveItems contains=jNoun,jAdverb,jConjunction,jVerb,jCopula
1975b8156aSBram Moolenaar
20a6878375SBram Moolenaarsyntax match jControl /\<\%(assert\|break\|case\|catch[dt]\=\|continue\|do\|else\%(if\)\=\|end\|fcase\|for\|if\|return\|select\|throw\|try\|whil\%(e\|st\)\)\./
21a6878375SBram Moolenaarsyntax match jControl /\<\%(for\|goto\|label\)_\a\k*\./
22baca7f70SBram Moolenaar
2375b8156aSBram Moolenaar" Standard library names. A few names need to be defined with ":syntax match"
2475b8156aSBram Moolenaar" because they would otherwise take precedence over the corresponding jControl
2575b8156aSBram Moolenaar" and jDefineExpression items.
26*09c6f265SBram Moolenaarsyntax keyword jStdlibNoun ARGV BINPATH CR CRLF DEL Debug EAV EMPTY FF FHS IF64 IFBE IFIOS IFJA IFJHS IFJNET IFQT IFRASPI IFUNIX IFWIN IFWINCE IFWINE IFWOW64 JB01 JBOXED JCHAR JCHAR2 JCHAR4 JCMPX JFL JINT JLIB JPTR JSB JSIZES JSTR JSTR2 JSTR4 JTYPES JVERSION LF LF2 LIBFILE TAB UNAME UNXLIB dbhelp libjqt
2783caecf3SBram Moolenaarsyntax keyword jStdlibAdverb define each every fapplylines inv inverse items leaf rows rxapply rxmerge table
2875b8156aSBram Moolenaarsyntax keyword jStdlibConjunction bind cuts def on
29*09c6f265SBram Moolenaarsyntax keyword jStdlibVerb AND Endian IFDEF OR XOR abspath anddf android_exec_am android_exec_host android_getdisplaymetrics andunzip apply boxopen boxxopen bx calendar cd cdcb cder cderx cdf charsub chopstring 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 dbcut dberm dberr dbg dbinto dbjmp dblocals dblxq dblxs dbnxt dbout dbover 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 isutf16 isutf8 jcwdpath joinstring jpath jpathsep jsystemdefs launch list ljust load loadd mema memf memr memu 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 stderr stdin stdout stringreplace symdat symget symset take takeafter taketo timespacex timestamp timex tmoutput toCRLF toHOST toJ todate todayno tolist tolower topara toupper tsdiff tsrep tstamp type ucp ucpcount undquote unxlib usleep utf8 uucp valdate wcsize weekday weeknumber weeksinyear winpathsep xedit
3075b8156aSBram Moolenaarsyntax match jStdlibNoun /\<\%(adverb\|conjunction\|dyad\|monad\|noun\|verb\)\>/
3183caecf3SBram Moolenaarsyntax match jStdlibVerb /\<\%(Note\|\%(assert\|break\|do\)\.\@!\)\>/
32baca7f70SBram Moolenaar
337d76c804SBram Moolenaar" Numbers. Matching J numbers is difficult. In fact, the job cannot be done
347d76c804SBram Moolenaar" with regular expressions alone. Below is a sketch of the pattern used. It
357d76c804SBram Moolenaar" accepts most well-formed numbers and rejects most of the ill-formed ones.
367d76c804SBram Moolenaar" See http://www.jsoftware.com/help/dictionary/dcons.htm for reference.
37baca7f70SBram Moolenaar"
387d76c804SBram Moolenaar" "double1" and "double2" patterns:
397d76c804SBram Moolenaar"     (_?\d+(\.\d*)?|_\.\d+)([eE]_?\d+)?
407d76c804SBram Moolenaar"     (_?\d+(\.\d*)?|_\.\d+|\.\d+)([eE]_?\d+)?
41baca7f70SBram Moolenaar"
427d76c804SBram Moolenaar" "rational1" and "rational2" patterns:
437d76c804SBram Moolenaar"     \k<double1>(r\k<double2>)?|__?
447d76c804SBram Moolenaar"     \k<double2>(r\k<double2>)?|__?
45baca7f70SBram Moolenaar"
467d76c804SBram Moolenaar" "complex1" and "complex2" patterns:
477d76c804SBram Moolenaar"     \k<rational1>((j|a[dr])\k<rational2>)?
487d76c804SBram Moolenaar"     \k<rational2>((j|a[dr])\k<rational2>)?
49a6878375SBram Moolenaar"
507d76c804SBram Moolenaar" "basevalue" pattern:
517d76c804SBram Moolenaar"     _?[0-9a-z]+(\.[0-9a-z]*)?|_?\.[0-9a-z]+
527d76c804SBram Moolenaar"
537d76c804SBram Moolenaar" all numbers:
547d76c804SBram Moolenaar"     \b\k<complex1>([px]\k<complex2>)?(b\k<basevalue>)?(?![0-9A-Za-z_.])
557d76c804SBram Moolenaarsyntax match jNumber /\<_\.[0-9A-Za-z_.]\@!/
567d76c804SBram Moolenaarsyntax match jNumber /\<_\=\d\+x[0-9A-Za-z_.]\@!/
577d76c804SBram Moolenaarsyntax match jNumber /\<\%(__\=r_\=\d\+\|_\=\d\+r__\=\)[0-9A-Za-z_.]\@!/
587d76c804SBram Moolenaarsyntax 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_.]\@!/
59baca7f70SBram Moolenaar
6075b8156aSBram Moolenaarsyntax region jString oneline start=/'/ skip=/''/ end=/'/
6175b8156aSBram Moolenaar
6275b8156aSBram Moolenaarsyntax keyword jArgument contained x y u v m n
6375b8156aSBram Moolenaar
6475b8156aSBram Moolenaar" Primitives. Order is significant both within the patterns and among
6575b8156aSBram Moolenaar" ":syntax match" statements. Refer to "Parts of speech" in the J dictionary.
6675b8156aSBram Moolenaarsyntax match jNoun /\<a[.:]/
6775b8156aSBram Moolenaarsyntax match jAdverb /[}~]\|[/\\]\.\=\|\<\%([Mbft]\.\|t:\)/
6875b8156aSBram Moolenaarsyntax match jConjunction /"\|`:\=\|[.:@&][.:]\=\|&\.:\|\<\%([dDHT]\.\|[DLS]:\)/
6975b8156aSBram Moolenaarsyntax match jVerb /[=!\]]\|[\^?]\.\=\|[;[]:\=\|{\.\|[_/\\]:\|[<>+*\-%$|,#][.:]\=\|[~}"][.:]\|{\%[::]\|\<\%([ACeEiIjLor]\.\|p\.\.\=\|[ipqsux]:\|0:\|_\=[1-9]:\)/
7075b8156aSBram Moolenaarsyntax match jCopula /=[.:]/
7175b8156aSBram Moolenaarsyntax match jConjunction /;\.\|\^:\|![.:]/
7275b8156aSBram Moolenaar
73822ff866SBram Moolenaar" Explicit noun definition. The difficulty is that the define expression can
74822ff866SBram Moolenaar" occur in the middle of a line but the jNounDefine region must only start on
75822ff866SBram Moolenaar" the next line. The trick is to split the problem into two regions and link
76822ff866SBram Moolenaar" them with "nextgroup=". The fold wrapper provides syntax folding.
77822ff866SBram Moolenaarsyntax region jNounDefineFold
7883caecf3SBram Moolenaar    \ matchgroup=NONE start=/\%(\%(\%(^\s*Note\)\|\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>\)\@=/
79822ff866SBram Moolenaar    \ keepend matchgroup=NONE end=/^\s*)\s*$/
80822ff866SBram Moolenaar    \ contains=jNounDefineStart
81822ff866SBram Moolenaar    \ fold
8275b8156aSBram Moolenaarsyntax region jNounDefineStart
8383caecf3SBram Moolenaar    \ matchgroup=jDefineExpression start=/\%(\%(^\s*Note\)\|\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>/
8475b8156aSBram Moolenaar    \ keepend matchgroup=NONE end=/$/
8575b8156aSBram Moolenaar    \ contains=@jStdlibItems,@jPrimitiveItems,jNumber,jString,jParenGroup,jParen,jComment
86822ff866SBram Moolenaar    \ contained oneline skipempty nextgroup=jDefineEnd,jNounDefine
8775b8156aSBram Moolenaar" These two items must have "contained", which allows them to match only after
8875b8156aSBram Moolenaar" jNounDefineStart thanks to the "nextgroup=" above.
8975b8156aSBram Moolenaarsyntax region jNounDefine
9075b8156aSBram Moolenaar    \ matchgroup=NONE start=/^/
9175b8156aSBram Moolenaar    \ matchgroup=jDefineEnd end=/^\s*)\s*$/
9275b8156aSBram Moolenaar    \ contained
9375b8156aSBram Moolenaar" This match is necessary in case of an empty noun definition
9475b8156aSBram Moolenaarsyntax match jDefineEnd contained /^\s*)\s*$/
9575b8156aSBram Moolenaar
9675b8156aSBram Moolenaar" Explicit verb, adverb, and conjunction definition
9775b8156aSBram Moolenaarsyntax region jDefine
9875b8156aSBram Moolenaar    \ matchgroup=jDefineExpression start=/\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>/
9975b8156aSBram Moolenaar    \ matchgroup=jDefineEnd end=/^\s*)\s*$/
10075b8156aSBram Moolenaar    \ contains=jControl,@jStdlibItems,@jPrimitiveItems,jNumber,jString,jArgument,jParenGroup,jParen,jComment,jDefineMonadDyad
101822ff866SBram Moolenaar    \ fold
10275b8156aSBram Moolenaarsyntax match jDefineMonadDyad contained /^\s*:\s*$/
10375b8156aSBram Moolenaar
10475b8156aSBram Moolenaar" Paired parentheses. When a jDefineExpression such as "3 : 0" is
10575b8156aSBram Moolenaar" parenthesised it will erroneously extend jParenGroup to span over the whole
10675b8156aSBram Moolenaar" definition body. This situation receives a special treatment here.
10775b8156aSBram Moolenaarsyntax match jParen /(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*)\)\@=/
10875b8156aSBram Moolenaarsyntax match jParen contained /\%((\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*\)\@<=)/
10975b8156aSBram Moolenaarsyntax region jParenGroup
11075b8156aSBram Moolenaar    \ matchgroup=jParen start=/(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>\)\@!/
11175b8156aSBram Moolenaar    \ matchgroup=jParen end=/)/
11275b8156aSBram Moolenaar    \ oneline transparent
11375b8156aSBram Moolenaar
11475b8156aSBram Moolenaarsyntax keyword jTodo contained TODO FIXME XXX
11583caecf3SBram Moolenaarsyntax match jComment /\<NB\..*$/ contains=jTodo,@Spell
11675b8156aSBram Moolenaar
117a6878375SBram Moolenaarsyntax match jSharpBang /\%^#!.*$/
118baca7f70SBram Moolenaar
119a6878375SBram Moolenaarhighlight default link jControl           Statement
12075b8156aSBram Moolenaarhighlight default link jStdlibNoun        Identifier
12175b8156aSBram Moolenaarhighlight default link jStdlibAdverb      Function
12275b8156aSBram Moolenaarhighlight default link jStdlibConjunction Function
12375b8156aSBram Moolenaarhighlight default link jStdlibVerb        Function
124a6878375SBram Moolenaarhighlight default link jString            String
125a6878375SBram Moolenaarhighlight default link jNumber            Number
12675b8156aSBram Moolenaarhighlight default link jNoun              Constant
12775b8156aSBram Moolenaarhighlight default link jAdverb            Normal
12875b8156aSBram Moolenaarhighlight default link jConjunction       Normal
12975b8156aSBram Moolenaarhighlight default link jVerb              Normal
13075b8156aSBram Moolenaarhighlight default link jCopula            Normal
13175b8156aSBram Moolenaarhighlight default link jArgument          Identifier
13275b8156aSBram Moolenaarhighlight default link jParen             Delimiter
13375b8156aSBram Moolenaar
13475b8156aSBram Moolenaarhighlight default link jDefineExpression  Define
13575b8156aSBram Moolenaarhighlight default link jDefineMonadDyad   Delimiter
13675b8156aSBram Moolenaarhighlight default link jDefineEnd         Delimiter
13775b8156aSBram Moolenaarhighlight default link jNounDefine        Normal
13875b8156aSBram Moolenaar
139a6878375SBram Moolenaarhighlight default link jTodo              Todo
140a6878375SBram Moolenaarhighlight default link jComment           Comment
141a6878375SBram Moolenaarhighlight default link jSharpBang         PreProc
142baca7f70SBram Moolenaar
143a6878375SBram Moolenaarlet b:current_syntax = 'j'
14475b8156aSBram Moolenaar
14575b8156aSBram Moolenaarlet &cpo = s:save_cpo
14675b8156aSBram Moolenaarunlet s:save_cpo
147