如何自动完成特定目录下的文件?

How to autocomplete files under specific directory?

我创建了一个命令memo如下:

memo() {
  vi $HOME/memo/
}

我想将 bash-completion 应用到我的 memo 以打开 $HOME/memo 目录中已有的文件:

$ memo [TAB] # to show files in $HOME/memo

$HOME/memo 包含目录,因此在 memo 下列出文件是不够的。 换句话说,我想将 $HOME/memols 命令中使用的内容应用到 memo:

$ ls [TAB]
foo.md bar/

我尝试了以下方法,但它不适用于嵌套目录:

_memo() {
    local cur
    local files
    _get_comp_words_by_ref -n : cur
    files=$(ls $MEMODIR)
    COMPREPLY=( $(compgen -W "${files}" -- "${cur}") )
}
complete -F _memo memo

MEMODIR=$HOME/memo

这是一个简单的例子:

_memo()
{
    local MEMO_DIR=$HOME/memo
    local cmd= cur= pre=
    local arr i file

    arr=( $( cd "$MEMO_DIR" && compgen -f -- "$cur" ) )
    COMPREPLY=()
    for ((i = 0; i < ${#arr[@]}; ++i)); do
        file=${arr[i]}
        if [[ -d $MEMO_DIR/$file ]]; then
            file=$file/
        fi
        COMPREPLY[i]=$file
    done
}
complete -F _memo -o nospace memo