Vim
iRidgeDay 19

Vimのコマンドラインモードともう少し仲良くする

はじめに

iRidge No1 Vimmerのlighttiger2505です
なおiRidgeでVimmerを名乗っているのは私だけなので、自動的に私が一位です。

Vimの操作に慣れてくると、まるで呪文だった:wやら:qやら:eといったVimのコマンドを覚える余裕ができてきます。
そうなってくると、これまでなんとなく:で遷移してきたコマンドラインモードもっともっと知りたくなってきます。
自然な流れですね。

なお今回の話はVim上で:h usr_20と入力すればより詳しい話があります。興味がある人は是非Vim上で打ち込んでください。

コマンドを忘れがちなあなたに

人は物事を忘れるものです。これは仕方がないことです。
当然膨大な量を誇るVimのコマンド郡のことも忘れてしまいます。
忘れてしまったら、またGoogle先生にコマンドを調べる作業が発生します。大変な時間の損失です。

でも安心してください。コマンドラインモードにはそんなあなたを助ける機能があります。

コマンドモードの履歴をたどる

履歴をたどることは重要です。なぜならよく使うコマンドの殆どは既に履歴にあるからです。
bashのctrl-rは皆さん使っていますか?同じことがVimでもできます。

例えばvimgrepですがこのコマンドはこういった規約になっています。
:vim[grep][!] /{pattern}/[g][j] {file}私はこの{file}の指定方法の
**とかsrc/**とかsrc/views/*.pyとかものすごい忘れます。記憶力のなさには自身があります。

そんな時:vimと打ち込んだあとで矢印キーの上<Up>を押してください。
以前入力したコマンドの中から:vimを前方一致で絞った結果が出てきます。
:vim src/views/*.pyとか復元されます。幸せ。

コマンドモードの履歴を一覧で見る

でも<Up>で辿れないほどはるか昔に実行したコマンドも当然ありますよね。
そんなときは:hisotryです。過去の履歴を一覧表示してくれます。

コマンドラインウィンドウで履歴から即座に実行

さて上記を覚えれば履歴を快適に辿れます。ですがまだ不満がありませんか?
<Up>は一覧で見れないですし、:historyは履歴を引用して実行できません。
そんなときはq:です。

q:を実行すればコマンドラインウィンドウが起動します。
コマンドラインウィンドウはこれまで実行したコマンドの履歴が表示されます。
その上ノーマルモードと同様のキーバインドで移動でき、
iでインサートモードに遷移もできます。
/で検索もできます。
要は通常のバッファーとほぼおなじ扱いになるのです。

使い方としては

  1. コマンドラインウィンドウを開いたら目当てのコマンドを探します
  2. 目当てのコマンドを実行する場合のそのまま<Enter>を押してください
  3. ちょっと編集したいならiでインサートモードに遷移して編集してください
    • 編集しても履歴が汚れることは無いのでご安心ください。
  4. 編集できたらインサートモードのまま<Enter>を押してください。編集後のコマンドが実行されます

これまでの内容を覚えておけば必死にコマンドを覚えたり忘れるたびにGoogle先生に聞くこともなくなりますね。

もっとコマンドラインモードを好きになりたいあなたに

さてデフォルトでも便利なコマンドラインですが、.vimrcをいじればもっと便利になるし、自分の手に馴染むようにカスタマイズもできます。

補完する

履歴と同様に重要なのが補完です。コマンドの一部さえ覚えていればコマンドを簡単に探すことができます。
コマンドを途中まで打ち込んでから<ctrl-e>を押してください。補完できます。

<ctrl-e>だと違和感がある<tab>が良いという方もいらっしゃることでしょう。
しかしコマンドラインモードで<tab>を押すと虚しく^Iと入力されます。
そんなときは:set nocompatibleです。これで<tab>補完が効きます

補完を見やすくする

さて上記をやってみた結果。貧弱な補完と思ったりしてませんか?
モダンなIDEであれば補完候補が一覧で見れてそこからチョイスできるのに...と

安心してくださいwildmenuがあります。
:set wildmenuをしてみてください。補完候補がステータスメニュー上に一覧表示されます。素敵。

コマンドラインモードのキーバインドをいじる

bashの操作に慣れているような人からするとコマンドラインモードのキーバインドは変に感じるかもしれません。
<ctrl-h>でバックスペースの代わりにならないし、<ctrl-b><ctrl-f>で前後の移動になりません。
Vimの標準に合わせろとスパルタンな方々はおっしゃると思うのですが、私は貧弱Vimmerなのでいじってしまいます。
cmapcnoremapbashをいじることでbash同様の動きにしてしまします。

cnoremap <C-b> <Left>
cnoremap <C-f> <Right>
cnoremap <C-n> <Down>
cnoremap <C-p> <Up>
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-d> <Del>

雑感

以前はコマンドやコマンドラインモードを全然覚える気がなくて、プラグインに頼りきりな私でしたが、
これらを覚えてコマンドラインモードが好きになってきました。
皆さんもいじってコマンドラインモードと仲良くなりましょう。