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