1
1
mirror of https://github.com/mawww/kakoune.git synced 2024-12-26 21:22:00 +03:00
kakoune/rc/filetype/crystal.kak
2019-06-05 17:34:18 +02:00

136 lines
6.7 KiB
Plaintext

# Crystal
# https://crystal-lang.org
hook global BufCreate '.*\.cr' %{
set-option buffer filetype crystal
}
hook global WinSetOption filetype=crystal %{
require-module crystal
set-option window static_words %opt(crystal_keywords)
add-highlighter window/ ref crystal
hook -group crystal window InsertChar '\n' crystal-new-line-inserted
hook -always -once window WinSetOption filetype=.* %{
remove-highlighter window/crystal
remove-hooks window crystal
}
}
provide-module crystal %🐈
declare-option -hidden str-list crystal_keywords 'abstract' 'alias' 'annotation' 'as' 'asm' 'begin' 'break' 'case' 'class' 'def' 'do' 'else' 'elsif' 'end' 'ensure' 'enum' 'extend' 'false' 'for' 'fun' 'if' 'include' 'instance_sizeof' 'is_a?' 'lib' 'macro' 'module' 'next' 'nil' 'nil?' 'of' 'offsetof' 'out' 'pointerof' 'private' 'protected' 'require' 'rescue' 'responds_to?' 'return' 'select' 'self' 'sizeof' 'struct' 'super' 'then' 'true' 'type' 'typeof' 'uninitialized' 'union' 'unless' 'until' 'verbatim' 'when' 'while' 'with' 'yield'
add-highlighter shared/crystal regions
add-highlighter shared/crystal/code default-region group
# Comments
# https://crystal-lang.org/reference/syntax_and_semantics/comments.html
# Avoid string literals with interpolation
add-highlighter shared/crystal/comment region '#(?!\{)' '$' fill comment
# String
# https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html
add-highlighter shared/crystal/string region '"' '(?<!\\)"' regions
# Percent string literals
# https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html#percent-string-literals
add-highlighter shared/crystal/parenthesis-string region -recurse '\(' '%Q?\(' '\)' regions
add-highlighter shared/crystal/bracket-string region -recurse '\[' '%Q?\[' '\]' regions
add-highlighter shared/crystal/brace-string region -recurse '\{' '%Q?\{' '\}' regions
add-highlighter shared/crystal/angle-string region -recurse '<' '%Q?<' '>' regions
add-highlighter shared/crystal/pipe-string region '%Q?\|' '\|' regions
# Raw
# https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html#percent-string-literals
# https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html#percent-string-array-literal
add-highlighter shared/crystal/raw-parenthesis-string region -recurse '\(' '%[qw]\(' '\)' fill string
add-highlighter shared/crystal/raw-bracket-string region -recurse '\[' '%[qw]\[' '\]' fill string
add-highlighter shared/crystal/raw-brace-string region -recurse '\{' '%[qw]\{' '\}' fill string
add-highlighter shared/crystal/raw-angle-string region -recurse '<' '%[qw]<' '>' fill string
add-highlighter shared/crystal/raw-pipe-string region '%[qw]\|' '\|' fill string
# Here document
# https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html#heredoc
add-highlighter shared/crystal/heredoc region -match-capture '<<-(\w+)' '^\h*(\w+)$' regions
# Raw
add-highlighter shared/crystal/raw-heredoc region -match-capture "<<-'(\w+)'" '^\h*(\w+)$' regions
add-highlighter shared/crystal/raw-heredoc/fill default-region fill string
add-highlighter shared/crystal/raw-heredoc/interpolation region -recurse '\{' '#\{' '\}' fill meta
# Regular expressions
# https://crystal-lang.org/reference/syntax_and_semantics/literals/regex.html
# https://crystal-lang.org/reference/syntax_and_semantics/literals/regex.html#modifiers
add-highlighter shared/crystal/regex region '/' '(?<!\\)/[imx]*' regions
# Avoid unterminated regular expression
add-highlighter shared/crystal/division region ' / ' '.\K' group
# Percent regex literals
# https://crystal-lang.org/reference/syntax_and_semantics/literals/regex.html#percent-regex-literals
add-highlighter shared/crystal/parenthesis-regex region -recurse '\(' '%r?\(' '\)[imx]*' regions
add-highlighter shared/crystal/bracket-regex region -recurse '\[' '%r?\[' '\][imx]*' regions
add-highlighter shared/crystal/brace-regex region -recurse '\{' '%r?\{' '\}[imx]*' regions
add-highlighter shared/crystal/angle-regex region -recurse '<' '%r?<' '>[imx]*' regions
add-highlighter shared/crystal/pipe-regex region '%r?\|' '\|[imx]*' regions
# Command
# https://crystal-lang.org/reference/syntax_and_semantics/literals/command.html
add-highlighter shared/crystal/command region '`' '(?<!\\)`' regions
# Percent command literals
add-highlighter shared/crystal/parenthesis-command region -recurse '\(' '%x?\(' '\)' regions
add-highlighter shared/crystal/bracket-command region -recurse '\[' '%x?\[' '\]' regions
add-highlighter shared/crystal/brace-command region -recurse '\{' '%x?\{' '\}' regions
add-highlighter shared/crystal/angle-command region -recurse '<' '%x?<' '>' regions
add-highlighter shared/crystal/pipe-command region '%x?\|' '\|' regions
evaluate-commands %sh[
# Keywords
eval "set -- $kak_opt_crystal_keywords"
regex="\\b(?:$1"
shift
for keyword do
regex="$regex|\\Q$keyword\\E"
done
regex="$regex)\\b"
printf 'add-highlighter shared/crystal/code/keywords regex %s 0:keyword\n' "$regex"
# Interpolation
# String
# https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html#interpolation
for id in string parenthesis-string bracket-string brace-string angle-string pipe-string heredoc; do
printf "
add-highlighter shared/crystal/$id/fill default-region fill string
add-highlighter shared/crystal/$id/interpolation region -recurse '\\{' '#\\{' '\\}' ref crystal
"
done
# Regular expressions
# https://crystal-lang.org/reference/syntax_and_semantics/literals/regex.html#interpolation
for id in regex parenthesis-regex bracket-regex brace-regex angle-regex pipe-regex; do
printf "
add-highlighter shared/crystal/$id/fill default-region fill meta
add-highlighter shared/crystal/$id/interpolation region -recurse '\\{' '#\\{' '\\}' ref crystal
"
done
# Command
for id in command parenthesis-command bracket-command brace-command angle-command pipe-command; do
printf "
add-highlighter shared/crystal/$id/fill default-region fill meta
add-highlighter shared/crystal/$id/interpolation region -recurse '\\{' '#\\{' '\\}' ref crystal
"
done
]
define-command -hidden crystal-new-line-inserted %{
# Copy previous line indent
try %(execute-keys -draft 'K<a-&>')
# Remove empty line indent
try %(execute-keys -draft 'k<a-x>s^\h+$<ret>d')
}
define-command -hidden crystal-fetch-keywords %{
set-register dquote %sh{
curl --location https://github.com/crystal-lang/crystal/raw/master/src/compiler/crystal/syntax/lexer.cr |
kak -f '%1scheck_ident_or_keyword\(:(\w+\??), \w+\)<ret>y%<a-R>a<ret><esc><a-_>a<del><esc>|sort<ret>'
}
}
🐈