changeset 36097:7b9aa561aa0c

runtime(hcl,terraform): Add runtime files for HCL and Terraform Commit: https://github.com/vim/vim/commit/150b5078ac886519083576124090489c3a21bd3b Author: Gregory Anders <greg@gpanders.com> Date: Wed Sep 4 22:19:45 2024 +0200 runtime(hcl,terraform): Add runtime files for HCL and Terraform closes: https://github.com/vim/vim/issues/15618 Signed-off-by: Gregory Anders <greg@gpanders.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Wed, 04 Sep 2024 22:30:05 +0200
parents 98d33a5a2cff
children e7f44fefe14b
files .github/MAINTAINERS runtime/autoload/hcl.vim runtime/ftplugin/hcl.vim runtime/indent/hcl.vim runtime/indent/terraform.vim runtime/syntax/hcl.vim runtime/syntax/terraform.vim
diffstat 7 files changed, 166 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/.github/MAINTAINERS
+++ b/.github/MAINTAINERS
@@ -13,6 +13,7 @@ nsis/lang/russian.nsi			@RestorerZ
 runtime/autoload/freebasic.vim		@dkearns
 runtime/autoload/hare.vim		@selenebun
 runtime/autoload/haskell.vim		@alx741
+runtime/autoload/hcl.vim		@gpanders
 runtime/autoload/javascript.vim		@jsit
 runtime/autoload/modula2.vim		@dkearns
 runtime/autoload/php.vim		@david-szabo97
@@ -170,6 +171,7 @@ runtime/ftplugin/haml.vim		@tpope
 runtime/ftplugin/hare.vim		@selenebun
 runtime/ftplugin/haredoc.vim		@selenebun
 runtime/ftplugin/heex.vim		@cvincent
+runtime/ftplugin/hcl.vim		@gpanders
 runtime/ftplugin/hgcommit.vim		@k-takata
 runtime/ftplugin/hlsplaylist.vim		@avidseeker
 runtime/ftplugin/hog.vim		@wtfbbqhax
@@ -316,6 +318,7 @@ runtime/indent/go.vim			@dbarnett
 runtime/indent/gyp.vim			@ObserverOfTime
 runtime/indent/haml.vim			@tpope
 runtime/indent/hare.vim			@selenebun
+runtime/indent/hcl.vim			@gpanders
 runtime/indent/hog.vim			@wtfbbqhax
 runtime/indent/idlang.vim		@dkearns
 runtime/indent/j.vim			@glts
@@ -360,6 +363,7 @@ runtime/indent/systemverilog.vim	@Kocha
 runtime/indent/tcl.vim			@dkearns
 runtime/indent/tcsh.vim			@dkearns
 runtime/indent/teraterm.vim		@k-takata
+runtime/indent/terraform.vim		@gpanders.com
 runtime/indent/thrift.vim		@jiangyinzuo
 runtime/indent/typescript.vim		@HerringtonDarkholme
 runtime/indent/typst.vim		@gpanders
@@ -459,6 +463,7 @@ runtime/syntax/haml.vim			@tpope
 runtime/syntax/hare.vim			@selenebun
 runtime/syntax/haredoc.vim		@selenebun
 runtime/syntax/haskell.vim		@coot
+runtime/syntax/hcl.vim			@gpanders
 runtime/syntax/help_ru.vim		@RestorerZ
 runtime/syntax/hgcommit.vim		@k-takata
 runtime/syntax/hitest.vim		@lacygoill
@@ -566,6 +571,7 @@ runtime/syntax/systemverilog.vim	@Kocha
 runtime/syntax/tap.vim			@petdance
 runtime/syntax/tcsh.vim			@dkearns
 runtime/syntax/teraterm.vim		@k-takata
+runtime/syntax/terraform.vim		@gpanders
 runtime/syntax/thrift.vim		@jiangyinzuo
 runtime/syntax/tidy.vim			@dkearns
 runtime/syntax/tmux.vim			@ericpruitt
new file mode 100644
--- /dev/null
+++ b/runtime/autoload/hcl.vim
@@ -0,0 +1,40 @@
+" Language:    HCL
+" Maintainer:  Gregory Anders
+" Last Change: 2024-09-03
+" Based on:    https://github.com/hashivim/vim-terraform
+
+function! hcl#indentexpr(lnum)
+  " Beginning of the file should have no indent
+  if a:lnum == 0
+    return 0
+  endif
+
+  " Usual case is to continue at the same indent as the previous non-blank line.
+  let prevlnum = prevnonblank(a:lnum-1)
+  let thisindent = indent(prevlnum)
+
+  " If that previous line is a non-comment ending in [ { (, increase the
+  " indent level.
+  let prevline = getline(prevlnum)
+  if prevline !~# '^\s*\(#\|//\)' && prevline =~# '[\[{\(]\s*$'
+    let thisindent += &shiftwidth
+  endif
+
+  " If the current line ends a block, decrease the indent level.
+  let thisline = getline(a:lnum)
+  if thisline =~# '^\s*[\)}\]]'
+    let thisindent -= &shiftwidth
+  endif
+
+  " If the previous line starts a block comment /*, increase by one
+  if prevline =~# '/\*'
+    let thisindent += 1
+  endif
+
+  " If the previous line ends a block comment */, decrease by one
+  if prevline =~# '\*/'
+    let thisindent -= 1
+  endif
+
+  return thisindent
+endfunction
new file mode 100644
--- /dev/null
+++ b/runtime/ftplugin/hcl.vim
@@ -0,0 +1,10 @@
+" Vim filetype plugin
+" Language:	HCL
+" Maintainer:	Gregory Anders
+" Last Change:	2024-09-03
+
+if exists('b:did_ftplugin')
+  finish
+endif
+
+runtime! ftplugin/terraform.vim
new file mode 100644
--- /dev/null
+++ b/runtime/indent/hcl.vim
@@ -0,0 +1,16 @@
+" Vim indent file
+" Language:    HCL
+" Maintainer:  Gregory Anders
+" Upstream:    https://github.com/hashivim/vim-terraform
+" Last Change: 2024-09-03
+
+if exists('b:did_indent')
+  finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent shiftwidth=2 tabstop=2 softtabstop=2 expandtab
+setlocal indentexpr=hcl#indentexpr(v:lnum)
+setlocal indentkeys+=<:>,0=},0=)
+
+let b:undo_indent = 'setlocal ai< sw< ts< sts< et< inde< indk<'
new file mode 100644
--- /dev/null
+++ b/runtime/indent/terraform.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language:    Terraform
+" Maintainer:  Gregory Anders
+" Upstream:    https://github.com/hashivim/vim-terraform
+" Last Change: 2024-09-03
+
+if exists('b:did_indent')
+  finish
+endif
+
+runtime! indent/hcl.vim
new file mode 100644
--- /dev/null
+++ b/runtime/syntax/hcl.vim
@@ -0,0 +1,66 @@
+" Vim syntax file
+" Language:    HCL
+" Maintainer:  Gregory Anders
+" Upstream:    https://github.com/hashivim/vim-terraform
+" Last Change: 2024-09-03
+
+if exists('b:current_syntax')
+  finish
+endif
+
+syn iskeyword a-z,A-Z,48-57,_,-
+
+syn case match
+
+" A block is introduced by a type, some number of labels - which are either
+" strings or identifiers - and an opening curly brace.  Match the type.
+syn match hclBlockType /^\s*\zs\K\k*\ze\s\+\(\("\K\k*"\|\K\k*\)\s\+\)*{/
+
+" An attribute name is an identifier followed by an equals sign.
+syn match hclAttributeAssignment /\(\K\k*\.\)*\K\k*\s\+=\s/ contains=hclAttributeName
+syn match hclAttributeName /\<\K\k*\>/ contained
+
+syn keyword hclValueBool true false
+
+syn keyword hclTodo         contained TODO FIXME XXX BUG
+syn region  hclComment      start="/\*" end="\*/" contains=hclTodo,@Spell
+syn region  hclComment      start="#" end="$" contains=hclTodo,@Spell
+syn region  hclComment      start="//" end="$" contains=hclTodo,@Spell
+
+""" misc.
+syn match hclValueDec      "\<[0-9]\+\([kKmMgG]b\?\)\?\>"
+syn match hclValueHexaDec  "\<0x[0-9a-f]\+\([kKmMgG]b\?\)\?\>"
+syn match hclBraces        "[\[\]]"
+
+""" skip \" and \\ in strings.
+syn region hclValueString   start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=hclStringInterp
+syn region hclStringInterp  matchgroup=hclBraces start=/\(^\|[^$]\)\$\zs{/ end=/}/ contained contains=ALLBUT,hclAttributeName
+syn region hclHereDocText   start=/<<-\?\z([a-z0-9A-Z]\+\)/ end=/^\s*\z1/ contains=hclStringInterp
+
+"" Functions.
+syn match hclFunction "[a-z0-9]\+(\@="
+
+""" HCL2
+syn keyword hclRepeat         for in
+syn keyword hclConditional    if
+syn keyword hclValueNull      null
+
+" enable block folding
+syn region hclBlockBody matchgroup=hclBraces start="{" end="}" fold transparent
+
+hi def link hclComment           Comment
+hi def link hclTodo              Todo
+hi def link hclBraces            Delimiter
+hi def link hclAttributeName     Identifier
+hi def link hclBlockType         Type
+hi def link hclValueBool         Boolean
+hi def link hclValueDec          Number
+hi def link hclValueHexaDec      Number
+hi def link hclValueString       String
+hi def link hclHereDocText       String
+hi def link hclFunction          Function
+hi def link hclRepeat            Repeat
+hi def link hclConditional       Conditional
+hi def link hclValueNull         Constant
+
+let b:current_syntax = 'hcl'
new file mode 100644
--- /dev/null
+++ b/runtime/syntax/terraform.vim
@@ -0,0 +1,17 @@
+" Vim syntax file
+" Language:    Terraform
+" Maintainer:  Gregory Anders
+" Upstream:    https://github.com/hashivim/vim-terraform
+" Last Change: 2024-09-03
+
+if exists('b:current_syntax')
+  finish
+endif
+
+runtime! syntax/hcl.vim
+
+syn keyword terraType string bool number object tuple list map set any
+
+hi def link terraType Type
+
+let b:current_syntax = 'terraform'