Oct 21, 2018

@jorgebucaran jorgebucaran released this Oct 17, 2018 · 11 commits to master since this release

Assets 2


  • Add user key bindings autoloading for legacy fish; related to #465, jethrokuan/fzf/pull/85 c9974ef
  • Fix legacy fish instructions; improve punctuation & grammar f09cefd
  • Add more info to help command; related to #474 207ccf0
    • Command line usage help now tells you that running fisher will update installed packages
    • Running fisher also commits fishfile changes, but I couldn't fit all the words on the same line
  • Copy files from sub directories; close #468 77fc030
    • Supporting nested directories is an anti-feature
    • It exists only so that we can install certain packages that are structured that way
    • All functions will share the same scope and location
  • Normalize package id in fishfile format script 8d3e4d3

Custom key bindings

Fisher 3.1.0 has built-in support for packages that add key bindings. My original plan was to support this via a third-party package or by asking users to add some code to their config.fish file. Since custom key bindings have a complicated support story with fish, I decided to include this functionality out of the box.

Packages usually add key bindings via configuration snippets. Alas, configuration snippets are not available in legacy fish (<=2.2) and only fish 3.0 or newer can use the bind builtin on shell startup.

To be able to run code on shell startup we need to create a configuration snippet for Fisher. This file will be located in $fisher_path/conf.d/fisher.fish. We'll only create this file if a version of fish older than 3.0 is detected or if you are using a developmented / untagged release. If you upgrade to 3.0 after using an older version and we know we've created this file prior to this point, we'll remove the file as it's no longer needed.

To support packages that add key bindings, we'll make a copy of the user's fish_user_key_bindings function (if it exists) and create a new function that when called, will source every *_key_bindings.fish file inside $fisher_path/conf.d. Any key bindings defined in those files will be correctly registered at this point. When we're done, we'll run our saved copy of the user's fish_user_key_bindings to preserve any user defined key bindings in it.

Thanks 🙌

I'd like to thank the following individuals for their help in the form of bug reports, feedback and/or PRs.

In no particular order: @aquatix @externl @bbuck @norcalli @Tyilo @pablocrivella @amir20 @patrickf3139

@jorgebucaran jorgebucaran released this Oct 17, 2018 · 21 commits to master since this release

Assets 2


  • Allow self-hosted packages to be installed via ssh+git; fix #464 4d953fa
    • URL must be in the form owner@host.xz:path/to/repo
  • Improve package fetch error message da792f6
  • Use id to refer to package name specifier, not name 44ec48b
  • Improve readability of status report generator 993b471
  • Improve fishfile formatter normalize regex 32dbf14
  • Display correct time on Linux; close #463 55b543e
  • Don't strip github.com from local paths; fix #472 28aaa27
  • Replace ln with cp; don't hardlink; close #470 1d82bee
  • Mention packages can be installed from a commit-ish 56e45ef
  • Make migration guide more noticeable; #450 206ecf7

@jorgebucaran jorgebucaran released this Oct 8, 2018 · 32 commits to master since this release

Assets 2


  • Mention that packages can be installed from a commit-ish 56e45ef
  • Simplify builtin jobs parse script 2337988
  • Use $__fish_data_dir if available 2e933ca
  • Remove magic number 203e9d4

@jorgebucaran jorgebucaran released this Oct 8, 2018 · 36 commits to master since this release

Assets 2


  • Don't create new fishfile (except the first time) #460 f75de3a
  • Don't expect https:// to start lines in fishfile 4e7c9e0
  • Make trailing / optional in $fisher_config #462 2549ac1
  • Use basename to remove path refix more reliably #462 c776522
  • Remove html comment; don't use fish code block 226c0d9


Thank you, @amir20 and @arwtyxouymz for your help! 🙌

@jorgebucaran jorgebucaran released this Oct 8, 2018 · 42 commits to master since this release

Assets 2


  • Use real target if fishfile is a symbolic link #460 73505e7
  • Use string check to determine if filename is a fish file #459 2a6c36b

@jorgebucaran jorgebucaran released this Oct 8, 2018 · 45 commits to master since this release

Assets 2


  • Don't fetch a pkg you already fetched 94801fb
  • Better error msg when trying to install pkg without a prefix 3e0bca9

@jorgebucaran jorgebucaran released this Oct 8, 2018 · 48 commits to master since this release

Assets 2


  • Use perl for epoch only on FreeBSD & Darwin; fix #458 d7b9cd5
  • Copy non fish files to $fisher_path; close #456 7850f78
  • Improve commit error msg when fishfile is not empty 2ead99f
  • Dry self-uninstall; add farewell message 8f42f7a
  • Show version & help in ci 56131b6
  • Add upgrading instructions and link to migration guide; #450 ac3e05a

@jorgebucaran jorgebucaran released this Oct 6, 2018 · 55 commits to master since this release

Assets 2


  • Use raw installation URL until https://git.io/fisher is restored 61f6f8c
  • Add upgrading instructions and link to migration guide; #450 ac3e05a
  • Prevent failglob error when $fisher_config is empty; close #455 13eba77
  • Don't try to install a package from an invalid specifier; fix #454 1bd1277
  • Create fishfile automatically; close #451 444a8fe
    • Create fishfile if one doesn't already exist
    • Only read from stdin when using add or rm commands
    • Show help if unknown command is entered
    • Show error message when fishfile is empty and no packages were added, removed or updated


Thank you, @arkadyan @manuel-uberti, @onbjerg & @patrickf3139 for your help reporting bugs~! 🙌

@jorgebucaran jorgebucaran released this Oct 5, 2018 · 65 commits to master since this release

Assets 2


Fisher V3 is the continuation of and successor to Fisherman.

The new Fisher (or V3 for short) comes with extensive and comprenhensive documentation, a new polished CLI and more robust core which is 2000 lines of code fewer than its predecesor. Not everything is bells and whitles. V3 introduces breaking changes as described in the following sections. For a historical background of this work see the original V3 proposal #307 and later discussion about the future of the project #443.

The new add (previously install) and rm commands interactively update your fishfile and commit all your changes in one sweep. Unlike V2, commiting changes translate to adding new (missing) packages, updating existing packages and removing packages conflicting with the new desired configuration.

V3 fixes numerous, long-standing bugs and system decay, ensuring repeatable installations without using universal variables, hacks or relying on a complicated (and slow) dependency resolution algorithm.


  • The install command has been renamed to add

    • Installing from a gist is no longer supported (but it might be be back in a future release)
    • To install a package from a tag, branch or commit-ish you can use an @ symbol followed by the git ref; the colon : symbol has been deprecated
    • Both .fish files provided by your package will be copied to $fisher_path
      • .fish files in the top-level directory and files of any extension inside functions, completions and conf.d directories will be copied to your $fisher_path


  • The ls and rm commands are still available with a few minor differences
    • ls followed by a package name does not list specific package information (but it might be be back in a future release)
    • ls output format no longer displays a legend to indicate whether a package is a theme or a local package; now it's a flat dump of every installed package specifier
      • For local packages the full path is shown instead
      • I'm considering adding a new --tree flag in order to display packages in a tree-like format
  • ls-remote has been removed as there is no longer a preferred organization to look for packages


  • A new self-update command has been added which can be used to update Fisher itself within the same shell session
    • Fisher will be updated only if a new version is available
  • The update command has been removed; to update all your installed packages just run fisher
    • Every time you run fisher, fisher add or fisher rm, every package that is currently installed on your system is installed again from scratch and as a result there is no need to update specific packages—you're always up-to-date
      • To lock a specific package version you must use the @ symbol followed by a git tag, branch or commit-ish, e.g. mypkg/foobar@1.3.2, mypkg/bazbam@fdc5ce1.


  • To uninstall Fisher from your system use self-uninstall; no warnings, use with caution!
    • Unlike V2, this command will first remove all the packages that are currently installed and proceed to remove Fisher itself


  • The help command only displays usage help about Fisher now; it can't be used followed by a package name to print help about that particular command
    • Usage help is dumped to standard output instead of creating a man page on the fly, piping it to your pager
  • The version command works as usual—no breaking changes here!


  • $fish_path been renamed to $fisher_path to clarify that this variable is a Fisher specific extension, not your shell's
    • This variable controls the prefix location where functions, completions and configuration snippets will be copied to when installing a package
    • Unlike V2, the fishfile is always inside your fish configuration directory (XDG_CONFIG_HOME/fish)

Compatibility with Oh My Fish!

  • Oh My Fish! packages are still largely supported, but 100% compatibility is not planned
    • Packages that include init.fish, uninstall.fish, key_bindings.fish or recursive directories should work out of the box
    • init_ events, hooks, Oh My Fish! core library functions and Oh My Fish! environment variables such as $OMF_PATH, $package, $path and $dependencies are not currently supported
      • If you tried to install an Oh My Fish! package and it didn't work as you expected, please open an issue and I'll look into it


  • Fisher can now run on fish 2.0
    • It's a good idea to upgrade to at least fish 2.3 to use the string builtin and configuration snippets, but there's no reason for Fisher to force you to use any specific fish version
  • curl is still required for fetching packages
    • If I start to hear complains I could add a fallback to wget when curl is not available on your system
  • git is an optional dependency; it is used to fetch self-hosted packages
    • Otherwise, Fisher will fetch package tarballs directly from GitHub, GitLab, and BitBucket
      • I'm open to adding more hosts in the future if the need should arise