コンテンツにスキップ

[VimT] コマンドラインモード

コマンドを打ち込んで操作するモード。 想定時間: 20分

Normalモードで:を打つとコマンドラインモード開始です。
ESCで終了します。

:から始まるコマンドExコマンドといいます。

Exコマンド

Exコマンドはオペレータで代用できるものが多いです。
ExコマンドはVim以外のエディタ/IDEでは対応していないリスクがあるため、代用可能ならオペレータの使用をお勧めします。

オペレータよりも効率がよくなるコマンドを紹介します。

移動と複製

コマンド(正確な表現ではない) 動作
:[range]m[address] [range][address]に移動
:[range]t[address] [range][address]に複製

実際に試してみましょう。
以下の順にコマンドを実行してみてください。

  1. :52m38
  2. :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}に置換します。

ためしにsuSuuuuu!へ置換してみましょう。
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モードで動作確認してから繰り返すこともできます。

  1. 3cwTagayasu<ESC>
  2. 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しておくと少し楽になります。

  1. y$jj
  2. 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。

少し前の履歴を探したいときは便利です👍