3

我喜欢在 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

4

1 回答 1

4

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

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

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

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

发送 TAB 评估:

(defun my-comint-send-string (字符串)
  “将字符串发送到 comint 缓冲区。对于 *编译 * 只读缓冲区很有用。”
  (交互的
   (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 autocompletion讨论的问题基本相同

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

于 2011-09-28T20:49:29.353 回答