3

同じプレフィックスを持つファイルでいっぱいのディレクトリがあり、vimですばやく開くことができます。たとえば、次のような場合があります。

$ ls *
bar:
bar_10  bar_20  bar_30

foo:
foo_10  foo_20  foo_30

私が望むのは、これらのディレクトリのいずれかにいて、次のように入力できるようにすることです。

$ vim <TAB>

そして、次のようにオートコンプリートします。

$ vim bar_

これを達成するために、「bar_」を含む「.completion」という名前のディレクトリごとのファイルを用意できてうれしく思います。

私が抱えている問題は、次の動作が必要なことです。

  * "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 に答える