问题:Gnu Emacs:在 sql.el 进程中运行的 psql 的制表符补全

我喜欢在 psql.el 下运行 Postgres 客户端“psql”,同时在单独的窗口中与 .sql 文件进行交互。有时,我想在运行 psql 进程的缓冲区中使用制表符补全来查找适当表名的名称。但是,我无法弄清楚如何导致预期的结果。

这里提出了一个非常相关的问题:https://superuser.com/questions/236574/how-can-i-send-a-literal-tab-to-bash-in-emacs-shell-mode

没有任何成功的建议。

提前致谢!

SetJmp

解答

通常,为交互使用而设计的程序(当他们拥有终端时)在管道中使用时会禁用交互功能(例如 UP/DOWN 的历史记录,TAB 的完成)。

Emacs 通常将管道用于外部进程。因此禁用了交互功能。

即使您发送 TAB,您的客户端程序也不会按照您的意愿为您解释它。

您可以阅读程序的 man/help 并通过提供命令行开关(如 GNU Bash 的 --login)来尝试强制交互模式。

发送 TAB 评估:

(defun my-comint-send-string (字符串)

“将字符串发送到 comint 缓冲区。对于 *compilation* 只读缓冲区很有用。”

(交互的

(list (read-input "Type string: " nil 'my-comint-send-hist-list)))

(comint-send-string (get-buffer-process (current-buffer)) string))

(define-key XXX-mode-map [C-return] 'my-comint-send-string)

并使用这样的键序列:C-RET C-q TAB RET。

但是,如果为程序的 stdio 启用了缓冲,这可能不起作用(要刷新输入,您也必须发送\n)...

与Emacs shell-mode 中的 Bash 自动完成讨论的问题基本相同

注意 M-x 术语使用伪终端,因此所有交互式程序都可以按需要工作。但是在这种模式下,您将失去任何 Emacs 编辑功能......

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐