最低限の手間で、開発にも使えるVim環境を構築する。

最低限の手間で、簡易的に開発にも使えるVim環境の構築を目指します。
最近取り組んでいるシンプルに環境を作るシリーズの一環です。

- [#1 WSL2向けUbuntu20.04の初期設定](https://qiita.com/YuukiMiyoshi/items/eec3c1827cd8356c1def)
- [#2 文化的なfish環境を得る為の最短ルート](https://qiita.com/YuukiMiyoshi/items/4a52516744530cd60e47)

# 環境

WSL2上のUbuntu20.04で作業しています。

# 目標

やること
1. Vim8のインストール／更新
2. プラグインマネージャ（vim-plug）のインストール
3. LSP[^1]を用いた各種プログラム言語の補完機能
4. ステータスラインをドレスアップ
5. Linter[^2]の導入（Python/Go/Dockerを例として）

やらないこと
・Vimから離れられなくなるあれやこれや

[^1]: LSP (Language Server Protocol）は補完や定義ジャンプなど、プログラミング時に役立つ機能を提供するための仕組みです。
[^2]: Linterは一定の基準に従ってプログラムの誤りや書式のズレをチェックして指摘してくれる機能です。Pythonなど広く使われている言語にはこのチェック基準が複数あり、後半で登場するflake8もそんなチェック基準のうちの一つを提供するツールです。

## Vim8のインストール／更新

Ubuntu20.04にはデフォルトでvim8.1が入っていますが、LSP機能を提供するプラグイン（coc）を利用する場合に[vimは8.2以上の方が良い](https://kashewnuts.github.io/2020/04/08/migrated_lsp_client_to_coc_nvim.html)ようなので更新します。

```sh
# リポジトリの追加
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update

# インストールを実施
sudo apt install vim

# 確認
vim --version
> VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jan 08 2021 14:00:27)
```

## Nodejsをインストール

cocを動作させるにはnodejs 10.12以上が必要です。マニュアルにありませんがnpmも必要なので一緒に入れます。

nodejs v14系など、もっと新しいものを入れたい場合は[nodesource](https://github.com/nodesource/distributions)などを参照してください。

```sh
sudo apt install nodejs npm

node --version
> v10.19.0
npm --version
> 6.14.4
```

## プラグインマネージャ（vim-plug）をインストール

https://github.com/junegunn/vim-plug

vimのプラグインマネージャはVundleなどもありますが、cocの公式ドキュメントがvim-plugを使っていたので合わせます。


```sh
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

存在しない場合は~/.vimフォルダを同時に作成します。

## vim8の設定ファイルを作成

次の内容で~/.vim/vimrcを作成します。
vimでコピペする場合にインデントや自動コメントで結果が崩れる場合は「:set paste」の投入後に張り付けるとよいです。

```vim
"
" 通常のオプション
"

" lightlime利用のためにステータスラインを2行にする
set laststatus=2

" ビープ音を消します
set belloff=all

" コメントを灰色へ変更
hi Comment ctermfg=gray

"
" 以降、Pluginのための記述
"
call plug#begin('~/.vim/plugged')

" ステータスラインをかっこよくします
Plug 'itchyny/lightline.vim'

" coc
Plug 'neoclide/coc.nvim', {'branch': 'release'}

call plug#end()
```

## プラグインのインストールを実行

次のコマンドで上記設定ファイルに記述したプラグインをインストールします。

```sh
vim +PlugInstall +qall
```

あるいは、vimのコマンドラインモード（EXモード）で次のコマンドを入力します。
（コピペはコロンの右側「CocInstall coc-python」のみです。以降同様です。）

```vim
:PlugInstall
```

ここまでで冒頭の「やること」の4.までが完了しました。

## 言語毎のlinterなどの導入

Vimを開発に使う場合は、vim-pythonのような言語毎のvimプラグインをインストールする方も多いと思いますが、最近はVSCodeのおかげもありLSP環境が充実してきているので本記事ではcocのエクステンションを用いる方針で環境構築します。

### Python

ここではflake8を利用する想定で解説します。
（venvやpyenvなど環境管理ツールを使っている場合はそれぞれの方法で環境をアクティベートした状態で実施してください。何を言っているか分からない方は無視していただいて問題ないです）

flake8をインストール

```sh
pip install flake8
```

vimのコマンドラインモードでcoc-pythonをインストール

```vim
:CocInstall coc-python
```

.pyファイル編集時にlinterを聞かれるのでflake8を選択します。

### Go言語

https://github.com/josa42/coc-go

goplsをインストール

```sh
GO111MODULE=on go get golang.org/x/tools/gopls@latest
```

vimのコマンドラインモードでcoc-goをインストール

```vim
:CocInstall coc-go
```

### Docker

https://github.com/josa42/coc-docker

```vim
:CocInstall coc-docker
```

docker-compose用にyamlのプラグインも入れておく

```vim
:CocInstall coc-yaml
```

# 補足

vimrcのコピペで導入したプラグインの説明など。

## lightline

https://github.com/itchyny/lightline.vim

ステータスラインを綺麗にするプラグインです。
インサートモードとコマンドモードで色が変化して便利です。

## coc

https://github.com/neoclide/coc.nvim

LSPを使用して各種言語の保管やLint機能を提供します。

## その他プラグイン探しの参考として

[よく使われているvimのプラグイン top20](https://qiita.com/reireias/items/5364dcaada1a5b88a206)

# 最後に

ここ数年、私はNeovimを使ってきました（VSCodeも使っていますが）。今もNeovimに不満はなく、lspやらファイラーやら整備して便利に使っています。今回は仕事でAWS EC2上のUbuntuで作業する用事があり、ここにNeovim環境を再構築するのは気が引けたので、シンプルながらソコソコ使えるVim8環境を目指した結果を記事にしました。

Vim8を本格的に使うのは初めてなので、なるべく定石と思われる方法を心がけていますが勘違いが混ざっていたらご指摘いただけるとありがたいです。投稿時点で完成ではなく、おかしな点など随時更新していきたいと思います。シンプルな設定を目指しているためプラグインのLazyLoadなどvimユーザからすると物足りないかもしれませんがコンセプトとしておおめに見ていただければと思います。