From b618fbd3573877889d3ef8393bfa1412e78425da Mon Sep 17 00:00:00 2001 From: dliendo Date: Tue, 24 Jun 2025 11:43:01 -0300 Subject: [PATCH] feat(plugin): add plugin to easily save aliases and functions --- plugins/fishysave/README.md | 27 ++++++++++++++++++ plugins/fishysave/fishysave.plugin.zsh | 39 ++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 plugins/fishysave/README.md create mode 100644 plugins/fishysave/fishysave.plugin.zsh diff --git a/plugins/fishysave/README.md b/plugins/fishysave/README.md new file mode 100644 index 000000000..aabb53e93 --- /dev/null +++ b/plugins/fishysave/README.md @@ -0,0 +1,27 @@ +## fishysave + +Plugin to save and update functions and aliases directly from shell, reminiscent of the fish "funcsave" feature. + +## Install + +add fishysave to the plugins array of your zshrc file: +```bash +# ~/.zshrc +plugins=(... fishysave) + +``` + +## Usage + +```bash +# Save an alias +alias lsal="ls -al" +fishysave lsal + +# Save a function +function lsa() { + ls -al +} +fishysave lsa + +``` diff --git a/plugins/fishysave/fishysave.plugin.zsh b/plugins/fishysave/fishysave.plugin.zsh new file mode 100644 index 000000000..1982519c0 --- /dev/null +++ b/plugins/fishysave/fishysave.plugin.zsh @@ -0,0 +1,39 @@ +local base_dir="${ZSH_SAVE_DIR:-$HOME/.zshrc_fishy}" + +function fishysave() { + local name="$1" + + local base_dir="${ZSH_SAVE_DIR:-$HOME/.zshrc_fishy}" + local alias_dir="$base_dir/aliases" + local func_dir="$base_dir/functions" + + if [[ -z "$name" ]]; then + echo "No parameter provided" + echo "Usage: save " + return 1 + fi + + if alias "$name" &>/dev/null; then + local alias_def + alias_def=$(alias "$name") + + echo "alias $alias_def" > "$alias_dir/$name.zsh" + echo "Alias $name saved to $alias_dir/$name.zsh" + elif whence -w "$name" | grep -q function; then + local func_def + func_def=$(functions "$name") + echo "$func_def" > "$func_dir/$name.zsh" + echo "Function $name saved to $func_dir/$name.zsh" + else + echo "Couldn't find a declared function or alias named '$name'" + return 2 + fi +} + +mkdir -p "$base_dir/aliases" "$base_dir/functions" + +setopt localoptions nullglob + +for file in "$base_dir"/aliases/*.zsh "$base_dir"/functions/*.zsh; do + [[ -f $file ]] && source "$file" +done