3

我的目录充满了具有相同前缀的文件,我希望能够在 vim 中快速打开这些文件。例如,我可能有:

$ ls *
bar:
bar_10  bar_20  bar_30

foo:
foo_10  foo_20  foo_30

我想要的是能够在这些目录之一中并输入:

$ vim <TAB>

它会自动完成:

$ vim bar_

为了实现这一点,我很高兴每个目录都有一个名为“.completion”的文件,其中包含“bar_”。

我遇到的问题是我想要以下行为:

  * "vim <TAB>"  -->  "vim bar_"           // no space
  * "vim bar_1"  -->  "vim bar_10 "        // space

地点 | 是光标,因此如果文件匹配,则在末尾添加空格。如果我们匹配前缀,请不要添加空格。

到目前为止,我最好的是这种行为减去最后添加的空格。我尝试了各种方法,都无济于事。以下是我所拥有的:

_vim()
{
    local cur opts
    local -a toks

    cur="${COMP_WORDS[COMP_CWORD]}"

    if [ -f .completion ]; then
        opts=`cat .completion`

        if [[ ${opts} = ${cur} ]]; then
            toks=( $(compgen -f ${cur} | sed -e 's/$/ /') )
        else
            if [[ -z ${cur} ]]; then
                toks=( $(compgen -W "${opts}" -- ${cur}) )
            else
                toks=( $(compgen -f ${cur} | sed -e 's/$/ /') )
            fi
        fi
    else
        toks=( $(compgen -f ${cur} | sed -e 's/$/ /') )
    fi

    COMPREPLY=( "${toks[@]}" )
}

complete -F _vim -o nospace vim

任何关于如何让它在文件名完成后添加空格的想法,但不是在前缀完成后添加空格,将不胜感激。

4

1 回答 1

0

添加的尾随空格sed正在被删除。试试这个:

saveIFS=$IFS
IFS=$'\n'    # this will allow filenames with spaces (but not filenames with newlines)
toks=( $(compgen -f -- "${cur}" ))    # the -- protects against filenames that start with a hyphen
toks=("${toks[@]/%/ }")    # add a trailing space to each element
IFS=$saveIFS
于 2010-07-13T17:08:19.367 回答