summaryrefslogtreecommitdiff
path: root/autoload/filetype/tcl.kak
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2025-01-28 09:14:32 +0000
committerthing1 <thing1@seacrossedlovers.xyz>2025-01-28 09:14:32 +0000
commit904cec3c4a329cf89fc3219d359239910d61f3f6 (patch)
tree8d113899921dfbaca0e77c49ab5fc827362d1091 /autoload/filetype/tcl.kak
init commitHEADmaster
Diffstat (limited to 'autoload/filetype/tcl.kak')
-rw-r--r--autoload/filetype/tcl.kak79
1 files changed, 79 insertions, 0 deletions
diff --git a/autoload/filetype/tcl.kak b/autoload/filetype/tcl.kak
new file mode 100644
index 0000000..5823eb5
--- /dev/null
+++ b/autoload/filetype/tcl.kak
@@ -0,0 +1,79 @@
+hook global BufCreate .*[.](tcl) %{
+ set-option buffer filetype tcl
+}
+
+hook global WinSetOption filetype=tcl %{
+ require-module tcl
+
+ hook window ModeChange pop:insert:.* -group tcl-trim-indent tcl-trim-indent
+ hook window InsertChar \n -group tcl-insert tcl-insert-on-new-line
+ hook window InsertChar \n -group tcl-indent tcl-indent-on-new-line
+ hook -once -always window WinSetOption filetype=.* %{ remove-hooks window tcl-.+ }
+}
+
+hook -group tcl-highlight global WinSetOption filetype=tcl %{
+ add-highlighter window/tcl ref tcl
+ hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/tcl }
+}
+
+# Using non-ascii characters here so that we can use the '[' command
+provide-module tcl %§
+
+add-highlighter shared/tcl regions
+add-highlighter shared/tcl/code default-region group
+add-highlighter shared/tcl/comment region (?<!\\)(?:\\\\)*(?:^|\h)\K# '$' fill comment
+add-highlighter shared/tcl/double_string region %{(?<!\\)(?:\\\\)*\K"} %{(?<!\\)(?:\\\\)*"} group
+add-highlighter shared/tcl/double_string/fill fill string
+
+evaluate-commands %sh{
+ # Tcl does not have keywords, as everything in Tcl is a command.
+ # Highlight all builtin commads does not make a lot of sense as there are plenty of them.
+ # What is more, sometimes user defines varaibles have the same names as commands.
+ # On the other hand, highlight no commads makes the code harder to read.
+ # The approach for builtin commads highlighting is very simply.
+ # Highlight only two types of commands:
+ # 1. "Control statement" like commands, for exmaple, "if", "break", "return", etc.
+ # 2. Commands defining new scope, for exmaple, "proc", "namespace".
+ keywords="break catch continue default else elseif error exit for foreach if return switch while proc namespace"
+
+ join() { sep=$2; eval set -- $1; IFS="$sep"; echo "$*"; }
+
+ # Highlight keywords
+ printf %s\\n "add-highlighter shared/tcl/code/ regex (?<!-)\b($(join "${keywords}" '|'))\b(?!-) 0:keyword"
+}
+
+add-highlighter shared/tcl/code/function regex ^\h*proc\h+((\w|-)+) 1:function
+add-highlighter shared/tcl/code/brackets regex [\[\]]{1,2} 0:operator
+add-highlighter shared/tcl/code/parameters regex \s-\w+\b 0:attribute
+add-highlighter shared/tcl/code/variable regex \$(\w|:)+ 0:value
+add-highlighter shared/tcl/code/numbers regex '\b\d+\.?' 0:value
+
+add-highlighter shared/tcl/double_string/variable regex \$(\w|:)+ 0:value
+add-highlighter shared/tcl/double_string/brackets regex [\[\]]{1,2} 0:operator
+
+# Commands
+# ‾‾‾‾‾‾‾‾
+
+define-command -hidden tcl-trim-indent %{
+ # Remove trailing white spaces
+ try %{ execute-keys -draft -itersel x s \h+$ <ret> d }
+}
+
+define-command -hidden tcl-insert-on-new-line %[
+ # Copy '#' comment prefix and following white spaces
+ try %{ execute-keys -draft k x s ^\h*\K#\h* <ret> y gh j P }
+]
+
+define-command -hidden tcl-indent-on-new-line %¶
+ evaluate-commands -draft -itersel %@
+ # Preserve previous line indent
+ try %{ execute-keys -draft <semicolon> K <a-&> }
+
+ # Filter previous line
+ try %{ execute-keys -draft k : tcl-trim-indent <ret> }
+
+ # Indent after {
+ try %= execute-keys -draft , k x <a-k> (\s|^)\{$ <ret> j <a-gt> =
+ @