MySQL道普請便り

第271回MySQL Shellのプロンプトを改造してみる[その2]

前回「第270回 MySQL Shellのプロンプトを改造してみる」では、MySQL Shellのprompt.jsonを使って、segmentsとpromptを中心にプロンプトをカスタマイズしてみました。segmentsを使うと、接続先ホストやポート、現在のスキーマ、実行モードなどを並べて表示できます。また、promptを変更することで、入力待ち部分の記号も変更できました。

しかし、prompt.jsonには前回紹介しきれなかった項目があります。今回はdesc、symbols、classes、variablesを見ていきます。これらは、単純な表示を作るだけなら必須ではありません。しかし、同じ色指定を何度も書かないようにしたり、環境によって表示を切り替えたり、複数人でテーマを共有しやすくしたりする場合に便利です。

検証環境

今回はDocker上で起動したMySQLを使って確認します。以下のコマンドでMySQLを起動します。

docker run --name mysql84 --rm -d \
  -e MYSQL_ROOT_PASSWORD=password \
  mysql:8.4

以上で起動したMySQLコンテナに接続します。

$ docker exec -it mysql84 bash
bash-5.1# mysql -uroot -ppassword

いつものMySQLクライアントの画面が表示されれば準備完了です。

mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.4.9 MySQL Community Server - GPL

Copyright (c) 2000, 2026, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

prompt.jsonに設定できる項目

prompt.jsonには設定できるキーが6つあります。segmentとpromptに関しては前回触れましたので、今回は残りのdesc、symbols、classes、variablesについて説明していきます。

desc

descは、テーマの説明を書くための項目です。プロンプトの表示内容に影響を及ぼすことは今のところはありません。作成したprompt.jsonがどのようなテーマなのか示すメモとして使いましょう。テーマを書いていると、ときどきこのテーマを何のために作っているのか忘れてしまうこともあるので記載をしておくとよいでしょう。

{
  "desc": "このjsonの設定の説明を書いておきましょう"
}

symbols

symbolsは、プロンプト内で使われる区切り文字や省略記号をまとめて定義する項目です。たとえば、セグメント同士の区切りを空白にしたい、省略された文字列の末尾を...にしたい、といった場合に使います。各セグメントに個別に書くのではなく、テーマ全体で共通の記号を定義できる点が便利です。

設定できる項目は3個で、separator、separator2、ellipsisがあります。separatorとseparator2はどちらもセグメント間の区切り文字ですが、separatorは通常の区切りに使われます。separator2は同じ背景色のセグメントが続く場合の区切りとして使われます。同じ区切りですが、通常の区切りか背景色かで違いが出ます。

前回のsegmentsとpromptでカスタマイズした際のJSON
{
  "symbols": {
    "separator": "/",
    "separator2": ":"
  }
}
separator

このようにホストと接続方式が同じ背景色になっているので⁠:⁠が表示されていて、SSLとSQLの間は背景色が変わるので⁠/⁠が表示されています。

一方、ellipsisはセグメント間の区切りではなく、長い文字列が省略表示されたときに末尾へ付ける文字です。以下のように設定して確認してみましょう。

{
  "symbols": {
    "ellipsis": "..."
  },

  "segments": [
    {
      "text": "very.very.very.very.very.very.very.very.long.text.for.checking.ellipsis.in.mysql.shell.prompt.theme",
      "fg": "white",
      "bg": "blue",
      "min_width": 8,
      "shrink": "ellipsize"
    },
    {
      "text": "%Mode%",
      "fg": "white",
      "bg": "red"
    }
  ]
}

上記のように、ものすごく長い文字などを設定してターミナルの横幅を縮めた状態で、MySQL Shellを起動してみましょう。

ellipsis

このように省略されているのがわかります。この文字がellipsisで設定した値になります。

classes

classesは、ひとことで言うと「セグメントに指定する見た目や文字列のテンプレート」です。CSSのclassに近いですが、MySQL Shellでは「最初に見つかったclassだけ適用される」という点にだけ注意しましょう。

{
  "classes": {
    "host": {
      "fg": "white",
      "bg": "blue",
      "padding": 1
    },
    "mode": {
      "fg": "white",
      "bg": "green",
      "padding": 1
    }
  },

  "segments": [
    {
      "classes": ["host"],
      "text": "%host%"
    },
    {
      "classes": ["mode"],
      "text": "%Mode%"
    }
  ]
}
classes

その他、使用できる値には以下のようなものがあります。

属性 意味
text 表示する文字列。%host% などの変数も使える "text": "%schema%"
fg 文字色、前景色 "fg": "white"
bg 背景色 "bg": "blue"
bold 太字にする "bold": true
underline 下線を付ける "underline": true
padding セグメント文字列の左右に入れる空白数 "padding": 1
separator そのセグメントの前に表示する区切り文字を上書きする "separator": "/"
min_width 縮小表示するときに最低限残す幅 "min_width": 8
shrink 幅が足りないときの縮小方法 "shrink": "ellipsize"

variables

variablesは、独自の変数を定義するための項目です。MySQL Shellのプロンプトでは%host%や%schema%のような組み込み変数を使えますが、variablesを使うとそれらをもとにした独自の変数を定義できます。

たとえば、接続先ホストが環境変数PRODUCTION_SERVERSに含まれている場合だけ%is_production%をproductionにする、といった使い方ができます。定義した変数はsegmentsのtextやclassesの候補名として利用できます。

{
  "variables": {
    "is_production": {
      "match": {
        "pattern": "*;%host%;*",
        "value": ";%env:PRODUCTION_SERVERS%;"
      },
      "if_true": "production",
      "if_false": ""
    }
  }
}

このようにすると、host部を環境変数のPRODUCTION_SERVERSと比較して、一致すればproductionという文字列を返します。それ以外の場合は空文字を返す、といった使い方ができます。

これ単体だと使い方がわからないと思いますが、先述したclassesと合わせて使ってみましょう。classesは配列なので複数指定できます。また先頭から合致したものが選択されるという話をしていました。

以下のように指定してみましょう。

{
  "classes": {
    "production": {
      "text": " PRODUCTION ",
      "fg": "white",
      "bg": "red",
      "bold": true
    },
    "normal": {
      "text": " normal ",
      "fg": "white",
      "bg": "blue"
    }
  },

  "variables": {
    "is_production": {
      "match": {
        "pattern": "*;%host%;*",
        "value": ";%env:PRODUCTION_SERVERS%;"
      },
      "if_true": "production",
      "if_false": ""
    }
  },

  "segments": [
    {
      "classes": [
        "%is_production%",
        "normal"
      ]
    }
  ],

  "prompt": {
    "text": "> ",
    "cont_text": "-> "
  }
}

上記の設定では、何もせずにログインした場合はnormalと表示されています。

normal

環境変数の設定後に、envと一致している場合はPRODUCTIONと表示されるようになりました。

PRODUCTION

まとめ

前回は、MySQL Shellのプロンプトを静的に変更する方法を紹介しました。今回は、まだ紹介していなかったsymbols、classes、variablesを使って、プロンプトの表示をもう少し柔軟に変更してみました。classesを使うと、セグメントに指定する色や文字列を名前付きでまとめられます。また、variablesと組み合わせることで、接続先ホストや環境変数の値に応じて、適用するclassを切り替えることもできます。これにより、たとえば本番環境に接続している場合だけPRODUCTIONと表示するといったカスタマイズが可能になります。

プロンプトは毎回の操作で目に入るため、接続先や状態をわかりやすく表示しておくと、作業時の確認にも役立ちます。MySQL Shellをよく使う場合は、自分の環境に合わせてprompt.jsonを少しずつカスタマイズしてみてください。

おすすめ記事

記事・ニュース一覧