From ef1a1e6bd37a53be3bd9496b383377ad304e3fef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Ros=C3=A9n?= Date: Mon, 15 May 2017 21:45:05 +0200 Subject: [PATCH] Improve Haskell highlighter Import keywords are put in keyword face instead of meta face. This leaves room for pragmas and macros to be in the meta face. Operator keywords are put in keyword face too. Finally, expression keywords are put in face attribute. --- rc/base/haskell.kak | 58 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/rc/base/haskell.kak b/rc/base/haskell.kak index 666dc344..84ff0460 100644 --- a/rc/base/haskell.kak +++ b/rc/base/haskell.kak @@ -12,19 +12,61 @@ hook global BufCreate .*[.](hs) %{ # ‾‾‾‾‾‾‾‾‾‾‾‾ add-highlighter -group / regions -default code haskell \ - string %{(?]) $ '' \ - comment \{- -\} \{- \ - macro ^\h*?\K# (??@\\\^|~=]) $ '' add-highlighter -group /haskell/string fill string add-highlighter -group /haskell/comment fill comment +add-highlighter -group /haskell/pragma fill meta add-highlighter -group /haskell/macro fill meta -add-highlighter -group /haskell/code regex \b(import)\b 0:meta -add-highlighter -group /haskell/code regex \b(True|False)\b 0:value -add-highlighter -group /haskell/code regex \b(as|case|class|data|default|deriving|do|else|hiding|if|in|infix|infixl|infixr|instance|let|module|newtype|of|qualified|then|type|where)\b 0:keyword -add-highlighter -group /haskell/code regex \b(Int|Integer|Char|Bool|Float|Double|IO|Void|Addr|Array|String)\b 0:type +# Use (?" +# Quantifier separator in "forall a . [a] -> [a]" +# Enum comprehensions like "[1..]" and "[a..b]" (making ".." and "Module..." illegal) + +# matches uppercase identifiers: Monad Control.Monad +# not non-space separated dot: Just.const +add-highlighter -group /haskell/code regex \b(\u['\w]*\.)*\u['\w]*(?!['\w])(?![.\l]) 0:variable + +# matches infix identifier: `mod` `Apa._T'M` +add-highlighter -group /haskell/code regex `\b(\u['\w]*\.)*[\w]['\w]*` 0:operator +# matches imported operators: M.! M.. Control.Monad.>> +# not operator keywords: M... M.-> +add-highlighter -group /haskell/code regex \b\u['\w]*\.(?!([~=|:@\\]|<-|->|=>|\.\.|::)[^~<=>|:!?/.@$*&#%+\^\-\\])[~<=>|:!?/.@$*&#%+\^\-\\]+ 0:operator +# matches dot: . +# not possibly incomplete import: a. +# not other operators: !. .! +add-highlighter -group /haskell/code regex (?|:!?/.@$*&#%+\^\-\\])\.(?![~<=>|:!?/.@$*&#%+\^\-\\]) 0:operator +# matches other operators: ... > < <= ^ <*> <$> etc +# not dot: . +# not operator keywords: @ .. -> :: ~ +add-highlighter -group /haskell/code regex (?|:!?/.@$*&#%+\^\-\\])(?!([~=|:.@\\]|<-|->|=>|\.\.|::)[^~<=>|:!?/.@$*&#%+\^\-\\])[~<=>|:!?/.@$*&#%+\^\-\\]+ 0:operator + +# matches operator keywords: @ -> +add-highlighter -group /haskell/code regex (?|:!?/.@$*&#%+\^\-\\])(@|~|<-|->|=>|::|=|:|[|])(?![~<=>|:!?/.@$*&#%+\^\-\\]) 1:keyword +# matches: forall [..variables..] . +# not the variables +add-highlighter -group /haskell/code regex \b(forall)\b[^.\n]*?(\.) 1:keyword 2:keyword + +# matches 'x' '\\' '\'' '\n' '\0' +# not incomplete literals: '\' +# not valid identifiers: w' _' +add-highlighter -group /haskell/code regex (?