TL;DR
- 日々の覚書: MySQL Shellのプロンプトをゼロからカスタマイズしてみんとす(classとsegment) の続き
- segmentsの中にclassを置くときになぜか配列型にするけど、それはCOALESCEみたいな感じで「最初に存在したクラスを適用する」みたいな動き
謎だったのだ。パッケージに一緒についてくる /usr/share/mysqlsh/prompt/
あたりに転がっているprompt.jsonのこのへんの記述。
"segments": [
..
{
"classes": ["noschema%schema%", "schema"],
"bg": 242,
"fg": 15,
"shrink": "ellipsize",
"weight": -1,
"padding" : 1
},
..
https://github.com/mysql/mysql-shell/blob/8.0.28/samples/prompt/prompt_256pl.json#L103
↓こんな風に、スキーマがセットされてる時は灰色の、そうでない時はそもそもこのラベルそのものが表示されないような感じ。
しかし noschema
と schema
はクラスとして定義されているが、 noschemad1
なんてクラスは定義されていないし、とするとこのクラス名の中の %schema%
はスキーマ名として展開される組み込み変数とは違うのか…? とか思ってたら、READMEに書いてあった。
README最高だな ドキュメントに書けよ 。
https://github.com/mysql/mysql-shell/blob/master/samples/prompt/README.prompt#L94-L96
クラスのリスト(たとえこの空振りを利用した打ち分けをしない場合でも、リストに入れないといけない)は、最初に存在した1つが採用される。
さっきのスキーマの例でいくと、d1スキーマがカレントスキーマの間は noschemad1
クラスを探して存在せず、 schema
クラスにフォールバックする。
カレントスキーマが存在しない間は noschema
クラスが存在するのでそっちを採用する。
というわけで、prompt.jsonをこんな風にしてみた。
{
"classes":
{
"schema_mysql":
{
"text": "[[ !!SYSTEM_SCHEMA!! ]]",
"fg": "white",
"bg": "red"
},
"noschema":
{
"text": "[[ no database selected ]]"
},
"default_schema":
{
"text": "[[ %schema% ]]",
"fg": "#b0c4de"
}
},
"segments":
[
{ "classes": ["noschema%schema%", "schema_%schema%", "default_schema"] }
],
"prompt": { "text": "> " }
}
まあ取り敢えず、思ったようには動いているようだ( %schema%
が空の時は “noschema” にマッチ、 mysqlの時は “schema_mysql” にマッチ、それ以外の時は “default_schema” にフォールバック)
variablesが match
, if_true
, if_false
の2分割しかできないから、3つ以上の分岐をしたい時にはこっちのが良いのかな、と思いつつ。
0 件のコメント :
コメントを投稿