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 -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.