To: vim_dev@googlegroups.com Subject: Patch 8.2.3888 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3888 Problem: The argument list may contain duplicates. Solution: Add the :argdedeupe command. (Nir Lichtman, closes #6235) Files: runtime/doc/editing.txt, runtime/doc/index.txt, src/arglist.c, src/ex_cmdidxs.h, src/ex_cmds.h, src/proto/arglist.pro, src/testdir/test_arglist.vim *** ../vim-8.2.3887/runtime/doc/editing.txt 2021-12-11 12:26:55.920402418 +0000 --- runtime/doc/editing.txt 2021-12-24 20:21:09.878383055 +0000 *************** *** 650,661 **** And after the last one: :+2argadd y a b c x y There is no check for duplicates, it is possible to ! add a file to the argument list twice. ! The currently edited file is not changed. Note: you can also use this method: > :args ## x < This will add the "x" item and sort the new list. :argd[elete] {pattern} .. *:argd* *:argdelete* *E480* *E610* Delete files from the argument list that match the {pattern}s. {pattern} is used like a file pattern, --- 650,668 ---- And after the last one: :+2argadd y a b c x y There is no check for duplicates, it is possible to ! add a file to the argument list twice. You can use ! |:argdedupe| to fix it afterwards: > ! :argadd *.txt | argdedupe ! < The currently edited file is not changed. Note: you can also use this method: > :args ## x < This will add the "x" item and sort the new list. + :argded[upe] *:argded* *:argdedupe* + Remove duplicate filenames from the argument list. + If your current file is a duplicate, your current file + will change to the original file index. + :argd[elete] {pattern} .. *:argd* *:argdelete* *E480* *E610* Delete files from the argument list that match the {pattern}s. {pattern} is used like a file pattern, *** ../vim-8.2.3887/runtime/doc/index.txt 2021-08-31 18:12:47.757554157 +0100 --- runtime/doc/index.txt 2021-12-24 20:15:38.366784362 +0000 *************** *** 1166,1171 **** --- 1166,1172 ---- be remapped |:args| :ar[gs] print the argument list |:argadd| :arga[dd] add items to the argument list + :argdedupe :argdedupe remove duplicates from the argument list |:argdelete| :argd[elete] delete items from the argument list |:argedit| :arge[dit] add item to the argument list and edit it |:argdo| :argdo do a command on all items in the argument list *** ../vim-8.2.3887/src/arglist.c 2021-12-24 18:11:23.065159926 +0000 --- src/arglist.c 2021-12-24 20:22:47.102260843 +0000 *************** *** 759,764 **** --- 759,791 ---- } /* + * ":argdedupe" + */ + void + ex_argdedupe(exarg_T *eap UNUSED) + { + int i; + int j; + + for (i = 0; i < ARGCOUNT; ++i) + for (j = i + 1; j < ARGCOUNT; ++j) + if (fnamecmp(ARGLIST[i].ae_fname, ARGLIST[j].ae_fname) == 0) + { + vim_free(ARGLIST[j].ae_fname); + mch_memmove(ARGLIST + j, ARGLIST + j + 1, + (ARGCOUNT - j - 1) * sizeof(aentry_T)); + --ARGCOUNT; + + if (curwin->w_arg_idx == j) + curwin->w_arg_idx = i; + else if (curwin->w_arg_idx > j) + --curwin->w_arg_idx; + + --j; + } + } + + /* * ":argedit" */ void *** ../vim-8.2.3887/src/ex_cmdidxs.h 2021-06-12 13:52:35.953230564 +0100 --- src/ex_cmdidxs.h 2021-12-24 20:23:30.078206349 +0000 *************** *** 6,36 **** static const unsigned short cmdidxs1[26] = { /* a */ 0, ! /* b */ 20, ! /* c */ 44, ! /* d */ 111, ! /* e */ 136, ! /* f */ 164, ! /* g */ 181, ! /* h */ 187, ! /* i */ 196, ! /* j */ 216, ! /* k */ 218, ! /* l */ 223, ! /* m */ 286, ! /* n */ 304, ! /* o */ 324, ! /* p */ 336, ! /* q */ 375, ! /* r */ 378, ! /* s */ 398, ! /* t */ 468, ! /* u */ 514, ! /* v */ 525, ! /* w */ 546, ! /* x */ 560, ! /* y */ 570, ! /* z */ 571 }; /* --- 6,36 ---- static const unsigned short cmdidxs1[26] = { /* a */ 0, ! /* b */ 21, ! /* c */ 45, ! /* d */ 112, ! /* e */ 137, ! /* f */ 165, ! /* g */ 182, ! /* h */ 188, ! /* i */ 197, ! /* j */ 217, ! /* k */ 219, ! /* l */ 224, ! /* m */ 287, ! /* n */ 305, ! /* o */ 325, ! /* p */ 337, ! /* q */ 376, ! /* r */ 379, ! /* s */ 399, ! /* t */ 469, ! /* u */ 515, ! /* v */ 526, ! /* w */ 547, ! /* x */ 561, ! /* y */ 571, ! /* z */ 572 }; /* *************** *** 41,47 **** */ static const unsigned char cmdidxs2[26][26] = { /* a b c d e f g h i j k l m n o p q r s t u v w x y z */ ! /* a */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 8, 16, 0, 17, 0, 0, 0, 0, 0 }, /* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 }, /* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 38, 41, 47, 57, 59, 60, 61, 0, 63, 0, 66, 0, 0, 0 }, /* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 }, --- 41,47 ---- */ static const unsigned char cmdidxs2[26][26] = { /* a b c d e f g h i j k l m n o p q r s t u v w x y z */ ! /* a */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 8, 17, 0, 18, 0, 0, 0, 0, 0 }, /* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 }, /* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 38, 41, 47, 57, 59, 60, 61, 0, 63, 0, 66, 0, 0, 0 }, /* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 }, *************** *** 69,72 **** /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; ! static const int command_count = 588; --- 69,72 ---- /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; ! static const int command_count = 589; *** ../vim-8.2.3887/src/ex_cmds.h 2021-12-17 12:42:26.833710986 +0000 --- src/ex_cmds.h 2021-12-24 20:15:38.366784362 +0000 *************** *** 148,153 **** --- 148,156 ---- EXCMD(CMD_argdo, "argdo", ex_listdo, EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_RANGE|EX_DFLALL|EX_EXPAND, ADDR_ARGUMENTS), + EXCMD(CMD_argdedupe, "argdedupe", ex_argdedupe, + EX_TRLBAR, + ADDR_NONE), EXCMD(CMD_argedit, "argedit", ex_argedit, EX_BANG|EX_NEEDARG|EX_RANGE|EX_ZEROR|EX_FILES|EX_CMDARG|EX_ARGOPT|EX_TRLBAR, ADDR_ARGUMENTS), *** ../vim-8.2.3887/src/proto/arglist.pro 2019-12-12 11:55:14.000000000 +0000 --- src/proto/arglist.pro 2021-12-24 20:15:38.366784362 +0000 *************** *** 18,23 **** --- 18,24 ---- void ex_argument(exarg_T *eap); void do_argfile(exarg_T *eap, int argn); void ex_next(exarg_T *eap); + void ex_argdedupe(exarg_T *eap); void ex_argedit(exarg_T *eap); void ex_argadd(exarg_T *eap); void ex_argdelete(exarg_T *eap); *** ../vim-8.2.3887/src/testdir/test_arglist.vim 2021-12-24 19:24:39.619189424 +0000 --- src/testdir/test_arglist.vim 2021-12-24 20:15:38.366784362 +0000 *************** *** 416,421 **** --- 416,450 ---- bw! x endfunc + " Test for the :argdedupe command + func Test_argdedupe() + call Reset_arglist() + argdedupe + call assert_equal([], argv()) + args a a a aa b b a b aa + argdedupe + call assert_equal(['a', 'aa', 'b'], argv()) + args a b c + argdedupe + call assert_equal(['a', 'b', 'c'], argv()) + args a + argdedupe + call assert_equal(['a'], argv()) + args a A b B + argdedupe + if has('fname_case') + call assert_equal(['a', 'A', 'b', 'B'], argv()) + else + call assert_equal(['a', 'b'], argv()) + endif + args a b a c a b + last + argdedupe + next + call assert_equal('c', expand('%:t')) + %argd + endfunc + " Test for the :argdelete command func Test_argdelete() call Reset_arglist() *** ../vim-8.2.3887/src/version.c 2021-12-24 19:54:49.216150256 +0000 --- src/version.c 2021-12-24 20:19:22.406516148 +0000 *************** *** 751,752 **** --- 751,754 ---- { /* Add new patch number below this line */ + /**/ + 3888, /**/ -- # echo reboot >universe # chmod +x universe # ./universe /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///