#!/bin/sh # Generate shell completions for various tools into the XDG data directories, # so that they are loaded lazily instead of `eval`ed on every shell start # # Run this after installing or updating any of the tools below set -eu XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}" # also set in ~/.config/shell/env XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}" # also set in ~/.config/shell/env BASH_DIR="$XDG_DATA_HOME/bash-completion/completions" ZSH_DIR="$XDG_DATA_HOME/zsh/completions" QUIET="${QUIET:-}" rm -rf "$BASH_DIR" "$ZSH_DIR" mkdir -p "$BASH_DIR" "$ZSH_DIR" _command_exists() { command -v "$1" 1>/dev/null 2>&1 } # Write to a temporary file first, # so that a failing tool does not leave a truncated completion file _generate() { _name="$1" _target="$2" shift 2 if "$@" > "$_target.tmp" 2>/dev/null && [ -s "$_target.tmp" ]; then mv "$_target.tmp" "$_target" echo " $_name" else rm -f "$_target.tmp" echo " $_name => FAILED" >&2 fi } echo "Generating bash completions in: $BASH_DIR" _command_exists pip \ && _generate pip "$BASH_DIR/pip" pip completion --bash _command_exists register-python-argcomplete \ && _command_exists pipx \ && _generate pipx "$BASH_DIR/pipx" register-python-argcomplete pipx _command_exists poetry \ && _generate poetry "$BASH_DIR/poetry" poetry completions bash echo "Generating zsh completions in: $ZSH_DIR" _strip_leading_blanks() { "$@" | sed '/./,$!d'; } _pip_zsh() { pip completion --zsh | sed -n '/^#compdef/,$p' } _pipx_zsh() { _strip_leading_blanks register-python-argcomplete --shell zsh pipx } _poetry_zsh() { _strip_leading_blanks poetry completions zsh } _command_exists pip \ && _generate pip "$ZSH_DIR/_pip" _pip_zsh _command_exists register-python-argcomplete \ && _command_exists pipx \ && _generate pipx "$ZSH_DIR/_pipx" _pipx_zsh _command_exists poetry \ && _generate poetry "$ZSH_DIR/_poetry" _poetry_zsh rm -f "$XDG_STATE_HOME/zsh/zcompdump"* if [ -z "$QUIET" ]; then echo "" echo "Reload your shell to use them:" echo " exec \$SHELL -l" echo "" fi