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