Можно ли использовать скрипт завершения вкладки Bash в zsh?



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

632   5  

5 ответов:

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

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

autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
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-завершению.bash скрипт для подсказки: D


читать-на более подробные сведения о выше 3 строки:

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

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

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

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

например, в моей системе 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 требуется, потому что какой-то другой скрипт, как git автозаполнение или их собственный ~/.zshrc можно делать autoload -U +X compinit && compinit, но это безопасно, чтобы просто запустить их обоих.

на zsh использование:

  • compdef
  • compadd

мой пример:

# bash completion for bxrun (/home/ecuomo/projects/bashx/bxrun)
_bxrun_methods() {
    grep "^\s*\(function\s\+\)\?__.\+()\s*{.*$" "" | 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

Я антиген как менеджер плагинов Oh-My-Zsh. У меня было несколько сценариев завершения bash, написанных коллегами, которые я хотел загрузить в Zsh с помощью простого source /path/to/completion.

у меня были некоторые проблемы, потому что кажется, что либо Antigen, либо OMZ (трудно сказать) заботятся только о загрузке сценариев завершения из своих плагинов. Я, наконец, обошел это с помощью автозапуска bashcompinitиcompinit после antigen apply. Просто автозапуск bashcompinit не достаточно.

source ~/.antigen/antigen.zsh
antigen use oh-my-zsh
antigen apply

autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit

source /path/to/bash_completion

антиген создает его на $ANTIGEN_COMPDUMP который для меня был ~/.antigen/.zcompdump

повторный вызов compinit и bashcompinit создать второй .zcompdump at $HOME/.zcompdump

это кажется чтобы все работали, потому что я могу использовать завершения, настроенные /path/to/bash_completion. Я удалил оба .файлы zcompdump несколько раз, чтобы убедиться, что они регенерированы и, похоже, работают.

Я должен был rm .zcompdump файлы несколько раз после перезагрузки машины из-за ошибок, возникших при попытке завершить вкладку, но я не уверен, что это связано с этой настройкой или чем-то еще. rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP и новая оболочка исправляет это для меня.

версии на момент написания статьи:

Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3

Comments

    Ничего не найдено.