juliosueiras / vim-terraform-completion

A (Neo)Vim Autocompletion and linter for Terraform, a HashiCorp tool
MIT License
336 stars 24 forks source link
autocompletion hcl linter neovim terraform vim vim-terraform-completion

(Neo)Vim Terraform Completion with Linter - Demos

IMPORTANT: This plugin now allow version based completion

Changelog

Provider Versions

Community Provider Versions

neovim build vim build terraform version Join the chat at https://gitter.im/juliosueiras/vim-terraform-completion FOSSA Status

Terraform Module is supported(though there might be bugs)

Overview

asciicast

Block Completions

(R) for Require , (O) for Optional and (B) for Block

block completion

block 2 completion

Dependencies

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:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_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:syntastic_terraform_tffilter_plan = 1

" (Optional) Default: 0, enable(1)/disable(0) plugin's keymapping
let g:terraform_completion_keys = 1

" (Optional) Default: 1, enable(1)/disable(0) terraform module registry completion
let g:terraform_registry_module_completion = 0

Deoplete config

put this in your init.vim

let g:deoplete#omni_patterns = {}
let g:deoplete#omni_patterns.terraform = '[^ *\t"{=$]\w*'
let g:deoplete#enable_at_startup = 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>

Demo: asciicast

Community Providers

By default no community providers is enable, to use one, first refer to COMMUNITY_PROVIDER_VERSIONS.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(`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 on the same line to jump back) - [x] Show Doc (Ctrl-K) - [x] Provide config and example - [x] Integrate Basic `terraform validate` and `tflint` into 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

Demo of the linter

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 get` beforehand) - [x] Data - [x] Resource(with Provider) - [x] Parameter - [x] Adding Info to Argument and Attribute(Type not including ,since Info already indicate it) - [x] Variable - [ ] Cleaner code - [x] local/offline - [x] Add completion tags, ingress, and other subblock - [ ] Further seperate data source from resource

Todo for HCL

Credits

Contributors

License

FOSSA Status