アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

とても便利なvimのコマンド紹介

こんにちは。小川です。
今日はvimのコマンドでも紹介しようかなと思います。

僕はテキストエディタは大体vimを使っています。
執筆をしたときもvimでやっていましたし、PHPvimで書いています。

vimって色々コマンドがあって便利ですよね。友達とvimのコマンドを教えあったりして、度々「こんな便利なコマンドがあるのか!」と驚かされます。
今日はそんなvimのコマンドの中から普段使っていて便利だなーと思うものをいくつか紹介していきます。

ちなみにShiftを押しながらのコマンドは、アルファベットキーの場合は大文字で表記します。
エンターやエスケープを押下する必要がある場合はエンターやエスケープと記述します。「:」ではじまるコマンドモードはエンターを押さないと意味がないので、そこは省略します。
同時押しは+でつなげて表記し、基本的には1文字ずつ順番に押下します。


■ページ移動

「ggで」ページの先頭、「G」で末尾へ移動です。行数を指定して移動するのは「:」を押してコマンドモードに移動し、行数を入力してエンターを押します。最初は「:1」や「:124213412412」とかで先頭・末尾の移動を代用していましたが、コマンドをきちんと覚えておいたほうが楽ですね。

あとは「Ctrl+F」「Ctrl+D」「Ctrl+B」「Ctrl+U」でページを1ページ/半ページ移動はよく使います。
もう1つとっても便利なのが「zz」ですね。これを押下した行が画面の中央になるという優れものです。これも友達に教えてもらいました。


■カーソル移動

カーソル移動の基本は「h」「j」「k」「l」です。この他にも、単語単位で移動する「w」や「e」、「b」もよく使います。
行頭と行末は正規表現と同じで、「^」で行頭、「$」で末尾です。
あとは、現在のカーソル位置から特定の文字がある位置までカーソルを移動するのは「f」に続けて特定の文字を入力します。前に戻って検索するのは「F」です。
「2f<」とすると、現在のカーソル位置から2番目に登場する<の位置までカーソルを移動します。ただしこれは行をまたいで検索はできず、同じ行の中でのみとなります。
行をまたぐ場合は素直に移動するか、「/」を押してコマンドモードに移行して検索し、「n」を押して移動すればよいでしょう。

括弧の上で「%」を押すと反対の括弧に飛ぶのも覚えておくといいですよ。


■アンドゥ/リドゥ

「u」でアンドゥ、「Ctrl+r」でリドゥです。これは覚えておかないとつらいですよね。


■ビジュアルモード

ビジュアルモードは範囲選択を行う方法です。通常のテキストエディタで、マウスを用いて範囲を選択するのと似ています。
ビジュアルモードは、通常(v)、行単位(V)、矩形(Ctrl+V)と3種類あります。これは実際にやってみるのが早いですね。

例えば3行まとめて削除する場合、「3dd」と入力します。が、消したいのが何行分かぱっとわからない場合もありますよね。そんなときはまず「V」を押して行単位のビジュアルモードに移行し、カーソルを上下に移動して消したい行まで持って行きます。そうすると、選択されているっぽい感じの画面になっていると思いますので、これで「x」を押して削除します。そうすると選択されていた部分がまとめて削除できます。

ビジュアルモードはviにはないため、viしか入ってない環境では使えませんので注意してください。


■特定の範囲の文字列をまとめて削除

最初に紹介するのが特定の範囲の文字列をまとめて削除するコマンドです。最近友達から教えてもらいました。なんでこれをしらなかったのかと思うくらい便利です。

例えば次のようなテキストがあったとします。



<?php

$a = 'foo';


ここで、fooという文字列のどれかの上にカーソルを移動して、「di'」と順番に入力します。そうすると、シングルコーテーションで囲まれた文字列が丸ごと消えます。
fooは1単語なので、「diw」と入力しても消えます。ダブルコーテーションの場合は「di"」と入力します。括弧で囲まれていたら「di(」なり「di]」なりで消えます。

diのかわりにviを使うと、その範囲をビジュアルモードで選択することも可能です。


■複数行の先頭や末尾に同じ文字列を一発で入力

複数行をまとめてコメントアウトしたい場合などに便利なコマンドです。例えば次のテキストがあります。



<?php

/**
 * dummy function.
 */
function dummy()
{
    echo 'dummy!!';
}


dummy関数をまとめてコメントアウトしたい場合、PHPであれば/* */を使って複数行のコメントアウトが可能です。しかし、囲んだ中に同じ形式のコメントがあった場合、最初の*/でコメントが止まってしまうという欠点があります。その場合は全部の行を//でコメントアウトしてしまえば問題ありません。

これをするにはまず、ビジュアル矩形モードを使います。上記のテキストであれば3行目に移動(:3)して、カーソルを先頭に移動(^)させます。
そこからビジュアル矩形モードに移行(Ctrl+v)して、末尾まで移動(G)します。これで、3行目から末尾までの1列目が選択された状態になっています。

この状態で「I」を押してインサートモードに移行し、挿入したい文字列(//)を入力します。入力したらエスケープを押下して少し待ちましょう。そうすると、全部の行の先頭に//が入ってコメントアウトされると思います。

末尾の場合は先頭(^)のかわりに末尾($)に移動して、「A」を押してインサートモードに移行して入力します。先頭、末尾と書いていますけど、ビジュアル矩形で選択できる範囲ならば基本的にはどこでも大丈夫です。

例えば次のプログラム。



<?php

array(
    'foo' = 'foo',
    'bar' = 'bar',
    'baz' = 'baz',
);


=の右側に>を入れたい場合は、=の右側のスペースに合わせて「Ctrl+V」を押してビジュアル矩形モードに移行、「j」を押して3行分選択して「I」でインサートモードにし、>を入力してエスケープを押下します。


■複数行をまとめてインデント

複数行をまとめてインデントするには、ビジュアルモードで複数行選択して、「>」を押下します。アウトデントの場合は同様にビジュアルモードで複数行選択して「<」を押下します。このときインデントされる幅は、shiftwidthという設定で決まります。shiftwidth=4だと4つ分インデントです。


■検索

文字列の上で*を押すと、そこにある文字列を元に検索を行います。手軽に検索できるのでとても重宝しています。
検索中は「n」で次の候補、「N」で前の候補に移動です。


■画面分割


「:sp ファイル名」と入力すると画面を分割してファイルを開くことができます。「:vsp」だと縦分割です。分割した画面の移動は「Ctrl+w」のあとにhjklを押下します。閉じるのは閉じたい画面へ移動して「:q」です。


■コマンドを実行する

コマンドモードで「!」の後にコマンドを続けるとコマンドが実行可能です。「:!ls」とすると、lsコマンドが実行できます。


正規表現を用いた置換

vimでは正規表現を用いて置換することができます。

例えば次のテキストがあるとします。



<?php

$foo = 'foo';

function foo()
{
    echo 'foo';
}


3行目の「$foo = ...」の行で、「:s/foo/bar」とすると「$bar = 'foo';」のように最初に見つかった部分が置換されます。
「u」を押してアンドゥし、再度同じ行で「:s/foo/bar/g」と、今度は最後に/gをつけて入力します。そうするとその行にみつかったすべての文字が置換されます。

このページのすべての行を対象とする場合は「:%s/...」のように%sで行います。特定の行だけの場合は、ビジュアルモードで複数行選択した状態で「:s/...」とします。


■後方参照を用いた置換

例えば次のテキストがあるとします。



<a href="http://www.asial.co.jp/">Asial Corporation</a>
<a href="http://www.phppro.jp/">PHP Pro</a>


これを次のように、a要素の中身をtitle属性として設定します。



<a href="http://www.asial.co.jp/" title="Asial Corporation">Asial Corporation</a>
<a href="http://www.phppro.jp/" title="PHP Pro">PHP Pro</a>


これは次のコマンドで行います。
「:%s/<a href="\([^"]*\)">\([^<]*\)<\/a>/<a href="\1" title="\2">\2<\/a>/g」
PCREの正規表現だと()で囲んでグループ化して、\1とかで後方参照しますよね。vim正規表現だと、括弧を\でエスケープすると同じことが可能になります。


■エディタブルなコマンドモード

通常は「:」や「/」を押してコマンドモードに移行します。ただしこの状態だと、hjklで移動できないとか、過去の履歴を探すのがカーソルキーを使うしかないとか制限があるわけです。
そこで「q:」や「q/」として、qを入力してからコマンドモードに移行します。vimを使ってる人は「q:」で出てきた画面はよくみたことあるんじゃないかなーと思います。
この状態でiを押すとインサートモードになったりするので、過去の履歴を変更したり、最後の行で新たにコマンドを記述して、エンターを押すと実行されます。
先ほどの正規表現のような長めのものを書いたりする際に重宝します。


ご紹介するのは以上になります。このうちのいくつかの情報はid:sotarokに教えてもらいました。ありがとうそうたろう。

この他にもvimといえば設定ファイルで色々設定を変えたり、プラグインで拡張したりできますよね。
僕はいつもGNU screenを256色有効にしてコンパイルし、colorschemeをdesert256にしたりしています。



あんまりプラグインとかは使っていないので有益なお話はできませんが、色々なものがありますのでぜひ探してみてください。

IDE使うほうが補完などが心地よかったりしますが、vimもだいぶ手になじんでいるのでストレスなく文章が書けますね。
この他にも便利なコマンドたくさんあると思いますが、おすすめなものがあったらぜひ教えてください!