##################
 Shell completions
##################

Enable tab completion for pipx and for the apps it installs.

***********************
 Enable pipx completion
***********************

Print the instructions for your shell and follow them:

.. code-block:: console

    $ pipx completions

*******************************
 Completions for installed apps
*******************************

A package can ship the completion script for its own command, the way it ships a man page. pipx links that script out
of the environment it installed into, so the completions arrive with the package and leave with it.

pipx picks up the three directories a wheel installs completion scripts into and links each under
``PIPX_COMPLETION_DIR`` (default ``~/.local/share``):

.. list-table::
    :header-rows: 1
    :widths: 34 44 22

    - - Shipped by the package
      - Linked to
      - Loaded by
    - - ``share/bash-completion/completions/``
      - ``~/.local/share/bash-completion/completions/``
      - bash, on its own
    - - ``share/fish/vendor_completions.d/``
      - ``~/.local/share/fish/vendor_completions.d/``
      - fish, on its own
    - - ``share/zsh/site-functions/``
      - ``~/.local/share/zsh/site-functions/``
      - zsh, once you say so

bash and fish read their directories without further help. zsh needs the directory on its ``fpath``, so add this to
``~/.zshrc`` ahead of the call to ``compinit``:

.. code-block:: bash

    fpath+=("$(pipx environment --value PIPX_COMPLETION_DIR)/zsh/site-functions")

``pipx uninstall`` takes the links away, and ``pipx unexpose`` removes them while leaving the package in place (see
:doc:`expose-apps`).

***********************************
 Ship completions from your package
***********************************

Install completion scripts through your build backend's data files. With `setuptools
<https://setuptools.pypa.io/>`__:

.. code-block:: python

    setup(
        name="your-tool",
        data_files=[
            ("share/bash-completion/completions", ["completions/your-tool"]),
            ("share/zsh/site-functions", ["completions/_your-tool"]),
            ("share/fish/vendor_completions.d", ["completions/your-tool.fish"]),
        ],
    )

**********
 Verify it
**********

Open a new shell and press ``Tab`` after typing ``pipx``. The subcommands complete when the setup took effect.
