2010-09-11 112 views
32

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

mplayer <tab><tab> 

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

同样,如果我输入

convert -<tab><tab> 

然后我会看到转换脚本,这是伟大的所有可能的选项。

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

回答

30

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

编辑:固定死链接

3

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

1

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

猛砸引用在这里为您提供指定关键字,并利用这些 自动完成命令行参数为您的应用程序的方式。我使用vim 作为wiki,任务管理员和联系人。 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. 

猛砸可编程完成是通过获取 的/ etc/bash的完成脚本来完成。该脚本让我们添加我们的 自动完成脚本/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可编程完成系统 。

+0

谢谢!我只是在接受的答案中修复了这些链接。 – 2018-03-03 11:01:07