MySQLのCLIのプロンプトをカスタマイズするzshのfunctionを書いた

いままで、mysqlのプロンプトの変更は $HOME/.my.cnf で、

[mysql]
prompt="^[[01;31m\U[\d]-[\D]^[[0m\nmysql> "

みたいにしていましたが、

  • 接続元のサーバ情報が出せない。(出し方を知らないだけかも)
  • 本番と開発環境など、同一の設定ファイルで環境に応じてプロンプトを柔軟に変更できない。
  • 色をつけるにはエスケープシーケンスを直書きしないといけない。

といった点が、ちょっと不満でした。

なのでコマンドオプションをパースして、環境変数$MYSQL_PS1を組み立ててから
mysqlコマンドを実行する、zshのfunctionを作ってみました。

https://github.com/tetsujin/zsh-function-mysql

ちょっとわかりにくいですが、下記の例では

  • 接続元のサーバ情報を表示、ホスト名によって色分け。
  • 接続先のMySQLサーバのユーザ名、ホスト名で色分け。

をしています。

https://raw.github.com/tetsujin/zsh-function-mysql/master/doc/img/sample1.png
https://raw.github.com/tetsujin/zsh-function-mysql/master/doc/img/sample2.png

インストール

zshが読み込める場所にfunctionを追加します。
この例ではホームディレクトリに追加します。

$ cd /path/to
$ git clone git://github.com/tetsujin/zsh-function-mysql.git
$ mkdir -p ~/.zsh.d/functions
$ ln -s /path/to/zsh-function-mysql/mysql ~/.zsh.d/functions

$HOME/.zshrcへ設定を追記

インストールしたfunctionと、色設定で使うcolorsをautoloadします。

typeset -U fpath
fpath=(
    $HOME/.zsh.d/*(/N)
    $fpath
)
autoload -U colors; colors
autoload -U $(echo ~/.zsh.d/functions/*(:t))

下記のように設定を追記します。

# MySQLの接続元ホストのユーザ名($USER)によって色分けします。(自分は使ってません)
typeset -A mysql_prompt_style_client_user
mysql_prompt_style_client_user=(
    # 'root'     $fg_bold[red]
    # '*'        $fg_bold[green]
)
# MySQLの接続元ホスト名($HOST)によって色分けします。
# - .local.を含むローカル環境は緑
# - .dev.を含む開発環境では黄色
# - その他は赤
# としています。
typeset -A mysql_prompt_style_client_host
mysql_prompt_style_client_host=(
    '*.local.*'     "$fg_bold[green]"
    '*.dev.*'       "$fg_bold[yellow]"
    '*'             "$fg_bold[red]"
)
# MySQLの接続先ホストのユーザ名(-uオプション)によって色分けします。
# - rootは赤
# - その他は青
# としています。
typeset -A mysql_prompt_style_server_user
mysql_prompt_style_server_user=(
    'root'          "$bg_bold[red]$fg_bold[yellow]"
    '*'             "$fg_bold[blue]"
)
# MySQLの接続先ホスト名(-hオプション)によって色分けします。
# - masterを含む場合は赤
# - slaveを含む場合は黄色
# - その他は青色
# としています。
typeset -A mysql_prompt_style_server_host
mysql_prompt_style_server_host=(
    '*master*'      "$bg_bold[red]$fg_bold[yellow]"  # Master Server
    '*slave*'       "$bg[yellow]$fg[black]" # Slvae Server
    '*'             "$fg_bold[blue]"
)

# プロンプトを組み立てます。
# [注意] functionの実行直前に変数を評価するのでシングルクォートで定義してください。
mysql_prompt='${style_client_host}${USER}@${HOST}${fg_bold[white]} -> '
mysql_prompt=$mysql_prompt'${style_server_user}\u${reset_color}${fg_bold[white]}@${style_server_host}\h${reset_color}${fg_bold[white]}:${fg[magenta]}\d ${fg_bold[white]}\v\n'
mysql_prompt=$mysql_prompt'${fg_bold[white]}${bg_level}mysql${reset_color}> '


iTerm2とTerminal.appで軽く動作確認しただけなので、正しく表示できない環境もあるかもです。
視覚的にわかりやすくすることで、少しでもオペレーションミスが減れば嬉しいですね。


MySQLコマンドラインの表示結果を見やすく

今までデータの確認はphpMyAdminばっかり使ってたので、知らなかったことメモ。

mysql> show table status;

とかすると、列数が多すぎて行が折り返し表示されて見づらい。

http://dev.mysql.com/doc/refman/4.1/ja/mysql.html に書いている

mysql> pager less -n -i -S

とすると、出力結果を折り返しせずにlessで見れる。カーソルキーで左右の移動ができてすごく便利。

ちなみに

  • n 行数計算をせずに高速化。
  • i 検索時に大文字・小文字の区別をしない。
  • S 折り返ししない。

あと、これは前から知ってたけど

mysql> show table status\G

\Gをつけると縦表示。