Можно ли использовать скрипт завершения табуляции Bash в zsh? - PullRequest
72 голосов
/ 14 июля 2010

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

Ответы [ 5 ]

133 голосов
/ 13 декабря 2011
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
33 голосов
/ 15 июля 2010

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

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

31 голосов
/ 09 января 2015
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-complete.bash для подсказки: D


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

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

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

2 голосов
/ 20 января 2018

Я использую Antigen в качестве менеджера плагинов 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

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

Повторный вызов compinit и bashcompinit создает второй .zcompdump со значением $HOME/.zcompdump

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

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

Версии, использованные на момент написания:

Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3
2 голосов
/ 08 января 2016

Для 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

...