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: 2014-05-25 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=50 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 andurl dbhelp libjqt 27syntax keyword jStdlibAdverb define each every fapplylines inv inverse items leaf rows table 28syntax keyword jStdlibConjunction bind cuts def on 29syntax keyword jStdlibVerb AND Endian IFDEF Note OR XOR alpha17 alpha27 anddf android_exec_host andunzip apply boxopen boxxopen bx calendar cd cdcb cder cderx cdf charsub chopstring clear coclass cocreate cocurrent codestroy coerase cofind cofindv cofullname coinfo coinsert 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 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 getargs getdate getenv getqtbin hfd hostpathsep ic install iospath isatty isotimestamp isutf8 jcwdpath joinstring jpathsep jsystemdefs list ljust load loadd mema memf memr memw nameclass namelist names nc nl pick quote require rjust rplc script scriptd setbreak show sign sminfo smoutput sort split splitnostring splitstring ss startupandroid startupconsole startupide stderr stdin stdout stringreplace symdat symget symset 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 30syntax match jStdlibNoun /\<\%(adverb\|conjunction\|dyad\|monad\|noun\|verb\)\>/ 31syntax match jStdlibVerb /\<\%(assert\|break\|do\)\>\.\@!/ 32 33" Numbers. Matching J numbers is difficult. The regular expression used for 34" the general case roughly embodies this grammar sketch: 35" 36" BASE := /_?\d+(\.\d*)?([eE]_?\d+)?/ 37" RATIONAL := BASE | BASE r BASE 38" COMPLEX := BASE | BASE (j|a[dr]) BASE 39" JNUMBER := RATIONAL | RATIONAL [px] RATIONAL | COMPLEX | COMPLEX [px] COMPLEX 40" 41" The grammar is implemented as shown in this pseudo-regexp: 42" 43" base rational complex remainder 44" /\< B ( [r]B ([px]B([r]B)?)? | (j|a[dr])B ([px]B((j|a[dr])B)?)? | [px]B ((j|a[dr]|r)B)? )?/ 45" 46" All in all, a compromise between correctness and practicality had to be 47" made. See http://www.jsoftware.com/help/dictionary/dcons.htm for reference. 48syntax match jNumber /\<_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(\%(r_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%([px]_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(r_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\)\=\)\=\)\|\%(\%(j\|a[dr]\)_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%([px]_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(\%(j\|a[dr]\)_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\)\=\)\=\)\|\%([px]_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(\%(j\|a[dr]\|r\)_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\)\=\)\)\=/ 49syntax match jNumber /\<_\=\d\+\%([eE]\d\+\)\=b_\=[0-9a-z]\+\%(\.[0-9a-z]\+\)\=/ 50syntax match jNumber /\<__\=\>/ 51syntax match jNumber /\<_\./ 52syntax match jNumber /\<_\=\d\+x\>/ 53 54syntax region jString oneline start=/'/ skip=/''/ end=/'/ 55 56syntax keyword jArgument contained x y u v m n 57 58" Primitives. Order is significant both within the patterns and among 59" ":syntax match" statements. Refer to "Parts of speech" in the J dictionary. 60syntax match jNoun /\<a[.:]/ 61syntax match jAdverb /[}~]\|[/\\]\.\=\|\<\%([Mbft]\.\|t:\)/ 62syntax match jConjunction /"\|`:\=\|[.:@&][.:]\=\|&\.:\|\<\%([dDHT]\.\|[DLS]:\)/ 63syntax match jVerb /[=!\]]\|[\^?]\.\=\|[;[]:\=\|{\.\|[_/\\]:\|[<>+*\-%$|,#][.:]\=\|[~}"][.:]\|{\%[::]\|\<\%([ACeEiIjLor]\.\|p\.\.\=\|[ipqsux]:\|0:\|_\=[1-9]:\)/ 64syntax match jCopula /=[.:]/ 65syntax match jConjunction /;\.\|\^:\|![.:]/ 66 67" Explicit noun definition. The difficulty is that the define expression can 68" occur in the middle of a line but the jNounDefine region must only start on 69" the next line. The trick is to split the problem into two regions and link 70" them with "nextgroup=". The fold wrapper provides syntax folding. 71syntax region jNounDefineFold 72 \ matchgroup=NONE start=/\<\%(\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\>\)\@=/ 73 \ keepend matchgroup=NONE end=/^\s*)\s*$/ 74 \ contains=jNounDefineStart 75 \ fold 76syntax region jNounDefineStart 77 \ matchgroup=jDefineExpression start=/\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\>/ 78 \ keepend matchgroup=NONE end=/$/ 79 \ contains=@jStdlibItems,@jPrimitiveItems,jNumber,jString,jParenGroup,jParen,jComment 80 \ contained oneline skipempty nextgroup=jDefineEnd,jNounDefine 81" These two items must have "contained", which allows them to match only after 82" jNounDefineStart thanks to the "nextgroup=" above. 83syntax region jNounDefine 84 \ matchgroup=NONE start=/^/ 85 \ matchgroup=jDefineEnd end=/^\s*)\s*$/ 86 \ contained 87" This match is necessary in case of an empty noun definition 88syntax match jDefineEnd contained /^\s*)\s*$/ 89 90" Explicit verb, adverb, and conjunction definition 91syntax region jDefine 92 \ matchgroup=jDefineExpression start=/\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>/ 93 \ matchgroup=jDefineEnd end=/^\s*)\s*$/ 94 \ contains=jControl,@jStdlibItems,@jPrimitiveItems,jNumber,jString,jArgument,jParenGroup,jParen,jComment,jDefineMonadDyad 95 \ fold 96syntax match jDefineMonadDyad contained /^\s*:\s*$/ 97 98" Paired parentheses. When a jDefineExpression such as "3 : 0" is 99" parenthesised it will erroneously extend jParenGroup to span over the whole 100" definition body. This situation receives a special treatment here. 101syntax match jParen /(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*)\)\@=/ 102syntax match jParen contained /\%((\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*\)\@<=)/ 103syntax region jParenGroup 104 \ matchgroup=jParen start=/(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>\)\@!/ 105 \ matchgroup=jParen end=/)/ 106 \ oneline transparent 107 108syntax keyword jTodo contained TODO FIXME XXX 109syntax match jComment /NB\..*$/ contains=jTodo,@Spell 110 111syntax match jSharpBang /\%^#!.*$/ 112 113highlight default link jControl Statement 114highlight default link jStdlibNoun Identifier 115highlight default link jStdlibAdverb Function 116highlight default link jStdlibConjunction Function 117highlight default link jStdlibVerb Function 118highlight default link jString String 119highlight default link jNumber Number 120highlight default link jNoun Constant 121highlight default link jAdverb Normal 122highlight default link jConjunction Normal 123highlight default link jVerb Normal 124highlight default link jCopula Normal 125highlight default link jArgument Identifier 126highlight default link jParen Delimiter 127 128highlight default link jDefineExpression Define 129highlight default link jDefineMonadDyad Delimiter 130highlight default link jDefineEnd Delimiter 131highlight default link jNounDefine Normal 132 133highlight default link jTodo Todo 134highlight default link jComment Comment 135highlight default link jSharpBang PreProc 136 137let b:current_syntax = 'j' 138 139let &cpo = s:save_cpo 140unlet s:save_cpo 141