A (Neo)Vim Autocompletion and linter for Terraform, a HashiCorp tool
(Neo)Vim Terraform Completion with Linter - Demos
IMPORTANT: This plugin now allow version based completion
Changelog
Provider Versions
Community Provider Versions
Terraform Module is supported(though there might be bugs)
Overview
* Changelog * Dependencies * Installation + NeoBundle + Vim-Plug + Minimal Configuration + Deoplete config + Version config + Custom Provider - Community Providers - Specific Providers Config * General Todo * Todo for Terraform completion * Todo for HCL * Todo for Improvement * Credits * ContributorsBlock Completions
(R) for Require , (O) for Optional and (B) for Block

Dependencies
- vim-terraform (For FileType)
- vim-syntastic (Only for Linter)
- neomake (Only for Linter, Neovim)
- Deoplete (Neovim only, for completion)
- Ctags & tagbar (Optional for Tag Sidebar)
Installation
Require +ruby or +ruby/dyn for vim & json gem for ruby as well
Snippets completion is done through <C-X><C-K>
NeoBundle
NeoBundle 'hashivim/vim-terraform'
NeoBundle 'vim-syntastic/syntastic'
NeoBundle 'juliosueiras/vim-terraform-completion'
Vim-Plug
Plug 'hashivim/vim-terraform'
Plug 'vim-syntastic/syntastic'
Plug 'juliosueiras/vim-terraform-completion'
Minimal Configuration
" Minimal Configuration
set nocompatible
syntax on
filetype plugin indent on
call plug#begin('~/.vim/plugged')
" (Optinal) for Tag Sidebar " Plug 'majutsushi/tagbar'
Plug 'hashivim/vim-terraform' Plug 'vim-syntastic/syntastic' Plug 'juliosueiras/vim-terraform-completion' call plug#end()
" Syntastic Config set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%*
let g:syntasticalwayspopulateloclist = 1 let g:syntasticautoloc_list = 1 let g:syntasticcheckon_open = 1 let g:syntasticcheckon_wq = 0
" (Optional)Remove Info(Preview) window set completeopt-=preview
" (Optional)Hide Info(Preview) window after completions autocmd CursorMovedI * if pumvisible() == 0|pclose|endif autocmd InsertLeave * if pumvisible() == 0|pclose|endif
" (Optional) Enable terraform plan to be include in filter let g:syntasticterraformtffilter_plan = 1
" (Optional) Default: 0, enable(1)/disable(0) plugin's keymapping let g:terraformcompletionkeys = 1
" (Optional) Default: 1, enable(1)/disable(0) terraform module registry completion let g:terraformregistrymodule_completion = 0
Deoplete config
put this in your init.vimlet g:deoplete#omni_patterns = {}
let g:deoplete#omni_patterns.terraform = '[^ \t"{=$]\w'
let g:deoplete#enableatstartup = 1
call deoplete#initialize()
NOTE: For newer version of deoplete if the above doesn't work
let g:deoplete#omni_patterns = {}
call deoplete#custom#option('omni_patterns', { \ 'complete_method': 'omnifunc', \ 'terraform': '[^ \t"{=$]\w', \})
call deoplete#initialize()
Version config file
by default , all providers uses the latest version, but you can add a file call.tfcompleterc under working directory, and content can be this:
vsphere=1.0.3
aws=0.1.0
using the syatax of <provider>=<version>
Community Providers
By default no community providers is enable, to use one, first refer to COMMUNITYPROVIDERVERSIONS.md , then add a .tfcompleterc to your current working dir , for ex. to use Generic REST Api Provider, the .tfcompleterc would look like
restapi=master
Specific Providers
Google Beta Provider
To use completion for google beta provider, please use .tfcompleterc and put google=beta_<version>
General Todo
Todolist
- [X] Adapt to Upcoming terraform 0.10
- [X] Added a bot for auto pushing of new provider version
- [ ] (WIP) Refactoring Regex for linter and completion, and Trying out on api based(so it can integrade with other editor) solution
- [ ] (WIP) More test cases
- [x] Support for Neomake(Require further testing)
- [X] Run terraform plan and output to a new window(
<leader>rr) - [X] Async Run support(For Neovim/Vim 8)
- [ ] Move regex code to a json(for easier extension)
- [x] Test from zero to useful setup using Docker
- [x] Jump Reference (Ctrl-L first time to jump to resource definition, second time
- [x] Show Doc (Ctrl-K)
- [x] Provide config and example
- [x] Integrate Basic
terraform validateandtflintinto Synstatic - [x] Added a custom linter for providing a better error
- [ ] (WIP) Better linter
- [ ] (WIP) Full Snippets
NOTE: enabling deep check for tflint can be a bit slow
NOTE: To use tffilter please add export PATH=$PATH:/path/to/this/plugin/bin to your bashrc or zshrc
Todo for Terraform completion
Todolist
- [X] (Require more work) Lookup Attributes data using terraform.tfstate
- [X] Evaluate Interpolation
- [ ] (WIP) Custom Provider completion, might do Rest API style due to unstable custom provider
- [ ] Provider
- [x] Completion for functions(file,etc) and basic resource arguments(count,lifecyle, etc)
- [x] Module (Make sure you run
terraform getbeforehand) - [x] Data
- [x] Resource(with Provider)
- [x] Parameter
- [x] Adding Info to Argument and Attribute(Type not including ,since Info
- [x] Variable
- [ ] Cleaner code
- [x] local/offline
- [x] Add completion tags, ingress, and other subblock
- [ ] Further seperate data source from resource
Todo for HCL
- [ ] Add Completion for hcl
- [X] Completion for Sublock(Indicate by
Type(B))
Todo for Improvement
- [X] Add Travis-CI for testing, and ensuring the completion is outputing the right completion
- [X] Look into the new module registry (Now support module name completion)
- [X] Add config for allowing multiple version for providers
Credits
- Provider Model Extraction script adapted from Intellij-hcl
- Completion data is from Terraform Official Documentation and Model data from Intellij-HCL
- Folding adapted from vim-terraform

