1
0
forked from aniani/vim

updated for version 7.4.572

Problem:    Address type of :wincmd depends on the argument.
Solution:   Check the argument.
This commit is contained in:
Bram Moolenaar
2015-01-14 15:47:36 +01:00
parent 435797304a
commit 84c8e5ab9c
4 changed files with 135 additions and 23 deletions

View File

@@ -2130,22 +2130,23 @@ do_one_cmd(cmdlinep, sourcing,
* 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 */
#ifdef FEAT_USR_CMDS if (!IS_USER_CMDIDX(ea.cmdidx))
&& ea.cmdidx != CMD_USER {
&& ea.cmdidx != CMD_USER_BUF if (ea.cmdidx != CMD_SIZE)
#endif
)
ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type; ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type;
else else
#ifdef FEAT_USR_CMDS
if (ea.cmdidx != CMD_USER && ea.cmdidx != CMD_USER_BUF)
#endif
ea.addr_type = ADDR_LINES; ea.addr_type = ADDR_LINES;
/* ea.addr_type for user commands is set by find_ucmd */
ea.cmd = cmd; #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 */ /* repeat for all ',' or ';' separated addresses */
ea.cmd = cmd;
for (;;) for (;;)
{ {
ea.line1 = ea.line2; ea.line1 = ea.line2;
@@ -2181,7 +2182,6 @@ do_one_cmd(cmdlinep, sourcing,
{ {
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)
{ {
@@ -2190,15 +2190,20 @@ do_one_cmd(cmdlinep, sourcing,
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; {
while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL) buf_T *buf = firstbuf;
while (buf->b_next != NULL
&& buf->b_ml.ml_mfp == NULL)
buf = buf->b_next; buf = buf->b_next;
ea.line1 = buf->b_fnum; ea.line1 = buf->b_fnum;
buf = lastbuf; buf = lastbuf;
while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL) 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;

View File

@@ -1,5 +1,6 @@
/* window.c */ /* window.c */
void do_window __ARGS((int nchar, long Prenum, int xchar)); 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 __ARGS((int size, int flags));
int win_split_ins __ARGS((int size, int flags, win_T *new_wp, int dir)); int win_split_ins __ARGS((int size, int flags, win_T *new_wp, int dir));
int win_valid __ARGS((win_T *win)); int win_valid __ARGS((win_T *win));

View File

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

View File

@@ -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 static void
cmd_with_count(cmd, bufp, bufsize, Prenum) cmd_with_count(cmd, bufp, bufsize, Prenum)
char *cmd; char *cmd;