web-dev-qa-db-ja.com

コマンドライン引数をオートコンプリート

Bashでは、mplayerやimagemagickの「convert」などの実行可能ファイルのコマンドライン引数に、クールなオートコンプリート機能があります。たとえば、

mplayer <tab><tab>

私のビデオフォルダーの1つで、mplayerはそのフォルダーにあるすべてのメディアファイルをリストし、メディアファイルのみをリストします。

同様に、

convert -<tab><tab>

次に、変換スクリプトのすべての可能なオプションが表示されます。これは素晴らしいことです。

私の質問は、bash、Rubyまたはpythonスクリプトを使用して?

40
Régis B.

これは、BASHのスマートコンプリーションの例です。基本的な説明は here であり、独自の拡張機能を作成するためのガイドは here であり、別の(Debianベースの)ガイドは here です。そして、これがcompleteコマンド(この動作を容易にするコマンド)への より充実した機能の紹介 です。

編集:デッドリンクを修正

38
Andy

受け入れられた回答に独自の拡張機能を記述するためのリンクはなくなりました。ここから引用 http://web.archive.org/web/20090409201619/http://ifacethoughts.net/2009/04/06/extending-bash-auto-completion/

Bashは、キーワードを指定し、それらを使用してアプリケーションのコマンドライン引数を自動補完する方法を提供します。私はvimをwiki、タスク管理者、連絡先として使用しています。 vimヘルプタグシステムを使用すると、コンテンツを検索する代わりにインデックスを付けることができ、速度がそれを示しています。これに追加したい機能の1つは、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のプログラム可能な完了システムに渡すことだけです。

5
hojusaram

このbashの機能は bash-completion によって提供され、同様の機能がzshに含まれています。これらのツールのいずれかで現在サポートされていないプログラムのサポートを追加する場合は、それらの独自の拡張機能を作成する必要があります。

4
wRAR