勉強しよう -Vim編-

Qiitaを始めてずっとROM専。
「自分から何か発信してみたい」と「何か勉強しよう」と漠然と思い、
再燃してきたVimについて書いていこうと思う。
（既に多くの方がVim関連の投稿をされててびびりながら）

これからVimを学びたい方やサーバでの作業時などに役立てれば嬉しい。

#準備
何はともあれVimを使えるようにインストールしなければ。
偉大な先人達が作ってくれたVimを頂く。ありがたい。
色々あるようだが以下をインストールする。

windowsはこちらから[Vim — KaoriYa](http://www.kaoriya.net/software/vim/)
Macはこちらから[MacVim](http://code.google.com/p/macvim/)
（Macユーザの方ならターミナルのviで十分でしたらインストール不要ですね。）

#01/11 基本操作
まず何か書こうとすると何か書けない。それどころかカーソル移動すら違和感。
という初めてのVim(Linuxサーバ上でのView/Vi君でした）を思い出しつつ改めて勉強しよう。

* `hjkl`でそれぞれ左下上右にカーソル移動。
* 入力したいときはまずは`i`を押してから入力する。
* 入力が終わったら`esc`キーを押す。
* 一時保存するときは`esc`キーを押して`:w`。保存して閉じる時は`:wq`。
* 保存せずに閉じるときは`esc`キーを押して`:q!`

多分これで書きたいことは書けるし保存できる。
まったくVimのいいとこ無しの時代。
`hjkl`で左下上右に移動できるけど正直矢印キー使っちゃう。
使えなければ仕方なく`hjkl`使う感じ。


#02/11 編集機能
* `x`を押すとカーソル直下の文字を１文字削除。
* `r`を押してから任意の文字を打つとカーソル直下の文字を置換できる。

どちらもいちいち`i`とか押さなくていいので編集するとき便利。

* 間違えたらesc押して`u`を押すと元に戻す。Undo。「Ctrl + z」的な。まじお世話になるキー。
* `Ctrl + r`を押すと取り消しを取り消してくれる。やり直し。Redo。「Ctrl + y」的な。時々お世話に。
* `:set nu`で行番号が表示される。見やすくなるので開いたら即打つ。

#03/11 4モードとコピペと検索
Vimには４つのモードがある。まずモードを覚えるといいらしい。

|モード名|切替えるには|思ったこと|
|:-----------|:------------|:------------|
|ノーマルモード|`esc`|`hjkl`で移動するモード。入力できない感じのやつ。|
|インサートモード|`i`や`o`など|入力できる感じの。|
|コマンドラインモード|`:` を押してから各種コマンド入力|やってると玄人っぽい。
|ビジュアルモード|`v`|「Shiftキー押しっぱなしモード」だとイメージし易い。
上の「切替えるには」で各モードを切り替える。
とりあえずこういうもんだと思い、ばしばしモードを切り替える練習をする。
実際にはノーマルモードを起点として他のモードに移行する。
そのためビジュアルモード時に`i`とか押してもインサートモードにならない。
ビジュアルモード→`esc`キーでノーマルモード→`i`でインサートモードなどのように操作する。

* yyが行コピー（ヤンクと言うらしい）
* pがペースト
* `/`を押して検索したいキーワードを入力し`Enter`。以降は`n`で次を検索。F3的な。`N`で前を検索。Shift + F3的な。
* `*`を押すとカーソル位置の単語でハイライト（まじ便利！）かつ検索した扱いなので`n`とか`N`が効く。ハイライトが邪魔になったら`:noh`(no highlight)で消せる。

やっぱりエディターなんだからコピペと検索を覚えねば。

#04/11 移動操作

* `Ctrl + f` ページダウン。front(前へ)と覚える。
* `Ctrl + b` ページアップ。back(後ろへ)と覚える。
* `0` 行頭へ移動。ホームキー的な動き。
* `$` 行末へ移動。エンドキー的な動き。
* `w` 次の単語へ移動。`l`より移動範囲が広くいい。
* `b` 前の単語へ移動。`h`より移動範囲が広くいい。
* `gg` ファイルの頭へ移動。Shift + home的な動き。
* `G` ファイルの末尾へ移動。Shift +end的な動き。(実際には指定行に移動と後に覚える)

私のVim(vi/view)用途のメインはアプリサーバのログ確認なので
入力よりも移動・検索が役に立つことが多かった。
（でもこの投稿は右のリンク　[Vim — KaoriYa](http://www.kaoriya.net/software/vim/)　で頂いたwindowsソフトで勉強してるけど）

また以下のコマンド地味にいい

* `:set cursorline` 現在カーソル行を色づけ表示してくれる。どこにいるか一目で分かる。
* `:set ruler` カーソルが何行目の何列目に置かれているかを表示
* `:set hlsearch` 検索文字をハイライト
* `:syntax on` シンタックスハイライト（コードの色付け）をしてくれる。

これも`:set nu`同様、ファイルを開いたら即入力しよう。
ただ、環境によって設定語がない場合もあるので注意。

#05/11 ビジュアルモードと数値操作
ビジュアルモードについて

* `v`キーを押すとShiftキー押しっぱなしモード
* `V`キーを押すと行選択しっぱなしモード
* `Ctrl + V`キーを押すと矩形選択モード
* ビジュアルモードで選択して`U`:選択範囲を大文字変換
* ビジュアルモードで選択して`u`:選択範囲を小文字変換
* ビジュアルモードで選択して`*`:次に現れるカーソル配下の文字まで選択する

私のビジュアルモード使い方は基本的に範囲選択して`y`でコピー、`p`でペースト。
もしくは矩形選択して`i`押してから入力、`esc`押してビジュアルモードを抜けての矩形挿入ぐらい。

また、ノーマルモードでおもしろいと思った操作が以下の２つ。

* 数字の上でctrl-a:インクリメント
* 数字の上でctrl-x:デクリメント

インク/デクリがあるエディタなんて初めて。
でも日付挿入のエディターとかあるからそんなに驚くことない機能？

#06/11 ノーマルモードのオペレーション
* 数字キーとの組み合わせオペレーション

組み合わせというか例えば３文字削除したいとき
`xxx`と３回`x`キーを押していた。（なんてコスト！！）
`3x`で同じ結果を得られる。
これは色々な操作にも使えるので大変お世話になる機能。

`5yy`で5行コピー
`10dd`で10行削除
`dw`で１単語を削除。

ちなみに指定行(例で10行目)に移動(ジャンプ)は`10G`で移動できる。
指定しない`G`でファイル末尾にジャンプする。

#07/11 置換

* `:%s/置換したい文字列/置換後の文字列/g` 開いているファイル全体を置換する。

例）`:%s/hoge//g` 文字列`hoge`をブランクに置換（削除）する。

* `:置換開始行数,置換終了行数s/置換したい文字列/置換後の文字列/g` 指定した行の間を置換する。
* `置換したい文字` の任意文字を `置換後の文字列` 内に登場させたい場合、正規表現のグループ化が便利。
* ただこのグループ化で必要な`()`は`\`でエスケープが必要 => `\(\)` と書く。この`()`の間に登場させたい文字を書く。
    * 例）`hoge` をグループ化するには `\(hoge\)` とする。
* さらにキャプチャする際には `\1` , `\2` と `バックスラッシュ+出現位置のインデックス(数字)` とする。

例）`:3,10s/hoge/ほげ/g` 3〜10行目の「hoge」を「ほげ」にする。
例）`:3,10s/^/#/g` 3〜10行目の文頭をコメント埋めする。
例）`:3,10s/\(hoge\)fuga/\1bar/g` 3〜10行目の `hogefuga` を `hogebar` にする。

#08/11 操作を記録
どちらもノーマルモードでの機能。

* `.`キーを押すと直前の操作を繰り返す。ExcelのF4キーのような動作。

例）`dd`で1行削除した後、次の行も`.`で削除。

* `q`押した後に英数字(※1)を押す。`i`を押して文字を入力したり削除したり。`esc`キーを押して`q`で操作記録完了。その後はノーマルモードで`@{※1}のキー`を押すと同じ操作を実行。つまりsakuraエディターや秀丸エディターなどにあるキーマクロ。

#09/11 コマンド結果挿入
「ここにpwd結果のカレントディレクトリを書けたらな」
「日付を入力出来たらな」
できます！
ノーマルモードで以下を実行。

* `:!`の後にコマンドを入力しEnter押下で外部コマンドを実行
* `:r!`の後にコマンドを入力しEnter押下で外部コマンドを実行しつつエディタに実行結果を反映

例）`:! pwd`で現在ディレクトリを確認
例）`:r! pwd`で現在ディレクトリをカーソル下部に挿入する
例）`:r! date +"%Y/%m/%d"`で本日日付を2017/03/13のように「yyyy/mm/dd」形式でカーソル下部に挿入する

外部シェル実行した結果もいけると思いつつ未検証。。。近日更新予定。

#10/11 ファイルの再読み込みとソート
もはや私の中でも「それ以外」的な扱いですが
ログファイルなどを見ていてリロードしたい場合にやります。

ファイルの再読み込み

* `:e!`

ソート（要：範囲選択）

* `:sort`　昇順ソート
* `:sort!`　降順ソート

#11/11 補完

IDEのような補完ができないからな・・・
できます！

インサートモードで以下実施。

* `Ctrl + x Ctrl + f` ファイルを一覧から選ぶ。くそかっこいい。
* `Ctrl + x Ctrl + n` 開いているファイルの単語を選択できる。単語入力途中にやるとくそかっこいい。

（Ctrl + xの後にCtrl + 「],D,E,F,I,K,L,N,O,Ps,U,V,Y」と、色々ある。）

#所感
* 書き出した操作を１つずつ手になじむまで使ってみる。何も見なくても自然に書けるようになったら次に進もう。
* ちょっとずつ編集して（後から追記できるよね？？）勉強していこう。
* ~~書いていて他の方の投稿のリンクを貼りたい・・・
でも小心者なのでびくびくして貼れない。
やっぱいきなりじゃ迷惑か？とか考えちゃう。~~　やっぱ貼ろう！
* 後は`.vimrc`の設定等を記載しよう。いつか。。。
* pluginを入れるとより便利かと思いつつ、メインエディタにはしてないので気が進まない。

#参考
投稿に辺り非常に参考にした投稿をご紹介。
hachi8833さんの [Vim幼稚園からVim小学校へ](http://qiita.com/hachi8833/items/7beeee825c11f7437f54)
名無しのVim使い [矩形ビジュアルモードを利用した編集を使いこなす](http://nanasi.jp/articles/howto/editing/blockwise-operation.html)
何もないから何かみつかる [ネットの基礎知識＆Windows/Linuxの快適術](http://uguisu.skr.jp/Windows/vi.html)