]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0342: ":wincmd =" equalizes in two directions v9.0.0342
authorBram Moolenaar <Bram@vim.org>
Wed, 31 Aug 2022 16:49:14 +0000 (17:49 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 31 Aug 2022 16:49:14 +0000 (17:49 +0100)
Problem:    ":wincmd =" equalizes in two directions.
Solution:   Make ":vertical wincmd =" equalize vertically only and
            ":horizontal wincmd =" equalize horizontally only.

runtime/doc/windows.txt
src/ex_cmdidxs.h
src/ex_cmds.h
src/ex_docmd.c
src/testdir/test_window_cmd.vim
src/version.c
src/vim.h
src/window.c

index 13f648f1919186e08645a4106266d41f96371921..32ec10211fb4ca1ac45d5b7da116e597f3cf90f4 100644 (file)
@@ -256,9 +256,16 @@ and 'winminwidth' are relevant.
                                                *:vert* *:vertical*
 :vert[ical] {cmd}
                Execute {cmd}.  If it contains a command that splits a window,
-               it will be split vertically.
+               it will be split vertically.  For `vertical wincmd =` windows
+               will be equialized only vertically.
                Doesn't work for |:execute| and |:normal|.
 
+                                               *:hor* *:horizontal*
+:hor[izontal] {cmd}
+               Execute {cmd}.  Currently only makes a difference for
+               `horizontal wincmd =`, which will equal windows only
+               horizontally.
+
 :lefta[bove] {cmd}                             *:lefta* *:leftabove*
 :abo[veleft] {cmd}                             *:abo* *:aboveleft*
                Execute {cmd}.  If it contains a command that splits a window,
@@ -553,6 +560,10 @@ CTRL-W =   Make all windows (almost) equally high and wide, but use
                'winheight' and 'winwidth' for the current window.
                Windows with 'winfixheight' set keep their height and windows
                with 'winfixwidth' set keep their width.
+               To equalize only vertically (make window equally high) use
+               `vertical wincmd =`
+               To equalize only horizontally (make window equally wide) use
+               `horizontal wincmd =`
 
 :res[ize] -N                                   *:res* *:resize* *CTRL-W_-*
 CTRL-W -       Decrease current window height by N (default 1).
index fe5ca9b5ddb0cb9ba7a71770be33fcac4fb19d9a..065bf056f5ca893a645b492e4c182e62d509e8c9 100644 (file)
@@ -13,24 +13,24 @@ static const unsigned short cmdidxs1[26] =
   /* f */ 166,
   /* g */ 183,
   /* h */ 189,
-  /* i */ 198,
-  /* j */ 218,
-  /* k */ 220,
-  /* l */ 225,
-  /* m */ 288,
-  /* n */ 306,
-  /* o */ 326,
-  /* p */ 338,
-  /* q */ 377,
-  /* r */ 380,
-  /* s */ 400,
-  /* t */ 470,
-  /* u */ 516,
-  /* v */ 527,
-  /* w */ 548,
-  /* x */ 562,
-  /* y */ 572,
-  /* z */ 573
+  /* i */ 199,
+  /* j */ 219,
+  /* k */ 221,
+  /* l */ 226,
+  /* m */ 289,
+  /* n */ 307,
+  /* o */ 327,
+  /* p */ 339,
+  /* q */ 378,
+  /* r */ 381,
+  /* s */ 401,
+  /* t */ 471,
+  /* u */ 517,
+  /* v */ 528,
+  /* w */ 549,
+  /* x */ 563,
+  /* y */ 573,
+  /* z */ 574
 };
 
 /*
@@ -48,7 +48,7 @@ static const unsigned char cmdidxs2[26][26] =
   /* e */ {  1,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  9, 11, 12,  0,  0,  0,  0,  0,  0,  0, 23,  0, 24,  0,  0 },
   /* f */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0, 16,  0,  0,  0,  0,  0 },
   /* g */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  2,  0,  0,  4,  5,  0,  0,  0,  0 },
-  /* h */ {  5,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
+  /* h */ {  5,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
   /* i */ {  1,  0,  0,  0,  0,  3,  0,  0,  0,  4,  0,  5,  6,  0,  0,  0,  0,  0, 15,  0, 17,  0,  0,  0,  0,  0 },
   /* j */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0 },
   /* k */ {  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
@@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[26][26] =
   /* 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 = 590;
+static const int command_count = 591;
index 3ebbf232b632e42a865d2e25073a1aa6f3098e9d..8da0da1c9a6444aa62b6c57db368b90a30f5a268 100644 (file)
@@ -707,6 +707,9 @@ EXCMD(CMD_hide,             "hide",         ex_hide,
 EXCMD(CMD_history,     "history",      ex_history,
        EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
+EXCMD(CMD_horizontal,  "horizontal",   ex_wrongmodifier,
+       EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM,
+       ADDR_NONE),
 EXCMD(CMD_insert,      "insert",       ex_append,
        EX_BANG|EX_RANGE|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY,
        ADDR_LINES),
index 0d52f58e62d16c0c41dba971037f47b22642fd35..681ab2ca2b63d175e8f39cf31f173b4dbab24d53 100644 (file)
@@ -2987,8 +2987,13 @@ parse_command_modifiers(
                            continue;
                        }
 
+           case 'h':   if (checkforcmd_noparen(&eap->cmd, "horizontal", 3))
+                       {
+                           cmod->cmod_split |= WSP_HOR;
+                           continue;
+                       }
                        // ":hide" and ":hide | cmd" are not modifiers
-           case 'h':   if (p != eap->cmd || !checkforcmd_noparen(&p, "hide", 3)
+                       if (p != eap->cmd || !checkforcmd_noparen(&p, "hide", 3)
                                               || *p == NUL || ends_excmd(*p))
                            break;
                        eap->cmd = p;
index 04a5d1058d73d1579357608389ac9a2e9ba8651b..bea612f2367fde2b3c90cb776afab39394a2ccc4 100644 (file)
@@ -367,6 +367,46 @@ func Test_window_height()
   bw Xa Xb Xc
 endfunc
 
+func Test_wincmd_equal()
+  edit Xone
+  below split Xtwo
+  rightbelow vsplit Xthree
+  call assert_equal('Xone', bufname(winbufnr(1)))
+  call assert_equal('Xtwo', bufname(winbufnr(2)))
+  call assert_equal('Xthree', bufname(winbufnr(3)))
+
+  " Xone and Xtwo should be about the same height
+  let [wh1, wh2] = [winheight(1), winheight(2)]
+  call assert_inrange(wh1 - 1, wh1 + 1, wh2)
+  " Xtwo and Xthree should be about the same width
+  let [ww2, ww3] = [winwidth(2), winwidth(3)]
+  call assert_inrange(ww2 - 1, ww2 + 1, ww3)
+
+  1wincmd w
+  10wincmd _
+  2wincmd w
+  20wincmd |
+  call assert_equal(10, winheight(1))
+  call assert_equal(20, winwidth(2))
+
+  " equalizing horizontally doesn't change the heights
+  hor wincmd =
+  call assert_equal(10, winheight(1))
+  let [ww2, ww3] = [winwidth(2), winwidth(3)]
+  call assert_inrange(ww2 - 1, ww2 + 1, ww3)
+
+  2wincmd w
+  20wincmd |
+  call assert_equal(20, winwidth(2))
+  " equalizing vertically doesn't change the widths
+  vert wincmd =
+  call assert_equal(20, winwidth(2))
+  let [wh1, wh2] = [winheight(1), winheight(2)]
+  call assert_inrange(wh1 - 1, wh1 + 1, wh2)
+
+  bwipe Xone Xtwo Xthree
+endfunc
+
 func Test_window_width()
   e Xa
   vsplit Xb
index 2db1aa65cb21b567027221c29b9ff8ca6126db77..68f7baa720056bd05d4b8c100e37c5811f4d5226 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    342,
 /**/
     341,
 /**/
index 05b663237d485698137ebfea6ae36ebfbf29e68f..54a858a5c94d10737f075c09a051cc5f167208be 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -1209,14 +1209,15 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 /*
  * arguments for win_split()
  */
-#define WSP_ROOM       1       // require enough room
-#define WSP_VERT       2       // split vertically
-#define WSP_TOP                4       // window at top-left of shell
-#define WSP_BOT                8       // window at bottom-right of shell
-#define WSP_HELP       16      // creating the help window
-#define WSP_BELOW      32      // put new window below/right
-#define WSP_ABOVE      64      // put new window above/left
-#define WSP_NEWLOC     128     // don't copy location list
+#define WSP_ROOM       0x01    // require enough room
+#define WSP_VERT       0x02    // split/equalize vertically
+#define WSP_HOR                0x04    // equalize horizontally
+#define WSP_TOP                0x08    // window at top-left of shell
+#define WSP_BOT                0x10    // window at bottom-right of shell
+#define WSP_HELP       0x20    // creating the help window
+#define WSP_BELOW      0x40    // put new window below/right
+#define WSP_ABOVE      0x80    // put new window above/left
+#define WSP_NEWLOC     0x100   // don't copy location list
 
 /*
  * arguments for gui_set_shellsize()
index 65dec1008ddb7778605aaf162afd7b411b86fc90..36327350bda2c5de03a18ca60be12a78bee40680 100644 (file)
@@ -434,12 +434,16 @@ newwindow:
                        | ((nchar == 'H' || nchar == 'K') ? WSP_TOP : WSP_BOT));
                break;
 
-// make all windows the same height
+// make all windows the same width and/or height
     case '=':
+               {
+                   int mod = cmdmod.cmod_split & (WSP_VERT | WSP_HOR);
 #ifdef FEAT_GUI
-               need_mouse_correct = TRUE;
+                   need_mouse_correct = TRUE;
 #endif
-               win_equal(NULL, FALSE, 'b');
+                   win_equal(NULL, FALSE,
+                          mod == WSP_VERT ? 'v' : mod == WSP_HOR ? 'h' : 'b');
+               }
                break;
 
 // increase current window height