カーソル移動を爆速化してVimを制覇する

さて、門出と新生活の季節がやってまいりました。この春、新社会人となる皆様誠におめでとうございます。
ということで、春から新しくエンジニアとして仕事するよーという方々向けに、~~バズるかな~~需要があるのではないかと思い勢いで書いてみました。おそらく似た系統の記事はごまんとあるのですがお許しください。なお、この記事には**Vim中〜上級者にとって役立つ内容は一切書かれていません**。

# カーソル移動とは

カーソル移動とは、Vimの中で最も重要な機能[^1]です。
標準状態のVimを使うと、殆どのキーに何かしらの機能が割り当てられていますが、そのうちの多くは何らかのカーソル移動に関わっていると言えます。
この記事では、カーソル移動用のコマンドを3つのジャンルに分けて紹介します[^2]。

[^1]: おそらく。
[^2]: 私が知っているものだけであり、すべてをカバーしているわけではありません。詳しく知りたい方は`:help motion`としてください。

# 短距離の移動

## 上下左右への移動

Vimでカーソルを上下左右に移動するためには、カーソルキーまたは以下のキーを使います:

| 方向 | キー |
|:-:|:-:|
| 左  | <kbd>h</kbd> |
| 下 | <kbd>j</kbd> |
| 上 | <kbd>k</kbd> |
| 右 | <kbd>l</kbd> |

数字キーを押してからこれらのキーを押すと、指定された文字数分移動することができます。例えば<kbd>1</kbd><kbd>2</kbd><kbd>j</kbd>とすると、12行分下に移動します。
`:set wrap`とされている場合(デフォルト)、長い行は折り返して表示されますが、この時<kbd>j</kbd>, <kbd>k</kbd>キーは行単位での移動となります。同じ行を含めて移動したい場合は<kbd>g</kbd><kbd>j</kbd>, <kbd>g</kbd><kbd>k</kbd>などとします。gをつけなくても行中移動をしたい場合、`~/.vimrc`に

```vim
noremap j gj
noremap k gk
```

と記述します。

## 行内の移動

現在カーソルがある行の先頭に移動する時は<kbd>0</kbd>または<kbd>^</kbd>、末尾に移動する時は<kbd>$</kbd>を用います。<kbd>0</kbd>はインデントを無視して行の先頭に移動します。
なお、[行内の移動と同時に編集も行えるキー](#行頭行末前後行への挿入)もあります。
特定の文字がある位置までカーソルを移動させることも出来ます。例えば<kbd>f</kbd><kbd>a</kbd>とすると、次に文字aが出現する位置にカーソルを移動します。<kbd>F</kbd><kbd>a</kbd>とすると、移動の方向が逆になります。<kbd>t</kbd><kbd>a</kbd>とすると、次に文字aが出現する位置の直前にカーソルを移動します。<kbd>T</kbd><kbd>a</kbd>とすると移動方向が逆になります。
行を超えて、指定した文字がある位置まで移動したい場合は、[検索を用いる移動](#検索を用いる移動)を参照してください。

似た機能を提供する便利なプラグインとして、[vim-easymotion](https://github.com/easymotion/vim-easymotion)があります。



# 長距離の移動

## 画面内の移動

現在表示されているバッファ(画面)内でカーソルを移動させたい場合、<kbd>H</kbd>、<kbd>M</kbd>、<kbd>L</kbd>を用いると、それぞれ画面の一番上、真ん中、一番下の行にカーソルが移動します。
ちなみに、画面自体を移動させる場合は、<kbd>Ctrl</kbd>+<kbd>d</kbd>、<kbd>Ctrl</kbd>+<kbd>u</kbd>、<kbd>Ctrl</kbd>+<kbd>e</kbd>、<kbd>Ctrl</kbd>+<kbd>y</kbd>等があります。詳しくは`:help scroll`をみてください。
<kbd>Ctrl</kbd>+<kbd>f</kbd>、<kbd>Ctrl</kbd>+<kbd>b</kbd>を使うと、1ページ単位でカーソルを移動できます。

カーソルが画面の一番下(上)に来てしまうと見にくい、という場合は、`~/.vimrc`に

```vim
:set scrolloff=2
```

と記述すると、カーソル位置が画面端から2行分内側にくるように自動でスクロールしてくれます。

## 行数指定の移動

数字キーを押した後に<kbd>G</kbd>を押すと、指定した行数の位置に移動します。例えば、<kbd>1</kbd><kbd>2</kbd><kbd>3</kbd><kbd>G</kbd>とすると123行目に移動します。
<kbd>g</kbd><kbd>g</kbd>とするとファイルの先頭、<kbd>G</kbd>とするとファイルの末尾に移動します。

## マークを使った移動

Vimでは行にマークをすることで、あとで移動したり、何らかの処理をする場合の起点または終点とすることができます。例えば<kbd>m</kbd><kbd>a</kbd>とすると、現在の行をaという文字でマークします。`:delmark a`とするとマークを削除します。現在マークされている行を表示するには`:marks`とします。aというマークに移動するには<kbd>'</kbd><kbd>a</kbd>とします。その他の機能については`:help mark-motions`を参照してください。

## 単語、パラグラフ単位の移動

<kbd>w</kbd>キーを使うと次の単語の先頭、<kbd>e</kbd>で次の単語の末尾に移動します。<kbd>b</kbd>で直前の単語の先頭に移動します。
<kbd>(</kbd><kbd>)</kbd>を使うと、直前/直後の文の先頭に移動します。
<kbd>{</kbd><kbd>}</kbd>を使うと、直前/直後の段落に移動します。
括弧(`(`,`)`,`{`,`}`,`[`,`]`等)にカーソルが当たっている状態で<kbd>%</kbd>を押すと、対応する括弧に移動します。これは、Pythonの`begin`, `end`や、LaTeXの`\begin{document}`,`\end{document}`等でも機能します。

## 検索を用いる移動

<kbd>/</kbd>または<kbd>?</kbd>を押した後に検索語を入力し<kbd>Enter</kbd>を押すと、カーソル位置から下方向/上方向に検索を開始し最初の結果の位置にカーソルを移動します。<kbd>n</kbd>, <kbd>N</kbd>を押すと直前、直後の検索結果に移動します。
<kbd>*</kbd>, <kbd>#</kbd>を用いると、現在のカーソル位置の単語または識別子を下方向/上方向に検索します。

## カーソル位置の履歴を用いた移動

<kbd>Ctrl</kbd>+<kbd>o</kbd>, <kbd>Ctrl</kbd>+<kbd>i</kbd>を用いると、カーソル移動履歴(ジャンプリスト)で直前/直後の位置に移動できます。ジャンプリストは`:jumps`で見られます。
<kbd>g</kbd><kbd>;</kbd>, <kbd>g</kbd><kbd>,</kbd>とすると、変更履歴(チェンジリスト)で直前/直後の位置に移動できます。チェンジリストは`:changes`で確認できます。
ちなみに、<kbd>g</kbd><kbd>i</kbd>とすると、直前に挿入モードとなった位置に移動して挿入モードに入ります。また、<kbd>g</kbd><kbd>v</kbd>とすると直前のヴィジュアルモードで選択していた箇所を再度ヴィジュアルモードで選択します。

# カーソルの移動を伴うコマンド

ここでは、カーソルの移動と何らかの編集を同時に行ってくれるコスパのいいコマンドを紹介します。

## 行頭/行末/前後行への挿入

<kbd>I</kbd>, <kbd>A</kbd>を用いると、行頭/行末に移動して挿入モードを開始します。また、<kbd>g</kbd><kbd>i</kbd>で直前に挿入モードとなった位置から挿入モードを開始します。

## インクリメント/デクリメント

<kbd>Ctrl</kbd>+<kbd>a</kbd>, <kbd>Ctrl</kbd>+<kbd>x</kbd>を使うと、次の数字の位置にカーソルを移動して数値をインクリメント/デクリメントします。Vim8.0からは数値だけでなく英文字もインクリメント(a->b->c->...)されるようになりました。以前のように数値のみにするには、`~/.vimrc`に

```vim
set nrformats=bin,octal,hex
```

と記述します。