| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.572 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.572 |
| Problem: Address type of :wincmd depends on the argument. |
| Solution: Check the argument. |
| Files: src/ex_docmd.c, src/window.c, src/proto/window.pro |
| |
| |
| |
| |
| |
| *** 2130,2151 **** |
| * 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; |
| |
| /* repeat for all ',' or ';' separated addresses */ |
| for (;;) |
| { |
| ea.line1 = ea.line2; |
| --- 2130,2152 ---- |
| * is equal to the lower. |
| */ |
| |
| /* ea.addr_type for user commands is set by find_ucmd */ |
| ! 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,2187 **** |
| { |
| if (*ea.cmd == '%') /* '%' - all lines */ |
| { |
| - buf_T *buf; |
| ++ea.cmd; |
| switch (ea.addr_type) |
| { |
| --- 2182,2187 ---- |
| |
| *** 2190,2204 **** |
| 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; |
| case ADDR_BUFFERS: |
| ea.line1 = firstbuf->b_fnum; |
| ea.line2 = lastbuf->b_fnum; |
| --- 2190,2209 ---- |
| ea.line2 = curbuf->b_ml.ml_line_count; |
| break; |
| case ADDR_LOADED_BUFFERS: |
| ! { |
| ! 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; |
| |
| |
| |
| *** 624,629 **** |
| --- 624,733 ---- |
| } |
| } |
| |
| + /* |
| + * 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; |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 743,744 **** |
| --- 743,746 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 572, |
| /**/ |
| |
| -- |
| From "know your smileys": |
| :^[/ mean-smiley-with-cigarette |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 /// |