# FISH The friendly interactive shell. 1. [TL;DR](#tldr) 1. [Configuration](#configuration) 1. [Prompt](#prompt) 1. [Key bindings](#key-bindings) 1. [Further readings](#further-readings) 1. [Sources](#sources) ## TL;DR ```sh # Install the shell. apt install 'fish' brew install 'fish' zypper install 'fish' # Start `fish` sessions. fish fish -Pil # Set variables. set 'MyVAR' 'someValue' set -x 'MyExportedVAR' 'someValue' # Unset variables. set -e 'MyVAR' # Change one's default shell to `fish`. chsh -s (which fish) # from `fish` chsh -s "$(which fish)" # from `{ba,z}sh` # Open the web-based configuration interface. fish_config fish_config browse # Process substitution. # What in BASH or ZSH would be `<(echo …)`. diff -y -W 200 \ (aws … --output 'json' | psub) \ (aws … --output 'json' | psub) # Math. math 2 '+' 6 time pulumi pre --parallel (math 2 '*' (nproc)) # Array manipulation. echo (seq 10)[-1..1] # -> 10 9 8 7 6 5 4 3 2 1 set array "$array appended_element" # Define CLI options. # Use all lines. set -l opts set opts $opts (fish_opt -s 'c' -l 'command' --required-val) set opts $opts (fish_opt -s 'p' -l 'path' --multiple-vals) argparse $opts -- $argv or return echo $_flag_command echo $_flag_path echo $argv # Switch. switch $animal case cat echo evil case wolf dog human moose dolphin whale echo mammal case duck goose albatross echo bird case shark trout stingray echo fish case '*' echo I have no idea what a $animal is end ``` For functions defined in files in `~/.config/fish/functions/` to be automatically available, the files need to: - Host **a single** function each. - Be named as the function they host. ## Configuration Shell configuration file: `~/.config/fish/config.fish`.
`.fish` scripts in `~/.config/fish/conf.d/` are automatically executed **before** `config.fish`. Configuration files are read at startup of every session, whether the shell is interactive and/or login.
Use `status --is-interactive` and `status --is-login` to discriminate between interactive/login shells, respectively: ```sh if status --is-login fish_add_path ~/bin end ``` `fish` offers a web-based configuration interface. Open it executing `fish_config`. ## Prompt See [Starship] or [Tide]. ## Key bindings ```sh # Show all active key bindings. bind ``` | Key combination | Binding name | Effect | | --------------- | ------------------------------ | ----------------------------------------------------------------- | | `CTRL` + `k` | `kill-line` | Delete text from the cursor position to the end of the line | | `CTRL` + `e` | `end-of-line` | Move the cursor to the end of the line | | `CTRL` + `w` | `backward-kill-path-component` | Delete previous word | | `CTRL` + `u` | `backward-kill-line` | Delete text from the beginning of the line to the cursor position | | `CTRL` + `l` | `clear-screen` | Clear screen | ## Further readings - [Website] - [`bash`][bash] - [`zsh`][zsh] - [Fish shell cheatsheet] Prompts: - [Starship] (prompt) - [Tide] (prompt) Frameworks: - [Oh My Fish][oh-my-fish] ## Sources All the references in the [further readings] section, plus the following: - [Documentation] - [Github] - [Brace expansion with range in fish shell] [further readings]: #further-readings [bash]: bash.md [oh-my-fish]: https://github.com/oh-my-fish/oh-my-fish [starship]: starship.md [zsh]: zsh.md [documentation]: https://fishshell.com/docs/current/ [github]: https://github.com/fish-shell/fish-shell [website]: https://fishshell.com/ [brace expansion with range in fish shell]: https://stackoverflow.com/questions/20770836/brace-expansion-with-range-in-fish-shell [fish shell cheatsheet]: https://devhints.io/fish-shell [tide]: https://github.com/IlanCosman/tide