Yash 2 その 161: 補完処理の設計指針 その 3
前の記事の続き。詰まるところ、補完の対象となる文字列にワイルドカードが入っているかによって補完の処理は大きく変わるということだ。
ワイルドカードが入っていない場合、ファイル名補完の流れは以下のようになる。
- コマンドライン上の入力中のファイル名に対して四種展開・ブレース展開・単語分割を行う。単語分割で複数の単語が得られた時は、最後のもののみを残す。この結果を s とする。
- s の末尾に
*
を付加し、ファイル名展開を行う。 - ファイル名展開で得られた各ファイル名は、いづれも s で始まる文字列となっている筈である。各ファイル名から s に一致する先頭部分を除いたものが補完候補となる。
この場合は、コマンドライン上の補完対象ファイル名に補完候補を付け足すことで補完が完了する。ファイル名の入力済みの部分を書き換える必要はないので、ファイル名に変数やブレース展開が入っていてもそれらはそのまま残すことができる。
ただし、上の……筈である
という仮定は、ファイル名展開を大文字小文字を区別しないで行った場合には成り立つとは限らない。大文字小文字を区別しないような補完をサポートするかどうかまだ未検討だが、するとしてもファイル名の入力済みの部分を書き換えずに補完することはできないので、ワイルドカードが入っている場合と同じような扱いになろう。
ファイル名にワイルドカードが入っている場合は、補完というよりはむしろ展開に近い動作をする:
- コマンドライン上の補完対象ファイル名に対して四種展開・ブレース展開・単語分割を行う。単語分割で複数の単語が得られた時は、全てを残す。
- 更にファイル名展開を行う。
- 得られたファイル名で補完対象ファイル名を置き換える。得られたファイル名が複数ある場合は、空白で区切って全てを並べる。
ファイル名にワイルドカードが入っている場合と異なり、ファイル名展開の前に*
を付加しない。Ksh や zsh はそのような方針なので、yash もそれに倣うことにした。
ファイル名展開の結果で補完対象ファイル名を置き換えるのは zsh の動作。展開結果の最長共通先頭部分で置き換える ksh や何も置き換えない bash よりは便利だろう。
| 固定リンク
コメント