Writing simple tab-completions for Bash and Zsh
Как сделать простые таб-дополнения для Bash и Zsh
Li Haoyi, 7 августа 2025
Таб-дополнения в шелле удобны, но их настройка усложняется тем, что часть пользователей использует Bash в Linux, а другая — Zsh в macOS, и у них разные API. К тому же, пользователям полезно видеть описание каждого варианта, но это доступно только в Zsh.
В этой заметке показано, как реализовать кросс-платформенные дополнения с описаниями на примере Mill 1.0.3.
Базовый механизм
При нажатии <TAB>
шелл вызывает функцию, которой передаёт текущие слова и индекс слова под курсором. Функция возвращает список возможных дополнений.
_generate_foo_completions() {
local idx=$1; shift
local words=( "$@" )
local cur=${words[idx]}
local arr=(apple apricot banana cherry durian)
for e in "${arr[@]}"; do [[ $e == "$cur"* ]] && echo "$e"; done
}
_complete_foo_bash() {
local raw=($(_generate_foo_completions "$COMP_CWORD" "${COMP_WORDS[@]}"))
COMPREPLY=( "${raw[@]}" )
}
_complete_foo_zsh() {
local -a raw
raw=($(_generate_foo_completions "$CURRENT" "${words[@]}"))
compadd -- $raw
}
[[ -n $ZSH_VERSION ]] && { autoload -Uz compinit; compinit; compdef _complete_foo_zsh foo; } \
|| complete -F _complete_foo_bash foo
_generate_foo_completions
возвращает список вариантов._complete_foo_bash
и_complete_foo_zsh
преобразуют результат в формат нужного шелла.- Скрипт добавляется в
~/.bashrc
,~/.zshrc
и т.д.
Mill устанавливает дополнения командой:
$ ./mill mill.tabcomplete/install