diff options
Diffstat (limited to 'config/fish')
| -rw-r--r-- | config/fish/config.fish | 6 | ||||
| -rw-r--r-- | config/fish/fish_add_path_fallback.fish | 91 |
2 files changed, 97 insertions, 0 deletions
diff --git a/config/fish/config.fish b/config/fish/config.fish index 47242b0..04f1b18 100644 --- a/config/fish/config.fish +++ b/config/fish/config.fish @@ -3,6 +3,12 @@ umask 027 # PATH Stuff +if not functions -q fish_add_path + function fish_add_path + fish_add_path_fallback + end +end + for dir in /bin /sbin ~/.local/bin fish_add_path $dir end diff --git a/config/fish/fish_add_path_fallback.fish b/config/fish/fish_add_path_fallback.fish new file mode 100644 index 0000000..4b0b045 --- /dev/null +++ b/config/fish/fish_add_path_fallback.fish @@ -0,0 +1,91 @@ +# Copyright by the fish-shell contributors +# Taken from the fish-shell distribution licensed under GPLv2 +# https://github.com/fischerling/dotfiles.git +function fish_add_path_fallback --description 'Add paths to the PATH' + # This is meant to be the easy one-stop shop to adding stuff to $PATH. + # By default it'll prepend the given paths to a universal $fish_user_paths, excluding the already-included ones. + # + # That means it can be executed once in an interactive session, or stuffed in config.fish, + # and it will do The Right Thing. + # + # The options: + # --prepend or --append to select whether to put the new paths first or last + # --global or --universal to decide whether to use a universal or global fish_user_paths + # --path to set $PATH instead + # --move to move existing entries instead of ignoring them + # --verbose to print the set-command used + # --dry-run to print the set-command without running it + # We do not allow setting $PATH universally. + # + # It defaults to keeping $fish_user_paths or creating a universal, prepending and ignoring existing entries. + argparse -x g,U -x P,U -x a,p g/global U/universal P/path p/prepend a/append h/help m/move v/verbose n/dry-run -- $argv + or return + + if set -q _flag_help + __fish_print_help fish_add_path + return 0 + end + + set -l scope $_flag_global $_flag_universal + if not set -q scope[1]; and not set -q fish_user_paths + set scope -U + end + + set -l var fish_user_paths + set -q _flag_path + and set var PATH + # $PATH should be global + and set scope -g + set -l mode $_flag_prepend $_flag_append + set -q mode[1]; or set mode -p + + # To keep the order of our arguments, go through and save the ones we want to keep. + set -l newpaths + set -l indexes + for path in $argv + # Realpath allows us to canonicalize the path, which is needed for deduplication. + # We could add a non-canonical version of the given path if no duplicate exists, but tbh that's a recipe for disaster. + + # realpath complains if a parent directory does not exist, so we silence stderr. + set -l p (builtin realpath -s -- $path 2>/dev/null) + + # Ignore non-existing paths + test -d "$p"; or continue + + if set -l ind (contains -i -- $p $$var) + # In move-mode, we remove it from its current position and add it back. + if set -q _flag_move + set -a indexes $ind + set -a newpaths $p + end + else + # Without move, we only add it if it's not in. + set -a newpaths $p + end + end + + # Ensure the variable is only set once, by constructing a new variable before. + # This is to stop any handlers or anything from firing more than once. + set -l newvar $$var + if set -q _flag_move; and set -q indexes[1] + # We remove in one step, so the indexes don't move. + set -e newvar["$indexes"] + end + set $mode newvar $newpaths + + # Finally, only set if there is anything *to* set. + # This saves us from setting, especially in the common case of someone putting this in config.fish + # to ensure a path is in $PATH. + if set -q newpaths[1]; or set -q indexes[1] + if set -q _flag_verbose; or set -q _flag_n + # The escape helps make it unambiguous - so you see whether an argument includes a space or something. + echo (string escape -- set $scope $var $newvar) + end + + not set -q _flag_n + and set $scope $var $newvar + return 0 + else + return 1 + end +end |
