4 * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
27 * Bind a key to a command.
30 static enum args_parse_type
cmd_bind_key_args_parse(struct args
*, u_int
,
32 static enum cmd_retval
cmd_bind_key_exec(struct cmd
*,
35 const struct cmd_entry cmd_bind_key_entry
= {
39 .args
= { "nrN:T:", 1, -1, cmd_bind_key_args_parse
},
40 .usage
= "[-nr] [-T key-table] [-N note] key "
41 "[command [arguments]]",
43 .flags
= CMD_AFTERHOOK
,
44 .exec
= cmd_bind_key_exec
47 static enum args_parse_type
48 cmd_bind_key_args_parse(__unused
struct args
*args
, __unused u_int idx
,
49 __unused
char **cause
)
51 return (ARGS_PARSE_COMMANDS_OR_STRING
);
54 static enum cmd_retval
55 cmd_bind_key_exec(struct cmd
*self
, struct cmdq_item
*item
)
57 struct args
*args
= cmd_get_args(self
);
59 const char *tablename
, *note
= args_get(args
, 'N');
60 struct cmd_parse_result
*pr
;
62 struct args_value
*value
;
63 u_int count
= args_count(args
);
65 key
= key_string_lookup_string(args_string(args
, 0));
66 if (key
== KEYC_NONE
|| key
== KEYC_UNKNOWN
) {
67 cmdq_error(item
, "unknown key: %s", args_string(args
, 0));
68 return (CMD_RETURN_ERROR
);
71 if (args_has(args
, 'T'))
72 tablename
= args_get(args
, 'T');
73 else if (args_has(args
, 'n'))
77 repeat
= args_has(args
, 'r');
80 key_bindings_add(tablename
, key
, note
, repeat
, NULL
);
81 return (CMD_RETURN_NORMAL
);
84 value
= args_value(args
, 1);
85 if (count
== 2 && value
->type
== ARGS_COMMANDS
) {
86 key_bindings_add(tablename
, key
, note
, repeat
, value
->cmdlist
);
87 value
->cmdlist
->references
++;
88 return (CMD_RETURN_NORMAL
);
92 pr
= cmd_parse_from_string(args_string(args
, 1), NULL
);
94 pr
= cmd_parse_from_arguments(args_values(args
) + 1, count
- 1,
99 cmdq_error(item
, "%s", pr
->error
);
101 return (CMD_RETURN_ERROR
);
102 case CMD_PARSE_SUCCESS
:
105 key_bindings_add(tablename
, key
, note
, repeat
, pr
->cmdlist
);
106 return (CMD_RETURN_NORMAL
);