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

MBR*_*MBR 1 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)
Run Code Online (Sandbox Code Playgroud)

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

mysql -uuserid -ppassword
Run Code Online (Sandbox Code Playgroud)

它只是挂起.当我杀死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.)
Run Code Online (Sandbox Code Playgroud)

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

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

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

"Type M-x sql-help RET to read the online help."
Run Code Online (Sandbox Code Playgroud)

所以我做到了 帮助建议运行:

M-x sql-mysql
Run Code Online (Sandbox Code Playgroud)

调用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."
Run Code Online (Sandbox Code Playgroud)

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

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

Ctrl-C -- exit!
Process SQL exited abnormally with code 1
Run Code Online (Sandbox Code Playgroud)

然后我注意到Mx 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."
Run Code Online (Sandbox Code Playgroud)

所以我创建了第二个缓冲区,命名为"my-sql-buffer"并运行Mx sql-mode.当我输入查询时:

show tables;
Run Code Online (Sandbox Code Playgroud)

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

"Sent string to buffer *SQL*."
Run Code Online (Sandbox Code Playgroud)

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

"Sent string to buffer *SQL*."
Run Code Online (Sandbox Code Playgroud)

几次输入Cc Cc后,突然输出出现在*SQL*缓冲区中.它的输出来自:

show tables;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

advTHANKSance为您提供帮助.

Mark Rosenthal
Run Code Online (Sandbox Code Playgroud)

vpi*_*833 5

您需要添加(setq sql-mysql-options '("-C" "-t" "-f" "-n"))到_emacs以使sql-mysql在Windows上正常工作. M-x describe-variable sql-mysql-options阅读文档.