aboutsummaryrefslogtreecommitdiffhomepage
path: root/init/functions
diff options
context:
space:
mode:
Diffstat (limited to 'init/functions')
-rw-r--r--init/functions/__fish_complete_directory.fish22
-rw-r--r--init/functions/__fish_complete_subcommand.fish36
-rw-r--r--init/functions/__fish_complete_suffix.fish26
-rw-r--r--init/functions/__fish_contains_opt.fish53
-rw-r--r--init/functions/__fish_gnu_complete.fish29
-rw-r--r--init/functions/__fish_move_last.fish27
-rw-r--r--init/functions/__fish_print_packages.fish55
-rw-r--r--init/functions/dirh.fish26
-rw-r--r--init/functions/help.fish94
-rw-r--r--init/functions/ls.fish18
-rw-r--r--init/functions/nextd.fish50
-rw-r--r--init/functions/open.fish12
-rw-r--r--init/functions/prevd.fish51
-rw-r--r--init/functions/psub.fish54
-rw-r--r--init/functions/trap.fish136
-rw-r--r--init/functions/type.fish134
-rw-r--r--init/functions/umask.fish206
-rw-r--r--init/functions/vared.fish47
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
+