如何在 emacs 的 shell 模式下向 bash 发送文字制表符?

如何在 emacs 的 shell 模式下向 bash 发送文字制表符?

我想完全绕过 comint-mode 的完成支持,而是依靠下属进程来帮我完成。具体来说,如果我运行:

  • emacs
    • shell模式
      • 狂欢

然后我希望TAB被传递给 bash 进程并由它进行扩展。

如果我正在跑步:

  • emacs
    • 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

相关内容