mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Add support for custom command aliases, this is an array option which
contains items of the form "alias=command". This is consulted when an unknown command is parsed.
This commit is contained in:
		
							
								
								
									
										15
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								client.c
									
									
									
									
									
								
							| @@ -252,16 +252,13 @@ client_main(struct event_base *base, int argc, char **argv, int flags, | |||||||
| 		 * flag. | 		 * flag. | ||||||
| 		 */ | 		 */ | ||||||
| 		cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause); | 		cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause); | ||||||
| 		if (cmdlist == NULL) { | 		if (cmdlist != NULL) { | ||||||
| 			fprintf(stderr, "%s\n", cause); | 			TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { | ||||||
| 			return (1); | 				if (cmd->entry->flags & CMD_STARTSERVER) | ||||||
|  | 					cmdflags |= CMD_STARTSERVER; | ||||||
|  | 			} | ||||||
|  | 			cmd_list_free(cmdlist); | ||||||
| 		} | 		} | ||||||
| 		cmdflags &= ~CMD_STARTSERVER; |  | ||||||
| 		TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { |  | ||||||
| 			if (cmd->entry->flags & CMD_STARTSERVER) |  | ||||||
| 				cmdflags |= CMD_STARTSERVER; |  | ||||||
| 		} |  | ||||||
| 		cmd_list_free(cmdlist); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Create client process structure (starts logging). */ | 	/* Create client process structure (starts logging). */ | ||||||
|   | |||||||
							
								
								
									
										94
									
								
								cmd-string.c
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								cmd-string.c
									
									
									
									
									
								
							| @@ -54,17 +54,15 @@ cmd_string_ungetc(size_t *p) | |||||||
| 	(*p)--; | 	(*p)--; | ||||||
| } | } | ||||||
|  |  | ||||||
| struct cmd_list * | int | ||||||
| cmd_string_parse(const char *s, const char *file, u_int line, char **cause) | cmd_string_split(const char *s, int *rargc, char ***rargv) | ||||||
| { | { | ||||||
| 	size_t		  p = 0; | 	size_t		p = 0; | ||||||
| 	int		  ch, i, argc = 0; | 	int		ch, argc = 0, append = 0; | ||||||
| 	char		**argv = NULL, *buf = NULL, *t; | 	char	      **argv = NULL, *buf = NULL, *t; | ||||||
| 	const char	 *whitespace, *equals; | 	const char     *whitespace, *equals; | ||||||
| 	size_t		  len = 0; | 	size_t		len = 0; | ||||||
| 	struct cmd_list	 *cmdlist = NULL; |  | ||||||
|  |  | ||||||
| 	*cause = NULL; |  | ||||||
| 	for (;;) { | 	for (;;) { | ||||||
| 		ch = cmd_string_getc(s, &p); | 		ch = cmd_string_getc(s, &p); | ||||||
| 		switch (ch) { | 		switch (ch) { | ||||||
| @@ -115,43 +113,67 @@ cmd_string_parse(const char *s, const char *file, u_int line, char **cause) | |||||||
| 				argc--; | 				argc--; | ||||||
| 				memmove(argv, argv + 1, argc * (sizeof *argv)); | 				memmove(argv, argv + 1, argc * (sizeof *argv)); | ||||||
| 			} | 			} | ||||||
| 			if (argc == 0) | 			goto done; | ||||||
| 				goto out; |  | ||||||
|  |  | ||||||
| 			cmdlist = cmd_list_parse(argc, argv, file, line, cause); |  | ||||||
| 			goto out; |  | ||||||
| 		case '~': | 		case '~': | ||||||
| 			if (buf == NULL) { | 			if (buf != NULL) { | ||||||
| 				t = cmd_string_expand_tilde(s, &p); | 				append = 1; | ||||||
| 				if (t == NULL) |  | ||||||
| 					goto error; |  | ||||||
| 				cmd_string_copy(&buf, t, &len); |  | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			/* FALLTHROUGH */ | 			t = cmd_string_expand_tilde(s, &p); | ||||||
| 		default: | 			if (t == NULL) | ||||||
| 			if (len >= SIZE_MAX - 2) |  | ||||||
| 				goto error; | 				goto error; | ||||||
|  | 			cmd_string_copy(&buf, t, &len); | ||||||
| 			buf = xrealloc(buf, len + 1); | 			break; | ||||||
| 			buf[len++] = ch; | 		default: | ||||||
|  | 			append = 1; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
|  | 		if (append) { | ||||||
|  | 			if (len >= SIZE_MAX - 2) | ||||||
|  | 				goto error; | ||||||
|  | 			buf = xrealloc(buf, len + 1); | ||||||
|  | 			buf[len++] = ch; | ||||||
|  | 		} | ||||||
|  | 		append = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | done: | ||||||
|  | 	*rargc = argc; | ||||||
|  | 	*rargv = argv; | ||||||
|  |  | ||||||
|  | 	free(buf); | ||||||
|  | 	return (0); | ||||||
|  |  | ||||||
|  | error: | ||||||
|  | 	if (argv != NULL) | ||||||
|  | 		cmd_free_argv(argc, argv); | ||||||
|  | 	free(buf); | ||||||
|  | 	return (-1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | struct cmd_list * | ||||||
|  | cmd_string_parse(const char *s, const char *file, u_int line, char **cause) | ||||||
|  | { | ||||||
|  | 	struct cmd_list	 *cmdlist = NULL; | ||||||
|  | 	int		  argc; | ||||||
|  | 	char		**argv; | ||||||
|  |  | ||||||
|  | 	*cause = NULL; | ||||||
|  | 	if (cmd_string_split(s, &argc, &argv) != 0) | ||||||
|  | 		goto error; | ||||||
|  | 	if (argc != 0) { | ||||||
|  | 		cmdlist = cmd_list_parse(argc, argv, file, line, cause); | ||||||
|  | 		if (cmdlist == NULL) { | ||||||
|  | 			cmd_free_argv(argc, argv); | ||||||
|  | 			goto error; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	cmd_free_argv(argc, argv); | ||||||
|  | 	return (cmdlist); | ||||||
|  |  | ||||||
| error: | error: | ||||||
| 	xasprintf(cause, "invalid or unknown command: %s", s); | 	xasprintf(cause, "invalid or unknown command: %s", s); | ||||||
|  | 	return (NULL); | ||||||
| out: |  | ||||||
| 	free(buf); |  | ||||||
|  |  | ||||||
| 	if (argv != NULL) { |  | ||||||
| 		for (i = 0; i < argc; i++) |  | ||||||
| 			free(argv[i]); |  | ||||||
| 		free(argv); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return (cmdlist); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
|   | |||||||
| @@ -383,7 +383,7 @@ key_bindings_init(void) | |||||||
| 	for (i = 0; i < nitems(defaults); i++) { | 	for (i = 0; i < nitems(defaults); i++) { | ||||||
| 		cmdlist = cmd_string_parse(defaults[i], "<default>", i, &cause); | 		cmdlist = cmd_string_parse(defaults[i], "<default>", i, &cause); | ||||||
| 		if (cmdlist == NULL) | 		if (cmdlist == NULL) | ||||||
| 			fatalx("bad default key"); | 			fatalx("bad default key: %s", defaults[i]); | ||||||
| 		cmdq_append(NULL, cmdq_get_command(cmdlist, NULL, NULL, 0)); | 		cmdq_append(NULL, cmdq_get_command(cmdlist, NULL, NULL, 0)); | ||||||
| 		cmd_list_free(cmdlist); | 		cmd_list_free(cmdlist); | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								pty.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pty.c
									
									
									
									
									
								
							| @@ -45,7 +45,7 @@ pty_fork(int ptmfd, int *fd, char *name, size_t namelen, struct winsize *ws) | |||||||
| 	struct ptmget	ptm; | 	struct ptmget	ptm; | ||||||
| 	pid_t		pid; | 	pid_t		pid; | ||||||
|  |  | ||||||
| 	if ((ioctl(ptmfd, PTMGET, &ptm) == -1)) | 	if (ioctl(ptmfd, PTMGET, &ptm) == -1) | ||||||
| 		return (-1); | 		return (-1); | ||||||
|  |  | ||||||
| 	strlcpy(name, ptm.sn, namelen); | 	strlcpy(name, ptm.sn, namelen); | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -2410,6 +2410,30 @@ Available server options are: | |||||||
| Set the number of buffers; as new buffers are added to the top of the stack, | Set the number of buffers; as new buffers are added to the top of the stack, | ||||||
| old ones are removed from the bottom if necessary to maintain this maximum | old ones are removed from the bottom if necessary to maintain this maximum | ||||||
| length. | length. | ||||||
|  | .It Xo Ic command-alias[] | ||||||
|  | .Ar name=value | ||||||
|  | .Xc | ||||||
|  | This is an array of custom aliases for commands. | ||||||
|  | If an unknown command matches | ||||||
|  | .Ar name , | ||||||
|  | it is replaced with | ||||||
|  | .Ar value . | ||||||
|  | For example, after: | ||||||
|  | .Pp | ||||||
|  | .Dl set -s command-alias[2] zoom='resize-pane -Z' | ||||||
|  | .Pp | ||||||
|  | Using: | ||||||
|  | .Pp | ||||||
|  | .Dl zoom -t:.1 | ||||||
|  | .Pp | ||||||
|  | Is equivalent to: | ||||||
|  | .Pp | ||||||
|  | .Dl resize-pane -Z -t:.1 | ||||||
|  | .Pp | ||||||
|  | Note that aliases are expanded when a command is parsed rather than when it is | ||||||
|  | executed, so binding an alias with | ||||||
|  | .Ic bind-key | ||||||
|  | will bind the expanded form. | ||||||
| .It Ic default-terminal Ar terminal | .It Ic default-terminal Ar terminal | ||||||
| Set the default terminal for new windows created in this session - the | Set the default terminal for new windows created in this session - the | ||||||
| default value of the | default value of the | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1828,6 +1828,7 @@ void printflike(2, 3) cmdq_print(struct cmdq_item *, const char *, ...); | |||||||
| void printflike(2, 3) cmdq_error(struct cmdq_item *, const char *, ...); | void printflike(2, 3) cmdq_error(struct cmdq_item *, const char *, ...); | ||||||
|  |  | ||||||
| /* cmd-string.c */ | /* cmd-string.c */ | ||||||
|  | int		 cmd_string_split(const char *, int *, char ***); | ||||||
| struct cmd_list	*cmd_string_parse(const char *, const char *, u_int, char **); | struct cmd_list	*cmd_string_parse(const char *, const char *, u_int, char **); | ||||||
|  |  | ||||||
| /* cmd-wait-for.c */ | /* cmd-wait-for.c */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm