我认为你是对的,sql-set-sqli-buffer 没有找到合适的 SQLi 缓冲区的原因是因为它在遍历打开的缓冲区列表时考虑了 SQL 模式缓冲区的产品子类型。
这是我的 sql.el 副本中的缓冲区测试代码,它与我的 emacs 一起提供(版本 - GNU emacs 24.2.1
(defun sql-find-sqli-buffer (&optional product connection)
"Returns the name of the current default SQLi buffer or nil.
In order to qualify, the SQLi buffer must be alive, be in
`sql-interactive-mode' and have a process."
(let ((buf sql-buffer)
(prod (or product sql-product)))
(or
;; Current sql-buffer, if there is one.
(and (sql-buffer-live-p buf prod connection)
buf)
;; Global sql-buffer
(and (setq buf (default-value 'sql-buffer))
(sql-buffer-live-p buf prod connection)
buf)
;; Look thru each buffer
(car (apply 'append
(mapcar (lambda (b)
(and (sql-buffer-live-p b prod connection)
(list (buffer-name b))))
(buffer-list)))))))
主要用于测试资格的两个值是缓冲区和标识产品类型的符号。此符号作为参数传入,或默认为 sql-product 的值。似乎 sql-product,除非以其他方式设置,否则默认为 'ansi,这就是为什么您的编辑缓冲区是 SQL [ANSI]。
M-x sql-set-product
在尝试将 SQLi 缓冲区与查询缓冲区关联之前,您应该尝试在此缓冲区中设置产品类型(例如,使用)。如果您希望默认值始终为“mysql”,您可以在初始化文件中设置它,或者使用自定义它M-x customize-variable
SQL 模式是相当有序的,依赖于使用正确的局部变量设置缓冲区,以便有一个有效的关联 iSQL 会话。
我用来启动 iSQL 缓冲区并在我已经编辑的另一个缓冲区中进行查询的典型序列如下
- 切换到包含 SQL 文本的缓冲区,可能通过访问文件,或使用
C-x b
创建临时缓冲区。
- 将此缓冲区设置为正确的 SQL 类型,
M-x sql-set-product
然后在提示符处输入已知类型,例如“mysql”。
- 点击
C-c <TAB>
(绑定到sql-product-interactive
)以切换到与此缓冲区关联的 iSQL 缓冲区,可能通过定位或创建新的 comint 进程
可能值得阅读M-x sql-help
命令的输出。SQL 模式的文档非常简单。我已经弄清楚了我对它的了解很少,主要是通过阅读源代码。