Vimでterraformをさくさく編集できる環境を整える

この記事は[Vim2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vim2)の8日目の記事になります。
今回はvim-lspとterraform-lspを使ってtfファイルを快適にいじる環境を整える記事を書こうと思います。

増えろ！terraformer！

## terraformについて

terraformはHashiCorp.が開発・メンテナンスしているOSSの構成管理ツールです。
HCLという独自言語で記述して各リソースを定義・管理します。
AWS/GCP/AzureなどのパブリッククラウドやVMwareなどのHyperVisorなど幅広く対応しています。

一番の特徴は作成したリソースを`terraform destroy`で一括削除出来る点だと思っています。

## 本題
terraformを空きている人は実際どのエディタを使っているんでしょう。
大体の人はVSCodeでterraformの拡張機能を使っている人が多いのではないでしょうか。（偏見）

自分も最初はterraformの拡張機能をインストールしたVSCodeを使っていました。（vimキーバインドの拡張機能ももちろんセットで）
vim-lspを一度はインストールしてやってみようと思ったんですがぜんぜんやり方が分からなくて挫折していました。
vimconfに行ってvim-lspの話を聞いて熱がこもっってこれはやらねばならん!!!! と思いまして設定しました。
挫折したときはWindowsのterraformとterraform-lspをつかっていました。COREGA原因で出来なかったようです。（最後に少し書きます）

### 用意するもの

- WSL  ( Ubuntu 18.04 LTS )
- vim-plug
- terraform >= 12.0
- terraform-lsp

自分はプラグイン管理ツールはvim-plugをつかっているのでそれ用で書きます。

また、terraformは12.0から少し言語の仕様が変わっているので、12.0で動くものを作ります。

### terraform-lspの準備

ここにビルド済みのバイナリがあるので、
パスを通してあるところにビルド済みバイナリを配置します。
https://github.com/juliosueiras/terraform-lsp/releases/latest

juliosueiras氏にはいつもお世話になっています・・・

### プラグイン呼び出し部分

補完に必要なプラグインとシンタックスハイライトができるプラグインを導入します。

```vimscript:~/.vimrc
call plug#begin('~/.vim/plugged')
  Plug 'prabirshrestha/async.vim'
  Plug 'prabirshrestha/vim-lsp'
  Plug 'prabirshrestha/asyncomplete.vim'
  Plug 'prabirshrestha/asyncomplete-lsp.vim'

  Plug 'hashivim/vim-terraform' , { 'for': 'terraform'}

call plug#end()
```

### vim-lsp設定部分

LanguageServerを利用するための設定を導入します。
特に設定はせずに動きます。

```vimscript:~/.vimrc
if executable('terraform-lsp')
  au User lsp_setup call lsp#register_server({
    \ 'name': 'terraform-lsp',
    \ 'cmd': {server_info->['terraform-lsp']},
    \ 'whitelist': ['terraform','tf'],
    \ })
endif
```

Windows版で試して動かないときはなにか引数が必要なのかと思って調べようとしましたが
そもそもLanguageServerの仕様をどうすれば調べられるのかすらわからず・・・

### terraform-lspを使うには

これでterraform-lspを使う準備は完了です。

```terraform:main.tf
provider aws {
}
```


providerを記載して`terraform init`すれば準備完了、補完が聞くようになります。
その際にリソース名等をダブルクォーテーションで囲うとうまく補完効かなくなっちゃいます（何故だ・・・）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215868/19bcd946-e036-1a5a-fee2-14642809a3ea.png)


これでvimでtfファイルを使う準備が整いました。
よいterraformライフをおすごしください！


# おまけ
## この記事を書こうと思ったきっかけ
以前にもvimでterraform-lspの補完機能を使おうと思って挑戦してみていたのですがよくわからなくて挫折してました。
ですが、vimconfに行ってvim-lspの話を聞いて、モチベが爆あがりしたのでいろいろ遣りました。
割と作るのに苦労したので、これがアレばvimでterraformヲ使う人も増えてもっと自分の環境も快適になるかなと・・・

## Windowsでterraform-lspが動作しない
```
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\vim"
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\Users\\user\\go\\bin"
2019/11/15 00:56:45 (*errors.errorString)(0xc00019c190)(Failed to find plugin: aws. Plugin binary was not found in any of the following directories: [., C:\vim, terraform.d\plugins\windows_amd64, C:\Users\user\AppData\Local\Temp\.terraform\plugins\windows_amd64, C:\Users\user\.terraform.d\plugins, C:\Users\user\.terraform.d\plugins\windows_amd64, C:\Users\user\go\bin])

2019/11/15 00:56:45 [DEBUG] plugin dirs: []string{".", "C:\\vim", "terraform.d\\plugins\\windows_amd64", "C:\\Users\\user\\AppData\\Local\\Temp\\.terraform\\plugins\\windows_amd64", "C:\\Users\\user\\.terraform.d\\plugins", "C:\\Users\\user\\.terraform.d\\plugins\\windows_amd64", "C:\\Users\\user\\go\\bin"}
2019/11/15 00:56:45 [DEBUG] checking for provider in "."
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\vim"
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\Users\\user\\go\\bin"
2019/11/15 00:56:45 (*errors.errorString)(0xc00019c400)(Failed to find plugin: aws. Plugin binary was not found in any of the following directories: [., C:\vim, terraform.d\plugins\windows_amd64, C:\Users\user\AppData\Local\Temp\.terraform\plugins\windows_amd64, C:\Users\user\.terraform.d\plugins, C:\Users\user\.terraform.d\plugins\windows_amd64, C:\Users\user\go\bin])
```

これはWindowsで試そうと思って出来なくて、terraform-lspのログを追っかけてたときのものです。
`terraform init`したときにterraformは作業ディレクトリ配下にモジュールを配置するんですが、
そのディレクトリを見に行ってくれていない感があるなぁと思ってます。

もう少し余裕が出たらもう少し深堀りしてWindowsでもterraform出来る人を増やしたい・・・