GA

2022/03/15

MySQL Shellのプロンプトをゼロからカスタマイズしてみんとす(変数の存在によって表示させるclassを変えるとか)

TL;DR


謎だったのだ。パッケージに一緒についてくる /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が matchif_trueif_false の2分割しかできないから、3つ以上の分岐をしたい時にはこっちのが良いのかな、と思いつつ。

0 件のコメント :

コメントを投稿