Vimのgで始まる移動コマンドまとめ

# 概要
Vimのgで始まる移動コマンドのまとめを行う。

なお、今回は移動コマンドに的を絞るので、
下記のようなコマンド（オペレータコマンド）は取り上げない。

| command | description |
|-|-|
| g~  |   大文字/小文字を入れ換える |
| gu  |   小文字にする |
| gU  |   大文字にする |
| gq  |   テキストを整形する |
| gw  |   カーソルを移動させすにテキストを整形する |
| g?  |   ROT13 エンコーディング |
| g@  |   オプション 'operatorfunc' に設定された関数を呼ぶ |


なお、全てノーマルコマンドである。[count]はカウントを示す。太字はほぼ引用。

# 内容
## 手短に
| command | description |
| - | - |
|  g_ |  [count - 1]行下の最後の非空白文字へ移動。 | 
|  g0 or g\<Home\> |  スクリーン上の現在の行でもっとも左の文字に移動。 | 
|  g^ |  スクリーン上の現在の行でもっとも左側にある非空白文字に移動。 | 
|  gm |  スクリーンの幅の真ん中に移動。 | 
|  gM | 行のテキストの真ん中に移動。カウントあり: 行のテキストのこの割合まで。 | 
|  g$ or g\<End\> |  スクリーン上に表示されている現在の行の最も右の文字に移動。 | 
|  gk or g\<Up\> |  [count] 表示行上に移動。 | 
|  gj or g\<Down\> |  [count] 表示行下に移動。 | 
|  gg |  [count] 行目の最初の非空白文字に移動。カウント前置がなければ最初の行に。 | 
|  go |   [count] バイト目に移動。デフォルトでは [count] は1で、ファイルの最初。[range] が指定された場合は最後の数字。 | 
|  ge |  [count] word 後方の単語の最後に。(空白コンマ括弧などの区切り) | 
|  gE |  [count] WORD 後方の単語の最後に。(空白区切り) | 
|  g'{mark} g`{mark} |  {mark} へジャンプ。カレントバッファ内ではジャンプリストを変更しない。 | 
|  g; |  変更リスト中の [count] 個前の位置に移動。 | 
|  g, |  変更リスト中の [count] 個後の位置に移動。 | 

## `g_`
**[count - 1]行下の最後の非空白文字へ移動。**

参考：`_`  [count] 行下の最初の非空白文字に移動します

例：`3g_`で2行下の最後の非空白文字（行末が空白でなければ行末）へ移動。


筆者注：「最初の」を「最後の」に変更するときgを付ければいいことになる。知らなかった(. .)

## `g0` or `g<Home>`
**スクリーン上の現在の行でもっとも左の文字に移動します。最初の文字がスクリーン上にない場合に "0" とは違う動作になります。**

参考：`0` その行の最初の文字に移動します。

筆者注：「スクリーン上の」に限定するときgを付ければいいことになる。しかし、あえて使ったことはない(. .)

## `g^`
**スクリーン上の現在の行でもっとも左側にある非空白文字に移動します。最初の非空白文字がスクリーン上にない場合に"^" とは違う動作になります。**

参考：`^` その行の最初の非空白文字に移動します。

筆者注：「スクリーン上の」に限定するときgを付ければいいことになる。g0と同様。しかし、あえて使ったことはない(. .)


## `gm`
**"g0" と似ていますがスクリーンの幅の真ん中に移動します(もしくは可能な限り真ん中に向かって右に)。**

参考：`m` マークをつけるときに使われる。全く別種のコマンド。

筆者注：middleのgであろう。次のgMとセットと捉えるのが良いかもしれない。知らなかった(. .)

## `gM`
**"g0" と似ていますが行のテキストの真ん中に移動します。カウントあり: 行のテキストのこの割合まで。したがって、"10gM" はテキストの始まり近くにあり、"90gM" はテキストの終わり近くにあります。**

参考：`M` スクリーンの中央の最初の非空白文字に移動します。

筆者注：「行の」を「列の」に変換するときにgを付ければいいことになる。gmと違って元ネタあり。知らなかった(. .)

## `g$` or `g<End>`
**スクリーン上に表示されている現在の行の文字のうち最も右に位置するものに移動します。行の最後の文字がスクリーン上にないかカウントが使われた場合に "$" とは違う動作になります。さらに、縦方向への移動は、行末でなく同じ桁になります。**

参考：`$` その行の最後に移動します。カウントが指定された場合は、[count - 1] 行下、もしくは可能な限り移動します。

筆者注：「スクリーン上の」に限定するときgを付ければいいことになる。更に$と微妙に動作が変わってくる模様。しかし、あえて使ったことはない(. .)

## `gk` or `g<Up>`
**[count] 表示行上に移動。**

参考：`k` [count] 行上に移動

筆者注：「スクリーン上の」に限定するときgを付ければいいことになる。下のgjとセット。割と使う(. .)


## `gj` or `g<Down>`
**[count] 表示行下に移動。**

参考：`j` [count] 行下に移動

筆者注：「スクリーン上の」に限定するときgを付ければいいことになる。上のgkとセット。割と使う(. .)

## `gg`
**[count] 行目の最初の非空白文字に移動します。カウントの前置がなければ最初の行に移動します。**

参考：`G` [count] 行目の最初の非空白文字に移動します。カウントの前置がなければ最後の行に移動します。

筆者注：Vimは行を示すときにリピートやgを使う印象。global? go to? hjklの隣?。よく使う(. .)

## `go`
**バッファ中の [count] バイト目に移動します。デフォルトでは [count] は1で、ファイルの最初になっています。[range] が指定された場合は最後の数字が使われます。行の終わりを示す文字が数えられるかどうかは 'fileformat' の設定によります。**

参考：`:[range]go[to] [count]` 同上

筆者注：これはg+oではなくて、go。バイナリファイルの編集するときとかに使うのか？使ったことない(. .)


## `ge`
**[count] word 後方の単語の最後に。**

参考：`e` [count] word 前方の単語の終わりに。

筆者注：「後方の」を「前方に」に変換するときにgを付ければい良いことになる。たまに使う(. .)

## `gE`
**[count] WORD 後方の単語の最後に。**

参考：`E` [count] WORD 前方の単語の終わりに。

筆者注：「後方の」を「前方に」に変換するときにgを付ければい良いことになる。ごくたまに使う(. .)
(WORDは空白文字で区切られたもので、例えば abc,defは2wordで1WORDである。詳細はヘルプ参照)


## `g'{mark}` ``g`{mark}``
**{mark} へジャンプするが、カレントバッファ内で移動する場合にはジャンプリストを変更しない。例: g`" これはファイル内の最後の記憶している位置にジャンプする。**

参考：`'{mark}` `` `{mark}`` マークへジャンプ

筆者注：「ジャンプリストを極力変換したくないとき」にgを付ければい良いことになる。あえて使ったことはない(. .)

## `g;`
**変更リスト中の [count] 個前の位置に移動します。[count] が前の変更箇所の数より大きければ、最も古い変更箇所へ移動します。それ以上古い変更が無ければエラーメッセージが表示されます。(移動コマンドではありません)**

参考：`;` [count] 回最後の f, t, F, T を繰り返します。

筆者注：このgの出どころはわからない。下記のg,とセット。;と,で使われることが多い。使いたいと思う(. .)
（移動コマンドではありません、はジャンプコマンドであってという話？オペレータと組み合わせられないという話？）


## `g,`
**変更リスト中の [count] 個後の位置に移動します。g; の逆方向で、あとは同様です。(移動コマンドではありません)**

参考：`,`  [count] 回最後の f, t, F, T を反対方向に繰り返します。

筆者注：このgの出どころはわからない。上記のg;とセット。;と,で使われることが多い。使いたいと思う(. .)



# 考察１：章立てでのまとめ
1. 移動とオペレータ
2. 左右の移動
    1. `g_`
    1. `g0` or `g<Home>`
    1. `g^`
    1. `gm`
    1. `gM`
    1. `g$` or `g<End>`
3. 上下の移動
    1. `gk` or `g<Up>`
    1. `gj` or `g<Down>`
    1. `gg`
    1. `go`
4. 単語単位の移動
    1. `ge`
    1. `gE`
5. オブジェクト単位で移動
6. オブジェクト単位で選択
7. マーク
    1. `g'{mark}` ``g`{mark}``
8. ジャンプ
    1. `g;`
    1. `g,`
9. 様々な移動

(ここまで)


章立てはヘルプのまま
gはオブジェクトの操作としてはあまり登場していないように見える。

gなしでのコマンドは基本的には同じ章に現れるが、`g_`, `gm`, `gM`, `g;`, `g,`(あと、`gg`, `go`は例外)は別の章に現れる。
中でも`_`は左右ではなく上下の移動として、`M`は左右の移動ではなく、9.様々な移動に出現する。


# 考察2: 作用素としてのgの解釈チャレンジ(考察2'もあり)
「逆方向としてのg」：`g_`, `gM`, `ge`, `gE` (最初vs最後、行vs列、前vs後)
「表示行の(スクリーン上の)としてのg」：`g0`, `g^`, `g$`, `gk`, `gj`
「ジャンプリストを極力変更しないとしてのg」：`g'{mark}`, ``g`{mark}``
(行vs列を逆方向としたのは、人によっては逆鱗に触れるかもしれない。)

惜しい意味として、
「スクリーン上の」「gMの対としての」：`gm`
「行としてのg」：`gg`
「goとしてのg」：`go`
「？？？」：`g;`, `g,`

# 考察2': 考察2の問題点
「では逆方向にしたい時はgを付ければいいのか？」などの問いの答えは明らかにNOである。
考察2はgのもつ一般的な性質を見るのではなくて、gをコマンドに用いようとした時の思いを推測するための作業に過ぎない。

基本的には「似た感じの新しいコマンドを作りたい」という気分を感じる。耳をすませば`g;`, `g,`も納得できる？

気が向いたら「逆方向にしたい時にgをつけたらどのくらいコマンドが交差するのか？」は調べてみようかなと思ったり思わなかったり。

# 考察3: 覚え方(個人的)
「表示行としての」という`g0`, `g^`, `g$`, `gk`, `gj`は直感的であり、「逆方向」もいざそのときになればそれなりに思い出せると思う。(個人的には"graphical"の"g"だと思っている)

「ジャンプリストを極力変更しない」`g'{mark}`, ``g`{mark}``については、ジャンプリストを気にする繊細さがあれば覚えていると思う。

`gg`は覚えていることが多いでしょう。
`gm`は真ん中に移動したいときに`gM`と間違えながら覚えていくでしょう。
`go`は必要があれば覚えるでしょう。
`g;`, `g,`は「最後に編集したところへ行くコマンドなんだっけ？」と思えばじきに覚えるでしょう。正直少し特殊だと思う。
`g_`は`_`を使わないのでなかなか覚えられる気がしない。

# 感想
g;, g,は移動コマンドではないとは言われたがまとめてしまった。

考察等は不十分なことが多々あると思いますが、コマンドを網羅したのは自分としてはよくやったと思っている。


# 参考文献・出典
https://vim-jp.org/vimdoc-ja/motion.html