bash compgen の結果にはターミナルカラーコードが含まれています。

bash compgen の結果にはターミナルカラーコードが含まれています。

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=しない期待どおりに動作します。

関連情報