【Vim入門】ノーマルVimで使えると便利かもなコマンド10つ


この記事は Vim Advent Calendar 2014 の 17 日目の記事です。
16日は Kuniwak さんの「[vimrc アンチパターンを自動でチェックする](http://qiita.com/Kuniwak/items/407ab494281427847af0)」でした。(私の vimrc も多くのアンチパターンがあったので、戒めていくとともに、vint でチェックしようと思います。。)

## プラグインなしのvimをつかう

先日のVACでも紹介されていたincsearch含め、プラグインは便利で私も色々使っているのですが、あえて、今回はVim(7.2以上)であれば使える基本コマンドで、私自身がよく使っているコマンド(Exコマンド含む)を10つに絞って紹介したいと思います。
 ＃最近、サーバー系の作業が増えて、プラグインなしのvim使うことも増えてきました。

人によってなじんだキーバインドの設定はあるかと思いますが、実際のところこれだけ覚えとけば(プレーンなvimでも)それなりに不自由しないのではないかと思います。

では早速紹介します。

## 0.前提条件

`set number` は設定済とします。下記のようにvimrcに書いていても可。

```vim:.vimrc
" 行番号表示
set number
```

## 1. ciw, ciW

テキストオブジェクトを削除して挿入モードになります。
対象の範囲は `w` なら `word` (:h word 参照)だし `W` なら `WORD` (:h WORD) となります。
![1](http://zippy.gfycat.com/DearestImperturbableHornet.gif)

## 2. dib , diB

同じくテキストオブジェクト系です。
対象の範囲は `b` なら()で囲まれた範囲、`B` なら{}で囲まれた範囲を削除します。
プログラムなどを書いていて、条件式などの中身を編集したりするときにはとても楽なのではないでしょうか。
![dib,diB](http://zippy.gfycat.com/TightIckyEchidna.gif)

## 3. y{行番号}G

現在行から指定した行番号までコピー。たとえば現在行から7行目までをヤンクする、`y7G` という感じです。
これを知る前は、`{数字}yy` などしてたのですが、行番号が表示されているならこちらの方が直感的に分かりますね。
relative numberを出すと言うてもありますが、ふだん通常の行番号の方が使いやすいのでそうしております。
![3](http://zippy.gfycat.com/NegativeCaringHeifer.gif)

## 4. [op]f{x} , [op]t{x}

`[op]` はオペレータです。
`f{x}` は文字 `{x}` までカーソルを移動したり、 `t{x}` は文字 `{x}` の直前の文字まで移動しますが、それに `d` や `y` などのオペレータを組み合わせることで、任意の文字の直前まで切り取ることができます。
![4](http://zippy.gfycat.com/TanDimwittedIberianmole.gif)

## 5. gj,gk

一行が、折り返されてしまうほど長い文字数のとき、たとえば３行分くらいにわたっていたとき、通常なら `j`, `k` で移動すると、その実際の行単位で移動してしまいます。
このとき、 `gj`, `gk` をりようすれば表示行単位で移動できます。
![5](http://zippy.gfycat.com/ScentedVibrantDogfish.gif)

## 6. g~iw, guiw, gUiw

`g~iw` はカーソル下の単語の大文字小文字を入れ替えます。
`guiw` はカーソル下の単語をすべて小文字にします。
`gUiw` はカーソル下の単語をすべて大文字にします。
`g~~`,`guu`,`gUU` とすれば上記のものをカーソル行全体に適応させます。
![6](http://zippy.gfycat.com/DisguisedDeafeningBaldeagle.gif)


## 7. \<Ctrl>-a , \<Ctrl>-x

数字にカーソルをあわせて実行します。
`<Ctrl>-a` でインクリメント `<Ctrl>-x` でデクリメントします。

0x01 などの16進数にカーソルを合わせても16進数と認識して、インクリメント、デクリメントしてくれます。

01, 001 などのゼロパディングされたデータはデフォルトだと8進数と見なされて操作されてしまいます。これを10進数として扱うためには、 `set nf=""` を vimrc もしくは Ex コマンドで実行すれば 10進数と見なしてくれます。
![7](http://zippy.gfycat.com/LittleSecondIrishterrier.gif)

## 8. :set paste

ウェブサイトなどのコードをクリップボード経由でコピーしたときなど、インデントがおかしくなってしまうときがあります。
このとき、 `set paste` を指定すればコピーしたインデントそのままで貼付けることができます。
貼付け終わったら `:set nopaste` で元に戻しておいてください。
※既存のインデントがきかなくなるため
set 系のコマンドは `:set paste!` のように末尾に `!` をつけてトグルさせるのが楽かなと思います。
![8](http://fat.gfycat.com/SolidDownrightGiraffe.gif)

#### :a! 

上記のことは `:a!` でもできることを教えてもらいました。
最近はこちらを使っています。
(paste mode の切り替えがいらなくなった)

![vim-paste-A.gif](https://qiita-image-store.s3.amazonaws.com/0/30588/596cb129-9ef0-a48f-88cf-d60fb7e90d09.gif)

## 9. :sort u

ファイル全体をソートしてユニークにします。
私はちょっとログとかを調べたいときとか、その他の作業でテキストを整形にしたい時とかに使っています。

ソートするだけなら `:sort` 、逆順にソートしたいなら `:sort!` を利用します。
![9](http://fat.gfycat.com/DelayedHoarseGull.gif)

## 10. :v/{文字列}/d , :g/{文字列}/d

**:v/{文字列}/d**
ファイル全体から `文字列` が **含まれている行以外** を削除します。
![10-1](http://zippy.gfycat.com/GlamorousLeanJackrabbit.gif)

**:g/{文字列}/d**
ファイル全体から `文字列` が **含まれている行** を削除します。
![10-2](http://zippy.gfycat.com/ConcernedScentedGoral.gif)


## あとがき

以上です。「便利な」というより、わたしが普段よく使っているものを抜粋となってしまったのですが、お役に立てば幸いです。
また、以前書いた、[Vimがちょっと便利な起動オプション](http://qiita.com/simeji/items/41f4c1bd4e9a2b3c1526)についても合わせて読んでいただくと、もうすこしだけ便利になるかもしれません。

ほかにもなにか便利なコマンドがあれば是非教えていただければと思います！