Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

描画属性指定子にSGRの値を指定できるようにしてほしい #19

Closed
cmplstofB opened this issue Dec 16, 2018 · 21 comments
Closed
Labels
NYI/NewFeat Not yet implemented or New Feature

Comments

@cmplstofB
Copy link
Contributor

cmplstofB commented Dec 16, 2018

描画属性指定子にSGRの値を指定できるようにしてほしいです。
例えばこのような方法で指定できることを望みます。

# ble-color-setface <face_name> sgr=<SGR_varue>
ble-color-setface filename_directory sgr='01;34'

蛇足気味ですが,こういった指定方法を追加してほしい理由を述べます。
GNU版のls(1)ユーティリティでは$LS_COLORS環境変数に(多くはdircolor(1)ユーティリティを用いて)ファイルの属性とSGRの値を設定することで表示されるファイルに着色することができます。僕はコマンドライン上のファイルの色などをls(1)ユーティリティが着色するファイルの色と協調させようと思っており,$LS_COLORSから「di=<SGR_varue>」の値を抜き出してble-color-setface関数などで利用したいのです。

@akinomyoga
Copy link
Owner

SGR の指定を直接使うのではなく gspec という指定方法を導入したのは、SGR は端末によって微妙に意味が異なったりして、それらの実装の差異を吸収するのが目的でした。なので、gspec の仕様に入れるかどうかは考えさせて下さい。

@cmplstofB
Copy link
Contributor Author

そうなんですね。わかりました。

@akinomyoga
Copy link
Owner

akinomyoga commented Dec 16, 2018

underline,sgr='01;34' などのように gspec の指定と SGR の指定を混合することってあるでしょうか。もしそうでなければ、一つの案として ble-color-setface の仕様の方を変更するのが自然かなと思いました。例えば、

ble-color-setface FACE_NAME [TYPE:]SPEC

FACE_NAME
  設定する描画設定の名前

TYPE
  描画属性の指定方法
    "gspec"  描画属性指定子 (既定)
    "sgr"    SGR引数
    "face"   他の描画設定
    "gflags" 描画属性値 (ble内部使用)
    "seq"    制御シーケンス

SPEC
  値

@cmplstofB
Copy link
Contributor Author

ありがとうございます!(いつもおかしな要望ばかりですいません……)

gspec の指定と SGR の指定を混合することってあるでしょうか。

(少なくとも僕個人の目的としては)ないです。
もしも実装してくださるなら,提示していただいたような仕様でお願いします。

@akinomyoga
Copy link
Owner

akinomyoga commented Dec 16, 2018

SGRの解釈は、ANSIに従った解釈ではなくて、現在の端末に応じた (terminfo に従った) 解釈の方が都合が良いですよね。

内部的には face は g 値 (gspec と一対一に対応する整数値) で管理しているので、SGRの引数で指定された場合も一旦それを解釈して g 値に変換しなければなりません。その時に、ANSIのSGRとして解釈するか、現在の端末に応じた (terminfo に従った) 解釈にするかという選択肢があります。追記: 因みに g 値を元に実際にSGRを端末に吐く時は terminfo の結果を使っています。

@cmplstofB
Copy link
Contributor Author

そうですね。できれば現在の端末に応じて解釈してほしいです。
ただ,素人考えですが,主要な端末エミュレータ(xtermやlibVTEベースのもの)の特にSGRの解釈はほとんどANSIと相違がない(もちろんフォント切り替え機能など殆どの端末エミュレータで実装されていないものもありますが)ように思えます。
もしも,terminfoを見ることで構文強調に余計な時間が掛かり,結果としてble.shの動作が(実感できる程度に)遅くなるのであれば,terminfoを考慮するのはやめてほしいです(偉そうな言い方になってしまいました……)。

@akinomyoga
Copy link
Owner

akinomyoga commented Dec 16, 2018

はい。まあ殆ど相違はないのですが、実装する時にはどちらかに決めなければ実装できないので…。実はANSIの解釈を行うルーチンは既に存在したのでそれを流用できるかなと思って確認したのでした。terminfo に関しては ble.sh の初回ロード時に tput を呼び出した結果をキャッシュするので (初回ロード時に裏で色々動くのはそういうことなのでした) 実際の動作速度には影響しませんのでご安心下さい

@cmplstofB
Copy link
Contributor Author

cmplstofB commented Dec 16, 2018

初回起動時にキャッシュされるのですね。それならば,すいませんが,terminfoのほうを優先してほしいです。よろしくおねがいします。

@akinomyoga
Copy link
Owner

akinomyoga commented Dec 16, 2018

82fe96d 対応しました。以下のような形式で使用していただけますか。その他の指定方法に関しては 説明書 ble-color-setface を御覧ください。

ble-color-setface filename_directory sgrspec:'01;34'

確認していただければ幸いです。

@cmplstofB
Copy link
Contributor Author

確認いたしました。ありがとうございます!

@akinomyoga
Copy link
Owner

僕はコマンドライン上のファイルの色などをls(1)ユーティリティが着色するファイルの色と協調させようと思っており,$LS_COLORSから「di=<SGR_varue>」の値を抜き出してble-color-setface関数などで利用したいのです。

今更ですみませんが、以下の機能を実装しようかなと思っています。どう思われますか

# memo.txt#L1861

2016-07-20

  * ファイル名の色付けに LS_COLORS を参照する?
    https://github.com/trapd00r/zsh-syntax-highlighting-filetypes

    ble.sh の枠組で使用する為には ble-color.sh/gflags に変換しなければならない。
    しかし、実際に使っている terminal と sequence が異なる場合に齟齬が生じる。
    従って直接 LS_COLORS を用いるよりは、bleopt_filename_ls_colors 的な変数に指定して貰う事にする。
    そのまま LS_COLORS を使用したい場合は bleopt_filename_ls_colors=$LS_COLORS などとする。
    展開を実行するようにする。

@cmplstofB
Copy link
Contributor Author

是非おねがいします!

@akinomyoga
Copy link
Owner

c7ff302 対応しました。簡単で良いので確認をお願いしてもよろしいでしょうか。

# 設定方法
bleopt filename_ls_colors="$LS_COLORS"

@cmplstofB
Copy link
Contributor Author

すいません,遅くなりました。
ec31aab にて

bleopt filename_ls_colors="$LS_COLORS"

とやったのですが,「bleopt: unknown bleopt option `filename_ls_colors'」と怒られてしまいます。
filename_ls_colorsを設定する場所はblercの「bleopt undo_point=orig」などと同じような場所(なにもフックなどを呼び出していない範囲)でいいんですよね?

@akinomyoga
Copy link
Owner

ご報告ありがとうございます!

「bleopt undo_point=orig」などと同じような場所(なにもフックなどを呼び出していない範囲)でいいんですよね?

そのつもりでした。こちらではそれで動いているような気がします。確認してみます

@akinomyoga
Copy link
Owner

不思議ですね…

$ grep bleopt_filename_ls_colors out/ble.sh
: ${bleopt_filename_ls_colors=}

はそちらではどの様な結果になりますか。もしかすると make && make install が通っていない可能性? あるいは ble.pp から out/ble.sh を生成する時の処理で問題が起こっている可能性があります。

@cmplstofB
Copy link
Contributor Author

make && make install が通っていない可能性

すいません,これが原因でした……。詳しくは省きますが,環境変数を変更したことを失念していた為まったく更新されていない状態で使用していました。ご迷惑おかけしました……。

@akinomyoga
Copy link
Owner

そうでしたか。良かったです!

@akinomyoga
Copy link
Owner

@cmplstofB 取り敢えず特に動作に問題がなければ、あるいは、改良することなどがなければ閉じようと思います。お使いになって (いただけたのれあれば) いかがでしょうか

@cmplstofB
Copy link
Contributor Author

文句なしです! ほんとうにありがとうございます。

@akinomyoga
Copy link
Owner

確認ありがとうございます! 閉じますね

@akinomyoga akinomyoga added the NYI/NewFeat Not yet implemented or New Feature label May 19, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NYI/NewFeat Not yet implemented or New Feature
Projects
None yet
Development

No branches or pull requests

2 participants