From 51088b67cb1e9363df98cfc8f3bbd6caad03cc5d Mon Sep 17 00:00:00 2001 From: Gregory Anders <8965202+gpanders@users.noreply.github.com> Date: Wed, 4 Sep 2024 19:32:52 -0500 Subject: [PATCH] vim-patch:150b507: runtime(hcl,terraform): Add runtime files for HCL and Terraform (#30266) closes: vim/vim#15618 https://github.com/vim/vim/commit/150b5078ac886519083576124090489c3a21bd3b --- runtime/autoload/hcl.vim | 40 ++++++++++++++++++++++ runtime/ftplugin/hcl.vim | 10 ++++++ runtime/indent/hcl.vim | 16 +++++++++ runtime/indent/terraform.vim | 11 ++++++ runtime/syntax/hcl.vim | 66 ++++++++++++++++++++++++++++++++++++ runtime/syntax/terraform.vim | 17 ++++++++++ 6 files changed, 160 insertions(+) create mode 100644 runtime/autoload/hcl.vim create mode 100644 runtime/ftplugin/hcl.vim create mode 100644 runtime/indent/hcl.vim create mode 100644 runtime/indent/terraform.vim create mode 100644 runtime/syntax/hcl.vim create mode 100644 runtime/syntax/terraform.vim diff --git a/runtime/autoload/hcl.vim b/runtime/autoload/hcl.vim new file mode 100644 index 0000000000..2215fc8f27 --- /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 diff --git a/runtime/ftplugin/hcl.vim b/runtime/ftplugin/hcl.vim new file mode 100644 index 0000000000..c47a0378d0 --- /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 diff --git a/runtime/indent/hcl.vim b/runtime/indent/hcl.vim new file mode 100644 index 0000000000..b13d2c5649 --- /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<' diff --git a/runtime/indent/terraform.vim b/runtime/indent/terraform.vim new file mode 100644 index 0000000000..d62813d6a2 --- /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 diff --git a/runtime/syntax/hcl.vim b/runtime/syntax/hcl.vim new file mode 100644 index 0000000000..5e9349ab38 --- /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' diff --git a/runtime/syntax/terraform.vim b/runtime/syntax/terraform.vim new file mode 100644 index 0000000000..559dc79568 --- /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'