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:
@@ -2130,22 +2130,23 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
* is equal to the lower.
|
* 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.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 */
|
/* 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;
|
||||||
buf = buf->b_next;
|
|
||||||
ea.line1 = buf->b_fnum;
|
while (buf->b_next != NULL
|
||||||
buf = lastbuf;
|
&& buf->b_ml.ml_mfp == NULL)
|
||||||
while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL)
|
buf = buf->b_next;
|
||||||
buf = buf->b_prev;
|
ea.line1 = buf->b_fnum;
|
||||||
ea.line2 = buf->b_fnum;
|
buf = lastbuf;
|
||||||
break;
|
while (buf->b_prev != NULL
|
||||||
|
&& buf->b_ml.ml_mfp == NULL)
|
||||||
|
buf = buf->b_prev;
|
||||||
|
ea.line2 = buf->b_fnum;
|
||||||
|
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;
|
||||||
|
@@ -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));
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
104
src/window.c
104
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
|
static void
|
||||||
cmd_with_count(cmd, bufp, bufsize, Prenum)
|
cmd_with_count(cmd, bufp, bufsize, Prenum)
|
||||||
char *cmd;
|
char *cmd;
|
||||||
|
Reference in New Issue
Block a user