mirror of
https://github.com/neovim/neovim.git
synced 2025-09-13 14:58:18 +00:00
vim-patch:7.4.572
Problem: Address type of :wincmd depends on the argument. Solution: Check the argument. https://code.google.com/p/vim/source/detail?r=v7-4-572
This commit is contained in:
@@ -1137,6 +1137,96 @@ static int current_tab_nr(tabpage_T *tab)
|
|||||||
#define CURRENT_TAB_NR current_tab_nr(curtab)
|
#define CURRENT_TAB_NR current_tab_nr(curtab)
|
||||||
#define LAST_TAB_NR current_tab_nr(NULL)
|
#define LAST_TAB_NR current_tab_nr(NULL)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Figure out the address type for ":wincmd".
|
||||||
|
*/
|
||||||
|
static void get_wincmd_addr_type(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:
|
||||||
|
case Ctrl_V:
|
||||||
|
case 'v':
|
||||||
|
case 'h':
|
||||||
|
case Ctrl_H:
|
||||||
|
case 'l':
|
||||||
|
case Ctrl_L:
|
||||||
|
case 'H':
|
||||||
|
case 'L':
|
||||||
|
case '>':
|
||||||
|
case '<':
|
||||||
|
case '}':
|
||||||
|
case 'f':
|
||||||
|
case 'F':
|
||||||
|
case Ctrl_F:
|
||||||
|
case 'i':
|
||||||
|
case Ctrl_I:
|
||||||
|
case 'd':
|
||||||
|
case Ctrl_D:
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
case Ctrl_Z:
|
||||||
|
case 'z':
|
||||||
|
case 'P':
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Execute one Ex command.
|
* Execute one Ex command.
|
||||||
*
|
*
|
||||||
@@ -1420,19 +1510,21 @@ static char_u * do_one_cmd(char_u **cmdlinep,
|
|||||||
* is equal to the lower.
|
* is equal to the lower.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (ea.cmdidx != CMD_SIZE
|
// ea.addr_type for user commands is set by find_ucmd
|
||||||
&& ea.cmdidx != CMD_USER
|
if (!IS_USER_CMDIDX(ea.cmdidx)) {
|
||||||
&& ea.cmdidx != CMD_USER_BUF) {
|
if (ea.cmdidx != CMD_SIZE) {
|
||||||
ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type;
|
ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type;
|
||||||
} else {
|
} else {
|
||||||
if (ea.cmdidx != CMD_USER && ea.cmdidx != CMD_USER_BUF) {
|
|
||||||
ea.addr_type = ADDR_LINES;
|
ea.addr_type = ADDR_LINES;
|
||||||
// ea.addr_type for user commands is set by find_ucmd
|
}
|
||||||
|
// :wincmd range depends on the argument
|
||||||
|
if (ea.cmdidx == CMD_wincmd) {
|
||||||
|
get_wincmd_addr_type(p, &ea);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ea.cmd = cmd;
|
|
||||||
|
|
||||||
/* repeat for all ',' or ';' separated addresses */
|
/* repeat for all ',' or ';' separated addresses */
|
||||||
|
ea.cmd = cmd;
|
||||||
for (;; ) {
|
for (;; ) {
|
||||||
ea.line1 = ea.line2;
|
ea.line1 = ea.line2;
|
||||||
switch (ea.addr_type) {
|
switch (ea.addr_type) {
|
||||||
@@ -1465,20 +1557,25 @@ static char_u * do_one_cmd(char_u **cmdlinep,
|
|||||||
goto doend;
|
goto doend;
|
||||||
if (lnum == MAXLNUM) {
|
if (lnum == MAXLNUM) {
|
||||||
if (*ea.cmd == '%') { /* '%' - all lines */
|
if (*ea.cmd == '%') { /* '%' - all lines */
|
||||||
buf_T *buf;
|
|
||||||
++ea.cmd;
|
++ea.cmd;
|
||||||
switch (ea.addr_type) {
|
switch (ea.addr_type) {
|
||||||
case ADDR_LINES:
|
case ADDR_LINES:
|
||||||
ea.line1 = 1;
|
ea.line1 = 1;
|
||||||
ea.line2 = curbuf->b_ml.ml_line_count;
|
ea.line2 = curbuf->b_ml.ml_line_count;
|
||||||
break;
|
break;
|
||||||
case ADDR_LOADED_BUFFERS:
|
case ADDR_LOADED_BUFFERS: {
|
||||||
buf = firstbuf;
|
buf_T *buf = firstbuf;
|
||||||
while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL) {
|
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;
|
buf = buf->b_prev;
|
||||||
}
|
}
|
||||||
ea.line2 = buf->b_fnum;
|
ea.line2 = buf->b_fnum;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case ADDR_BUFFERS:
|
case ADDR_BUFFERS:
|
||||||
ea.line1 = firstbuf->b_fnum;
|
ea.line1 = firstbuf->b_fnum;
|
||||||
ea.line2 = lastbuf->b_fnum;
|
ea.line2 = lastbuf->b_fnum;
|
||||||
@@ -3616,8 +3713,7 @@ static char_u *invalid_range(exarg_T *eap)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ADDR_WINDOWS:
|
case ADDR_WINDOWS:
|
||||||
if (eap->line1 < 1
|
if (eap->line2 > LAST_WIN_NR) {
|
||||||
|| eap->line2 > LAST_WIN_NR) {
|
|
||||||
return (char_u *)_(e_invrange);
|
return (char_u *)_(e_invrange);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -207,7 +207,7 @@ static int included_patches[] = {
|
|||||||
//575,
|
//575,
|
||||||
//574,
|
//574,
|
||||||
//573,
|
//573,
|
||||||
//572,
|
572,
|
||||||
//571 NA
|
//571 NA
|
||||||
//570 NA
|
//570 NA
|
||||||
//569,
|
//569,
|
||||||
|
Reference in New Issue
Block a user