diff options
Diffstat (limited to 'builtins/bind.def')
-rw-r--r-- | builtins/bind.def | 62 |
1 files changed, 46 insertions, 16 deletions
diff --git a/builtins/bind.def b/builtins/bind.def index 908803a1..6b8ac56b 100644 --- a/builtins/bind.def +++ b/builtins/bind.def @@ -26,7 +26,7 @@ $PRODUCES bind.c $BUILTIN bind $DEPENDS_ON READLINE $FUNCTION bind_builtin -$SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-r keyseq] [keyseq:readline-function] +$SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [keyseq:readline-function] Bind a key sequence to a Readline function, or to a macro. The syntax is equivalent to that found in ~/.inputrc, but must be passed as a single argument: bind '"\C-x\C-r": re-read-init-file'. @@ -42,6 +42,7 @@ Arguments we accept: -r keyseq Remove the binding for KEYSEQ. -f filename Read key bindings from FILENAME. -q function-name Query about which keys invoke the named function. + -u function-name Unbind all keys which are bound to the named function. -V List variable names and values -v List variable names and values in a form that can be reused as input. @@ -53,6 +54,9 @@ $END #if defined (READLINE) #if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include <sys/types.h> +# endif # include <unistd.h> #endif @@ -71,22 +75,24 @@ extern int errno; #include "common.h" static int query_bindings (); +static int unbind_command (); extern int no_line_editing; #define BIND_RETURN(x) do { return_code = x; goto bind_exit; } while (0) -#define LFLAG 0x01 -#define PFLAG 0x02 -#define FFLAG 0x04 -#define VFLAG 0x08 -#define QFLAG 0x10 -#define MFLAG 0x20 -#define RFLAG 0x40 -#define PPFLAG 0x80 -#define VVFLAG 0x100 -#define SFLAG 0x200 -#define SSFLAG 0x400 +#define LFLAG 0x0001 +#define PFLAG 0x0002 +#define FFLAG 0x0004 +#define VFLAG 0x0008 +#define QFLAG 0x0010 +#define MFLAG 0x0020 +#define RFLAG 0x0040 +#define PPFLAG 0x0080 +#define VVFLAG 0x0100 +#define SFLAG 0x0200 +#define SSFLAG 0x0400 +#define UFLAG 0x0800 int bind_builtin (list) @@ -96,14 +102,14 @@ bind_builtin (list) FILE *old_rl_outstream; Keymap kmap, saved_keymap; int flags, opt; - char *initfile, *map_name, *fun_name, *remove_seq; + char *initfile, *map_name, *fun_name, *unbind_name, *remove_seq; if (no_line_editing) return (EXECUTION_FAILURE); kmap = saved_keymap = (Keymap) NULL; flags = 0; - initfile = map_name = fun_name = remove_seq = (char *)NULL; + initfile = map_name = fun_name = unbind_name = remove_seq = (char *)NULL; return_code = EXECUTION_SUCCESS; if (!bash_readline_initialized) @@ -116,7 +122,7 @@ bind_builtin (list) rl_outstream = stdout; reset_internal_getopt (); - while ((opt = internal_getopt (list, "lvpVPsSf:q:m:r:")) != EOF) + while ((opt = internal_getopt (list, "lvpVPsSf:q:u:m:r:")) != EOF) { switch (opt) { @@ -141,6 +147,10 @@ bind_builtin (list) flags |= QFLAG; fun_name = list_optarg; break; + case 'u': + flags |= UFLAG; + unbind_name = list_optarg; + break; case 'r': flags |= RFLAG; remove_seq = list_optarg; @@ -220,6 +230,9 @@ bind_builtin (list) if ((flags & QFLAG) && fun_name) return_code = query_bindings (fun_name); + if ((flags & UFLAG) && unbind_name) + return_code = unbind_command (unbind_name); + if ((flags & RFLAG) && remove_seq) { if (rl_set_key (remove_seq, (Function *)NULL, rl_get_keymap ()) != 0) @@ -253,7 +266,7 @@ query_bindings (name) int j; function = rl_named_function (name); - if (!function) + if (function == 0) { builtin_error ("unknown function name `%s'", name); return EXECUTION_FAILURE; @@ -275,4 +288,21 @@ query_bindings (name) free_array (keyseqs); return EXECUTION_SUCCESS; } + +static int +unbind_command (name) + char *name; +{ + Function *function; + + function = rl_named_function (name); + if (function == 0) + { + builtin_error ("unknown function name `%s'", name); + return EXECUTION_FAILURE; + } + + rl_unbind_function_in_map (function, rl_get_keymap ()); + return EXECUTION_SUCCESS; +} #endif /* READLINE */ |