実践Vimを読んで、自分がよく使うものをまとめています。
■ 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 # レジスタの一覧を表示
レジスタを指定したヤンクとプット
# 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} # 記録したマークに移動する
折りたたみ
# カーソル位置の要素の折り畳み
zc # 折り畳み
zo # 展開(一段階)
zO # 展開(すべて)
# ファイルの全要素の折り畳み
zm # 折り畳み(一段階)
zM # 折り畳み(すべて)
zr # 展開(一段階)
zR # 展開(すべて)
# その他
zf{motion} # 折りたたみ
za # 折りたたみの開け閉め
zi # 折りたたみの無効・有効切り替え
折りたたみの使用例
# 1. {}で囲まれた部分を折り畳む
f{zf%
■ 7. マクロ
q{register} # マクロ記録開始
q # マクロ記録終了
@{register} # マクロを実行
[num]@{register} # [num]回マクロを実行