0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

patch 9.0.0342: ":wincmd =" equalizes in two directions

Problem:    ":wincmd =" equalizes in two directions.
Solution:   Make ":vertical wincmd =" equalize vertically only and
            ":horizontal wincmd =" equalize horizontally only.
This commit is contained in:
Bram Moolenaar
2022-08-31 17:49:14 +01:00
parent 92a3d20682
commit 21c3a80a7f
8 changed files with 99 additions and 33 deletions

View 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;

View 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),

View 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;

View 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

View File

@@ -707,6 +707,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
342,
/**/
341,
/**/

View File

@@ -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()

View 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