尝试将MySQL与Emacs结合使用时出现问题

时间:2011-02-02 19:58:22

标签: mysql emacs

我在尝试将MySQL与Emacs结合使用时遇到了问题。首先,我要提供相关的版本信息:

Local OS: Windows XP, SP3
Terminal emulator/SSH client: Putty 0.58
Remote OS (as reported by uname -a): Linux 2.6.19.7 (also happens on another installation whose Linux is 2.6.18)
Emacs version (running on remote OS): 21.3.1 (also happens on another installation whose Emacs is 21.4.1)
MySQL version (running on remote OS): 4.1.22 (also happens on another installation whose MySQL is 5.0.91)

我总是在Emacs中运行一个shell缓冲区,我想运行命令'mysql',这样我就可以运行SQL查询了。但如果我输入

mysql -uuserid -ppassword
它只是挂起。当我终止mysql进程时,它会报告:

bash: [XXXXX: 2] tcsetattr: Invalid argument
    (where XXXXX is the process id of the bash shell that's the parent of the mysql process that was killed.)

多年前,我编写了一个名为tcsetattr()的C代码,用于设置tty设备驱动程序的标志。我记得它是基于tty通过RS-232连接的想法,你通过tcsetattr()设置的许多属性控制了RS-232连接的特性 - 波特率,奇偶校验等。显然,对于伪 - ttys,其中大部分都是无关紧要的。看起来'mysql'可执行文件试图做一些在Emacs shell缓冲区的上下文中不起作用的硬件控制。

当我进一步调查时,我发现Emacs有一个名为sql-mysql的Lisp函数,听起来像是直接运行MySQL查询。这对我来说听起来不错。但是当我尝试它时,我遇到了不同的问题。

关于如何使用M-x sql-mysql我可以找到什么小文档是相当不完整的。它没有提供有关如何运行查询的任何信息。 http://www.emacswiki.org/emacs/SqlMode说,

"Type M-x sql-help RET to read the online help."

所以我这样做了。帮助建议运行:

M-x sql-mysql

调用MySQL,然后说,

"Once you have the SQLi buffer, you can enter SQL statements in the buffer.  The output generated is appended to the buffer and a new prompt is generated."

缓冲区从不显示提示。我无法点击Emacs的菜单栏中的项目,因为我通过ssh连接(客户端是putty),而putty似乎没有传输鼠标点击。所以我无法进入Emacs的菜单栏中的“SQL”或“In / Out”菜单。

我尝试将一个C-c(通过键入C-c C-c)发送到* SQL *缓冲区,期望这会导致它退出,就像shell缓冲区一样。令我惊讶的是,我在报告之前显示了我输入的QUERY的输出:

Ctrl-C -- exit!
Process SQL exited abnormally with code 1

然后我注意到M-x sql-help也说:

"If you have a really complex SQL statement or if you are writing a procedure, you can do this in a separate buffer. Put the new buffer in `sql-mode' by calling M-x sql-mode.  The name of this buffer can be anything.  The name of the major mode is SQL."

"In this SQL buffer (SQL mode), you can send the region or the entire buffer to the interactive SQL buffer (SQLi mode).  The results are appended to the SQLi buffer without disturbing your SQL buffer."

所以我创建了第二个缓冲区,命名为“my-sql-buffer”并运行M-x sql-mode。当我输入查询时:

show tables;

进入该缓冲区并使用RET终止它,* SQL *缓冲区中没有任何反应。我尝试将光标定位在查询的末尾并键入C-c C-c。底部的迷你缓冲区显示:

"Sent string to buffer *SQL*."

但* SQL *缓冲区中没有出现任何内容。我输入了几次C-c C-c。每次迷你缓冲区重新显示:

"Sent string to buffer *SQL*."

多次输入C-c C-c后,突然输出出现在* SQL *缓冲区中。这是来自:

的输出
show tables;
重复5次!除了最后一次停在中间。这种行为表明某些东西正在缓冲输出。我检查了输出了多少字节(C-x h M-C- | wc -c),它输出了4096字节!由于4K是一种常见的缓冲区大小,这证实了我怀疑某些东西正在缓冲输出。但我无法弄清楚正在做什么缓冲以及如何关闭缓冲。

任何人都可以帮我解决以下一个或多个问题:

  1. 如何在emacs内部的bash提示符下运行mysql可执行文件,而不是在调用tcsetattr()时挂起它?

  2. 如何运行M-x sql-mysql,在* SQL *缓冲区中键入一个查询并实际让它运行而不让SQL进程退出?

  3. 当我在sql-mode中的第二个缓冲区中键入查询时,如何在每次查询后将输出刷新到* SQL *?

  4. advTHANKSance求助。

    Mark Rosenthal
    

1 个答案:

答案 0 :(得分:5)

您必须将(setq sql-mysql-options '("-C" "-t" "-f" "-n"))添加到_emacs以使sql-mysql在Windows上正常运行。 M-x describe-variable sql-mysql-options阅读文档。