Bash 使用自定义命令完成行

Bash 使用自定义命令完成行,bash,unix,customization,autocomplete,Bash,Unix,Customization,Autocomplete,我的Python程序可以使用一系列不同的选项(或子命令)启动,如: 我希望它使用自动完成,这样,如果我键入“myProgram d”,它将返回“myProgram doSomething”,如果我键入“myProgram n”,它将呈现“myProgram nowDoSomethingDifferent”。这类似于模块rlcompleter的平均使用,但它不会从文件系统(或历史记录)中选择可能的完成选项,而是从一组自定义字符串(对应于我的程序的可用选项)中选择 你知道如何实施吗 我知道变量PYT

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

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

你知道如何实施吗

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


作为一个工作示例,django admin(来自django包)具有与我正在寻找的相同的功能,而且我知道,PYTHONSTARTUP用于在解释器启动时执行的命令<如果脚本使用
readline
库,则code>rlcompleter用于脚本内部的自动完成。大概是这样的:

$ ./myscript.py
My Script version 3.1415.
Enter your commands:
myscript> B<TAB>egin
myscript> E<TAB>nd
$。/myscript.py
我的脚本版本3.1415。
输入您的命令:
myscript>开始
myscript>End

在您的示例中,您希望在shell命令行上完成。此自动完成功能是一个shell功能(无论您使用什么,
bash
zsh
)。例如,参见(另见)。对于
zsh
请参见,例如。

如果我理解正确,您希望在python脚本启动之前在命令行上完成行。然后,您不应该搜索python解决方案,而应该查看shell特性


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

如果你想让你的程序选择一个命令行选项,即使你只使用了这个选项的缩写形式,你应该看看标准库中的。

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

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

complete -F _optcomplete <program>
complete-F\u optcomplete

所有选项都将自动完成。

如其他答案中所述,在bash中,这可以通过bash内置的
complete
完成。比编写函数(如中)更简单的是使用
complete
的选项
-W
,它允许您指定单词列表。在您的示例中,这将是:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

由于它是一个单行程序,您不必为此创建文件,但您可以将它放在
.bashrc

中,这是一个bash问题。您必须自定义bash才能使其工作。它与python无关。+1。我会选择此文件。如果您有一组有限的完成项,则设置它非常简单。它为用户提供了他们使用的界面。optparse没有被弃用,而是被argparse取代。更喜欢argcomplete:这可以与别名一起使用吗?我有,我想在twitter、谷歌等网站上使用autocomplete,有什么想法吗?
complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram