diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2025-01-28 09:14:32 +0000 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2025-01-28 09:14:32 +0000 |
commit | 904cec3c4a329cf89fc3219d359239910d61f3f6 (patch) | |
tree | 8d113899921dfbaca0e77c49ab5fc827362d1091 /autoload/filetype/terraform.kak |
Diffstat (limited to 'autoload/filetype/terraform.kak')
-rw-r--r-- | autoload/filetype/terraform.kak | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/autoload/filetype/terraform.kak b/autoload/filetype/terraform.kak new file mode 100644 index 0000000..3ad975a --- /dev/null +++ b/autoload/filetype/terraform.kak @@ -0,0 +1,120 @@ +# Terraform configuration language +# https://www.terraform.io/docs/configuration/ + +# Detection +# ‾‾‾‾‾‾‾‾‾ + +hook global BufCreate .*[.](tf|tfvars) %{ + set-option buffer filetype terraform +} + + +# Initialization +# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +hook global WinSetOption filetype=terraform %{ + require-module terraform + + set-option window static_words %opt{terraform_static_words} + + hook -once -always window WinSetOption filetype=.* %{ remove-hooks window terraform-.+ } +} + + +hook -group terraform-highlight global WinSetOption filetype=terraform %{ + add-highlighter window/terraform ref terraform + hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/terraform } +} + + +provide-module terraform %§ + +# Highlighters +# ‾‾‾‾‾‾‾‾‾‾‾‾ + +add-highlighter shared/terraform regions +add-highlighter shared/terraform/code default-region group + +add-highlighter shared/terraform/comment1 region '#' '$' fill comment +add-highlighter shared/terraform/comment2 region '\\' '$' fill comment +add-highlighter shared/terraform/comment3 region /\* \*/ fill comment + +# Strings can contain interpolated terraform expressions, which can contain +# strings. Currently, we cannot support nesting of the same type of delimiter, +# so instead we render the full interpolation as a value (otherwise, it +# looks bad). +# See https://github.com/mawww/kakoune/issues/1670 +add-highlighter shared/terraform/string region '"' '(?<!\\)(?:\\\\)*"' group +add-highlighter shared/terraform/string/fill fill string +add-highlighter shared/terraform/string/inter regex \$\{.+?\} 0:value + +add-highlighter shared/terraform/heredoc region -match-capture '<<-?(\w+)' '^\h*(\w+)$' regions +add-highlighter shared/terraform/heredoc/fill default-region fill string +add-highlighter shared/terraform/heredoc/inter region -recurse \{ (?<!\\)(\\\\)*\$\{ \} ref terraform + + +add-highlighter shared/terraform/code/valueDec regex '\b[0-9]+([kKmMgG]b?)?\b' 0:value +add-highlighter shared/terraform/code/valueHex regex '\b0x[0-9a-f]+([kKmMgG]b?)?\b' 0:value + +add-highlighter shared/terraform/code/operators regex [\[\]] 0:operator + +add-highlighter shared/terraform/code/field regex '^\h+(\w+)\s*(=)' 1:variable 2:keyword + +evaluate-commands %sh{ + blocks="connection content data dynamic locals module output provider + provisioner resource terraform variable" + + constants="true false null" + + keywords="for for_each if in" + + types="bool list map number object set string tuple" + + var_subs="local module var" + + # Builtin functions + fun_num="abs ceil floor log max min parseint pow signum" + + fun_str="chomp format formatlist indent join lower regex regexall replace + split strrev substr title trimspace upper" + + fun_coll="chunklist coalesce coalescelist compact concat contains + distinct element flatten index keys length lookup + matchkeys merge range reverse setintersection setproduct + setunion slice sort transpose values zipmap" + + fun_enc="base64decode base64encode base64gzip csvdecode jsondecode + jsonencode urlencode yamldecode yamlencode" + + fun_file="abspath dirname pathexpand basename file fileexists fileset + filebase64 templatefile" + + fun_dt="formatdate timeadd timestamp" + + fun_crypt="base64sha256 base64sha512 bcrypt filebase64sha256 + filebase64sha512 filemd5 filesha1 filesha256 filesha512 md5 + rsadecrypt sha1 sha256 sha512 uuid uuidv5" + + fun_net="cidrhost cidrnetmask cidrsubnet" + + fun_cast="tobool tolist tomap tonumber toset tostring" + + functions="$fun_num $fun_str $fun_coll $fun_enc $fun_file $fun_dt $fun_crypt $fun_net $fun_cast" + + join() { sep=$2; eval set -- $1; IFS="$sep"; echo "$*"; } + + # Add grammar elements to the static completion list + printf %s\\n "declare-option str-list terraform_static_words $(join "$blocks $keywords $constants $types $var_subs $functions" ' ')" + + # Highlight grammar elements + printf %s " + add-highlighter shared/terraform/code/ regex '\b($(join "$blocks" '|'))\b[^.]' 1:keyword + add-highlighter shared/terraform/code/ regex '\b($(join "$keywords" '|'))\b' 1:keyword + add-highlighter shared/terraform/code/ regex '\b($(join "$constants" '|'))\b' 1:value + add-highlighter shared/terraform/code/ regex '\b($(join "$types" '|'))\b' 1:type + add-highlighter shared/terraform/code/ regex '\b($(join "$var_subs" '|'))\b\.' 1:meta + add-highlighter shared/terraform/code/ regex '\b($(join "$functions" '|'))\s*\(' 1:builtin + " +} + +§ |