Remote and automated environments#

conda-completion works in terminals that load the startup file containing its hook. IDE integrated terminals, remote sessions, and containers all follow the same rule: install the hook where that shell session actually starts.

IDE terminals#

VS Code, Cursor, Windsurf, Positron#

VS Code and related editors usually start the integrated terminal with your configured shell. If that shell reads the startup file where conda completion install wrote its hook, completions are available in the integrated terminal.

For Remote SSH and WSL, the hook needs to be installed on the remote machine or inside WSL, not on the local host:

# on the remote machine or inside WSL
conda completion install

JetBrains (PyCharm, IntelliJ, etc.)#

The terminal tool window sources your shell profile. Completions work if the hook is installed for the shell JetBrains runs (check Settings > Tools > Terminal > Shell path).

For Remote Development via Gateway, install the hook on the remote host.

Zed#

Zed’s terminal panel uses your configured shell. Completions are available when that shell reads the startup file containing the hook.

Neovim#

Terminal buffers (:terminal) run your shell with its profile. Completions work if the hook is installed for that shell.

JupyterLab#

The JupyterLab terminal runs your default shell. If the hook is installed, completions work in the terminal panel. Note that JupyterLab notebook cells (!conda install ...) do not go through shell completion.

Common pitfall#

Some terminal configurations skip the full profile (for example, non-login shells or custom shell paths). If completions work in a standalone terminal but not in your IDE, check that the IDE’s terminal loads the file where the hook was installed. Run conda completion status inside the IDE terminal to confirm the manifest and binary come from the environment you expect.

Containers#

Docker#

For images used for interactive development (dev containers, JupyterHub), generate the manifest at build time:

FROM continuumio/miniconda3:latest

RUN conda install -y -c conda-forge conda-completion && \
    conda completion install bash --yes && \
    conda clean -afy

--yes skips the interactive confirmation prompt.

For faster image builds that do not need package name or version completion, add --no-repodata to the install command.

If the container switches from root to a non-root user, run the install step as the final user or regenerate after switching users. The manifest lives in the current user’s cache directory.

Dev containers (VS Code / GitHub Codespaces)#

Add completion setup to postCreateCommand:

{
  "postCreateCommand": "conda completion install bash --yes"
}

Or in the Dockerfile used by the dev container:

RUN conda install -y -c conda-forge conda-completion && \
    conda completion install bash --yes

JetBrains dev containers#

JetBrains Gateway supports dev containers through the Dev Containers plugin. The same postCreateCommand approach works. Make sure the shell path in the container matches the shell you installed the hook for.

Gitpod#

Add completion setup to .gitpod.yml:

tasks:
  - init: conda completion install bash --yes

Or include it in the Dockerfile referenced by your Gitpod config.

DevPod#

DevPod uses the dev container spec, so the postCreateCommand approach from the VS Code section above works directly.

CI#

GitHub Actions#

To test that completions work after a plugin release:

- uses: prefix-dev/setup-pixi@v0.9.6
  with:
    environments: test

- name: Generate and verify completions
  run: |
    pixi run -e test -- conda completion generate
    pixi run -e test -- conda completion status

Caching the manifest#

- uses: actions/cache@v4
  with:
    path: ~/.cache/conda/completion
    key: conda-completion-${{ runner.os }}

After conda install, conda remove, or conda update, the manifest is regenerated when registered conda entry point names changed, so a simple OS-based cache key is usually enough. If a job updates a plugin without changing its entry point name, run conda completion generate before testing completions.

This cache directory also contains versions.index and versions.store when package metadata has been generated.

For jobs that only validate plugin command metadata, prefer:

- name: Generate command completions
  run: conda completion generate --no-repodata

This avoids network-dependent repodata reads.

Non-interactive environments#

generate and status work without a TTY. install and uninstall require --yes when no TTY is available.

See Use completion offline or on restricted networks for private mirrors, air-gapped setups, and restricted network behavior.