diff --git a/README.md b/README.md index 89516af..51b295e 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,12 @@ Remove a theme or package. > Packages subscribed to `uninstall_` events are notified before the package is removed, so custom cleanup of resources can be done. See [Uninstall](/docs/en-US/Packages.md#uninstall) for more information. +#### `omf reload` + +Reload Oh My Fish and all plugins by using `exec` to replace current shell process with a brand new. + +> This command try to be as safe as possible, mitigating side-effects caused by `exec` and preventing the reload in case of background processes. + #### `omf new pkg | theme` _``_ Scaffold out a new package or theme. diff --git a/pkg/omf/functions/cli/omf.cli.reload.fish b/pkg/omf/functions/cli/omf.cli.reload.fish new file mode 100644 index 0000000..4746220 --- /dev/null +++ b/pkg/omf/functions/cli/omf.cli.reload.fish @@ -0,0 +1,18 @@ +function omf.cli.reload + if not contains -- --force $argv + if count (jobs) >/dev/null ^&1 + __omf.cli.reload.job_warning + return 1 + end + end + omf.reload +end + +function __omf.cli.reload.job_warning + echo (set_color -u)"Reload aborted. There are background jobs:"(set_color normal) + echo + jobs + echo + echo "For your safety, finish all background jobs before reloading Oh My Fish." + echo "If you are absolutely sure of what you are doing, you can bypass this check using --force." +end diff --git a/pkg/omf/functions/cli/omf.cli.remove.fish b/pkg/omf/functions/cli/omf.cli.remove.fish index 56c12d7..2348d15 100644 --- a/pkg/omf/functions/cli/omf.cli.remove.fish +++ b/pkg/omf/functions/cli/omf.cli.remove.fish @@ -7,6 +7,9 @@ function omf.cli.remove -a name switch $code case 0 echo (omf::em)"$name successfully removed."(omf::off) + # Opt-in flag for testing + set -q OMF_AUTO_RELOAD + and omf.cli.reload case 1 echo (omf::err)"$name could not be removed."(omf::off) 1^&2 case 2 diff --git a/pkg/omf/functions/cli/omf.cli.update.fish b/pkg/omf/functions/cli/omf.cli.update.fish index 0d11643..b280be9 100644 --- a/pkg/omf/functions/cli/omf.cli.update.fish +++ b/pkg/omf/functions/cli/omf.cli.update.fish @@ -23,4 +23,8 @@ function omf.cli.update for package in $packages omf.packages.update $package end + + # Opt-in flag for testing + set -q OMF_AUTO_RELOAD + and omf.cli.reload end diff --git a/pkg/omf/functions/core/omf.reload.fish b/pkg/omf/functions/core/omf.reload.fish new file mode 100644 index 0000000..41e3920 --- /dev/null +++ b/pkg/omf/functions/core/omf.reload.fish @@ -0,0 +1,11 @@ +function omf.reload -d "Reload fish process via exec, keeping some context" + set -q CI; and return 0 + + history --save + set -gx dirprev $dirprev + set -gx dirnext $dirnext + set -gx dirstack $dirstack + set -gx fish_greeting '' + + exec fish +end diff --git a/pkg/omf/functions/omf.fish b/pkg/omf/functions/omf.fish index 7b8c4c3..5ee4a52 100644 --- a/pkg/omf/functions/omf.fish +++ b/pkg/omf/functions/omf.fish @@ -40,6 +40,9 @@ function omf -d "Oh My Fish" case "doctor" omf.cli.doctor + case "reload" + omf.cli.reload $arguments + case "i" "install" "get" omf.cli.install $arguments