Ctrl+W・Ctrl+U・Option+Deleteはどこまで消す?bash・zsh・Claude Codeで実測

同じ削除キーでも、残る文字列が違う

cd ~/work/my-app/src の末尾で、最後の src だけを消したい。そんなとき、Ctrl+WとOption+Deleteのどちらを使うかは、入力している場所によって変わる。

今回の実測記録では、bashと端末内のClaude Codeは、Ctrl+Wでパス全体を消し、Option+Deleteでは末尾の src だけを消した。一方、既定のzshでは、どちらもパス全体が消えた。「単語を消す」という説明だけでは、その単語に / や . が含まれるかまでは分からない。

Ctrl+Uにも違いがある。カーソルが行末なら、今回試した文字列は三者とも全部消えた。しかし、行の途中では、bashとClaude Codeはカーソルより左を消し、zshは右側も含めて行全体を消した。行末で同じ結果になっても、削除範囲の規則が同じとは限らない。

比較するのは、単語の区切りと、カーソルを基準にした削除範囲だ。公式文書にある規則と実測記録を対応させると、使い分ける条件が見えてくる。

公式文書では「空白」「英数字」「行全体」を区別する

GNU Readlineの公式マニュアルは、Ctrl+Wに対応するコマンドを次のように説明している。

unix-word-rubout (C-w) Kill the word behind point, using white space as a word boundary, saving the killed text on the kill-ring.

出典: https://tiswww.case.edu/php/chet/readline/readline.html (取得日 2026-10-20)

ここで境界になるのは空白だ。一方、M-DELの backward-kill-word は backward-word と同じ単語境界を使い、その単語は英字と数字で構成されると説明されている。Ctrl+Uの unix-line-discard は、カーソルから現在の行の先頭までを後方に削除する。

このマニュアルは最新版のReadlineのものだが、実測対象のbash 3.2.57では、bind -q によって各キーの割り当ても確認されている。

Claude Codeの公式文書も、Ctrl+Wと単語削除の違いを明記している。

Ctrl+W is different: it ignores punctuation and deletes back to the previous whitespace, so one press removes all of src/utils/foo.ts.

出典: https://code.claude.com/docs/en/interactive-mode (取得日 2026-10-20)

同じ文書では、Option+Deleteなどの単語操作について、英字と数字の連続を単語とし、_、.、/ などの記号は区切りになると説明している。また、中国語や日本語のように空白なしで書かれた文章でも、単語単位で移動・削除するとしている。

zsh 5.9では、Ctrl+WとOption+Deleteに対応する ESC-^? が、同じ backward-kill-word に割り当てられている。Ctrl+Uは kill-whole-line で、説明は次のとおりだ。

Kill the current line.

出典: https://github.com/zsh-users/zsh/blob/zsh-5.9/Doc/Zsh/zle.yo (取得日 2026-10-20)

さらに、zshには英数字以外で単語の一部とみなす文字を指定する WORDCHARS がある。単語境界を見るには、キーの名前だけでなく、この設定も確認する必要がある。

出典: https://github.com/zsh-users/zsh/blob/zsh-5.9/Doc/Zsh/params.yo (取得日 2026-10-20)

実測ではパスの末尾と行の途中で差が出た

実測日は2026-10-20。環境はmacOS(Darwin 25.5.0・arm64)、OS付属のbash 3.2.57(1)-release、zsh 5.9、Claude Code v2.1.303、tmux 3.5aだった。

bashは bash --norc --noprofile と set -o emacs、zshは zsh -f と bindkey -e で起動。環境変数は HOME、TERM=xterm-256color、PATH=/usr/bin:/bin、LANG=en_US.UTF-8 だけとし、EDITOR と VISUAL は空だった。Claude Codeは claude --safe-mode で起動している。

測定ではキーボードを物理的に押さず、tmux send-keys -H でキーに対応するバイト列を送った。Ctrl+Wは 0x17、Ctrl+Uは 0x15、Option+Deleteは ESC DEL(0x1b 0x7f)である。Option+Deleteの結果は、このバイト列が届いた場合の結果として読む必要がある。

各試行ではキーを一回だけ送り、tmuxの画面に残った行を読んだ。シェルは毎回起動し直し、Claude Codeは入力欄を空にしてから試している。Claude CodeでEnterは押しておらず、入力内容は送信していない。

次は、行末にカーソルを置いた実測結果の比較だ。

入力先 cd ~/work/my-app/src にCtrl+W 同じ入力にOption+Delete echo 日本語のテキスト にOption+Delete
bash 3.2.57 パス全体が消えた src が消えた 日本語のテキスト が消えた
zsh 5.9(既定) パス全体が消えた パス全体が消えた 日本語のテキスト が消えた
Claude Code v2.1.303 パス全体が消えた src が消えた テキスト が消えた

bashとClaude Codeは、パスの例では一致しているが、日本語のOption+Deleteでは一致しない。この結果から、両者の単語削除がすべて同じとは言えない。

行の途中については、git commit -m "fix typo" の fix の直後にカーソルを置いた。以下は実測記録の表をそのまま引用したものだ。

キー bash 3.2.57 zsh 5.9(既定) Claude Code v2.1.303
Ctrl+U typo" (空=行全体が消えた) typo"
Ctrl+W git commit -m typo" git commit -m " typo" git commit -m typo"

Ctrl+Uでは右側を残すかどうか、Ctrl+Wでは左側の引用符まで消すかどうかが分かれた。zshでは " が WORDCHARS に含まれず、単語の区切りになるため、fix だけが消えて引用符が残っている。

どちらを使うかは、残したい区切りで決める

今回のパスの例なら、bashとClaude Codeで末尾の要素だけを消したい場合はOption+Delete、空白までまとめて消したい場合はCtrl+Wという使い分けになる。zshの既定設定では両方が同じ結果なので、キーを変えるだけでは、この二つの範囲を選び分けられなかった。

zshで単語の扱いを調整する方法として、実測記録には WORDCHARS と select-word-style の比較がある。WORDCHARS から / だけを抜くと、backup/file.txt.bak は backup/ まで残った。空にすると、同じ入力は backup/file.txt. まで残った。スラッシュだけを境界にしたいのか、ドットも境界にしたいのかで結果が変わる。

select-word-style には名前による落とし穴がある。公式の bash 型の説明は次のとおりだ。

Word characters are alphanumeric characters only.

出典: https://github.com/zsh-users/zsh/blob/zsh-5.9/Doc/Zsh/contrib.yo (取得日 2026-10-20)

実測した五つの文字列では、select-word-style bash はbashのOption+Deleteと同じ残り方になった。bashのCtrl+Wと一致したのは select-word-style whitespace だった。「bashという型だからCtrl+Wもbashと同じ」と考えると、期待する範囲とずれる。

どちらの型でも、zshのCtrl+WとOption+Deleteは同じ結果だった。この設定だけでは、bashのように二つのキーで削除範囲を分けられなかった。

適用範囲にも注意したい。新しいbashの5系、設定を読み込んだzsh、Claude CodeのデスクトップアプリやVS Code拡張は測定していない。また、ターミナル.appやiTerm2でOption+Deleteを物理的に押した際、実際に何が送られるかは確認できなかった。

自分の環境で確かめる手順

まずzshで、bashのCtrl+Wに相当する空白区切りの削除を試すなら、次を順に実行する。以下は読者が確認するためのコマンドであり、実行結果は載せていない。

zsh -f
bindkey -e
autoload -Uz select-word-style
select-word-style whitespace

続いて cd ~/work/my-app/src を入力し、Enterを押さず、行末でCtrl+Wを一回押して残り方を確認する。同じ文字列を入力し直し、Option+Deleteでも確認する。bash 型と比べる場合は、最後のコマンドの whitespace を bash に変えて試す。

Ctrl+Uは行末だけで判断せず、git commit -m "fix typo" を未実行のまま入力し、カーソルを fix の直後に置いて確かめたい。左側が消えたあと、右の typo" が残るかを見ることで、行末の試行では見えなかった削除範囲の違いを確認できる。

コメント

タイトルとURLをコピーしました