Hacker News Digest

10 августа 2025 г. в 09:50 • mill-build.org • ⭐ 253 • 💬 82

OriginalHN

#bash

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