kakoune/rc/filetype/sml.kak
2020-06-23 19:22:35 +01:00

87 lines
3.2 KiB
Plaintext

# https://smlfamily.github.io
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
# Detection
# ‾‾‾‾‾‾‾‾‾
hook global BufCreate .*\.(sml|fun|sig) %{
set-option buffer filetype sml
}
# Initialization
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
hook global WinSetOption filetype=sml %{
require-module sml
set-option buffer extra_word_chars '_' "'"
set-option window static_words %opt{sml_static_words}
}
hook -group sml-highlight global WinSetOption filetype=sml %{
add-highlighter window/sml ref sml
hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/sml }
}
provide-module sml %[
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
add-highlighter shared/sml regions
add-highlighter shared/sml/code default-region group
add-highlighter shared/sml/string region '#?"' '(?<!\\)(\\\\)*"' fill string
add-highlighter shared/sml/comment region -recurse '\(\*' '\(\*' '\*\)' fill comment
evaluate-commands %sh{
keywords='abstype and andalso as case datatype do else end exception fn fun
handle if in infix infixr let local nonfix of op open orelse raise
rec then type val with withtype while eqtype functor include
sharing sig signature struct structure'
types='unit exn ref'
ops='before ignore o
div mod quot rem abs
not chr ord ceil floor round trunc
andb orb xorb notb'
join() { sep=$2; eval set -- $1; IFS="$sep"; echo "$*"; }
printf %s\\n "declare-option str-list sml_static_words $(join "${keywords} ${types} ${ops}" ' ')"
printf %s "
add-highlighter shared/sml/code/ regex \b($(join "${keywords}" '|'))\b 0:keyword
add-highlighter shared/sml/code/ regex \b($(join "${types}" '|'))\b 0:builtin
add-highlighter shared/sml/code/ regex \b($(join "${ops}" '|'))\b 0:operator
"
}
# Symbolic identifiers
add-highlighter shared/sml/code/ regex "[!*/+\-~\^@=<>%%&$?`\\#:|]+" 0:operator
# Record projection functions
add-highlighter shared/sml/code/ regex "(?<![!*/+\-~\^@=<>%%&$?`\\#:|])#([\w']+)?(?![!*/+\-~\^@=<>%%&$?`\\#:|])" 0:function
# Symbolic keywords
add-highlighter shared/sml/code/ regex "(?<![!*/+\-~\^@=<>%%&$?`\\#:|])(=>|=|\*|->|:>|:|;|\.\.\.|\b_\b|\|)(?![!*/+\-~\^@=<>%%&$?`\\#:|])" 0:keyword
# Type variables
add-highlighter shared/sml/code/ regex "(?<![\w'])'[\w']+(?![\w'])" 0:variable
# Structure identifiers and value constructors
add-highlighter shared/sml/code/ regex "(?<![\w'])([A-Z][\w']*\.?)" 0:type
# Signature identifiers and all-caps value constructors
add-highlighter shared/sml/code/ regex "(?<![\w'])[A-Z]{2}[A-Z0-9_']+(?![\w'])" 0:attribute
# Constants
add-highlighter shared/sml/code/ regex "(?<![\w'])(true|false|nil)\b" 0:value
# Numeric literals
add-highlighter shared/sml/code/ regex "(?<![\w'])0w[0-9]+\b" 0:value
add-highlighter shared/sml/code/ regex "(?<![\w'])(0wx|0xw)[0-9a-fA-F]+\b" 0:value
add-highlighter shared/sml/code/ regex "(?<![\w'])(0wb|0bw)[01]+\b" 0:value
add-highlighter shared/sml/code/ regex "(~|(?<![\w']))0x[0-9a-fA-F]+\b" 0:value
add-highlighter shared/sml/code/ regex "(~|(?<![\w']))0b[01]+\b" 0:value
add-highlighter shared/sml/code/ regex "(?<!#)(~|(?<![\w']))[0-9]+(\.[0-9]+)?([eE]~?[0-9]+)?\b" 0:value
]