diff options
Diffstat (limited to 'autoload/filetype/tcl.kak')
-rw-r--r-- | autoload/filetype/tcl.kak | 79 |
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> = + @ +¶ +§ |