Command line 自动完成命令行参数

Command line 自动完成命令行参数,command-line,autocomplete,command-line-arguments,Command Line,Autocomplete,Command Line Arguments,在bash中,mplayer和imagemagick的“convert”等可执行文件在其命令行参数上具有很酷的自动完成功能。例如,如果我键入 mplayer <tab><tab> convert -<tab><tab> mplayer 在我的一个视频文件夹中,mplayer将列出该文件夹中的所有媒体文件,仅列出媒体文件 同样,如果我输入 mplayer <tab><tab> convert -<tab>&

在bash中,mplayer和imagemagick的“convert”等可执行文件在其命令行参数上具有很酷的自动完成功能。例如,如果我键入

mplayer <tab><tab>
convert -<tab><tab>
mplayer
在我的一个视频文件夹中,mplayer将列出该文件夹中的所有媒体文件,仅列出媒体文件

同样,如果我输入

mplayer <tab><tab>
convert -<tab><tab>
转换-
然后我将看到convert脚本的所有可能选项,这非常好


我的问题是如何使用bash、ruby或python脚本实现类似的功能?

这是bash智能完成的一个示例。一个基本的描述是,编写您自己的扩展的指南是,另一个(基于Debian的)指南是。下面是
complete
命令(促进此行为的命令)的一个示例。

bash中的此功能由提供,类似的功能也包含在zsh中。如果您想为这些工具之一当前不支持的某些程序添加支持,则需要为它们编写自己的扩展。

在接受的答案中编写自己的扩展的链接已失效。引自

Bash为您提供了一种指定关键字的方法,并使用它们来 自动完成应用程序的命令行参数。我使用vim 作为wiki,任务管理器和联系人。vim帮助标签系统允许 我索引内容,而不是搜索它,以及速度 显示它。我想添加的一个功能是访问这些标签 从维姆的外面

这可以直接进行:

$ vim -t tagname
这会将我直接带到使用此标记标记的特定内容。但是,如果我能提供 标签的自动完成

我首先为vim命令行定义了一个Bash函数。我添加了 将以下代码添加到my.bashrc文件:

function get {
    vim -t $1
} Now I can use get tagname command to get to the content.
Bash可编程完成是通过寻找 /etc/bash完成脚本。脚本允许我们添加 自动完成脚本/etc/bash-completion.d/目录并执行 无论什么时候叫它,它都是。所以我添加了一个名为get with the的脚本文件 下面是该目录中的代码

_get()
{
    local cur
    COMPREPLY=()
    #Variable to hold the current word
    cur="${COMP_WORDS[COMP_CWORD]}"

    #Build a list of our keywords for auto-completion using
    #the tags file
    local tags=$(for t in `cat /home/anadgouda/wiki/tags | \
                      awk '{print $1}'`; do echo ${t}; done)

    #Generate possible matches and store them in the
    #array variable COMPREPLY
    COMPREPLY=($(compgen -W "${tags}" $cur))
}

#Assign the auto-completion function _get for our command get.
complete -F _get get Once the /etc/bash-completion is sourced, you will get auto-completion for the tags when you use the get command.
与我的wiki一起,我将其用于所有文档工作和 倍的代码。我还使用从代码创建的标记文件。这个 索引系统可以让我记住上下文而不是文件名 和目录

您可以针对您使用的任何工具调整此系统。你需要的一切 要做的是为您的命令获取一个关键字列表,并将其交给 Bash可编程完成系统


谢谢我刚刚修复了已接受答案中的链接。该链接已失效。