Dear all,

I've just finished implementing a complete rewrite of the Haskell and
Literate Haskell files for Kate. This improves the previous version in
many ways:

* Operators are now supported (++, !, >>=, and any other combination
of legal operator characters)
* Special symbols are recognised (=>, <-, ->, ::, ..)
* Unicode support for  →, ←, ∷, ‥,⇒, ∀, ∃
* Support for qualified module functions (List.sort, etc)
* Support for qualified module types
* Refactored Literate Haskell using IncludeRules
* Support for literate code (using > and \begin{code} \end{code})
* Support for literate specifications (using < and \begin{spec} \end{spec})

You can find the most recent snapshot in my github repository [1], and
examples of highlighted syntax using these files at my website [2].

Please let me know if there are any further improvements you can think of,

Nick

[1] http://github.com/zenzike/kate-haskell
[2] http://zenzike.com
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<language name="Haskell" version="2.0.2" kateversion="2.3" section="Sources" extensions="*.hs" mimetype="text/x-haskell" author="Nicolas Wu ([email protected])" license="LGPL" indenter="haskell">
  <highlighting>
  <list name="keywords">
    <item> as </item>
    <item> case </item>
    <item> class </item>
    <item> data </item>
    <item> deriving </item>
    <item> do </item>
    <item> else </item>
    <item> hiding </item>
    <item> if </item>
    <item> import </item>
    <item> in </item>
    <item> infixl </item>
    <item> infixr </item>
    <item> instance </item>
    <item> let </item>
    <item> module </item>
    <item> newtype </item>
    <item> of </item>
    <item> primitive </item>
    <item> qualified </item>
    <item> then </item>
    <item> type </item>
    <item> where </item>
  </list>
  <list name="prelude function">
    <item> FilePath </item>
    <item> IOError </item>
    <item> abs </item>
    <item> acos </item>
    <item> acosh </item>
    <item> all </item>
    <item> and </item>
    <item> any </item>
    <item> appendFile </item>
    <item> approxRational </item>
    <item> asTypeOf </item>
    <item> asin </item>
    <item> asinh </item>
    <item> atan </item>
    <item> atan2 </item>
    <item> atanh </item>
    <item> basicIORun </item>
    <item> break </item>
    <item> catch </item>
    <item> ceiling </item>
    <item> chr </item>
    <item> compare </item>
    <item> concat </item>
    <item> concatMap </item>
    <item> const </item>
    <item> cos </item>
    <item> cosh </item>
    <item> curry </item>
    <item> cycle </item>
    <item> decodeFloat </item>
    <item> denominator </item>
    <item> digitToInt </item>
    <item> div </item>
    <item> divMod </item>
    <item> drop </item>
    <item> dropWhile </item>
    <item> either </item>
    <item> elem </item>
    <item> encodeFloat </item>
    <item> enumFrom </item>
    <item> enumFromThen </item>
    <item> enumFromThenTo </item>
    <item> enumFromTo </item>
    <item> error </item>
    <item> even </item>
    <item> exp </item>
    <item> exponent </item>
    <item> fail </item>
    <item> filter </item>
    <item> flip </item>
    <item> floatDigits </item>
    <item> floatRadix </item>
    <item> floatRange </item>
    <item> floor </item>
    <item> fmap </item>
    <item> foldl </item>
    <item> foldl1 </item>
    <item> foldr </item>
    <item> foldr1 </item>
    <item> fromDouble </item>
    <item> fromEnum </item>
    <item> fromInt </item>
    <item> fromInteger </item>
    <item> fromIntegral </item>
    <item> fromRational </item>
    <item> fst </item>
    <item> gcd </item>
    <item> getChar </item>
    <item> getContents </item>
    <item> getLine </item>
    <item> group </item>
    <item> head </item>
    <item> id </item>
    <item> inRange </item>
    <item> index </item>
    <item> init </item>
    <item> intToDigit </item>
    <item> interact </item>
    <item> ioError </item>
    <item> isAlpha </item>
    <item> isAlphaNum </item>
    <item> isAscii </item>
    <item> isControl </item>
    <item> isDenormalized </item>
    <item> isDigit </item>
    <item> isHexDigit </item>
    <item> isIEEE </item>
    <item> isInfinite </item>
    <item> isLower </item>
    <item> isNaN </item>
    <item> isNegativeZero </item>
    <item> isOctDigit </item>
    <item> isPrint </item>
    <item> isSpace </item>
    <item> isUpper </item>
    <item> iterate </item>
    <item> last </item>
    <item> lcm </item>
    <item> length </item>
    <item> lex </item>
    <item> lexDigits </item>
    <item> lexLitChar </item>
    <item> lines </item>
    <item> log </item>
    <item> logBase </item>
    <item> lookup </item>
    <item> map </item>
    <item> mapM </item>
    <item> mapM_ </item>
    <item> max </item>
    <item> maxBound </item>
    <item> maximum </item>
    <item> maybe </item>
    <item> min </item>
    <item> minBound </item>
    <item> minimum </item>
    <item> mod </item>
    <item> negate </item>
    <item> not </item>
    <item> notElem </item>
    <item> null </item>
    <item> numerator </item>
    <item> odd </item>
    <item> or </item>
    <item> ord </item>
    <item> otherwise </item>
    <item> pack </item>
    <item> pi </item>
    <item> pred </item>
    <item> primExitWith </item>
    <item> print </item>
    <item> product </item>
    <item> properFraction </item>
    <item> putChar </item>
    <item> putStr </item>
    <item> putStrLn </item>
    <item> quot </item>
    <item> quotRem </item>
    <item> range </item>
    <item> rangeSize </item>
    <item> read </item>
    <item> readDec </item>
    <item> readFile </item>
    <item> readFloat </item>
    <item> readHex </item>
    <item> readIO </item>
    <item> readInt </item>
    <item> readList </item>
    <item> readLitChar </item>
    <item> readLn </item>
    <item> readOct </item>
    <item> readParen </item>
    <item> readSigned </item>
    <item> reads </item>
    <item> readsPrec </item>
    <item> realToFrac </item>
    <item> recip </item>
    <item> rem </item>
    <item> repeat </item>
    <item> replicate </item>
    <item> return </item>
    <item> reverse </item>
    <item> round </item>
    <item> scaleFloat </item>
    <item> scanl </item>
    <item> scanl1 </item>
    <item> scanr </item>
    <item> scanr1 </item>
    <item> seq </item>
    <item> sequence </item>
    <item> sequence_ </item>
    <item> show </item>
    <item> showChar </item>
    <item> showInt </item>
    <item> showList </item>
    <item> showLitChar </item>
    <item> showParen </item>
    <item> showSigned </item>
    <item> showString </item>
    <item> shows </item>
    <item> showsPrec </item>
    <item> significand </item>
    <item> signum </item>
    <item> sin </item>
    <item> sinh </item>
    <item> snd </item>
    <item> sort </item>
    <item> span </item>
    <item> splitAt </item>
    <item> sqrt </item>
    <item> subtract </item>
    <item> succ </item>
    <item> sum </item>
    <item> tail </item>
    <item> take </item>
    <item> takeWhile </item>
    <item> tan </item>
    <item> tanh </item>
    <item> threadToIOResult </item>
    <item> toEnum </item>
    <item> toInt </item>
    <item> toInteger </item>
    <item> toLower </item>
    <item> toRational </item>
    <item> toUpper </item>
    <item> truncate </item>
    <item> uncurry </item>
    <item> undefined </item>
    <item> unlines </item>
    <item> until </item>
    <item> unwords </item>
    <item> unzip </item>
    <item> unzip3 </item>
    <item> userError </item>
    <item> words </item>
    <item> writeFile </item>
    <item> zip </item>
    <item> zip3 </item>
    <item> zipWith </item>
    <item> zipWith3 </item>
  </list>
  <list name="prelude class">
    <item> Bounded </item>
    <item> Enum </item>
    <item> Eq </item>
    <item> Floating </item>
    <item> Fractional </item>
    <item> Functor </item>
    <item> Integral </item>
    <item> Ix </item>
    <item> Monad </item>
    <item> Num </item>
    <item> Ord </item>
    <item> Read </item>
    <item> Real </item>
    <item> RealFloat </item>
    <item> RealFrac </item>
    <item> Show </item>
  </list>
  <list name="prelude type">
    <item> Bool </item>
    <item> Char </item>
    <item> Double </item>
    <item> Either </item>
    <item> FilePath </item>
    <item> Float </item>
    <item> Int </item>
    <item> Integer </item>
    <item> IO </item>
    <item> IOError </item>
    <item> Maybe </item>
    <item> Ordering </item>
    <item> Ratio </item>
    <item> Rational </item>
    <item> ReadS </item>
    <item> ShowS </item>
    <item> String </item>
    <item> ByteString </item>
  </list>
  <list name="prelude data">
    <item> False </item>
    <item> True </item>
    <item> Left </item>
    <item> Right </item>
    <item> Just </item>
    <item> Nothing </item>
    <item> EQ </item>
    <item> LT </item>
    <item> GT </item>
  </list>
  <contexts>
    <context attribute="Normal" lineEndContext="#stay" name="code">
      <RegExpr attribute="Comment" context="comments" String="\{-[^#]?" />
      <RegExpr attribute="Comment" context="comment"  String="--[^\-!#\$%&amp;\*\+/&lt;=&gt;\?&#92;@\^\|~\.:].*$" />
      <RegExpr attribute="Pragma"  context="#stay" String="\{-#.*#-\}"/>

      <keyword attribute="Keyword"          context="#stay" String="keywords" />
      <keyword attribute="Type Prelude"     context="#stay" String="prelude type" />
      <keyword attribute="Function Prelude" context="#stay" String="prelude function" />
      <keyword attribute="Data Prelude"     context="#stay" String="prelude data" />
      <keyword attribute="Class Prelude"    context="#stay" String="prelude class" />

      <RegExpr attribute="Signature"        context="#stay" String="\s*[a-z][a-zA-Z0-9_']*\s*(?=::[^\-!#\$%&amp;\*\+/&lt;=&gt;\?&#92;@\^\|~\.:])" />
      <RegExpr attribute="Signature"        context="#stay" String="\s*(\([\-!#\$%&amp;\*\+/&lt;=&gt;\?&#92;@\^\|~\.:]*\))*\s*(?=::[^\-!#\$%&amp;\*\+/&lt;=&gt;\?&#92;@\^\|~\.:])" />
      <RegExpr attribute="Type"             context="#stay" String="([A-Z][a-zA-Z0-9_']*\.)*[A-Z][a-zA-Z0-9_']*" />
      <RegExpr attribute="Function"         context="#stay" String="([A-Z][a-zA-Z0-9_']*\.)*[a-z][a-zA-Z0-9_']*" />
      <RegExpr attribute="Special"          context="#stay" String="(::|=&gt;|\-&gt;|&lt;\-|→|←|∷|‥|⇒|∀|∃)" />
      <RegExpr attribute="Operator"         context="#stay" String="([A-Z][a-zA-Z0-0_']*\.)*[\-!#\$%&amp;\*\+/&lt;=&gt;\?&#92;@\^\|~\.:]+" />

      <Int        attribute="Decimal" context="#stay" />
      <RegExpr    attribute="Float"   context="#stay" String="\d+\.\d+" />
      <DetectChar attribute="Char"    context="char" char="'" />
      <DetectChar attribute="String"  context="string" char="&quot;" />

      <DetectChar attribute="Function Infix" context="infix" char="`"/>
      <Detect2Chars attribute="EnumFromTo" context="#stay" char ="." char1="." />
    </context>
    <context attribute="Comment" lineEndContext="#pop" name="comment" />
    <context attribute="Comment" lineEndContext="#stay" name="comments">
      <Detect2Chars attribute="Comment" context="#pop" char="-" char1="}" />
    </context>
    <context attribute="Char" lineEndContext="#pop" name="char">
      <RegExpr attribute="Char" context="#stay" String="\\." />
      <DetectChar attribute="Char" context="#pop" char="'" />
    </context>
    <context attribute="String" lineEndContext="#stay" name="string">
      <RegExpr attribute="String" context="#stay" String="\\." />
      <DetectChar attribute="String" context="#pop" char="&quot;" />
    </context>
    <context attribute="Function Infix" lineEndContext="#stay" name="infix">
      <DetectChar attribute="Function Infix" context="#pop" char="`"/>
    </context>
  </contexts>
  <itemDatas>
    <itemData name="Normal"           defStyleNum="dsNormal"   spellChecking="false" />
    <itemData name="Comment"          defStyleNum="dsComment" />
    <itemData name="Pragma"           defStyleNum="dsOthers"   spellChecking="false" />

    <itemData name="Keyword"          defStyleNum="dsKeyword"  spellChecking="false" />
    <itemData name="Type Prelude"     defStyleNum="dsDataType" spellChecking="false" />
    <itemData name="Function Prelude" defStyleNum="dsFunction" spellChecking="false" />
    <itemData name="Data Prelude"     defStyleNum="dsKeyword"  spellChecking="false" />
    <itemData name="Class Prelude"    defStyleNum="dsKeyword"  spellChecking="false" />

    <itemDate name="Signature"        defStyleNum="dsSpecial"  spellChecking="false" />
    <itemData name="Type"             defStyleNum="dsDataType" spellChecking="false" />
    <itemData name="Function"         defStyleNum="dsNormal"   spellChecking="false" />
    <itemData name="Special"          defStyleNum="dsSpecial"  spellChecking="false" />
    <itemData name="Operator"         defStyleNum="dsFunction" spellChecking="false" />

    <itemData name="Decimal"          defStyleNum="dsDecVal"   spellChecking="false" />
    <itemData name="Float"            defStyleNum="dsFloat"    spellChecking="false" />
    <itemData name="Char"             defStyleNum="dsChar"     spellChecking="false" />
    <itemData name="String"           defStyleNum="dsString" />

    <itemData name="Function Infix"   defStyleNum="dsOthers"   spellChecking="false" />
    <itemData name="EnumFromTo"       defStyleNum="dsOthers"   spellChecking="false" />
  </itemDatas>
  </highlighting>
  <general>
    <folding indentationsensitive="1"/>
    <comments>
      <comment name="singleLine" start="--" />
      <comment name="multiLine" start="{-" end="-}" />
    </comments>
    <keywords casesensitive="1" />
</general>
</language>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<language name="Literate Haskell" version="2.0.1" kateversion="2.3" section="Sources" extensions="*.lhs" mimetype="text/x-haskell" author="Nicolas Wu ([email protected])" license="LGPL" indenter="haskell">
  <highlighting>
  <contexts>
    <context attribute="Text" lineEndContext="#stay" name="text">
      <DetectChar attribute="BirdTrack" context="normal" char="&gt;" column="0"/>
      <DetectChar attribute="BirdTrack" context="normal" char="&lt;" column="0"/>
      <StringDetect attribute="Text" context="normals" String="&#92;begin&#123;code&#125;"/>
      <StringDetect attribute="Text" context="normals" String="&#92;begin&#123;spec&#125;"/>
    </context>
    <context attribute="Normal" lineEndContext="#pop" name="normal">
      <RegExpr attribute="Comment" context="comments'" String="\{-[^#]" />
      <IncludeRules context="##Haskell" />
    </context>
    <context attribute="Normal" lineEndContext="#stay" name="normals">
      <StringDetect attribute="Normal" context="#pop" String="&#92;end&#123;code&#125;"/>
      <StringDetect attribute="Normal" context="#pop" String="&#92;end&#123;spec&#125;"/>
      <IncludeRules context="##Haskell" />
    </context>
    <context attribute="Comment" lineEndContext="uncomments" name="comments'" >
      <Detect2Chars attribute="Comment" context="#pop" char="-" char1="}" />
    </context>
    <context attribute="Text" lineEndContext="#stay" name="uncomments">
      <DetectChar attribute="BirdTrack" context="recomments" char="&gt;" column="0"/>
      <DetectChar attribute="BirdTrack" context="recomments" char="&lt;" column="0"/>
    </context>
    <context attribute="Comment" lineEndContext="#pop" name="recomments">
      <Detect2Chars attribute="Comment" context="#pop#pop#pop" char="-" char1="}" />
    </context>
  </contexts>
  <itemDatas>
    <itemData name="Text"             defStyleNum="dsNormal" spellChecking="true" />
    <itemData name="BirdTrack"        defStyleNum="dsSpecial"  spellChecking="false" />
    <itemData name="Comment"          defStyleNum="dsComment" />
  </itemDatas>
  </highlighting>
</language>
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to