Написание собственного правила завершения bash - PullRequest
3 голосов
/ 13 июля 2010

У меня есть каталоги, полные файлов с тем же префиксом, который я хочу быстро открыть в 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

Буду очень признателен за любые идеи о том, как заставить его добавить пробел после завершения имени файла, но не после завершения префикса.

1 Ответ

0 голосов
/ 13 июля 2010

Конечный пробел, который добавляет 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
...