コマンドモード内容
+j^ と同じ(次の行の先頭に移動)
- にすると k^ になる
:expand(’%’)現在のバッファになっているファイルの相対パスを取得
%:p にすると絶対パス
ghカーソル位置にマウスホバーしたときの表示を出す
g&最後に実行した :s を全ての行で実行する
gi前回 insert を抜けた場所から挿入モード
gI (アイ大文字)0 カラム目から挿入モード(0 キーで移動する場所から)
g[pP]p/P で貼り付けた後、挿入したテキストの直後にカーソルを移動
eカーソル下の単語の末尾に移動
gM行の中央に移動
ge前の単語の末尾に移動(b みたいなもの)
W/B空白区切りの単語ジャンプ
zaカーソル下の折りたたみを切り替え
zf<motion><motion> 範囲を折りたたみ
:w !sudo tee %sudo で保存 :h :w_c で確認できるが、 :w !<cmd> でファイルを <cmd> の標準入力としてパイプして実行という意味 ただ sudo のパスワードを入力できなくて詰む
:(no)?ignorecase検索時の大文字小文字区別を無効化(VSCodeVimでは smartcase がついてる)
C-tinsertインデント増加
C-dinsertインデント削除
gc<motion>コメント切り替え(1行用、// など)
現在の行を1行コメントにする場合は gcc
gC<motion>コメント切り替え(複数行、/* */ など)
現在の行をブロックコメントにする際は gCC
ovisual選択範囲の逆へ移動
Ovisual矩形選択の時は、同じ行における選択範囲の逆へ移動(前方にいるなら後方に移動)
矩形でない場合は o と同じ
gu<motion>小文字にするオペレータ(guiw でカーソル下の単語を小文字に)
gU<motion>大文字
g~<motion>大文字・小文字の反転を行うオペレータ
:h <str>only<summary>
:q: ←??コマンド履歴を開く
Enter を押すとカーソル下のコマンドを実行できる
C-w +/-ウィンドウサイズを1行増減
z{count}<CR>
{count}C-w _
:res(ise)? {count}
ウィンドウの高さを {count} 行に設定
:as[cii] OR gaカーソル下の文字を ASCII コードで出力
g8カーソル下の文字を UTF-8 バイト列で出力

覚えた(かもしれない)リスト

コマンドモード内容
gd定義にジャンプ(F12)
S{char}visual選択範囲をcharで囲む
c削除してinsertモードに(ccで行削除+insert、Cで行末まで)
zz現在行が画面中央になるようにスクロール
%対応する括弧に移動
, (comma); の逆(直前にfやFで検索した方向とは逆方向に、同じ文字を検索)
C-[y/e]カーソルそのまま、1行ずつ上下(extra
C-[u/d]ページ上下(アップダウン)
tfとほぼ同じ、該当文字の一つ前に移動する
ds{char}囲い char を削除(括弧など、Delete Surround)
cs{char1}{char2}囲いchar1をchar2に(Change Surround)
ys{char}囲いcharでmotionを囲む(You Surround?)
TFとほぼ同じ、該当文字の一つ前に移動
Nnの逆(上方向に検索)
H画面の一番上にある行に移動(High)
M画面の中央にある行に移動(Middle)
L画面の一番下にある行に移動(Low)
C-omotionのundo(jump listの1つ前に戻る / 1つ前のカーソル位置に移動)
対極:C-i(motionのredo; 1つ後のカーソル位置に移動)
=自動インデント(これ機能する?)
z[tzb]現在の行を画面の{ 上部,中央,下部} に移動(Top / Bottomで t / b)
:set clipboard?現在の変数を確認(“clipboard” の部分は変数名)
:sav(eas)?名前をつけて保存+現在のバッファに設定
:%bd全バッファ削除
:noa w自動フォーマット等を無効化して保存
C-r <x>insertレジスタ <x> の中身を貼り付け

[ または ] を2つ使うやつ:1文字目は [ なら後方、 ] なら前方 2文字目が [ なら終点 }] なら始点 {
ex) ]] :前方にある始点 { にジャンプ
1文字目は自然な気がするが、2文字目は逆……?

Vimでは右・下方向が正の方向で、大文字になるとそれが逆になるっぽい

  • fは右方向に検索、Fは左方向に検索
  • oは下方向に挿入、Oは上方向に挿入
  • 反例?:ggはファイル頭にジャンプ、Gはファイル末尾にジャンプ

単語ジャンプ系は例外で、W/Bは「記号を無視して(空白区切りの)」単語移動 という意味になる

move

*は任意の文字

  • f*:*が出るまで(find)
  • w/b:単語単位で移動(forward/back)
  • gn:検索結果

レジスタ

:h {register} でヘルプ

"<x><command> でコマンドに渡したり、 @<x> でマクロとして実行したりする

  • “:レジスタのコマンド開始
  • :格納したいレジスタ
    • [a-z] で表される一般的なレジスタと、数字・記号で表される特殊なレジスタがある
      • _:”The black hole register”, 削除用のレジスタ
      • % :現在のファイル名
      • [0-9] : リングバッファみたいなやつ?
  • :y, pなど

一般レジスタは大文字にすることで追記となる(ex: "Xyyでxレジスタにヤンク内容を追記)

コマンドモードでは(: を入力した状態)C-r → レジスタ名 でレジスト内容をコマンドラインにペーストできる
ヤンクしたものをペーストしたいなら yy:<C-r>0 のようにする

検索・置換

:%s/old/new/gc :oldをnewに置換、1つずつ確認する(confirm)

\C を付けると大文字・小文字を区別する; \CsearchWord というかんじ

バイナリファイルの編集

  1. -b オプションを付けてファイルを開く(vim -b test.bin
  2. :%! xxd でバッファを16進数テキスト形式にする
  3. いい感じに編集(右のASCII表示は編集しなくていいらしい)
  4. :%! xxd -r でテキストをバイナリに戻す
  5. :w で保存

xxd -r せずに保存するとバイナリファイルがテキスト形式になってしまうので気をつけよう

diff

vim -d OLD NEW

easymotion

Leader(スペース2回)がprefix

j / kで上下行移動

参考