Fisher
Plugin manager for the Fish shell.
Official WebsiteFeatures
Why use Fisher?
Lightweight
Fisher is minimal and fast, with no dependencies. Written in Fish itself for native performance.
Easy Installation
Simple curl-based installation. Download and install plugins from GitHub with one command.
Concurrent Operations
Install, update, and remove plugins concurrently for faster operations.
Event-Driven
Emit and listen to events for advanced plugin customization and lifecycle management.
Installation
Fisher is installed via a simple curl command. Make sure Fish shell is already installed on your system.
# Install Fisher
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisherFor Fish shell installation, use:
# macOS (Homebrew)
brew install fish
# Ubuntu/Debian
apt install fish
# Fedora/RHEL
dnf install fish
# Arch Linux
pacman -S fishBasic Usage
After installing Fisher, you can easily install and manage plugins:
Installing Plugins
# Install a plugin from GitHub
fisher install oh-my-fish/plugin-git
# Install multiple plugins at once
fisher install jethrokuan/z edc/bass omf/plugin-sudoedit
# Install from a URL
fisher install https://github.com/user/plugin
# Install from a local file
fisher install ~/my-pluginCommon Plugins
# Popular plugins for Fish
fisher install jethrokuan/z # Jump to recent directories
fisher install pure-fish/pure # Minimal prompt
fisher install oh-my-fish/plugin-git # Git shortcuts
fisher install PatrickF1/fzf.fish # Fuzzy finder integration
fisher install IlanCosman/tide # Modern prompt
fisher install franciscolourenco/done # Notifications when commands finishConfiguration
Fisher uses Fish configuration files. Plugins are typically configured in ~/.config/fish/config.fish or ~/.config/fish/conf.d/.
Basic Setup
# Switch to Fish shell
fish
# List installed plugins
fisher list
# Update a specific plugin
fisher update plugin-name
# Update all plugins
fisher update
# Remove a plugin
fisher remove plugin-name
# Show help
fisher --helpExample Configuration
# Install plugins
fisher install jethrokuan/z
fisher install IlanCosman/tide
fisher install oh-my-fish/plugin-git
fisher install PatrickF1/fzf.fish
fisher install franciscolourenco/done
# Configure environment
set -x EDITOR vim
set -x LANG en_US.UTF-8
# Set up tide prompt
# tide configure will open an interactive prompt
# Configure fzf.fish
set fzf_preview_dir_cmd exa --all --color=always
# Create aliases
alias ll='ls -lah'
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
# Add custom key bindings
bind -e cT # Remove existing binding
bind cT 'fzf'Using config.fish vs conf.d
# ~/.config/fish/config.fish - Main config file
# Use for general settings
# ~/.config/fish/conf.d/ - Config directory
# Break down configuration into separate files for plugins
# Each file in conf.d is sourced automatically
# Example structure:
# ~/.config/fish/conf.d/
# ├── 10-env.fish # Environment variables
# ├── 20-abbr.fish # Abbreviations
# ├── 30-aliases.fish # Aliases
# └── 40-plugins.fish # Plugin configurationTips & Tricks
Web Search for Plugins
Find plugins at Fisherman (defunct) or search GitHub for "fish plugin". Check stars and recent activity.
# Search for plugins on GitHub
# Look for 'awesome-fish' to find plugin collections
# Popular sources:
# - oh-my-fish/oh-my-fish (plugin repository)
# - awesome-fish-shell
# - Individual repositories on GitHubCreating Custom Plugins
Creating a simple plugin is easy. Just create Fish functions:
# Create a simple plugin
mkdir -p ~/.config/fish/plugins/my-plugin/functions
# Create a function file
cat > ~/.config/fish/plugins/my-plugin/functions/my-command.fish << 'EOF'
function my-command --description "My custom command"
echo "Hello from my plugin!"
end
EOF
# Install the local plugin
fisher install ~/.config/fish/plugins/my-pluginEvent System
Fisher emits events when installing/removing plugins. Listen to them for custom actions:
# Listen to events
function fisher_post_install -a pkg --on-event fisher_postinstall
echo "Plugin $pkg was installed!"
end
function fisher_post_remove -a pkg --on-event fisher_postremove
echo "Plugin $pkg was removed!"
end
# Emit custom events
emit my_custom_event "some data"Performance Tips
Keep your Fish shell startup fast:
# Measure startup time
time fish -c exit
# Lazy-load expensive functions
# Only load when needed
# Use functions instead of aliases for better performance
# functions are evaluated at startup, aliases at runtime
# Break config into multiple files in conf.d/
# This makes organization cleaner
# Avoid running heavy commands in config files
# Defer to lazy-loading or use background commandsWorking with Abbreviations
Fish abbreviations are better than aliases for interactive use:
# Create abbreviations (better than aliases in Fish)
abbr --erase ll # Remove if exists
abbr -a ll 'ls -lah'
abbr -a gs 'git status'
abbr -a ga 'git add'
abbr -a gc 'git commit -m'
abbr -a gp 'git push'
abbr -a gd 'git diff'
abbr -a gl 'git log --oneline -n 10'
# Save abbreviations
set -U fish_user_abbreviations # -U saves permanentlyRelated Articles
Fish - Friendly Interactive Shell
User-friendly shell with syntax highlighting and autosuggestions out of the box
tide - Modern Fish Prompt
Modern prompt for Fish shell inspired by Powerlevel10k
Starship - Cross-Shell Prompt
Minimal, blazing-fast cross-shell prompt