summaryrefslogtreecommitdiff
path: root/rc
diff options
context:
space:
mode:
authorThomas Teixeira <thomas.teixeira@startmail.com>2024-08-05 12:53:47 +0200
committerMaxime Coste <mawww@kakoune.org>2024-08-06 22:15:01 +1000
commit31e0c81156a4974c24a52722b98aad9a0d7b1b25 (patch)
treed39ec114092646f983f95b52abe98727e30a3af9 /rc
parent3dcc042fb4bb214511430c07b8c4ad7aa4a6d1e7 (diff)
Add gleam language support
Diffstat (limited to 'rc')
-rw-r--r--rc/filetype/gleam.kak120
-rw-r--r--rc/tools/comment.kak2
2 files changed, 121 insertions, 1 deletions
diff --git a/rc/filetype/gleam.kak b/rc/filetype/gleam.kak
new file mode 100644
index 00000000..bf52a8f2
--- /dev/null
+++ b/rc/filetype/gleam.kak
@@ -0,0 +1,120 @@
+# https://gleam.run/
+#
+# a lot of this file was taken from rc/filetype/go.kak and rc/filetype/hare.kak, thanks everyone !
+
+# Detection
+hook global BufCreate .*\.gleam %{
+ set-option buffer filetype gleam
+}
+
+# Initialization
+hook global WinSetOption filetype=gleam %<
+ require-module gleam
+ set-option window static_words %opt{gleam_static_words}
+ add-highlighter window/gleam ref gleam
+
+ # remove whitespace when exiting insert mode
+ hook window ModeChange pop:insert:.* -group gleam-trim-indent gleam-remove-white-space
+ # gleam special indent hooks
+ hook window InsertChar \n -group gleam-indent gleam-indent-new-line
+ hook window InsertChar \n -group gleam-indent gleam-indent-after-blocks
+ hook window InsertChar \} -group gleam-indent gleam-unindent-after-brackets
+ hook window InsertChar \] -group gleam-indent gleam-unindent-after-brackets
+ hook window InsertChar \) -group gleam-indent gleam-unindent-after-brackets
+ # gleam special construct insert
+ hook window InsertChar \n -group gleam-auto-insert gleam-insert-comment-on-new-line
+ hook window InsertChar \n -group gleam-auto-insert gleam-insert-pipeline-on-new-line
+
+ # Uninitialization
+ hook -once -always window WinSetOption filetype=.* %[
+ remove-highlighter window/gleam
+ remove-hooks window gleam-.+
+ ]
+>
+
+provide-module gleam %§
+ # Highlighters
+ add-highlighter shared/gleam regions
+ add-highlighter shared/gleam/code default-region group
+ add-highlighter shared/gleam/double_string region '"' (?<!\\)(\\\\)*" fill string
+ add-highlighter shared/gleam/single_string region "'" (?<!\\)(\\\\)*' fill string
+ add-highlighter shared/gleam/comment_line region '//' $ fill comment
+
+ add-highlighter shared/gleam/code/operator group
+ add-highlighter shared/gleam/code/operator/basic regex '(?:[-+/*]\.?|[=%])' 0:operator
+ add-highlighter shared/gleam/code/operator/arrows regex '(?:<-|[-|]>)' 0:operator
+ add-highlighter shared/gleam/code/operator/comparison regex '(?:[<>]=?\.?|[=!]=)' 0:operator
+ add-highlighter shared/gleam/code/operator/bool regex '(?:&&|\|\|)' 0:operator
+ add-highlighter shared/gleam/code/operator/misc regex '(?:\.\.|<>|\|)' 0:operator
+
+ add-highlighter shared/gleam/code/numeric group
+ add-highlighter shared/gleam/code/numeric/natural regex '0*[1-9](?:_?[0-9])*' 0:value
+ add-highlighter shared/gleam/code/numeric/real regex '0*[1-9](?:_?[0-9])*(?:\.(?:0*[1-9](?:_?[0-9])*)?(?:e-?0*[1-9](?:_?[0-9])*)?)?' 0:value
+ add-highlighter shared/gleam/code/numeric/binary regex '\b0[bB]0*1(?:_?[01])*\b' 0:value
+ add-highlighter shared/gleam/code/numeric/octal regex '\b0[oO]0*[1-7](?:_?[0-7])*\b' 0:value
+ add-highlighter shared/gleam/code/numeric/hexadecimal regex '\b0[xX]0*[1-9a-zA-Z](?:_?[0-9a-zA-Z])*\b' 0:value
+
+ add-highlighter shared/gleam/code/function regex '([a-z][0-9a-z_]*)\h*\(' 1:function
+ add-highlighter shared/gleam/code/type regex '[A-Z][a-zA-Z0-9]*' 0:type
+ add-highlighter shared/gleam/code/keyword regex '\b(as|assert|case|const|else|fn|if|import|let|opaque|panic|pub|todo|try|type|use)\b' 0:keyword
+ add-highlighter shared/gleam/code/attribute regex '@[a-z][a-z_]*' 0:attribute
+
+ declare-option str-list gleam_static_words \
+ as assert case const else fn if import let opaque panic pub todo try type use
+
+ define-command -hidden gleam-remove-white-space %[
+ try %[ execute-keys -draft -itersel xs \h+$<ret>d ]
+ ]
+
+ define-command -hidden gleam-indent-new-line %[
+ try %[
+ # align current line with previous indent
+ execute-keys -draft -itersel <semicolon>K<a-&>
+ # remove previous line extra whitespace
+ evaluate-commands -draft -itersel %[
+ execute-keys k
+ gleam-remove-white-space
+ ]
+ ]
+ ]
+ define-command -hidden gleam-indent-after-blocks %<
+ try %<
+ # if there is already a closing bracket on the new created line, skip indentation
+ execute-keys -draft -itersel xs ^\h*[\]})]$<ret>
+ > catch %<
+ try %<
+ execute-keys -draft -itersel kxs [[={(]$<ret>j<a-gt>
+ >
+ >
+ >
+
+ define-command -hidden gleam-unindent-after-brackets %[
+ evaluate-commands -draft -itersel -no-hooks -save-regs x %[
+ try %[
+ try %[
+ execute-keys -draft h{c[{([],[})\]]<ret>gh<a-i><space>"xy
+ ] catch %[ set-register x '' ]
+ execute-keys -draft gh<a-i><space>"xR
+ ]
+ ]
+ ]
+
+ define-command -hidden gleam-insert-comment-on-new-line %[
+ evaluate-commands -draft -itersel -no-hooks -save-regs x %[
+ try %[
+ execute-keys -draft kxs ^\h*/{2,}\h*<ret><a-f>/H"xy
+ execute-keys -draft \"xP
+ ]
+ ]
+ ]
+
+ define-command -hidden gleam-insert-pipeline-on-new-line %[
+ evaluate-commands -draft -itersel -no-hooks -save-regs x %[
+ try %[
+ execute-keys -draft kxs ^\h*\|>\h*<ret><a-f>|"xy
+ execute-keys -draft \"xP
+ ]
+ ]
+ ]
+
diff --git a/rc/tools/comment.kak b/rc/tools/comment.kak
index 37dcac8b..3521b82c 100644
--- a/rc/tools/comment.kak
+++ b/rc/tools/comment.kak
@@ -118,7 +118,7 @@ hook global BufSetOption filetype=perl %{
set-option buffer comment_block_end ']'
}
-hook global BufSetOption filetype=(pug|zig|cue|hare) %{
+hook global BufSetOption filetype=(pug|zig|cue|hare|gleam) %{
set-option buffer comment_line '//'
}