我喜欢在psql.el下运行Postgres客户端“psql”,同时在单独的窗口中与.sql文件进行交互。有时,我想在运行psql进程的缓冲区中使用tab-completion来查找相应表名的名称。但是,我无法弄清楚如何产生预期的结果。
此处提出了一个非常相关的问题:https://superuser.com/questions/236574/how-can-i-send-a-literal-tab-to-bash-in-emacs-shell-mode
没有任何成功的建议。
提前致谢!
的setjmp
答案 0 :(得分:3)
通常用于交互式使用的程序(当他们拥有终端时)在管道中使用时禁用交互功能(如UP / DOWN的历史记录,TAB完成)。
Emacs通常使用管道进行外部处理。因此禁用了交互式功能。
即使您发送了TAB,您的客户端程序也不会为您解释它。
您可以阅读程序的man / help并尝试通过命令行开关强制交互模式(如GNU Bash的--login)。
发送TAB eval:
(defun my-comint-send-string (string) "Send string to comint buffers. Useful for *compilation* read-only buffer." (interactive (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
)...
Bash autocompletion in Emacs shell-mode
讨论了大致相同的问题注意 M-x术语使用伪终端,以便所有交互式程序按需运行。但是在这种模式下你会失去任何Emacs编辑功能......