Commit 2c4471a7 authored by Derek Willian Stavis's avatar Derek Willian Stavis

autoload: refactor for conformance and performance (#262)

Refactor autoload: Split the big function into two smaller ones,
doing only option parsing at main function.

The algorithm is also rewritten, now in two steps for both path
inclusion an exclusion functions: 1) use auxiliary lists to store
valid function and completion paths, 2) bulk insert or remove just
once in the variable.

Now also respects path insertion policy, keeping user function
path always in front of other paths, thus allowing precedence of
user functions.
parent a164ebdd
# SYNOPSIS function autoload
# 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"
set -l paths $argv
switch "$argv[1]" switch "$argv[1]"
case '-e' '--erase' case '-e' '--erase'
set erase test (count $argv) -ge 2
and __autoload_erase $argv[2..-1]
if test (count $argv) -ge 2 or echo "usage: autoload $argv[1] <path>..." 1>&2
set paths $argv[2..-1]
else
echo "usage: autoload $argv[1] <path>..." 1>&2
return 1
end
case "-*" "--*" case "-*" "--*"
echo "autoload: invalid option $argv[1]" echo "autoload: invalid option $argv[1]"
return 1 return 1
case '*'
test (count $argv) -ge 1
and __autoload_insert $argv
or echo "usage: autoload <path>..." 1>&2
end end
end
for path in $paths function __autoload_insert
set -l function_path
set -l complete_path
for path in $argv
not test -d "$path"; and continue not test -d "$path"; and continue
set -l IFS '/'
set -l dest fish_function_path echo $path | read -la components
if test "x$components[-1]" = xcompletions
if test (basename "$path") = completions contains -- $path $fish_complete_path
set dest fish_complete_path or set complete_path $complete_path $path
end
if set -q erase
if set -l index (contains -i -- $path $$dest)
set -e {$dest}[$index]
set return_success
end
else else
set return_success contains -- $path $fish_function_path
contains -- "$path" $$dest; and continue or set function_path $function_path $path
set $dest "$path" $$dest end;
end end;
end test -n "$function_path"
and set fish_function_path $fish_function_path[1] $function_path $fish_function_path[2..-1]
set -q return_success test -n "$complete_path"
end 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 "x$components[-1]" = xcompletions
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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment