mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Add utf8_padcstr and use it to align columns in list-keys.
This commit is contained in:
		@@ -18,6 +18,7 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "tmux.h"
 | 
			
		||||
@@ -54,10 +55,9 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
 | 
			
		||||
	struct key_table	*table;
 | 
			
		||||
	struct key_binding	*bd;
 | 
			
		||||
	const char		*key, *tablename, *r;
 | 
			
		||||
	char			 tmp[BUFSIZ];
 | 
			
		||||
	char			*cp, tmp[BUFSIZ];
 | 
			
		||||
	size_t			 used;
 | 
			
		||||
	int			 repeat, width, tablewidth, keywidth;
 | 
			
		||||
	u_int			 i;
 | 
			
		||||
 | 
			
		||||
	if (self->entry == &cmd_list_commands_entry)
 | 
			
		||||
		return (cmd_list_keys_commands(self, cmdq));
 | 
			
		||||
@@ -82,7 +82,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
 | 
			
		||||
			if (bd->can_repeat)
 | 
			
		||||
				repeat = 1;
 | 
			
		||||
 | 
			
		||||
			width = strlen(table->name);
 | 
			
		||||
			width = utf8_cstrwidth(table->name);
 | 
			
		||||
			if (width > tablewidth)
 | 
			
		||||
				tablewidth = width;
 | 
			
		||||
			width = utf8_cstrwidth(key);
 | 
			
		||||
@@ -103,13 +103,20 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
 | 
			
		||||
				r = "-r ";
 | 
			
		||||
			else
 | 
			
		||||
				r = "   ";
 | 
			
		||||
			used = xsnprintf(tmp, sizeof tmp, "%s-T %-*s %s", r,
 | 
			
		||||
			    (int)tablewidth, table->name, key);
 | 
			
		||||
			for (i = 0; i < keywidth - utf8_cstrwidth(key); i++) {
 | 
			
		||||
				if (strlcat(tmp, " ", sizeof tmp) < sizeof tmp)
 | 
			
		||||
					used++;
 | 
			
		||||
			}
 | 
			
		||||
			if (used < sizeof tmp) {
 | 
			
		||||
			xsnprintf(tmp, sizeof tmp, "%s-T ", r);
 | 
			
		||||
 | 
			
		||||
			cp = utf8_padcstr(table->name, tablewidth);
 | 
			
		||||
			strlcat(tmp, cp, sizeof tmp);
 | 
			
		||||
			strlcat(tmp, " ", sizeof tmp);
 | 
			
		||||
			free(cp);
 | 
			
		||||
 | 
			
		||||
			cp = utf8_padcstr(key, keywidth);
 | 
			
		||||
			strlcat(tmp, cp, sizeof tmp);
 | 
			
		||||
			strlcat(tmp, " ", sizeof tmp);
 | 
			
		||||
			free(cp);
 | 
			
		||||
 | 
			
		||||
			used = strlen(tmp);
 | 
			
		||||
			if (used < (sizeof tmp) - 1) {
 | 
			
		||||
				cmd_list_print(bd->cmdlist, tmp + used,
 | 
			
		||||
				    (sizeof tmp) - used);
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -2194,6 +2194,7 @@ struct utf8_data *utf8_fromcstr(const char *);
 | 
			
		||||
char		*utf8_tocstr(struct utf8_data *);
 | 
			
		||||
u_int		 utf8_cstrwidth(const char *);
 | 
			
		||||
char		*utf8_trimcstr(const char *, u_int);
 | 
			
		||||
char		*utf8_padcstr(const char *, u_int);
 | 
			
		||||
 | 
			
		||||
/* procname.c */
 | 
			
		||||
char   *get_proc_name(int, char *);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								utf8.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								utf8.c
									
									
									
									
									
								
							@@ -713,3 +713,24 @@ utf8_trimcstr(const char *s, u_int width)
 | 
			
		||||
	free(tmp);
 | 
			
		||||
	return (out);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Pad UTF-8 string to width. Caller frees. */
 | 
			
		||||
char *
 | 
			
		||||
utf8_padcstr(const char *s, u_int width)
 | 
			
		||||
{
 | 
			
		||||
	size_t	 slen;
 | 
			
		||||
	char	*out;
 | 
			
		||||
	u_int	  n, i;
 | 
			
		||||
 | 
			
		||||
	n = utf8_cstrwidth(s);
 | 
			
		||||
	if (n >= width)
 | 
			
		||||
		return (xstrdup(s));
 | 
			
		||||
 | 
			
		||||
	slen = strlen(s);
 | 
			
		||||
	out = xmalloc(slen + 1 + (width - n));
 | 
			
		||||
	memcpy(out, s, slen);
 | 
			
		||||
	for (i = n; i < width; i++)
 | 
			
		||||
		out[slen++] = ' ';
 | 
			
		||||
	out[slen] = '\0';
 | 
			
		||||
	return (out);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user