オペレータ+モーション練習ドリル5問
オペレータとモーションの組み合わせは、説明を読んだだけでは身につきません。実際に「このキー操作をしたら結果はどうなるか」を自分の頭で予測してから答え合わせをすると、理解の定着がまったく違います。5問用意したので、紙とペン代わりに頭の中でカーソルを動かしてみてください。
表記のルール:|はカーソル位置を表します。答えは答えを見るをクリックすると表示されます。
| キー | これだけ覚える |
|---|---|
| dw | カーソル位置から次の単語の先頭まで削除 |
| cw | カーソル位置から単語の末尾までを変更 |
| ciw | カーソル位置に関係なく単語全体を変更 |
| {数字}dw | 単語をn個まとめて削除(2dwなど) |
解き方のコツ
いきなりキー全体を眺めて混乱するより、1文字ずつ「これはオペレータか、モーションか、それとも入力する文字か」を区別しながら進めると分かりやすくなります。dwならdがオペレータ、wがモーションです。ciwならcがオペレータ、iwがテキストオブジェクトという具合に、まず構造を分解してから1つずつ適用していくと迷いにくくなります。
問題1
次のテキストに対してdwwを実行すると、どうなりますか。
|apple banana cherry
答えを見る
dwで「apple 」が削除されて「banana cherry」になり、続くwで「cherry」の先頭へ移動します。
banana |cherry
問題2
次のテキストに対してwdwを実行すると、どうなりますか。
|one two three four
答えを見る
wで「two」へ移動し、dwで「two 」が削除されます。
one |three four
問題3
次のテキストに対してciwslow<Esc>を実行すると、どうなりますか。カーソルは単語の途中にあります。
The qu|ick brown fox
答えを見る
ciwはカーソル位置に関わらず単語全体(quick)を対象にするので、途中にカーソルがあっても問題なく丸ごと置き換わります。
The slow| brown fox
問題4
次のテキストに対してwcwbar<Esc>を実行すると、どうなりますか。
|def foo():
答えを見る
wで「foo」の先頭へ移動します(「(」は別の単語として区切られるため、「foo」の頭で止まります)。cwは「foo」だけを対象にし、直後の「(」には影響しません。
def bar|():
問題5
次のテキストに対して2dwを実行すると、どうなりますか。
|one two three four five
答えを見る
数字の2は続くコマンドを2回実行する、という意味になります。dwを2回、つまり「one 」と「two 」の2単語分がまとめて削除されます。
|three four five
問題6
次のテキストに対してcwslowEscを実行すると、どうなりますか。問題3と同じ文で、カーソル位置も同じです。
The qu|ick brown fox
答えを見る
cwが対象にするのはカーソル位置から単語の末尾までなので、手前の「qu」は残ります。単語全体を置き換えるciwとの差がそのまま出る場面です。
The quslow| brown fox
問題7
次の3行の1行目にカーソルがあるとき、djを実行するとどうなりますか。
|alpha
bravo
charlie
答えを見る
jは行単位(linewise)のモーションなので、オペレータの対象も行ごとになります。カーソルのある行と次の行が、行まるごと消えます。文字単位のつもりでdjを押すと2行消えて驚く、というのはよくある引っかかりです。
|charlie
こうしたドリルを自分用に作って解いてみると、分かったつもりでいたcwの挙動を正確には説明できていなかったことに気づかされました。特に単語の境界がどこで区切られるかは、実際に手を動かして初めて体で理解できた部分が多いです。
まとめ
オペレータとモーションの理解を深めるには、説明を読むより実際に予測して確認するほうが効果的です。cw/ciwの違いをさらに詳しく知りたい場合は別記事も参照してください。モーションが行単位か文字単位かで結果が変わる話は移動コマンドの一覧と合わせて見ると整理しやすくなります。