compgenを使用していますalias ls='ls --color'
が、奇妙な結果が表示されます。ターミナルカラーコードを使用してオートコンプリートされます。
色が正しく適用されたので、compgen -W "$(ls /someDir/)"
端末に入れたときに見てください。ls
しかし、一緒に
COMPREPLY=( $(compgen -W "$(ls /someDir/)" -- ${cur}))
出力
^[[34;40mfilename^[[0m
基本白
色付きの結果をテキストにインポートする代わりに保持する方法はありますか?
答え1
ls
ここではまったく使用しないでください。色は仕上げの一部として望ましくないので、とにかく出力の一部になるべきではありません。-W
一致するファイル名には-W
。
globを使用して直接設定する必要がありますCOMPREPLY
。
COMPREPLY=( "$cur"* )
答え2
compgen 結果にはターミナルカラーコードが含まれます。alias ls='ls --color=auto'
出力が他のコマンドによって使用されるのではなく、端末に印刷されたときにのみ色が得られるように、この方法を使用する必要があります。ls
しかし、エイリアスがなくてもcompgen -W "$(ls /someDir/)"
機能しません。ファイル名のリストを生成するために呼び出されますが、ls
コマンドの出力はリストではなく文字列です。compgen
出力をスペースに分割しますls
。ファイル名に空白文字が含まれていると、分割は失敗します。代わりに、ファイル名のリストを生成し、ディレクトリプレフィックスを削除する必要があります。テストされていません:
files=(/someDir/*)
if [[ -e ${files[0]} -o -L ${files[0]} ]]; then
for f in "${files[@]}"; do
compgen -- "${f#/someDir/}"
done
fi
色が出ません。私はbashが着色できるとは思わない。完成システムは端末の表示を制御する必要があります。表示された内容に制御文字を隠すことはできず、完成システムを混同しないことを願っています。ひとりが欲しいなら良い機能を備えたケースたとえば、カラーコンプリートを使用すると、扱いにくい(または魚構成可能性が気に入らない場合)。
答え3
以下を使用する必要があります。
COMPREPLY=( $(compgen -W "$(ls /someDir/ --color=never)" -- ${cur}))
そして--color=しない期待どおりに動作します。