summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ex_docmd.c51
-rw-r--r--src/proto/window.pro1
-rw-r--r--src/version.c2
-rw-r--r--src/window.c104
4 files changed, 135 insertions, 23 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index c36f40740..3edc1a224 100644
--- 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
index b89cf085a..15bd4725d 100644
--- 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
index 39191f500..b049ea229 100644
--- 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
index 79c97d8a9..6ca288ead 100644
--- 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;