I was looking for good syntax highlighting for J and was not really satisfied
with the editors that already have syntax support available for J. I like
jEdit,
and with a name like that it is a shame not to have syntax highlighting
available
for it - so I wrote my own. I am sharing it below for anyone to use. To use,
do the following:
1) Copy & paste it to a text file and name it j.xml.
2) Locate the "modes" directory in the jEdit file structure & copy the file to
it.
3) Edit the "catalog" file in the same directory and add this entry in the
appropriate place:
<MODE NAME="j" FILE="j.xml"
FILE_NAME_GLOB="*.{ijs,ijp}"/>
That should do it. Enjoy!
Ed Cox
Principal Data Analyst
Medmined
----copy text below into j.xml file-------------
<?xml version="1.0"?>
<!DOCTYPE MODE SYSTEM "xmode.dtd">
<!-- jEdit mode for Language: J (evolved from APL; see www.jsoftware.com)
by Ed Cox ([email protected])
If auto-indent behavior is not suitable for you, either modify the
applicable code
below, or turn off auto indent by changing the shortcut assigned for the
ENTER key
from "Insert new line and indent" to "Insert new line". Use the shortcuts
section
in the Global Options.
To use, save this j.xml file to the modes subdirectory for jEdit and then
add the
entry below to the catalog file (in the same directory). Follow the
pattern
of what is already there:
<MODE NAME="j" FILE="j.xml"
FILE_NAME_GLOB="*.{ijs,ijp}"/>
-->
<MODE>
<PROPS>
<PROPERTY NAME="lineComment" VALUE="NB."/>
<PROPERTY NAME="noTabs" VALUE="true"/>
<PROPERTY NAME="wrap" VALUE="NONE"/>
<PROPERTY NAME="folding" VALUE="indent"/>
<PROPERTY NAME="indentSize" VALUE="2"/>
<!-- Auto Indent -->
<PROPERTY NAME="indentNextLines"
VALUE="[a-zA-Z]\w*\s*=[\.:]\s*([0-4]|13)\s+:\s+0.*$|^\s*(select|try)\..*$|^.*\bdo\.\s*($|NB\..*$)"/>
<PROPERTY NAME="unindentNextLines"
VALUE="^\s*\)\s*($|NB.)|^\s*end\.\s*($|NB\..*$)|^\s*(elseif|f?case)\..*\bdo\.\s*($|NB\..*$)"/>
<PROPERTY NAME="unindentThisLine"
VALUE="^\s*\)\s*($|NB.)|^\s*end\.\s*($|NB\..*$)|^\s*(catch[dt]?|else|elseif|f?case)\..*($|NB\..*$)"/>
<PROPERTY NAME="electricKeys" VALUE=")."/>
<PROPERTY NAME="doubleBracketIndent" VALUE="false" />
<PROPERTY NAME="lineUpClosingBracket" VALUE="true" />
<!-- End Auto Indent -->
</PROPS>
<RULES IGNORE_CASE="FALSE">
<!-- Comments -->
<EOL_SPAN TYPE="COMMENT1" AT_LINE_START="FALSE"
AT_WORD_START="TRUE"
AT_WHITESPACE_END="FALSE">NB.</EOL_SPAN>
<!-- String Literals -->
<SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
<BEGIN>'</BEGIN>
<END>'</END>
</SPAN>
<!-- Copula -->
<SEQ_REGEXP TYPE="LABEL">=[\.:]</SEQ_REGEXP>
<!-- Show assignments as BOLD -->
<SEQ_REGEXP TYPE="OPERATOR"
AT_WORD_START="TRUE">[a-zA-Z]\w*(?=\s*=[\.:]\s*)</SEQ_REGEXP>
<!-- Highlight explict definitions -->
<SEQ_REGEXP TYPE="INVALID"
AT_WORD_START="TRUE">([0-4]|13)\s+:\s*(0|.*?($|(?=\s*\bNB\.)))</SEQ_REGEXP>
<!-- Control -->
<SEQ_REGEXP TYPE="KEYWORD1"
AT_WORD_START="TRUE">(assert|break|f?case|catch[dt]?|continue|do|else(if)?)\.</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD1"
AT_WORD_START="TRUE">(end|for|if|return|select|throw|try|whil(e|st))\.</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD1"
AT_WORD_START="TRUE">(for|goto|label)_[a-zA-Z]\w*\.</SEQ_REGEXP>
<!-- Keywords -->
<SEQ_REGEXP TYPE="MARKUP"
AT_WORD_START="TRUE">(require|loadd?|scriptd?|jpath|jcwdpath|jhostpath|jsystemdefs)</SEQ_REGEXP>
<SEQ_REGEXP TYPE="MARKUP"
AT_WORD_START="TRUE">co(class|create|current|destroy|erase|extend|fullname)</SEQ_REGEXP>
<SEQ_REGEXP TYPE="MARKUP"
AT_WORD_START="TRUE">co(insert|names?|new|nl|path|reset)</SEQ_REGEXP>
<SEQ_REGEXP TYPE="MARKUP"
AT_WORD_START="TRUE">(type|names|nameclass|nc|namelist|nl|erase|assert)</SEQ_REGEXP>
<SEQ_REGEXP TYPE="MARKUP"
AT_WORD_START="TRUE">(getenv|setenv|exit|stdout|stdin|stderr|define|def)</SEQ_REGEXP>
<!-- Constants -->
<SEQ_REGEXP TYPE="COMMENT2"
AT_WORD_START="TRUE">(CRLF|CR|LF|TAB|DEL|FF|noun|adverb|conjunction|verb|monad|dyad)\b</SEQ_REGEXP>
<!-- Name (>1 char) -->
<SEQ_REGEXP TYPE="NULL"
AT_WORD_START="TRUE">[a-zA-Z]\w+</SEQ_REGEXP>
<!-- Noun -->
<SEQ_REGEXP TYPE="LITERAL2">a[\.:]</SEQ_REGEXP>
<SEQ_REGEXP TYPE="LITERAL2">_\.</SEQ_REGEXP>
<!-- Conjunctions (2 char)-->
<SEQ_REGEXP TYPE="KEYWORD2">[!&@;:\.]\.</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD2">[!&@^\.:]:</SEQ_REGEXP>
<!-- Adverbs (2 char)-->
<SEQ_REGEXP TYPE="KEYWORD4">[/\\]\.</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD4">[bfMt]\.</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD4">t:</SEQ_REGEXP>
<!-- Verbs -->
<SEQ_REGEXP TYPE="COMMENT3">\{::</SEQ_REGEXP>
<SEQ_REGEXP TYPE="COMMENT3">p\.\.</SEQ_REGEXP>
<SEQ_REGEXP
TYPE="COMMENT3">[-\"#\$%\*+,<>\?^{|}~]\.</SEQ_REGEXP>
<SEQ_REGEXP
TYPE="COMMENT3">[-\"#\$%\*+,;<>\?\[{|}~/\\]:</SEQ_REGEXP>
<SEQ_REGEXP
TYPE="COMMENT3">[-!#$%\*+,;<=>\?\[\]^{|]</SEQ_REGEXP>
<SEQ_REGEXP TYPE="COMMENT3">(_?\d|_):</SEQ_REGEXP>
<SEQ_REGEXP TYPE="COMMENT3">[AcCeEiIjLopr]\.</SEQ_REGEXP>
<SEQ_REGEXP TYPE="COMMENT3">[ipqsux]:</SEQ_REGEXP>
<!-- Conjunctions -->
<SEQ_REGEXP TYPE="KEYWORD2">&\.:</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD2">[dDHT]\.</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD2">[DLS]:</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD2">[\"&@`]</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD2">:</SEQ_REGEXP>
<SEQ_REGEXP TYPE="KEYWORD2">\.</SEQ_REGEXP>
<!-- Adverbs ( char)-->
<SEQ_REGEXP TYPE="KEYWORD4">[/\\}~]</SEQ_REGEXP>
<!-- Argument -->
<SEQ_REGEXP TYPE="KEYWORD3"
AT_WORD_START="TRUE">[xymnuv]\.?\b</SEQ_REGEXP>
<!-- Number -->
<SEQ_REGEXP TYPE="DIGIT"
AT_WORD_START="TRUE">[_0-9][_0-9\.a-zA-Z]*</SEQ_REGEXP>
<!-- Parenthesis -->
<SEQ_REGEXP TYPE="INVALID">[()]</SEQ_REGEXP>
<!-- Name (1 char) -->
<SEQ_REGEXP TYPE="OPERATOR"
AT_WORD_START="TRUE">([A-Z]|[abcdefghijklopqrstwz])</SEQ_REGEXP>
</RULES>
</MODE>
<!-- Put the following in an ijs file to test the syntax highlighting.
jVerb
= < <. <: > >. >: _: + +. +: * *. *: - -. -: % %. %: ^ ^. $ $. $: ~. ~: | |. |:
, ,. ,: ; ;: # #. #: ! /: \: [ [: ] { {. {: {:: }. }: ". ": ? ?.
A. c. C. e. E. i. i: I. j. L. o. p. p: q: r. s: u: x:
_9: _8: _7: _6: _5: _4: _3: _2: _1: 0: 1: 2: 3: 4: 5: 6: 7: 8: 9:
jNoun
a. a: _.
jKeywords
require load loadd script scriptd jpath jcwdpath jhostpath jsystemdefs
coclass cocreate cocurrent codestroy coerase coextend cofullname
coinsert coname conames conew conl copath coreset
type names nameclass nc namelist nl erase assert
getenv setenv exit stdout stdin stderr def define
jConstants
CRLF CR LF TAB DEL FF noun adverb conjunction verb monad dyad
jConjuction
^: . .. .: : :. :: ;. !. !: " ` `: @ @. @: & &. &: &.: d. D. D: H. L: S: T.
jAdverb
~ / \ /. \. } b. f. M. t. t:
jArguments
x y m n u v x. y. m. n. u. v.
jKeywords
assert. break. case. catch. catchd. catcht. continue. do. else. elseif. end.
fcase.
for. for_xyz. goto_abc. if. label_abc. return. select. throw. try. while.
whilst.
Parenthesis
( )
jComment
NB. This is a comment.
jLiteral
'This is quoted text'
jNumbers
123 56.88 _99.9 7e6 _ __ 200j_200 2b111.111 1r2
jAssignment
xyz=. abc=:
jExplicit Definition
0 : 0 1 : 0 2 : 0 3 : 0 4 : 0
4 : 'x + y'
-->
----stop copy at the line above----------------
_________________________________________________
This message is for the designated recipient only and may contain privileged,
proprietary
or otherwise private information. If you have received it in error, please
notify the sender
immediately and delete the original. Any other use of the email by you is
prohibited.
Dansk - Deutsch - Espanol - Francais - Italiano - Japanese - Nederlands - Norsk
- Portuguese
Svenska: www.carefusion.com/legal/email
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm