# http://gluon-lang.org # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ # Detection # ‾‾‾‾‾‾‾‾‾ hook global BufCreate .*[.](glu) %{ set-option buffer filetype gluon } # Initialization # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾ hook global WinSetOption filetype=gluon %{ require-module gluon set-option window extra_word_chars '_' "'" hook window ModeChange insert:.* -group gluon-trim-indent gluon-trim-indent hook window InsertChar \n -group gluon-indent gluon-indent-on-new-line hook -once -always window WinSetOption filetype=.* %{ remove-hooks window gluon-.+ } } hook -group gluon-highlight global WinSetOption filetype=gluon %{ add-highlighter window/gluon ref gluon hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/gluon } } provide-module gluon %[ # Highlighters # ‾‾‾‾‾‾‾‾‾‾‾‾ add-highlighter shared/gluon regions add-highlighter shared/gluon/code default-region group add-highlighter shared/gluon/string region (? < <= ^ <*> <$> etc # matches dot: . # matches keywords: @ : -> add-highlighter shared/gluon/code/ regex (?|:!?/.@$*&#%+\^\-\\])[~<=>|:!?/.@$*&#%+\^\-\\]+ 0:operator # matches 'x' '\\' '\'' '\n' '\0' # not incomplete literals: '\' add-highlighter shared/gluon/code/ regex \B'([^\\]|[\\]['"\w\d\\])' 0:string # this has to come after operators so '-' etc is correct # Commands # ‾‾‾‾‾‾‾‾ define-command -hidden gluon-trim-indent %{ # remove trailing white spaces try %{ execute-keys -draft -itersel s \h+$ d } } define-command -hidden gluon-indent-on-new-line %{ evaluate-commands -draft -itersel %{ # copy // and /// comments prefix and following white spaces try %{ execute-keys -draft k s ^\h*\K///?\h* y gh j P } # preserve previous line indent try %{ execute-keys -draft \; K } # filter previous line try %{ execute-keys -draft k : gluon-trim-indent } # indent after lines ending with (open) braces, =, ->, condition, rec, # or in try %{ execute-keys -draft \ \; k x (\(|\{|\[|=|->|then|else|rec|in)$ j # balance out brackets } ] } # deindent closing brace(s) when after cursor try %{ execute-keys -draft ^\h*[})\]]+\h*$ hm 1 } } } ]