コマンドがエイリアスの場合、引数に対してタブ補完は機能しません。

コマンドがエイリアスの場合、引数に対してタブ補完は機能しません。

私が好きなエディタmgのエイリアスeeを定義しました。私が何かをするとき

mg fo

その後、タブをクリックしたときにfooファイルがある場合は、タブ補完が表示されます。

mg foo

私が使ったほとんどのシステム(例:過去数年間のすべてのUbuntuバージョンといくつかのDebianのインストール)で

ee fo

やっぱりちゃんとした

ee foo

しかし、私が使用している限り、Debian 6.0およびGNU bash 4.1.5(1) - リリースを含むシステムでエイリアスがあるバージョンでは、タブの完成は失敗します。これはいいえエイリアス自体を完成させるのに問題があります。 - エイリアスの完成に問題があります。議論エイリアスコマンド。 Debianシステムでこの動作を修正する方法はありますか? Bash 4.2.xにアップグレードしますか?設定ファイルを操作していますか?

ベストアンサー1

編集:わかりました。私は状況を誤って判断したようです。プログラムオプションは次のように思われました:

$ mplayer_alias -pla<tab><tab>
-playing-msg  -playlist
$

しかし、ファイルの完成だと思います。よくわかりませんが、一度試してみてください。

クイック修正で次のように動作します。

complete -f -o default ee

与える:

$ ee<tab><tab>
file1 file2 file3
$

〜のように組み込み機能のプログラム可能な完成。たとえば、-X pattern便利です。たとえば、除外.swp.swoファイルは次のようになります。

complete -f -X '*.sw[op]' ee

のみ表示.zip.ZIP

complete -f -o default -X '!*.+(zip|ZIP)' my_unzip_alias

shopt -s extglob一部は設定ファイルに追加する必要があります。



前の答え:

でこれを行うことができます.bash_completion

少なくともスターターとして。

重要なアイデアは、complete既存のスクリプト全体を使用してエイリアスを追加することです。本物プログラム。ここでは、すべて次の形式であると仮定します。

complete -F _complete_function_from_original program_name

次のコマンドを実行して、それが何であるかを判断できますcomplete -p program_name。まず確認するのが最善です。

一部の方法では、たとえば、apt-getエイリアス+ロードのみを使用できます。

_load_comp_hack apt-get myalias

それ以外の場合は、mplayer次の関数ラッパーが必要です。

myalias() { mplayer "$@"; }
                      |
                      +--- Could be messy

この問題を解決するより良い方法があるかもしれませんが、私はうまくいきます。私は主にプログラムの機能を拡張するラッパースクリプトに主に使用します。まだエイリアスに使用していません。

私はこのハッキングは安全だとは思わないが、動作していることを確認することができます。

_load_comp_hack()
{
    local cc=
    # Make sure completion scripts are sourced.
    # Report error if source fail.
    if . "/usr/share/bash-completion/completions/$1" >/dev/null 2>&1; then
        # Extract the completion function used by the "real" program.
        if cc="$(complete -p "$1" | cut -d' ' -f3)"; then
            # Add it to the alias
            complete -F "$cc" "$2"
            return 0
        fi
    fi
    echo "bash-completion '$1' for '$2' not found."
}

_load_comp_hack mplayer mplad
_load_comp_hack apt-get z
                |       |
                |       +----- Alias, script or function
                +------------- Real function

_longopt一部のプログラムは、ソースファイルが見つからないより一般的な完成機能を使用します。一般に、ソースも必要ないので、より単純なバリエーションは次のとおりです。

_load_comp_hack()
{
    local cc=
    if cc=$(complete -p "$1" | cut -d' ' -f3); then
            complete -F "$cc" "$2"
    fi
}

IIRC、ここでの1つの問題は、いくつかの完了スクリプトが最初の実行のように最初に実行されるまでロードされないことです
prog tabtab。あるいは、elseファイルソースが失敗した場合は追加できます。

おすすめ記事