Yash 2 その 159: 補完処理の設計指針
例えば zsh で、ls $HOME/ と入力したところで補完操作をすると、ホームディレクトリにあるファイルの名前が候補として表示される。つまり zsh は、補完が要求された時点で HOME 変数を展開して、補完の対象となるディレクトリの情報を得ているわけだ。
補完時に変数を展開するのは別に難しくない。$HOME/
に含まれる変数を展開すると例えば /home/magicant/
のようなパスが得られる。このディレクトリに含まれるファイルの名前を補完したければ、末尾に *
を付加した /home/magicant/*
をパタンとしてファイル名展開をかけるとファイル名の一覧が補完候補として得られる (補完したいのはパス名全体ではなくスラッシュの後のファイル名なので、ファイル名展開で得られたパス名のうち最後のファイル名の部分だけを補完候補として取り出す)。後は、選んだ候補を $HOME/
の後に付け加えれば補完は完了する。
しかし、補完したいファイル名が途中まで入力してあって、それにワイルドカードが入っている場合は、厄介な問題が発生する。
例えば sample.txt
というファイルが存在していて、dot という変数の値に .
が設定してあるとする。コマンドラインに ls s*mple${dot}t とまで入力したところで、ファイル名の残りの部分 (xt
) を補完させたい。このとき、変数 dot を展開して s*mple.t
を得、*
を付加した s*mple.t*
をパタンとしたファイル名展開を行うところまでは問題なくできるが、得られた補完候補 sample.txt
をそのままコマンドラインに挿入すると ls s*mple${dot}tsample.txt となってしまう。補完したいのは最後の xt
だけなのだが、かといって補完候補の文字列から余分なものを容易に取り除くすべがない。
仕方がないので、yash では元元入力してあったファイル名を消して全部補完候補で置き換えてしまうことにしようと思う。コマンドラインに ls s*mple${dot}t とまで入力したところで補完操作をすると、コマンドラインは ls sample.txt となる。ワイルドカードや変数は跡形もなく消える。
| 固定リンク
コメント