summaryrefslogtreecommitdiff
path: root/autoload/filetype/fidl.kak
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/filetype/fidl.kak')
-rw-r--r--autoload/filetype/fidl.kak79
1 files changed, 79 insertions, 0 deletions
diff --git a/autoload/filetype/fidl.kak b/autoload/filetype/fidl.kak
new file mode 100644
index 0000000..351eeb4
--- /dev/null
+++ b/autoload/filetype/fidl.kak
@@ -0,0 +1,79 @@
+# Detection
+hook global BufCreate .*\.fidl %{
+ set-option buffer filetype fidl
+}
+
+hook global WinSetOption filetype=fidl %<
+ require-module fidl
+ hook window ModeChange pop:insert:.* -group fidl-trim-indent fidl-trim-indent
+ hook window InsertChar \n -group fidl-indent fidl-indent-on-new-line
+ hook window InsertChar [)}] -group fidl-indent fidl-indent-on-closing
+ hook -once -always window WinSetOption filetype=.* %{ remove-hooks window fidl-.+ }
+>
+
+hook -group fidl-highlight global WinSetOption filetype=fidl %{
+ add-highlighter window/fidl ref fidl
+ hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/fidl }
+}
+
+provide-module fidl %§
+
+# Highlighters
+
+add-highlighter shared/fidl regions
+add-highlighter shared/fidl/code default-region group
+
+add-highlighter shared/fidl/string region \" (?<!\\)(\\\\)*" fill string
+
+add-highlighter shared/fidl/line_doc region ///(?!/) $ fill documentation
+add-highlighter shared/fidl/line_comment region // $ group
+add-highlighter shared/fidl/line_comment/comment fill comment
+add-highlighter shared/fidl/line_comment/todo regex TODO|FIXME: 0:meta
+
+add-highlighter shared/fidl/attributes region @[a-zA-Z] \b fill meta
+
+add-highlighter shared/fidl/code/keywords regex \b(as|bits|compose|const|enum|error|flexible|optional|library|protocol|resource|service|strict|struct|table|type|union|using)\b 0:keyword
+add-highlighter shared/fidl/code/types regex \b(array|bool|bytes?|client_end|float(32|64)|server_end|string|u?int(8|16|32|64)|vector)\b 0:type
+
+add-highlighter shared/fidl/code/literals group
+add-highlighter shared/fidl/code/literals/bool regex \b(true|false)\b 0:value
+add-highlighter shared/fidl/code/literals/decimal regex \b([0-9]+(\.[0-9]+)?)\b 0:value
+add-highlighter shared/fidl/code/literals/hexadecimal regex \b(0x[0-9a-fA-F])\b 0:value
+add-highlighter shared/fidl/code/literals/binary regex \b(0b[01])\b 0:value
+
+# Commands
+
+define-command -hidden fidl-trim-indent %{
+ # remove trailing white spaces
+ try %{ execute-keys -draft -itersel x s \h+$ <ret> d }
+}
+
+define-command -hidden fidl-indent-on-new-line %~
+ evaluate-commands -draft -itersel %@
+ try %{ # line comment
+ # copy the commenting prefix
+ execute-keys -draft k x s ^\h*/{2,}\h* <ret> yjghP
+ } catch %`
+ # preserve previous line indent
+ try %{ execute-keys -draft <semicolon> K <a-&> }
+ # align to opening ( or { if possible
+ try %+
+ execute-keys -draft <a-k> [)}] <ret> m <a-S> 1<a-&>
+ + catch %+
+ # indent after lines ending with ( or {
+ try %! execute-keys -draft k x <a-k> [({]$ <ret> j <a-gt> !
+ +
+ `
+ # remove trailing white spaces
+ try %{ execute-keys -draft k : fidl-trim-indent <ret> }
+ @
+~
+
+define-command -hidden fidl-indent-on-closing %~
+ evaluate-commands -draft -itersel %@
+ # align to opening ( or { when alone on a line
+ try %< execute-keys -draft <a-h> <a-k> ^\h*[)}]$ <ret> m <a-S> 1<a-&> >
+ @
+~
+