diff --git a/lib/autoload.fish b/lib/autoload.fish index c5312eb2a1ce7357103e08ce03d3699ebd3d3f7e..6f297f11776a53f114c0d33cdeb9b9671effbaa0 100644 --- a/lib/autoload.fish +++ b/lib/autoload.fish @@ -1,58 +1,64 @@ -# SYNOPSIS -# autoload <path>... -# autoload -e <path>... -# -# OVERVIEW -# Manipulate autoloading path components. -# -# If called without options, the paths passed as arguments are added to -# $fish_function_path. All paths ending with `completions` are correctly -# added to $fish_complete_path. Returns 0 if one or more paths exist. If all -# paths are missing, returns != 0. -# -# When called with -e, the paths passed as arguments are removed from -# $fish_function_path. All arguments ending with `completions` are correctly -# removed from $fish_complete_path. Returns 0 if one or more paths erased. If -# no paths were erased, returns != 0. - -function autoload -d "Manipulate autoloading path components" +function autoload set -l paths $argv - switch "$argv[1]" case '-e' '--erase' - set erase - - if test (count $argv) -ge 2 - set paths $argv[2..-1] - else - echo "usage: autoload $argv[1] <path>..." 1>&2 - return 1 - end + test (count $argv) -ge 2 + and __autoload_erase $argv[2..-1] + or echo "usage: autoload $argv[1] <path>..." 1>&2 case "-*" "--*" echo "autoload: invalid option $argv[1]" return 1 + case '*' + test (count $argv) -ge 1 + and __autoload_insert $argv + or echo "usage: autoload <path>..." 1>&2 end +end - for path in $paths - not test -d "$path"; and continue +function __autoload_insert + set -l function_path + set -l complete_path - set -l dest fish_function_path + for path in $argv + not test -d "$path"; and continue - if test (basename "$path") = completions - set dest fish_complete_path - end + set -l IFS '/' + echo $path | read -la components - if set -q erase - if set -l index (contains -i -- $path $$dest) - set -e {$dest}[$index] - set return_success - end + if test "$components[-1]" = completions + contains -- $path $fish_complete_path + or set complete_path $complete_path $path else - set return_success - contains -- "$path" $$dest; and continue - set $dest "$path" $$dest + contains -- $path $fish_function_path + or set function_path $function_path $path end end - set -q return_success + test "$function_path" + and set fish_function_path $fish_function_path[1] $function_path $fish_function_path[2..-1] + test "$complete_path" + and set fish_complete_path $fish_complete_path[1] $complete_path $fish_complete_path[2..-1] + + return 0 +end + +function __autoload_erase + set -l function_indexes + set -l complete_indexes + + for path in $argv + set -l IFS '/' + echo $path | read -la components + + test "$components[-1]" = completions + and set complete_indexes $complete_indexes (contains -i $path $fish_complete_path) + or set function_indexes $function_indexes (contains -i $path $fish_function_path) + end + + test -n "$function_indexes" + and set -e fish_function_path[$function_indexes] + test -n "$complete_indexes" + and set -e fish_complete_path[$complete_indexes] + + return 0 end