脱vim新人！これさえ知っておけば

2015年ニジボックス Advent Calendar24日目の記事です。

# 脱vim新人！これさえ知っておけば
## 前置き
vimはLinux上の**エディター**として知られています。使いこなせば、かなり効率的にコードを書けるようになります。もちろん使いこなすまで、それほどの勉強コストがかかります。ただし基本設定でさえしっかりやったら大分変わります。本文でvimの設定周りを紹介したいと思います。
## マイvimrc
### vimrcとは
まずは基本その一です。
**ユーザーディレクトリの直下でファイル名が「.vimrc」になる設定ファイルを作成できます。**
そのようなファイルが存在したら、該当ユーザーがvimを開いた時自動で読み込む仕様です。
下はいつも愛用しているマイ設定です。

```
"""""""""""""""""""""
" 基本設定
"""""""""""""""""""""
" ウインドウのタイトルバーにファイルのパス情報等を表示する
set title
" 行番号を表示する
set number
" カーソルの行を目立つ
set cursorline
" ペア括弧やを表示する
set showmatch

"""""""""""""""""""""
" 配色
"""""""""""""""""""""
" 構文毎に文字色を変化させる
syntax on
" カラースキーマの指定
colorscheme desert
" 行番号の色
highlight LineNr ctermfg=darkyellow

"""""""""""""""""""""
" 検索
"""""""""""""""""""""
" 検索ワードの最初の文字を入力した時点で検索を開始する
set incsearch
" 小文字のみで検索したときに大文字小文字を無視する
set smartcase
" 検索結果をハイライト表示する
set hlsearch

"""""""""""""""""""""
" タブ&インデント
"""""""""""""""""""""
" タブの代わりに空白文字を挿入する
set expandtab
" タブ文字の表示幅
set tabstop=4
" Vimが挿入するインデントの幅
set shiftwidth=4
" 行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする
set smarttab
" 改行時に前の行のインデントを継続する
set autoindent
" 改行時に入力された行の末尾に合わせて次の行のインデントを増減する
set smartindent

"""""""""""""""""""""
" その他
"""""""""""""""""""""
" 他で書き換えられたら自動で読み直す
set autoread
" スワップファイルを生成しない
set noswapfile
" 入力中のコマンドを表示する
set showcmd
" コマンドモードでTabキーによるファイル名を補完する
set wildmenu
" カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
" 変更中のファイルでも、保存しないで他のファイルを表示
set hidden

"""""""""""""""""""""
" キーマッピング
"""""""""""""""""""""
" 括弧
imap { {}<LEFT>
imap [ []<LEFT>
imap ( ()<LEFT>
" ペストモード
nnoremap pt :set paste<CR>
nnoremap np :set nopaste<CR>
```
これで「.vimrc」を名前にしたファイルを保存したら、再度vim開くと設定が適用されます。
全く設定されてない場合は、これだけでvimは一新になります。
下で具体的に説明していきます。

## 基本設定

![未設定](https://qiita-image-store.s3.amazonaws.com/0/41234/b22530de-6136-9ed3-ba5a-178a415f4fa4.png)
-----
![基本設定](https://qiita-image-store.s3.amazonaws.com/0/41234/1cfba525-f4a5-25ac-d167-3eda807e158e.png)
上のスクショ二枚が基本設定が実施前後の差分です。
ご覧のとおり、ウインドのタイトルがファイル名を表示するようになり、行番号、カーソルの行が出るようになりました。
行番号が出てくれるのがいいですが、たまにvimを開いたままでマウスで選択してコピーしたい時がありますが、行番号も入っちゃって困ります。
ここでvim基本その二です。
**vimrcの項目が大体「:」で開くコマンドモードで実行できる。**
上の状況に対してvim画面で「**:set nonumber**」を実行したら、行番号が消えてなくなります。

## 配色
![配色](https://qiita-image-store.s3.amazonaws.com/0/41234/8eb4cec8-3255-b76b-bc49-e6d6cb64b720.png)
色ついたら一気にIDEっぽくみえますね。
ただし、カラー指定のところの「desert」は何？それ以外選択肢はないの？カスタマイズできないか？などなどの質問があるだろう。
実はvimのインストールパスの下で「colors」というフォルダがあって、中身はこんな感じです。
![colors](https://qiita-image-store.s3.amazonaws.com/0/41234/c0a3dbd4-8b77-324e-6ce0-500d29e8786a.png)
「desert」あった！ここ羅列されたのは配色の選択肢です。「desert」の部分を他の設定ファイルを指定したら、違う配色になります。
ネット上で「vim colorscheme」で検索して、先人たちが作った配色設定ファイルをここにおいたらもちろん使えます。中身を開いて自分でいじることも可能です。

## 検索オプション
![search](https://qiita-image-store.s3.amazonaws.com/0/41234/f0fbe280-1b2f-5763-4155-1c9d6bffa0b3.gif)

検索オプションが追加されたら、入力しながら検索してくれます。なお結果がハイライトで表示してくれます。ハイライトが邪魔だと思うなら、前述のように「:nohlsearch」(略称:noh)で消すことは可能です。

## タブ&インデント
タブがスペース4つで入れ替えるのはよくあるコーディングスタイルです。そのようなファイルをvimで編集するとこうなります。
![tab](https://qiita-image-store.s3.amazonaws.com/0/41234/1a3c9b47-3038-8d8c-5144-559885d72b60.gif)
位置ずれるし、改行するとカーソルが一番先頭になります。
上の「タブ&インデント」を施すとこうなります。
![tab2](https://qiita-image-store.s3.amazonaws.com/0/41234/667f5252-aa7b-34ab-b34f-f564477d8a3c.gif)
タブがスペースになり、改行の際自動でインデントしてくれます。
ただしそれも不便な時があります。ペストしたら大惨事になります。
![indent](https://qiita-image-store.s3.amazonaws.com/0/41234/3f58c80e-cd4c-05c0-d084-397cd33ff7a1.gif)
コマンドモードでタブとインデント関連の設定を全部Offにするのは流石にめんどくさい、このためにvimがペストモードがあります。ペストする前に一度「:set paste」で切替できます。
画面下のモード表記が「-- INSERT --」から「-- INSERT(paste) --」になります。
![paste](https://qiita-image-store.s3.amazonaws.com/0/41234/f3440d3f-7840-54ae-8778-341baa2cbbc7.gif)
「:set nopaste」でペストモードを終了できます。下の内容でこのステップをもっと簡単にすることができます。

## キーマッピング
キーマッピングを設定すると、長いコマンドの入力や複数回の操作をショートカットできます。
キーマッピングは基本下のフォーマットで設定します。

```
◯◯map ショートカット 本来の操作
```
「◯◯map」の部分によりどのモードのキーマッピングを決めます。

|モード 								|再割当無し	|再割当有り	|
|-----------------------------------|-----------|-----------|
|ノーマルモード＋ビジュアルモード		|noremap 	|map		|
|コマンドラインモード＋インサートモード	|noremap!	|map!		|
|ノーマルモード 						|nnoremap	|nmap		|
|ビジュアル(選択)モード 				|vnoremap	|vmap		|
|コマンドラインモード 					|cnoremap	|cmap		|
|インサート(挿入)モード 				|inoremap	|imap 		|


上のペストモードの切り替えと解除がvimrc最後の二行で設定されています。
「<CR>」が特殊キーの「ENTER」です。これで「pt」を押すだけで「:set pasteエンター」を実行します。
下が特殊キーの一覧です。

|特殊キー						|表記|
|-------------------------------|---|
|Back Space					|\<BS\>|
|Tab							|\<Tab\>|
|Enter						|\<Enter\>|
|同上							|\<CR\>|
|同上							|\<Return\>|
|Escape						|\<Esc\>|
|Space						|\<Space\>|
|(パイプ)					|\<Bar\>|
|Delete						|\<Del\>|
|カーソルキーの上(↑)			|\<Up\>|
|カーソルキーの下(↓)			|\<Down\>|
|カーソルキーの左(←)			|\<Left\>|
|カーソルキーの右(→)			|\<Right\>|
|F1							|\<F1\>|
|F2							|\<F2\>|
|F3							|\<F3\>|
|F4							|\<F4\>|
|F5							|\<F5\>|
|F6							|\<F6\>|
|F7							|\<F7\>|
|F8							|\<F8\>|
|F9							|\<F9\>|
|F10							|\<F10\>|
|F11							|\<F11\>|
|F12							|\<F12\>|
|Home						|\<Home\>|
|End							|\<End\>|
|PageUp						|\<PageUp\>|
|PageDown					|\<PageDown\>|
|テンキーの Home				|\<kHome\>|
|テンキーの End				|\<kEnd\>|
|テンキーの PageUp				|\<kPageUp\>|
|テンキーの PageDown			|\<kPageDown\>|
|テンキーの +(プラス)			|\<kPlus\>|
|テンキーの -(マイナス)			|\<kMinus\>|
|テンキーの *(アスタリスク)		|\<kMultiply\>|
|テンキーの /(スラッシュ)		|\<kDivide\>|
|テンキーの Enter				|\<kEnter\>|
|テンキーの .(ピリオド)			|\<kPoint\>|
|テンキーの 0					|\<k0\>|
|テンキーの 1					|\<k1\>|
|テンキーの 2					|\<k2\>|
|テンキーの 3					|\<k3\>|
|テンキーの 4					|\<k4\>|
|テンキーの 5					|\<k5\>|
|テンキーの 6					|\<k6\>|
|テンキーの 7					|\<k7\>|
|テンキーの 8					|\<k8\>|
|テンキーの 9					|\<k9\>|

キーマッピングが便利に見えるが、入れ過ぎると忘れちゃうので、程々にしたほうがいいかと思います。

## まとめ
vimを使いこなすには各モードの特性、操作、コマンドなどなどで工夫しないといけないが、今回の設定を把握しただけで使いやすさが一新できるだろうと思います。

最後の一言
**Emacs愛用者の皆さん、やっぱvimが一番使いやすいエディターですね。┐(-｡ｰ;)┌**