[VimT] コマンドラインモード¶
コマンドを打ち込んで操作するモード。 想定時間: 20分
Normalモードで:
を打つとコマンドラインモード開始です。
ESC
で終了します。
:
から始まるコマンドExコマンドといいます。
Exコマンド¶
Exコマンドはオペレータで代用できるものが多いです。
ExコマンドはVim以外のエディタ/IDEでは対応していないリスクがあるため、代用可能ならオペレータの使用をお勧めします。
オペレータよりも効率がよくなるコマンドを紹介します。
移動と複製¶
コマンド(正確な表現ではない) | 動作 |
---|---|
:[range]m[address] |
[range] を[address] に移動 |
:[range]t[address] |
[range] を[address] に複製 |
実際に試してみましょう。
以下の順にコマンドを実行してみてください。
:52m38
:53t.
▼
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000
1歩も動かずに移動や複製ができました😄
ただ、52Gdd38Gp
の方がフィードバックもあり直感的な気はします。
置換¶
置換はExコマンドでなくてはできません。
:[range]s/{pattern}/{string}/[flags]
とコマンドを打つと、[range]
の{pattern}
を{string}
に置換します。
ためしにsu
をSuuuuu!
へ置換してみましょう。
g
フラグは発見した初めの1パターンだけでなく、全てのパターンに処理をするフラグです。 (外すと1つ目しか置換されない)
:s/su/Suuuuu!/g
と実行。
▼
karasu tagayasu yatagarasu
range¶
基本的に:
の直後には[range]
を指定します。
よく使うものは以下。
表現 | 意味 | 例 |
---|---|---|
カーソル行 | :d |
|
. | カーソル行 | :.d |
N | N行目 | :4d |
N,M | N行目~M行目 | :4,8d |
N+i | N行目からN+i行目 | :4+8d |
N-i | N行目からN-i行目 | :4-8d |
% | ファイル全体 | :%d |
またVisualモードで範囲を選択した状態で:
を押すと、その範囲が[range]
になった状態でコマンド入力画面に移動します。
'<,'>
という表記ですが覚える必要はありません。
一応、'<
が選択範囲開始位置、'>
が選択範囲終了位置という意味です。
normalコマンド¶
ななななんと..Normalモードのコマンドがそのまま使えちゃいます!
やってみた方が早いのでどうぞ。
V3j:norm<space>ci'Aikawa
▼
Good morning! 'tadashi'
Oh, sorry 'tadashi'... you are vimmer..
Therefore, don't you like Emacs?
By the way 'tadashi', do you know Atsushi?
選択範囲の行全てにnorm
のあと入力したNormalコマンドが実行されます。
ドットコマンドを使えばci'Aikawa<ESC>+.2+.
と書けますが、範囲が増えるとこちらの方が速いです😄
norm
ではドットコマンドそのものも指定できるため、Normalモードで動作確認してから繰り返すこともできます。
3cwTagayasu<ESC>
jV3j:norm .
▼
1, 2, 3 is your friend!
11, 12, 13 is your friend!
21, 22, 23 is your friend!
31, 32, 33 is your friend!
41, 42, 43 is your friend!
繰り返し¶
Normalモードの操作が.
コマンドで繰り返せるように、Exコマンドも@:
で繰り返すことができます。
:<UP><CR>
でも十分ではありますが..。
外部コマンド¶
!
から始まるコマンドはシェルとして実行できます。
コマンド | 意味 |
---|---|
!{cmd} |
シェルで{cmd} を実行 (バッファには影響なし) |
r !{cmd} |
シェルで{cmd} を実行した結果をカーソル行下に挿入 |
[range]w !{cmd} |
[range] の範囲を標準入力として、シェルで{cmd} を実行する |
[range]!{cmd} |
[range] の範囲を標準入力として、シェルで{cmd} を実行した結果で置換する |
:r !whoami<CR>
と打てば自分の名前がバッファに挿入されます。
発展問題¶
高度な例として本サイトのTOPページ(html)を取得し、<meta>
データの中身を抜き出してみましょう。
No | コマンド | 意味 | |
---|---|---|---|
1 | mm |
現在位置をm としてタグ付け |
|
2 | :r !curl -s https://mimizou.mamansoft.net | head -20<CR> |
HTMLの先頭20行を挿入 | |
3 | :'m,.!grep '<meta'<CR> |
metaタグフィルタリング | |
4 | }:'m,.!sed -nr 's/.+content="(.+)".*/\1/pg'<CR> |
contentの属性抜き出し |
▼
----<result>
----
コマンドラインウィンドウ¶
Exコマンドや外部コマンドは便利ですが、コマンドを都度入力するのは大変です。
コマンドラインモードで<C-r>"
と押せばヤンクをputできるため、事前にVimで編集したコマンドをyankしておくと少し楽になります。
y$jj
V}:<C-r>"<CR>
▼
s/.md/.markdown/g
1. summary.md
-> 5 min
2. warming-up.md
-> 10 min
3. motion.md
-> 10 min
4. operator.md
-> 15 min
5. textobject.md
-> 10 min
6. visual-mode.md
-> 15 min
それよりもコマンドラインウィンドウを使った方が直感的です。
コマンドラインウィンドウでは Vimの機能を使ってコマンドを編集できます
Normalモードから開く¶
Normalでq:
と押してみてください。
:q
と押し間違えたときに馴染みのある画面になりませんか?🤓
コマンドラインウィンドウでは以下のことができます。
- Vimの検索/挿入/編集機能
- Enterでその行に記載されたコマンドが実行される
<C-c>
でその行に記載された内容をコマンドラインモードに送る
コマンドラインモードから開く¶
コマンドラインモードでコマンド入力中に編集したくなったとき便利です。
<C-f>
で開きます。
Exコマンド以外のコマンドラインウィンドウ¶
Exコマンドだけでなく検索のコマンドラインウィンドウもあります。
q:
の代わりにq/
or q?
と押せばOK。
少し前の履歴を探したいときは便利です👍