# HG changeset patch # User Bram Moolenaar # Date 1421246856 -3600 # Node ID cba15023c40371ed51ee0ed50fbdf23d6860f0ba # Parent 3a9ebf9c8d38468c6a2edace2537e885e0df80ec updated for version 7.4.572 Problem: Address type of :wincmd depends on the argument. Solution: Check the argument. diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2130,22 +2130,23 @@ do_one_cmd(cmdlinep, sourcing, * is equal to the lower. */ - if (ea.cmdidx != CMD_SIZE -#ifdef FEAT_USR_CMDS - && ea.cmdidx != CMD_USER - && ea.cmdidx != CMD_USER_BUF -#endif - ) - ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type; - else -#ifdef FEAT_USR_CMDS - if (ea.cmdidx != CMD_USER && ea.cmdidx != CMD_USER_BUF) -#endif - ea.addr_type = ADDR_LINES; /* ea.addr_type for user commands is set by find_ucmd */ - ea.cmd = cmd; + if (!IS_USER_CMDIDX(ea.cmdidx)) + { + if (ea.cmdidx != CMD_SIZE) + ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type; + else + ea.addr_type = ADDR_LINES; + +#ifdef FEAT_WINDOWS + /* :wincmd range depends on the argument. */ + if (ea.cmdidx == CMD_wincmd) + get_wincmd_addr_type(p, &ea); +#endif + } /* repeat for all ',' or ';' separated addresses */ + ea.cmd = cmd; for (;;) { ea.line1 = ea.line2; @@ -2181,7 +2182,6 @@ do_one_cmd(cmdlinep, sourcing, { if (*ea.cmd == '%') /* '%' - all lines */ { - buf_T *buf; ++ea.cmd; switch (ea.addr_type) { @@ -2190,15 +2190,20 @@ do_one_cmd(cmdlinep, sourcing, ea.line2 = curbuf->b_ml.ml_line_count; break; case ADDR_LOADED_BUFFERS: - buf = firstbuf; - while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL) - buf = buf->b_next; - ea.line1 = buf->b_fnum; - buf = lastbuf; - while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL) - buf = buf->b_prev; - ea.line2 = buf->b_fnum; - break; + { + buf_T *buf = firstbuf; + + while (buf->b_next != NULL + && buf->b_ml.ml_mfp == NULL) + buf = buf->b_next; + ea.line1 = buf->b_fnum; + buf = lastbuf; + while (buf->b_prev != NULL + && buf->b_ml.ml_mfp == NULL) + buf = buf->b_prev; + ea.line2 = buf->b_fnum; + break; + } case ADDR_BUFFERS: ea.line1 = firstbuf->b_fnum; ea.line2 = lastbuf->b_fnum; diff --git a/src/proto/window.pro b/src/proto/window.pro --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -1,5 +1,6 @@ /* window.c */ void do_window __ARGS((int nchar, long Prenum, int xchar)); +void get_wincmd_addr_type __ARGS((char_u *arg, exarg_T *eap)); int win_split __ARGS((int size, int flags)); int win_split_ins __ARGS((int size, int flags, win_T *new_wp, int dir)); int win_valid __ARGS((win_T *win)); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 572, +/**/ 571, /**/ 570, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -624,6 +624,110 @@ wingotofile: } } +/* + * Figure out the address type for ":wnncmd". + */ + void +get_wincmd_addr_type(arg, eap) + char_u *arg; + exarg_T *eap; +{ + switch (*arg) + { + case 'S': + case Ctrl_S: + case 's': + case Ctrl_N: + case 'n': + case 'j': + case Ctrl_J: + case 'k': + case Ctrl_K: + case 'T': + case Ctrl_R: + case 'r': + case 'R': + case 'K': + case 'J': + case '+': + case '-': + case Ctrl__: + case '_': + case '|': + case ']': + case Ctrl_RSB: + case 'g': + case Ctrl_G: +#ifdef FEAT_VERTSPLIT + case Ctrl_V: + case 'v': + case 'h': + case Ctrl_H: + case 'l': + case Ctrl_L: + case 'H': + case 'L': + case '>': + case '<': +#endif +#if defined(FEAT_QUICKFIX) + case '}': +#endif +#ifdef FEAT_SEARCHPATH + case 'f': + case 'F': + case Ctrl_F: +#endif +#ifdef FEAT_FIND_ID + case 'i': + case Ctrl_I: + case 'd': + case Ctrl_D: +#endif + /* window size or any count */ + eap->addr_type = ADDR_LINES; + break; + + case Ctrl_HAT: + case '^': + /* buffer number */ + eap->addr_type = ADDR_BUFFERS; + break; + + case Ctrl_Q: + case 'q': + case Ctrl_C: + case 'c': + case Ctrl_O: + case 'o': + case Ctrl_W: + case 'w': + case 'W': + case 'x': + case Ctrl_X: + /* window number */ + eap->addr_type = ADDR_WINDOWS; + break; + +#if defined(FEAT_QUICKFIX) + case Ctrl_Z: + case 'z': + case 'P': +#endif + case 't': + case Ctrl_T: + case 'b': + case Ctrl_B: + case 'p': + case Ctrl_P: + case '=': + case CAR: + /* no count */ + eap->addr_type = 0; + break; + } +} + static void cmd_with_count(cmd, bufp, bufsize, Prenum) char *cmd;