codekingpro/portable-devtools
114k
1" Vim syntax file2" Language: J3" Maintainer: David Bürgin <dbuergin@gluet.ch>4" URL: https://gitlab.com/glts/vim-j5" Last Change: 2019-11-126 7if exists('b:current_syntax')8 finish9endif10 11let s:save_cpo = &cpo12set cpo&vim13 14syntax case match15syntax sync minlines=10016 17syntax cluster jStdlibItems contains=jStdlibNoun,jStdlibAdverb,jStdlibConjunction,jStdlibVerb18syntax cluster jPrimitiveItems contains=jNoun,jAdverb,jConjunction,jVerb,jCopula19 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 jControl25" and jDefineExpression items.26syntax 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 libjqt27syntax keyword jStdlibAdverb define each every fapplylines inv inverse items leaf rows rxapply rxmerge table28syntax keyword jStdlibConjunction bind cuts def on29syntax 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 xedit30syntax 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 done34" with regular expressions alone. Below is a sketch of the pattern used. It35" 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 n63 64" Primitives. Order is significant both within the patterns and among65" ":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 can74" occur in the middle of a line but the jNounDefine region must only start on75" the next line. The trick is to split the problem into two regions and link76" them with "nextgroup=". The fold wrapper provides syntax folding.77syntax region jNounDefineFold78 \ matchgroup=NONE start=/\%(\%(\%(^\s*Note\)\|\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>\)\@=/79 \ keepend matchgroup=NONE end=/^\s*)\s*$/80 \ contains=jNounDefineStart81 \ fold82syntax region jNounDefineStart83 \ 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,jComment86 \ contained oneline skipempty nextgroup=jDefineEnd,jNounDefine87" These two items must have "contained", which allows them to match only after88" jNounDefineStart thanks to the "nextgroup=" above.89syntax region jNounDefine90 \ matchgroup=NONE start=/^/91 \ matchgroup=jDefineEnd end=/^\s*)\s*$/92 \ contained93" This match is necessary in case of an empty noun definition94syntax match jDefineEnd contained /^\s*)\s*$/95 96" Explicit verb, adverb, and conjunction definition97syntax region jDefine98 \ 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,jDefineMonadDyad101 \ fold102syntax match jDefineMonadDyad contained /^\s*:\s*$/103 104" Paired parentheses. When a jDefineExpression such as "3 : 0" is105" parenthesised it will erroneously extend jParenGroup to span over the whole106" 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 jParenGroup110 \ 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 transparent113 114syntax keyword jTodo contained TODO FIXME XXX115syntax match jComment /\<NB\..*$/ contains=jTodo,@Spell116 117syntax match jSharpBang /\%^#!.*$/118 119highlight default link jControl Statement120highlight default link jStdlibNoun Identifier121highlight default link jStdlibAdverb Function122highlight default link jStdlibConjunction Function123highlight default link jStdlibVerb Function124highlight default link jString String125highlight default link jNumber Number126highlight default link jNoun Constant127highlight default link jAdverb Normal128highlight default link jConjunction Normal129highlight default link jVerb Normal130highlight default link jCopula Normal131highlight default link jArgument Identifier132highlight default link jParen Delimiter133 134highlight default link jDefineExpression Define135highlight default link jDefineMonadDyad Delimiter136highlight default link jDefineEnd Delimiter137highlight default link jNounDefine Normal138 139highlight default link jTodo Todo140highlight default link jComment Comment141highlight default link jSharpBang PreProc142 143let b:current_syntax = 'j'144 145let &cpo = s:save_cpo146unlet s:save_cpo147 