diff --git a/Makefile.in b/Makefile.in index f3530a64f..2ce7a9de0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -105,8 +105,8 @@ CMD_DOC_SRC := doc_src/count.txt doc_src/dirh.txt doc_src/dirs.txt \ doc_src/fishd.txt doc_src/help.txt doc_src/mimedb.txt \ doc_src/nextd.txt doc_src/open.txt doc_src/popd.txt \ doc_src/prevd.txt doc_src/psub.txt doc_src/pushd.txt \ - doc_src/set_color.txt doc_src/tokenize.txt doc_src/type.txt \ - doc_src/umask.txt doc_src/vared.txt + doc_src/set_color.txt doc_src/tokenize.txt doc_src/trap.txt \ + doc_src/type.txt doc_src/umask.txt doc_src/vared.txt # # Files generated by running doxygen on the files in $(CMD_DOC_SRC) diff --git a/doc_src/trap.txt b/doc_src/trap.txt new file mode 100644 index 000000000..dd4d2fe81 --- /dev/null +++ b/doc_src/trap.txt @@ -0,0 +1,37 @@ + +\section trap trap - perform an action when the shell recives a signal + +\subsection trap-synopsis Synopsis +trap [OPTIONS] [[ARG] SIGSPEC ... ] + +\subsection trap-description Description + +Trap is a shellscript wrapper around the fish event delivery +framework. IT is defined for backwards compatibility reasons. For +other uses, it is recomended to define a event handler. + +- ARG is the command to be executed on signal delivary +- SIGSPEC is the name of the signal to trap +- \c -h or \c --help Display help and exit +- \c -l or \c --list-signals print a list of signal names +- \c -p or \c --print print all defined signal handlers + +If ARG and SIGSPEC are both specified, ARG is the command to be +executed when the signal specified by SIGSPEC is delivered. + +If ARG is absent (and there is a single SIGSPEC) or -, each specified +signal is reset to its original disposition (the value it had upon +entrance to the shell). If ARG is the null string the signal +specified by each SIGSPEC is ignored by the shell and by the commands +it invokes. + +If ARG is not present and -p has been supplied, then the trap commands +associated with each SIGSPEC are displayed. If no arguments are +supplied or if only -p is given, trap prints the list of commands +associated with each signal. + +Signal names are case insensitive and the SIG prefix is optional. + +The return status is 1 if any SIGSPEC is invalid; otherwise trap +returns 0. diff --git a/init/fish_function.fish b/init/fish_function.fish index 44e5abfc9..c49b17129 100644 --- a/init/fish_function.fish +++ b/init/fish_function.fish @@ -545,6 +545,144 @@ function __bold -d "Print argument in bold" set_color normal end + +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 shortopt -o lph + if getopt -T >/dev/null + set longopt + else + 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 -re '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 + function __fish_type_help -d "Help for the type shellscript function" set bullet \*