COMPREPLYはデフォルトでスペースで区切られた単語のリストを返しますが、1行に1つの単語を返したいと思います。単語の末尾に改行を追加しようとし、compgenとCompleteのドキュメントを見てみましたが、何も見つかりませんでした。
可能ですか?
編集する:
申し訳ありませんが、私は説明を本当に不都合にしました。 Complete -Fを介してオートコンプリート機能にバインドするスクリプトがあります。ユーザーがスクリプトを実行しているときに Tab キーを 2 回押すと、compgen で可能なオプションのリストが表示されます。これで、関数には次のコード行があります。
COMPREPLY=( $(compgen -W '$( ls ~/work/dev/jobs/ | cat )' -- $curword ) )
ユーザーがタブをクリックすると、これらのディレクトリが次のように表示されます。
directory0 directory1 directory2 directory3
しかし、私は彼らが次のように現れることを望みます。
directory0
directory1
directory2
directory3
/r/bashに同様の投稿を投稿しましたが、誰かがこれを提案しました。
bind 'set completion-display-width 0'
これが完了するとキャンセルできます。
bind 'set completion-display-width -1'
今の問題は、関数全体が返される前に設定を解除すると効果がないため、ユーザーがEnterキーを押した後にスクリプトから設定を解除することです。これはうまく機能しますが、ユーザーがオートコンプリートを使用し始めた後、心を変えて入力した内容を削除してシェルに戻ると、完成表示幅はまだゼロに設定されます。
この問題を解決する他の方法はありますか?
ベストアンサー1
completion-display-width
私はreadline変数の変更を提案した人でした。/r/配布ただし、この1つの完成関数でのみ機能することを指定していません。
TABいずれにせよ、完了関数で(COMP_TYPE == 9)または(COMP_TYPE == 63)によってトリガーされているかどうかを検出できますTABTAB。端末。これは私が考えることができる最もハッキーなことです。次のようになります。
_foo_complete() {
local i file files
files=( ~/work/dev/jobs/"$2"* )
[[ -e ${files[0]} || -L ${files[0]} ]] || return 0
if (( COMP_TYPE == 63 )); then
for file in "${files[@]}"; do
printf -v 'COMPREPLY[i++]' '%*s' "-$COLUMNS" "${file##*/}"
done
else
COMPREPLY=( "${files[@]##*/}" )
fi
}
complete -F _foo_complete foo
しかし、あなたは本物してはいけないls 出力の解析。