Arch Linuxで古いMySQLクライアントから mariadb-clients-10.0.21- にアップグレードしました。アップグレード後、Emacsのsql-mysql
関数を使用するときにプロンプトが表示されなくなりました。
mysql
は、出力の最初の行に表示されるため、プロンプトをバッファリングしているようです。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 19662
Server version: 4.1.11-standard-log
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
show tables;
MySQL [dbname]> +---------------------------------------------------------+
| Tables_in_dbname |
+---------------------------------------------------------+
...
+---------------------------------------------------------+
80 rows in set (0.02 sec)
help
MySQL [dbname]>
General information about MariaDB can be found at
http://mariadb.org
List of all MySQL commands:
...
For server side help, type 'help contents'
?
MySQL [dbname]>
General information about MariaDB can be found at
http://mariadb.org
List of all MySQL commands:
...
For server side help, type 'help contents'
exit
MySQL [dbname]> Bye
いずれの場合も、「MySQL [dbname]>
」の前の行が入力したものです。 (...
は、省略した出力を示します。)
プロンプトを正しく表示するにはどうすればよいですか?mysql
の-n
オプションを試しました。効果はありませんでした。ターミナルでmysql
を実行すると、正常に動作します。
特殊文字をエスケープするのを忘れました。 Elisp-regexは、最初の\がLISP文字列に飲み込まれているため、かなりバックスラッシュが重いです。 https://www.emacswiki.org/emacs/RegularExpression を参照してください
MariaDBとMySQLをキャッチするために、構成にこれがあります。
(sql-set-product-feature 'mysql :Prompt-regexp "^\\(MariaDB\\|MySQL\\) \\[[_a-zA-Z]*\\]> ")
問題は、プロンプトがsql-mode
が期待しているものと一致しないことであることが判明しました。 MariaDBはデフォルトのプロンプトとして「MySQL [dbname]>」を使用し、sql-mode
は「mysql>」のみを許可します。
したがって、1つの修正は、「-Prompt = mysql>」をsql-mysql-options
に追加することです。
(setq sql-mysql-options '("--Prompt=mysql> "))
より良い方法は、いずれかのプロンプトスタイルを許可するように正規表現を修正することです。しかし、それを機能させるのに少し苦労しているので、誰かがそれを行う方法を投稿した場合、私は賞金を授与します。
私はもう試した
(sql-set-product-feature 'mysql :Prompt-regexp "^[mM]y[sS][qQ][lL][^>]*> ")
ただし、プロンプトが「mysql>」または「MySQL>」でない限り機能しません。
.emacsに追加する場合は、次のようにします。
(require 'sql)
(sql-set-product-feature 'mysql :Prompt-regexp
"^\\(MariaDB\\|MySQL\\) \\[[_a-zA-Z]*\\]> ")
(require 'sql)
は、sql-set-product-feature関数がグローバルに使用可能になるために必要です。