Fisher
A plugin manager for Fish—the friendly interactive shell. Looking for plugins?
Manage functions, completions, bindings, and snippets from the command line. Extend your shell capabilities, change the look of your prompt and create repeatable configurations across different systems effortlessly.
- 100% pure-Fish—easy to contribute to or modify.
- Blazing fast concurrent plugin downloads.
- Zero configuration out of the box.
- Oh My Fish! plugin support.
☝️ Upgrading from Fisher3.xor older?
Installation
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisherQuickstart
You can install, update, and remove plugins interactively with Fisher, taking advantage of Fish tab completion and rich syntax highlighting.
Installing plugins
Install plugins using the install command followed by the path to the repository on GitHub.
fisher install jorgebucaran/nvm.fishTo install from GitLab prepend
gitlab.com/to the plugin path.
To get a specific version of a plugin add an @ symbol after the plugin name followed by a tag, branch, or commit.
fisher install IlanCosman/tide@v5You can install plugins from a local directory too.
fisher install ~/path/to/pluginFisher expands plugins into your Fish configuration directory by default, overwriting existing files. If you wish to change this behavior, set
$fisher_pathto your preferred location and put it in your function path (#640).
Listing plugins
List all the plugins that are currently installed using the list command.
$ fisher list
jorgebucaran/fisher
ilancosman/tide@v5
jorgebucaran/nvm.fish
/home/jb/path/to/pluginThe list command also accepts a regular expression to filter the output.
$ fisher list \^/
/home/jb/path/to/pluginUpdating plugins
The update command updates one or more plugins to their latest version.
fisher update jorgebucaran/fisherUse just
fisher updateto update everything.
Removing plugins
Remove installed plugins using the remove command.
fisher remove jorgebucaran/nvm.fishYou may want to remove everything, including Fisher.
fisher list | fisher removeUsing your fish_plugins file
Whenever you install or remove a plugin from the command line, Fisher will write down all the installed plugins to $__fish_config_dir/fish_plugins. Adding this file to your dotfiles or version control is the easiest way to share your configuration across different systems.
You can also edit this file and run fisher update to commit changes:
nano $__fish_config_dir/fish_pluginsjorgebucaran/fisher
ilancosman/tide@v5
jorgebucaran/nvm.fish
+ PatrickF1/fzf.fish
- /home/jb/path/to/pluginfisher updateThat will install PatrickF1/fzf.fish, remove /home/jb/path/to/plugin, and update everything else.
Creating a plugin
A plugin can be any number of files in a functions, conf.d, and completions directory. Most plugins consist of a single function, or configuration snippet. This is what a typical plugin looks like.
ponyo
├── completions
│ └── ponyo.fish
├── conf.d
│ └── ponyo.fish
└── functions
└── ponyo.fish
Non .fish files as well as directories inside those locations will be copied to $fisher_path under functions, conf.d, or completions respectively.
Event system
Plugins are notified as they are being installed, updated, or removed via Fish events.
--on-eventfunctions must already be loaded when their event is emitted. Thus, you should put your event handlers in theconf.ddirectory.
# Defined in ponyo/conf.d/ponyo.fish
function _ponyo_install --on-event ponyo_install
# Set universal variables, create bindings, and other initialization logic.
end
function _ponyo_update --on-event ponyo_update
# Migrate resources, print warnings, and other update logic.
end
function _ponyo_uninstall --on-event ponyo_uninstall
# Erase "private" functions, variables, bindings, and other uninstall logic.
endDiscoverability
Fisher doesn't make use of a central repository of plugins. However, that doesn't mean discovering new plugins should be hard. A great way to help people quickly find your project on GitHub is by adding a topic to your repository. We recommend using fish-plugin for this purpose.
Acknowledgments
Fisher started out in 2016 by @jorgebucaran as a shell configuration manager for Fish. We had a lot of help along the way. Oh My Fish laid the groundwork as the first popular Fish framework. @jethrokuan was particularly helpful during the first years. @PatrickF1's candid feedback has been invaluable time and again. Bootstrapping Fisher was originally @IlanCosman's idea. Thank you to all our contributors! <3