在自定义 comint 模式下获取 Tab 补全

Ble*_*ers 3 emacs tab-completion

我通常尝试使用以下命令启动 CLI(可能没有正确定义它):

(make-comint-in-buffer "PUTTY" nil "./plink.exe" nil "dbserver")
(make-comint-in-buffer "Python" nil "c:/Python26/python.exe" nil "-i")
(make-comint-in-buffer "Python" nil "c:/Python27/python.exe" nil "-i")
(make-comint-in-buffer "git" nil "C:/Program Files (x86)/Git/bin/sh.exe" nil "--login" "-i")
Run Code Online (Sandbox Code Playgroud)

开始上面特别是命令提示符中的第一个和最后一个提供了tab完成的便利。但在comint-mode我似乎没有得到这个功能。

Enteringtab在点下添加一个简单的制表符,而不是将其传递给进程并返回完成候选者。comint-dynamic-complete并且C-qtab不会产生预期的结果。

如何在comint-mode运行不同进程时利用上述功能?

Tyl*_*ler 5

简答

您需要在 Emacs 中编写自己的完成函数。这些可能会从外部程序中获取信息,但您无法直接访问由 python 或 git 等提供的选项卡完成。

长答案:

运行 时make-comint-in-buffer,您正在设置最基本的设置,以交互地从外部进程发送和接收数据。每当您按下 时enter,Emacs 都会将当前行发送到底层进程,然后打印回该进程的输出。外部进程不知道你在做什么,直到 Emacs 向它发送整行 - 没有直接传递单个字符。

这与直接在终端中运行外部程序不同。当您在终端中运行 python 时,它会在您键入每个字符时(或至少可以)解释它。因此,当您点击 Tab 时,它知道尝试完成某事。当您在 Emacs 中运行 python 时,Emacs 会处理您的所有输入,直到您按 Enter。这意味着当你点击 tab 时,Emacs 只是插入一个 tab 字符,python 不知道尝试完成某些事情。

Emacs 可以为comint 模式提供tab 补全,但是您需要在Emacs 端构建补全目标,不能依赖外部程序的本机补全。要了解其工作原理,请查看 shell.el 中的完成函数,您可以使用M-x find-library shell.

这不是你可以用一两行 elisp 做的事情。它是为与外部进程交互而编写的主要模式的重要组成部分 - 例如 ESS for R http://ess.r-project.org/

也就是说,如果您深入研究 shell.el 的内容,您可能会找到足够多的代码,您可以对其进行修改以开始使用。