У меня есть bash -tab-completion script. Есть простой способ использовать его из zsh?

У меня есть bash -tab-completion script для Apache Hadoop. Обычно я использую zsh как свою повседневную оболочку. Он имеет тенденцию быть симпатичным bash -like, когда мне это нужно, но похоже, что системы завершения табуляции радикально различаются между ними. Есть ли простой способ "преобразовать" существующие определения bash -tab-завершения для работы в zsh? Я не хочу вкладывать в это много времени, но если это будет легко, я бы сэкономил умеренные усилия.

Ответ 1

От эта страница (от 2010/01/05):

Zsh может обрабатывать функции завершения bash. В последней версии zsh есть функция bashcompinit, которая при запуске позволит zsh читать спецификации и функции завершения работы bash. Это описано в man-странице zshcompsys. Чтобы использовать его все, что вам нужно сделать, запустите bashcompinit в любое время после compinit. Он будет определять полные и compgen-функции, соответствующие встроенным bash.

Ответ 2

autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file

Ответ 3

autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/your/bash_completion_script

Я запускаю zsh zsh 5.0.2 (x86_64-apple-darwin13.0) без каких-либо ~/.zshrc, и вышеприведенная последовательность работает в недавно созданной оболочке zsh.

Благодаря git -completion.bash script для подсказки: D


Для более подробной информации о трех строках:

Bash имеет потрясающую встроенную поддержку автозаполнения, но сценарии autocomplete bash не работают напрямую zsh, поскольку среда zsh не имеет необходимых вспомогательных вспомогательных функций bash, таких как compgen, complete. Он делает это, чтобы ускорить zsh-сессию.

В эти дни zsh поставляется с соответствующими скриптами завершения, такими как compinit и bashcompinit, которые имеют необходимые функции для поддержки сценариев autocomplete bash.

autoload <func_name>: Обратите внимание, что автозагрузка определена в zsh, а не bash. autoload ищет файл, названный в пути каталога, возвращаемый командой fpath, и отмечает функцию, загружающую ее при первом вызове.

  • -U: Игнорировать любые псевдонимы при загрузке функции, такой как compinit или bashcompinit
  • + X: Просто загрузите именованную функцию теперь и не выполняйте ее

Например, в моей системе echo $fpath возвращается /usr/share/zsh/site-functions и /usr/share/zsh/5.0.5/functions, и оба compinit и bashcompinit доступны в /usr/share/zsh/5.0.5/functions.

Также для большинства людей может быть только autoload -U +X bashcompinit && bashcompinit, потому что какой-то другой script как git автозаполнение или их собственный ~/.zshrc может выполнять autoload -U +X compinit && compinit, но безопасно просто запустить оба из них.

Ответ 4

Для zsh используйте:

  • compdef
  • compadd

Мой пример:

# bash completion for bxrun (/home/ecuomo/projects/bashx/bxrun)
_bxrun_methods() {
    grep "^\s*\(function\s\+\)\?__.\+()\s*{.*$" "${1}" | while read line ; do
        echo "$line" | sed "s/()\s*{.*//g" | sed "s/\s*\(function\s\+\)\?__//g"
    done
}
_bxrun_lst() {
    if [ -d "/home/ecuomo/projects/bashx/src/actions" ]; then
        for f in /home/ecuomo/projects/bashx/src/actions/* ; do
            if [ -f "${f}" ]; then
                basename "${f}" | sed 's/\..*$//g'
            fi
        done
    fi
    _bxrun_methods "/home/ecuomo/projects/bashx/bxrun"
    _bxrun_methods "/home/ecuomo/projects/bashx/src/bashx.sh"
}
_bxrun() {
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $( compgen -W '$( _bxrun_lst )' -- $cur  ) )
}
_bxrun_zsh() {
    compadd `_bxrun_lst`
}
if type complete >/dev/null 2>/dev/null; then
    # bash
    complete -F _bxrun bxrun
else if type compdef >/dev/null 2>/dev/null; then
    # zsh
    compdef _bxrun_zsh bxrun
fi; fi

Источник: Мой код https://github.com/reduardo7/bashx