diff options
Diffstat (limited to 'init/functions')
-rw-r--r-- | init/functions/__fish_complete_directory.fish | 22 | ||||
-rw-r--r-- | init/functions/__fish_complete_subcommand.fish | 36 | ||||
-rw-r--r-- | init/functions/__fish_complete_suffix.fish | 26 | ||||
-rw-r--r-- | init/functions/__fish_contains_opt.fish | 53 | ||||
-rw-r--r-- | init/functions/__fish_gnu_complete.fish | 29 | ||||
-rw-r--r-- | init/functions/__fish_move_last.fish | 27 | ||||
-rw-r--r-- | init/functions/__fish_print_packages.fish | 55 | ||||
-rw-r--r-- | init/functions/dirh.fish | 26 | ||||
-rw-r--r-- | init/functions/help.fish | 94 | ||||
-rw-r--r-- | init/functions/ls.fish | 18 | ||||
-rw-r--r-- | init/functions/nextd.fish | 50 | ||||
-rw-r--r-- | init/functions/open.fish | 12 | ||||
-rw-r--r-- | init/functions/prevd.fish | 51 | ||||
-rw-r--r-- | init/functions/psub.fish | 54 | ||||
-rw-r--r-- | init/functions/trap.fish | 136 | ||||
-rw-r--r-- | init/functions/type.fish | 134 | ||||
-rw-r--r-- | init/functions/umask.fish | 206 | ||||
-rw-r--r-- | init/functions/vared.fish | 47 |
18 files changed, 1076 insertions, 0 deletions
diff --git a/init/functions/__fish_complete_directory.fish b/init/functions/__fish_complete_directory.fish new file mode 100644 index 00000000..af3844d5 --- /dev/null +++ b/init/functions/__fish_complete_directory.fish @@ -0,0 +1,22 @@ +# +# Find directories that complete $argv[1], output them as completions +# with description $argv[2] if defined, otherwise use 'Directory' +# + +function __fish_complete_directory -d "Complete using directories" + + set -- comp $argv[1] + set -- desc (_ Directory) + + if test (count $argv) -gt 1 + set desc $argv[2] + end + + eval "set -- dirs "$comp"*/" + + if test $dirs[1] + printf "%s\t$desc\n" $dirs + end + +end + diff --git a/init/functions/__fish_complete_subcommand.fish b/init/functions/__fish_complete_subcommand.fish new file mode 100644 index 00000000..60ecc35a --- /dev/null +++ b/init/functions/__fish_complete_subcommand.fish @@ -0,0 +1,36 @@ +function __fish_complete_subcommand -d "Complete subcommand" + set -l res "" + set -l had_cmd 0 + set -l cmd (commandline -cop) (commandline -ct) + set -l skip_next 1 + + for i in $cmd + + if test "$skip_next" = 1 + set skip_next 0 + continue + end + + if test "$had_cmd" = 1 + set res "$res $i" + else + + if contains -- $i $argv + set skip_next 1 + continue + end + + switch $i + case '-*' + + case '*' + set had_cmd 1 + set res $i + end + end + end + + printf "%s\n" (commandline -ct)(complete -C $res) + +end + diff --git a/init/functions/__fish_complete_suffix.fish b/init/functions/__fish_complete_suffix.fish new file mode 100644 index 00000000..78c5d2e0 --- /dev/null +++ b/init/functions/__fish_complete_suffix.fish @@ -0,0 +1,26 @@ +# +# Find files that complete $argv[1], has the suffix $argv[2], and +# output them as completions with description $argv[3] +# + +function __fish_complete_suffix -d "Complete using files" + + set -- comp $argv[1] + set -- suff $argv[2] + set -- desc $argv[3] + + set -- base (echo $comp |sed -e 's/\.[a-zA-Z0-9]*$//') + eval "set -- files $base*$suff" + + if test $files[1] + printf "%s\t$desc\n" $files + end + + # + # Also do directory completion, since there might be files + # with the correct suffix in a subdirectory + # + + __fish_complete_directory $comp + +end diff --git a/init/functions/__fish_contains_opt.fish b/init/functions/__fish_contains_opt.fish new file mode 100644 index 00000000..5b06007e --- /dev/null +++ b/init/functions/__fish_contains_opt.fish @@ -0,0 +1,53 @@ + +function __fish_contains_opt -d "Checks if a specific option has been given in the current commandline" + set -l next_short + + set -l short_opt + set -l long_opt + + for i in $argv + if test $next_short + set next_short + set -- short_opt $short_opt $i + else + switch $i + case -s + set next_short 1 + case '-*' + echo __fish_contains_opt: Unknown option $i + return 1 + + case '**' + set -- long_opt $long_opt $i + end + end + end + + for i in $short_opt + + if test -z $i + continue + end + + if commandline -cpo | grep -- "^-"$i"\|^-[^-]*"$i >/dev/null + return 0 + end + + if commandline -ct | grep -- "^-"$i"\|^-[^-]*"$i >/dev/null + return 0 + end + end + + for i in $long_opt + if test -z $i + continue + end + + if contains -- --$i (commandline -cpo) + return 0 + end + end + + return 1 +end + diff --git a/init/functions/__fish_gnu_complete.fish b/init/functions/__fish_gnu_complete.fish new file mode 100644 index 00000000..9aeb0ba8 --- /dev/null +++ b/init/functions/__fish_gnu_complete.fish @@ -0,0 +1,29 @@ +function __fish_gnu_complete -d "Wrapper for the complete builtin. Skips the long completions on non-GNU systems" + set is_gnu 0 + + # Check if we are using a gnu system + for i in (seq (count $argv)) + switch $argv[$i] + + case -g --is-gnu + set -e argv[$i] + set is_gnu 1 + break + end + end + + # Remove long option if not on a gnu system + if test $is_gnu = 0 + for i in (seq (count $argv)) + if test $argv[$i] = -l + set -e argv[$i] + set -e argv[$i] + break + end + end + end + + complete $argv + +end + diff --git a/init/functions/__fish_move_last.fish b/init/functions/__fish_move_last.fish new file mode 100644 index 00000000..965072cd --- /dev/null +++ b/init/functions/__fish_move_last.fish @@ -0,0 +1,27 @@ +function __fish_move_last -d "Move the last element of a directory history from src to dest" + set -l src $argv[1] + set -l dest $argv[2] + + set -l size_src (count $$src) + + if test $size_src = 0 + # Cannot make this step + printf (_ "Hit end of history...\n") + return 1 + end + + # Append current dir to the end of the destination + set -g (echo $dest) $$dest (command pwd) + + set ssrc $$src + + # Change dir to the last entry in the source dir-hist + builtin cd $ssrc[$size_src] + + # Keep all but the last from the source dir-hist + set -e (echo $src)[$size_src] + + # All ok, return success + return 0 +end + diff --git a/init/functions/__fish_print_packages.fish b/init/functions/__fish_print_packages.fish new file mode 100644 index 00000000..03e52314 --- /dev/null +++ b/init/functions/__fish_print_packages.fish @@ -0,0 +1,55 @@ + +function __fish_print_packages + + # apt-cache is much, much faster than rpm, and can do this in real + # time. We use it if available. + + switch (commandline -tc) + case '-**' + return + end + + #Get the word 'Package' in the current language + set -l package (_ Package) + + if which apt-cache >/dev/null ^/dev/null + # Apply the following filters to output of apt-cache: + # 1) Remove package names with parentesis in them, since these seem to not correspond to actual packages as reported by rpm + # 2) Remove package names that are .so files, since these seem to not correspond to actual packages as reported by rpm + # 3) Remove path information such as /usr/bin/, as rpm packages do not have paths + + apt-cache --no-generate pkgnames (commandline -tc)|grep -v \( |grep -v '\.so\(\.[0-9]\)*$'|sed -e 's/\/.*\///'|sed -e 's/$/\t'$package'/' + return + end + + # Rpm is too slow for this job, so we set it up to do completions + # as a background job and cache the results. + + if which rpm >/dev/null ^/dev/null + + # If the cache is less than five minutes old, we do not recalculate it + + set cache_file /tmp/.rpm-cache.$USER + if test -f $cache_file + cat $cache_file + set age (echo (date +%s) - (stat -c '%Y' $cache_file) | bc) + set max_age 250 + if test $age -lt $max_age + return + end + end + + # Remove package version information from output and pipe into cache file + rpm -qa >$cache_file |sed -e 's/-[^-]*-[^-]*$//' | sed -e 's/$/\t'$package'/' & + end + + # This completes the package name from the portage tree. + # True for installing new packages. Function for printing + # installed on the system packages is in completions/emerge.fish + if which emerge >/dev/null ^/dev/null + emerge -s \^(commandline -tc) |grep "^*" |cut -d\ -f3 |cut -d/ -f2 + return + end + +end + diff --git a/init/functions/dirh.fish b/init/functions/dirh.fish new file mode 100644 index 00000000..82eb5a29 --- /dev/null +++ b/init/functions/dirh.fish @@ -0,0 +1,26 @@ + +function dirh -d "Print the current directory history (the back- and fwd- lists)" + # Avoid set comment + set -l current (command pwd) + set -l separator " " + set -l line_len (echo (count $dirprev) + (echo $dirprev $current $dirnext | wc -m) | bc) + if test $line_len -gt $COLUMNS + # Print one entry per line if history is long + set separator "\n" + end + + for i in $dirprev + echo -n -e $i$separator + end + + set_color $fish_color_history_current + echo -n -e $current$separator + set_color normal + + for i in (seq (echo (count $dirnext)) -1 1) + echo -n -e $dirnext[$i]$separator + end + + echo +end + diff --git a/init/functions/help.fish b/init/functions/help.fish new file mode 100644 index 00000000..1dff5f91 --- /dev/null +++ b/init/functions/help.fish @@ -0,0 +1,94 @@ + +# +# help should use 'open' to find a suitable browser, but only +# if there is a mime database _and_ DISPLAY is set, since the +# browser will most likely be graphical. Since most systems which +# have a mime databe also have the htmlview program, this is mostly a +# theoretical problem. +# + +function help -d "Show help for the fish shell" + + # Declare variables to set correct scope + set -l fish_browser + set -l fish_browser_bg + + set -l h syntax completion editor job-control todo bugs history killring help + set h $h color prompt title variables builtin-overview changes expand + set h $h expand-variable expand-home expand-brace expand-wildcard + set -l help_topics $h expand-command-substitution expand-process + + # + # Find a suitable browser for viewing the help pages. This is needed + # by the help function defined below. + # + set -l graphical_browsers htmlview x-www-browser firefox galeon mozilla konqueror epiphany opera netscape + set -l text_browsers htmlview www-browser links elinks lynx w3m + + if test $BROWSER + # User has manualy set a preferred browser, so we respect that + set fish_browser $BROWSER + + # If browser is known to be graphical, put into background + if contains -- $BROWSER $graphical_browsers + set fish_browser_bg 1 + end + else + # Check for a text-based browser. + for i in $text_browsers + if which $i 2>/dev/null >/dev/null + set fish_browser $i + break + end + end + + # If we are in a graphical environment, check if there is a graphical + # browser to use instead. + if test "$DISPLAY" -a \( "$XAUTHORITY" = "$HOME/.Xauthority" -o "$XAUTHORITY" = "" \) + for i in $graphical_browsers + if which $i 2>/dev/null >/dev/null + set fish_browser $i + set fish_browser_bg 1 + break + end + end + end + end + + if test -z $fish_browser + printf (_ '%s: Could not find a web browser.\n') help + printf (_ 'Please set the variable $BROWSER to a suitable browser and try again\n\n') + return 1 + end + + set fish_help_item $argv[1] + + switch "$fish_help_item" + case "" + set fish_help_page index.html + case "." + set fish_help_page "builtins.html\#source" + case difference + set fish_help_page difference.html + case globbing + set fish_help_page "index.html\#expand" + case (builtin -n) + set fish_help_page "builtins.html\#$fish_help_item" + case contains count dirh dirs help mimedb nextd open popd prevd pushd set_color tokenize psub umask type vared + set fish_help_page "commands.html\#$fish_help_item" + case $help_topics + set fish_help_page "index.html\#$fish_help_item" + case "*" + if which $fish_help_item >/dev/null ^/dev/null + man $fish_help_item + return + end + set fish_help_page "index.html" + end + + if test $fish_browser_bg + eval $fish_browser file://$__fish_help_dir/$fish_help_page \& + else + eval $fish_browser file://$__fish_help_dir/$fish_help_page + end +end diff --git a/init/functions/ls.fish b/init/functions/ls.fish new file mode 100644 index 00000000..3f96812a --- /dev/null +++ b/init/functions/ls.fish @@ -0,0 +1,18 @@ +# +# Make ls use colors if we are on a system that supports this +# + +if ls --version 1>/dev/null 2>/dev/null + # This is GNU ls + function ls -d "List contents of directory" + command ls --color=auto --indicator-style=classify $argv + end +else + # BSD, OS X and a few more support colors through the -G switch instead + if ls / -G 1>/dev/null 2>/dev/null + function ls -d "List contents of directory" + command ls -G $argv + end + end +end + diff --git a/init/functions/nextd.fish b/init/functions/nextd.fish new file mode 100644 index 00000000..293e7fd9 --- /dev/null +++ b/init/functions/nextd.fish @@ -0,0 +1,50 @@ + +function nextd -d "Move forward in the directory history" + # Parse arguments + set -l show_hist 0 + set -l times 1 + for i in (seq (count $argv)) + switch $argv[$i] + case '-l' --l --li --lis --list + set show_hist 1 + continue + case '-*' + printf (_ "%s: Unknown option %s\n" ) nextd $argv[$i] + return 1 + case '*' + if test $argv[$i] -ge 0 ^/dev/null + set times $argv[$i] + else + printf (_ "%s: The number of positions to skip must be a non-negative integer\n" ) nextd + return 1 + end + continue + end + end + + # Traverse history + set -l code 1 + for i in (seq $times) + # Try one step backward + if __fish_move_last dirnext dirprev; + # We consider it a success if we were able to do at least 1 step + # (low expectations are the key to happiness ;) + set code 0 + else + break + end + end + + # Show history if needed + if test $show_hist = 1 + dirh + end + + # Set direction for 'cd -' + if test $code = 0 ^/dev/null + set -g __fish_cd_direction prev + end + + # All done + return $code +end diff --git a/init/functions/open.fish b/init/functions/open.fish new file mode 100644 index 00000000..bfe0f99e --- /dev/null +++ b/init/functions/open.fish @@ -0,0 +1,12 @@ + +# +# This allows us to use 'open FILENAME' to open a given file in the default +# application for the file. +# + +if not test (uname) = Darwin + function open -d "Open file in default application" + mimedb -l -- $argv + end +end + diff --git a/init/functions/prevd.fish b/init/functions/prevd.fish new file mode 100644 index 00000000..e71fb2e0 --- /dev/null +++ b/init/functions/prevd.fish @@ -0,0 +1,51 @@ + +function prevd -d "Move back in the directory history" + # Parse arguments + set -l show_hist 0 + set -l times 1 + for i in (seq (count $argv)) + switch $argv[$i] + case '-l' --l --li --lis --list + set show_hist 1 + continue + case '-*' + printf (_ "%s: Unknown option %s\n" ) prevd $argv[$i] + return 1 + case '*' + if test $argv[$i] -ge 0 ^/dev/null + set times $argv[$i] + else + printf (_ "The number of positions to skip must be a non-negative integer\n") + return 1 + end + continue + end + end + + # Traverse history + set -l code 1 + for i in (seq $times) + # Try one step backward + if __fish_move_last dirprev dirnext; + # We consider it a success if we were able to do at least 1 step + # (low expectations are the key to happiness ;) + set code 0 + else + break + end + end + + # Show history if needed + if test $show_hist = 1 + dirh + end + + # Set direction for 'cd -' + if test $code = 0 ^/dev/null + set -g __fish_cd_direction next + end + + # All done + return $code +end + diff --git a/init/functions/psub.fish b/init/functions/psub.fish new file mode 100644 index 00000000..974833f2 --- /dev/null +++ b/init/functions/psub.fish @@ -0,0 +1,54 @@ + + +function psub -d "Read from stdin into a file and output the filename. Remove the file when the command that calles psub exits." + + set -l filename + set -l funcname + + if count $argv >/dev/null + switch $argv[1] + case '-h*' --h --he --hel --help + + help psub + return 0 + + case '*' + printf (_ "%s: Unknown argument '%s'\n") psub $argv[1] + return 1 + end + end + + if not status --is-command-substitution + echo psub: Not inside of command substitution >&2 + return + end + + # Find unique file name for writing output to + while true + set filename /tmp/.psub.(echo %self).(random); + if not test -e $filename + break; + end + end + + # Write output to pipe. This needs to be done in the background so + # that the command substitution exits without needing to wait for + # all the commands to exit + mkfifo $filename + cat >$filename & + + # Write filename to stdout + echo $filename + + # Find unique function name + while true + set funcname __fish_psub_(random); + if not functions $funcname >/dev/null ^/dev/null + break; + end + end + + # Make sure we erase file when caller exits + eval function $funcname --on-job-exit caller\; rm $filename\; functions -e $funcname\; end + +end diff --git a/init/functions/trap.fish b/init/functions/trap.fish new file mode 100644 index 00000000..74940dbe --- /dev/null +++ b/init/functions/trap.fish @@ -0,0 +1,136 @@ + +function __trap_translate_signal + set upper (echo $argv[1]|tr a-z A-Z) + if expr $upper : 'SIG.*' >/dev/null + echo $upper | cut -c 4- + else + echo $upper + end +end + +function __trap_switch + + switch $argv[1] + case EXIT + echo --on-exit %self + + case '*' + echo --on-signal $argv[1] + end + +end + +function trap -d 'Perform an action when the shell recives a signal' + + set -l mode + set -l cmd + set -l sig + set -l shortopt + set -l longopt + + set -l shortopt -o lph + set -l longopt + if not getopt -T >/dev/null + set longopt -l print,help,list-signals + end + + if not getopt -n type -Q $shortopt $longopt -- $argv + return 1 + end + + set -l tmp (getopt $shortopt $longopt -- $argv) + + eval set opt $tmp + + while count $opt >/dev/null + switch $opt[1] + case -h --help + help trap + return 0 + + case -p --print + set mode print + + case -l --list-signals + set mode list + + case -- + set -e opt[1] + break + + end + set -e opt[1] + end + + if not count $mode >/dev/null + + switch (count $opt) + + case 0 + set mode print + + case 1 + set mode clear + + case '*' + if test opt[1] = - + set -e opt[1] + set mode clear + else + set mode set + end + end + end + + switch $mode + case clear + for i in $opt + set -- sig (__trap_translate_signal $i) + if test $sig + functions -e __trap_handler_$sig + end + end + + case set + set -l cmd $opt[1] + set -e opt[1] + + for i in $opt + + set -l -- sig (__trap_translate_signal $i) + set -- sw (__trap_switch $sig) + + if test $sig + eval "function __trap_handler_$sig $sw; $cmd; end" + else + return 1 + end + end + + case print + set -l names + + if count $opt >/dev/null + set -- names $opt + else + set -- names (functions -na|grep "^__trap_handler_"|sed -e 's/__trap_handler_//' ) + end + + for i in $names + + set -- sig (__trap_translate_signal $i) + + if test sig + functions __trap_handler_$i + else + return 1 + end + + end + + case list + kill -l + + end + +end diff --git a/init/functions/type.fish b/init/functions/type.fish new file mode 100644 index 00000000..af7e0faa --- /dev/null +++ b/init/functions/type.fish @@ -0,0 +1,134 @@ + +function type -d "Print the type of a command" + + # Initialize + set -l status 1 + set -l mode normal + set -l selection all + + # + # Get options + # + set -l shortopt -o tpPafh + set -l longopt + if not getopt -T >/dev/null + set longopt -l type,path,force-path,all,no-functions,help + end + + if not getopt -n type -Q $shortopt $longopt -- $argv + return 1 + end + + set -l tmp (getopt $shortopt $longopt -- $argv) + + set -l opt + eval set opt $tmp + + for i in $opt + switch $i + case -t --type + set mode type + + case -p --path + set mode path + + case -P --force-path + set mode path + set selection files + + case -a --all + set selection multi + + case -f --no-functions + set selection files + + case -h --help + help type + return 0 + + case -- + break + + end + end + + # Check all possible types for the remaining arguments + for i in $argv + + switch $i + case '-*' + continue + end + + # Found will be set to 1 if a match is found + set found 0 + + if test $selection != files + + if contains -- $i (functions -na) + set status 0 + set found 1 + switch $mode + case normal + printf (_ '%s is a function with definition\n') $i + functions $i + + case type + printf (_ 'function\n') + + case path + echo + + end + if test $selection != multi + continue + end + end + + if contains -- $i (builtin -n) + set status 0 + set found 1 + switch $mode + case normal + printf (_ '%s is a builtin\n') $i + + case type + printf (_ 'builtin\n') + + case path + echo + end + if test $selection != multi + continue + end + end + + end + + if which $i ^/dev/null >/dev/null + set status 0 + set found 1 + switch $mode + case normal + printf (_ '%s is %s\n') $i (which $i) + + case type + printf (_ 'file\n') + + case path + which $i + end + if test $selection != multi + continue + end + end + + if test $found = 0 + printf (_ "%s: Could not find '%s'") type $i + end + + end + + return $status +end + diff --git a/init/functions/umask.fish b/init/functions/umask.fish new file mode 100644 index 00000000..5392a390 --- /dev/null +++ b/init/functions/umask.fish @@ -0,0 +1,206 @@ + +function __fish_umask_parse -d "Parses a file permission specification as into an octal version" + # Test if already a valid octal mask, and pad it with zeros + if echo $argv | grep -E '^(0|)[0-7]{1,3}$' >/dev/null + for i in (seq (echo 5-(echo $argv|wc -c)|bc)); set argv 0$argv; end + echo $argv + else + # Test if argument really is a valid symbolic mask + if not echo $argv | grep -E '^(((u|g|o|a|)(=|\+|-)|)(r|w|x)*)(,(((u|g|o|a|)(=|\+|-)|)(r|w|x)*))*$' >/dev/null + printf (_ "%s: Invalid mask '%s'\n") umask $argv >&2 + return 1 + end + + set -l implicit_all + + # Insert inverted umask into res variable + + set -l mode + set -l val + set -l tmp $umask + set -l res + + for i in 1 2 3 + set tmp (echo $tmp|cut -c 2-) + set res[$i] (echo 7-(echo $tmp|cut -c 1)|bc) + end + + set -l el (echo $argv|tr , \n) + for i in $el + switch $i + case 'u*' + set idx 1 + set i (echo $i| cut -c 2-) + + case 'g*' + set idx 2 + set i (echo $i| cut -c 2-) + + case 'o*' + set idx 3 + set i (echo $i| cut -c 2-) + + case 'a*' + set idx 1 2 3 + set i (echo $i| cut -c 2-) + + case '*' + set implicit_all 1 + set idx 1 2 3 + end + + switch $i + case '=*' + set mode set + set i (echo $i| cut -c 2-) + + case '+*' + set mode add + set i (echo $i| cut -c 2-) + + case '-*' + set mode remove + set i (echo $i| cut -c 2-) + + case '*' + if not count $implicit_all >/dev/null + printf (_ "%s: Invalid mask '%s'\n") umask $argv >&2 + return + end + set mode set + end + + if not echo $perm|grep -E '^(r|w|x)*$' >/dev/null + printf (_ "%s: Invalid mask '%s'\n") umask $argv >&2 + return + end + + set val 0 + if echo $i |grep 'r' >/dev/null + set val 4 + end + if echo $i |grep 'w' >/dev/null + set val (echo $val + 2|bc) + end + if echo $i |grep 'x' >/dev/null + set val (echo $val + 1|bc) + end + + for j in $idx + switch $mode + case set + set res[$j] $val + + case add + set res[$j] (perl -e 'print( ( '$res[$j]'|'$val[$j]' )."\n" )') + + case remove + set res[$j] (perl -e 'print( ( (7-'$res[$j]')&'$val[$j]' )."\n" )') + end + end + end + + for i in 1 2 3 + set res[$i] (echo 7-$res[$i]|bc) + end + echo 0$res[1]$res[2]$res[3] + end +end + +function __fish_umask_print_symbolic + set -l res "" + set -l letter a u g o + + for i in 2 3 4 + set res $res,$letter[$i]= + set val (echo $umask|cut -c $i) + + if contains $val 0 1 2 3 + set res {$res}r + end + + if contains $val 0 1 4 5 + set res {$res}w + end + + if contains $val 0 2 4 6 + set res {$res}x + end + + end + + echo $res|cut -c 2- +end + +function umask -d "Set default file permission mask" + + set -l as_command 0 + set -l symbolic 0 + + set -l shortopt -o pSh + set -l longopt + if not getopt -T >/dev/null + set longopt -l as-command,symbolic,help + end + + if not getopt -n umask -Q $shortopt $longopt -- $argv + return 1 + end + + set -l tmp (getopt $shortopt $longopt -- $argv) + + eval set opt $tmp + + while count $opt >/dev/null + + switch $opt[1] + case -h --help + help umask + return 0 + + case -p --as-command + set as_command 1 + + case -S --symbolic + set symbolic 1 + + case -- + set -e opt[1] + break + + end + + set -e opt[1] + + end + + switch (count $opt) + + case 0 + if not set -q umask + set -g umask 113 + end + if test $as_command -eq 1 + echo umask $umask + else + if test $symbolic -eq 1 + __fish_umask_print_symbolic $umask + else + echo $umask + end + end + + case 1 + set -l parsed (__fish_umask_parse $opt) + if test (count $parsed) -eq 1 + set -g umask $parsed + return 0 + end + return 1 + + case '*' + printf (_ '%s: Too many arguments\n') umask >&2 + + end + +end diff --git a/init/functions/vared.fish b/init/functions/vared.fish new file mode 100644 index 00000000..f6b442b5 --- /dev/null +++ b/init/functions/vared.fish @@ -0,0 +1,47 @@ + +# +# This is a neat function, stolen from zsh. It allows you to edit the +# value of a variable interactively. +# + +function vared -d "Edit variable value" + if test (count $argv) = 1 + switch $argv + + case '-h' '--h' '--he' '--hel' '--help' + help vared + + case '-*' + printf (_ "%s: Unknown option %s\n") vared $argv + + case '*' + if test (count $$argv ) -lt 2 + set init '' + if test $$argv + set -- init $$argv + end + set prompt 'set_color green; echo '$argv'; set_color normal; echo "> "' + read -p $prompt -c $init tmp + + # If variable already exists, do not add any + # switches, so we don't change export rules. But + # if it does not exist, we make the variable + # global, so that it will not die when this + # function dies + + if test $$argv + set -- $argv $tmp + else + set -g -- $argv $tmp + end + + else + + printf (_ '%s: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of %s\n') $argv (set_color $fish_color_command) (set_color $fish_color_normal) vared $argv $argv + end + end + else + printf (_ '%s: Expected exactly one argument, got %s.\n\nSynopsis:\n\t%svared%s VARIABLE\n') vared (count $argv) (set_color $fish_color_command) (set_color $fish_color_normal) + end +end + |