vimコマンドチートシート

実践Vimを読んで、自分がよく使うものをまとめています。

https://www.amazon.co.jp/dp/B00HWLJI3U


# ■ 1. ノーマルモード

## オペレータ(テキスト操作)

オペレータとはテキストに対する操作(削除や変更)に利用されるコマンドです。
オペレータは後述のモーション(移動)と組み合わせて使います。

```
c{motion}  # 削除して編集モードに移行
d{motion}  # 削除
y{motion}  # ヤンク(コピー)
g~{motion} # 大文字と小文字を入れ替える
gu{motion} # 小文字化
gU{motion} # 大文字化
>{motion}  # インデントを深くする
<{motion}  # インデントを浅くする
={motion}  # 自動インデント
```

## モーション(移動)

モーションとはカーソルの移動に利用されるコマンドです。
モーションは単体でカーソルの移動に利用するほか、オペレータと組み合わせて利用することで、オペレータの対象範囲を指定することができます。

```
h            # 左に移動
j            # 下に移動
k            # 上に移動
l            # 右に移動
{operator}   # オペレータと同一文字は現在カーソルが存在する行を表す
l            # カーソルがあたっている1文字
w|W          # 次の単語の先頭まで移動(Wはスペースからスペースまでを1単語と見なす)
e|E          # 次の単語の末尾まで移動(Eはスペースからスペースまでを1単語と見なす)
b|B          # 前の単語の先頭まで移動(Bはスペースからスペースまでを1単語と見なす)
ge|GE        # 前の単語の末尾まで移動(GEはスペースからスペースまでを1単語と見なす)
f|F{char}    # {char}まで移動(Fはカーソルより前方を探索)。「;」で次の{char}まで移動、「,」で前の{char}まで移動
t|T{char}    # {char}の直前まで移動(Tはカーソルより前方を探索)。「;」で次の{char}まで移動、「,」で前の{char}まで移動
/{string}    # {string}の先頭文字まで移動。nで次の{string}、Nで前の{string}まで移動
0            # 行の先頭まで移動
^            # インデントを除いた行の先頭まで移動
$            # 行の末尾まで移動
gg           # ファイルの先頭まで移動
G            # ファイルの末尾まで移動
%            # カーソルから一番近い括弧の閉じ括弧まで移動。(使える括弧は()[]{}のいずれか)
a{delimiter} # {delimiter}の始まりから終わりまで({delimeter}を含む)。オペレータといっしょに使う。
i{delimiter} # {delimiter}の始まりから終わりまで({delimeter}を含まない)。オペレータといっしょに使う。
it           # html,xmlタグの内部。オペレータと一緒に使う
p            # パラグラフの区切りまで。オペレータと一緒に使う。
```

## オペレータとモーションの組み合わせ利用例

```
# 1. カーソルの文字を大文字化する 
#   - オペレータ: gU 大文字化
#   - モーション: l カーソルの文字
gUl

# 2. 現在カーソルが存在する行を大文字にする
#   - オペレータ: gU 大文字化
#   - モーション: {operator} オペレータと同一文字はカーソルが存在する行を表す
gUU

3. ""の中の単語を削除する
#   - オペレータ: d 削除
#   - モーション: i{delimiter} デリミタ(")の始まりから終わりまで("を含まない)
di"

4. ""の中の単語を"ごと削除する
#   - オペレータ: d 削除
#   - モーション: a{delimiter} デリミタ(")の始まりから終わりまで("を含む)
da"

5. ファイルの末尾まで自動インデントする
#   - オペレータ: = 自動インデント
#   - モーション: G 現在のカーソルからファイルの末尾まで
=G

6. 現在カーソルの単語をヤンクする
#   - オペレータ: y ヤンク(コピー)
#   - モーション: i{delimiter} デリミタ w は次の単語の先頭までを表すため、 iw で現在カーソルが存在する単語の先頭から末尾までを表す。
yiw

7. 現在行を含めた3行をヤンクする
#   - オペレータ: y ヤンク(コピー)
#   - モーション: 3{operator} カーソルが存在する行を含めた3行
y3y

8. 現在カーソルから「.」までを削除して編集モードに移行
#   - オペレータ: c 削除して編集モードに移行
#   - モーション: t{char} 「.」まで
ct.

9. htmlタグのテキストを削除。<div>xxxx</div>のxxxxの部分。
#   - オペレータ: d 削除
#   - モーション: it html,xmlタグの内部
dit
```

## その他よく使うコマンド

※ `<C-任意の文字>` は `ctrl` を押しながら、任意の文字を入力の意味

```
r     # 置換モードに移行(1文字置換したらノーマルモードに戻る)
R     # 置換モードに移行(<Esc>を入力するとノーマルモードに戻る)
J     # 改行文字をスペースに置換
u     # 直前の変更を取り消す
<C-r> # uで取り消した変更を元に戻す
```

# ■ 2. レジスタの操作

※ `[]` に囲まれた部分はあってもなくてもOK

```
["{register}]p  # 次の行(カーソル位置)にペースト(ノーマルモード)
["{register}]P  # 前の行(カーソル位置)にペースト(ノーマルモード)
["{register}]gp # ペースト後カーソルを末尾に移動(ノーマルモード)
<C-r>{register} # ペースト(挿入モード、コマンドラインモード)
```

```
"{a-z}  # 通常のレジスタ
"%      # 現在のファイル名
"_      # /dev/null的なレジスタ
"0      # ヤンク専用レジスタ
:reg    # レジスタの一覧を表示
```

## レジスタを指定したヤンクとプット

```tips=>
# 1. レジスタaを指定して1行ヤンク
"ayy

# 2. レジスタaを指定してノーマルモードでプット
"ap

# 3. 単語をヤンクして検索
yiw # 単語をヤンク
/<C-r>0
<CR>

# 4. ヤンク専用レジスタへのヤンクとプット
yy
"0p
```

# ■ 3. 挿入モード

## ノーマルモードから挿入モードへ移行するコマンド
```
i # 挿入モードに移行 
I # 空白行を除いた行の先頭に移動して挿入モードに移行
a # 次の文字に移動して挿入モードに移行
A # 行末に移動して挿入モードに移行
o # 次の行に新しい行を挿入して挿入モードに移行
O # 直前の行に新しい行を挿入して挿入モードに移行
C # 現在カーソルから末尾行までを削除して挿入モードに移行
s # 現在カーソルの文字を削除して挿入モードに移行
S # 現在行を削除して挿入モードに移行
```

## 挿入モードで利用するコマンド

```
<C-v>{code}     # 文字コードを指定して文字を入力
<Esc>           # ノーマルモードに移行
```

## 文字コードからテキストを入力

```
# 1. 緑を入力
<C-v> u7DD1
```

# ■ 4. ビジュアルモード

## ノーマルモードからビジュアルモードに移行するコマンド

```
v     # 文字志向のビジュアルモードに移行
V     # 行志向のビジュアルモードに移行
<C-v> # ブロック志向のビジュアルモードに移行
```

## ビジュアルモードのコマンド

```
o     # 選択範囲の始点と終点を入れ替える
```

## ビジュアルモードの利用例

```
# 1. 複数行をまとめて2段インデント
VG # 末尾までを範囲指定
>.

# 2. 複数行に対してマクロを並列実行
レジスタaにマクロを登録
V# 3行を範囲指定
:'<,'>normal @a

# 3. 複数行の末尾に;を挿入する
<C-v>jj$ # 3行を末尾まで指定
A;
<Esc>

# 4. 複数行の単語をまとめて置換
<C-v>jje # 3行の特定単語を選択
c{text}
<Esc>

# 5. 1行をすべて同じ文字で埋める
Vr{char}
```

# ■ 5. コマンドラインモード

## ノーマルモードからコマンドラインモードに移行するコマンド

```
:     # コマンドラインモードに移行する。
q:    # コマンドラインモードで利用したコマンドの履歴を表示する
```


## コマンドラインモードのコマンド

※ `[]` に囲まれた部分はあってもなくてもOK

```
:[{range}]s/{pattern}/{replace}/[g] # [range]指定した行に対して{pattern}を{replace}に置換 
:[{range}]normal {cmd} # [range]指定した行に対してノーマルモードの{cmd}を実行
:! {cmd}             # shellで{cmd}を実行
:shell               # インタラクティブシェルプロセスを起動。(exit)で抜ける
:r ! {cmd}           # shellで{cmd}を実行し、標準出力を次の行に挿入する
:[{range}]w ! {cmd}    #  [range]指定した行を標準入力として、shellで{cmd}を実行する
:[{range}]! {cmd}      #  [range]指定した行に対して、shellで{cmd}を実行する
```


## コマンドラインモードの使用例

### {range}の利用例

```
# 1. 2-5行目を指定
2,5

# 2. 現在行から末尾までを指定
.,$

# 3. 全部
%

# 4. ビジュアルモードで指定した範囲(ビジュアルモードでの範囲選択中に:を入力)
'<,'>

# 5. パターンでの範囲指定
/{pattern1}/,/{pattern2}/
```

### rangeで指定した範囲に対する操作

```
# 1. ファイル内のoneをすべてONEに置換
:%s/one/ONE/g

# 2. 現在行から末尾までを自動インデント
:.,$ normal ==

# 3. selectの内容を貼り付ける
:r! mysql -u root -t -e "select * from 10080_1_log.keywordlog limit 10"

# 4. 今書いているshellスクリプトを保存して実行する
:w | ! sh %

# 5. tsvファイルを2カラム目でソート
:%!sort -t $'\t' -k 2

# 6. ファイル内をgrepで検索
:%w ! grep -n "function"
```

# ■ 6. ファイルの操作
```
:e {path} # {path}をオープンする
```

## ファイラ(netrw)の操作

```
:Ve  # 縦方向に分割して左のウィンドウでファイラをオープン
:Ve! # 縦方向に分割して右のウィンドウでファイラをオープン
:Te  # 新しいタブでファイラをオープン
:e.  # カレントディレクトリでファイラをオープン
i    # ディレクトリの表示形式を変更
v    # ファイルを右に分割して開く
o    # ファイルを下に分割して開く
t    # ファイルを新しいタブで開く
```

## 画面分割
```
<C-w>v    # 画面を左右に分割
<C-w>s    # 画面を上下に分割
<C-w>j    # 右の画面に移動
<C-w>k    # 上の画面に移動
<C-w>h    # 下の画面に移動
<C-w>l    # 左の画面に移動
<C-w>=    # 画面の大きさを揃える
{n}<C-w>_ # アクティブなウィンドウの高さを{n}行にする
{n}<C-w>| # アクティブなウィンドウの高さを{n}文字にする
:clo      # アクティブなウインドウを閉じる
:on       # 非アクティブなウィンドウを閉じる
```

## タブ操作

```
:tabnew      # 新しいタブを開く
:tabe {path} # {path}を新しいタブで開く
:tabc        # 現在のタブページを閉じる
:tabo        # 非アクティブなタブページを閉じる
<C-w>T       # 現在のウィンドウを独立したタブページに移動する
gt           # 右のタブに移動
gT           # 左のタブに移動
```

## ディレクトリをまたいで検索

```
:vimgrep /{pattern}/[j] {path} |cw
```

## マーク

```
:marks       # マークの一覧を表示
m{A-Z}       # 現在ファイルの現在カーソル位置にマークをつける
`{A-Z}       # 記録したマークに移動する
```

## 折りたたみ

https://maku77.github.io/vim/advanced/folding.html

```
# カーソル位置の要素の折り畳み
zc # 折り畳み
zo # 展開(一段階)
zO # 展開(すべて)

# ファイルの全要素の折り畳み
zm # 折り畳み(一段階)
zM # 折り畳み(すべて)
zr # 展開(一段階)
zR # 展開(すべて)

# その他
zf{motion} # 折りたたみ
za # 折りたたみの開け閉め
zi # 折りたたみの無効・有効切り替え
```

### 折りたたみの使用例

```
# 1. {}で囲まれた部分を折り畳む
f{zf%
```

# ■ 7. マクロ
```
q{register}      # マクロ記録開始
q                # マクロ記録終了
@{register}      # マクロを実行
[num]@{register} # [num]回マクロを実行
```