• Stars
    star
    7,560
  • Rank 5,090 (Top 0.2 %)
  • Language
    Shell
  • License
    MIT License
  • Created about 9 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A plugin manager for Fish

Fisher

A plugin manager for Fishโ€”your friendly interactive shell. Snag fresh plugins!

Take control of functions, completions, bindings, and snippets from the command line. Unleash your shell's true potential, perfect your prompt, and craft repeatable configurations across different systems effortlessly. Fisher's zero impact on shell startup keeps your shell zippy and responsive. No gimmicks, just smooth sailing!

  • Fisher is 100% pure-Fish, making it easy to contribute or modify
  • Scorching fast concurrent plugin downloads that'll make you question reality
  • Zero configuration neededโ€”we're not kidding!
  • Oh My Fish! plugins supported too

โ˜๏ธ Upgrading from Fisher 3.x or older? Strap in and read this!

Installation

curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

Quickstart

Fisher lets you install, update, and remove plugins like a boss. Revel in Fish's tab completion and rich syntax highlighting while you're at it.

Installing plugins

To install plugins, use the install command and point it to the GitHub repository.

fisher install jorgebucaran/nvm.fish

Wanna install from GitLab? No problemoโ€”just prepend gitlab.com/ to the plugin path.

You can also snag a specific version of a plugin by adding an @ symbol after the plugin name, followed by a tag, branch, or commit.

fisher install IlanCosman/tide@v5

And hey, you can install plugins from a local directory too!

fisher install ~/path/to/plugin

Heads up! Fisher expands plugins into your Fish configuration directory by default, overwriting existing files. If that's not your jam, set $fisher_path to your preferred location and put it in your function path (#640).

Listing plugins

Use the list command to see all your shiny installed plugins.

$ fisher list
jorgebucaran/fisher
ilancosman/tide@v5
jorgebucaran/nvm.fish
/home/jb/path/to/plugin

The list command also plays nice with regular expressions for filtering the output.

$ fisher list \^/
/home/jb/path/to/plugin

Updating plugins

update command to the rescue! It updates one or more plugins to their latest and greatest version.

fisher update jorgebucaran/fisher

Just type fisher update to update everything in one fell swoop.

Removing plugins

Say goodbye to installed plugins with the remove command.

fisher remove jorgebucaran/nvm.fish

Feeling destructive? Wipe out everything, including Fisher itself.

fisher list | fisher remove

Using your fish_plugins file

Whenever you install or remove a plugin from the command line, Fisher jots down all the installed plugins in $__fish_config_dir/fish_plugins. Add this file to your dotfiles or version control to easily share your configuration across different systems.

You can also edit this file and run fisher update to commit changes like a pro:

$EDITOR $__fish_config_dir/fish_plugins
jorgebucaran/fisher
ilancosman/tide@v5
jorgebucaran/nvm.fish
+ PatrickF1/fzf.fish
- /home/jb/path/to/plugin
fisher update

This will install PatrickF1/fzf.fish, remove /home/jb/path/to/plugin, and update everything else.

Creating a plugin

Plugins can include any number of files in functions, conf.d, and completions directories. Most plugins are just a single function or a configuration snippet. Behold the anatomy of a typical plugin:

flipper
โ”œโ”€โ”€ completions
โ”‚   โ””โ”€โ”€ flipper.fish
โ”œโ”€โ”€ conf.d
โ”‚   โ””โ”€โ”€ flipper.fish
โ””โ”€โ”€ functions
    โ””โ”€โ”€ flipper.fish

Non .fish files and directories inside these locations will be copied to $fisher_path under functions, conf.d, or completions respectively.

Event system

Fish events notify plugins when they're being installed, updated, or removed.

Keep in mind, --on-event functions must be loaded when their event is emitted. So, place your event handlers in the conf.d directory.

# Defined in flipper/conf.d/flipper.fish

function _flipper_install --on-event flipper_install
    # Set universal variables, create bindings, and other initialization logic.
end

function _flipper_update --on-event flipper_update
    # Migrate resources, print warnings, and other update logic.
end

function _flipper_uninstall --on-event flipper_uninstall
    # Erase "private" functions, variables, bindings, and other uninstall logic.
end

Creating a theme

A theme is like any other Fish plugin, but with a .theme file in the themes directory. Themes were introduced in Fish 3.4 and work with the fish_config builtin. A theme can also have files in functions, conf.d, or completions if necessary. Check out what a typical theme plugin looks like:

gills
โ”œโ”€โ”€ conf.d
โ”‚   โ””โ”€โ”€ gills.fish
โ””โ”€โ”€ themes
    โ””โ”€โ”€ gills.theme

Using $fisher_path with themes

If you customize $fisher_path to use a directory other than $__fish_config_dir, your themes won't be available via fish_config. That's because Fish expects your themes to be in $__fish_config_dir/themes, not $fisher_path/themes. This isn't configurable in Fish yet, but there's a request to add that feature.

Fear not! You can easily solve this by symlinking Fisher's themes directory into your Fish config. First, backup any existing themes directory.

mv $__fish_config_dir/themes $__fish_config_dir/themes.bak

Next, create a symlink for Fisher's themes directory.

ln -s $fisher_path/themes $__fish_config_dir/themes

Want to use theme plugins and maintain your own local themes? You can do that too (#708).

Discoverability

While Fisher doesn't rely on a central plugin repository, discovering new plugins doesn't have to feel like navigating uncharted waters. To boost your plugin's visibility and make it easier for users to find, add relevant topics to your repository using fish-plugin. By doing so, you're not only contributing to the Fisher community but also enabling users to explore new plugins and enhance their Fish shell experience. Don't let plugin discovery be a fishy business, tag your plugins today!

Acknowledgments

Fisher started its journey in 2016 by @jorgebucaran as a shell configuration manager for Fish. Along the way, many helped shape it into what it is today. Oh My Fish paved the way as the first popular Fish framework. @jethrokuan provided crucial support during the early years. @PatrickF1's candid feedback proved invaluable time and again. Bootstrapping Fisher was originally @IlanCosman's brilliant idea. Thank you to all our contributors! <3

License

MIT

More Repositories

1

hyperapp

1kB-ish JavaScript framework for building hypertext applications
JavaScript
19,043
star
2

awsm.fish

A curation of prompts, plugins & other Fish treasures ๐Ÿš๐Ÿ’Ž
4,066
star
3

nvm.fish

The Node.js version manager you'll adore, crafted just for Fish
Shell
2,033
star
4

cookbook.fish

From Shell to Plate: Savor the Zest of Fish ๐Ÿฆž
2,002
star
5

colorette

๐ŸŒˆEasily set your terminal text color & styles
JavaScript
1,595
star
6

superfine

Absolutely minimal view layer for building web interfaces
JavaScript
1,564
star
7

classcat

Build a class attribute string quickly
JavaScript
905
star
8

getopts

Node.js CLI options parser
JavaScript
633
star
9

hydro

Ultra-pure, lag-free prompt with async Git statusโ€”just for Fish
Shell
609
star
10

hyperawesome

A curated list of awesome projects built with Hyperapp + more
492
star
11

replay.fish

Run Bash commands, replay changes in Fish ๐Ÿค
Shell
392
star
12

twist

Declarative JavaScript Testing
JavaScript
378
star
13

autopair.fish

Auto-complete matching pairs in the Fish command line
Shell
369
star
14

fishtape

100% pure-Fish test runner
Shell
345
star
15

spark.fish

โ–โ–‚โ–„โ–†โ–‡โ–ˆโ–‡โ–†โ–„โ–‚โ–
Shell
335
star
16

hyperapp-router

Declarative routing for Hyperapp V1 using the History API.
JavaScript
257
star
17

getopts.fish

Parse CLI options in Fish
Shell
220
star
18

gitio.fish

Create a custom git.io URL
Shell
88
star
19

hyperapp-html

Html helper functions for Hyperapp V1
JavaScript
81
star
20

pyenv

Pyenv support plugin for fish-shell
Shell
62
star
21

humantime.fish

Turn milliseconds into a human-readable string in Fish
Shell
21
star
22

.github

My health files
1
star
23

jorgebucaran.github.io

HTML
1
star