これからVimを触る人向け！今まで使っていたエディタのようにVimを使いはじめる。

#Vimを触るまでに抱いていた、いくつかの勘違い
私はエディタをEclipseからVimに乗り換えて数ヶ月が経ちました！
私自身も「IDEって○○があって便利だよね、でもVimにはこの機能はないんだよね」という感じで、Vimには機能が少なさそうな先入観がありましたが、今では知れば知るほど「もっと早くVimに乗り換えればよかったな…」と思うようになりました。

Vimは開いた瞬間真っ黒い画面が開かれるだけで、メニューもなにもないので機能が何もないように思われがちですが、実は黒い画面の裏には様々なパワフルな機能が詰め込まれています。

この記事はVimの基本的な使い方をまとめた記事ではなく、Vimで何が出来るかわからないという方に普通のエディタとして使えるまでを導入することを目的とします！

（※まだ使い始めて日が浅いので間違っている部分はご指摘いただけますようよろしくお願いします。）

##Vimにも、もちろん「ファイル一覧」機能があります
よく、IDEの左メニューにあるファイル一覧ですね。
出し方はコマンドモードから、

| :e (ディレクトリへのパス) | ファイル一覧 |
| --- | --- |
で開けます。例えば「**:e .**」でVimを開いた階層から一覧（全画面表示）を表示できます。

![スクリーンショット 2015-05-29 20.52.29.png](https://qiita-image-store.s3.amazonaws.com/0/73446/5d8f4e16-d0fe-c9b1-e60d-dcbfa1e41f18.png)


基本は開いたファイル一覧の上を、j(下)、k(上)で移動して開きたいファイル名の一部にカーソルを乗っけてEnterで編集に入ります。ファイル一覧ページの操作方法も通常のVim操作と同じなので「**/（単語）**」 で検索をかける事も可能です。さらに、後述の移動方法を使えばかなり早く目的のファイルを開けます。ファイル一覧のソートも可能です。

（※厳密にはVimにデフォルトで入っているnetrwというプラグインの動作になります。）

- **Tips:ファイルプレビュー**  
一覧を開いている時にファイル名上にカーソルを乗っけて**p**を押すことで画面分割でプレビューが開けます。（そのまま画面のフォーカスをプレビューに移動して（&lt;Ctrl-w&gt; hjklのコマンドの画面フォーカス移動）通常通り編集して保存も可能です）

![スクリーンショット 2015-05-29 21.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/73446/b50d776f-ba76-9689-54e1-101c7f133f04.png)

  

また、より簡単にファイルを開く方法としてコマンドモードからファイル名を直接検索して開くことも可能です。
コマンドモードで

| :e **/（ファイル名） &lt;Tab&gt; | Tabを押すたびに:e 以降にパスの候補を表示 | 
| -------- | -------- |
|例1：:e **/hoge.text|path以下のすべての階層からhoge.txtを探して候補に表示|
|例2：:e application/***/**.text|application以下のすべての階層から.txtを探して候補に表示|

というようにワイルドカードを用いて、Tabを押すたびに候補を次々に列挙する事が可能です。
探す範囲は基本的にはvimを開いた階層よりも下の階層です。（pathの指定階層より下。）

##なぜか無いと思われがちな「タブ機能」
Vimにもタブ機能はあります。Vimのコマンドモードで　:tabnew で新しいタブを開けます。

| :tabnew | 新たなタブを開く |
| --- | --- |
| :tabe （ファイルパス） | 新たなタブで指定したファイルをエディタを開く|
| gt | 次のタブへ |
| gT (g&lt;Shift-t&gt;)| 前のタブへ |

![スクリーンショット-2015-05-29-21.12.jpg](https://qiita-image-store.s3.amazonaws.com/0/73446/377ed548-7ebd-df58-00c9-194414e80f1f.jpeg)


タブだけではなく、:split、:vsplitのコマンドより**画面の上下左右分割**も可能です。

##マウスより快適なカーソル移動
基本的にはhjkl（左下上右）で移動しますが、高速移動できるコマンドがVimには多数あります。
細かい説明は端折りますが下記がその一例です。

| e ge w b | 単語系（単語頭末）ごとに移動 |
| --- | --- |
| { } ( ) | パラグラフ、文章ごとに移動|
|  /(単語) | 単語を検索。検索後、 n(次へ) 、 N(前へ)|
| f(文字) | 行中の文字まで移動 |

こういった移動系のコマンドは他にもあるので調べてみてください。
慣れるまではチートシートなどを用意してひたすら練習しましょう。
これまでの「マウスでお目当てのところをクリックして移動する」という動作が遅いと感じられるようになります。

##入力補完
入力補完がVimにもデフォルトで用意されています。

|（文字の入力途中で）Ctrl-p、Ctrl-n| 次の候補、前の候補 |
| --- | --- |
入力途中までの文字に一致する**ファイル内の単語**をずらっと表示してもらえます。
ほかにも補完ルールがたくさんあるので調べてみると良いかもしれません。

![スクリーンショット 2015-05-29 20.50.18.png](https://qiita-image-store.s3.amazonaws.com/0/73446/1b2d06c2-353b-708c-8e26-89e7b997baed.png)
 

##選択がマウスドラッグよりもめんどくさそう…という勘違い
Vimは強力な選択範囲指定の方法を備えています。
Vimは狙った範囲の単語などをコマンドで扱うことに非常に優れています。

下記にVimの選択範囲指定の例を記載します。（※カーソルの位置に注意）

|文字列|選択したい範囲|カーソルの位置|コマンド|
| --- | --- | --- | --- |
| hoge | hoge |単語の間のどこか| **viw** |
|'abcd efg'| abcd efg |'と'の間のどこか| **vi'** |
|print('apple')| ('apple') |'と'の間のどこか| **va(** |
|abcdefghi~中略~xyz| x以前全て |xの上| **v0** |

このように「**v＋範囲指定コマンド**」や「**v＋カーソル移動**」で素早く範囲指定することが可能です。

慣れれば**v（範囲選択）、c（書き換え）、d（削除）、r（リプレイス）**などの操作コマンドと合わせたコマンドの合わせ技によって、マウスを使った動作よりもかなり高速に操作が可能になってきます。

##サーバーごとにVim環境を構築しなければいけないの？
細かい設定は.vimrcというファイルなどに設定していくようにします。このファイルなどをgitなどのVCSで管理して、好きなときに落としてこれるようにしましょう。あとは新しい環境に入ったとしても、Vimは必ずサーバーに入っているので、自分の設定を落としてくるだけでどこでも作業ができるはずです。開発環境もクラウド化みたいなイメージですかね。



#その他Vimの良いところ
##とにかく軽い！
出向先で低スペックPCしか渡されなかった…というEclipseなどの重いIDEが使えない環境でもTerminalさえあれば開発できます！
IDEが裏でビルドする処理が入って…といった処理がないので待ち時間でイライラすることがない。
起動も高速。

##サーバーに入れることの利点
SVNで編集したものをそのままコミットしたり、apache再起動したりなどの作業はそのままTerminalで作業可能ですよね。Vimを一旦抜けたい場合には **Ctrl-z** でバックグラウンドに一旦回し、作業後に**fg**コマンドでバックグラウンドに回したVimに戻れます。

また、crontabやサーバーの設定ファイルなども基本的にVimで開くことになるので、結果的に慣れたエディタで触れるようになります。(Emacsでもいいけれども)

また、今まで触った事のないサービスでちょっとした相談事などをされても、さっとサーバーに入って一緒に原因を調査という流れができるので、出来るプログラマー風になれます。




#プラグインが必要になるけどもVimでできるよ！
デフォルトでは機能はないですが、世界中のVimmerが用意したプラグインを合わせることに寄ってそれなりにできるようになることも多いです。

- **ソースの整形機能はないの？**
インデント程度であればVimはデフォルトでコマンド一発で修正できます。
細かいコーディングスタイルの整形はプラグインを探してみてください。

- **文法などのエラーがあった場合の警告は？**
こちらも文法間違いや、コーディング規約のチェックなどのプラグインを導入する事によって解消できます。

- **プロジェクト管理はどうするの？**
Vimのプラグインでプロジェクト管理も可能です。
同じサービス内の細かいプロジェクトの切り替えであれば、個人的にはプラグイン使うよりも、サーバーに接続しているTerminalでSVNなどを操作してブランチなど細かく切って、必要なときに切り替えて進めていきます。

- **俺が欲しいあの機能がなさそうだな〜**
Vimのプラグインはまだまだたくさんありますので、たくさん探してみてください！世界中にVim愛好者がいるので、きっと誰かがプラグインとして作っていることでしょう…。




#Vimの悪いところ
決して良い所ばかりではありません。

##コピペが特殊
ヤンク（コピー）、デリート、ペーストが若干複雑。

|y|d|p|
| --- | --- | --- |
| ヤンク（コピー） | デリート | ペースト |
基本的には前述の範囲選択した後にy（ヤンク）またはd(デリート)、ののちにp（ペースト）を行いますが、MacやWindowsのコピペとは異なるレジストリ（クリップボード）にコピーした内容が入っていきます。レジストリとはコピーした内容を入れる入れ物で、MacやWinなどと共有しているレジストリも中にはあるようですが、基本的には別物です。

また、この時のDが若干厄介で、vで選択した内容をDで削除すると、削除内容はコピペのレジストリに入っていきます。
デリートという名前がついていますが実際の挙動は「カット」になります。
デリートなどをしてしまったあとにヤンクした内容をペーストしたい場合には、「"0p」というコマンドでレジストリを指定してペーストできます。


#コマンド入力モードと日本語IMEが相性が悪い。
iでインサートモードに入って半角/全角で日本語入力に変更して文章を打つ→Escで抜けて、hjklで移動する…といった時に毎回Escのあとは英数入力に戻ってからコマンドを打たなければいけないです。

#まとめ
結局のところVimを100%おすすめとは言い切れませんが、Vimはプログラマーのエディタとして十分な魅力を持っていると言えます。最終的にはその人が何を重視するかでどのエディタを使うかはそれぞれの自由かと思います。シーンによって使い分けるのもよいでしょう。

個人的なVimへの感想としては、やはりマウス無しで操作できるようになっているので、その分高速にファイル編集出来るように最適化されているなというのと、やはり全世界のプログラマが使うエディタでプラグインも豊富なので、開発に困ることは今のところないかなといった印象です。

追記：新しい記事書きました！
[IDEじゃなくてVim、Emacsじゃなきゃダメな理由](http://qiita.com/kmszk/items/84c6c09e2248e9f3e372)