在自定义comint模式下获取制表符

时间:2013-12-05 09:54:36

标签: 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")

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

输入标签会在该点下添加一个简单的制表符,而不是将其传递给流程并返回完成候选项。 comint-dynamic-complete C-q 标签不会产生所需的结果。

如何在运行不同流程的comint-mode中使用上述功能?

1 个答案:

答案 0 :(得分:4)

简短回答

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

答案很长:

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

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

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

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

那就是说,如果你深入了解shell.el的内容,你可以找到足够的代码来修改,以便让你开始。