]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.4.572 v7.4.572
authorBram Moolenaar <Bram@vim.org>
Wed, 14 Jan 2015 14:47:36 +0000 (15:47 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 14 Jan 2015 14:47:36 +0000 (15:47 +0100)
Problem:    Address type of :wincmd depends on the argument.
Solution:   Check the argument.

src/ex_docmd.c
src/proto/window.pro
src/version.c
src/window.c

index c36f4074066229a8835b49ac28757eb891bbaa14..3edc1a2247f51a19bf99b0717716494e5d0340fa 100644 (file)
@@ -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;
index b89cf085a0da918bcca09e9fb257a765ccd79373..15bd4725d215162452be6dfb66709540e5ba9c73 100644 (file)
@@ -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));
index 39191f50048553a7b7f9d17cf8302183a2df39da..b049ea22958e596ee2c89990f83e2bc1776d882a 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    572,
 /**/
     571,
 /**/
index 79c97d8a9e8efe26d2c59381b6a12752d88926a8..6ca288ead28df8676d13eb90a7bbbfd55aad3ca6 100644 (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
 cmd_with_count(cmd, bufp, bufsize, Prenum)
     char       *cmd;