23

sql-mysql私は Emacs のモードで頻繁に煩わしさを経験してきました。バッファーからアクティブな SQL プロセス バッファーにクエリを送信しようとするとsql-mode、そのクエリは 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_processsrc/process.c

これは、IPC パイプの 4k バッファによって生じる制限にすぎないようです。このサイズを変更するにはカーネルのハッキングが必要であるように見えるため、それは良い答えではありません。

私が困惑していると思うのは、パイプを介して送信された SQL が 4k より大きい場合、mysql クライアントによって適切に再構築されない理由です。何か案は?

Emacs バージョン: 2012-03-25 の GNU Emacs 23.3.1 (x86_64-pc-linux-gnu、GTK+ バージョン 2.24.10)、allspice、Debian で変更

mysql -V: mysql Ver 14.14 Distrib 5.5.24、readline 6.2 を使用する debian-linux-gnu (x86_64) 用

Sql Mysql オプション: -A -C -n (注意: -n (バッファなし) を使用した場合と使用しない場合の両方を試しましたが、どちらもこの問題を修正しませんでした)

4

1 に答える 1

5

犯人は、プロセスと通信するためにcomintPTY を割り当てている によって使用される Emacs のプロセス通信コードであると思われます。これらはジョブ制御を可能にするため、インタラクティブな作業に役立ちますが、改行を介さずに 1 つのチャンクで転送できるデータ量にも制限があります。この制限がないパイプを使用するよう Emacs に指示することもできます。

これをテストするには、新しい Emacs を起動し、 evaluateM-: (setq process-connection-type nil)と start を実行し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 は改行 + EOF のペアで長い PTY 出力を中断する必要がなくなりました。コミットは 2010 年 4 月 13 日のものですが、2012 年にリリースされた Emacs 24 にのみ現れました。24 より前の Emacs を使用している場合は、アップグレードしてみてください。

于 2012-09-10T20:52:19.120 に答える