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