対話型ログインシェル(zshまたはbash)への入力を開始し、[次へ]をクリックすると商標、シェルはオートコンプリートの提案を提供します。
完成仕様がどのように定義されるかを大まかに知っています。ちなみに、概要は次のとおりです。
- 大きな打撃:https://www.gnu.org/software/bash/manual/bash.html#Programmable-Completion
- ジシュ語:http://zsh.sourceforge.net/Doc/Release/Completion-System.html
私が理解していないのは、ユーザーがタブを押したときにbash / zshがどのコマンドを完了するべきかを認識する方法です。つまり、これを行うとls [tab]
bash / zshはどのように認識しますかls
?つまり、bash / zshはls
完成仕様を使用して完成を生成する方法をどのように理解できますか?
より複雑な解析を含むいくつかの例があります。 Bash / Zshはまだ正確です。
ls [tab]
->完了ls
echo $( echo $(ls [tab]
->完了ls
echo hi; git a[tab]
->完了git
echo 'cd [tab]
- >完了しないcd
echo "$(ls [tab]
->完了ls
echo $( echo hi | ls [tab]
- >完了ls
(stdinが許可されていないことを知っていますが、ls
この例ではまだbash / zshの解析機能を示しています)
私はbash / zshがある種のパーサーを使用していると仮定します。しかし、これは一般的なパーサーではありません。適切に設定されたコマンドがなくても実行できます。閉じていない場合でも、引用符やシェル拡張で囲まれた内容があることがわかります。
bash / zshは、関連するコマンドを「識別」または完了する必要があるコマンドがあるかどうかを確認するためにどのような機能を実行しますか?
ベストアンサー1
bash / zshは、関連するコマンドを「識別」または完了する必要があるコマンドがあるかどうかを確認するためにどのような機能を実行しますか?
readline は を押すとtab
このcomplete
関数を実行します。
以下でこれを上書きできます~/.inputrc
。
"\t": complete
complete
として定義lib/readline/funmap.c
:
static const FUNMAP default_funmap[] = {
[..]
{ "complete", rl_complete },
rl_complete
許可lib/readline/complete.c
(ソースコードの参照):
/* Complete the word at or before point. You have supplied the function
that does the initial simple matching selection algorithm (see
rl_completion_matches ()). The default is to do filename completion. */
int
rl_complete (int ignore, int invoking_key)
{
..
これが出発点です。単語を分解して、どの完成が登録されているかを確認し、関連する完成を見つけます。
zshにも同様の実装があるかもしれません。
プロセスもよく説明されています。ここ。