" terraform.vim - basic vim/terraform integration " Maintainer: HashiVim let s:cpo_save = &cpoptions set cpoptions&vim " Ensure no conflict with arguments from the environment let $TF_CLI_ARGS_fmt='' function! TerraformFmt() abort " Save the view. let curw = winsaveview() " Make a fake change so that the undo point is right. normal! ix normal! "_x " Execute `terraform fmt`, redirecting stderr to a temporary file. let tmpfile = tempname() let shellredir_save = &shellredir let &shellredir = '>%s 2>'.tmpfile silent execute '%!'.g:terraform_binary_path.' fmt -no-color -' let &shellredir = shellredir_save " If there was an error, undo any changes and show stderr. if v:shell_error != 0 silent undo let output = readfile(tmpfile) echo join(output, "\n") endif " Delete the temporary file, and restore the view. call delete(tmpfile) call winrestview(curw) endfunction function! TerraformAlign() abort let p = '^.*=[^>]*$' if exists(':Tabularize') && getline('.') =~# '^.*=' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p) let column = strlen(substitute(getline('.')[0:col('.')],'[^=]','','g')) let position = strlen(matchstr(getline('.')[0:col('.')],'.*=\s*\zs.*')) Tabularize/=/l1 normal! 0 call search(repeat('[^=]*=',column).'\s\{-\}'.repeat('.',position),'ce',line('.')) endif endfunction function! TerraformCommands(ArgLead, CmdLine, CursorPos) abort let commands = [ \ 'init', \ 'validate', \ 'plan', \ 'apply', \ 'destroy', \ 'console', \ 'fmt', \ 'force-unlock', \ 'get', \ 'graph', \ 'import', \ 'login', \ 'logout', \ 'output', \ 'providers', \ 'refresh', \ 'show', \ 'state', \ 'taint', \ 'untaint', \ 'version', \ 'workspace' \ ] return join(commands, "\n") endfunction let &cpoptions = s:cpo_save unlet s:cpo_save " ------------------------------------------------------------------------------ if exists('b:did_ftplugin') || v:version < 700 || &compatible finish endif let b:did_ftplugin = 1 let s:cpo_save = &cpoptions set cpoptions&vim " j is a relatively recent addition; silence warnings when setting it. setlocal formatoptions-=t formatoptions+=croql silent! setlocal formatoptions+=j let b:undo_ftplugin = 'setlocal formatoptions<' if !has('patch-7.4.1142') " Include hyphens as keyword characters so that a keyword appearing as " part of a longer name doesn't get partially highlighted. setlocal iskeyword+=- let b:undo_ftplugin .= ' iskeyword<' endif if get(g:, 'terraform_fold_sections', 0) setlocal foldmethod=syntax let b:undo_ftplugin .= ' foldmethod<' endif " Set the commentstring setlocal commentstring=#%s let b:undo_ftplugin .= ' commentstring<' if get(g:, 'terraform_align', 0) && exists(':Tabularize') inoremap = =:call TerraformAlign()a let b:undo_ftplugin .= '|iunmap =' endif let &cpoptions = s:cpo_save unlet s:cpo_save if !exists('g:terraform_binary_path') let g:terraform_binary_path='terraform' endif if !executable(g:terraform_binary_path) finish endif let s:cpo_save = &cpoptions set cpoptions&vim command! -nargs=+ -complete=custom,TerraformCommands -buffer Terraform \ execute '!'.g:terraform_binary_path.' '..' -no-color' command! -nargs=0 -buffer TerraformFmt call TerraformFmt() let b:undo_ftplugin .= '|delcommand Terraform|delcommand TerraformFmt' if get(g:, 'terraform_fmt_on_save', 0) augroup vim.terraform.fmt autocmd! autocmd BufWritePre *.tf call TerraformFmt() autocmd BufWritePre *.tfvars call TerraformFmt() augroup END endif let &cpoptions = s:cpo_save unlet s:cpo_save " ------------------------------------------------------------------------------ " https://github.com/jgerry/terraform-vim-folding " ------------------------------------------------------------------------------ function! TerraformFolds() let thisline = getline(v:lnum) if match(thisline, '^resource') >= 0 return ">1" elseif match(thisline, '^provider') >= 0 return ">1" elseif match(thisline, '^module') >= 0 return ">1" elseif match(thisline, '^variable') >= 0 return ">1" elseif match(thisline, '^output') >= 0 return ">1" elseif match(thisline, '^data') >= 0 return ">1" elseif match(thisline, '^locals') >= 0 return ">1" elseif match(thisline, '^terraform') >= 0 return ">1" else return "=" endif endfunction function! TerraformFoldText() let foldsize = (v:foldend-v:foldstart) return getline(v:foldstart).' ('.foldsize.' lines)' endfunction setlocal foldmethod=expr setlocal foldexpr=TerraformFolds() setlocal foldlevel=0 setlocal foldtext=TerraformFoldText() " ------------------------------------------------------------------------------