簡単・便利なvimの設定たち

#はじめに
本記事では、ちょっと設定しておくだけですごく便利になるvimの設定についてご紹介しようと思います。
設定ファイルはホームディレクトリに`.vimrc`というファイルを作成してそこに書き込む形を取ります。
ホームディレクトリ上で`ls -a`をして、`.vimrc`というファイルがなければ作成しましょう。

##vimのバージョン
自分が使っているvimのバーションは以下でした。

```
$ vim --version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled May  8 2021 05:44:18)
〜以下略〜
```

#便利な設定
##`set nu`
行番号を出力してくれます。
視覚的に今何行目にいるのかがわかるというのは結構ありがたいものです。
vimでの効率的作業には、効率のよいカーソル移動が欠かせません。
行番号があれば、すぐに目的の行を指定してそこに飛ぶことが可能になります。

###設定ありの場合
![549A9338-67F4-4002-9D47-5E3DA318570E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/b98c255f-5a55-379b-207a-62d690d69a63.jpeg)
例えば図のカーソル位置（３２行目）から６行目の`public:`に移動したいと思ったら、
ノーマルモードで`6G`などとすればすぐに移動できます。

###設定なしの場合
![0DD35EBF-1B3E-4C42-9D6F-05A58B97D998.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/ba3f96c1-5814-6342-70b1-97c2a57cb209.jpeg)
設定がない場合、`public:`が何行目なのかがパッと分かりません。
これでは少ないキーストロークでの移動は厳しいでしょう。

##`set tabstop=4`
タブ幅を空白４つ分に設定します。
多くのvimのバージョンでは、デフォルトで８になっていることが多いです。
ですが、８だとプログラムのコードを書く際などは少々見にくくなります。
特にネストが深くなってきた場合などは、結構見づらいです。
タブ幅は４がちょうどよい幅ではないかと思います。

###設定ありの場合
![054C125B-ED8C-4AF3-9857-99E3A512FAB1_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/f0dfbf17-8ccd-82f2-0dd3-2d0efa3f20d1.jpeg)

###設定なしの場合
デフォルトのタブ幅８の場合です。
![D101C5CE-FA79-4C37-AD8B-F6B1F9A32102_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/e19e4ee6-f415-1f7d-a623-360c479a486e.jpeg)
横に広がりすぎて、やや見にくいです。

##`set shiftwidth=4`
`set tabstop=4`を設定したのなら、もれなくこの設定もしておきましょう。
これは、ノーマルモード時の不等号記号(`<`or`>`)のシフト幅を４に設定するものです。
これもデフォルトで８になっている場合が多いので、タブ幅に合わせて変更しておいた方がよいでしょう。

###設定ありの場合
![5C2D3C6E-91E4-44D5-BED1-0E49ACAEFC5F_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/d800a391-70b3-de61-983c-ea454f7dab77.jpeg)
上図の状態から、`main`文内を`>`で右にシフトさせます。
![9765AA46-6F83-468B-B3C3-B522E574F622_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/95664fd4-a143-2b78-bfea-346ed2edd575.jpeg)

###設定なしの場合
![18C84201-9E86-4B10-B41A-B66867D9E9BD_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/c680d1f5-5827-3a38-dd99-3320fce87545.jpeg)
タブ幅とシフト幅が合っていないと、このように両方利用した際にバランスがおかしくなってしまいます。

##`set hls`
検索した際にマッチしたワードをハイライト表示してくれます。
ノーマルモードで`/`や`?`を使って文書内を検索できますが、その際にハイライト表示があるのとないのとでは、探索にかかる時間が大幅に変わってくるでしょう。

###設定ありの場合
![82EB222C-6B89-4DC8-BD8C-2026A9DCE5DC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/e7eadc1b-fd74-0439-bccc-186f69d6b4c2.jpeg)
`count`という単語を検索した結果です。
ヒットした単語が全てハイライト表示されていて、視覚的に非常に分かりやすいです。
文書内には`cout`という似た単語も混じっていますが、ハイライト表示があることでしっかりと区別することができています。

###設定なしの場合
![646E5369-DB1F-4F46-BE7E-560344C273FC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/2288c4ed-b182-67d7-0399-9526f10b3151.jpeg)
`set hls`を設定していない場合、検索を行うと最初にマッチした単語にカーソルが飛ぶだけで、検索結果自体が非常に分かりにくいですね。

##`set incsearch`
インクリメンタルサーチを可能にします。
インクリメンタルサーチとは、`/`や`?`で検索する際に、検索ワードを書いてEnterを押下してからではなく、検索ワードを書いている最中に、マッチする単語を常に探索してくれる機能です。
この機能があると、飛躍的に検索スピードが上がります。

###設定ありの場合
先程の説明では分かりにくいかと思うので、例を挙げます。
![1E19A3A6-2798-44A8-8578-0077BDEB2A1B_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/9aa09439-58c1-358a-050e-bd4a91dc7396.jpeg)
こんな文章が書かれたテキストファイルがあります。
図のカーソルの状態で、ノーマルモードから`/s`と打ってみます。![93C21E18-7D43-48C9-907F-9B666F4957B3_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/7df4e603-05ef-4d88-ff68-a7adc0fb5a30.jpeg)
まだEnterを押していませんが、最初にヒットした`s`に勝手に移動してハイライトしてくれました。
次に`e`を追加してみます。
![885AF08B-5061-4259-949F-9544DDD00D2E_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/2b816ee0-9561-0f85-20c5-531092ef85c2.jpeg)
今度は直近の`se`となっている部分に移動してハイライトしてくれました。
同じように今度は`a`を追加してみると、
![B05AF5B4-E8D8-41E8-A0C9-5853E8463E82_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/0685b4f2-0910-3872-7e98-40a447ac9de3.jpeg)
やはり直近の`sea`に移動してハイライトしてくれます。
この間、一切Enterを押下していません。

このように、インクリメンタルサーチでは、検索パターンを書きながらマッチする単語をリアルタイムで探索できるので、探索の効率がアップすること間違いなしです。

###設定なしの場合
![D1564BCC-4E1A-4C34-8BDA-FB7694E4AE24_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/e4c6208f-6721-b7fb-dca4-0071238ddfd1.jpeg)
![2EB1E052-BE85-4B90-BB91-50AE6A397056_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/c882ea73-d47f-f619-4807-546922f57ec1.jpeg)
![34824416-F01E-4834-806F-CD49FB87C5F0_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/a75e7430-51aa-9fbe-16d5-ccd1008c7183.jpeg)
先程の手順を実行しても、検索中はなんの変化も現れません。

##`colorscheme`
特定の単語の色を変えてくれます。
vimは、編集するファイルの拡張子をみて、なんのコードを書いたファイルを編集しているのかを判断します。この設定では、その言語で使われる特定の語（予約語や型、文字列など）を判別して、おおよそ種類ごとに色分けしてくれます。
例えば、`hello.c`というファイルをvimで開くと、vimはこれからC言語のファイルが編集されるのだと判断し、`#include`や`int`といった単語を色分けして分かりやすくしてくれるのです。

`colorscheme`の色分けには、さまざまな種類があり、好みのものを自由に選択できます。
使用可能なカラースキームを確認するには、ノーマルモードで`:colorscheme`と打ったあとに、`Ctrl+d`を押下します。
カラースキームを設定するには`colorscheme evening`のように、空白に続けてカラースキームを指定します。

※設定に際しては、`syntax on`も一緒に指定する必要があります。
※カラースキームを有効にするには、設定ファイルにこれも一緒に記載してください。

###設定ありの場合
`colorscheme evening`を設定したものです。
C++で書かれたコードを表示しています。予約語などが色分けされているのが分かります。
![E9EFD358-53A7-4247-A9DC-32E25F4BA8AC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/6d8fa71d-4388-8ce2-4c3b-695f85e8fc56.jpeg)

###設定なしの場合
なんの色分けもないと、変数や型、予約語などの区別がすぐにつきづらいです。
![5C22A0C4-3B05-42A7-8379-AF39E4CE6778.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/f5a2f2d0-91d0-805c-28e2-02fa98bdb9d1.jpeg)

##`set hidden`
隠しバッファを有効にします。
この設定は、vimで複数ファイルを編集したい時に役立ちます。

vimでは、編集中のファイルはメモリ上に展開されていて、編集中はメモリに対してのみ書き込みを行なっています。
そして、`:w`を行うことで初めてディスクに編集内容が書き込まれるという仕組みです。

vimは、メモリ上の編集ファイルの状態とディスク上の編集ファイルの状態が異なっている時に編集を終了しようとしたり、次のファイルを編集しようとしたりすると、警告してきます。
`:wq`とするところを、うっかり`:q`としてしまって以下のように怒られたことは、誰しも経験があると思います。
![CC56806A-00B8-4C97-A939-90F2D784C816_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/af70b470-bd67-12ed-f0f4-14573b9ed157.jpeg)
これは、編集してメモリ上の編集ファイルの内容が変わっているのに、保存していないからディスク上の編集ファイルの内容と同じになっていないため、このままでは終了できないと言ってきているのです。

複数ファイル編集時も同様です。
vimでは、起動時に引数として複数ファイルを指定すると、複数ファイル編集が可能になります。
`:args`と打てば、現在編集しているファイル群が表示されます。
この複数ファイル編集時に、あるファイルを編集中に保存をしないまま次のファイルを編集しようとすると、やはり上記のような文句をつけてきます。

保存して次のファイルに行けばいいのですが、一旦保存はせずに次のファイルを編集していきたいときもあるでしょう。
そんな時に役立つのが、`set hidden`です。
これを設定すると、保存をしないまま別のファイルを編集することが可能になります。

###設定ありの場合
`:args`と打った時の表示です。今、`hello.c`というファイルを編集しています。
![6CCBEB98-0583-41CA-B724-6F1D0E2FF554_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/d7efb52a-f8fd-37d2-2030-cc32123b44d2.jpeg)
この`hello.c`を適当に編集し、次の`hello.cpp`を編集するために、`:bn`と打ちます。
![B7B99714-422A-4047-A97A-3AA475A02055_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/42392bf0-fc70-1c7f-be00-79fdcac7cb1c.jpeg)
`hello.c`は保存していませんが、特に警告もなく次のファイルの編集を行えるようになりました。

ここで、`:ls`と実行してみましょう。
これは、メモリ上に展開されている編集ファイルの状態を表示してくれるものです。
![1D7196F9-D8FC-4E0E-9C1E-94A6CD4D956A_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/188a3311-c9fa-d2e0-2eda-dd885c91fa74.jpeg)
`hello.c`の横に「h」の文字があります。これが`hidden`の「h」です。
また「＋」の表示がありますが、これはメモリとディスクの状態が異なっていることを示しています。
`set hidden`を設定したことで、未保存状態の`hello.c`は「隠しバッファ」というメモリの領域に一時保存されているものと考えてもらえれば分かりやすいかと思います。

###設定なしの場合
今度は`set hidden`の設定なしで、同じことをやってみます。
![643C1947-B016-4CD6-BDE1-A0096457C02D_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/6f5f7de7-9214-2287-0e31-cee248288540.jpeg)
`hello.c`を適当に編集したあと、保存せずに`:bn`で次のファイルを編集しようとしたところ、上記のように怒られました。

`:ls`でメモリ上のファイルの状態を確認します。
![7DCAF5C4-BF18-40D3-87B6-AC915ACF14C3_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731510/e912298f-bf6f-5e63-c1c4-3c18b97a1bd0.jpeg)
`set hidden`の設定なしでは、何度トライしても「h」の文字が現れません。
つまり、編集中ファイルを一時保存する場所が利用できないため、編集をやめるには保存するか、「！」をつけて編集を破棄するかして、メモリとディスクの同期を取るまでは、そのファイルを移動できないのです。

#最後に
以上、簡単に設定できて便利なvimの設定の紹介でした。

ここに記載のないもので、皆さんが便利と思うものがあれば、
コメント欄に記載いただけると嬉しいです！

##参考図書
https://www.amazon.co.jp/実践Vim-思考のスピードで編集しよう-Drew-Neil/dp/4048916599