【问题标题】:Get tab completion in custom comint mode在自定义 comint 模式下获取制表符完成
【发布时间】:2013-12-05 09:54:36
【问题描述】:

我通常尝试使用以下命令启动 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我好像没有这个功能。

输入 tab 在该点下添加一个简单的制表符,而不是将其传递给进程并取回完成候选。 comint-dynamic-completeC-qtab 不会产生预期的结果。

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

【问题讨论】:

    标签: emacs tab-completion


    【解决方案1】:

    简答

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

    长答案:

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

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

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

    这不是你用一两行 elisp 就能做到的。它是编写用于与外部进程交互的主要模式的重要组成部分——比如 R 的 ESS http://ess.r-project.org/

    也就是说,如果您深入研究 shell.el 的内容,您可能会发现足够多的代码可以修改以帮助您入门。

    【讨论】:

    • 最近我偶然发现了一个非常简单的解决方案。这适用于 plink(PUTTY) 但不适用于 Git-sh。使用comint 生成进程,然后启用term-char-mode,一切顺利。
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 2011-09-23
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多