saitoha / libsixel

A SIXEL encoder/decoder implementation derived from kmiya's sixel (https://github.com/saitoha/sixel).
MIT License
2.48k stars 83 forks source link

img2sixel のオプションを指定する環境変数が欲しい #27

Open msmhrt opened 9 years ago

msmhrt commented 9 years ago

img2sixel には端末の能力や設定に依存するコマンドラインオプション(以下、オプション)が色々ありますが、現状では例えば w3m の、

W3M_IMG2SIXEL='img2sixel --bgcolor="#300824"'

のようにアプリケーション毎にオプションを指定する必要があります。

これを、

IMG2SIXEL='-8 --bgcolor="#300824"' 

のように環境変数で指定して img2sixel がそれをデフォルト値として利用するようになると便利だと思います。

"$HOME/.imgsixel" のような設定ファイルではなく環境変数で指定する方法を提案したのは、異なる種類の端末から同時にログインするような状況を考えると環境変数よりも設定ファイルの方が有用な状況がちょっと思いつかず、むしろ設定ファイルは邪魔なのでは?と思ったからですが、ひょっとすると設定ファイルにした方が有用な状況もあるかもしれません。

他に気になったのは img2sixel のオプションの中にはオプションの追加でデフォルトに戻せないオプションがいくつかあることです。

例えば、 IMG2SIXEL=-I を指定した場合に、W3M_IMG2SIXEL-I を打ち消すオプションがありません。 (私の誤解による勘違いだったらすみません。)

私個人の img2sixel の利用方法は、mlterm を使って w3m か標準出力で表示するぐらいですので、環境変数によるオプション指定がなくても特に困らないのですが、オプションの意味が変わるかもしれない変更は早めに提案した方が良さそうな気がしたので Issue を立ててみました。

環境変数を利用することによるセキュリティー上のリスク等については正直良くわからないのですが、そういう問題が無さそうであれば、一度検討してみていただけないでしょうか?

saitoha commented 9 years ago

まずセキュリティ上の問題の検討ですが、 環境変数を読み取ってパース -> argvに追加という実装イメージで想像力を働かせてみましたが、 これで変なことができる余地は最大でもコマンドを失敗させることで、通常は特に問題にならないと思います。

他に気になったのは img2sixel のオプションの中にはオプションの追加でデフォルトに戻せないオプションがいくつかあることです。

例えば、 IMG2SIXEL=-I を指定した場合に、W3M_IMG2SIXEL で -I を打ち消すオプションがありません。 (私の誤解による勘違いだったらすみません。)

そういう使い方は全く考えていませんでした。矛盾するオプションを指定すると失敗させるようにしています。 (例えば-Iと矛盾する-e/-p/-m/-bを同時に指定するとエラーとなります) 今から意味を変更するのはきついかなと考えています。

IMG2SIXEL環境変数の提案については、全ての設定について柔軟性を持たせる必要も特に無いのでは、と思います。

などのデメリットもありそうなので、

IMG2SIXEL_BGCOLOR="#300824"

のように、個別に環境変数を用意するといいかな、と思いましたがどうでしょうか。

msmhrt commented 9 years ago

私としては、IMG2SIXEL 環境変数に less コマンドの LESS 環境変数のような使い勝手を期待しているのですが、同時に指定できないオプションを複数指定した場合に一番最後のオプションが有効になるだけでエラーが発生しないのは気持ち悪いという感覚も何となくは分かります。

この辺りは好みの問題も大きそうですので、他の方のご意見も伺ってみたいところですね。

msmhrt commented 9 years ago

別案ですが、想定する端末の仕様的な物を環境変数で指定するというのはどうでしょうか?

例えば、この環境変数で Sixel の透明色の使用可否を指定できると、

という感じになりそうです。

なお、「的な物」と書いたのは、例えば

のような内容は端末の仕様とはちょっと違いますが、そういう指定もできた方が便利なのでは?と思ったからです。

環境変数の適切な名称や仕様の詳細はちょっと思いつかなかったのですが、こういう方式もありかなと思ったので提案してみました。

msmhrt commented 9 years ago

返信が遅れましたが、IMG2SIXEL_BGCOLOR 環境変数については、設定個別に環境変数を用意すると後々大変そうなので、なるべく一つの環境変数にまとめた方が良いのでは?というのが私の意見です。

saitoha commented 9 years ago

整理のために導入予定の-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

分類すると、

  1. 指定すると挙動が完全に変わるもの: -n, -D, -V, -H
  2. 出力フォーマットを指定する(ものによっては特定の端末でのみ動作): -7, -8, -I, -u, -t, -P
  3. 拡縮などのオペレーションを指定する: -c, -w, -h
  4. パレットが固定されている等、端末環境のヒントを与える: -m, -e, -i, -b, -B
  5. アニメーションの挙動を制御する: -g, -S, -l
  6. 画質やエンコード時のポリシーを指定する: -p, -d, -f, -s, -r, -q, -E

1.は環境変数で指定するべきではありません。4.,5.,6は環境変数指定が有用だと思います。 つまり、指定できるオプションを限定しておきたいのですが、ユーザーから見て「環境変数指定可能かどうか」がわかりづらいのは問題だと思います。

「端末の仕様」環境変数の導入ですが、4.や6.に相当すると思います。 透明色に対するポリシーは、必要なら今後オプションとして導入することになりそうです。