From ecc49e209bfb20d07ac946f302bd2f23414ad856 Mon Sep 17 00:00:00 2001 From: Alex Leferry 2 Date: Mon, 21 Jul 2014 00:19:52 +0200 Subject: [PATCH] add rc/haskell.kak --- rc/cabal.kak | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ rc/haskell.kak | 75 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 rc/cabal.kak create mode 100644 rc/haskell.kak diff --git a/rc/cabal.kak b/rc/cabal.kak new file mode 100644 index 00000000..c280e4e8 --- /dev/null +++ b/rc/cabal.kak @@ -0,0 +1,82 @@ +# http://haskell.org/cabal +# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +# Detection +# ‾‾‾‾‾‾‾‾‾ + +hook global BufSetOption mimetype=text/x-cabal %{ + set buffer filetype cabal +} + +hook global BufCreate .*[.](cabal) %{ + set buffer filetype cabal +} + +# Highlighters +# ‾‾‾‾‾‾‾‾‾‾‾‾ + +addhl -group / regions -default code cabal \ + comment (--) $ '' \ + comment \{- -\} \{- + +addhl -group /cabal/comment fill comment + +addhl -group /cabal/code regex \<(true|false)\>|(([<>]?=?)?\d+(\.\d+)+) 0:value +addhl -group /cabal/code regex \<(if|else)\> 0:keyword +addhl -group /cabal/code regex ^\h*([A-Za-z][A-Za-z0-9_-]*)\h*: 1:identifier + +# Commands +# ‾‾‾‾‾‾‾‾ + +def -hidden _cabal_filter_around_selections %{ + eval -draft -itersel %{ + exec + # remove trailing white spaces + try %{ exec -draft s \h+$ d } + } +} + +def -hidden _cabal_indent_on_new_line %[ + eval -draft -itersel %[ + # preserve previous line indent + try %[ exec -draft K ] + # filter previous line + try %[ exec -draft k : _cabal_filter_around_selections ] + # copy '#' comment prefix and following white spaces + try %[ exec -draft k x s ^\h*\K#\h* y j p ] + # indent after lines ending with { or : + try %[ exec -draft k x [:{]$ j ] + ] +] + +def -hidden _cabal_indent_on_opening_curly_brace %[ + eval -draft -itersel %[ + # align indent with opening paren when { is entered on a new line after the closing paren + try %[ exec -draft h ) M \`\(.*\)\h*\n\h*\{\' s \`|.\' 1 ] + ] +] + +def -hidden _cabal_indent_on_closing_curly_brace %[ + eval -draft -itersel %[ + # align to opening curly brace when alone on a line + try %[ exec -draft ^\h+\}$ h m s \`|.\' 1 ] + ] +] + +# Initialization +# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +hook global WinSetOption filetype=cabal %[ + addhl ref cabal + + hook window InsertEnd .* -group cabal-hooks _cabal_filter_around_selections + hook window InsertChar \n -group cabal-indent _cabal_indent_on_new_line + hook window InsertChar \{ -group cabal-indent _cabal_indent_on_opening_curly_brace + hook window InsertChar \} -group cabal-indent _cabal_indent_on_closing_curly_brace +] + +hook global WinSetOption filetype=(?!cabal).* %{ + rmhl cabal + rmhooks window cabal-indent + rmhooks window cabal-hooks +} diff --git a/rc/haskell.kak b/rc/haskell.kak new file mode 100644 index 00000000..1a59927e --- /dev/null +++ b/rc/haskell.kak @@ -0,0 +1,75 @@ +# http://haskell.org +# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +# Detection +# ‾‾‾‾‾‾‾‾‾ + +hook global BufSetOption mimetype=text/x-haskell %{ + set buffer filetype haskell +} + +hook global BufCreate .*[.](hs) %{ + set buffer filetype haskell +} + +# Highlighters +# ‾‾‾‾‾‾‾‾‾‾‾‾ + +addhl -group / regions -default code haskell \ + string '"' (? 0:meta +addhl -group /haskell/code regex \<(True|False)\> 0:value +addhl -group /haskell/code regex \<(as|case|class|data|default|deriving|do|else|hiding|if|in|infix|infixl|infixr|instance|let|module|newtype|of|qualified|then|type|where)\> 0:keyword +addhl -group /haskell/code regex \<(Int|Integer|Char|Bool|Float|Double|IO|Void|Addr|Array|String)\> 0:type + +# Commands +# ‾‾‾‾‾‾‾‾ + +# http://en.wikibooks.org/wiki/Haskell/Indentation + +def -hidden _haskell_filter_around_selections %{ + eval -draft -itersel %{ + exec + # remove trailing white spaces + try %{ exec -draft s \h+$ d } + } +} + +def -hidden _haskell_indent_on_new_line %{ + eval -draft -itersel %{ + # preserve previous line indent + try %{ exec -draft K } + # align to first clause + try %{ exec -draft k x X s ^\h*(if|then|else)?\h*(([\w']+\h+)+=)?\h*(case\h+[\w']+\h+of|do|let|where)\h+\K.* s \`|.\' & } + # filter previous line + try %{ exec -draft k : _haskell_filter_around_selections } + # copy -- comments prefix and following white spaces + try %{ exec -draft k x s ^\h*\K--\h* y j p } + # indent after lines beginning with condition or ending with expression or =( + try %{ exec -draft k x ^\h*(if)|(case\h+[\w']+\h+of|do|let|where|[=(])$ j } + } +} + +# Initialization +# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +hook global WinSetOption filetype=haskell %{ + addhl ref haskell + + hook window InsertEnd .* -group haskell-hooks _haskell_filter_around_selections + hook window InsertChar \n -group haskell-indent _haskell_indent_on_new_line +} + +hook global WinSetOption filetype=(?!haskell).* %{ + rmhl haskell + rmhooks window haskell-indent + rmhooks window haskell-hooks +}