Compare commits

...

122 Commits
4.1.0 ... main

Author SHA1 Message Date
Jorge Bucaran 2efd33ccd0
4.4.4 10 months ago
Vasyl Zuziak 4c95fd94c6
Ignore user's curlrc during download (#771)
By using the `-q` flag, we avoid issues from existing `.curlrc` settings, especially the `-O` option that sends output to disk instead of stdout. Since we use curl more as a plumbing tool than an interactive user command , ignoring `.curlrc` ensures consistent behavior across setups.
10 months ago
Razvan Azamfirei 59228d6215
Prepend `command` to curl and tar (#766) 12 months ago
Jorge Bucaran ed7c28ea78
Use proper Awesome Fish link
Close #764
1 year ago
Jorge Bucaran dc543b2a65
Effortlessly 1 year ago
Jorge Bucaran 2440ef4ebd
Spice up docs with sass & tweaks 1 year ago
Jorge Bucaran 67bec738db
Use IPv6-compatible install link in README
Thank you for the good times, git.io
1 year ago
James Hillyerd 5841ec0091
Fix fishshell.com configuration link anchor (#759) 1 year ago
Zhizhen He 4cd902e63f
Upgrade checkout action to v3 (#757) 1 year ago
Jorge Bucaran 4199657495
Fix organization 1 year ago
mattmc3 2e8a24614b
Update readme to include theme instructions (#753) 1 year ago
Jorge Bucaran 36810b3940
4.4.3 2 years ago
Tim 53c06c9d2f
Dereference links on install (#740) 2 years ago
Jorge Bucaran d431f45abc
Fix for case-sensitive OSes (#723)
Fix #723
2 years ago
Jorge Bucaran c05a169187
Use different emoji 2 years ago
Jorge Bucaran 67a543ef60
Reinstate https://git.io/fisher (#712)
GitHub has decided to archive the current git.io links in a
new read-only service that will allow us to continue using
redirects for existing git.io links.
2 years ago
Jorge Bucaran d92d62457f
Retouch Discoverability section 2 years ago
Patrick 626afefcb0
Suggest use of the `fish-plugin` tag to authors (#722) 2 years ago
Jorge Bucaran 2ef758ec27
4.4.2 2 years ago
Jorge Bucaran de3eee489f
Support themes (#708)
Themes are new in Fish 3.4 (fish-shell/fish-shell/pull/8132).
2 years ago
Jorge Bucaran 3ae4b29137
4.4.1 2 years ago
Jorge Bucaran 7c4024da66
Ignore case (#694)
Close #694
2 years ago
Jorge Bucaran 357d682b10
4.4.0 2 years ago
Jorge Bucaran 1662b799eb
Replace $HOME with ~ in plugin state (#611)
Now it should be easier to sync dotfiles across machines
that have different $HOME locations.

Close #611
2 years ago
Jorge Bucaran 604f8ff1ea
4.3.5 2 years ago
Jorge Bucaran 475505312c
Refactor repository fetch logic 2 years ago
Jorge Bucaran daddbadb79
Add GitLab support (#658)
Close #658.
2 years ago
Jorge Bucaran bad0471c4b
4.3.4 2 years ago
Jorge Bucaran 79b1cf17ca
Move $fish_path closer to where it is used 2 years ago
Austin Ziegler 01af91773f
Fix compatibility issue with fish 3.0.x (#719)
I have a docker image that can install fish, but it is version 3.0.2. 
The bash-compatible mechnism fish_path=(status fish-path) command
was not added until after 3.0.2, probably 3.1.
2 years ago
Jorge Bucaran 7fdb083c60
Display actual $__fish_config_dir in help 2 years ago
Jorge Bucaran 36c1930aa7
4.3.3 2 years ago
Jorge Bucaran 507c9cc425
Preserve fish_plugins plugin order (#689)
Fix #689.
2 years ago
Jorge Bucaran 5622dd660f
Refactor fish_plugins write logic for readability 2 years ago
Jorge Bucaran cf4c6cc561
4.3.2 2 years ago
Ilan Cosman b3c5336480
Use current fish path isntead of fish command (#716) 2 years ago
Jorge Bucaran a4e74bd6f1
Fix inconsistent docs 2 years ago
eitsupi 164628b696
Fix tide installation instructions (#715) 2 years ago
Yohan Min 74dabc5d5a
Fixed a small typo (#714) 2 years ago
Bugakov Mikhail 354c8fccec
Update README.md (#713) 2 years ago
anakimluke 0a0c48993a
Use official GitHub API endpoint (#700)
Close #699
2 years ago
Jorge Bucaran 93dafd242b
4.3.1 3 years ago
Jorge Bucaran 1f080b0457
Improve fisher -h (#691) 3 years ago
Jason Nader 885129b7d3
Update link to Fish config docs (#683) 3 years ago
Jorge Bucaran b2c317a2ae
Tweak acknowledgements 3 years ago
Jorge Bucaran dc7ada7a78
Try a different place for link 3 years ago
Jorge Bucaran c220662604
Remove Fish 3.x warning 3 years ago
Jorge Bucaran 7bd5bfcac1
Add acknowledgments 3 years ago
Jorge Bucaran 28bb0e172c
Use a colon to clarify usage (#674) 3 years ago
Bruce D'Arcus b9b1eda07a
Clarify fish_plugins update usage (#674) 3 years ago
Jorge Bucaran 247b58e0d9
4.3.0 3 years ago
Jorge Bucaran e7a538239b
Suppress top-level files install warning (#666) 3 years ago
Jag Talon b222175fc8
Use short-option style for tar (#665)
OpenBSD's tar doesn't support long options.
Short options ensure compatibility with OpenBSD systems.
3 years ago
Jorge Bucaran 48c414fa09
The devil is in the details 3 years ago
Jorge Bucaran 00f130ed90
Specify system requirements (#663)
Close #663
3 years ago
Daniël Franke a0a68de919
Adjust the gitlab documention.
Make it a bit less verbose.
3 years ago
Daniël Franke 6cc13ada7e
Replace the username with the actual repo name.
Even though this did work, it's not correct. This makes the URL fully
correct.
3 years ago
Daniël Franke 8ae139dc9e
Add GitLab support.
Add the possibility to add plugins from gitlab. Resolves #657.
3 years ago
Jorge Bucaran 56c629a3a9
Add link to migration from 2.x/3.x guide 3 years ago
Jorge Bucaran 3f0851c5cb
4.2.0 3 years ago
Jorge Bucaran 94e934d49e
Update -h --help completion description 3 years ago
Jorge Bucaran 746ec1a504
Remove support for .fish files outside functions (#651)
- Move fisher.fish to functions directory.
- Add deprecation warning.

Close #651
3 years ago
Jorge Bucaran 3e7c4015ab
Use set_color 3 years ago
Jorge Bucaran a8a8a96287
Print removed plugins in bold red 3 years ago
Jorge Bucaran 32ed213b4a
Preserve fish_plugins order during update (#616) 3 years ago
Jorge Bucaran 0b8daa2b8f
Link to relevant issue, improve format 3 years ago
Jorge Bucaran 9cc7d9582f
Create functions directory 3 years ago
Jorge Bucaran d0c3d1840a
Simplify top-level support code regex 3 years ago
Jorge Bucaran f4739a8c7d
Make each event do something different 3 years ago
Jorge Bucaran 57ed19f945
Add some tests 3 years ago
Jorge Bucaran 7ed1de7e56
Source plugin completions on install and update 3 years ago
Jorge Bucaran 3e5b263785
Add missing --command to complete --erase 3 years ago
Jorge Bucaran b9f222c52e
4.2.0-rc-1 3 years ago
Jorge Bucaran 70c9a59b53
\n 3 years ago
Jorge Bucaran 09fc107734
Use more string unescape 3 years ago
Jorge Bucaran 48a61924ad
Refactor parallel fetch subcommand
- Remove undocumented fisher_user_api_token.
  - Can always re-add if there's a need.
- Use string unescape which is faster.
3 years ago
Jorge Bucaran a2e3d5463f
Refactor if into && || for short lines 3 years ago
Jorge Bucaran 8f84ee6144
Kinder conflict error 3 years ago
Jorge Bucaran b2501f620d
Improve fish_plugins read regex 3 years ago
Jorge Bucaran d1a9ae0f7f
Work on fish_plugins section 3 years ago
Jorge Bucaran c8091b3dee
Abort install, don't clobber user files (#624)
Don't install plugins that would overwrite existing
user files, stop and tell the user to deal with it.

Close #624.
3 years ago
Jorge Bucaran 7a47e294b9
Add love to the docs 3 years ago
Jorge Bucaran aa4e1caca5
Update function description 3 years ago
Jorge Bucaran 0e2227019e
Regex adventures: don't match directories 3 years ago
Jorge Bucaran 8fde904564
Simplify install/update regexes 3 years ago
Jorge Bucaran da228c9f70
Simplify uninstall regexes, erase completions 3 years ago
Jorge Bucaran c3659bed01
User may not be using the default prompt anyway 4 years ago
Jorge Bucaran 3edac36e38
Better error message on no fish_plugins (#646) 4 years ago
Jorge Bucaran 72a40f13ce
Use ! 4 years ago
Jorge Bucaran fbc117df2d
Change fisher_version scope to private 4 years ago
Jorge Bucaran 6dc9e1237d
Print version and help 4 years ago
Jorge Bucaran b5650d3ef6
Use verbose syntax in completions 4 years ago
Jorge Bucaran fca10da157
Terser 4 years ago
Jorge Bucaran f24bb10edb
Useless use of backslash 4 years ago
Jorge Bucaran c9decadc16
Don't read in empty lines from fish_plugins 4 years ago
Jorge Bucaran 7d6bd9f9b3
Don't force-use system curl 4 years ago
Jorge Bucaran ed32770424
Split long lines, increase verbosity 4 years ago
Jorge Bucaran f5b6254833
Support FreeBSD
tar requires --file - on FreeBSD to read from stdout
4 years ago
Jorge Bucaran b4c2fcc68a
Use simpler curl invocation, increase verbosity 4 years ago
jorgebucaran ae423be725
Use fish_postexec to handle 4.1 migration automatically 4 years ago
jorgebucaran 285fc352b7
Tell users they may remove XDG_DATA_HOME after migrating to 4.1 4 years ago
jorgebucaran f6f2b5d149
Try simpler 4.1 migration approach 4 years ago
jorgebucaran 1644724ef1
Update before removing data_home so _fisher_list returns something 4 years ago
jorgebucaran 721ac3f707
Fix 4.x->4.1 migration error by not erasing _fisher_list 4 years ago
Jorge Bucaran fb16985935 Erase _fisher_list, etc., after update to prevent migration error 4 years ago
Jorge Bucaran db6801f565 Use inverted pyramid model 4 years ago
Jorge Bucaran 6b1a886c58 Use verbose syntax 4 years ago
Jorge Bucaran d0c30d9723 Use proper capitalization 4 years ago
rany cd9d69209e
Use HTTPS for curl installation (#627)
Using HTTPS prevents: 

- accidentally running a captive portal login screen as a Fish script and sourcing it
- other security and privacy benefits of HTTPS
4 years ago
Jorge Bucaran 4ff6128860 Doc little tweaks 4 years ago
Jorge Bucaran 2bbc06a965 Add documentation for plugin authors, close #618 4 years ago
Jorge Bucaran eab5c67f0b Phase out rm 4 years ago
Jorge Bucaran 861cd38133 Simplify source file iteration during install 4 years ago
Jorge Bucaran cc06470da1 Create functions, conf.d, and completions in $fisher_path
Create fish config directories if they don't exist
before installing plugins. We'd already fixed this,
but f4b32b34 brought back #598, as it modifies how
we copy files into $fisher_path.
4 years ago
Jorge Bucaran f4b32b3419 Install plugin even if destination parents are symlinks (#613) 4 years ago
Jorge Bucaran dc63a83c78 Print stdout, improve log readability, print version too 4 years ago
Jorge Bucaran f26e1d121f Fix isatty edge case inside GitHub workflow 4 years ago
Jorge Bucaran 5368e72863 Fix failed glob inside job; related #609 4 years ago
Jorge Bucaran f091c22c60
Use jobs --last --pid instead of $last_pid (#608) 4 years ago
Jorge Bucaran f7c347b5d0
Migrate to uvars during 4.0 to 4.1 upgrade; fix #607 4 years ago
Jorge Bucaran 3f8552e200
_fisher_list may not exit; just install fisher 4 years ago
Jorge Bucaran ac1b49b43b
Move $fisher_data migration to fisher 4 years ago

@ -1,20 +1,22 @@
name: CI
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Install Fish
run: |
sudo apt-add-repository -yn ppa:fish-shell/release-3
sudo apt-get update
sudo apt-get install -y fish
- name: Install Fisher
run: $GITHUB_WORKSPACE/ && source fisher.fish && fisher install .
- name: Install Tools
run: |
source $GITHUB_WORKSPACE/functions/fisher.fish
fisher install $GITHUB_WORKSPACE jorgebucaran/fishtape
fishtape tests/*.fish
shell: fish {0}

@ -1,63 +1,63 @@
# Fisher
> A plugin manager for [fish](https://fishshell.com)—the friendly interactive shell.
> A plugin manager for [Fish](https://fishshell.com)—your friendly interactive shell. [Snag fresh plugins!](https://github.com/jorgebucaran/awsm.fish#readme)
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.
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!
- [Oh My Fish](https://github.com/oh-my-fish/packages-main) plugin support.
- Blazingly fast concurrent plugin downloads.
- 100% pure fish—easy to contribute to or modify.
- Zero configuration out of the box. Need to tweak a thing? [You can do that too](#using-your-fish_plugins-file).
- 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
Looking for plugins? Browse [git.io/awesome.fish](https://git.io/awesome.fish) or [search](https://github.com/topics/fish-plugins) [on](https://github.com/topics/fish-package) [GitHub](https://github.com/topics/fish-plugin).
> #### ☝️ [Upgrading from Fisher `3.x` or older? Strap in and read this!](https://github.com/jorgebucaran/fisher/issues/652)
## Installation
```console
curl -sL git.io/fisher | source && fisher install jorgebucaran/fisher
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
```
## Quickstart
You can install, update, and remove plugins interactively with Fisher, taking advantage of fish [tab completion](https://fishshell.com/docs/current/index.html#completion) and rich syntax highlighting.
Fisher lets you install, update, and remove plugins like a boss. Revel in Fish's [tab completion](https://fishshell.com/docs/current/index.html#completion) and rich syntax highlighting while you're at it.
### Installing plugins
Install plugins using the `install` command followed by the path to the repository on GitHub.
To install plugins, use the `install` command and point it to the GitHub repository.
```console
fisher install ilancosman/tide
fisher install jorgebucaran/nvm.fish
```
To get a specific version of a plugin add an `@` symbol after the plugin name followed by a tag, branch, or [commit](https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefcommit-ishacommit-ishalsocommittish).
> 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](https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefcommit-ishacommit-ishalsocommittish).
```console
fisher install jorgebucaran/nvm.fish@1.1.0
fisher install IlanCosman/tide@v5
```
You can install plugins from a local directory too.
And hey, you can install plugins from a local directory too!
```console
fisher install ~/path/to/plugin
```
> Fisher expands plugins into your fish configuration directory by default, overwriting existing files. If you wish to change this behavior, set `$fisher_path` to your preferred location and put it in your function path.
> 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](https://github.com/jorgebucaran/fisher/issues/640)).
### Listing plugins
List all the plugins that are currently installed using the `list` command.
Use the `list` command to see all your shiny installed plugins.
```console
$ fisher list
jorgebucaran/fisher
ilancosman/tide
jorgebucaran/nvm.fish@1.1.0
ilancosman/tide@v5
jorgebucaran/nvm.fish
/home/jb/path/to/plugin
```
> `jorgebucaran/fisher` is listed because we installed it to start with!
The `list` command also accepts a regular expression to filter the output.
The `list` command also plays nice with regular expressions for filtering the output.
```console
$ fisher list \^/
@ -66,23 +66,23 @@ $ fisher list \^/
### Updating plugins
The `update` command updates one or more plugins to their latest version.
`update` command to the rescue! It updates one or more plugins to their latest and greatest version.
```console
fisher update ilancosman/tide
fisher update jorgebucaran/fisher
```
> `fisher update` by itself will update everything, including Fisher.
> Just type `fisher update` to update everything in one fell swoop.
### Removing plugins
Remove installed plugins using the `remove` command.
Say goodbye to installed plugins with the `remove` command.
```console
fisher remove jorgebucaran/nvm.fish@1.1.0
fisher remove jorgebucaran/nvm.fish
```
Someday you may want to remove everything, including Fisher.
Feeling destructive? Wipe out everything, including Fisher itself.
```console
fisher list | fisher remove
@ -90,50 +90,104 @@ fisher list | fisher remove
## Using your `fish_plugins` file
Whenever you install or remove a plugin from the command line, Fisher will write down all your installed plugins 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.
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. Here's an example:
You can also edit this file and run `fisher update` to commit changes like a pro:
```console
nano $__fish_config_dir/fish_plugins
$EDITOR $__fish_config_dir/fish_plugins
```
```diff
jorgebucaran/fisher
ilancosman/tide
+ jethrokuan/z
- jorgebucaran/nvm.fish@1.1.0
/home/jb/path/to/plugin
ilancosman/tide@v5
jorgebucaran/nvm.fish
+ PatrickF1/fzf.fish
- /home/jb/path/to/plugin
```
```console
fisher update
```
That will install **jethrokuan/z**, remove **jorgebucaran/nvm.fish**, and update everything else.
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](https://fishshell.com/docs/current/index.html#configuration). Behold the anatomy of a typical plugin:
<pre>
<b>flipper</b>
├── <b>completions</b>
│ └── flipper.fish
├── <b>conf.d</b>
│ └── flipper.fish
└── <b>functions</b>
└── flipper.fish
</pre>
Non `.fish` files and directories inside these locations will be copied to `$fisher_path` under `functions`, `conf.d`, or `completions` respectively.
## Event system
### Event system
Fisher leverages the fish [event system](https://fishshell.com/docs/current/cmds/emit.html) to notify plugins when they are being installed, updated, or removed.
Fish [events](https://fishshell.com/docs/current/cmds/emit.html) notify plugins when they're being installed, updated, or removed.
> `--on-event` functions must be already loaded when their event is emitted. So put event handlers in your `conf.d` directory.
> Keep in mind, `--on-event` functions must be loaded when their event is emitted. So, place your event handlers in the `conf.d` directory.
```fish
# Defined in conf.d/foobar.fish
# Defined in flipper/conf.d/flipper.fish
function foobar_install --on-event foobar_install
# Set global variables, create bindings, and other install logic.
function _flipper_install --on-event flipper_install
# Set universal variables, create bindings, and other initialization logic.
end
function foobar_update --on-event foobar_update
# Migrate resources, print warnings, and other update logic.
function _flipper_update --on-event flipper_update
# Migrate resources, print warnings, and other update logic.
end
function foobar_uninstall --on-event foobar_uninstall
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`](https://github.com/fish-shell/fish-shell/releases/tag/3.4.0) 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:
<pre>
<b>gills</b>
├── <b>conf.d</b>
│ └── gills.fish
└── <b>themes</b>
└── gills.theme
</pre>
### 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](https://github.com/fish-shell/fish-shell/issues/9456).
Fear not! You can easily solve this by symlinking Fisher's `themes` directory into your Fish config. First, backup any existing themes directory.
```console
mv $__fish_config_dir/themes $__fish_config_dir/themes.bak
```
Next, create a symlink for Fisher's themes directory.
```console
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](https://github.com/jorgebucaran/fisher/issues/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](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/classifying-your-repository-with-topics#adding-topics-to-your-repository) using [`fish-plugin`](https://github.com/topics/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](https://github.com/jorgebucaran) as a shell configuration manager for Fish. Along the way, many helped shape it into what it is today. [Oh My Fish](https://github.com/oh-my-fish/oh-my-fish) paved the way as the first popular Fish framework. [@jethrokuan](https://github.com/jethrokuan) provided crucial support during the early years. [@PatrickF1](https://github.com/PatrickF1)'s candid feedback proved invaluable time and again. Bootstrapping Fisher was originally [@IlanCosman](https://github.com/IlanCosman)'s brilliant idea. Thank you to all our contributors! <3
## License
[MIT](LICENSE.md)

@ -1,7 +1,7 @@
complete -c fisher -x -l help -d "print usage help"
complete -c fisher -x -l version -d "print fisher version"
complete -c fisher -x -n "__fish_use_subcommand" -a install -d "install plugins"
complete -c fisher -x -n "__fish_use_subcommand" -a update -d "update installed plugins"
complete -c fisher -x -n "__fish_use_subcommand" -a remove -d "remove installed plugins"
complete -c fisher -x -n "__fish_use_subcommand" -a list -d "list installed plugins matching <regex>"
complete -c fisher -x -n "__fish_seen_subcommand_from update remove" -a "(fisher list)"
complete --command fisher --exclusive --long help --description "Print help"
complete --command fisher --exclusive --long version --description "Print version"
complete --command fisher --exclusive --condition __fish_use_subcommand --arguments install --description "Install plugins"
complete --command fisher --exclusive --condition __fish_use_subcommand --arguments update --description "Update installed plugins"
complete --command fisher --exclusive --condition __fish_use_subcommand --arguments remove --description "Remove installed plugins"
complete --command fisher --exclusive --condition __fish_use_subcommand --arguments list --description "List installed plugins matching regex"
complete --command fisher --exclusive --condition "__fish_seen_subcommand_from update remove" --arguments "(fisher list)"

@ -1,204 +0,0 @@
set -g fisher_version 4.1.0
function fisher -a cmd -d "fish plugin manager"
set -q fisher_path || set -l fisher_path $__fish_config_dir
set -l fish_plugins $__fish_config_dir/fish_plugins
switch "$cmd"
case -v --version
echo "fisher, version $fisher_version"
case "" -h --help
echo "usage: fisher install <plugins...> install plugins"
echo " fisher remove <plugins...> remove installed plugins"
echo " fisher update <plugins...> update installed plugins"
echo " fisher update update all installed plugins"
echo " fisher list [<regex>] list installed plugins matching regex"
echo "options:"
echo " -v or --version print fisher version"
echo " -h or --help print this help message"
case ls list
string match --entire --regex -- "$argv[2]" $_fisher_plugins
case install update remove rm
isatty || read -laz stdin && set argv $argv[2..-1] $stdin
set -l install_plugins
set -l update_plugins
set -l remove_plugins
set -l arg_plugins $argv
set -l old_plugins $_fisher_plugins
set -l new_plugins
if test -z "$argv[1]"
if test "$cmd" != update || test ! -e $fish_plugins
echo "fisher: not enough arguments for command: \"$cmd\"" >&2 && return 1
end
set arg_plugins (string trim <$fish_plugins)
end
for plugin in $arg_plugins
test -e "$plugin" && set plugin (realpath $plugin)
contains -- "$plugin" $new_plugins || set -a new_plugins $plugin
end
if set -q argv[1]
for plugin in $new_plugins
if contains -- "$plugin" $old_plugins
if test "$cmd" = install || test "$cmd" = update
set -a update_plugins $plugin
else
set -a remove_plugins $plugin
end
else if test "$cmd" != install
echo "fisher: plugin not installed: \"$plugin\"" >&2 && return 1
else
set -a install_plugins $plugin
end
end
else
for plugin in $new_plugins
if contains -- "$plugin" $old_plugins
set -a update_plugins $plugin
else
set -a install_plugins $plugin
end
end
for plugin in $old_plugins
if not contains -- "$plugin" $new_plugins
set -a remove_plugins $plugin
end
end
end
set -l pid_list
set -l source_plugins
set -l fetch_plugins $update_plugins $install_plugins
for plugin in $fetch_plugins
set -l source (command mktemp -d)
set -a source_plugins $source
command mkdir -p $source/{completions,conf.d,functions}
fish -c "
if test -e $plugin
command cp -Rf $plugin/* $source
else
set temp (command mktemp -d)
set name (string split \@ $plugin) || set name[2] HEAD
set url https://codeload.github.com/\$name[1]/tar.gz/\$name[2]
set -q fisher_user_api_token && set opts -u $fisher_user_api_token
echo fetching \$url >&2
if command curl $opts -Ss -w \"\" \$url 2>&1 | command tar -xzf- -C \$temp 2>/dev/null
command cp -Rf \$temp/*/* $source
else
echo fisher: invalid plugin name or host unavailable: \\\"$plugin\\\" >&2
command rm -rf $source
end
command rm -rf \$temp
end
test ! -e $source && exit
command mv -f (string match --entire --regex -- \.fish\\\$ $source/*) $source/functions 2>/dev/null" &
set -a pid_list $last_pid
end
wait $pid_list 2>/dev/null
for plugin in $fetch_plugins
if set -l source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source
if set -l index (contains --index -- "$plugin" $install_plugins)
set -e install_plugins[$index]
else
set -e update_plugins[(contains --index -- "$plugin" $update_plugins)]
end
end
end
for plugin in $update_plugins $remove_plugins
if set --erase _fisher_plugins[(contains --index -- $plugin $_fisher_plugins)] 2>/dev/null
set -l plugin_files_var _fisher_(string escape --style=var $plugin)_files
if contains -- "$plugin" $remove_plugins
for file in (string match --entire --regex -- "conf\.d/" $$plugin_files_var)
emit (string replace --all --regex -- '^.*/|\.fish$' "" $file)_uninstall
end
echo -s (set_color --bold)"removing $plugin"(set_color normal) \n-$$plugin_files_var >&2
end
command rm -rf $$plugin_files_var
functions --erase (string match --entire --regex -- "functions/" $$plugin_files_var \
| string replace --all --regex -- '^.*/|\.fish$' "")
set --erase $plugin_files_var
end
end
for plugin in $update_plugins $install_plugins
set -l source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)]
command cp -Rf $source/{functions,conf.d,completions} $fisher_path
set -l files (string replace $source $fisher_path $source/{functions,conf.d,completions}/*)
set -U _fisher_(string escape --style=var $plugin)_files $files
contains -- $plugin $_fisher_plugins || set -Ua _fisher_plugins $plugin
contains -- $plugin $install_plugins && set -l event "install" || set -l event "update"
echo -s (set_color --bold)"installing $plugin"(set_color normal) \n+$files >&2
for file in (string match --entire --regex -- "[functions/|conf\.d/].*fish\$" $files)
source $file
if string match --quiet --regex -- "conf\.d/" $file
emit (string replace --all --regex -- '^.*/|\.fish$' "" $file)_$event
end
end
end
command rm -rf $source_plugins
functions -q fish_prompt || source $__fish_data_dir/functions/fish_prompt.fish
set -q _fisher_plugins[1] || set -e _fisher_plugins
set -q _fisher_plugins && printf "%s\n" $_fisher_plugins >$fish_plugins || command rm -f $fish_plugins
set -l total (count $install_plugins) (count $update_plugins) (count $remove_plugins)
test "$total" != "0 0 0" && echo (string join ", " (
test $total[1] = 0 || echo "$total[1] installed") (
test $total[2] = 0 || echo "$total[2] updated") (
test $total[3] = 0 || echo "$total[3] removed")
) "plugin/s" >&2
case \*
echo "fisher: unknown flag or command: \"$cmd\" (see `fisher -h`)" >&2 && return 1
end
end
## Migrations ##
set -q XDG_DATA_HOME || set -l XDG_DATA_HOME ~/.local/share
test -e $XDG_DATA_HOME/fisher && command rm -rf $XDG_DATA_HOME/fisher
if functions -q _fisher_self_update || test -e $__fish_config_dir/fishfile
function _fisher_migrate
function _fisher_complete
if not _fisher_list | string match --entire --regex --quiet -- jorgebucaran/fisher
fisher install jorgebucaran/fisher 2>/dev/null
end
functions --erase _fisher_complete
end
set -q XDG_DATA_HOME || set XDG_DATA_HOME ~/.local/share
set -q XDG_CACHE_HOME || set XDG_CACHE_HOME ~/.cache
set -q XDG_CONFIG_HOME || set XDG_CONFIG_HOME ~/.config
set -q fisher_path || set fisher_path $__fish_config_dir
if test -e $__fish_config_dir/fishfile
command awk '/#|^gitlab|^ *$/ { next } $0' <$__fish_config_dir/fishfile >>$__fish_config_dir/fish_plugins
end
command rm -rf $__fish_config_dir/fishfile $fisher_path/{conf.d,completions}/fisher.fish {$XDG_DATA_HOME,$XDG_CACHE_HOME,$XDG_CONFIG_HOME}/fisher
functions --erase _fisher_migrate _fisher_copy_user_key_bindings _fisher_ls _fisher_fmt _fisher_self_update _fisher_self_uninstall _fisher_commit _fisher_parse _fisher_fetch _fisher_add _fisher_rm _fisher_jobs _fisher_now _fisher_help
fisher update
end
echo "bootstrapping fisher $fisher_version for the first time, learn more at "(set_color --bold --underline)"https://git.io/fisher-4"(set_color normal) >&2
_fisher_migrate
end

@ -0,0 +1,240 @@
function fisher --argument-names cmd --description "A plugin manager for Fish"
set --query fisher_path || set --local fisher_path $__fish_config_dir
set --local fisher_version 4.4.4
set --local fish_plugins $__fish_config_dir/fish_plugins
switch "$cmd"
case -v --version
echo "fisher, version $fisher_version"
case "" -h --help
echo "Usage: fisher install <plugins...> Install plugins"
echo " fisher remove <plugins...> Remove installed plugins"
echo " fisher update <plugins...> Update installed plugins"
echo " fisher update Update all installed plugins"
echo " fisher list [<regex>] List installed plugins matching regex"
echo "Options:"
echo " -v, --version Print version"
echo " -h, --help Print this help message"
echo "Variables:"
echo " \$fisher_path Plugin installation path. Default: $__fish_config_dir" | string replace --regex -- $HOME \~
case ls list
string match --entire --regex -- "$argv[2]" $_fisher_plugins
case install update remove
isatty || read --local --null --array stdin && set --append argv $stdin
set --local install_plugins
set --local update_plugins
set --local remove_plugins
set --local arg_plugins $argv[2..-1]
set --local old_plugins $_fisher_plugins
set --local new_plugins
test -e $fish_plugins && set --local file_plugins (string match --regex -- '^[^\s]+$' <$fish_plugins)
if ! set --query argv[2]
if test "$cmd" != update
echo "fisher: Not enough arguments for command: \"$cmd\"" >&2 && return 1
else if ! set --query file_plugins
echo "fisher: \"$fish_plugins\" file not found: \"$cmd\"" >&2 && return 1
end
set arg_plugins $file_plugins
end
for plugin in $arg_plugins
set plugin (test -e "$plugin" && realpath $plugin || string lower -- $plugin)
contains -- "$plugin" $new_plugins || set --append new_plugins $plugin
end
if set --query argv[2]
for plugin in $new_plugins
if contains -- "$plugin" $old_plugins
test "$cmd" = remove &&
set --append remove_plugins $plugin ||
set --append update_plugins $plugin
else if test "$cmd" = install
set --append install_plugins $plugin
else
echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1
end
end
else
for plugin in $new_plugins
contains -- "$plugin" $old_plugins &&
set --append update_plugins $plugin ||
set --append install_plugins $plugin
end
for plugin in $old_plugins
contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin
end
end
set --local pid_list
set --local source_plugins
set --local fetch_plugins $update_plugins $install_plugins
set --local fish_path (status fish-path)
echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal)
for plugin in $fetch_plugins
set --local source (command mktemp -d)
set --append source_plugins $source
command mkdir -p $source/{completions,conf.d,themes,functions}
$fish_path --command "
if test -e $plugin
command cp -Rf $plugin/* $source
else
set temp (command mktemp -d)
set repo (string split -- \@ $plugin) || set repo[2] HEAD
if set path (string replace --regex -- '^(https://)?gitlab.com/' '' \$repo[1])
set name (string split -- / \$path)[-1]
set url https://gitlab.com/\$path/-/archive/\$repo[2]/\$name-\$repo[2].tar.gz
else
set url https://api.github.com/repos/\$repo[1]/tarball/\$repo[2]
end
echo Fetching (set_color --underline)\$url(set_color normal)
if command curl -q --silent -L \$url | command tar -xzC \$temp -f - 2>/dev/null
command cp -Rf \$temp/*/* $source
else
echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2
command rm -rf $source
end
command rm -rf \$temp
end
set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files
" &
set --append pid_list (jobs --last --pid)
end
wait $pid_list 2>/dev/null
for plugin in $fetch_plugins
if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source
if set --local index (contains --index -- "$plugin" $install_plugins)
set --erase install_plugins[$index]
else
set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)]
end
end
end
for plugin in $update_plugins $remove_plugins
if set --local index (contains --index -- "$plugin" $_fisher_plugins)
set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
if contains -- "$plugin" $remove_plugins
for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var)
emit {$name}_uninstall
end
printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
set --erase _fisher_plugins[$index]
end
command rm -rf (string replace -- \~ ~ $$plugin_files_var)
functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var)
for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var)
complete --erase --command $name
end
set --erase $plugin_files_var
end
end
if set --query update_plugins[1] || set --query install_plugins[1]
command mkdir -p $fisher_path/{functions,themes,conf.d,completions}
end
for plugin in $update_plugins $install_plugins
set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)]
set --local files $source/{functions,themes,conf.d,completions}/*
if set --local index (contains --index -- $plugin $install_plugins)
set --local user_files $fisher_path/{functions,themes,conf.d,completions}/*
set --local conflict_files
for file in (string replace -- $source/ $fisher_path/ $files)
contains -- $file $user_files && set --append conflict_files $file
end
if set --query conflict_files[1] && set --erase install_plugins[$index]
echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2
continue
end
end
for file in (string replace -- $source/ "" $files)
command cp -RLf $source/$file $fisher_path/$file
end
set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~)
contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin
contains -- $plugin $install_plugins && set --local event install || set --local event update
printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~)
source $file
if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file)
emit {$name}_$event
end
end
end
command rm -rf $source_plugins
if set --query _fisher_plugins[1]
set --local commit_plugins
for plugin in $file_plugins
contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin
end
for plugin in $_fisher_plugins
contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin
end
printf "%s\n" $commit_plugins >$fish_plugins
else
set --erase _fisher_plugins
command rm -f $fish_plugins
end
set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins)
test "$total" != "0 0 0" && echo (string join ", " (
test $total[1] = 0 || echo "Installed $total[1]") (
test $total[2] = 0 || echo "Updated $total[2]") (
test $total[3] = 0 || echo "Removed $total[3]")
) plugin/s
case \*
echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1
end
end
if ! set --query _fisher_upgraded_to_4_4
set --universal _fisher_upgraded_to_4_4
if functions --query _fisher_list
set --query XDG_DATA_HOME[1] || set --local XDG_DATA_HOME ~/.local/share
command rm -rf $XDG_DATA_HOME/fisher
functions --erase _fisher_{list,plugin_parse}
fisher update >/dev/null 2>/dev/null
else
for var in (set --names | string match --entire --regex '^_fisher_.+_files$')
set $var (string replace -- ~ \~ $$var)
end
functions --erase _fisher_fish_postexec
end
end

@ -0,0 +1,33 @@
set --local BASENAME --regex -- '[^/]+$'
@echo (fisher --version)
@test "fisher install" (
fisher install tests/ponyo >/dev/null
) "$ponyo" = "pyon pyon"
@test "fisher list" (
fisher list | string match $BASENAME | string join " "
) = "fisher fishtape ponyo"
@test "fisher list regex" (
fisher list ponyo | string match $BASENAME
) = ponyo
@test "pyon pyon" (fish --command ponyo | string join " ") = "pyon pyon ponyo"
@test "fisher update" (
fisher update tests/ponyo >/dev/null
) "$ponyo" = "pyon pyon pyon"
@test "fisher remove" (
fisher remove tests/ponyo >/dev/null
) "$ponyo" = ""
@test "has state" -n (
set --names | string match \*fisher\* | string collect
)
@test fish_plugins (
fisher list | string collect
) = (read --null <$__fish_config_dir/fish_plugins | string collect)

@ -0,0 +1,13 @@
echo pyon pyon
function ponyo_install --on-event ponyo_install
set --global ponyo pyon pyon
end
function ponyo_update --on-event ponyo_update
set --global --append ponyo pyon
end
function ponyo_uninstall --on-event ponyo_uninstall
set --erase ponyo
end

@ -0,0 +1,3 @@
function ponyo
echo ponyo
end
Loading…
Cancel
Save