Vimをカスタマイズしよう 〜 Vimはいいぞ!ゴリラと学ぶVim講座(6)

こんにちは。
ゴリラ.vimを運営しているゴリラです。

これまで5回の連載に渡り、Vimの基本操作から便利な機能までを紹介してきました。そろそろみなさんもVimをカスタマイズしたいと思う頃ではないでしょうか。今回はVimをより使いやすくカスタマイズする方法と筆者のオススメの設定について解説していきます。

設定ファイル

VimはVim scriptという独自のスクリプト言語を使ってカスタマイズすることができます。そしてVimのプラグインの多くはこのVim scriptによって書かれています。今回はVim scriptについての解説はしませんが、連載の最後にVim scriptを使ったプラグインの作り方を解説しますので、楽しみにして頂ければと思います。

話を戻して、Vimはデフォルトではdefaults.vimという設定ファイルを読み込んでいます。筆者の環境では/usr/local/share/vim/vim81/defaults.vimが読み込まれています。この設定ファイルはruntimeファイルとして同梱されているため、ユーザが用意する必要はありません。

しかし、defaults.vimは必要最低限の設定しかされていおらず、とても使いやすいと言えません。そこで、vimrcという個人設定ファイルを使うことでVimをカスタマイズすることができます。このvimrcはVim scriptを使って設定を記述します。なお、OSによってこの設定ファイルは少し名称が異なります。:h vimrcでヘルプを引いて読むと、OSごとの設定ファイル名は次のようになっています。(OS/2はサポートされていないため、表から除外しています)

vimrcがあると defaults.vimは読み込まれないようになっているので、vimrcの先頭にsource $VIMRUNTIME/defaults.vimをすることが推奨されています。詳細は:h defaults.vimを参照してください。

OS 配置場所
Unix $HOME/.vimrc、$HOME/.vim/.vimrc
MS-Windows $HOME/_vimrc、$HOME/vimfiles/vimrc、$VIM/_vimrc
Amiga s:.vimrc、home:.vimrc、home:vimfiles:vimrc、$VIM/.vimrc

基本的にみなさんはWindowsかUnix系(Mac,Linux)を使っていると思うので、Windowsの場合は$HOME/_vimrc、Mac,Linuxは$HOME/.vimrcと覚えておけばよいでしょう。

設定ファイルについて理解したところで、次に設定について解説します。

設定の方法

先程、Vim scriptを使って設定していくという話をしましたが、Vim scriptはExコマンドの集合体です。そしてVimにはオプションを設定するExコマンド:setがあります。使い方は次のようになります。

Exコマンド 説明
:set xxx オプションを設定する
:set xxx? オプションの設定値を確認する

基本的に、このExコマンドを使用してVimのオプションを設定していくことになります。ただ、オプションではないがそれに相当するExコマンドがありますので、そちらも合わせて紹介していきます。ちなみに、vimrcに記述するとき:は不要になるのでset xxxというように記述していきます。

文字コード

Vimで文字コードが異なる複数のファイルを文字化けせずに開くにはfileencodingsオプションを以下のように設定しておくと良いです。

set fileencodings=エンコーディング,エンコーディング,...

以下は設定例です。

set fileencodings=utf-8,cp932

行番号

set numberで次の画像のように行番号を表示することができます。

number以外にもrelativenumberというオプションがあり、こちらは次の画像のように現在行からの相対行数を表示します。

相対行表示は、3jといったカウンタによるカーソル移動を行うときに現在行との差分を計算しなくて済むのでとても便利です。

カーソル

デフォルトではカーソルがどこにあるのかすこし分かりづらいです。set cursorlineでカーソルラインを表示しておくと便利です。設定すると次の画像のようになります。

カーソルライン以外にも、set cursorcolumnで次の画像のようにカーソルカラムを表示することもできます。こちらは好みになるかと思います。筆者はカーソルラインがあれば充分です。

ちなみに、カーソルラインの設定はset cursorline!と最後尾に!をつけることで設定をトグルします。カーソルラインを設定すると画面の描画、特にスクロールするときに遅くなることがあるので、遅いと感じた場合は無効にしておくと良いでしょう。

シンタックス

syntax enableでシンタックスハイライトを有効にできます。

検索ハイライト

デフォルトでは/*を使った検索で検索結果がハイライトされないので、set hlsearchで結果をハイライトするようにしておくと便利です。次の動画では、オプションを設定する前と設定した後の違いを比べています。

一度検索結果がハイライトされると、自動で消えないので、ハイライトを消したい場合は:nohlsearchで消せます。

インクリメントサーチ

デフォルトの検索ではEnterを押下してから検索が始まりますが、set incsearchで入力するたびに検索するようになります。

Undoの永続化

VimはuでUndoできますが、一度ファイルを閉じると変更履歴も消えるため、Undo/Redoができなくなります。次の設定で~/.vim/undoディレクトリ配下に変更履歴を保存しておき、ファイルを閉じても変更履歴が残るようにします。ディレクトリは事前に作成しておく必要があります。

if has('persistent_undo')
	let undo_path = expand('~/.vim/undo')
	exe 'set undodir=' .. undo_path
	set undofile
endif

インデント

インサートモードで改行したり、ノーマルモードでoOで改行する場合、デフォルトでは自動でインデントを整えてくれません。そこで、set smartindentで改行するときに自動でインデントを整えるようにします。次の動画では適用前と適用後の違いを比べています。

クリップボード

デフォルトではVimの*レジスタがOSのクリップボードと連動しています。そのため他のアプリでコピーしたテキストをVim上で使うこと、またその逆もできます。しかし、プット、ヤンクするたびに*レジスタを指定する必要があり少々面倒くさいので、set clipboard+=unnamedでヤンク、プットするときにクリップボードを使用できるようにしておくと便利です。

ステータスライン

Vimは画面下部にステータスラインという領域を持っていて、そこにいろいろと情報を表示することができますが、デフォルトでは表示されないようになっています。set laststatus=2でステータスラインを表示しておくと次のように現在開いているファイル名などがわかるので便利です。

ちなみに、筆者はlightline.vimというプラグインを使ってステータスラインを次のようにカスタマイズしています。プラグインの導入方法については次回の記事で解説しますので、楽しみにして頂ければと思います。

コマンドライン補完

コマンドラインでTabを使うと補完できますが、デフォルトでは候補一覧が表示されないので、少し不便です。set wildmenuでステータスラインに候補を表示できるので、設定しておくと便利です。次の動画では設定前後の違いを比べています。

キーマップ

Vimは入力したキーの動きを変えられるマップコマンドがあります。このマップコマンドを使うことでキーの動作を変えることができます。例えば、<C-s>でファイルを保存する、といったこともできます。マップコマンドはモードごとに用意されていますが、ここでは解説しないのでぜひ:h mapでヘルプを読んでみてください。

キーマップを定義するときの形は次になります。

マップコマンド 入力キー 一連の操作

一連の操作というのは、そのモードの操作になります。つまり、入力したキーの代わりにどんな操作を行うかを定義するのがキーマップです。マップコマンドは大きく分けて2種類あり、再帰するマップコマンドとしないマップコマンドです。

例えば、imap a bでインサートモードで a を入力したときに b を挿入するようにキーマップした状態で、imap c aで c をマッピングすると、c を入力したときに a のマッピングが使われ、結果 b が入力されます。再帰したくない場合はinoremap c aで c をマッピングすると c を入力したときにそのまま a が入力されます。

このように再帰すると意図しない動きをしてしまう可能性があるため、自前でキーマップを定義するときは基本的に再帰しないマップコマンドを使うと良いでしょう。

キーマップの設定

普段筆者が使っているキーマップを少し紹介します。便利そうと思ったらぜひ取り入れてみてください。(行頭が「"」の行は、vimrcにおけるコメント行です)

" <Leader>というプレフィックスキーにスペースを使用する
let g:mapleader = "\<Space>"

" スペース + wでファイル保存
nnoremap <Leader>w :w<CR>

" カーソル下の単語を、置換後の文字列の入力を待つ状態にする
nnoremap <Leader>re :%s;\<<C-R><C-W>\>;g<Left><Left>;

" Escを2回押すとハイライトを消す
nnoremap <Esc><Esc> :nohlsearch<CR>

" スペース + . でvimrcを開く
nnoremap <Leader>. :new ~/.vimrc<CR>

" オペレーター待機モードのマッピング
" 一例:c8 で ci( の動きになる
onoremap 8 i(
onoremap 2 i"
onoremap 7 i'
onoremap @ i`
onoremap [ i[
onoremap { i{

" Ctrl + j と Ctrl + k で 段落の前後に移動
nnoremap <C-j> }
nnoremap <C-k> {

最後に

今回の記事で紹介した設定とオプションはほんの一部です。これらを設定するだけでも使いやすくなるかと思います。Vimの良さの一つはこういった細かい設定を自分自身で行うことができ、自分が使いやすいエディタに育て上げることができるところです。他にももっとたくさんのオプションを知りたい方はぜひ:h optionsでヘルプを読んでみてください。

次回の連載は、みなさんが待ちに待った(と思われる)プラグインの導入およびオススメプラグインについて解説する予定です。楽しみにして頂ければと思います。