Skip to content

fish as the interactive shell (sibling to the zsh-migration spike) [find-inspiration:fish-migration] #29

Description

@nonrational

Kind: foundation
Effort: L · Risk: high
Source: samandmoore/dotfiles (run 2026-08-19)
Decision: spike

Problem

Bash gives weak out-of-the-box interactive ergonomics: no autosuggestions, no syntax highlighting, completions only where someone wrote them.

Current state (this repo)

bash-first by design (Homebrew bash via chsh). ~257 lines across .bashrc/.bashrc.Darwin/.bashrc.Linux/.bashrc.nyx/.bash_profile/.profile, a .bash_completion.d tree, ~90 lines of secondary zsh, and 11 bash scripts in bin.Darwin. .githelpers is bash functions sourced by git aliases.

Their approach

config/fish (~169 lines: config.fish, conf.d/exports.fish, conf.d/aliases.fish, functions/, completions/) alongside a maintained bash and zsh, with ~/.config/fish/local.fish as the untracked escape hatch. starship supplies the prompt across all three, so the prompt is not shell-specific.

Difference that matters

fish gets autosuggestions, syntax highlighting, and generated completions with zero plugin management, where zsh needs a framework or hand-wired plugins. The price is non-POSIX syntax: the rc files cannot be shared, and every conditional and function in the existing 257 lines is a rewrite, not a port. Their setup sidesteps this by maintaining all three shells in parallel rather than migrating.

Translation into this repo

home/.config/fish/ plus manifest entries; the OS/host branching would move from .bashrc./.bashrc. filename suffixes to conf.d/ files. The tmux auto-attach block at the end of .bashrc.Darwin and its guards (CLAUDECODE/AI_AGENT markers, TERM_PROGRAM allowlist) would need a fish equivalent. Scripts and git aliases stay bash regardless.

Pilot slice

Install fish and run it as a non-login shell for a week without chsh, porting only exports and aliases. Nothing in the repo changes until the week is up.

Spike question

Do fish's out-of-the-box interactive ergonomics beat zsh-plus-plugins or ble.sh-on-bash by enough to justify a non-POSIX rc language, given ~257 lines of bash rc that cannot be ported mechanically and a bash-first deploy? Compare all three against the same concrete list of daily interactions, and decide against zsh-migration (#9) rather than in isolation.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    find-inspirationIdea triaged via the find-inspiration skillspikeDecided: research spike before adopting

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions