2010-09-11 171 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