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

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

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

关于如何实现这个的任何想法?

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

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

有帮助吗?

解决方案

创建一个文件“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

其他提示

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

complete -F _optcomplete <program>

并且所有选项都将自动完成。

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

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

因为它是单行的,所以你不必为此创建一个文件,但你可以把它放在 .bashrc 中。

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

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

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

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

在您的示例中,您希望在 shell 命令行上完成。此自动完成是一个shell功能( bash zsh ,无论你使用什么)。例如,请参阅 bash自动完成简介(同时第2部分)。对于 zsh ,请参阅 this指南

如果您希望程序选择命令行选项,即使您只使用了此选项的缩写形式,也应该查看 optparse模块

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top