自动完成命令行参数

问题描述 投票:34回答:3

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

mplayer <tab><tab>

在我的一个视频文件夹中,然后mplayer将列出位于该文件夹中的所有媒体文件,并且仅列出媒体文件。

同样,如果我输入

convert -<tab><tab>

然后我将看到转换脚本的所有可能选项,这很棒。

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

command-line autocomplete command-line-arguments
3个回答
33
投票

这是BASH智能完成的一个例子。基本描述是here,编写自己的扩展的指南是here,另一个(基于Debian的)指南是here。这里是fuller featured introduction命令的complete(促进此行为的命令)。

编辑:修复死链接


3
投票

bash中的此功能由bash-completion提供,zsh中包含类似的功能。如果要添加对某些当前不支持的程序的支持,则需要为它们编写自己的扩展。


2
投票

在接受的答案中编写自己的扩展程序的链接已经消失。从http://web.archive.org/web/20090409201619/http://ifacethoughts.net/2009/04/06/extending-bash-auto-completion/引用这里

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

这可以直接进行:

$ vim -t tagname

这会直接转到使用此标记标记的特定内容。但是,如果我可以为标签提供自动完成功能,那么效率会更高。

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

function get {
    vim -t $1
} Now I can use get tagname command to get to the content.

Bash可编程完成是通过获取/ etc / bash-completion脚本完成的。该脚本允许我们添加自动完成脚本/etc/bash-completion.d/目录,并在调用时执行它。所以我在该目录中添加了一个名为get的脚本文件,其中包含以下代码。

_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可编程完成系统。

© www.soinside.com 2019 - 2024. All rights reserved.