2012/12/03

Vimの基本と考察と !

おはようございます.

もぷりです.

おはようございますって言うと何時でも朝っぽくなるから良いあいさつですね.

さて、某とっぷ氏が企画したAizu Advent Calendar3日目の記事です.

Vimについて書きます.
といっても、いつものような設定ファイルなどではつまらないので
私的な考察や以前からまとめて見たかったHowToVimなど書いてみます.
Mac, Unix系向けです。

初学者向けですのでProVimmerや闇Vimmerの方には無用の長物でありましょう.

加えて、近いうちにAizuの地でVim勉強会を開催しようと考えていますので
その時の資料にもなればいいかなあなどと考えています :)



はじめに



私はVimが好きです.

Vim歴は浅いですが設定をいじったりコマンドを叩いていると楽しいです.
大したプログラムは書けませんのであしからず。

なんでVim使ってるの?すぐに慣れた?
と極稀に聞かれますが、そこまで深い理由があるわけではないです.

以前はWindowsでEmEditorやNotepad++など使っていました.
MacやLinuxでターミナルを使い始めた時にemacsとVimという二大宗派があるらしいということを知り
sshで便利だし、名前もこっちのがいい響きかなとかそんな適当な感じで使い始めた気がします.

で、使ってみるとなかなか面白いし使い勝手が非常にいいわけでして…

大学にいったらこういうの得意な人とかいっぱいいるといいな、と考えていたわけですが、
残念なことに大学ではemacsがデファクトスタンダードでした.
一番初めに教わるのは環境の説明、ワークステーションのログイン、emacsの基本操作だった気がします.

そんな中で、めげずに友人たちにも薦めていますがなかなか使ってくれません.
強要するものではないので仕方ないですね.

あ、誤解を招かないように添えておきますが、宗教戦争をする記事ではありません.

emacsも良い環境だと思います.
Shell機能がとても便利そうですし、Twitterもできるし、なんかミニゲームとか入ってるし、elispとかもありますし….

どちらか片方(もしくは両方)を使いこなし、気持ち悪い指の動き(音ゲー廃人ほどではなくとも)し始めたら何ら問題ないでしょう.

更に言うならば、実際の業務でVimを使うかと言われたら使わないのではないでしょうか?
Eclipse, Xcode, VisualStudio, IntelliJ などのIDEが使用されるはずです。

つまり完全に趣味です( '-^ )b



エディタにこだわる



"はじめに"にも書きましたが、以前は一般的なエディタを使っていました.

例えば、Notepad++
補完はもちろんマクロ、plugin、豊潤なシンタックスハイライトなどがあり良いエディタです。

ですが、私はVim(Emacsも含め)良い所は上記のような機能ではなく、
Vimの真価は"w b e ge d y"などのコマンドに秘められていると思います。

簡単に言ってしまうと同じキーの連打は嫌だということです。
より効率的に編集するためには無駄のない操作をすべきです。

加えて、こんなことできないかな?と思うとVimでは大抵出来るということです。
これ以下の記事を試すと、ちょっとこれは不便だな、と思うことがあるでしょう。
実際、標準のままだと不便なことも幾つかあります。

ですが、ちょっと設定を変えたり、Pluginを導入することでほとんど解消出来るはずです。
もしなかったらVimScriptをかけばよいのです、似たようなことを思う人もいるはずです。

さてさて、ここまで読んでくれた人ならきっとVimに少し興味を持っていただけたのでは無いでしょうか?

長ったらしいお話はこの辺にしておきましょう。



表記と言い回し



この記事に限った話ではありませんが
Ctrl + W → <C-w>
ESCキー → <ESC> 
と表現します

実際に入力するものについては
分かりやすいように
dd
<C-n>
のように強調することとします。

<Enter>などは省略して書くことが多いです。

文頭に$がついていたらターミナルでの操作を意味します。

Vimで現在のカーソルがある部分をカーソル位置ということにします。
同様に、現在のカーソルがある行はカーソル行
カーソル位置の文字をカーソル文字といいます。



とにかく起動してみる



$ vim

と入力して見ましょう。
標準状態Vim
シンプル極まりない画面が表示されると思います。
ファイルを開かなかったときに画像のようなメッセージ表示されます。


まだ慌てる時間ではありません。


Vimではモードというものを切り替えて文字を編集していきます。
これはVim最大の特徴であり、初心者に対する壁でもあります。

起動時のこのモードはNormalモードと呼ばれます。



とりあえず終了してみる



Vimになれない人が戸惑うのはここです。

大抵の人は「おお、これがVimか」と思ったあとに

「で、どうやって閉じるの?」となるはずです。

終了するには以下のコマンドです。

:q

>No write since last change (add ! to override)
が出たら末尾に!をつけて下さい。
!で強制的にという意味になります。

いろいろ編集したけどやっぱり保存しない、という時にも使います。

書き込んで終了するときはwをつけます。

:wq

":"を入力することでコマンドラインモードになり、各種コマンドが打てるようになります。

この":"が表示された最下段を"コマンドライン"といいます。

ここまででVimの起動と終了を覚えましたね
つまり、Vimの世界へ自由に出入りできます。

Welcome Vim World !! ってことです。


余談と考察



初期状態のVimは上記のように極シンプルです(それが良くもある)

それに対して

「Vimっていう素晴らしいエディタがあるらしい。ちょっと使ってみようかな」

という人を怖がらせてしまう気がします。

大学に入って、Unixに触れ、プログラミングを学ぼうという場合だと特にそうでは無いでしょうか?

これがVimは難しいと言われている理由の一つにあると思います。

このシンプルであることは、下記の考えに基づいています。

VIM IS... VI COMPATIBLE
    なにより、VimはViの気軽な置き換えとして使うことができるべきである。ユーザが望むなら、Vimを、オリジナルのViとの区別がほとんど付かない互換モードで使うことができる。
vimdoc-ja Vimの開発 1. 設計上の目標 より引用

Vimの考えでは

バージョンが上がっても旧バージョンで使えたものがしっかりと使える。
シンプルかつ高速で小さいプログラムである。

といったことを重要としているようです。

だからVi互換モードのcompatibleオプションが標準で有効になっているんですね
私はViではなくVimを使いたい人です。
だから、:set nocompatibleとしてVi互換モードを切っておくことを強く推奨します。

しかし、この開発方針は上記の引用以外にもいろいろ、しっかりとした縛りがあって良いと思います。
実際、それらを元にVimというエディタが開発されたのですから。

Vim本体はシンプルですが、Pluginの力によって様々な拡張がなされています。
むしろ慣れてくるとPluginが無いとかなり不便に感じます。

NeoBundleやVimproc,Uniteなどは本当にすごいですね。

ググれば大抵の情報はあります。
最高ですね。

怖がらずにどんどん使いましょう(^p^)



今は動くことだけを考えて



Vimの起動と終了を覚えたらファイルを開いてみましょう。

$ vim hoge.c

基本のコマンドは以下です。
 左   下  上   右
 h   j   k   l 
覚えるヒント
    jキーが下矢印のように見えますね

行末や行頭なんかは結構多様する気がするので大事です。
行頭 末尾 先頭 行末
 0   G   gg   $ 
移動コマンド
まとめて図で表すとこんな感じです

右手のホームポジションはhjklです。

Vimを起動したらhjklを中心に指が動きます。
カーソルキーは使いません、遠いです。

Vim病が進行するとブラウザとかMSオフィスでもhjklで移動しようとして残念なコトになります。

慣れの問題ですので構わず次へ進みましょう。
忘れたら見なおせばいいだけです。

ただし、カーソルキーは使わないよう心がけて下さい。



編集しなければ生き残れない



さて、やっと編集です。
なにか適当なファイルを開いてみましょう

$ vim hoge.c
そのままだと非常に見づらいので :syntax onとコマンドを実行しました。
標準のCのシンタックスハイライトです。

緑のブロックが現在のカーソルの位置です。

色やカーソル位置の設定はターミナル側のものです。
もちろん、Vimでの設定もあります。

この状態からInsertモードに入りガリガリとコードを書いていきます。
Insertモードに入るには以下のコマンドで入ります。
 i  - カーソル位置前から編集開始
 a  - カーソル位置後から編集開始
 o  - カーソル行下に1行加えてそこから編集開始
 s  - カーソル文字を削除しそこから編集開始
とりあえず最も頻繁に使うものを4つ書きました。
実際はもっとあります。

初めはなんか多いな…と思うものですが
使っていくうちに、今の場合はどのコマンドでInsertモードに入るべきだったか、などと考え始めます。

次にそれぞれの動作を具体的に表してみます。
背景色緑のところがカーソル位置です。

変数名a1を編集してみましょう。
初めのカーソル位置を1とします。
char a1;

a1をa01にしたい時は前に追記するのでです。
char a1;   - iでInsertモードへ
char a01;  - 0を追記

a1をa10にしたい時は後ろに追記するので a です。
char a1;   - aでInsertモードへ
char a10;  - 0を追記

次の行にchar a1_2;を追記したい時は新しく行を作るので o です。
char a1;
                   - oでInsertモードへ
char a1_2;  - 追記

a1をa9にしたい時は書き換えるのでです。
char a;   - sでInsertモードへ
char a9;  - 0を追記
iとaの違いなどがいまいち掴みづらいですがこれも慣れです。

これでファイルに追記が出来るようになりました。


次は削除です。
削除は幾つかのモードで行えますが、ここではInsertNormalモードの削除を書きます。

普通の削除はBackSpaceかDeleteです.
しかし、Normalモードでは使いません。
BackSpaceは少し遠すぎます。

 x  - カーソル文字を削除(BackSpaceと同じ動作)
 X  - カーソル文字を削除(Deleteと同じ動作)

 D  - カーソル文字から行末まで削除
 dd - 一行削除

 C  - カーソル文字から行末まで削除してInsertモードへ
 cc - 一行削除してInsertモードへ

でも、Insertモードの時はxなどのコマンドは使えません。
私も以前はBackSpaceを使っていましたが、やはりBackSpaceは少し遠すぎます。
Insertモードの時は以下を使いましょう。
※compatibleオプションが有効だと使えません。:set nocompatibleとコマンドを実行すれば使えます。
<C-h>
ホームポジションのhなので近いですね
こちらに慣れておくとブラウザのテキスト入力フォームでも使えたりするので便利です。


次にコピー&ペーストです。
ペーストのことをYank(ヤンク)といいます。
英単語だとぐいっと引っ張るという意味です。

 yy - 一行ヤンク
 p - カーソル後に貼り付け
 P - カーソル前に貼り付け

Vimでは、この場合、クリップボードに当たるものをレジスタと呼びます。

ヤンクしたものは標準レジスタに保存されます。
注意が必要なのは、削除コマンドを実行した時も、同じように標準レジスタに入る、ということです。

最低限の編集は以上で大丈夫です。
ここまで書いといてなんですが、これではコマンドが変わっただけで普通のエディタと変わらないですね

次からVimらしい操作を説明します。



Normalモードフェイズはまだ終了していない



今の段階だとNormalモードで先頭や末尾に移動できても、行の中央近くに移動するのためにはhlの連打が必要です。
(行の中央に移動するためにはgmです)
これでは大した意味がありません。

もっと素早く移動するために単語移動を使いましょう。

 w  - 前方のword先頭へ
 W  - 前方のWORD先頭へ
 b  - 後方のword先頭へ
 B  - 後方のWORD先頭へ

 e  - 前方のword末尾へ
 E  - 前方のWORD末尾へ
 ge - 後方のword末尾へ
 gE - 後方のWORD末尾へ

8つもあります。

 w ←→ b 
 e ←→ ge 

という風に対になっています。


この単語移動はwordWORD単位で区切られます。

word - 記号や数字なども含んで区切られる単語
WORD - 空白で区切られる。

私もWORDはいいのですがwordが少しあやふやな感じです・・・

wordの場合の先頭と末尾の違いが以下です。
押し続けた時に移動する部分の背景色を緑にしています。
カーソル位置を先頭とします。
    printf("double  %d, %d, %p\n", sizeof(a5), sizeof(&a5), &a5);

 w の場合
    printf("double  %d, %d, %p\n"sizeof(a5)sizeof(&a5), &a5);
 e の場合
    printf("double  %d, %d, %p\n", sizeof(a5), sizeof(&a5), &a5);

対になっているものは末尾から逆順に移動するので省略しました。
これを覚えるだけでもなかなか快適だな、と思うようになるはずです。



コンボをキメる



Vimのコマンドは幾つかの種類に分類されます。
hjkl,w,eのようなカーソル移動コマンド、x,ddのようなオペレータコマンドなどです。

それらを組み合わせて、更に繰り返しを使用することで効果を発揮します。
華麗にコンボを決め、キモい指の動きをし始めましょう!

Vimのコマンドはコマンドの前に数字をつけることで繰り返すことができます。

例えば、2単語を消したい時はd2wという組み合わせになります。
    float  a4; - 初期状態

    ;              - d2wを実行
これはdコマンドに対し、w2回分の範囲
つまり、2word削除です。

他のコマンドの組み合わせの例を示します。

d$ - カーソル位置から末尾まで削除
d0 - カーソル位置から行頭まで削除
y$ - カーソル位置から末尾までヤンク
4yy - カーソル行から下へ4行ヤンク
5x - 5word削除
5i - <ESC>するまでに入力したものを5回繰り返す

どれも似たような感じですね
これ以外にもたくさんありますので慣れてきたら試してみましょう。



より捗るために



どこに分類していいかわからなかったのでこの部分にまとめます。

コーディングをする時、ちょうど画面サイズいっぱいくらいになると見づらいと思うはずです。
Vimを使う以前は改行しまくって、真ん中辺りに書いている部分を持ってきてました。

zz - 現在行を画面中央へ

これがなかなか便利です。
下に行がなくても、中央に持ってきてくれます。

左右の移動は単語移動で出来ます。
同様に、上下の大きな移動も大事です。

 H  - 画面最上部へ(High)
 M  - 画面中央へ(Middle)
 L  - 画面最下部へ(Low)

<C-u> - 半画面分上へ(Up)
<C-d> - 半画面分下へ(Down)

<C-e> - 1行上へ
<C-y> - 1行下へ

<C-f> - 1ページ上へ
<C-b> - 1ページ下へ

私は1行移動とかそこそこ使ったりします。
半画面分移動は絶対使います。

もちろん、書いたもの以外にも大量にあります。



おわりに


さてさて、ちゃんと書けてない感が溢れてますね…

ここでしたVimの使い方は基本的なところだけです。

興味を持っていただけたら、是非ともVimdoc-jaを見て欲しいです。
きちんと日本語化されていてVimのほとんどが書いてあります。

でも、VimScriptのこととかまだまだわからないので、いずれいろいろまとめたいです。


Aizu Advent Calendar 3日目はもぷりの提供でした。

4日目はluxionさんです。

2 件のコメント:

  1. ishikuro shunsuke2012年12月3日 0:15

    おお、かなりまとまってて参考になりました!

    >更に言うならば、実際の業務でVimを使うかと言われたら使わないのではないでしょうか?

    ロシア人スタッフが完全にvimで仕事してたのでそんなもんかなと思ってましたw
    eclipseでもvimプラグインすすめてきたし、イイのでは。

    返信削除
    返信
    1. ありがとうございますー

      実際、不可能では無いのでしょうが
      チームでの開発や、環境構築などを考えると難しいでしょ
      と自分は言われました。

      でも、そうやって、業務で使えるレベルのVimmerだと大丈夫なのかもしれないですね
      私もeclipseのVimPluginは入れてます。

      削除