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

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

コマンドまたはファイル名の入力を開始すると、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

答え2

特定のプログラムまたはカスタムスクリプトまたはコマンドでのみ使用することもできます。

txt提案に拡張子を持つファイルのみを表示するには、source現在のセッションでシェルスクリプトを作成するだけです。

# Autocomplete file /path/to/file/sample-completion.sh
# for the command `sample`
_sample(){
   COMPREPLY=($(compgen -f -X "!.*[.][tT][xX][tT]$" -- "$2"))
}

complete -F _sample sample

以下を呼び出して取得します。

$ source /path/to/file/sample-completion.sh

このコードでは、$2現在の単語が完成しています。この-- "$2"部分はcompgen現在完成している単語を含む提案のみをフィルタリングして入力してください。COMPREPLY。また、この-fオプションはcompgen現在のディレクトリにあるファイルのみを探します。最後に重要な-Xオプションはフィルタモード(こちらを参照)入らないようにするファイル名の一致!パターンの先頭に否定的なそのような行動。その結果、.txt拡張子を持つファイルのみが表示されます。$正規表現の末尾にシンボルを使用すると、指定されたパターンで終わる一致を見つけることができます。つまり[.]、文字だけでなく文字通りの点も探します。これは正規表現における点の基本的な意味です。この[tT][xX][tT]部分では、パターンは「txt、txT、tXt、tXT、Txt、TxT、TXT、TXt」などのすべてのケースと一致すると言われています。

答え3

期待する受け入れられた回答@chaosから来ましたが、この機能を提案します。修理する必要に応じて既存の完成機能:

patchFDxspec(){
  . <(type _filedir_xspec | sed -e '1d;s/\(eval xspec="\).*$/&\n\1!*.txt";/');
}

この機能を実行すると、_filedir_xspec現在のセッションがパッチされます。

。以外の拡張子が必要な場合は、.txt機能を変更して目的のサフィックスを$1

関連情報