我编写了两个函数push
,pull
用于将文件复制到目录 ( ) 和从目录复制文件$FILE_EXCHANGE_DIR
。我希望 bash 在使用该pull
函数时自动完成该目录中的名称。我希望自动补全仅从所述目录中获取名称。在当前表单中,我的自动补全功能还会查找当前目录中的文件名称,无论源目录 ( $FILE_EXCHANGE_DIR
) 中是否存在匹配项。
这是我传递给的函数的两个版本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
.