tl;dr
以下の通り.zshrcに追記する
# '/' を単語の境界として認める typeset -g WORDCHARS=${WORDCHARS:s@/@}
登場人物
typesetシェル変数を書き換える-gグローバルに適用する
$WORDCHARS「ここに入った文字は単語境界とはみなさない」というリスト:s@/@変数展開:/を除外する
あらすじ
zshを使っていてちょこちょこ気になるところがあった。それが単語の幅。パスを入力していて、ちょうど1階層分削除したいときにCtrl+wを押下したりするのだが、Zsh的にはスラッシュは単語の境界に入っていないようで、パス全体が消えてしまう。
% cd /foo/bar/buzz<CURSOR> # ここでC-w % cd <CURSOR> # うえ〜ん
これだと使いにくい。
対応
Zshのことなのでどうせどっかに設定があるだろと高を括って調べてみたところ、さすがに設定があった。
ここの4.3.4にWORDCHARSについて記載されている。この変数に登録しておいた文字は単語間の境界とみなされなくなる。言い換えると、ここから取り除けば単語間境界としてみなされるようになるということ。
変数から特定の文字列を取り除くには、${VAR:s@文字@}するとよい。これはzshのmodifierという仕組み。
この設定を.zshrcに書き込む:
# '/' を単語の境界として認める typeset -g WORDCHARS=${WORDCHARS:s@/@}
exportしてもだいたい同じだと思う。ただ、exportすると環境変数として出ていってしまう。WORDCHARSは子プロセスに渡していく性質のものではなく、単なるZshのシェル変数なので今回はtypeset -gでよい。-gは関数スコープではなくグローバルに適用するオプション。
Further Reading
ところでここまで書いて先人がいた。
10年越しに同じようなことを書いてしまった。ネットは広大だね。
複数指定する
複数指定したいときは:sの略記ができないので、以下のように書く。
# '/' / '=' を単語の境界として認める typeset -g WORDCHARS=${WORDCHARS:s@/@@:s@=@@}
もともと:s@/@は:s@/@@の略で、置換先が空で、なおかつ後続のmodifierがないときにこう書ける。複数置換したいときはちゃんとmodifierを最後まで書く必要があるので、↑のような形になる。