changeset 16393:c1c25e2523a6 v8.1.1201

patch 8.1.1201: output of :command is hard to read commit https://github.com/vim/vim/commit/725310d89e1ba268bf410472b7de054c6c260161 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Apr 24 23:08:23 2019 +0200 patch 8.1.1201: output of :command is hard to read Problem: Output of :command is hard to read. Solution: Make some columns wider, some narrower. Truncate the command when listing all.
author Bram Moolenaar <Bram@vim.org>
date Wed, 24 Apr 2019 23:15:05 +0200
parents 2c0a4e3a41e8
children 84c427d55b47
files src/ex_docmd.c src/getchar.c src/menu.c src/message.c src/proto/message.pro src/version.c
diffstat 6 files changed, 63 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -6000,6 +6000,7 @@ uc_list(char_u *name, size_t name_len)
     int		found = FALSE;
     ucmd_T	*cmd;
     int		len;
+    int		over;
     long	a;
     garray_T	*gap;
 
@@ -6019,17 +6020,36 @@ uc_list(char_u *name, size_t name_len)
 
 	    /* Put out the title first time */
 	    if (!found)
-		msg_puts_title(_("\n    Name        Args       Address   Complete  Definition"));
+		msg_puts_title(_("\n    Name              Args Address Complete   Definition"));
 	    found = TRUE;
 	    msg_putchar('\n');
 	    if (got_int)
 		break;
 
-	    /* Special cases */
-	    msg_putchar(a & BANG ? '!' : ' ');
-	    msg_putchar(a & REGSTR ? '"' : ' ');
-	    msg_putchar(gap != &ucmds ? 'b' : ' ');
-	    msg_putchar(' ');
+	    // Special cases
+	    len = 4;
+	    if (a & BANG)
+	    {
+		msg_putchar('!');
+		--len;
+	    }
+	    if (a & REGSTR)
+	    {
+		msg_putchar('"');
+		--len;
+	    }
+	    if (gap != &ucmds)
+	    {
+		msg_putchar('b');
+		--len;
+	    }
+	    if (a & TRLBAR)
+	    {
+		msg_putchar('|');
+		--len;
+	    }
+	    while (len-- > 0)
+		msg_putchar(' ');
 
 	    msg_outtrans_attr(cmd->uc_name, HL_ATTR(HLF_D));
 	    len = (int)STRLEN(cmd->uc_name) + 4;
@@ -6037,30 +6057,33 @@ uc_list(char_u *name, size_t name_len)
 	    do {
 		msg_putchar(' ');
 		++len;
-	    } while (len < 16);
-
+	    } while (len < 22);
+
+	    // "over" is how much longer the name is than the column width for
+	    // the name, we'll try to align what comes after.
+	    over = len - 22;
 	    len = 0;
 
-	    /* Arguments */
+	    // Arguments
 	    switch ((int)(a & (EXTRA|NOSPC|NEEDARG)))
 	    {
-	    case 0:			IObuff[len++] = '0'; break;
-	    case (EXTRA):		IObuff[len++] = '*'; break;
-	    case (EXTRA|NOSPC):		IObuff[len++] = '?'; break;
-	    case (EXTRA|NEEDARG):	IObuff[len++] = '+'; break;
-	    case (EXTRA|NOSPC|NEEDARG): IObuff[len++] = '1'; break;
+		case 0:			    IObuff[len++] = '0'; break;
+		case (EXTRA):		    IObuff[len++] = '*'; break;
+		case (EXTRA|NOSPC):	    IObuff[len++] = '?'; break;
+		case (EXTRA|NEEDARG):	    IObuff[len++] = '+'; break;
+		case (EXTRA|NOSPC|NEEDARG): IObuff[len++] = '1'; break;
 	    }
 
 	    do {
 		IObuff[len++] = ' ';
-	    } while (len < 5);
-
-	    /* Range */
+	    } while (len < 5 - over);
+
+	    // Address / Range
 	    if (a & (RANGE|COUNT))
 	    {
 		if (a & COUNT)
 		{
-		    /* -count=N */
+		    // -count=N
 		    sprintf((char *)IObuff + len, "%ldc", cmd->uc_def);
 		    len += (int)STRLEN(IObuff + len);
 		}
@@ -6068,7 +6091,7 @@ uc_list(char_u *name, size_t name_len)
 		    IObuff[len++] = '%';
 		else if (cmd->uc_def >= 0)
 		{
-		    /* -range=N */
+		    // -range=N
 		    sprintf((char *)IObuff + len, "%ld", cmd->uc_def);
 		    len += (int)STRLEN(IObuff + len);
 		}
@@ -6078,9 +6101,9 @@ uc_list(char_u *name, size_t name_len)
 
 	    do {
 		IObuff[len++] = ' ';
-	    } while (len < 11);
-
-	    /* Address Type */
+	    } while (len < 9 - over);
+
+	    // Address Type
 	    for (j = 0; addr_type_complete[j].expand != -1; ++j)
 		if (addr_type_complete[j].expand != ADDR_LINES
 			&& addr_type_complete[j].expand == cmd->uc_addr_type)
@@ -6092,9 +6115,9 @@ uc_list(char_u *name, size_t name_len)
 
 	    do {
 		IObuff[len++] = ' ';
-	    } while (len < 21);
-
-	    /* Completion */
+	    } while (len < 13 - over);
+
+	    // Completion
 	    for (j = 0; command_complete[j].expand != 0; ++j)
 		if (command_complete[j].expand == cmd->uc_compl)
 		{
@@ -6105,12 +6128,13 @@ uc_list(char_u *name, size_t name_len)
 
 	    do {
 		IObuff[len++] = ' ';
-	    } while (len < 35);
+	    } while (len < 24 - over);
 
 	    IObuff[len] = '\0';
 	    msg_outtrans(IObuff);
 
-	    msg_outtrans_special(cmd->uc_rep, FALSE);
+	    msg_outtrans_special(cmd->uc_rep, FALSE,
+					     name_len == 0 ? Columns - 46 : 0);
 #ifdef FEAT_EVAL
 	    if (p_verbose > 0)
 		last_set_msg(cmd->uc_script_ctx);
@@ -6344,9 +6368,8 @@ ex_command(exarg_T *eap)
     end = p;
     name_len = (int)(end - name);
 
-    /* If there is nothing after the name, and no attributes were specified,
-     * we are listing commands
-     */
+    // If there is nothing after the name, and no attributes were specified,
+    // we are listing commands
     p = skipwhite(end);
     if (!has_attr && ends_excmd(*p))
     {
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -4022,7 +4022,7 @@ showmap(
 	msg_putchar(' ');
 
     /* Display the LHS.  Get length of what we write. */
-    len = msg_outtrans_special(mp->m_keys, TRUE);
+    len = msg_outtrans_special(mp->m_keys, TRUE, 0);
     do
     {
 	msg_putchar(' ');		/* padd with blanks */
@@ -4053,7 +4053,7 @@ showmap(
 	if (s != NULL)
 	{
 	    vim_unescape_csi(s);
-	    msg_outtrans_special(s, FALSE);
+	    msg_outtrans_special(s, FALSE, 0);
 	    vim_free(s);
 	}
     }
--- a/src/menu.c
+++ b/src/menu.c
@@ -1214,7 +1214,7 @@ show_menus_recursive(vimmenu_T *menu, in
 		if (*menu->strings[bit] == NUL)
 		    msg_puts_attr("<Nop>", HL_ATTR(HLF_8));
 		else
-		    msg_outtrans_special(menu->strings[bit], FALSE);
+		    msg_outtrans_special(menu->strings[bit], FALSE, 0);
 	    }
     }
     else
--- a/src/message.c
+++ b/src/message.c
@@ -1594,7 +1594,8 @@ msg_make(char_u *arg)
     int
 msg_outtrans_special(
     char_u	*strstart,
-    int		from)	/* TRUE for lhs of a mapping */
+    int		from,	// TRUE for lhs of a mapping
+    int		maxlen) // screen columns, 0 for unlimeted
 {
     char_u	*str = strstart;
     int		retval = 0;
@@ -1614,6 +1615,8 @@ msg_outtrans_special(
 	else
 	    text = (char *)str2special(&str, from);
 	len = vim_strsize((char_u *)text);
+	if (maxlen > 0 && retval + len >= maxlen)
+	    break;
 	/* Highlight special keys */
 	msg_puts_attr(text, len > 1
 		&& (*mb_ptr2len)((char_u *)text) <= 1 ? attr : 0);
--- a/src/proto/message.pro
+++ b/src/proto/message.pro
@@ -35,7 +35,7 @@ int msg_outtrans_len(char_u *str, int le
 char_u *msg_outtrans_one(char_u *p, int attr);
 int msg_outtrans_len_attr(char_u *msgstr, int len, int attr);
 void msg_make(char_u *arg);
-int msg_outtrans_special(char_u *strstart, int from);
+int msg_outtrans_special(char_u *strstart, int from, int maxlen);
 char_u *str2special_save(char_u *str, int is_lhs);
 char_u *str2special(char_u **sp, int from);
 void str2specialbuf(char_u *sp, char_u *buf, int len);
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1201,
+/**/
     1200,
 /**/
     1199,