# HG changeset patch # User Bram Moolenaar # Date 1556140505 -7200 # Node ID c1c25e2523a60cc869be23c93d5b0af3a761b811 # Parent 2c0a4e3a41e842c3907bd447c6d177c8a2fdc37b patch 8.1.1201: output of :command is hard to read commit https://github.com/vim/vim/commit/725310d89e1ba268bf410472b7de054c6c260161 Author: Bram Moolenaar 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. diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- 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)) { diff --git a/src/getchar.c b/src/getchar.c --- 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); } } diff --git a/src/menu.c b/src/menu.c --- 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("", HL_ATTR(HLF_8)); else - msg_outtrans_special(menu->strings[bit], FALSE); + msg_outtrans_special(menu->strings[bit], FALSE, 0); } } else diff --git a/src/message.c b/src/message.c --- 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); diff --git a/src/proto/message.pro b/src/proto/message.pro --- 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); diff --git a/src/version.c b/src/version.c --- 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,