Configuring the MySQL Shell Prompt
With the introduction of MySQL Shell 8.0, the second major version of the new command-line tool for MySQL, a new and rich featured prompt was introduced. Unlike the prompt of the traditional mysql command-line client, it does not just say mysql>
by default. Instead it comes in a colour coded spectacle.
The default prompt is great, but for one reason or another it may be that you want to change the prompt. Before getting to that, let’s take a look at the default prompt, so the starting point is clear.
The Default Prompt
An example of the default prompt can be seen in the screen shot below. As you can see, there are several parts to the prompt, each carrying its information.
There are six parts. From left to right, they are:
- Status: Whether it is a production system or whether the connection is lost. This part is not included in the above screen shot.
- MySQL: Just a reminder that you are working with a MySQL database.
- Connection: Which host you are connected to (localhost), which port (33060 – to the X protocol port), and that SSL is being used.
- Schema: The current default schema.
- Mode: Whether you are using JavaScript (JS), Python (Py), or SQL (SQL) to enter commands.
- End: As per tradition, the prompt ends with a >.
Depending on your current status one or more of the parts may be missing. For example, the configuration options will only be present, when you have an active connection to a MySQL Server instance.
The prompt works well on a black background and thus brightly coloured text as in the screen shot, but for some other background and text colours, it is not so – or you may simply want different colours to signify which whether you are connected to a development or production system. You may also find the prompt too verbose, if you are recording a video or writing training material. So, let’s move on and find out how the prompt is configured.
The Prompt Configuration
Since the prompt is not just a simple string, it is also somewhat more complex to configure it than just setting an option. The configuration is done in a JSON object stored in a file named prompt.json (by default – you can change this – more about that later).
The location of prompt.json depends on your operating system:
- Linux and macOS:
~/.mysqlsh/prompt.json
– that is in the .mysqlsh directory in the user’s home directory. - Microsoft Windows:
%AppData%\MySQL\mysqlsh\prompt.json
– that is inAppData\Roaming\MySQL\mysqlsh
directory from the user’s home directory.
If the file does not exist, MySQL Shell falls back on a system default. For example, on Oracle Linux 7 installation, the file /usr/share/mysqlsh/prompt/prompt_256.json
is used. This is also the template that is copied to %AppData%\MySQL\mysqlsh\prompt.json
on Microsoft Windows 10 installation.
The MySQL Shell installation includes several templates that you can choose from. These are:
- prompt_16.json: A coloured prompt limited to use 16/8 color ANSI colours and attributes.
- prompt_256.json: The prompt uses 256 indexed colours. This is the one that are used by default both on Oracle Linux 7 and Microsoft Windows 10.
- prompt_256inv.json: Similar to
prompt_256.json
, but with an “invisible” background colour (it just uses the same as for the terminal) and with different foreground colours. - prompt_256pl.json: Same as
prompt_256.json
but with extra symbols. This Powerline patched font such as the one that is installed with the Powerline project. This will add a padlock with the prompt when you use SSL to connect to MySQL and use “arrow” separators. - prompt_256pl+aw.json: Same as
prompt_256pl.json
but with “awesome symbols”. This additionally requires the awesome symbols to be included in the Powerline font. - prompt_classic.json: This is a very basic prompt that just shows
mysql-js>
,mysql-py>
, ormysql-sql>
based on the mode in use. - prompt_nocolor.json: Gives the full prompt information, but completely without colours. An example of a prompt is:
MySQL [localhost+ ssl/world] JS>
These are templates that you can use as is or modify to suite yours needs and preferences. One way to pick a theme is to copy the template file into the location of your user’s prompt definition. The templates can be found in the prompt directory of the installation, for example:
- Oracle Linux 7 RPM:
/usr/share/mysqlsh/prompt/
- Microsoft Windows:
C:\Program Files\MySQL\MySQL Shell 8.0\share\mysqlsh\prompt
Another option is to define the MYSQLSH_PROMPT_THEME
environment variable to point to the file you want to use. The value should be the full path to the file. This is particularly useful if you want to try the different template to see what works best for you. For example, to use the prompt_256inv.json
template from the command prompt on Microsoft Windows:
C:\> set MYSQLSH_PROMPT_THEME=C:\Program Files\MySQL\MySQL Shell 8.0\share\mysqlsh\prompt\prompt_256inv.json
Which gives the prompt:
If none of the templates work for you, you can also dive in at the deep end of the pool and create your own configuration.
Creating Your Own Configuration
It is not completely trivial to create your own configuration, but if you use the template that is closest to the configuration you want as a starting point, it is not difficult either.
A good source of help to create the perfect prompt is also the README.prompt
file that is located in the same directory as the template files. The README.prompt
file contains the specification for the configuration.
Instead of going through the specification in details, let’s take a look at the prompt_256.json template and discuss some parts of it. Let’s start at the end of the file:
"segments": [
{
"classes": ["disconnected%host%", "%is_production%"]
},
{
"text": " My",
"bg": 254,
"fg": 23
},
{
"separator": "",
"text": "SQL ",
"bg": 254,
"fg": 166
},
{
"classes": ["disconnected%host%", "%ssl%host%session%"],
"shrink": "truncate_on_dot",
"bg": 237,
"fg": 15,
"weight": 10,
"padding" : 1
},
{
"classes": ["noschema%schema%", "schema"],
"bg": 242,
"fg": 15,
"shrink": "ellipsize",
"weight": -1,
"padding" : 1
},
{
"classes": ["%Mode%"],
"text": "%Mode%",
"padding" : 1
}
]
}
This is where the elements of the prompt is defined. There are a few things that is interesting to note here.
First, notice that there is an object with the classes disconnected%host% and %is_production%. The names inside the %s are variables defined in the same file or that comes from MySQL Shell itself (it has variables such as the host and port). For example, is_production
is defined as:
"variables" : {
"is_production": {
"match" : {
"pattern": "*;%host%;*",
"value": ";%env:PRODUCTION_SERVERS%;"
},
"if_true" : "production",
"if_false" : ""
},
So, a host is considered to be a production instance if it is included in the environment variable PRODUCTION_SERVERS
. When there is a match, an additional element is inserted at the beginning of the prompt to make it clear, you are working on with a production system:
The second thing to note about the list of elements is that there are some special functions such as shrink which can be used to define how the text is kept relatively short. For example, the host uses truncate_on_dot
, so only the part before the first dot in the hostname is displayed if the full hostname is too long. Alternatively ellipsize can be used to add … after the truncated value.
Third, the background and foreground colours are defined using the bg
and fg
elements respectively. This allows you to completely customize the prompt to your liking with respect to colours. The colour can be specified in one of the following ways:
- By Name: There are a few colours that are known by name: black, red, green, yellow, blue, magenta, cyan, white.
- By Index: A value between 0 and 255 (both inclusive) where 0 is black, 63 light blue, 127 magenta, 193 yellow, and 255 is white.
- By RGB: Use a value in the #rrggbb format. Requires the terminal supports TrueColor colours.
One group of built-in variables that deserve an example are the ones that in some way depend on the environment or the MySQL instance you are connected to. These are:
- %env:varname%: This uses an environment variable. The way that it is determined whether you are connected to a production server is an example of how an environment variable
- %sysvar:varname%: This uses the value of a global system variable from MySQL. That is, the value returned by
SELECT @@global.varname
. - %sessvar:varname%: Similar to the previous but using a session system variable.
- %status:varname%: This uses the value of a global status variable from MySQL. That is, the value returned by
SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'varname'
. - %status:varname%: Similar to the previous, but using a session status variable.
If you for example want to include the MySQL version (of the instance you are connected to) in the prompt, you can add an element like:
{
"separator": "",
"text": "%sysvar:version%",
"bg": 250,
"fg": 166
},
The resulting prompt is:
What next? Now it is your turn to play with MySQL Shell. Enjoy.
0 Comments on “Configuring the MySQL Shell Prompt”