Emacs のモードで頻繁に問題に遭遇しますsql-mysql
が、解決策やよりよい回避策を知っている人はいませんか。バッファからsql-mode
アクティブな SQL プロセス バッファにクエリを送信しようとすると、そのクエリは 4k を超えることはできません。4k を超えると、何らかのブレーク (おそらく改行) が挿入され、mysql インタープリタが次の行でエラーをスローするようになります。
sql-mysql
は によって実装されsql.el
、 関数を使用して、sql-send-region
クエリ領域 (またはバッファ全体) を選択された SQL プロセス バッファに送信します。sql-send-region
は を呼び出しcomint-send-region
、次に が呼び出されますprocess-send-region
。は、 Emacs ソース内の の両方でprocess-send-region
を呼び出す C 関数です。send_process
src/process.c
これは、IPC パイプの 4k バッファによって生じる制限である可能性があります。このサイズを変更するにはカーネル ハッキングが必要であると思われるため、これはあまり良い答えではありません。
私が不思議に思うのは、パイプを介して送信された SQL が 4k より大きい場合、なぜ MySQL クライアントによって適切に再構成されないのかということです。何かアイデアはありますか?
Emacs バージョン: GNU Emacs 23.3.1 (x86_64-pc-linux-gnu、GTK+ バージョン 2.24.10)、2012-03-25、Allspice 版、Debian による修正
mysql -V: mysql Ver 14.14 Distrib 5.5.24、debian-linux-gnu (x86_64) 用、readline 6.2 使用
Sql Mysql オプション: -A -C -n (注: -n (バッファなし) ありとなしの両方を試しましたが、どちらもこの問題は解決しませんでした)
ベストアンサー1
原因は、comint
がプロセスと通信するために PTY を割り当てる Emacs のプロセス通信コードではないかと考えています。これらはジョブ制御を可能にするため対話型作業には便利ですが、改行を挟まずに 1 つのチャンクで転送できるデータ量には制限があります。Emacs はパイプを使用するように指示することもできますが、パイプにはこの制限はありません。
これをテストするには、新しい Emacs を起動し、 を評価してM-: (setq process-connection-type nil)
を起動しますsql-mysql
。問題が解決した場合、これが原因です。その場合は、次のようなコマンドを使用します。
(add-hook 'sql-mysql-mode-hook
(lambda ()
(set (make-local-variable 'process-connection-type) nil)))
process-connection-type
MySQL 対話バッファ内でのみリセットされることを確認します。
編集
によるとhttp://tinyurl.com/car439o/Emacs は、長い PTY 出力を改行 + EOF のペアで中断しなくなりました。コミットは 2010-04-13 のものですが、2012 年にリリースされた Emacs 24 でのみ発生しました。これにより、問題が 24.2.1 で再現されない理由が説明されます。24 より前の Emacs を使用している場合は、アップグレードしてみてください。