vimの便利コマンド一覧
便利だと思ったコマンドをカテゴリ別?に書き記します
やりながら覚えたい人にはvimtutorがおすすめです
vscode の拡張機能の vim でも vimkeybind は設定から変更できるので自分の使いやすい設定にしましょう
ターミナルモードについては NeoVim や Vim8 から実装されているもので、それ以外については存在しません
基本モード変更
table:ノーマルモードへ
esc ノーマルモードへ
table:インサートモードへ
o 現在の行の下に改行してインサートモード
O 現在の行の上に行を追加してインサートモード
a カーソルの右にインサートモード
A 行末に移動してインサートモード
i カーソルの左にインサートモード
I 行頭に移動してインサートモード
table:ビジュアルモードへ
v ビジュアルモードへ
V 行選択ビジュアルモードへ
<Ctrl-v> 矩形選択ビジュアルモードへ
table: コマンドモードへ
/{word} wordを検索する(のちにn で順検索、Nで逆順検索)
:{command name} 任意のコマンドを実行する
table:ターミナルモードへ
:terminal ターミナルノーマルモードを開く
i や a など ターミナルノーマルモードからターミナルジョブモードへ
<Ctrl-\><Ctrl-n> ターミナルジョブモードからターミナルノーマルモードへ
カーソル移動系
table:基本移動
h 左に移動
j 下に移動
k 上に移動
l 右に移動
gj 表示上での一つ下に移動、改行等で一行なのに複数行として表示されているときに使える
gk 表示上での一つ上に移動
table: 行移動
0 行の先頭に移動、インデントを考慮しない
^ 行の先頭に移動、インデントを考慮する
$ 行の末尾に移動
+ 下の行の先頭に移動
- 上の行の先頭に移動
table:単語移動
w 次の単語の先頭に移動
W コンマ等の連続文字列も一単語として同上
ex) author.role が一単語となる wだとauthor . role の三単語
以降単語選択という意味でのwが出てきたときWで書くと連続文字列を一単語として扱う操作ができる
b 前の単語の先頭に移動
B コンマ等の連続文字列も一単語として同上
Wと同じで以降bをBで置き換えると連続文字列を一単語として操作する
e 次の単語の末尾に移動
E コンマ等の連続文字列も一単語として同上
Wと同じで以降eをEで置き換えると連続文字列を一単語として操作する
ge 前の単語の末尾に移動
gE コンマ等の連続文字列も一単語として同上
table:一括移動
<Ctrl-u> 画面の半分の量を上に移動する
<Ctrl-d> 画面の半分の量を下に移動する
<Ctrl-b> 一画面分上に移動
<Ctrl-f> 一画面分下に移動
{ 段落上に
} 段落下に
% 対になる括弧に移動
gg ファイルの先頭に移動
G ファイルの末尾に移動
H 表示画面の一番上に移動
M 表示画面の中心に移動
L 表示画面の一番下に移動
:{count} count行目に移動, ex) :100
{count}G 同上
{count}gg 同上
table:検索移動
f 現在行の右方向に一文字検索して移動 ex) fa 右のaに移動
{num}f 現在行の右方向にnum番目の一文字検索して移動 ex) 2fa カーソルより右の二番目のaに移動
F 現在行の左に位置する一文字を検索して移動
{num}F 現在行の左方向にnum番目の一文字検索して移動 ex) 2fa カーソルより左の二番目のaに移動
t 現在行の右方向に一文字検索して手前に移動 ex) fa 右のaの一つ左に移動
f 同様 3ta 等可
T 現在行の左に位置する一文字を検索して移動 ex) Ta 左のaの一つ右に移動
F 同様 3Ta 等可
f F t T の検索後に ; 順方向に繰り返し検索
f F t T の検索後に , 逆方向に繰り返し検索
/ 順方向に文字列検索、複数行に跨って検索可 ex) /word
? 逆方向に文字列検索、複数行に跨って検索可 ex) ?word
/ ? 検索後に n 順方向に繰り返し検索
/ ? 検索後に N 逆方向に繰り返し検索
* ある単語の上にカーソルがある状態で*でその単語を順方向に検索して移動
g* カーソル下の単語を順方向に「部分一致」検索
# *の逆方向検索
g# g*の逆方向検索
ジャンプリスト
とは.vimは編集した箇所や大きくカーソル移動した箇所を保持してリスト化しています.すごくね
table:ジャンプ
:jumps ジャンプリストを表示する
<Ctrl-o> 前のジャンプリストに移動
<Ctrl-i> 次のジャンプリストに移動
変更履歴検索
vimはファイルに変更を加えてescでnormalモードに戻した箇所を保持しています.すごくね
table:変更履歴移動
g; 変更箇所に戻る
g, 変更箇所に進む
マーク移動
vimでは自分で任意の位置をマークして保持させることができます、ただ、ジャンプリストと同じ扱いになるようです、
table:mark
:marks mark一覧を表示する
m{char} カーソル位置を一文字と紐づけてマークする ex) ma 位置をaでマークする
直前のマークに移動する(マークじゃなくジャンプリストかも?)
`{char} 指定のマーク位置に移動する
'{char} 指定のマーク位置の行頭に移動する
:delmarks {char} マークの削除なんだけど、vscodeでは使えない......
自分はマークは最低限にして使わなくなったら上書きするといった感じで対応しています
:delmarks! 一括削除なんだけどvscodeでは使えない
編集系
table:編集
J 現在行と次の行を連結 3Jで3行連結 gJ で空白なし連結
> インデントを追加
<< インデントを削除
== 行のインデント整形
= + 移動系コマンド 現在位置から移動先までインデント整形
gg=G ファイル内インデント整形
<Ctrl-a> カーソル位置から右にある数字をインクリメントする
ビジュアルモードで選択した範囲にある全ての数字に対してもできる
<Ctrl-x> カーソル位置から右にある数字をデクリメントする
ビジュアルモードで選択した範囲にある全ての数字に対してもできる
u undo
<Ctrl-r> redo
table:置換
:%s/{before}/{after}/g 現在開いているファイルの before を after に置換する ex) :%s/C++/Rust/g
% なしで一行置換
:%s/{before}/{after} 最初に before にマッチしたものを after に変換する
:%s/{before}/{after}/c 最初に before にマッチしたものを after に変換する(確認付き)
:%s/{before}/{after}/g 現在開いているファイルの before を after に置換する(確認付き)
:{start},{end}s/{before}/{after}/g start 行から end 行までに before にマッチするものを after に書きかえる
:'<,'>s/{before}/{after}/g visual モードで選択中の簡易で以下略('<,'>は選択中に : で自動で出ます)
r{char} カーソル下の文字をcharで置き換える ex) rx
R インサートモードのインサートモード
普段のインサートキーを押した時と同じ挙動
g~iw カーソル下の単語の大文字小文字を入れ替える
guiw カーソル下の単語を全て小文字にする
gUiw カーソル下の単語を全て大文字にする
g~~ 行全体の大文字小文字を入れ替える
guu 行全体を小文字にする
gUU 行全体を大文字にする
table:折りたたみ
zf 折りたたみ
折りたたみ部分で space 展開
zfa{ カーソル位置の{}ブロックを折りたたみ
zc カーソル位置折りたたみ
zo 展開
table: 補完
(文字入力中に) <Ctrl-p> 前の補完、previous
(文字入力中に) <Ctrl-n> 次の補完、next
削除系(削除した内容についてはヤンクされる)
table:削除
x 一文字削除
X カーソル左の文字を削除、あんまり使わない
d visualモードで選択した部分を削除(delete の d)
d{任意の移動操作} 任意の操作によって移動する地点までを削除する ex) djで現在行とその下の行を削除
"_d 削除してもヤンクしないようになる d
dd 行削除
{count}dd count行削除
D カーソル位置から行末まで削除
C カーソル位置から行末まで削除してインサートモードへ(cut の C)
diw カーソル下の単語削除
di" "で囲まれた中身を削除
di( もしくは di) ()で囲まれた中身を削除
dit htmlタグの中身を削除
da + 何か i の代わりに a を使うことで囲っているものを含むものを削除する
ciw カーソル下の単語を削除してインサートモードへ
ci" "で囲まれた中身を削除してインサートモードへ
cit htmlタグの中身を削除してインサートモードへ
ci( もしくはci) ()で囲まれた中身を削除してインサートモードへ
ca + 何か i の代わりに a を使うことで囲っているものを含むものを削除してインサートモードに移行する
s 現在位置の一文字を削除してインサートモードへ
S 現在行を削除してインサートモードへ
cc 同上
コピー系
table:コピー
y visualモードで選択した部分をコピー
yl 1文字コピー、使わない
{count}yl count文字コピー、使わない
yw 1単語コピー(現在位置から単語末尾になることに注意)
{count}yw count単語コピー
y{任意の移動操作} 任意の操作で移動する位置までをコピー
yy 現在行コピー
yiw カーソル下の単語コピー
yi" " で囲まれた中身をコピー
yi( もしくは yi) () で囲まれた中身をコピー
yi{ もしくは yi} {} で囲まれた中身をコピー
yit htmlタグの中身をコピー
ya + 何か i の代わりに a を使うことで囲っているものを含むものをヤンクする
p カーソル右もしくは下に貼り付け
P カーソル左もしくは上に貼り付け
{count}p コピーした文字列を複数追加する ex) 10p
<Ctrl-c> vscodeに限ってビジュアルモードで<Ctrl-c>でコピー
<Ctrl-v> インサートモードで<Ctrl-v>で貼り付けできます.
外部とのやりとりはこれが使えます.
選択系
table:選択
V 行選択
<Ctrl-v> 矩形選択
行選択で複数行選択したあとIで行頭マルチカーソルインサートモードへ
Aで行末インサートモードへ
viw カーソル下の単語選択
viW カーソル下の次の空白まで選択
vi" "で囲まれた中身を選択
vi( もしくは vi) ()で囲まれた中身を選択
vi{ もしくは vi}
vit htmlタグの中身を選択
va + 何か i の代わりに a を使うことで囲っているものを含めたものを選択する
gv 直前に visual モードで選択した範囲を再度選択する
ウィンドウ系
table:画面分割
:split :sp <Ctrl-w>s ウィンドウを横に分割する
:vsplit :vs <Ctrl-w>v ウィンドウを縦に分割する
<Ctrl-w>o 分割されたウィンドウを閉じる
table:画面移動
<Ctrl-w>w 次のウィンドウに移動
<Ctrl-w>h 左のウィンドウに移動
<Ctrl-w>j 下のウィンドウに移動
<Ctrl-w>k 上のウィンドウに移動
<Ctrl-w>l 右のウィンドウに移動
table:スクロール?
zz 現在のカーソル位置が中心にくるように移動
zt 現在のカーソル位置が一番上にくるように移動
zb 現在のカーソル位置が一番下にくるように移動
<Ctrl-u> 画面の半分の量を上に移動する
<Ctrl-d> 画面の半分の量を下に移動する
<Ctrl-b> 一画面分上に移動
<Ctrl-f> 一画面分下に移動
table:タブ
gt 次のタブに移動
gT 前のタブに移動
{count}gt {count}番目のタブに移動
:tabm +1 タブを一つ右と入れ替え
:tabm -1 タブを一つ左と入れ替え
:tabm 0 タブを先頭に移動
:tabm タブを最後に移動
:tabe 新しいタブを開く
:tabnew 新しいタブを開く
:tabc 現在のタブを閉じる
:tabo 現在のタブ以外の全てを閉じる
:tabr 最初のタブに移動
:tabl 最後のタブに移動
:tabs タブ一覧を表示する
:tab split 現在のファイルを新しいタブとして開く
ファイル操作?
table:ファイル操作
:new 新規ファイルを開く(横分割)
:vnew 新規ファイルを開く(縦分割)
:e カレントファイルを再読み込み
:E カレントファイルのディレクトリを開く
:e {任意の文字列} カレントディレクトリの{任意の文字列}を検索して表示、なければ新規ファイルを開く
:oldfile 最近開いたファイルを一覧表示する
:w 保存
:q 終了
:wq 保存して終了
:q! 保存せずに終了
vscodeでは<Ctrl-s>で保存が効く、自動フォーマットもこっちで効くからこっちでいいかも
table:バッファ
:ls バッファ一覧を表示する
:b {任意の番号} :lsで一覧表示されたものから番号を選んで選択することでファイルを開く.:b 3 など
:bn 次のバッファに移動
:bp 前のバッファに移動
:b <Tab> バッファの候補を補完してくれる
インサートモードにおけるコマンド
table:補完
<Ctrl-x><Ctrl-l> 行補完
<Ctrl-p> 前の補完を表示
<Ctrl-n> 次の補完を表示
table:編集
<Ctrl-@> 前回のインサートモードで入力した文字列を入力する、
前回のインサートモードで何も書かなかったときにも記録されて無が書かれることに注意
<Ctrl-e> カーソルの下の文字を入力、カーソルのある位置ではなく下の行の文字が入力される
<Ctrl-y> カーソルの上の文字を入力
<Ctrl-h> backspace
<Ctrl-j> 改行
<Ctrl-t> インデントを一つあげる
<Ctrl-d> インデントを一つさげる
<Ctrl-u> 行頭からカーソル前まで削除
<Ctrl-w> カーソル位置の単語の先頭からカーソル前まで削除
table:移動
<Ctrl-g>j インサートモードに入った箇所の下に移動.下に行がない場合機能しない?
<Ctrl-g>k インサートモードに入った箇所の上に移動
table:その他
<Ctrl-o> 一度だけノーマルモードのコマンドを実行できるようになる、実行後インサートモードに戻る
例外
操作記録
table:操作記録
qa 記録開始、記録している間任意の操作を行う
q qaで記録開始して任意の操作後記録を終了する
@a 記録した操作を再現する
例として
$ i 1. esc qa yy p <Ctrl-a> q 8@a
これで
code:sample
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
が書ける.是非試してみて欲しい.ちょっと感動する
上が何をしてるか
まずiでインサートモードに移行する
1.と書き込む
escでノーマルモードに移行する
qaで操作記録開始
yyで一行コピー
pでペースト
<Ctrl-a>でカーソル下の数字をインクリメント
qで記録終了
8@aで8回記録した操作を再現
使い方によって化けそう
yuusuine.icon便利だと思ったものは随時書き足すと思います.