To: vim_dev@googlegroups.com Subject: Patch 8.0.1738 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1738 Problem: ":args" output is hard to read. Solution: Make columns with the names if the output is more than one line. Files: src/ex_cmds2.c, src/version.c, src/proto/version.pro, src/testdir/test_arglist.vim *** ../vim-8.0.1737/src/ex_cmds2.c 2018-04-18 22:18:18.895174155 +0200 --- src/ex_cmds2.c 2018-04-20 21:16:11.794349543 +0200 *************** *** 2751,2767 **** */ if (ARGCOUNT > 0) { ! /* Overwrite the command, for a short list there is no scrolling ! * required and no wait_return(). */ ! gotocmdline(TRUE); ! for (i = 0; i < ARGCOUNT; ++i) { ! if (i == curwin->w_arg_idx) ! msg_putchar('['); ! msg_outtrans(alist_name(&ARGLIST[i])); ! if (i == curwin->w_arg_idx) ! msg_putchar(']'); ! msg_putchar(' '); } } } --- 2751,2768 ---- */ if (ARGCOUNT > 0) { ! char **items = (char **)alloc(sizeof(char *) * ARGCOUNT); ! ! if (items != NULL) { ! /* Overwrite the command, for a short list there is no ! * scrolling required and no wait_return(). */ ! gotocmdline(TRUE); ! ! for (i = 0; i < ARGCOUNT; ++i) ! items[i] = (char *)alist_name(&ARGLIST[i]); ! list_in_columns(items, ARGCOUNT, curwin->w_arg_idx); ! vim_free(items); } } } *** ../vim-8.0.1737/src/version.c 2018-04-19 21:15:23.492147088 +0200 --- src/version.c 2018-04-20 21:56:08.987145470 +0200 *************** *** 57,63 **** #endif static void list_features(void); - static void version_msg(char *s); static char *(features[]) = { --- 57,62 ---- *************** *** 4295,4329 **** } /* * List all features aligned in columns, dictionary style. */ static void list_features(void) { int i; int ncol; int nrow; ! int nfeat = 0; int width = 0; ! /* Find the length of the longest feature name, use that + 1 as the column ! * width */ ! for (i = 0; features[i] != NULL; ++i) { ! int l = (int)STRLEN(features[i]); if (l > width) width = l; ! ++nfeat; } width += 1; if (Columns < width) { /* Not enough screen columns - show one per line */ ! for (i = 0; features[i] != NULL; ++i) { ! version_msg(features[i]); if (msg_col > 0) msg_putchar('\n'); } --- 4296,4370 ---- } /* + * Output a string for the version message. If it's going to wrap, output a + * newline, unless the message is too long to fit on the screen anyway. + * When "wrap" is TRUE wrap the string in []. + */ + static void + version_msg_wrap(char_u *s, int wrap) + { + int len = (int)vim_strsize(s) + (wrap ? 2 : 0); + + if (!got_int && len < (int)Columns && msg_col + len >= (int)Columns + && *s != '\n') + msg_putchar('\n'); + if (!got_int) + { + if (wrap) + MSG_PUTS("["); + MSG_PUTS(s); + if (wrap) + MSG_PUTS("]"); + } + } + + static void + version_msg(char *s) + { + version_msg_wrap((char_u *)s, FALSE); + } + + /* * List all features aligned in columns, dictionary style. */ static void list_features(void) { + list_in_columns((char_u **)features, -1, -1); + } + + /* + * List string items nicely aligned in columns. + * When "size" is < 0 then the last entry is marked with NULL. + * The entry with index "current" is inclosed in []. + */ + void + list_in_columns(char_u **items, int size, int current) + { int i; int ncol; int nrow; ! int item_count = 0; int width = 0; ! /* Find the length of the longest item, use that + 1 as the column ! * width. */ ! for (i = 0; size < 0 ? items[i] != NULL : i < size; ++i) { ! int l = (int)vim_strsize(items[i]) + (i == current ? 2 : 0); if (l > width) width = l; ! ++item_count; } width += 1; if (Columns < width) { /* Not enough screen columns - show one per line */ ! for (i = 0; items[i] != NULL; ++i) { ! version_msg_wrap(items[i], i == current); if (msg_col > 0) msg_putchar('\n'); } *************** *** 4333,4350 **** /* The rightmost column doesn't need a separator. * Sacrifice it to fit in one more column if possible. */ ncol = (int) (Columns + 1) / width; ! nrow = nfeat / ncol + (nfeat % ncol ? 1 : 0); /* i counts columns then rows. idx counts rows then columns. */ for (i = 0; !got_int && i < nrow * ncol; ++i) { int idx = (i / ncol) + (i % ncol) * nrow; ! if (idx < nfeat) { int last_col = (i + 1) % ncol == 0; ! msg_puts((char_u *)features[idx]); if (last_col) { if (msg_col > 0) --- 4374,4395 ---- /* The rightmost column doesn't need a separator. * Sacrifice it to fit in one more column if possible. */ ncol = (int) (Columns + 1) / width; ! nrow = item_count / ncol + (item_count % ncol ? 1 : 0); /* i counts columns then rows. idx counts rows then columns. */ for (i = 0; !got_int && i < nrow * ncol; ++i) { int idx = (i / ncol) + (i % ncol) * nrow; ! if (idx < item_count) { int last_col = (i + 1) % ncol == 0; ! if (idx == current) ! msg_putchar('['); ! msg_puts(items[idx]); ! if (idx == current) ! msg_putchar(']'); if (last_col) { if (msg_col > 0) *************** *** 4636,4657 **** #endif } - /* - * Output a string for the version message. If it's going to wrap, output a - * newline, unless the message is too long to fit on the screen anyway. - */ - static void - version_msg(char *s) - { - int len = (int)STRLEN(s); - - if (!got_int && len < (int)Columns && msg_col + len >= (int)Columns - && *s != '\n') - msg_putchar('\n'); - if (!got_int) - MSG_PUTS(s); - } - static void do_intro_line(int row, char_u *mesg, int add_version, int attr); /* --- 4681,4686 ---- *** ../vim-8.0.1737/src/proto/version.pro 2016-09-12 13:04:22.000000000 +0200 --- src/proto/version.pro 2018-04-20 21:20:57.292898419 +0200 *************** *** 3,8 **** --- 3,9 ---- int highest_patch(void); int has_patch(int n); void ex_version(exarg_T *eap); + void list_in_columns(char_u **items, int size, int current); void list_version(void); void maybe_intro_message(void); void intro_message(int colon); *** ../vim-8.0.1737/src/testdir/test_arglist.vim 2017-10-27 00:54:59.142125127 +0200 --- src/testdir/test_arglist.vim 2018-04-20 21:52:42.092506889 +0200 *************** *** 122,130 **** call assert_equal(['d', 'c', 'b', 'a', 'c'], g:buffers) redir => result ! ar redir END ! call assert_true(result =~# 'a b \[c] d') .argd call assert_equal(['a', 'b', 'd'], argv()) --- 122,130 ---- call assert_equal(['d', 'c', 'b', 'a', 'c'], g:buffers) redir => result ! args redir END ! call assert_equal('a b [c] d', trim(result)) .argd call assert_equal(['a', 'b', 'd'], argv()) *************** *** 170,175 **** --- 170,203 ---- call assert_fails('argument', 'E163:') endfunc + func Test_list_arguments() + " Clean the argument list + arga a | %argd + + " four args half the screen width makes two lines with two columns + let aarg = repeat('a', &columns / 2 - 4) + let barg = repeat('b', &columns / 2 - 4) + let carg = repeat('c', &columns / 2 - 4) + let darg = repeat('d', &columns / 2 - 4) + exe 'argadd ' aarg barg carg darg + + redir => result + args + redir END + call assert_match('\[' . aarg . '] \+' . carg . '\n' . barg . ' \+' . darg, trim(result)) + + " if one arg is longer than half the screen make one column + exe 'argdel' aarg + let aarg = repeat('a', &columns / 2 + 2) + exe '0argadd' aarg + redir => result + args + redir END + call assert_match(aarg . '\n\[' . barg . ']\n' . carg . '\n' . darg, trim(result)) + + %argdelete + endfunc + " Test for 0argadd and 0argedit " Ported from the test_argument_0count.in test script func Test_zero_argadd() *** ../vim-8.0.1737/src/version.c 2018-04-19 21:15:23.492147088 +0200 --- src/version.c 2018-04-20 21:56:08.987145470 +0200 *************** *** 764,765 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1738, /**/ -- hundred-and-one symptoms of being an internet addict: 236. You start saving URL's in your digital watch. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///