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