libsixel
libsixel copied to clipboard
img2sixel のオプションを指定する環境変数が欲しい
img2sixel
には端末の能力や設定に依存するコマンドラインオプション(以下、オプション)が色々ありますが、現状では例えば w3m
の、
W3M_IMG2SIXEL='img2sixel --bgcolor="#300824"'
のようにアプリケーション毎にオプションを指定する必要があります。
これを、
IMG2SIXEL='-8 --bgcolor="#300824"'
のように環境変数で指定して img2sixel
がそれをデフォルト値として利用するようになると便利だと思います。
"$HOME/.imgsixel"
のような設定ファイルではなく環境変数で指定する方法を提案したのは、異なる種類の端末から同時にログインするような状況を考えると環境変数よりも設定ファイルの方が有用な状況がちょっと思いつかず、むしろ設定ファイルは邪魔なのでは?と思ったからですが、ひょっとすると設定ファイルにした方が有用な状況もあるかもしれません。
他に気になったのは img2sixel
のオプションの中にはオプションの追加でデフォルトに戻せないオプションがいくつかあることです。
例えば、 IMG2SIXEL=-I
を指定した場合に、W3M_IMG2SIXEL
で -I
を打ち消すオプションがありません。
(私の誤解による勘違いだったらすみません。)
私個人の img2sixel
の利用方法は、mlterm
を使って w3m
か標準出力で表示するぐらいですので、環境変数によるオプション指定がなくても特に困らないのですが、オプションの意味が変わるかもしれない変更は早めに提案した方が良さそうな気がしたので Issue を立ててみました。
環境変数を利用することによるセキュリティー上のリスク等については正直良くわからないのですが、そういう問題が無さそうであれば、一度検討してみていただけないでしょうか?
まずセキュリティ上の問題の検討ですが、 環境変数を読み取ってパース -> argvに追加という実装イメージで想像力を働かせてみましたが、 これで変なことができる余地は最大でもコマンドを失敗させることで、通常は特に問題にならないと思います。
他に気になったのは img2sixel のオプションの中にはオプションの追加でデフォルトに戻せないオプションがいくつかあることです。
例えば、 IMG2SIXEL=-I を指定した場合に、W3M_IMG2SIXEL で -I を打ち消すオプションがありません。 (私の誤解による勘違いだったらすみません。)
そういう使い方は全く考えていませんでした。矛盾するオプションを指定すると失敗させるようにしています。 (例えば-Iと矛盾する-e/-p/-m/-bを同時に指定するとエラーとなります) 今から意味を変更するのはきついかなと考えています。
IMG2SIXEL環境変数の提案については、全ての設定について柔軟性を持たせる必要も特に無いのでは、と思います。
- 設定の仕方によってはコマンドを常に失敗させてしまう
- 環境変数と引数値に矛盾がまたがっているケースでは、使ってて意味がわからなくなる
などのデメリットもありそうなので、
IMG2SIXEL_BGCOLOR="#300824"
のように、個別に環境変数を用意するといいかな、と思いましたがどうでしょうか。
私としては、IMG2SIXEL
環境変数に less
コマンドの LESS
環境変数のような使い勝手を期待しているのですが、同時に指定できないオプションを複数指定した場合に一番最後のオプションが有効になるだけでエラーが発生しないのは気持ち悪いという感覚も何となくは分かります。
この辺りは好みの問題も大きそうですので、他の方のご意見も伺ってみたいところですね。
別案ですが、想定する端末の仕様的な物を環境変数で指定するというのはどうでしょうか?
例えば、この環境変数で Sixel の透明色の使用可否を指定できると、
- 使用可と指定した場合 →
img2sixel
が必要に応じて透明色を出力するが、必ず透明色を出力するとは限らない - 使用不可と指定した場合 → 明示的に透明色を出力するオプションを指定しない限りは透明色を出力しない
という感じになりそうです。
なお、「的な物」と書いたのは、例えば
- 画質と出力サイズと処理時間のどれを優先するか?
のような内容は端末の仕様とはちょっと違いますが、そういう指定もできた方が便利なのでは?と思ったからです。
環境変数の適切な名称や仕様の詳細はちょっと思いつかなかったのですが、こういう方式もありかなと思ったので提案してみました。
返信が遅れましたが、IMG2SIXEL_BGCOLOR
環境変数については、設定個別に環境変数を用意すると後々大変そうなので、なるべく一つの環境変数にまとめた方が良いのでは?というのが私の意見です。
整理のために導入予定の-Bを含めたimg2sixelのオプションを全部挙げます。
-7, --7bit-mode
-8, --8bit-mode
-p COLORS, --colors=COLORS
-m FILE, --mapfile=FILE
-e, --monochrome
-i, --invert
-I, --high-color
-u, --use-macro
-n MACRONO, --macro-number=MACRONO
-C COMPLEXIONSCORE, --complexion-score=COMPLEXIONSCORE
-g, --ignore-delay
-S, --static
-d DIFFUSIONTYPE, --diffusion=DIFFUSIONTYPE
-f FINDTYPE, --find-largest=FINDTYPE
-s SELECTTYPE, --select-color=SELECTTYPE
-c REGION, --crop=REGION
-w WIDTH, --width=WIDTH
-h HEIGHT, --height=HEIGHT
-r RESAMPLINGTYPE, --resampling=RESAMPLINGTYPE
-q QUALITYMODE, --quality=QUALITYMODE
-l LOOPMODE, --loop-control=LOOPMODE
-t PALETTETYPE, --palette-type=PALETTETYPE
-b BUILTINPALETTE, --builtin-palette=BUILTINPALETTE
-E ENCODEPOLICY, --encode-policy=ENCODEPOLICY
-B BGCOLOR, --bgcolor=BGCOLOR
-P, --penetrate
-D, --pipe-mode
-v, --verbose
-V, --version
-H, --help
分類すると、
- 指定すると挙動が完全に変わるもの:
-n
,-D
,-V
,-H
- 出力フォーマットを指定する(ものによっては特定の端末でのみ動作):
-7
,-8
,-I
,-u
,-t
,-P
- 拡縮などのオペレーションを指定する:
-c
,-w
,-h
- パレットが固定されている等、端末環境のヒントを与える:
-m
,-e
,-i
,-b
,-B
- アニメーションの挙動を制御する:
-g
,-S
,-l
- 画質やエンコード時のポリシーを指定する:
-p
,-d
,-f
,-s
,-r
,-q
,-E
1.は環境変数で指定するべきではありません。4.,5.,6は環境変数指定が有用だと思います。 つまり、指定できるオプションを限定しておきたいのですが、ユーザーから見て「環境変数指定可能かどうか」がわかりづらいのは問題だと思います。
「端末の仕様」環境変数の導入ですが、4.や6.に相当すると思います。 透明色に対するポリシーは、必要なら今後オプションとして導入することになりそうです。