Можно ли использовать скрипт завершения вкладки Bash в zsh?
У меня есть bash tab-скрипт завершения для Hadoop Apache. Обычно я использую zsh в качестве своей повседневной оболочки. Это, как правило, довольно bash-like, когда мне это нужно, но похоже, что системы завершения вкладок радикально отличаются между ними. Есть ли простой способ "конвертировать" существующие определения bash-tab-completion для работы в zsh? Я не хочу тратить кучу времени на это, но если это легко, я бы сэкономил умеренное количество усилий.
5 ответов:
с на этой странице (от 2010/01/05):
Zsh может обрабатывать функции завершения bash. Последняя версия разработки zsh имеет функцию bashcompinit,которая при запуске позволит zsh читать спецификации и функции завершения bash. Это описано в справочной странице zshcompsys. Чтобы использовать его все, что вам нужно сделать, это запустить bashcompinit в любое время после compinit. Он определит полные и compgen функции, соответствующие bash встроенный.
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использование:
compdefcompaddмой пример:
# 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