mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Final pieces of mode key rebinding: bind-key and unbind-key now accept a -t
argument to modify a table.
This commit is contained in:
		| @@ -18,6 +18,8 @@ | |||||||
|  |  | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
|  |  | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| #include "tmux.h" | #include "tmux.h" | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -29,15 +31,21 @@ int	cmd_bind_key_exec(struct cmd *, struct cmd_ctx *); | |||||||
| void	cmd_bind_key_free(struct cmd *); | void	cmd_bind_key_free(struct cmd *); | ||||||
| size_t	cmd_bind_key_print(struct cmd *, char *, size_t); | size_t	cmd_bind_key_print(struct cmd *, char *, size_t); | ||||||
|  |  | ||||||
|  | int	cmd_bind_key_table(struct cmd *, struct cmd_ctx *); | ||||||
|  |  | ||||||
| struct cmd_bind_key_data { | struct cmd_bind_key_data { | ||||||
| 	int		 key; | 	int		 key; | ||||||
| 	int		 can_repeat; | 	int		 can_repeat; | ||||||
| 	struct cmd_list	*cmdlist; | 	struct cmd_list	*cmdlist; | ||||||
|  |  | ||||||
|  | 	int		 command_key; | ||||||
|  | 	char		*tablename; | ||||||
|  | 	char 		*modecmd; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const struct cmd_entry cmd_bind_key_entry = { | const struct cmd_entry cmd_bind_key_entry = { | ||||||
| 	"bind-key", "bind", | 	"bind-key", "bind", | ||||||
| 	"[-nr] key command [arguments]", | 	"[-cnr] [-t key-table] key command [arguments]", | ||||||
| 	0, 0, | 	0, 0, | ||||||
| 	NULL, | 	NULL, | ||||||
| 	cmd_bind_key_parse, | 	cmd_bind_key_parse, | ||||||
| @@ -55,15 +63,24 @@ cmd_bind_key_parse(struct cmd *self, int argc, char **argv, char **cause) | |||||||
| 	self->data = data = xmalloc(sizeof *data); | 	self->data = data = xmalloc(sizeof *data); | ||||||
| 	data->can_repeat = 0; | 	data->can_repeat = 0; | ||||||
| 	data->cmdlist = NULL; | 	data->cmdlist = NULL; | ||||||
|  | 	data->command_key = 0; | ||||||
|  | 	data->tablename = NULL; | ||||||
|  | 	data->modecmd = NULL; | ||||||
|  |  | ||||||
| 	while ((opt = getopt(argc, argv, "nr")) != -1) { | 	while ((opt = getopt(argc, argv, "cnrt:")) != -1) { | ||||||
| 		switch (opt) { | 		switch (opt) { | ||||||
|  | 		case 'c': | ||||||
|  | 			data->command_key = 1; | ||||||
|  | 			break; | ||||||
| 		case 'n': | 		case 'n': | ||||||
| 			no_prefix = 1; | 			no_prefix = 1; | ||||||
| 			break; | 			break; | ||||||
| 		case 'r': | 		case 'r': | ||||||
| 			data->can_repeat = 1; | 			data->can_repeat = 1; | ||||||
| 			break; | 			break; | ||||||
|  | 		case 't': | ||||||
|  | 			data->tablename = xstrdup(optarg); | ||||||
|  | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			goto usage; | 			goto usage; | ||||||
| 		} | 		} | ||||||
| @@ -82,8 +99,14 @@ cmd_bind_key_parse(struct cmd *self, int argc, char **argv, char **cause) | |||||||
|  |  | ||||||
| 	argc--; | 	argc--; | ||||||
| 	argv++; | 	argv++; | ||||||
|  | 	if (data->tablename != NULL) { | ||||||
|  | 		if (argc != 1) | ||||||
|  | 			goto usage; | ||||||
|  | 		data->modecmd = xstrdup(argv[0]); | ||||||
|  | 	} else { | ||||||
| 		if ((data->cmdlist = cmd_list_parse(argc, argv, cause)) == NULL) | 		if ((data->cmdlist = cmd_list_parse(argc, argv, cause)) == NULL) | ||||||
| 			goto error; | 			goto error; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return (0); | 	return (0); | ||||||
|  |  | ||||||
| @@ -102,6 +125,8 @@ cmd_bind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx) | |||||||
|  |  | ||||||
| 	if (data == NULL) | 	if (data == NULL) | ||||||
| 		return (0); | 		return (0); | ||||||
|  | 	if (data->tablename != NULL) | ||||||
|  | 		return (cmd_bind_key_table(self, ctx)); | ||||||
|  |  | ||||||
| 	key_bindings_add(data->key, data->can_repeat, data->cmdlist); | 	key_bindings_add(data->key, data->can_repeat, data->cmdlist); | ||||||
| 	data->cmdlist = NULL;	/* avoid free */ | 	data->cmdlist = NULL;	/* avoid free */ | ||||||
| @@ -109,6 +134,39 @@ cmd_bind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx) | |||||||
| 	return (0); | 	return (0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | cmd_bind_key_table(struct cmd *self, struct cmd_ctx *ctx) | ||||||
|  | { | ||||||
|  | 	struct cmd_bind_key_data	*data = self->data; | ||||||
|  | 	const struct mode_key_table	*mtab; | ||||||
|  | 	struct mode_key_binding		*mbind, mtmp; | ||||||
|  | 	enum mode_key_cmd		 cmd; | ||||||
|  |  | ||||||
|  | 	if ((mtab = mode_key_findtable(data->tablename)) == NULL) { | ||||||
|  | 		ctx->error(ctx, "unknown key table: %s", data->tablename); | ||||||
|  | 		return (-1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	cmd = mode_key_fromstring(mtab->cmdstr, data->modecmd); | ||||||
|  | 	if (cmd == MODEKEY_NONE) { | ||||||
|  | 		ctx->error(ctx, "unknown command: %s", data->modecmd); | ||||||
|  | 		return (-1); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	mtmp.key = data->key & ~KEYC_PREFIX; | ||||||
|  | 	mtmp.mode = data->command_key ? 1 : 0; | ||||||
|  | 	if ((mbind = SPLAY_FIND(mode_key_tree, mtab->tree, &mtmp)) != NULL) { | ||||||
|  | 		mbind->cmd = cmd; | ||||||
|  | 		return (0); | ||||||
|  | 	} | ||||||
|  | 	mbind = xmalloc(sizeof *mbind); | ||||||
|  | 	mbind->key = mtmp.key; | ||||||
|  | 	mbind->mode = mtmp.mode; | ||||||
|  | 	mbind->cmd = cmd; | ||||||
|  | 	SPLAY_INSERT(mode_key_tree, mtab->tree, mbind); | ||||||
|  | 	return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
| void | void | ||||||
| cmd_bind_key_free(struct cmd *self) | cmd_bind_key_free(struct cmd *self) | ||||||
| { | { | ||||||
| @@ -116,6 +174,10 @@ cmd_bind_key_free(struct cmd *self) | |||||||
|  |  | ||||||
| 	if (data->cmdlist != NULL) | 	if (data->cmdlist != NULL) | ||||||
| 		cmd_list_free(data->cmdlist); | 		cmd_list_free(data->cmdlist); | ||||||
|  | 	if (data->tablename != NULL) | ||||||
|  | 		xfree(data->tablename); | ||||||
|  | 	if (data->modecmd != NULL) | ||||||
|  | 		xfree(data->modecmd); | ||||||
| 	xfree(data); | 	xfree(data); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -92,11 +92,7 @@ cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx) | |||||||
| 	const char			*key, *cmdstr, *mode; | 	const char			*key, *cmdstr, *mode; | ||||||
| 	int			 	 width, keywidth; | 	int			 	 width, keywidth; | ||||||
|  |  | ||||||
| 	for (mtab = mode_key_tables; mtab->name != NULL; mtab++) { | 	if ((mtab = mode_key_findtable(data->target)) == NULL) { | ||||||
| 		if (strcasecmp(data->target, mtab->name) == 0) |  | ||||||
| 			break; |  | ||||||
| 	} |  | ||||||
| 	if (mtab->name == NULL) { |  | ||||||
| 		ctx->error(ctx, "unknown key table: %s", data->target); | 		ctx->error(ctx, "unknown key table: %s", data->target); | ||||||
| 		return (-1); | 		return (-1); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -28,13 +28,18 @@ int	cmd_unbind_key_parse(struct cmd *, int, char **, char **); | |||||||
| int	cmd_unbind_key_exec(struct cmd *, struct cmd_ctx *); | int	cmd_unbind_key_exec(struct cmd *, struct cmd_ctx *); | ||||||
| void	cmd_unbind_key_free(struct cmd *); | void	cmd_unbind_key_free(struct cmd *); | ||||||
|  |  | ||||||
|  | int	cmd_unbind_key_table(struct cmd *, struct cmd_ctx *); | ||||||
|  |  | ||||||
| struct cmd_unbind_key_data { | struct cmd_unbind_key_data { | ||||||
| 	int	key; | 	int	key; | ||||||
|  |  | ||||||
|  | 	int	command_key; | ||||||
|  | 	char   *tablename; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const struct cmd_entry cmd_unbind_key_entry = { | const struct cmd_entry cmd_unbind_key_entry = { | ||||||
| 	"unbind-key", "unbind", | 	"unbind-key", "unbind", | ||||||
| 	"[-n] key", | 	"[-cn] [-t key-table] key", | ||||||
| 	0, 0, | 	0, 0, | ||||||
| 	NULL, | 	NULL, | ||||||
| 	cmd_unbind_key_parse, | 	cmd_unbind_key_parse, | ||||||
| @@ -50,12 +55,20 @@ cmd_unbind_key_parse(struct cmd *self, int argc, char **argv, char **cause) | |||||||
| 	int				 opt, no_prefix = 0; | 	int				 opt, no_prefix = 0; | ||||||
|  |  | ||||||
| 	self->data = data = xmalloc(sizeof *data); | 	self->data = data = xmalloc(sizeof *data); | ||||||
|  | 	data->command_key = 0; | ||||||
|  | 	data->tablename = NULL; | ||||||
|  |  | ||||||
| 	while ((opt = getopt(argc, argv, "n")) != -1) { | 	while ((opt = getopt(argc, argv, "cnt:")) != -1) { | ||||||
| 		switch (opt) { | 		switch (opt) { | ||||||
|  | 		case 'c': | ||||||
|  | 			data->command_key = 1; | ||||||
|  | 			break; | ||||||
| 		case 'n': | 		case 'n': | ||||||
| 			no_prefix = 1; | 			no_prefix = 1; | ||||||
| 			break; | 			break; | ||||||
|  | 		case 't': | ||||||
|  | 			data->tablename = xstrdup(optarg); | ||||||
|  | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			goto usage; | 			goto usage; | ||||||
| 		} | 		} | ||||||
| @@ -89,16 +102,41 @@ cmd_unbind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx) | |||||||
|  |  | ||||||
| 	if (data == NULL) | 	if (data == NULL) | ||||||
| 		return (0); | 		return (0); | ||||||
|  | 	if (data->tablename != NULL) | ||||||
|  | 		return (cmd_unbind_key_table(self, ctx)); | ||||||
|  |  | ||||||
| 	key_bindings_remove(data->key); | 	key_bindings_remove(data->key); | ||||||
|  |  | ||||||
| 	return (0); | 	return (0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | cmd_unbind_key_table(struct cmd *self, struct cmd_ctx *ctx) | ||||||
|  | { | ||||||
|  | 	struct cmd_unbind_key_data	*data = self->data; | ||||||
|  | 	const struct mode_key_table	*mtab; | ||||||
|  | 	struct mode_key_binding		*mbind, mtmp; | ||||||
|  |  | ||||||
|  | 	if ((mtab = mode_key_findtable(data->tablename)) == NULL) { | ||||||
|  | 		ctx->error(ctx, "unknown key table: %s", data->tablename); | ||||||
|  | 		return (-1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	mtmp.key = data->key & ~KEYC_PREFIX; | ||||||
|  | 	mtmp.mode = data->command_key ? 1 : 0; | ||||||
|  | 	if ((mbind = SPLAY_FIND(mode_key_tree, mtab->tree, &mtmp)) != NULL) { | ||||||
|  | 		SPLAY_REMOVE(mode_key_tree, mtab->tree, mbind); | ||||||
|  | 		xfree(mbind); | ||||||
|  | 	} | ||||||
|  | 	return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
| void | void | ||||||
| cmd_unbind_key_free(struct cmd *self) | cmd_unbind_key_free(struct cmd *self) | ||||||
| { | { | ||||||
| 	struct cmd_unbind_key_data	*data = self->data; | 	struct cmd_unbind_key_data	*data = self->data; | ||||||
|  |  | ||||||
|  | 	if (data->tablename != NULL) | ||||||
|  | 		xfree(data->tablename); | ||||||
| 	xfree(data); | 	xfree(data); | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								mode-key.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								mode-key.c
									
									
									
									
									
								
							| @@ -18,6 +18,8 @@ | |||||||
|  |  | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
|  |  | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| #include "tmux.h" | #include "tmux.h" | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -54,6 +56,8 @@ struct mode_key_cmdstr mode_key_cmdstr_edit[] = { | |||||||
| 	{ MODEKEYEDIT_STARTOFLINE, "start-of-line" }, | 	{ MODEKEYEDIT_STARTOFLINE, "start-of-line" }, | ||||||
| 	{ MODEKEYEDIT_SWITCHMODE, "switch-mode" }, | 	{ MODEKEYEDIT_SWITCHMODE, "switch-mode" }, | ||||||
| 	{ MODEKEYEDIT_SWITCHMODEAPPEND, "switch-mode-append" }, | 	{ MODEKEYEDIT_SWITCHMODEAPPEND, "switch-mode-append" }, | ||||||
|  |  | ||||||
|  | 	{ 0, NULL } | ||||||
| }; | }; | ||||||
| 	 | 	 | ||||||
| /* Choice keys command strings. */ | /* Choice keys command strings. */ | ||||||
| @@ -64,6 +68,8 @@ struct mode_key_cmdstr mode_key_cmdstr_choice[] = { | |||||||
| 	{ MODEKEYCHOICE_PAGEDOWN, "page-down" }, | 	{ MODEKEYCHOICE_PAGEDOWN, "page-down" }, | ||||||
| 	{ MODEKEYCHOICE_PAGEUP, "page-up" }, | 	{ MODEKEYCHOICE_PAGEUP, "page-up" }, | ||||||
| 	{ MODEKEYCHOICE_UP, "up" }, | 	{ MODEKEYCHOICE_UP, "up" }, | ||||||
|  |  | ||||||
|  | 	{ 0, NULL } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* Copy keys command strings. */ | /* Copy keys command strings. */ | ||||||
| @@ -83,6 +89,8 @@ struct mode_key_cmdstr mode_key_cmdstr_copy[] = { | |||||||
| 	{ MODEKEYCOPY_STARTOFLINE, "start-of-line" }, | 	{ MODEKEYCOPY_STARTOFLINE, "start-of-line" }, | ||||||
| 	{ MODEKEYCOPY_STARTSELECTION, "begin-selection" }, | 	{ MODEKEYCOPY_STARTSELECTION, "begin-selection" }, | ||||||
| 	{ MODEKEYCOPY_UP, "cursor-up" }, | 	{ MODEKEYCOPY_UP, "cursor-up" }, | ||||||
|  |  | ||||||
|  | 	{ 0, NULL } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* vi editing keys. */ | /* vi editing keys. */ | ||||||
| @@ -278,6 +286,28 @@ mode_key_tostring(struct mode_key_cmdstr *cmdstr, enum mode_key_cmd cmd) | |||||||
| 	return (NULL); | 	return (NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | enum mode_key_cmd | ||||||
|  | mode_key_fromstring(struct mode_key_cmdstr *cmdstr, const char *name) | ||||||
|  | { | ||||||
|  | 	for (; cmdstr->name != NULL; cmdstr++) { | ||||||
|  | 		if (strcasecmp(cmdstr->name, name) == 0) | ||||||
|  | 			return (cmdstr->cmd); | ||||||
|  | 	} | ||||||
|  | 	return (MODEKEY_NONE); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const struct mode_key_table * | ||||||
|  | mode_key_findtable(const char *name) | ||||||
|  | { | ||||||
|  | 	const struct mode_key_table	*mtab; | ||||||
|  | 		 | ||||||
|  | 	for (mtab = mode_key_tables; mtab->name != NULL; mtab++) { | ||||||
|  | 		if (strcasecmp(name, mtab->name) == 0) | ||||||
|  | 			return (mtab); | ||||||
|  | 	} | ||||||
|  | 	return (NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
| void | void | ||||||
| mode_key_init_trees(void) | mode_key_init_trees(void) | ||||||
| { | { | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -352,7 +352,10 @@ and | |||||||
| used in copy and scroll modes. | used in copy and scroll modes. | ||||||
| The tables may be viewed with the | The tables may be viewed with the | ||||||
| .Ic list-keys | .Ic list-keys | ||||||
| command. | command and keys modified or removed with | ||||||
|  | .Ic bind-key | ||||||
|  | and | ||||||
|  | .Ic unbind-key . | ||||||
| .Pp | .Pp | ||||||
| The paste buffer key pastes the first line from the top paste buffer on the | The paste buffer key pastes the first line from the top paste buffer on the | ||||||
| stack. | stack. | ||||||
| @@ -637,7 +640,8 @@ If no server is started, | |||||||
| will attempt to start it; this will fail unless sessions are created in the | will attempt to start it; this will fail unless sessions are created in the | ||||||
| configuration file. | configuration file. | ||||||
| .It Xo Ic bind-key | .It Xo Ic bind-key | ||||||
| .Op Fl nr | .Op Fl cnr | ||||||
|  | .Op Fl t Ar key-table | ||||||
| .Ar key Ar command Op Ar arguments | .Ar key Ar command Op Ar arguments | ||||||
| .Xc | .Xc | ||||||
| .D1 (alias: Ic bind ) | .D1 (alias: Ic bind ) | ||||||
| @@ -652,7 +656,11 @@ or | |||||||
| for Ctrl keys, or | for Ctrl keys, or | ||||||
| .Ql M- | .Ql M- | ||||||
| for Alt (meta) keys. | for Alt (meta) keys. | ||||||
| If | .Pp | ||||||
|  | By default (without | ||||||
|  | .Fl t ) | ||||||
|  | the primary key bindings are modified (those normally activated with the prefix | ||||||
|  | key); in this case, if | ||||||
| .Fl n | .Fl n | ||||||
| is specified, it is not necessary to use the prefix key, | is specified, it is not necessary to use the prefix key, | ||||||
| .Ar command | .Ar command | ||||||
| @@ -664,6 +672,19 @@ The | |||||||
| flag indicates this key may repeat, see the | flag indicates this key may repeat, see the | ||||||
| .Ic repeat-time | .Ic repeat-time | ||||||
| option. | option. | ||||||
|  | .Pp | ||||||
|  | If | ||||||
|  | .Fl t | ||||||
|  | is present, | ||||||
|  | .Ar key | ||||||
|  | is bound in | ||||||
|  | .Ar key-table : | ||||||
|  | the binding for command mode with | ||||||
|  | .Fl c | ||||||
|  | or for normal mode without. | ||||||
|  | To view the default bindings and possible commands, see the | ||||||
|  | .Ic list-keys | ||||||
|  | command. | ||||||
| .It Xo Ic break-pane | .It Xo Ic break-pane | ||||||
| .Op Fl d | .Op Fl d | ||||||
| .Op Fl p Ar pane-index | .Op Fl p Ar pane-index | ||||||
| @@ -866,7 +887,7 @@ List all clients attached to the server. | |||||||
| List the syntax of all commands supported by | List the syntax of all commands supported by | ||||||
| .Nm . | .Nm . | ||||||
| .It Xo Ic list-keys | .It Xo Ic list-keys | ||||||
| .Op Ar Fl t Ar key-table | .Op Fl t Ar key-table | ||||||
| .Xc | .Xc | ||||||
| .D1 (alias: Ic lsk ) | .D1 (alias: Ic lsk ) | ||||||
| List all key bindings. | List all key bindings. | ||||||
| @@ -1665,17 +1686,30 @@ Switch the current session for client | |||||||
| to | to | ||||||
| .Ar target-session . | .Ar target-session . | ||||||
| .It Xo Ic unbind-key | .It Xo Ic unbind-key | ||||||
| .Op Fl n | .Op Fl cn | ||||||
|  | .Op Fl t Ar key-table | ||||||
| .Ar key | .Ar key | ||||||
| .Xc | .Xc | ||||||
| .D1 (alias: Ic unbind ) | .D1 (alias: Ic unbind ) | ||||||
| Unbind the command bound to | Unbind the command bound to | ||||||
| .Ar key . | .Ar key . | ||||||
| If | Without | ||||||
|  | .Fl t | ||||||
|  | the primary key bindings are modified; in this case, if | ||||||
| .Fl n | .Fl n | ||||||
| is specified, the command bound to | is specified, the command bound to | ||||||
| .Ar key | .Ar key | ||||||
| without a prefix (if any) is removed. | without a prefix (if any) is removed. | ||||||
|  | .Pp | ||||||
|  | If | ||||||
|  | .Fl t | ||||||
|  | is present, | ||||||
|  | .Ar key | ||||||
|  | in | ||||||
|  | .Ar key-table | ||||||
|  | is unbound: the binding for command mode with | ||||||
|  | .Fl c | ||||||
|  | or for normal mode without. | ||||||
| .It Xo Ic unlink-window | .It Xo Ic unlink-window | ||||||
| .Op Fl k | .Op Fl k | ||||||
| .Op Fl t Ar target-window | .Op Fl t Ar target-window | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1098,6 +1098,8 @@ extern struct mode_key_tree mode_key_tree_emacs_copy; | |||||||
| int	mode_key_cmp(struct mode_key_binding *, struct mode_key_binding *); | int	mode_key_cmp(struct mode_key_binding *, struct mode_key_binding *); | ||||||
| SPLAY_PROTOTYPE(mode_key_tree, mode_key_binding, entry, mode_key_cmp); | SPLAY_PROTOTYPE(mode_key_tree, mode_key_binding, entry, mode_key_cmp); | ||||||
| const char *mode_key_tostring(struct mode_key_cmdstr *r, enum mode_key_cmd); | const char *mode_key_tostring(struct mode_key_cmdstr *r, enum mode_key_cmd); | ||||||
|  | enum mode_key_cmd mode_key_fromstring(struct mode_key_cmdstr *, const char *); | ||||||
|  | const struct mode_key_table *mode_key_findtable(const char *); | ||||||
| void	mode_key_init_trees(void); | void	mode_key_init_trees(void); | ||||||
| void	mode_key_free_trees(void); | void	mode_key_free_trees(void); | ||||||
| void	mode_key_init(struct mode_key_data *, struct mode_key_tree *); | void	mode_key_init(struct mode_key_data *, struct mode_key_tree *); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nicholas Marriott
					Nicholas Marriott