我想完全绕过 comint-mode 的完成支持,而是依靠下属进程来帮我完成。具体来说,如果我运行:
- emacs
- shell模式
- 狂欢
- shell模式
然后我希望TAB
被传递给 bash 进程并由它进行扩展。
如果我正在跑步:
- emacs
- shell模式
- 狂欢
- 查询语言
- 狂欢
- shell模式
然后我希望TAB
由 psql 来处理。
我已在 shell-mode-hook 中尝试过此操作,但没有成功:
(define-key shell-mode-map "\t" 'self-insert-command)
设置此项后,该TAB
键会在命令行上插入一个文字制表符,这对我来说根本没用。
我也尝试过这个,但是当我点击时TAB
什么也没有发生:
(defun cr/comint-send-tab ()
"Send a tab character to the current buffer's process"
(interactive)
(comint-send-input t t)
(process-send-string (current-buffer) "\t"))
(define-key shell-mode-map "\t" 'cr/comint-send-tab)
我怎样才能做到这一点?
答案1
Emacsshell-mode
缓冲区不是终端(即,它们不使用 ptys(伪终端)),因此在这样的缓冲区中运行的程序(shell、shell 运行的程序等)都无法执行一次一个字符的输入。每行都完整输入,并且仅在ENTER按下 时发送。要查看证明,请tty
在缓冲区中运行命令shell-mode
,其输出将是not a tty
。
答案2
尝试一下quoted-insert
(默认情况下)绑定到的C-q。您输入的下一个字符将直接插入缓冲区。
因此C-qTAB将插入一个文字标签。
我不知道这在评论模式(关于 bash 完成)并且无法对其进行测试。
答案3
试试 Emacs 的终端(而不是外壳)。
M-x term
答案4
您可以使用 bash 的引号字符,即 Ctrl-V。要在 Emacs 的 shell 缓冲区中运行的 bash 中插入文字 TAB,请执行以下操作
C-q C-v C-q TAB