現在のセッション内で「プログラム可能な完了」をカスタマイズする方法はありますか?

現在のセッション内で「プログラム可能な完了」をカスタマイズする方法はありますか?

コマンドまたはファイル名の入力を開始すると、Tabキーを使用して文字列をオートコンプリートできます。現在のbashセッションのオートコンプリート動作を変更する方法はありますか?

例えば

Tab Tab現在のセッションで押すと、埋め込み*.txtファイルのみが表示されます。

オートコンプリートはどのように機能しますか?オートコンプリートの動作を変更するために調整できる環境変数のセットはありますか?

ベストアンサー1

このbash_completionメカニズムでは、bash関数は_filedir_xspec()ファイル名とディレクトリ名の完成を担当します。この機能はスクリプトにあります/etc/bash_completion

関数を編集し、正規表現を含む行を追加できます。たとえば、この関数(元の関数のコピー)を使用する場合は、次のようになります。

_filedir_xspec()
{
    local IFS cur xspec

    IFS=$'\n'
    COMPREPLY=()
    _get_comp_words_by_ref cur

    _expand || return 0

    # get first exclusion compspec that matches this command
    xspec=$( awk "/^complete[ \t]+.*[ \t]${1##*/}([ \t]|\$)/ { print \$0; exit }" \
        "$BASH_COMPLETION" )
    # prune to leave nothing but the -X spec
    xspec=${xspec#*-X }
    xspec=${xspec%% *}

    local -a toks
    local tmp

    toks=( ${toks[@]-} $(
        compgen -d -- "$(quote_readline "$cur")" | {
        while read -r tmp; do
            # see long TODO comment in _filedir() --David
            printf '%s\n' $tmp
        done
        }
        ))

    # Munge xspec to contain uppercase version too
    eval xspec="${xspec}"
    eval xspec="!*.txt" #<---- HERE add your regex, that's the only line changed
    local matchop=!
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!}
        matchop=@
    fi
    [[ ${BASH_VERSINFO[0]} -ge 4 ]] && \
        xspec="$matchop($xspec|${xspec^^})" || \
        xspec="$matchop($xspec|$(printf %s $xspec | tr '[:lower:]' '[:upper:]'))"

    toks=( ${toks[@]-} $(
        eval compgen -f -X "!$xspec" -- "\$(quote_readline "\$cur")" | {
        while read -r tmp; do
            [ -n $tmp ] && printf '%s\n' $tmp
        done
        }
        ))
    [ ${#toks[@]} -ne 0 ] && _compopt_o_filenames
    COMPREPLY=( "${toks[@]}" )
}

新しいセクションを参照してください。32号線:

eval xspec="!*.txt" 

このステートメントは、後でcompgen正規表現と一致しないすべてのエントリを削除するために使用されます。このファイルを編集することはお勧めできません/etc/bash_completion。代わりに、上記の内容とファイル(必要な場合)を使用してsource新しいファイルを作成してください。

source /path/to/file

シェルの関数で完成したすべてのコマンド/アプリケーションは、 _filedir_xspec()ファイル名のみを使用して完成しました*.txt

おすすめ記事