ぼくのかんがえたさいしょうのvimrc

この記事はVim Advent Calendar 2013の171日目の記事です。
170日目はmanga_osyoさんによるvim-operator-alignta つくったでした。

本記事では、ぼくのかんがえたさいしょうのvimrcを紹介します。

はじめに

さいしょうのvimrcとは?

何か中二病っぽいタイトルですが、わりとまじめに考えて作ったものです。

タイトルをパッと見て、「最小?最強のタイポじゃないの?」 と思われた方もいるかもしれません。 しかし、最強のvimrcではありません。 最小 のvimrcです。

私がここで言っている最小のvimrcとは以下のような意味です。

Vim pluginを入れず、必要最小限の設定だけをまとめたvimrc

Vim pluginを入れずというのがミソです。 また、ここで言っている最小限の設定とは、(個人的に)どうしても 必要なオプション設定とキーマッピングなどのことです。

さいしょうのvimrc作った理由

仕事上テスト機などの共用で使うようなマシンで、 ちょっと設定ファイルなどを編集したい場合に、 勝手にVimプラグインを入れづらかったり、 わざわざVimプラグインをいれるまでもなかったりする場合があります。

こういう時、私は今まで特に設定なしでVimを使っていたのですが、 バリバリカスタマイズした自分のvimrcに慣れきっていると、 操作が微妙にぎこちなくなります。 (もちろん操作できないということはないですが。。。)

かと言って、いつも使っているvimrcをそのまま入れると プラグインの設定がたくさんあるため、大量のエラーで まともに動きません。

このような背景があり、カスタマイズバリバリのvimrcとは別に ちょっとしたvimrc、つまり自分にとって最小限の設定を記載した vimrcを書くことにしました。 小さいvimrcであれば、さっとコピーしてさっと使うことが でき便利です。

さいしょうのvimrc

ぼくのかんがえたさいしょうのvimrcは、 .minimal_vimrcにおいてます。

今後変更するかもしれないので現時点(2014/5/21)での最新にリンクしています。

中身について簡単にざっとご紹介します。

なお、下記設定は全部を自分で考えたものではなく どなたかのvimrcを真似させていただいたものもあります。 どれがどなたの設定か覚えていないのですが、 この場を借りて御礼申し上げます。

syntax enable

構文ハイライトを有効にしています。 これでファイルタイプ別に色付けされるようになります。

set number
set ruler
set list
set listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<,eol:<
set incsearch
set hlsearch
set nowrap
set showmatch
set whichwrap=h,l
set nowrapscan
set ignorecase
set smartcase
set hidden
set history=2000
set autoindent
set expandtab
set tabstop=2
set shiftwidth=2
set helplang=en

オプション設定は完全に好みなので、細かく説明はしません。
個人的には、行番号表示(number)や、検索周り(incsearch,hlsearch,ignorecase)、 行頭/行末でのカーソル移動(whichwrap)、隠れバッファ(hidden) あたりは、設定しておかないと操作しづらいです。

colorscheme desert

背景色黒ベースのカラースキーマが好きなのでdesertに設定しています。

nnoremap <Space>w  :<C-u>w<CR>
nnoremap <Space>q  :<C-u>q<CR>
nnoremap <Space>Q  :<C-u>q!<CR>

ファイル保存、ウィンドウクローズをキーにマッピングしてます。 タイプ数はそんなに変わらないと思われるかもしれませんが、 <Enter>を押さなくていい分、手軽にタイプ出来ますし、 :w[<Enter>などのタイポなども気にしなくてよくなります。
<Space>も非常にタイプしやすくプレフィクスキーにお勧めです。

nnoremap ;  :
nnoremap :  ;
vnoremap ;  :
vnoremap :  ;

よく使うコマンドラインモードに入るための:と、 よりタイプしやすい;を入れ替えています。
特にASCII配列キーボードだと、:はタイプ しづらいので、個人的に必須です。

nnoremap <Space>h  ^
nnoremap <Space>l  $

行頭/行末移動のキーを、マッピングしています。
タイプ数が多くなって押しづらくなってるじゃないかと 思わるかもしれませんが、デフォルトの^$は、 <Shift>と一緒にホームポジションから遠いキーを押す必要があるため、 押しづらく小指が疲弊してしまいます。
マッピングしている<Space>h<Space>lは片手でタイプ できてお勧めです。
<Space>は押しやすいので、Vimでキーをマッピングする際、 <Space>をプレフィクスキーとして使うと便利です。

nnoremap k   gk
nnoremap j   gj
vnoremap k   gk
vnoremap j   gj
nnoremap gk  k
nnoremap gj  j
vnoremap gk  k
vnoremap gj  j

表示行移動であるgjgkと、実際の行移動であるjkを 入れ替えています。
set wrapの設定をして、1行が表示上ラップしている場合に、 gjgkは、表示上の行での移動なのでjkより 便利なときがあるため入れ替えています。

nnoremap <Space>/  *<C-o>
nnoremap g<Space>/ g*<C-o>

*は、カーソル位置の単語で前方検索します。 これは非常に便利なコマンドで、よく使うのですが、 *はASCII配列キーボードだと、<Shift>を押しながら ホームポジションから遠いキーをタイプする必要があるので ちょっと押しづらいです。
そこで、<Space>/マッピングしています。 片手でタイプできてお勧めです。

g*は、*と違い、単語の一部にもマッチします。 こちらも同様にマッピングしています。

nnoremap <expr> n <SID>search_forward_p() ? 'nzv' : 'Nzv'
nnoremap <expr> N <SID>search_forward_p() ? 'Nzv' : 'nzv'
vnoremap <expr> n <SID>search_forward_p() ? 'nzv' : 'Nzv'
vnoremap <expr> N <SID>search_forward_p() ? 'Nzv' : 'nzv'

function! s:search_forward_p()
  return exists('v:searchforward') ? v:searchforward : 1
endfunction

nNは、最後の/?を繰り返します。

/で検索した場合と、?で検索した場合で、 nNで移動する方向が異なるのが不便でした。 このため、/?のどちらで検索した場合でも、nで前方検索 Nで後方検索するよう設定しています。

nnoremap <Space>o  :<C-u>for i in range(v:count1) \| call append(line('.'), '') \| endfor<CR>
nnoremap <Space>O  :<C-u>for i in range(v:count1) \| call append(line('.')-1, '') \| endfor<CR>

インサートモードに入らずに、カーソル行の下もしくは上に空行を挿入します。 countにも対応しているので、10<Space>oで10行挿入できます。

空行を挿入する+αも参考ください。

nnoremap <silent> tt  :<C-u>tabe<CR>
nnoremap <C-p>  gT
nnoremap <C-n>  gt

タブ関連のキーマッピングです。

私はタブを多用するので、新規タブの作成をタイプしやすいttに割り当てています。

また、タブ移動は、複数タブを確認しながら移動する場合に、 gtgtgtgtとタイプするするのがタイプしづらかったため <C-p><C-n>マッピングしています。

nnoremap <silent> <Esc><Esc> :<C-u>nohlsearch<CR>

set hlsearchで、検索時にマッチするテキストが強調表示されます。 検索テキストの強調表示は便利なのですが、検索が終わった後は 強調表示をオフにしたいので、nohlsearchコマンドを使います。

nohlsearchコマンドはちょいちょい使うため、<Esc><Esc>マッピングしています。

nnoremap ZZ <Nop>
nnoremap ZQ <Nop>

nnoremap Q gq

危険なキーを無効 or 別のキーにマッピングしています。

ZZZQはそれぞれ、「ファイルを保存して終了」、 「ファイルを保存せずに終了」です。

タイプしやすくて便利だったりするのですが、あまりに タイプしやすく、ZZをタイプするつもりが誤ってZQを タイプして悲しい気持ちになることが多々あります。 そのため、使わないよう空マップ<Nop>に指定してます。

また、QはExモードに切り替えます。 通常の使用でExモードを使うことはほとんどないため テキストを整形するgqマッピングしています。

onoremap aa  a>
onoremap ia  i>
onoremap ar  a]
onoremap ir  i]
onoremap ad  a"
onoremap id  i"

テキストオブジェクトで、i)i}などは、 ibiBに割り当てられていて、i)i}とタイプするのと 比較してタイプしやすいのですが、 i>i]i"はそのまま記号をタイプする必要があり 押しづらいため、上記のようにマッピングしています。

このキーマッピングの副作用として、上記テキストオブジェクト は、ASCII配列キーボードでもJIS配列キーボードでも同じキーで 操作する事ができるようになります。

inoremap jk  <Esc>

ノーマルモードに戻るための<Esc>はタイプしづらいので、 jkマッピングしています。 jkであれば、編集でjkを入力することはほとんどないですし、 誤ってノーマルモードでタイプしても上下移動するだけですみます。 何よりホームポジションを移動せずにタイプできるので 非常にタイプしやすいです。

このキーマッピングは人を選ぶと思います。

nnoremap gs  :<C-u>%s///g<Left><Left><Left>
vnoremap gs  :s///g<Left><Left><Left>

置換コマンドは多用するのですが、いちいちタイプするのが 面倒なので、gsキーにマッピングしています。
これで、gsとタイプすることで、即座に置換する文字列 の入力に移れます。

cnoremap <C-f>  <Right>
cnoremap <C-b>  <Left>
cnoremap <C-a>  <C-b>
cnoremap <C-e>  <C-e>
cnoremap <C-u> <C-e><C-u>
cnoremap <C-v> <C-f>a

コマンドラインモードでの移動をEmacsライクなキーに設定しています。

まとめ

以上が、ぼくのかんがえたさいしょうのvimrcのご紹介でした。
皆さんも、自分だけの「ぼくのかんがえたさいしょうのvimrc」を作ってみてはいかがでしょうか?

本題とはそれますが、Vimレベルが上がるのでvimrc読書会に参加することをおすすめします。毎週土曜日23時からやってます。

それではVim Advent Calendar 2013の171日目を終わります。