【问题标题】:Line completion with custom commands使用自定义命令完成行
【发布时间】:2009-01-09 09:11:41
【问题描述】:

我的 Python 程序可以使用一系列不同的选项(或子命令)启动,例如:

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

我希望它使用自动完成功能,这样如果我输入“myProgram d”它会返回“myProgram doSomething”,如果我输入“myProgram n”它会呈现“myProgram nowDoSomethingDifferent”。这类似于模块 rlcompleter 的平均使用,但它不会从文件系统(或历史)中选择可能的完成选项,而是从一组自定义字符串(对应于我的程序)

你知道如何实现吗?

我知道变量 PYTHONSTARTUP(它应该指向一个我不知道如何编写的文件)。

作为一个工作示例,django-admin(来自 django 包)具有我正在寻找的完全相同的功能

【问题讨论】:

  • 这是一个 bash 问题。您必须自定义 bash 才能使其正常工作。与python无关。

标签: bash unix customization autocomplete


【解决方案1】:

创建一个文件“myprog-completion.bash”并将其源到您的 .bashrc 文件中。像这样让你开始......

_myProgram()
{
  cur=${COMP_WORDS[COMP_CWORD]}
  case "${cur}" in
    d*) use="doSomething" ;;
    n*) use="nowDoSomethingElse" ;;
  esac
  COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o default -o nospace -F _myProgram  myProgram

【讨论】:

  • 这个可以和别名一起使用吗?我有gist,我想在一些网站上自动完成,比如 twitter google 等,有什么想法吗?
【解决方案2】:

有一个模块 optcomplete 允许您在 python 程序中编写 bash 自动完成的完成。这与 optparse 结合使用非常有用。您只需定义一次参数,将以下内容添加到您的 .bashrc

complete -F _optcomplete <program>

您的所有选项都将自动完成。

【讨论】:

【解决方案3】:

正如其他答案中提到的,在 bash 中,这可以使用 bash-builtin complete 来完成。比编写函数(如richq's answer)更容易的是使用complete 的选项-W,它允许您指定单词列表。在您的示例中,这将是:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

由于它是单行的,因此您不必为此创建文件,但您可以将其放入您的 .bashrc

【讨论】:

    【解决方案4】:

    如果我理解正确,您希望在 python 脚本启动之前在命令行上完成行。那么你不应该搜索python解决方案,而是查看shell功能。

    如果您使用 bash,您可以查看 /etc/bash_completion,至少在 debian/ubuntu 上,您应该在 /etc/bash_completion.d/ 中创建一个文件,指定程序的完成。

    【讨论】:

    • +1。我会去这个。如果您有一组有限的完成,那么设置它非常简单。它为用户提供了他们习惯的界面。
    【解决方案5】:

    据我所知,PYTHONSTARTUP 用于在解释器启动时执行命令[1]rlcompleter 用于自动完成inside 你的脚本,如果它使用readline 库。像这样的:

    $ ./myscript.py
    My Script version 3.1415.
    Enter your commands:
    myscript> B<TAB>egin
    myscript> E<TAB>nd
    

    在您的示例中,您希望在 shell 命令行上完成。这个自动补全是一个 shell 功能(bashzsh,无论你使用什么)。例如,参见an introduction to bash autocompletion(也可参见part 2)。对于zsh,请参见例如this guide

    【讨论】:

      【解决方案6】:

      如果您希望程序选择命令行选项,即使您只使用了该选项的缩写形式,您应该查看标准库中的 optparse module

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        • 2011-08-20
        相关资源
        最近更新 更多