僕のNeovim/Vim環境周りについて

この記事は[あくあたん工房 クリスマスアドベントカレンダー2020](https://adventar.org/calendars/5541)の6日目の記事として書かれたものです。

---

# はじめに
Neovim/Vimを使い始めて1年半程、自分が求める操作感や機能などを追加してきました。
いい感じにNeovim/Vim環境が出来上がってきたので、dotfilesと使用しているプラグインの紹介をしてみたいと思います。

# 環境
```
PC     | ASUS ZenBook UX303LN
OS     | Arch Linux x86_64
Kernel | 5.9.9-arch1-1
vim    | 8.2.1989
neovim | 0.4.4
```

# Neovim/Vim
<img width="1326" alt="image.png (1.4 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/28/84381/66918c25-fe0d-446a-bf2c-dc4b0980f4c5.png">

[C言語でCUnitを使っていい感じにテストをする方法](https://qiita.com/Hiroya_W/items/dd2e682718fac5b44db2)の記事を書くためにC言語でプログラムを書いていた様子ですが、こんな感じで使ってます。
普段使いにはNeovimを使っていますが、一部Vimの方が使いやすいプラグインがあるので、それを使いたいときだけVimを使い分けています。

# dotfiles
僕が使っているNeovim/Vim用のdotfilesはGitHubに乗せてあるので気になったら見てみてください。
## Vim
[vimrc](https://github.com/Hiroya-W/dotfiles/blob/master/.vimrc)
[.config/vim](https://github.com/Hiroya-W/dotfiles/tree/master/dotconfig/vim)

## Neovim
[.config/nvim](https://github.com/Hiroya-W/dotfiles/tree/master/dotconfig/nvim)

# Arch Linuxでclipboardを使う方法

```
$ sudo pacman -S vim
```

でインストールできるVimではclipboardに対応していません。

そこで、[extra/vim](https://www.archlinux.org/packages/extra/x86_64/vim/)の代わりに、[extra/gvim](https://www.archlinux.org/packages/extra/x86_64/gvim/)を使うようにすればよい。

```
$ sudo pacman -S gvim
```

# vimrc, init.vim
中身のほとんどはよく見る設定だと思う。
1つ触れておくことがあるとすれば、LaTeXのアンダーバーの扱いをいい感じにして、間違ったエラー表示をしないようにする設定を用意していること。

LaTeXで、図表や数式のrefとして、reffig、 reftab、refsec、 refeqnなどを用意している人は書いておくと良いかもしれない。

[Vim の ft-tex-syntax で \reffig も \ref と同様にハイライトする方法](https://www8281uo.sakura.ne.jp/blog/?p=424)

# Neovim向けPython仮想環境
Neovim用のPython仮想環境を用意してそれを使うようにしています。

例えば、Python2.7.18の仮想環境をneovim2、Python3.8.5の仮想環境をneovim3という名前で作成してそのパスを指定しておきます。

```vimrc:init.vim
let g:python_host_prog = '/home/hiroya/.config/nvim/neovim2/bin/python'
let g:python3_host_prog = '/home/hiroya/.config/nvim/neovim3/bin/python'
```

# プラグイン
ここからは、僕が使っているプラグインを列挙していきます。

## [Shougo/dein.vim](https://github.com/Shougo/dein.vim)
Neovim/Vim用プラグインマネージャ

## [ayu-theme/ayu-vim](https://github.com/ayu-theme/ayu-vim)
Neovim/Vimのカラーテーマ
僕は、darkのカラーテーマが好き

<img width="500" alt="image.png (415.2 kB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/82518e23-a657-495b-8083-5dba99c714b1.png">

## [vim-airline/vim-airline](https://github.com/vim-airline/vim-airline)
ステータス表示、バッファのタブ表示をかっこよくしてくれるしてくれるやつ

<img width="557" alt="68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f3330363530322f313037323632332f34346332393261302d313439352d313165332d396365362d6463616461336631633533362e676966.gif (148.6 kB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/e7b39710-389a-4a9d-bc72-f5d2c542e9a7.gif">

## [vim-airline/vim-airline-themes](https://github.com/vim-airline/vim-airline-themes)
vim-airlineのカラーテーマ
vim-airlineを使うなら、これを使って好きなテーマに設定すると良い
僕は、Neovim/Vimのカラーテーマと合わせて、ayuのカラーテーマを使っている

## [junegunn/fzf.vim](https://github.com/junegunn/fzf.vim)
開きたいファイル名、バッファ名などをあいまい検索できるツール
ファイルの中身をプレビューしながら見ることもできるのでわかりやすい

<img width="1946" alt="image.png (2.2 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/7b32ba01-323c-42e2-bf13-3d4b96f1063c.png">

## [tpope/vim-fugitive](https://github.com/tpope/vim-fugitive)
Vim上からGitの操作ができるやつ
これを入れる前は、Vimで編集したら`Ctrl+Z`で抜けてgit commitしてfgしてVimに戻ってくる、という感じに使っていたけど
これだと、Vimから抜ける必要がないのでとても楽

<img width="1946" alt="image.png (2.3 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/1bce2d0b-3126-4e9c-9fe8-b5f20fe1b873.png">

## [airblade/vim-gitgutter](https://github.com/airblade/vim-gitgutter)
ファイルの差分を行番号の左側に表示してくれるやつ
stageする機能もあるようだが、僕は表示をするためにしか使っていない

<img width="1766" alt="image.png (577.7 kB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/800f8aa1-9799-4bf8-9435-423a2c2f38c2.png">

## [cohama/lexima.vim](https://github.com/cohama/lexima.vim)
括弧を入力したときに、自動的に閉じ括弧を挿入してくれるやつ
閉じ括弧忘れのシンタックスエラーは頻繁に起こるので、入れておくとミスは少なくできる
括弧の中で改行した時のインデントも自動でつけてくれる

<img width="600" alt="output2.gif (2.6 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/57c5fa52-b20e-4366-8fe0-58de1d7cef6e.gif">

## [tpope/vim-surround](https://github.com/tpope/vim-surround)

括弧などの囲みに対する操作ができるようになるやつ
gif画像では、

- "で囲まれた部分の"を消す
- 選択範囲を"で囲む
- "で囲まれた部分の中身を消す
- "で囲んでいた部分を'で囲むようにする

という操作をしている。

<img width="600" alt="output3.gif (3.0 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/3cf3ce37-1a76-4c60-a99f-229f7ba491bd.gif">

## [junegunn/rainbow_parentheses.vim](https://github.com/junegunn/rainbow_parentheses.vim)
括弧に色を付けるやつ
括弧の対応が分かりやすくなるので、閉じ括弧忘れのミスが減る

<img width="826" alt="image.png (667.2 kB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/b7b336e6-3a13-4d7e-aeb0-f24d430f5475.png">

## [simeji/winresizer](https://github.com/simeji/winresizer)
分割された画面のサイズを簡単に変更できるようにするやつ

<img width="561" alt="68747470733a2f2f7261772e6769746875622e636f6d2f77696b692f73696d656a692f77696e726573697a65722f696d616765732f64656d6f2d666f722d7465726d696e616c2e676966.gif (2.0 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/f446c269-fce5-43fa-918d-0d3da4fbc327.gif">

## [neoclide/coc.nvim](https://github.com/neoclide/coc.nvim)
**Make your Vim/Neovim as smart as VSCode.**
最強。
Neovim/Vimで各言語のLSPを使う設定って結構ややこしいことが多い。
けど、coc.nvimはそこらへんを全部やってくれる

### coc向けextentions
[Implemented coc extensions](https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions#implemented-coc-extensions)

大体の言語のextentionが用意されているので、それを使うだけ。

実は、VSCode向けのextentionを利用しているらしい。おかげで、非常に安定しているし、設定ファイルの記述方法もVSCodeとほぼ変わらないことが多い。
とりあえず、[coc-explorer](https://github.com/weirongxu/coc-explorer)と、 [coc-snippets](https://github.com/neoclide/coc-snippets)を入れておいて、後は好きな言語のextentionを入れていけばいいと思う。

- [coc-clangd](https://github.com/clangd/coc-clangd) … C/C++/Objective-C
- [coc-python](https://github.com/neoclide/coc-python) …Python
- [coc-rust-analyzer](https://github.com/fannheyward/coc-rust-analyzer) …Rust
- [coc-texlab](https://github.com/fannheyward/coc-texlab) … LaTeX

### [coc-explorer](https://github.com/weirongxu/coc-explorer)
エクスプローラー
<img width="1246" alt="image.png (101.4 kB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/3dfa348c-efac-4cf1-ba43-3c924443dd96.png">

### [coc-snippets](https://github.com/neoclide/coc-snippets)
スニペットを作成して使用できるようにするやつ
<img width="708" alt="54837017-62891300-4d00-11e9-9e53-49742a1a33f2.gif (46.1 kB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/c1ecbd35-8e47-490f-959c-7324a04d59c8.gif">

## [liuchengxu/vista.vim](https://github.com/liuchengxu/vista.vim)
coc-nvimと連携して、定義されているマクロ、関数、変数といったシンボルを表示、シンボルへ移動ができる
<img width="700" alt="56469894-14d40780-6472-11e9-802f-729ac53bd4d5.gif (7.4 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/62ee2ef8-d507-466d-a071-123198ba6bc3.gif">

## [tyru/caw.vim](https://github.com/tyru/caw.vim)
VSCodeにある`Ctrl+/`でコメントの切り替えができるようにするやつ
ファイルタイプからコメントの記述方法を推測しているが、ほとんどのファイルタイプに対応している。

僕は、`Ctrl+\`に割り当てている。

<img width="600" alt="output4.gif (1.1 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/f2f76b1d-d0d0-4db9-a64a-52a859e8e3e4.gif">

## [puremourning/vimspector](https://github.com/puremourning/vimspector)
Neovim/Vimでデバッガを起動するやつ
VSCode用のデバッグアダプタであるdebugpy、 vscode-cpptools、CodeLLDBなどを、利用したい言語に合わせてダウンロードして利用している。
なので、VSCodeでデバッグできるならVimspectorでもデバッグできる（はず）。
<img width="1280" alt="image.png (787.0 kB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/4a448069-1682-4ca5-acd3-8919d9ad405a.png">

これはNeovimじゃなくて、Vimで使うようにした方が本領発揮できる。
なぜなら、Vimspectorでは以下の機能を利用するが、Neovimには実装されていないからである。
これらの機能を使って提供されている部分が使えないだけなので、Neovimでも使えることには使える。

- Winbar
- プロンプトバッファ
- バルーン

# おまけ
ここからはNeovim/Vimの話から逸れて、ターミナルとかツールの話に触れさせてください。
直接関係はしないけど、知っておくとNeovim/Vimを触るのが楽しくなると思います。

# 軽量ターミナル
ちょっとファイル編集したいなって思った時に、ターミナルの起動がちょっとだけでも早ければ体感の快適さは向上すると思っています。

## rxvt-unicode
[urxvt こと rxvt-unicode を使うことのメモ](http://malkalech.com/urxvt_terminal_emulator)
今までは、rxvt-unicodeというターミナルを使っていました。
これは、デーモンを作っておいて、そこからクライアントを起動するのでメモリ使用量を少なく、爆速で起動できる点が優れています。
すぽぽぽぽって出てくるととても爽快。

<img width="1280" alt="output.gif (7.1 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/2179dc5c-b79d-4f89-a692-c908b295b613.gif">

ただ、
- True Colorに対応していない
- 絵文字を上手く表示できなときがある
- Noto Color Emojiは一切表示できない

っていう、問題があります。例えば、こんな感じ。

<img width="1622" alt="image.png (1.1 MB)" src="https://img.esa.io/uploads/production/attachments/9758/2020/11/29/84381/f8f2918d-48b3-447e-8753-aff3f3a82206.png">

これらは、有志によりパッチが当てられたものがあります。

- 「True Colorに対応していない」については、[rxvt-unicode-truecolor 9.22-7](https://aur.archlinux.org/packages/rxvt-unicode-truecolor/)だが、絵文字は上手く表示出来ないときがある。
- 「絵文字が上手く表示できない」については[rxvt-unicode-wcwidthcallback 9.22-4](https://aur.archlinux.org/packages/rxvt-unicode-wcwidthcallback/)だが、True Colorに対応してなかったり、日本語フォントが汚かったりする。

が、残念ながら、今の所、どちらにも対応したパッチは見つけられませんでした。

絵文字なんかいらないぜって人には[rxvt-unicode-truecolor 9.22-7](https://aur.archlinux.org/packages/rxvt-unicode-truecolor/)が良いと思うし、数ヶ月僕はこれを使っていました。

## Alacritty
今はこれを使っています。
[Alacritty](https://github.com/alacritty/alacritty)はRust製の爆速ターミナルで、GPUでレンダリングするので早いのが特徴。
十分すぎるくらいに早いし、rxvt-unicodeで挙げた問題は無いし、細かい設定も一切いらない。

ただし、日本語のインライン入力ができないという問題点があります。
変換前や変換中には表示されなくて、Enterで確定した時点でようやく表示されるのですが、それさえ気にならなければいいと思います。

# C/C++向けプロジェクトで合わせて使うと良さそうなやつ
## [compiledb](https://github.com/nickdiego/compiledb)
C/C++向けプロジェクトにおいて、

- Makefileを作ってる
- C/C++向けのLSPとしてclangdを使っている時(coc.nvimでclangdのextentionを入れているなど)

の時は、compiledbを合わせて使うと幸せになれると思う。

ライブラリのリンクなど、Makefileに書いてあるものを利用して、clangd用設定ファイル(compile_command.json)を生成してくれるので、リアルタイムにエラー出力をしてくれるようになります。

## .clang-format
coc.nvimとclangdを使えば、ファイル保存時に自動でフォーマットしてくれるようにもできます。
その際にどのようにフォーマットするかを`.clang-format`に記述します。
僕はとりあえずこれぐらいの設定を書いています。

```text:clang-format
BasedOnStyle:  Google

ColumnLimit: 0
IndentWidth: 4
Language: Cpp
Standard: Cpp11
TabWidth: 4
UseTab: Never
```

# 透明化
記事のトップに載せているスクリーンショットのように、Neovim/Vimを透明化させるのが好きです。
今は、コンポジットマネージャの[picom](https://wiki.archlinux.jp/index.php/Picom)を使ってターミナル自体を透明化させています。
なので、背景だけではなく、文字も若干半透明になっているが、特に気にならないのでこのまま運用しています。

# おわりに
1年半前は、[【Vim初心者】Vimを整えたいんだが、何からすればええんや？](https://qiita.com/Hiroya_W/items/7906ca7c4961cc147d4e)とか言ってたのですが、とうとうこの領域まで来たか、と感じています。
とても扱いやすく仕上がってきたのですが、これは、いろんな方が記事をまとめてくれているおかげです。感謝しかありません。

オリジナルの記述はほとんど無いので、今回は僕が使っているプラグインをまとめてみました。
次、Neovim/Vimネタを書くときは自分でスクリプト書いていい感じにしたときだと思います。
挑戦してみたいと思います。