如何在特定目录下实现文件自动补全?

5

我创建了一个名为memo的命令,代码如下:

memo() {
  vi $HOME/memo/$1
}

我希望将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

1个回答

11

以下是一个简单的示例:

_memo()
{
    local MEMO_DIR=$HOME/memo
    local cmd=$1 cur=$2 pre=$3
    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

auto-complete


与此主题相关但不是实际回答OP的问题:我想要一个自动完成,就像OP一样,但只包括dirs。当我尝试调整这个答案时,我发现bash自动完成的_cd()函数有一个$CDPATH变量,正好满足我的需求。 - Benjamin Goodacre
太棒了,完美地工作,谢谢。 - Patrick Michaelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接