使用自定义命令完成行

时间:2009-01-09 09:11:42

标签: bash unix customization autocomplete

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

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

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

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

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

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

6 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:15)

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

complete -F _optcomplete <program>

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

答案 2 :(得分:8)

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

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

因为它是单行的,所以您不必为此创建文件,但您可以将其放在.bashrc中。

答案 3 :(得分:6)

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

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

答案 4 :(得分:3)

据我所知,PYTHONSTARTUP用于在解释器启动时执行命令[1]rlcompleter用于自动填充内部您的脚本,如果它正在使用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

答案 5 :(得分:0)

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