私はファイルをディレクトリ()にコピーし、ディレクトリからファイルをコピーするpush
2つの関数を作成しました。この機能を使用するとき、bashはそのディレクトリの名前を自動補完したいと思います。オートコンプリート機能はそのディレクトリからのみ名前を取得したいと思います。現在のフォームでは、オートコンプリート機能は、ソースディレクトリ()に一致するエントリがあるかどうかに関係なく、現在のディレクトリ内のファイル名も検索します。pull
$FILE_EXCHANGE_DIR
pull
$FILE_EXCHANGE_DIR
ここに私が渡す関数の2つのバージョンがありますcomplete
。それらのどれも仕事がありません。
_pull () {
local cmd="${1##*/}";
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
filelist=( $(ls ${FILE_EXCHANGE_DIR} ) )
local TEMP_COMPREPLY=( $(compgen -W "${filelist[@]}" -- ${word} ) )
COMPREPLY=( "${TEMP_COMPREPLY[@]}" )
return 0;
}
_pull ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
local pat="$FILE_EXCHANGE_DIR/*"
COMPREPLY=($(compgen -f -G "$pat" -- "$FILE_EXCHANGE_DIR/${word}"));
i=0
for item in "${COMPREPLY[@]}"; do
COMPREPLY[$i]="${item##*/}"
i+=1
done;
return 0;
}
最後に、私は
complete -f -F _pull pull
現在のディレクトリではなく、ディレクトリ(現在のディレクトリではない)からのみ名前を完成させるための良い方法はありますか?これはソースに一致するものがない場合でもデフォルトで行う必要がありますかreadline
?
ベストアンサー1
私が正しく理解したなら、これはあなたが探しているものでなければなりません:
_pull () {
# Set
IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull
ファイル名のスペースもエスケープします。
これは-o default
デフォルト値として実行されますが、明示的にどこか(?)に設定しない限り、実際には何もしないようreadline
です。.initrc
ファイル名が必要な場合は、-o filenames
または使用してください-f
。