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.
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index e37fdfb..af68a8e 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -6000,6 +6000,7 @@
     int		found = FALSE;
     ucmd_T	*cmd;
     int		len;
+    int		over;
     long	a;
     garray_T	*gap;
 
@@ -6019,17 +6020,36 @@
 
 	    /* 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 @@
 	    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);
+	    } while (len < 5 - over);
 
-	    /* Range */
+	    // 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 @@
 		    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 @@
 
 	    do {
 		IObuff[len++] = ' ';
-	    } while (len < 11);
+	    } while (len < 9 - over);
 
-	    /* Address Type */
+	    // 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 @@
 
 	    do {
 		IObuff[len++] = ' ';
-	    } while (len < 21);
+	    } while (len < 13 - over);
 
-	    /* Completion */
+	    // Completion
 	    for (j = 0; command_complete[j].expand != 0; ++j)
 		if (command_complete[j].expand == cmd->uc_compl)
 		{
@@ -6105,12 +6128,13 @@
 
 	    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 @@
     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))
     {