[Vim問題] sとS、cとCの違いは?

cとC、sとS

この記事では、Vim / neovim の操作のうち、一見同じに見えて実は異なる操作についてご紹介します。

[解答] 変更する対象範囲が異なる

c と s 自体は似て非なるコマンドである点から押さえる必要があります。

c と s の違い

ヘルプを見ても、なかなか違いがわかりにくいと思いますが、次のように実際に動作を見ると違いが分かります。

cとsでIをYouに書き換え
cとsでIをYouに書き換え

s = cl ということになります。つまり、s はいきなり置換を始めてしまう一方、c は次の操作/モーションを待ちます。

この動作によって、一文字消していきなり挿入モードを始めるか、モーションで対象範囲を指定/削除してから挿入モードを始めるかの違いが出るわけです。

Vimmer の中では、対象範囲の広さから c でまかなってしまっている人が多そうです。しかし、VimGolfをやったりするなら s も活用した方が良いでしょうね。

c は change(変更)、 s は substitute(代替) の略称です。単語で覚えておいた方がラクかも知れません。

s と S の違いは?

同じように削除して挿入モードに入るという動きは変わりませんが、その削除対象が異なります。

sとSの挙動
sとSの挙動

s は一文字ですが、Sは行末までが対象となります。

S = cc とも考えられます。Shiftキーが必要になるので、ストロークが減るかと言えば微妙なところですが。

c と C の違いは?

こちらも削除して挿入モードに入るという動きは変わりませんが、その削除対象が異なります。

cとCの挙動の違い
cとCの挙動の違い

こちらも削除する対象が異なります。c は一文字またはモーションで指定した範囲までですが、Cは行末までが対象となります。

C = c$ = Di とも考えられます。こちらもShiftキーが必要になるので、ストロークが減るかと言えば微妙なところですが。

C と S の違いは?

こちらも非常に微妙な違いになります。

CとSの挙動の違い
CとSの挙動の違い

上記のアニメーションの通り、インデントが維持されるかどうかに違いが出てきます。

それ以外にも違いがあるようですが、実用上であまり気になるほどではなさそうです。

このVimコマンドの補足情報

  • 利用頻度[star rate=4]
  • 便利さ[star rate=5]
  • 覚え易さ[star rate=2]

関連するVimヘルプ

Vim のヘルプでは下記のように解説されています。

[“x]c{motion}           {motion} のテキストを [レジスタ x に入れ] 削除し、挿入
                        を始める。‘cpoptions’ がフラグ ‘E’ を含むときは、削除
                        すべきテキストがないと (例えば、”cTx” でカーソルが ‘x’
                        の直後にあるとき)、エラーが発生し挿入モードは始まらな
                        い (これはVi互換である)。
                        ‘cpoptions’ がフラグ ‘E’ を含まないときは、コマンド
                        “c” は削除すべきテキストがなくても、必ず挿入モードを始める。

[“x]cc                  [count] 行を [レジスタ x に入れ] 削除し、挿入を始める
                        (行単位linewise)。‘autoindent’ がオンのとき、最初の
                        行のインデントを保持する。

[“x]C                   カーソル位置から行の終わりまでと、[count]-1 行を [レジ
                        スタ x に入れ] 削除し、挿入を始める。”c$” と同義である
                        (行単位でないlinewise)。

[“x]s                   [count] 文字を [レジスタ x に入れ] 削除し、挿入を始め
                        る (s は Substitute –置換 を意味する)。”cl” と同義で
                        ある (行単位でないlinewise)。

[“x]S                   [count] 行を [レジスタ x に入れ] 削除し、挿入を始める。
                        “cc” と同義である (行単位linewise)。

change – Vim日本語ドキュメント

こちらは、Vim上では下記のコマンドでヘルプを確認できます。

:help c
:help C
:help s
:help S
:help cc

ヘルプで検索するときは、通常は大文字小文字は識別されませんので、どちらでも構いません。

Vimmer 必見の参考書

今回のようなVimの挙動を知るには、こちらの書籍が参考になります。

[temp id=3]

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Vim力アップして、そろそろ上級 Vimmer の仲間入りしたいIT系エンジニアの端くれです。読んでくる訪問者の皆様と一緒に、Vim力を上げていくことができる記事が書ければと考えています。