vim: updated to upstream patch 411
authorMarcin Juszkiewicz <marcin@juszkiewicz.com.pl>
Thu, 1 Apr 2010 18:58:44 +0000 (20:58 +0200)
committerMarcin Juszkiewicz <marcin@juszkiewicz.com.pl>
Tue, 6 Apr 2010 08:38:02 +0000 (10:38 +0200)
recipes/vim/gvim_7.2.bb
recipes/vim/vim-7.2/001-411.diff [moved from recipes/vim/vim-7.2/001-394.diff with 98% similarity]
recipes/vim/vim_7.2.bb

index da7a3be..276a9f0 100644 (file)
@@ -5,8 +5,6 @@ require vim_${PV}.bb
 
 DEPENDS += "gtk+ xt"
 
-PR = "${INC_PR}.0"
-
 EXTRA_OECONF += "--enable-gtk2-test"
 
 #might needs RREPLACES as well
similarity index 98%
rename from recipes/vim/vim-7.2/001-394.diff
rename to recipes/vim/vim-7.2/001-411.diff
index 4fcdb39..420ac93 100644 (file)
@@ -397,25195 +397,22954 @@ Individual patches for Vim 7.2:
   4898  7.2.392  netbeans hangs reading from a socket at the maximum block size
   9605  7.2.393  Mac: Can't build with different Xcode developer tools dir
   4298  7.2.394  .lzma and .xz files are not supported
+  1554  7.2.395  in help CTRL=] on g?g? escapes the ?, causing it to fail
+  1554  7.2.396  get E38 errors
+  1722  7.2.397  redundant check for w_lines_valid
+  4127  7.2.398  when moving windows the cursor ends up in the wrong line
+  1784  7.2.399  (extra, after 7.2.388) cannot compile on MingW
+ 12865  7.2.400  (after 7.2.387) Ruby problems with init and empty string
+  1982  7.2.401  wildmode list doesn't highlight directory names with a space
+  2649  7.2.402  error 705 when re-using funcref variable
+  1548  7.2.403  (after 7.2.400) compiler warning for pointer type
+  1880  7.2.404  pointers for composing characters are not properly initialized
+  1636  7.2.405  with small features match is not highlighted for ":s/p/r/c"
+  4701  7.2.406  (after 7.2.119) uninit memory read
+  1916  7.2.407  when using :s with an expression backslashes are dropped
+  2152  7.2.408  ":g/the/s/a/b/" can set '[ and '] marks to an unchanged line
+  1814  7.2.409  summary of number of substitutes is incorrect for ":folddo"
+  2526  7.2.410  highlighting directories for completion doesn't work properly
+  1462  7.2.411  when parsing 'cino' a comma isn't skipped properly
 
-
---- vim72.orig/src/pty.c
-+++ vim72/src/pty.c
-@@ -268,13 +268,14 @@ OpenPTY(ttyn)
-     *ttyn = TtyName;
-     return f;
- }
- #endif
+--- vim72.orig/Filelist
++++ vim72/Filelist
+@@ -283,10 +283,11 @@ SRC_DOS =        \
+               src/proto/os_msdos.pro \
+               src/proto/os_win16.pro \
+               src/proto/os_win32.pro \
+               src/proto/os_mswin.pro \
+               src/testdir/Make_dos.mak \
++              src/testdir/Make_ming.mak \
+               src/testdir/dos.vim \
+               src/uninstal.c \
+               src/vim.def \
+               src/vim.rc \
+               src/vimio.h \
+@@ -680,13 +681,11 @@ LANG_GEN = \
+               runtime/spell/README.txt \
+               runtime/spell/??/*.diff \
+               runtime/spell/??/main.aap \
+               runtime/spell/yi/README.txt \
+               runtime/spell/main.aap \
+-              runtime/spell/cleanadd.vim \
+               runtime/spell/*.vim \
+-              runtime/spell/fixdup \
  
--#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux)
-+#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) && !defined(MACOS_X)
+ # generic language files, binary
+ LANG_GEN_BIN = \
+               runtime/spell/README_en.txt \
+               runtime/spell/en.ascii.spl \
+--- vim72.orig/runtime/doc/autocmd.txt
++++ vim72/runtime/doc/autocmd.txt
+@@ -333,10 +333,12 @@ BufDelete                        Before deleting a buffer fro
+                               Also used just before a buffer in the buffer
+                               list is renamed.
+                               NOTE: When this autocommand is executed, the
+                               current buffer "%" may be different from the
+                               buffer being deleted "<afile>" and "<abuf>".
++                              Don't change to another buffer, it will cause
++                              problems.
+                                                       *BufEnter*
+ BufEnter                      After entering a buffer.  Useful for setting
+                               options for a file type.  Also executed when
+                               starting to edit a buffer, after the
+                               BufReadPost autocommands.
+@@ -395,10 +397,12 @@ BufUnload                        Before unloading a buffer.
+                               BufDelete.  Also used for all buffers that are
+                               loaded when Vim is going to exit.
+                               NOTE: When this autocommand is executed, the
+                               current buffer "%" may be different from the
+                               buffer being unloaded "<afile>".
++                              Don't change to another buffer, it will cause
++                              problems.
+                                                       *BufWinEnter*
+ BufWinEnter                   After a buffer is displayed in a window.  This
+                               can be when the buffer is loaded (after
+                               processing the modelines) or when a hidden
+                               buffer is displayed in a window (and is no
+@@ -426,10 +430,12 @@ BufWipeout                       Before completely deleting
+                               is renamed (also when it's not in the buffer
+                               list).
+                               NOTE: When this autocommand is executed, the
+                               current buffer "%" may be different from the
+                               buffer being deleted "<afile>".
++                              Don't change to another buffer, it will cause
++                              problems.
+                                               *BufWrite* *BufWritePre*
+ BufWrite or BufWritePre               Before writing the whole buffer to a file.
+                                                       *BufWriteCmd*
+ BufWriteCmd                   Before writing the whole buffer to a file.
+                               Should do the writing of the file and reset
+@@ -746,12 +752,14 @@ SwapExists                       Detected an existing swap f
+                                       'd'     delete the swap file
+                                       'q'     quit, don't edit the file
+                                       'a'     abort, like hitting CTRL-C
+                               When set to an empty string the user will be
+                               asked, as if there was no SwapExists autocmd.
+-                              Note: Do not try to change the buffer, the
+-                              results are unpredictable.
++                                                      *E812*
++                              It is not allowed to change to another buffer,
++                              change a buffer name or change directory
++                              here.
+                                                       *Syntax*
+ Syntax                                When the 'syntax' option has been set.  The
+                               pattern is matched against the syntax name.
+                               <afile> can be used for the name of the file
+                               where this option was set, and <amatch> for
+--- vim72.orig/runtime/doc/cmdline.txt
++++ vim72/runtime/doc/cmdline.txt
+@@ -1,6 +1,6 @@
+-*cmdline.txt*   For Vim version 7.2.  Last change: 2008 Jul 29
++*cmdline.txt*   For Vim version 7.2.  Last change: 2008 Sep 18
  
--/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */
-+/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work!
-+ * Same for Mac OS X Leopard. */
- #define PTY_DONE
-     int
- OpenPTY(ttyn)
-     char **ttyn;
- {
---- vim72.orig/src/version.c
-+++ vim72/src/version.c
-@@ -492,10 +492,15 @@ static char *(features[]) =
- #ifdef FEAT_SNIFF
-       "+sniff",
- #else
-       "-sniff",
- #endif
-+#ifdef STARTUPTIME
-+      "+startuptime",
-+#else
-+      "-startuptime",
-+#endif
- #ifdef FEAT_STL_OPT
-       "+statusline",
- #else
-       "-statusline",
- #endif
-@@ -675,13 +680,814 @@ static char *(features[]) =
- };
  
- static int included_patches[] =
- {   /* Add new patch number below this line */
- /**/
-+    394,
-+/**/
-+    393,
-+/**/
-+    392,
-+/**/
-+    391,
-+/**/
-+    390,
-+/**/
-+    389,
-+/**/
-+    388,
-+/**/
-+    387,
-+/**/
-+    386,
-+/**/
-+    385,
-+/**/
-+    384,
-+/**/
-+    383,
-+/**/
-+    382,
-+/**/
-+    381,
-+/**/
-+    380,
-+/**/
-+    379,
-+/**/
-+    378,
-+/**/
-+    377,
-+/**/
-+    376,
-+/**/
-+    375,
-+/**/
-+    374,
-+/**/
-+    373,
-+/**/
-+    372,
-+/**/
-+    371,
-+/**/
-+    370,
-+/**/
-+    369,
-+/**/
-+    368,
-+/**/
-+    367,
-+/**/
-+    366,
-+/**/
-+    365,
-+/**/
-+    364,
-+/**/
-+    363,
-+/**/
-+    362,
-+/**/
-+    361,
-+/**/
-+    360,
-+/**/
-+    359,
-+/**/
-+    358,
-+/**/
-+    357,
-+/**/
-+    356,
-+/**/
-+    355,
-+/**/
-+    354,
-+/**/
-+    353,
-+/**/
-+    352,
-+/**/
-+    351,
-+/**/
-+    350,
-+/**/
-+    349,
-+/**/
-+    348,
-+/**/
-+    347,
-+/**/
-+    346,
-+/**/
-+    345,
-+/**/
-+    344,
-+/**/
-+    343,
-+/**/
-+    342,
-+/**/
-+    341,
-+/**/
-+    340,
-+/**/
-+    339,
-+/**/
-+    338,
-+/**/
-+    337,
-+/**/
-+    336,
-+/**/
-+    335,
-+/**/
-+    334,
-+/**/
-+    333,
-+/**/
-+    332,
-+/**/
-+    331,
-+/**/
-+    330,
-+/**/
-+    329,
-+/**/
-+    328,
-+/**/
-+    327,
-+/**/
-+    326,
-+/**/
-+    325,
-+/**/
-+    324,
-+/**/
-+    323,
-+/**/
-+    322,
-+/**/
-+    321,
-+/**/
-+    320,
-+/**/
-+    319,
-+/**/
-+    318,
-+/**/
-+    317,
-+/**/
-+    316,
-+/**/
-+    315,
-+/**/
-+    314,
-+/**/
-+    313,
-+/**/
-+    312,
-+/**/
-+    311,
-+/**/
-+    310,
-+/**/
-+    309,
-+/**/
-+    308,
-+/**/
-+    307,
-+/**/
-+    306,
-+/**/
-+    305,
-+/**/
-+    304,
-+/**/
-+    303,
-+/**/
-+    302,
-+/**/
-+    301,
-+/**/
-+    300,
-+/**/
-+    299,
-+/**/
-+    298,
-+/**/
-+    297,
-+/**/
-+    296,
-+/**/
-+    295,
-+/**/
-+    294,
-+/**/
-+    293,
-+/**/
-+    292,
-+/**/
-+    291,
-+/**/
-+    290,
-+/**/
-+    289,
-+/**/
-+    288,
-+/**/
-+    287,
-+/**/
-+    286,
-+/**/
-+    285,
-+/**/
-+    284,
-+/**/
-+    283,
-+/**/
-+    282,
-+/**/
-+    281,
-+/**/
-+    280,
-+/**/
-+    279,
-+/**/
-+    278,
-+/**/
-+    277,
-+/**/
-+    276,
-+/**/
-+    275,
-+/**/
-+    274,
-+/**/
-+    273,
-+/**/
-+    272,
-+/**/
-+    271,
-+/**/
-+    270,
-+/**/
-+    269,
-+/**/
-+    268,
-+/**/
-+    267,
-+/**/
-+    266,
-+/**/
-+    265,
-+/**/
-+    264,
-+/**/
-+    263,
-+/**/
-+    262,
-+/**/
-+    261,
-+/**/
-+    260,
-+/**/
-+    259,
-+/**/
-+    258,
-+/**/
-+    257,
-+/**/
-+    256,
-+/**/
-+    255,
-+/**/
-+    254,
-+/**/
-+    253,
-+/**/
-+    252,
-+/**/
-+    251,
-+/**/
-+    250,
-+/**/
-+    249,
-+/**/
-+    248,
-+/**/
-+    247,
-+/**/
-+    246,
-+/**/
-+    245,
-+/**/
-+    244,
-+/**/
-+    243,
-+/**/
-+    242,
-+/**/
-+    241,
-+/**/
-+    240,
-+/**/
-+    239,
-+/**/
-+    238,
-+/**/
-+    237,
-+/**/
-+    236,
-+/**/
-+    235,
-+/**/
-+    234,
-+/**/
-+    233,
-+/**/
-+    232,
-+/**/
-+    231,
-+/**/
-+    230,
-+/**/
-+    229,
-+/**/
-+    228,
-+/**/
-+    227,
-+/**/
-+    226,
-+/**/
-+    225,
-+/**/
-+    224,
-+/**/
-+    223,
-+/**/
-+    222,
-+/**/
-+    221,
-+/**/
-+    220,
-+/**/
-+    219,
-+/**/
-+    218,
-+/**/
-+    217,
-+/**/
-+    216,
-+/**/
-+    215,
-+/**/
-+    214,
-+/**/
-+    213,
-+/**/
-+    212,
-+/**/
-+    211,
-+/**/
-+    210,
-+/**/
-+    209,
-+/**/
-+    208,
-+/**/
-+    207,
-+/**/
-+    206,
-+/**/
-+    205,
-+/**/
-+    204,
-+/**/
-+    203,
-+/**/
-+    202,
-+/**/
-+    201,
-+/**/
-+    200,
-+/**/
-+    199,
-+/**/
-+    198,
-+/**/
-+    197,
-+/**/
-+    196,
-+/**/
-+    195,
-+/**/
-+    194,
-+/**/
-+    193,
-+/**/
-+    192,
-+/**/
-+    191,
-+/**/
-+    190,
-+/**/
-+    189,
-+/**/
-+    188,
-+/**/
-+    187,
-+/**/
-+    186,
-+/**/
-+    185,
-+/**/
-+    184,
-+/**/
-+    183,
-+/**/
-+    182,
-+/**/
-+    181,
-+/**/
-+    180,
-+/**/
-+    179,
-+/**/
-+    178,
-+/**/
-+    177,
-+/**/
-+    176,
-+/**/
-+    175,
-+/**/
-+    174,
-+/**/
-+    173,
-+/**/
-+    172,
-+/**/
-+    171,
-+/**/
-+    170,
-+/**/
-+    169,
-+/**/
-+    168,
-+/**/
-+    167,
-+/**/
-+    166,
-+/**/
-+    165,
-+/**/
-+    164,
-+/**/
-+    163,
-+/**/
-+    162,
-+/**/
-+    161,
-+/**/
-+    160,
-+/**/
-+    159,
-+/**/
-+    158,
-+/**/
-+    157,
-+/**/
-+    156,
-+/**/
-+    155,
-+/**/
-+    154,
-+/**/
-+    153,
-+/**/
-+    152,
-+/**/
-+    151,
-+/**/
-+    150,
-+/**/
-+    149,
-+/**/
-+    148,
-+/**/
-+    147,
-+/**/
-+    146,
-+/**/
-+    145,
-+/**/
-+    144,
-+/**/
-+    143,
-+/**/
-+    142,
-+/**/
-+    141,
-+/**/
-+    140,
-+/**/
-+    139,
-+/**/
-+    138,
-+/**/
-+    137,
-+/**/
-+    136,
-+/**/
-+    135,
-+/**/
-+    134,
-+/**/
-+    133,
-+/**/
-+    132,
-+/**/
-+    131,
-+/**/
-+    130,
-+/**/
-+    129,
-+/**/
-+    128,
-+/**/
-+    127,
-+/**/
-+    126,
-+/**/
-+    125,
-+/**/
-+    124,
-+/**/
-+    123,
-+/**/
-+    122,
-+/**/
-+    121,
-+/**/
-+    120,
-+/**/
-+    119,
-+/**/
-+    118,
-+/**/
-+    117,
-+/**/
-+    116,
-+/**/
-+    115,
-+/**/
-+    114,
-+/**/
-+    113,
-+/**/
-+    112,
-+/**/
-+    111,
-+/**/
-+    110,
-+/**/
-+    109,
-+/**/
-+    108,
-+/**/
-+    107,
-+/**/
-+    106,
-+/**/
-+    105,
-+/**/
-+    104,
-+/**/
-+    103,
-+/**/
-+    102,
-+/**/
-+    101,
-+/**/
-+    100,
-+/**/
-+    99,
-+/**/
-+    98,
-+/**/
-+    97,
-+/**/
-+    96,
-+/**/
-+    95,
-+/**/
-+    94,
-+/**/
-+    93,
-+/**/
-+    92,
-+/**/
-+    91,
-+/**/
-+    90,
-+/**/
-+    89,
-+/**/
-+    88,
-+/**/
-+    87,
-+/**/
-+    86,
-+/**/
-+    85,
-+/**/
-+    84,
-+/**/
-+    83,
-+/**/
-+    82,
-+/**/
-+    81,
-+/**/
-+    80,
-+/**/
-+    79,
-+/**/
-+    78,
-+/**/
-+    77,
-+/**/
-+    76,
-+/**/
-+    75,
-+/**/
-+    74,
-+/**/
-+    73,
-+/**/
-+    72,
-+/**/
-+    71,
-+/**/
-+    70,
-+/**/
-+    69,
-+/**/
-+    68,
-+/**/
-+    67,
-+/**/
-+    66,
-+/**/
-+    65,
-+/**/
-+    64,
-+/**/
-+    63,
-+/**/
-+    62,
-+/**/
-+    61,
-+/**/
-+    60,
-+/**/
-+    59,
-+/**/
-+    58,
-+/**/
-+    57,
-+/**/
-+    56,
-+/**/
-+    55,
-+/**/
-+    54,
-+/**/
-+    53,
-+/**/
-+    52,
-+/**/
-+    51,
-+/**/
-+    50,
-+/**/
-+    49,
-+/**/
-+    48,
-+/**/
-+    47,
-+/**/
-+    46,
-+/**/
-+    45,
-+/**/
-+    44,
-+/**/
-+    43,
-+/**/
-+    42,
-+/**/
-+    41,
-+/**/
-+    40,
-+/**/
-+    39,
-+/**/
-+    38,
-+/**/
-+    37,
-+/**/
-+    36,
-+/**/
-+    35,
-+/**/
-+    34,
-+/**/
-+    33,
-+/**/
-+    32,
-+/**/
-+    31,
-+/**/
-+    30,
-+/**/
-+    29,
-+/**/
-+    28,
-+/**/
-+    27,
-+/**/
-+    26,
-+/**/
-+    25,
-+/**/
-+    24,
-+/**/
-+    23,
-+/**/
-+    22,
-+/**/
-+    21,
-+/**/
-+    20,
-+/**/
-+    19,
-+/**/
-+    18,
-+/**/
-+    17,
-+/**/
-+    16,
-+/**/
-+    15,
-+/**/
-+    14,
-+/**/
-+    13,
-+/**/
-+    12,
-+/**/
-+    11,
-+/**/
-+    10,
-+/**/
-+    9,
-+/**/
-+    8,
-+/**/
-+    7,
-+/**/
-+    6,
-+/**/
-+    5,
-+/**/
-+    4,
-+/**/
-+    3,
-+/**/
-+    2,
-+/**/
-+    1,
-+/**/
-     0
- };
+                 VIM REFERENCE MANUAL    by Bram Moolenaar
  
-+/*
-+ * Place to put a short description when adding a feature with a patch.
-+ * Keep it short, e.g.,: "relative numbers", "persistent undo".
-+ * Also add a comment marker to separate the lines.
-+ * See the official Vim patches for the diff format: It must use a context of
-+ * one line only.  Create it by hand or use "diff -C2" and edit the patch.
-+ */
-+static char *(extra_patches[]) =
-+{   /* Add your patch description below this line */
-+/**/
-+    NULL
-+};
+@@ -155,10 +155,15 @@ CTRL-R {0-9a-z"%#:-=.}                                   *c_CTRL-R* *c
+                       '='     the expression register: you are prompted to
+                               enter an expression (see |expression|)
+                               (doesn't work at the expression prompt; some
+                               things such as changing the buffer or current
+                               window are not allowed to avoid side effects)
++                              When the result is a |List| the items are used
++                              as lines.  They can have line breaks inside
++                              too.
++                              When the result is a Float it's automatically
++                              converted to a String.
+               See |registers| about registers.  {not in Vi}
+               Implementation detail: When using the |expression| register
+               and invoking setcmdpos(), this sets the position before
+               inserting the resulting string.  Use CTRL-R CTRL-R to set the
+               position afterwards.
+@@ -434,17 +439,24 @@ matching files with the next.
+ For file name completion you can use the 'suffixes' option to set a priority
+ between files with almost the same name.  If there are multiple matches,
+ those files with an extension that is in the 'suffixes' option are ignored.
+ The default is ".bak,~,.o,.h,.info,.swp,.obj", which means that files ending
+ in ".bak", "~", ".o", ".h", ".info", ".swp" and ".obj" are sometimes ignored.
+-It is impossible to ignore suffixes with two dots.  Examples:
 +
-     int
- highest_patch()
- {
-     int               i;
-     int               h = 0;
-@@ -784,11 +1590,11 @@ list_version()
++An empty entry, two consecutive commas, match a file name that does not
++contain a ".", thus has no suffix.  This is useful to ignore "prog" and prefer
++"prog.c".
++
++Examples:
  
- #ifdef RISCOS
-     MSG_PUTS(_("\nRISC OS version"));
- #endif
- #ifdef VMS
--    MSG_PUTS("\nOpenVMS version");
-+    MSG_PUTS(_("\nOpenVMS version"));
- # ifdef HAVE_PATHDEF
-     if (*compiled_arch != NUL)
-     {
-       MSG_PUTS(" - ");
-       MSG_PUTS(compiled_arch);
-@@ -823,10 +1629,23 @@ list_version()
-               first = -1;
-           }
-       }
-     }
+   pattern:    files:                          match:  ~
+    test*      test.c test.h test.o            test.c
+    test*      test.h test.o                   test.h and test.o
+    test*      test.i test.h test.c            test.i and test.c
  
-+    /* Print the list of extra patch descriptions if there is at least one. */
-+    if (extra_patches[0] != NULL)
-+    {
-+      MSG_PUTS(_("\nExtra patches: "));
-+      s = "";
-+      for (i = 0; extra_patches[i] != NULL; ++i)
-+      {
-+          MSG_PUTS(s);
-+          s = ", ";
-+          MSG_PUTS(extra_patches[i]);
-+      }
-+    }
++It is impossible to ignore suffixes with two dots.
 +
- #ifdef MODIFIED_BY
-     MSG_PUTS("\n");
-     MSG_PUTS(_("Modified by "));
-     MSG_PUTS(MODIFIED_BY);
- #endif
-@@ -1251,14 +2070,13 @@ do_intro_line(row, mesg, add_version, at
- }
+ If there is more than one matching file (after ignoring the ones matching
+ the 'suffixes' option) the first file name is inserted.  You can see that
+ there is only one match when you type 'wildchar' twice and the completed
+ match stays the same.  You can get to the other matches by entering
+ 'wildchar', CTRL-N or CTRL-P.  All files are included, also the ones with
+@@ -728,23 +740,33 @@ to use |fnameescape()|.
  
- /*
-  * ":intro": clear screen, display intro screen and wait for return.
-  */
--/*ARGSUSED*/
-     void
- ex_intro(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     screenclear();
-     intro_message(TRUE);
-     wait_return(TRUE);
- }
---- vim72.orig/src/menu.c
-+++ vim72/src/menu.c
-@@ -229,19 +229,19 @@ ex_menu(eap)
-           if (STRNCMP(menu_path, "BuiltIn", 7) == 0)
-           {
-               if (skipdigits(menu_path + 7) == p)
-               {
-                   menuarg.iconidx = atoi((char *)menu_path + 7);
--                  if (menuarg.iconidx >= TOOLBAR_NAME_COUNT)
-+                  if (menuarg.iconidx >= (int)TOOLBAR_NAME_COUNT)
-                       menuarg.iconidx = -1;
-                   else
-                       menuarg.icon_builtin = TRUE;
-               }
-           }
-           else
-           {
--              for (i = 0; i < TOOLBAR_NAME_COUNT; ++i)
-+              for (i = 0; i < (int)TOOLBAR_NAME_COUNT; ++i)
-                   if (STRNCMP(toolbar_names[i], menu_path, p - menu_path)
-                                                                        == 0)
-                   {
-                       menuarg.iconidx = i;
-                       break;
-@@ -1118,10 +1118,11 @@ show_menus(path_name, modes)
-       }
-       name = p;
-       parent = menu;
-       menu = menu->children;
-     }
-+    vim_free(path_name);
-     /* Now we have found the matching menu, and we list the mappings */
-                                                   /* Highlight title */
-     MSG_PUTS_TITLE(_("\n--- Menus ---"));
  
-@@ -1338,14 +1339,13 @@ set_context_in_menu_cmd(xp, cmd, arg, fo
+ In Ex commands, at places where a file name can be used, the following
+ characters have a special meaning.  These can also be used in the expression
+ function expand() |expand()|.
+-      %       is replaced with the current file name                  *:_%*
+-      #       is replaced with the alternate file name                *:_#*
++      %       Is replaced with the current file name.           *:_%* *c_%*
++      #       Is replaced with the alternate file name.         *:_#* *c_#*
+       #n      (where n is a number) is replaced with the file name of
+-              buffer n.  "#0" is the same as "#"
+-      ##      is replaced with all names in the argument list         *:_##*
++              buffer n.  "#0" is the same as "#".
++      ##      Is replaced with all names in the argument list   *:_##* *c_##*
+               concatenated, separated by spaces.  Each space in a name
+               is preceded with a backslash.
+-Note that these give the file name as it was typed.  If an absolute path is
+-needed (when using the file name from a different directory), you need to add
+-":p".  See |filename-modifiers|.
++      #<n     (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
++              file name n.  See |:oldfiles| or |v:oldfiles| to get the
++              number.                                                 *E809*
++              {only when compiled with the +eval and +viminfo features}
++
++Note that these, except "#<n", give the file name as it was typed.  If an
++absolute path is needed (when using the file name from a different directory),
++you need to add ":p".  See |filename-modifiers|.
++
++The "#<n" item returns an absolute path, but it will start with "~/" for files
++below your home directory.
++
+ Note that backslashes are inserted before spaces, so that the command will
+ correctly interpret the file name.  But this doesn't happen for shell
+-commands.  For those you probably have to use quotes: >
++commands.  For those you probably have to use quotes (this fails for files
++that contain a quote and wildcards): >
+       :!ls "%"
+       :r !spell "%"
  
- /*
-  * Function given to ExpandGeneric() to obtain the list of (sub)menus (not
-  * entries).
-  */
--/*ARGSUSED*/
-     char_u *
- get_menu_name(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
- {
-     static vimmenu_T  *menu = NULL;
-     char_u            *str;
+ To avoid the special meaning of '%' and '#' insert a backslash before it.
+ Detail: The special meaning is always escaped when there is a backslash before
+--- vim72.orig/runtime/doc/eval.txt
++++ vim72/runtime/doc/eval.txt
+@@ -1,6 +1,6 @@
+-*eval.txt*    For Vim version 7.2.  Last change: 2008 Aug 09
++*eval.txt*    For Vim version 7.2.  Last change: 2008 Nov 27
  
-@@ -1375,14 +1375,13 @@ get_menu_name(xp, idx)
  
- /*
-  * Function given to ExpandGeneric() to obtain the list of menus and menu
-  * entries.
-  */
--/*ARGSUSED*/
-     char_u *
- get_menu_names(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
- {
-     static vimmenu_T  *menu = NULL;
-     static char_u     tbuffer[256]; /*hack*/
-     char_u            *str;
-@@ -1736,14 +1735,13 @@ menu_is_hidden(name)
- #if defined(FEAT_CMDL_COMPL) \
-       || (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF))
- /*
-  * Return TRUE if the menu is the tearoff menu.
-  */
--/*ARGSUSED*/
-     static int
- menu_is_tearoff(name)
--    char_u *name;
-+    char_u *name UNUSED;
- {
- #ifdef FEAT_GUI
-     return (STRCMP(name, TEAR_STRING) == 0);
- #else
-     return FALSE;
-@@ -2340,14 +2338,13 @@ static garray_T menutrans_ga = {0, 0, 0,
- /*
-  * ":menutrans".
-  * This function is also defined without the +multi_lang feature, in which
-  * case the commands are ignored.
-  */
--/*ARGSUSED*/
-     void
- ex_menutranslate(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
- #ifdef FEAT_MULTI_LANG
-     char_u            *arg = eap->arg;
-     menutrans_T               *tp;
-     int                       i;
---- vim72.orig/src/spell.c
-+++ vim72/src/spell.c
-@@ -75,11 +75,11 @@
-  */
- #define RESCORE(word_score, sound_score) ((3 * word_score + sound_score) / 4)
+                 VIM REFERENCE MANUAL    by Bram Moolenaar
  
- /*
-  * Do the opposite: based on a maximum end score and a known sound score,
-- * compute the the maximum word score that can be used.
-+ * compute the maximum word score that can be used.
-  */
- #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3)
  
- /*
-  * Vim spell file format: <HEADER>
-@@ -467,10 +467,11 @@ struct slang_S
-     int               sl_compsylmax;  /* COMPOUNDSYLMAX (default: MAXWLEN) */
-     int               sl_compoptions; /* COMP_* flags */
-     garray_T  sl_comppat;     /* CHECKCOMPOUNDPATTERN items */
-     regprog_T *sl_compprog;   /* COMPOUNDRULE turned into a regexp progrm
-                                * (NULL when no compounding) */
-+    char_u    *sl_comprules;  /* all COMPOUNDRULE concatenated (or NULL) */
-     char_u    *sl_compstartflags; /* flags for first compound word */
-     char_u    *sl_compallflags; /* all flags for compound words */
-     char_u    sl_nobreak;     /* When TRUE: no spaces between words */
-     char_u    *sl_syllable;   /* SYLLABLE repeatable chars or NULL */
-     garray_T  sl_syl_items;   /* syllable items */
-@@ -623,11 +624,11 @@ typedef struct suggest_S
- #define SUG(ga, i) (((suggest_T *)(ga).ga_data)[i])
+@@ -1482,10 +1482,21 @@ v:mouse_lnum   Line number for a mouse cli
+                                       *v:mouse_col* *mouse_col-variable*
+ v:mouse_col   Column number for a mouse click obtained with |getchar()|.
+               This is the screen column number, like with |virtcol()|.  The
+               value is zero when there was no mouse button click.
  
- /* TRUE if a word appears in the list of banned words.  */
- #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word)))
++                                      *v:oldfiles* *oldfiles-variable*
++v:oldfiles    List of file names that is loaded from the |viminfo| file on
++              startup.  These are the files that Vim remembers marks for.
++              The length of the List is limited by the ' argument of the
++              'viminfo' option (default is 100).
++              Also see |:oldfiles| and |c_#<|.
++              The List can be modified, but this has no effect on what is
++              stored in the |viminfo| file later.  If you use values other
++              than String this will cause trouble.
++              {only when compiled with the +viminfo feature}
++
+                                       *v:operator* *operator-variable*
+ v:operator    The last operator given in Normal mode.  This is a single
+               character except for commands starting with <g> or <z>,
+               in which case it is two characters.  Best used alongside
+               |v:prevcount| and |v:register|.  Useful if you want to cancel
+@@ -1693,11 +1704,11 @@ eval( {string})                        any     evaluate {string}
+ eventhandler( )                       Number  TRUE if inside an event handler
+ executable( {expr})           Number  1 if executable {expr} exists
+ exists( {expr})                       Number  TRUE if {expr} exists
+ extend({expr1}, {expr2} [, {expr3}])
+                               List/Dict insert items of {expr2} into {expr1}
+-expand( {expr})                       String  expand special keywords in {expr}
++expand( {expr} [, {flag}])    String  expand special keywords in {expr}
+ feedkeys( {string} [, {mode}])        Number  add key sequence to typeahead buffer
+ filereadable( {file})         Number  TRUE if {file} is a readable file
+ filewritable( {file})         Number  TRUE if {file} is a writable file
+ filter( {expr}, {string})     List/Dict  remove items from {expr} where
+                                       {string} is 0
+@@ -1745,12 +1756,13 @@ getregtype( [{regname}])       String  type of
+ gettabwinvar( {tabnr}, {winnr}, {name})
+                               any     {name} in {winnr} in tab page {tabnr}
+ getwinposx()                  Number  X coord in pixels of GUI Vim window
+ getwinposy()                  Number  Y coord in pixels of GUI Vim window
+ getwinvar( {nr}, {varname})   any     variable {varname} in window {nr}
+-glob( {expr})                 String  expand file wildcards in {expr}
+-globpath( {path}, {expr})     String  do glob({expr}) for all dirs in {path}
++glob( {expr} [, {flag}])      String  expand file wildcards in {expr}
++globpath( {path}, {expr} [, {flag}])
++                              String  do glob({expr}) for all dirs in {path}
+ has( {feature})                       Number  TRUE if feature {feature} supported
+ has_key( {dict}, {key})               Number  TRUE if {dict} has entry {key}
+ haslocaldir()                 Number  TRUE if current window executed |:lcd|
+ hasmapto( {what} [, {mode} [, {abbr}]])
+                               Number  TRUE if mapping to {what} exists
+@@ -1801,15 +1813,16 @@ matchend( {expr}, {pat}[, {start}[, {cou
+                               Number  position where {pat} ends in {expr}
+ matchlist( {expr}, {pat}[, {start}[, {count}]])
+                               List    match and submatches of {pat} in {expr}
+ matchstr( {expr}, {pat}[, {start}[, {count}]])
+                               String  {count}'th match of {pat} in {expr}
+-max({list})                   Number  maximum value of items in {list}
+-min({list})                   Number  minimum value of items in {list}
+-mkdir({name} [, {path} [, {prot}]])
++max( {list})                  Number  maximum value of items in {list}
++min( {list})                  Number  minimum value of items in {list}
++mkdir( {name} [, {path} [, {prot}]])
+                               Number  create directory {name}
+ mode( [expr])                 String  current editing mode
++mzeval( {expr})                       any     evaluate |MzScheme| expression
+ nextnonblank( {lnum})         Number  line nr of non-blank line >= {lnum}
+ nr2char( {expr})              String  single char with ASCII value {expr}
+ pathshorten( {expr})          String  shorten directory names in a path
+ pow( {x}, {y})                        Float   {x} to the power of {y}
+ prevnonblank( {lnum})         Number  line nr of non-blank line <= {lnum}
+@@ -2400,10 +2413,11 @@ cursor({list})
+               line.
+               If {col} is zero, the cursor will stay in the current column.
+               When 'virtualedit' is used {off} specifies the offset in
+               screen columns from the start of the character.  E.g., a
+               position within a <Tab> or after the last character.
++              Returns 0 when the position could be set, -1 otherwise.
  
--/* Number of suggestions kept when cleaning up.  we need to keep more than
-+/* Number of suggestions kept when cleaning up.  We need to keep more than
-  * what is displayed, because when rescore_suggestions() is called the score
-  * may change and wrong suggestions may be removed later. */
- #define SUG_CLEAN_COUNT(su)    ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20)
  
- /* Threshold for sorting and cleaning up suggestions.  Don't want to keep lots
-@@ -837,11 +838,14 @@ typedef struct trystate_S
- static slang_T *slang_alloc __ARGS((char_u *lang));
- static void slang_free __ARGS((slang_T *lp));
- static void slang_clear __ARGS((slang_T *lp));
- static void slang_clear_sug __ARGS((slang_T *lp));
- static void find_word __ARGS((matchinf_T *mip, int mode));
-+static int match_checkcompoundpattern __ARGS((char_u *ptr, int wlen, garray_T *gap));
- static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags));
-+static int can_be_compound __ARGS((trystate_T *sp, slang_T *slang, char_u *compflags, int flag));
-+static int match_compoundrule __ARGS((slang_T *slang, char_u *compflags));
- static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req));
- static void find_prefix __ARGS((matchinf_T *mip, int mode));
- static int fold_more __ARGS((matchinf_T *mip));
- static int spell_valid_case __ARGS((int wordflags, int treeflags));
- static int no_spell_checking __ARGS((win_T *wp));
-@@ -944,34 +948,34 @@ static void close_spellbuf __ARGS((buf_T
-  * differ from what the .spl file uses.
-  * These must not be called with negative number!
-  */
- #ifndef FEAT_MBYTE
- /* Non-multi-byte implementation. */
--# define SPELL_TOFOLD(c) ((c) < 256 ? spelltab.st_fold[c] : (c))
--# define SPELL_TOUPPER(c) ((c) < 256 ? spelltab.st_upper[c] : (c))
-+# define SPELL_TOFOLD(c) ((c) < 256 ? (int)spelltab.st_fold[c] : (c))
-+# define SPELL_TOUPPER(c) ((c) < 256 ? (int)spelltab.st_upper[c] : (c))
- # define SPELL_ISUPPER(c) ((c) < 256 ? spelltab.st_isu[c] : FALSE)
- #else
- # if defined(HAVE_WCHAR_H)
- #  include <wchar.h>      /* for towupper() and towlower() */
- # endif
- /* Multi-byte implementation.  For Unicode we can call utf_*(), but don't do
-  * that for ASCII, because we don't want to use 'casemap' here.  Otherwise use
-  * the "w" library function for characters above 255 if available. */
- # ifdef HAVE_TOWLOWER
- #  define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \
--          : (c) < 256 ? spelltab.st_fold[c] : towlower(c))
-+          : (c) < 256 ? (int)spelltab.st_fold[c] : (int)towlower(c))
- # else
- #  define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \
--          : (c) < 256 ? spelltab.st_fold[c] : (c))
-+          : (c) < 256 ? (int)spelltab.st_fold[c] : (c))
- # endif
+ deepcopy({expr}[, {noref}])                           *deepcopy()* *E698*
+               Make a copy of {expr}.  For Numbers and Strings this isn't
+               different from using {expr} directly.
+@@ -3273,18 +3287,20 @@ getwinvar({winnr}, {varname})                          *getwin
+               Like |gettabwinvar()| for the current tabpage.
+               Examples: >
+                       :let list_is_on = getwinvar(2, '&list')
+                       :echo "myvar = " . getwinvar(1, 'myvar')
+ <
+-                                                      *glob()*
+-glob({expr})  Expand the file wildcards in {expr}.  See |wildcards| for the
++glob({expr} [, {flag}])                                       *glob()*
++              Expand the file wildcards in {expr}.  See |wildcards| for the
+               use of special characters.
+               The result is a String.
+               When there are several matches, they are separated by <NL>
+               characters.
+-              The 'wildignore' option applies: Names matching one of the
+-              patterns in 'wildignore' will be skipped.
++              Unless the optional {flag} argument is given and is non-zero,
++              the 'suffixes' and 'wildignore' options apply: Names matching
++              one of the patterns in 'wildignore' will be skipped and
++              'suffixes' affect the ordering of matches.
+               If the expansion fails, the result is an empty string.
+               A name for a non-existing file is not included.
  
- # ifdef HAVE_TOWUPPER
- #  define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? utf_toupper(c) \
--          : (c) < 256 ? spelltab.st_upper[c] : towupper(c))
-+          : (c) < 256 ? (int)spelltab.st_upper[c] : (int)towupper(c))
- # else
- #  define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? utf_toupper(c) \
--          : (c) < 256 ? spelltab.st_upper[c] : (c))
-+          : (c) < 256 ? (int)spelltab.st_upper[c] : (c))
- # endif
+               For most systems backticks can be used to get files names from
+               any external command.  Example: >
+@@ -3294,24 +3310,26 @@ glob({expr})   Expand the file wildcards i
+               item per line.  Spaces inside an item are allowed.
  
- # ifdef HAVE_ISWUPPER
- #  define SPELL_ISUPPER(c) (enc_utf8 && (c) >= 128 ? utf_isupper(c) \
-           : (c) < 256 ? spelltab.st_isu[c] : iswupper(c))
-@@ -1517,10 +1521,15 @@ find_word(mip, mode)
-                                       ? slang->sl_compstartflags
-                                       : slang->sl_compallflags,
-                                           ((unsigned)flags >> 24)))
-                   continue;
+               See |expand()| for expanding special Vim variables.  See
+               |system()| for getting the raw output of an external command.
  
-+              /* If there is a match with a CHECKCOMPOUNDPATTERN rule
-+               * discard the compound word. */
-+              if (match_checkcompoundpattern(ptr, wlen, &slang->sl_comppat))
-+                  continue;
-+
-               if (mode == FIND_COMPOUND)
-               {
-                   int     capflags;
+-globpath({path}, {expr})                              *globpath()*
++globpath({path}, {expr} [, {flag}])                   *globpath()*
+               Perform glob() on all directories in {path} and concatenate
+               the results.  Example: >
+                       :echo globpath(&rtp, "syntax/c.vim")
+ <             {path} is a comma-separated list of directory names.  Each
+               directory name is prepended to {expr} and expanded like with
+-              glob().  A path separator is inserted when needed.
++              |glob()|.  A path separator is inserted when needed.
+               To add a comma inside a directory name escape it with a
+               backslash.  Note that on MS-Windows a directory may have a
+               trailing backslash, remove it if you put a comma after it.
+               If the expansion fails for one of the directories, there is no
+               error message.
+-              The 'wildignore' option applies: Names matching one of the
+-              patterns in 'wildignore' will be skipped.
++              Unless the optional {flag} argument is given and is non-zero,
++              the 'suffixes' and 'wildignore' options apply: Names matching
++              one of the patterns in 'wildignore' will be skipped and
++              'suffixes' affect the ordering of matches.
  
-                   /* Need to check the caps type of the appended compound
-@@ -1575,10 +1584,15 @@ find_word(mip, mode)
-                           vim_strncpy(fword, ptr, endlen[endidxcnt]);
-                   }
-                   if (!can_compound(slang, fword, mip->mi_compflags))
-                       continue;
-               }
-+              else if (slang->sl_comprules != NULL
-+                           && !match_compoundrule(slang, mip->mi_compflags))
-+                  /* The compound flags collected so far do not match any
-+                   * COMPOUNDRULE, discard the compounded word. */
-+                  continue;
-           }
+               The "**" item can be used to search in a directory tree.
+               For example, to find all "README.txt" files in the directories
+               in 'runtimepath' and below: >
+                       :echo globpath(&rtp, "**/README.txt")
+@@ -3783,11 +3801,12 @@ log10({expr})                                          *log10()*
+ map({expr}, {string})                                 *map()*
+               {expr} must be a |List| or a |Dictionary|.
+               Replace each item in {expr} with the result of evaluating
+               {string}.
+               Inside {string} |v:val| has the value of the current item.
+-              For a |Dictionary| |v:key| has the key of the current item.
++              For a |Dictionary| |v:key| has the key of the current item
++              and for a |List| |v:key| has the index of the current item.
+               Example: >
+                       :call map(mylist, '"> " . v:val . " <"')
+ <             This puts "> " before and " <" after each item in "mylist".
  
-           /* Check NEEDCOMPOUND: can't use word without compounding. */
-           else if (flags & WF_NEEDCOMP)
-               continue;
-@@ -1725,10 +1739,43 @@ find_word(mip, mode)
-           break;
-     }
- }
+               Note that {string} is the result of an expression and is then
+@@ -4070,10 +4089,27 @@ mode([expr])   Return a string that indica
+               This is useful in the 'statusline' option or when used
+               with |remote_expr()| In most other places it always returns
+               "c" or "n".
+               Also see |visualmode()|.
  
- /*
-+ * Return TRUE if there is a match between the word ptr[wlen] and
-+ * CHECKCOMPOUNDPATTERN rules, assuming that we will concatenate with another
-+ * word.
-+ * A match means that the first part of CHECKCOMPOUNDPATTERN matches at the
-+ * end of ptr[wlen] and the second part matches after it.
-+ */
-+    static int
-+match_checkcompoundpattern(ptr, wlen, gap)
-+    char_u    *ptr;
-+    int               wlen;
-+    garray_T  *gap;  /* &sl_comppat */
-+{
-+    int               i;
-+    char_u    *p;
-+    int               len;
-+
-+    for (i = 0; i + 1 < gap->ga_len; i += 2)
-+    {
-+      p = ((char_u **)gap->ga_data)[i + 1];
-+      if (STRNCMP(ptr + wlen, p, STRLEN(p)) == 0)
-+      {
-+          /* Second part matches at start of following compound word, now
-+           * check if first part matches at end of previous word. */
-+          p = ((char_u **)gap->ga_data)[i];
-+          len = (int)STRLEN(p);
-+          if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0)
-+              return TRUE;
-+      }
-+    }
-+    return FALSE;
-+}
++mzeval({expr})                                                        *mzeval()*
++              Evaluate MzScheme expression {expr} and return its result
++              convert to Vim data structures.
++              Numbers and strings are returned as they are.
++              Pairs (including lists and improper lists) and vectors are
++              returned as Vim |Lists|.
++              Hash tables are represented as Vim |Dictionary| type with keys
++              converted to strings.
++              All other types are converted to string with display function.
++              Examples: >
++                  :mz (define l (list 1 2 3))
++                  :mz (define h (make-hash)) (hash-set! h "list" l)
++                  :echo mzeval("l")
++                  :echo mzeval("h")
++<
++              {only available when compiled with the |+mzscheme| feature}
 +
-+/*
-  * Return TRUE if "flags" is a valid sequence of compound flags and "word"
-  * does not have too many syllables.
-  */
-     static int
- can_compound(slang, word, flags)
-@@ -1771,10 +1818,102 @@ can_compound(slang, word, flags)
-       return (int)STRLEN(flags) < slang->sl_compmax;
-     return TRUE;
- }
+ nextnonblank({lnum})                                  *nextnonblank()*
+               Return the line number of the first line at or below {lnum}
+               that is not blank.  Example: >
+                       if getline(nextnonblank(1)) =~ "Java"
+ <             When {lnum} is invalid or there is no non-blank line at or
+@@ -4498,10 +4534,11 @@ remove({dict}, {key})
+ rename({from}, {to})                                  *rename()*
+               Rename the file by the name {from} to the name {to}.  This
+               should also work to move files across file systems.  The
+               result is a Number, which is 0 if the file was renamed
+               successfully, and non-zero when the renaming failed.
++              NOTE: If {to} exists it is overwritten without warning.
+               This function is not available in the |sandbox|.
  
- /*
-+ * Return TRUE when the sequence of flags in "compflags" plus "flag" can
-+ * possibly form a valid compounded word.  This also checks the COMPOUNDRULE
-+ * lines if they don't contain wildcards.
-+ */
-+    static int
-+can_be_compound(sp, slang, compflags, flag)
-+    trystate_T        *sp;
-+    slang_T   *slang;
-+    char_u    *compflags;
-+    int               flag;
-+{
-+    /* If the flag doesn't appear in sl_compstartflags or sl_compallflags
-+     * then it can't possibly compound. */
-+    if (!byte_in_str(sp->ts_complen == sp->ts_compsplit
-+              ? slang->sl_compstartflags : slang->sl_compallflags, flag))
-+      return FALSE;
-+
-+    /* If there are no wildcards, we can check if the flags collected so far
-+     * possibly can form a match with COMPOUNDRULE patterns.  This only
-+     * makes sense when we have two or more words. */
-+    if (slang->sl_comprules != NULL && sp->ts_complen > sp->ts_compsplit)
-+    {
-+      int v;
-+
-+      compflags[sp->ts_complen] = flag;
-+      compflags[sp->ts_complen + 1] = NUL;
-+      v = match_compoundrule(slang, compflags + sp->ts_compsplit);
-+      compflags[sp->ts_complen] = NUL;
-+      return v;
-+    }
-+
-+    return TRUE;
-+}
-+
-+
-+/*
-+ * Return TRUE if the compound flags in compflags[] match the start of any
-+ * compound rule.  This is used to stop trying a compound if the flags
-+ * collected so far can't possibly match any compound rule.
-+ * Caller must check that slang->sl_comprules is not NULL.
-+ */
-+    static int
-+match_compoundrule(slang, compflags)
-+    slang_T   *slang;
-+    char_u    *compflags;
-+{
-+    char_u    *p;
-+    int               i;
-+    int               c;
-+
-+    /* loop over all the COMPOUNDRULE entries */
-+    for (p = slang->sl_comprules; *p != NUL; ++p)
-+    {
-+      /* loop over the flags in the compound word we have made, match
-+       * them against the current rule entry */
-+      for (i = 0; ; ++i)
-+      {
-+          c = compflags[i];
-+          if (c == NUL)
-+              /* found a rule that matches for the flags we have so far */
-+              return TRUE;
-+          if (*p == '/' || *p == NUL)
-+              break;  /* end of rule, it's too short */
-+          if (*p == '[')
-+          {
-+              int match = FALSE;
-+
-+              /* compare against all the flags in [] */
-+              ++p;
-+              while (*p != ']' && *p != NUL)
-+                  if (*p++ == c)
-+                      match = TRUE;
-+              if (!match)
-+                  break;  /* none matches */
-+          }
-+          else if (*p != c)
-+              break;  /* flag of word doesn't match flag in pattern */
-+          ++p;
-+      }
-+
-+      /* Skip to the next "/", where the next pattern starts. */
-+      p = vim_strchr(p, '/');
-+      if (p == NULL)
-+          break;
-+    }
+ repeat({expr}, {count})                                       *repeat()*
+               Repeat {expr} {count} times and return the concatenated
+               result.  Example: >
+@@ -5330,18 +5367,23 @@ synIDattr({synID}, {what} [, {mode}])
+               {what}          result
+               "name"          the name of the syntax item
+               "fg"            foreground color (GUI: color name used to set
+                               the color, cterm: color number as a string,
+                               term: empty string)
+-              "bg"            background color (like "fg")
++              "bg"            background color (as with "fg")
++              "font"          font name (only available in the GUI)
++                              |highlight-font|
++              "sp"            special color (as with "fg") |highlight-guisp|
+               "fg#"           like "fg", but for the GUI and the GUI is
+                               running the name in "#RRGGBB" form
+               "bg#"           like "fg#" for "bg"
++              "sp#"           like "fg#" for "sp"
+               "bold"          "1" if bold
+               "italic"        "1" if italic
+               "reverse"       "1" if reverse
+               "inverse"       "1" if inverse (= reverse)
++              "standout"      "1" if standout
+               "underline"     "1" if underlined
+               "undercurl"     "1" if undercurled
+               Example (echoes the color of the syntax item under the
+               cursor): >
+@@ -5821,11 +5863,12 @@ mouse_dec              Compiled with support for Dec
+ mouse_gpm             Compiled with support for gpm (Linux console mouse)
+ mouse_netterm         Compiled with support for netterm mouse.
+ mouse_pterm           Compiled with support for qnx pterm mouse.
+ mouse_sysmouse                Compiled with support for sysmouse (*BSD console mouse)
+ mouse_xterm           Compiled with support for xterm mouse.
+-multi_byte            Compiled with support for editing Korean et al.
++multi_byte            Compiled with support for 'encoding'
++multi_byte_encoding   'encoding' is set to a multi-byte encoding.
+ multi_byte_ime                Compiled with support for IME input method.
+ multi_lang            Compiled with support for multiple languages.
+ mzscheme              Compiled with MzScheme interface |mzscheme|.
+ netbeans_intg         Compiled with support for |netbeans|.
+ netbeans_enabled      Compiled with support for |netbeans| and it's used.
+@@ -5846,10 +5889,11 @@ ruby                   Compiled with Ruby interface |rub
+ scrollbind            Compiled with 'scrollbind' support.
+ showcmd                       Compiled with 'showcmd' support.
+ signs                 Compiled with |:sign| support.
+ smartindent           Compiled with 'smartindent' support.
+ sniff                 Compiled with SNiFF interface support.
++startuptime           Compiled with |--startuptime| support.
+ statusline            Compiled with support for 'statusline', 'rulerformat'
+                       and special formats of 'titlestring' and 'iconstring'.
+ sun_workshop          Compiled with support for Sun |workshop|.
+ spell                 Compiled with spell checking support |spell|.
+ syntax                        Compiled with syntax highlighting support |syntax|.
+--- vim72.orig/runtime/doc/if_cscop.txt
++++ vim72/runtime/doc/if_cscop.txt
+@@ -1,6 +1,6 @@
+-*if_cscop.txt*  For Vim version 7.2.  Last change: 2005 Mar 29
++*if_cscop.txt*  For Vim version 7.2.  Last change: 2009 Mar 18
+                 VIM REFERENCE MANUAL    by Andy Kahn
+                                                       *cscope* *Cscope*
+@@ -129,15 +129,26 @@ The available subcommands are:
+               4 or t: Find this text string
+               6 or e: Find this egrep pattern
+               7 or f: Find this file
+               8 or i: Find files #including this file
++      For all types, except 4 and 6, leading white space for {name} is
++      removed.  For 4 and 6 there is exactly one space between {querytype}
++      and {name}.  Further white space is included in {name}.
 +
-+    /* Checked all the rules and none of them match the flags, so there
-+     * can't possibly be a compound starting with these flags. */
-+    return FALSE;
-+}
+       EXAMPLES >
+           :cscope find c vim_free
+-          :cscope find 3 vim_free
++          :cscope find 3  vim_free
++<
++          These two examples perform the same query: functions calling
++          "vim_free". >
 +
-+/*
-  * Return non-zero if the prefix indicated by "arridx" matches with the prefix
-  * ID in "flags" for the word "word".
-  * The WF_RAREPFX flag is included in the return value for a rare prefix.
-  */
-     static int
-@@ -2235,11 +2374,11 @@ spell_move_to(wp, dir, allwords, curline
-                   give_warning((char_u *)_(bot_top_msg), TRUE);
-           }
++          :cscope find t initOnce
++          :cscope find t  initOnce
+ <
+-          These two examples perform the same query. >
++          The first one searches for the text "initOnce", the second one for
++          " initOnce". >
  
-           /* If we are back at the starting line and there is no match then
-            * give up. */
--          if (lnum == wp->w_cursor.lnum && !found_one)
-+          if (lnum == wp->w_cursor.lnum && (!found_one || wrapped))
-               break;
+           :cscope find 0 DEFAULT_TERM
+ <
+           Executing this example on the source code for Vim 5.1 produces the
+           following output:
+@@ -342,17 +353,12 @@ cscope version for Win32 see:
+       http://iamphet.nm.ru/cscope/index.html
  
-           /* Skip the characters at the start of the next line that were
-            * included in a match crossing line boundaries. */
-           if (attr == HLF_COUNT)
-@@ -2511,13 +2650,15 @@ slang_clear(lp)
+ The DJGPP-built version from http://cscope.sourceforge.net is known to not
+ work with Vim.
  
-     vim_free(lp->sl_midword);
-     lp->sl_midword = NULL;
+-There are a couple of hard-coded limitations:
+-
+-    1. The maximum number of cscope connections allowed is 8.  Do you
+-    really need more?
+-
+-    2. Doing a |:tjump| when |:cstag| searches the tag files is not
+-    configurable (e.g., you can't do a tselect instead).
++Hard-coded limitation: doing a |:tjump| when |:cstag| searches the tag files
++is not configurable (e.g., you can't do a tselect instead).
  
-     vim_free(lp->sl_compprog);
-+    vim_free(lp->sl_comprules);
-     vim_free(lp->sl_compstartflags);
-     vim_free(lp->sl_compallflags);
-     lp->sl_compprog = NULL;
-+    lp->sl_comprules = NULL;
-     lp->sl_compstartflags = NULL;
-     lp->sl_compallflags = NULL;
+ ==============================================================================
+ 6. Suggested usage                                    *cscope-suggestions*
  
-     vim_free(lp->sl_syllable);
-     lp->sl_syllable = NULL;
-@@ -3458,10 +3599,11 @@ read_compound(fd, slang, len)
-     int               atstart;
-     char_u    *pat;
-     char_u    *pp;
-     char_u    *cp;
-     char_u    *ap;
-+    char_u    *crp;
-     int               cnt;
-     garray_T  *gap;
+ Put these entries in your .vimrc (adjust the pathname accordingly to your
+@@ -473,11 +479,12 @@ The cscope interface/support for Vim was
+ Andy Kahn <ackahn@netapp.com>.  The original structure (as well as a tiny
+ bit of code) was adapted from the cscope interface in nvi.  Please report
+ any problems, suggestions, patches, et al., you have for the usage of
+ cscope within Vim to him.
+                                                       *cscope-win32*
+-For a cscope version for Win32 see: http://iamphet.nm.ru/cscope/index.html
++For a cscope version for Win32 see:
++      http://code.google.com/p/cscope-win32/
  
-     if (todo < 2)
-       return SP_FORMERROR;    /* need at least two bytes */
-@@ -3543,10 +3685,16 @@ read_compound(fd, slang, len)
-       return SP_OTHERERROR;
-     }
-     slang->sl_compallflags = ap;
-     *ap = NUL;
+ Win32 support was added by Sergey Khorev <sergey.khorev@gmail.com>.  Contact
+ him if you have Win32-specific issues.
  
-+    /* And a list of all patterns in their original form, for checking whether
-+     * compounding may work in match_compoundrule().  This is freed when we
-+     * encounter a wildcard, the check doesn't work then. */
-+    crp = alloc(todo + 1);
-+    slang->sl_comprules = crp;
-+
-     pp = pat;
-     *pp++ = '^';
-     *pp++ = '\\';
-     *pp++ = '(';
+  vim:tw=78:ts=8:ft=help:norl:
+--- vim72.orig/runtime/doc/if_mzsch.txt
++++ vim72/runtime/doc/if_mzsch.txt
+@@ -1,18 +1,19 @@
+-*if_mzsch.txt*  For Vim version 7.2.  Last change: 2008 Jun 28
++*if_mzsch.txt*  For Vim version 7.2.  Last change: 2010 Jan 19
  
-@@ -3585,10 +3733,24 @@ read_compound(fd, slang, len)
-               }
-               if (atstart == 1)
-                   atstart = 0;
-           }
-       }
-+
-+      /* Copy flag to "sl_comprules", unless we run into a wildcard. */
-+      if (crp != NULL)
-+      {
-+          if (c == '+' || c == '*')
-+          {
-+              vim_free(slang->sl_comprules);
-+              slang->sl_comprules = NULL;
-+              crp = NULL;
-+          }
-+          else
-+              *crp++ = c;
-+      }
-+
-       if (c == '/')       /* slash separates two items */
-       {
-           *pp++ = '\\';
-           *pp++ = '|';
-           atstart = 1;
-@@ -3609,10 +3771,13 @@ read_compound(fd, slang, len)
-     *pp++ = '\\';
-     *pp++ = ')';
-     *pp++ = '$';
-     *pp = NUL;
  
-+    if (crp != NULL)
-+      *crp = NUL;
-+
-     slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT);
-     vim_free(pat);
-     if (slang->sl_compprog == NULL)
-       return SP_FORMERROR;
+                 VIM REFERENCE MANUAL    by Sergey Khorev
  
-@@ -4789,17 +4954,20 @@ typedef struct compitem_S
  
- /*
-  * Structure that is used to store the items in the word tree.  This avoids
-  * the need to keep track of each allocated thing, everything is freed all at
-  * once after ":mkspell" is done.
-+ * Note: "sb_next" must be just before "sb_data" to make sure the alignment of
-+ * "sb_data" is correct for systems where pointers must be aligned on
-+ * pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc).
-  */
- #define  SBLOCKSIZE 16000     /* size of sb_data */
- typedef struct sblock_S sblock_T;
- struct sblock_S
- {
--    sblock_T  *sb_next;       /* next block in list */
-     int               sb_used;        /* nr of bytes already in use */
-+    sblock_T  *sb_next;       /* next block in list */
-     char_u    sb_data[1];     /* data, actually longer */
- };
+ The MzScheme Interface to Vim                         *mzscheme* *MzScheme*
  
- /*
-  * A node in the tree.
-@@ -4913,10 +5081,11 @@ typedef struct spellinfo_S
-     int               si_newprefID;   /* current value for ah_newID */
-     int               si_newcompID;   /* current value for compound ID */
- } spellinfo_T;
+ 1. Commands                           |mzscheme-commands|
+ 2. Examples                           |mzscheme-examples|
+ 3. Threads                            |mzscheme-threads|
+-4. The Vim access procedures          |mzscheme-vim|
+-5. Dynamic loading                    |mzscheme-dynamic|
++4. Vim access from MzScheme           |mzscheme-vim|
++5. mzeval() Vim function              |mzscheme-mzeval|
++6. Dynamic loading                    |mzscheme-dynamic|
  
- static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname));
-+static int is_aff_rule __ARGS((char_u **items, int itemcnt, char *rulename, int        mincount));
- static void aff_process_flags __ARGS((afffile_T *affile, affentry_T *entry));
- static int spell_info_item __ARGS((char_u *s));
- static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u       *fname, int lnum));
- static unsigned get_affitem __ARGS((int flagtype, char_u **pp));
- static void process_compflags __ARGS((spellinfo_T *spin, afffile_T *aff, char_u *compflags));
-@@ -4948,11 +5117,11 @@ static void wordtree_compress __ARGS((sp
- static int node_compress __ARGS((spellinfo_T *spin, wordnode_T *node, hashtab_T *ht, int *tot));
- static int node_equal __ARGS((wordnode_T *n1, wordnode_T *n2));
- static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd));
- static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname));
- static void clear_node __ARGS((wordnode_T *node));
--static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree));
-+static int put_node __ARGS((FILE *fd, wordnode_T *node, int idx, int regionmask, int prefixtree));
- static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname));
- static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang));
- static int sug_maketable __ARGS((spellinfo_T *spin));
- static int sug_filltable __ARGS((spellinfo_T *spin, wordnode_T *node, int startwordnr, garray_T *gap));
- static int offset2bytes __ARGS((int nr, char_u *buf));
-@@ -5221,12 +5390,11 @@ spell_read_aff(spin, fname)
-       }
+ {Vi does not have any of these commands}
  
-       /* Handle non-empty lines. */
-       if (itemcnt > 0)
-       {
--          if (STRCMP(items[0], "SET") == 0 && itemcnt == 2
--                                                     && aff->af_enc == NULL)
-+          if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL)
-           {
- #ifdef FEAT_MBYTE
-               /* Setup for conversion from "ENC" to 'encoding'. */
-               aff->af_enc = enc_canonize(items[1]);
-               if (aff->af_enc != NULL && !spin->si_ascii
-@@ -5237,11 +5405,11 @@ spell_read_aff(spin, fname)
-               spin->si_conv.vc_fail = TRUE;
- #else
-                   smsg((char_u *)_("Conversion in %s not supported"), fname);
- #endif
-           }
--          else if (STRCMP(items[0], "FLAG") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "FLAG", 2)
-                                             && aff->af_flagtype == AFT_CHAR)
-           {
-               if (STRCMP(items[1], "long") == 0)
-                   aff->af_flagtype = AFT_LONG;
-               else if (STRCMP(items[1], "num") == 0)
-@@ -5282,90 +5450,92 @@ spell_read_aff(spin, fname)
-                       STRCAT(p, " ");
-                       STRCAT(p, items[1]);
-                       spin->si_info = p;
-                   }
-           }
--          else if (STRCMP(items[0], "MIDWORD") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "MIDWORD", 2)
-                                                          && midword == NULL)
-           {
-               midword = getroom_save(spin, items[1]);
-           }
--          else if (STRCMP(items[0], "TRY") == 0 && itemcnt == 2)
-+          else if (is_aff_rule(items, itemcnt, "TRY", 2))
-           {
-               /* ignored, we look in the tree for what chars may appear */
-           }
-           /* TODO: remove "RAR" later */
--          else if ((STRCMP(items[0], "RAR") == 0
--                      || STRCMP(items[0], "RARE") == 0) && itemcnt == 2
--                                                     && aff->af_rare == 0)
-+          else if ((is_aff_rule(items, itemcnt, "RAR", 2)
-+                      || is_aff_rule(items, itemcnt, "RARE", 2))
-+                                                       && aff->af_rare == 0)
-           {
-               aff->af_rare = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
-           /* TODO: remove "KEP" later */
--          else if ((STRCMP(items[0], "KEP") == 0
--                  || STRCMP(items[0], "KEEPCASE") == 0) && itemcnt == 2
-+          else if ((is_aff_rule(items, itemcnt, "KEP", 2)
-+                      || is_aff_rule(items, itemcnt, "KEEPCASE", 2))
-                                                    && aff->af_keepcase == 0)
-           {
-               aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
--          else if (STRCMP(items[0], "BAD") == 0 && itemcnt == 2
--                                                     && aff->af_bad == 0)
-+          else if ((is_aff_rule(items, itemcnt, "BAD", 2)
-+                      || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2))
-+                                                        && aff->af_bad == 0)
-           {
-               aff->af_bad = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
--          else if (STRCMP(items[0], "NEEDAFFIX") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2)
-                                                   && aff->af_needaffix == 0)
-           {
-               aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
--          else if (STRCMP(items[0], "CIRCUMFIX") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2)
-                                                   && aff->af_circumfix == 0)
-           {
-               aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
--          else if (STRCMP(items[0], "NOSUGGEST") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2)
-                                                   && aff->af_nosuggest == 0)
-           {
-               aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
--          else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2
-+          else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2)
-+                      || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2))
-                                                    && aff->af_needcomp == 0)
-           {
-               aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
--          else if (STRCMP(items[0], "COMPOUNDROOT") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2)
-                                                    && aff->af_comproot == 0)
-           {
-               aff->af_comproot = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-           }
--          else if (STRCMP(items[0], "COMPOUNDFORBIDFLAG") == 0
--                                 && itemcnt == 2 && aff->af_compforbid == 0)
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2)
-+                                                 && aff->af_compforbid == 0)
-           {
-               aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-               if (aff->af_pref.ht_used > 0)
-                   smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"),
-                           fname, lnum);
-           }
--          else if (STRCMP(items[0], "COMPOUNDPERMITFLAG") == 0
--                                 && itemcnt == 2 && aff->af_comppermit == 0)
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2)
-+                                                 && aff->af_comppermit == 0)
-           {
-               aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1],
-                                                                fname, lnum);
-               if (aff->af_pref.ht_used > 0)
-                   smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"),
-                           fname, lnum);
-           }
--          else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2)
-                                                        && compflags == NULL)
-           {
-               /* Turn flag "c" into COMPOUNDRULE compatible string "c+",
-                * "Na" into "Na+", "1234" into "1234+". */
-               p = getroom(spin, STRLEN(items[1]) + 2, FALSE);
-@@ -5374,11 +5544,19 @@ spell_read_aff(spin, fname)
-                   STRCPY(p, items[1]);
-                   STRCAT(p, "+");
-                   compflags = p;
-               }
-           }
--          else if (STRCMP(items[0], "COMPOUNDRULE") == 0 && itemcnt == 2)
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2))
-+          {
-+              /* We don't use the count, but do check that it's a number and
-+               * not COMPOUNDRULE mistyped. */
-+              if (atoi((char *)items[1]) == 0)
-+                  smsg((char_u *)_("Wrong COMPOUNDRULES value in %s line %d: %s"),
-+                                                     fname, lnum, items[1]);
-+          }
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2))
-           {
-               /* Concatenate this string to previously defined ones, using a
-                * slash to separate them. */
-               l = (int)STRLEN(items[1]) + 1;
-               if (compflags != NULL)
-@@ -5393,60 +5571,57 @@ spell_read_aff(spin, fname)
-                   }
-                   STRCAT(p, items[1]);
-                   compflags = p;
-               }
-           }
--          else if (STRCMP(items[0], "COMPOUNDWORDMAX") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
-                                                             && compmax == 0)
-           {
-               compmax = atoi((char *)items[1]);
-               if (compmax == 0)
-                   smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"),
-                                                      fname, lnum, items[1]);
-           }
--          else if (STRCMP(items[0], "COMPOUNDMIN") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2)
-                                                          && compminlen == 0)
-           {
-               compminlen = atoi((char *)items[1]);
-               if (compminlen == 0)
-                   smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"),
-                                                      fname, lnum, items[1]);
-           }
--          else if (STRCMP(items[0], "COMPOUNDSYLMAX") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2)
-                                                          && compsylmax == 0)
-           {
-               compsylmax = atoi((char *)items[1]);
-               if (compsylmax == 0)
-                   smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"),
-                                                      fname, lnum, items[1]);
-           }
--          else if (STRCMP(items[0], "CHECKCOMPOUNDDUP") == 0 && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1))
-           {
-               compoptions |= COMP_CHECKDUP;
-           }
--          else if (STRCMP(items[0], "CHECKCOMPOUNDREP") == 0 && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1))
-           {
-               compoptions |= COMP_CHECKREP;
-           }
--          else if (STRCMP(items[0], "CHECKCOMPOUNDCASE") == 0 && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1))
-           {
-               compoptions |= COMP_CHECKCASE;
-           }
--          else if (STRCMP(items[0], "CHECKCOMPOUNDTRIPLE") == 0
--                                                            && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1))
-           {
-               compoptions |= COMP_CHECKTRIPLE;
-           }
--          else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
--                                                            && itemcnt == 2)
-+          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2))
-           {
-               if (atoi((char *)items[1]) == 0)
-                   smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"),
-                                                      fname, lnum, items[1]);
-           }
--          else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
--                                                            && itemcnt == 3)
-+          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3))
-           {
-               garray_T    *gap = &spin->si_comppat;
-               int         i;
+ The MzScheme interface is available only if Vim was compiled with the
+ |+mzscheme| feature.
+@@ -40,24 +41,18 @@ Note: On FreeBSD you should use the "drs
+                       feature wasn't compiled in.  To avoid errors, see
+                       |script-here|.
  
-               /* Only add the couple if it isn't already there. */
-@@ -5461,28 +5636,28 @@ spell_read_aff(spin, fname)
-                                              = getroom_save(spin, items[1]);
-                   ((char_u **)(gap->ga_data))[gap->ga_len++]
-                                              = getroom_save(spin, items[2]);
-               }
-           }
--          else if (STRCMP(items[0], "SYLLABLE") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2)
-                                                         && syllable == NULL)
-           {
-               syllable = getroom_save(spin, items[1]);
-           }
--          else if (STRCMP(items[0], "NOBREAK") == 0 && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "NOBREAK", 1))
-           {
-               spin->si_nobreak = TRUE;
-           }
--          else if (STRCMP(items[0], "NOSPLITSUGS") == 0 && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1))
-           {
-               spin->si_nosplitsugs = TRUE;
-           }
--          else if (STRCMP(items[0], "NOSUGFILE") == 0 && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1))
-           {
-               spin->si_nosugfile = TRUE;
-           }
--          else if (STRCMP(items[0], "PFXPOSTPONE") == 0 && itemcnt == 1)
-+          else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1))
-           {
-               aff->af_pfxpostpone = TRUE;
-           }
-           else if ((STRCMP(items[0], "PFX") == 0
-                                             || STRCMP(items[0], "SFX") == 0)
-@@ -5769,28 +5944,24 @@ spell_read_aff(spin, fname)
-                           cur_aff->ah_newID = 0;
-                       }
-                   }
-               }
-           }
--          else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2
--                                                             && fol == NULL)
-+          else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL)
-           {
-               fol = vim_strsave(items[1]);
-           }
--          else if (STRCMP(items[0], "LOW") == 0 && itemcnt == 2
--                                                             && low == NULL)
-+          else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL)
-           {
-               low = vim_strsave(items[1]);
-           }
--          else if (STRCMP(items[0], "UPP") == 0 && itemcnt == 2
--                                                             && upp == NULL)
-+          else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL)
-           {
-               upp = vim_strsave(items[1]);
-           }
--          else if ((STRCMP(items[0], "REP") == 0
--                      || STRCMP(items[0], "REPSAL") == 0)
--                  && itemcnt == 2)
-+          else if (is_aff_rule(items, itemcnt, "REP", 2)
-+                   || is_aff_rule(items, itemcnt, "REPSAL", 2))
-           {
-               /* Ignore REP/REPSAL count */;
-               if (!isdigit(*items[1]))
-                   smsg((char_u *)_("Expected REP(SAL) count in %s line %d"),
-                                                                fname, lnum);
-@@ -5817,11 +5988,11 @@ spell_read_aff(spin, fname)
-                   add_fromto(spin, items[0][3] == 'S'
-                                        ? &spin->si_repsal
-                                        : &spin->si_rep, items[1], items[2]);
-               }
-           }
--          else if (STRCMP(items[0], "MAP") == 0 && itemcnt == 2)
-+          else if (is_aff_rule(items, itemcnt, "MAP", 2))
-           {
-               /* MAP item or count */
-               if (!found_map)
-               {
-                   /* First line contains the count. */
-@@ -5854,13 +6025,12 @@ spell_read_aff(spin, fname)
-                    * slashes. */
-                   ga_concat(&spin->si_map, items[1]);
-                   ga_append(&spin->si_map, '/');
-               }
-           }
--          /* Accept "SAL from to" and "SAL from to # comment". */
--          else if (STRCMP(items[0], "SAL") == 0
--                  && (itemcnt == 3 || (itemcnt > 3 && items[3][0] == '#')))
-+          /* Accept "SAL from to" and "SAL from to  #comment". */
-+          else if (is_aff_rule(items, itemcnt, "SAL", 3))
-           {
-               if (do_sal)
-               {
-                   /* SAL item (sounds-a-like)
-                    * Either one of the known keys or a from-to pair. */
-@@ -5875,16 +6045,16 @@ spell_read_aff(spin, fname)
-                       add_fromto(spin, &spin->si_sal, items[1],
-                                    STRCMP(items[2], "_") == 0 ? (char_u *)""
-                                                               : items[2]);
-               }
-           }
--          else if (STRCMP(items[0], "SOFOFROM") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2)
-                                                         && sofofrom == NULL)
-           {
-               sofofrom = getroom_save(spin, items[1]);
-           }
--          else if (STRCMP(items[0], "SOFOTO") == 0 && itemcnt == 2
-+          else if (is_aff_rule(items, itemcnt, "SOFOTO", 2)
-                                                           && sofoto == NULL)
-           {
-               sofoto = getroom_save(spin, items[1]);
-           }
-           else if (STRCMP(items[0], "COMMON") == 0)
-@@ -5978,11 +6148,11 @@ spell_read_aff(spin, fname)
-       if (spin->si_newcompID == 127 || spin->si_newcompID == 255)
-           MSG(_("Too many postponed prefixes"));
-       else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
-           MSG(_("Too many compound flags"));
-       else
--          MSG(_("Too many posponed prefixes and/or compound flags"));
-+          MSG(_("Too many postponed prefixes and/or compound flags"));
-     }
+                                                       *:mzfile* *:mzf*
+ :[range]mzf[ile] {file}       Execute the MzScheme script in {file}.  {not in Vi}
+-                      All statements are executed in the namespace of the
+-                      buffer that was current during :mzfile start.
+-                      If you want to access other namespaces, use
+-                      'parameterize'.
  
-     if (syllable != NULL)
-     {
-       aff_check_string(spin->si_syllable, syllable, "SYLLABLE");
-@@ -6015,10 +6185,26 @@ spell_read_aff(spin, fname)
-     fclose(fd);
-     return aff;
- }
+ All of these commands do essentially the same thing - they execute a piece of
+ MzScheme code, with the "current range" set to the given line
+ range.
  
- /*
-+ * Return TRUE when items[0] equals "rulename", there are "mincount" items or
-+ * a comment is following after item "mincount".
-+ */
-+    static int
-+is_aff_rule(items, itemcnt, rulename, mincount)
-+    char_u    **items;
-+    int               itemcnt;
-+    char      *rulename;
-+    int               mincount;
-+{
-+    return (STRCMP(items[0], rulename) == 0
-+          && (itemcnt == mincount
-+              || (itemcnt > mincount && items[mincount][0] == '#')));
-+}
-+
-+/*
-  * For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from
-  * ae_flags to ae_comppermit and ae_compforbid.
-  */
-     static void
- aff_process_flags(affile, entry)
-@@ -7864,11 +8050,11 @@ put_sugtime(spin, fd)
-     int               i;
+ In the case of :mzscheme, the code to execute is in the command-line.
+ In the case of :mzfile, the code to execute is the contents of the given file.
  
-     /* time_t can be up to 8 bytes in size, more than long_u, thus we
-      * can't use put_bytes() here. */
-     for (i = 7; i >= 0; --i)
--      if (i + 1 > sizeof(time_t))
-+      if (i + 1 > (int)sizeof(time_t))
-           /* ">>" doesn't work well when shifting more bits than avail */
-           putc(0, fd);
-       else
-       {
-           c = (unsigned)spin->si_sugtime >> (i * 8);
-@@ -7924,25 +8110,27 @@ write_vim_spell(spin, fname)
-     garray_T  *gap;
-     fromto_T  *ftp;
-     char_u    *p;
-     int               rr;
-     int               retval = OK;
-+    size_t    fwv = 1;  /* collect return value of fwrite() to avoid
-+                           warnings from picky compiler */
+-Each buffer has its own MzScheme namespace. Global namespace is bound to
+-the "global-namespace" value from the 'vimext' module.
+ MzScheme interface defines exception exn:vim, derived from exn.
+ It is raised for various Vim errors.
  
-     fd = mch_fopen((char *)fname, "w");
-     if (fd == NULL)
-     {
-       EMSG2(_(e_notopen), fname);
-       return FAIL;
-     }
+ During compilation, the MzScheme interface will remember the current MzScheme
+ collection path. If you want to specify additional paths use the
+@@ -77,79 +72,68 @@ The exn:vim is available without explici
  
-     /* <HEADER>: <fileID> <versionnr> */
-                                                           /* <fileID> */
--    if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1)
--    {
--      EMSG(_(e_write));
--      retval = FAIL;
--    }
-+    fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd);
-+    if (fwv != (size_t)1)
-+      /* Catch first write error, don't try writing more. */
-+      goto theend;
-+
-     putc(VIMSPELLVERSION, fd);                                    /* <versionnr> */
+ To avoid clashes with MzScheme, consider using prefix when requiring module,
+ e.g.: >
+       :mzscheme (require (prefix vim- vimext))
+ <
+-All the examples below assume this naming scheme.  Note that you need to do
+-this again for every buffer.
++All the examples below assume this naming scheme.
  
-     /*
-      * <SECTIONS>: <section> ... <sectionend>
-      */
-@@ -7953,22 +8141,22 @@ write_vim_spell(spin, fname)
-       putc(SN_INFO, fd);                              /* <sectionID> */
-       putc(0, fd);                                    /* <sectionflags> */
+-The auto-instantiation can be achieved with autocommands, e.g. you can put
+-something like this in your .vimrc (EOFs should not have indentation): >
+-    function s:MzRequire()
+-      if has("mzscheme")
+-          :mz << EOF
+-          (require (prefix vim- vimext))
+-          (let ((buf (vim-get-buff-by-name (vim-eval "expand(\"<afile>\")"))))
+-            (when (and buf (not (eq? buf (vim-curr-buff))))
+-              (parameterize ((current-namespace (vim-get-buff-namespace buf)))
+-                (namespace-attach-module vim-global-namespace 'vimext)
+-                (namespace-require '(prefix vim vimext)))))
+-    EOF
+-      endif
+-    endfunction
+-
+-    function s:MzStartup()
+-      if has("mzscheme")
+-          au BufNew,BufNewFile,BufAdd,BufReadPre * :call s:MzRequire()
+-          :mz << EOF
+-          (current-library-collection-paths
+-              (cons
+-                  (build-path (find-system-path 'addon-dir) (version) "collects")
+-                  (current-library-collection-paths)))
+-    EOF
+-      endif
+-    endfunction
+-
+-    call s:MzStartup()
+-<
+-
+-The global namespace just instantiated this module with the prefix "vimext:".
+                                                       *mzscheme-sandbox*
+ When executed in the |sandbox|, access to some filesystem and Vim interface
+ procedures is restricted.
  
-       i = (int)STRLEN(spin->si_info);
-       put_bytes(fd, (long_u)i, 4);                    /* <sectionlen> */
--      fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
-+      fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
-     }
+ ==============================================================================
+ 2. Examples                                           *mzscheme-examples*
+ >
+       :mzscheme (display "Hello")
++      :mz (display (string-append "Using MzScheme version " (version)))
++      :mzscheme (require (prefix vim- vimext)) ; for MzScheme < 4.x
++      :mzscheme (require (prefix-in vim- 'vimext)) ; MzScheme 4.x
+       :mzscheme (vim-set-buff-line 10 "This is line #10")
+ <
+ Inline script usage: >
+       function! <SID>SetFirstLine()
+           :mz << EOF
+           (display "!!!")
++          (require (prefix vim- vimext))
++          ; for newer versions (require (prefix-in vim- 'vimext))
+           (vim-set-buff-line 1 "This is line #1")
+           (vim-beep)
+-          EOF
++      EOF
+       endfunction
  
-     /* SN_REGION: <regionname> ...
-      * Write the region names only if there is more than one. */
-     if (spin->si_region_count > 1)
-     {
-       putc(SN_REGION, fd);                            /* <sectionID> */
-       putc(SNF_REQUIRED, fd);                         /* <sectionflags> */
-       l = spin->si_region_count * 2;
-       put_bytes(fd, (long_u)l, 4);                    /* <sectionlen> */
--      fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
-+      fwv &= fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
-                                                       /* <regionname> ... */
-       regionmask = (1 << spin->si_region_count) - 1;
-     }
-     else
-       regionmask = 0;
-@@ -8014,22 +8202,23 @@ write_vim_spell(spin, fname)
-               flags |= CF_UPPER;
-           fputc(flags, fd);                           /* <charflags> */
-       }
+       nmap <F9> :call <SID>SetFirstLine() <CR>
+ <
+ File execution: >
+       :mzfile supascript.scm
+ <
+-Accessing the current buffer namespace from an MzScheme program running in
+-another buffer within |:mzfile|-executed script : >
+-      ; Move to the window below
+-      (vim-command "wincmd j")
+-      ; execute in the context of buffer, to which window belongs
+-      ; assume that buffer has 'textstring' defined
+-      (parameterize ((current-namespace
+-                      (vim-get-buff-namespace (vim-curr-buff))))
+-       (eval '(vim-set-buff-line 1 textstring)))
+-<
++Vim exception handling: >
++      :mz << EOF
++      (require (prefix vim- vimext))
++      ; for newer versions (require (prefix-in vim- 'vimext))
++      (with-handlers
++        ([exn:vim? (lambda (e) (display (exn-message e)))])
++        (vim-eval "nonsense-string"))
++      EOF
++<
++Auto-instantiation of vimext module (can be placed in your |vimrc|): >
++    function! MzRequire()
++      :redir => l:mzversion
++      :mz (version)
++      :redir END
++      if strpart(l:mzversion, 1, 1) < "4"
++          " MzScheme versions < 4.x:
++          :mz (require (prefix vim- vimext))
++      else
++          " newer versions:
++          :mz (require (prefix-in vim- 'vimext))
++      endif
++    endfunction
  
-       put_bytes(fd, (long_u)l, 2);                    /* <folcharslen> */
--      fwrite(folchars, (size_t)l, (size_t)1, fd);     /* <folchars> */
-+      fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */
-     }
++    if has("mzscheme")
++      silent call MzRequire()
++    endif
++<
+ ==============================================================================
+ 3. Threads                                            *mzscheme-threads*
  
-     /* SN_MIDWORD: <midword> */
-     if (spin->si_midword != NULL)
-     {
-       putc(SN_MIDWORD, fd);                           /* <sectionID> */
-       putc(SNF_REQUIRED, fd);                         /* <sectionflags> */
+ The MzScheme interface supports threads. They are independent from OS threads,
+ thus scheduling is required. The option 'mzquantum' determines how often
+@@ -157,24 +141,24 @@ Vim should poll for available MzScheme t
+ NOTE
+ Thread scheduling in the console version of Vim is less reliable than in the
+ GUI version.
  
-       i = (int)STRLEN(spin->si_midword);
-       put_bytes(fd, (long_u)i, 4);                    /* <sectionlen> */
--      fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* <midword> */
-+      fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd);
-+                                                      /* <midword> */
-     }
+ ==============================================================================
+-5. VIM Functions                                      *mzscheme-vim*
++4. Vim access from MzScheme                           *mzscheme-vim*
  
-     /* SN_PREFCOND: <prefcondcnt> <prefcond> ... */
-     if (spin->si_prefcond.ga_len > 0)
-     {
-@@ -8111,11 +8300,12 @@ write_vim_spell(spin, fname)
-           for (rr = 1; rr <= 2; ++rr)
-           {
-               p = rr == 1 ? ftp->ft_from : ftp->ft_to;
-               l = (int)STRLEN(p);
-               putc(l, fd);
--              fwrite(p, l, (size_t)1, fd);
-+              if (l > 0)
-+                  fwv &= fwrite(p, l, (size_t)1, fd);
-           }
-       }
+                                                       *mzscheme-vimext*
+ The 'vimext' module provides access to procedures defined in the MzScheme
+ interface.
  
-     }
+ Common
+ ------
+     (command {command-string})            Perform the vim ":Ex" style command.
+-    (eval {expr-string})          Evaluate the vim expression to a string.
+-                                  A |List| is turned into a string by
+-                                  joining the items and inserting line
+-                                  breaks.
+-                                  NOTE clashes with MzScheme eval
++    (eval {expr-string})          Evaluate the vim expression into
++                                  respective MzScheme object: |Lists| are
++                                  represented as Scheme lists,
++                                  |Dictionaries| as hash tables.
++                                  NOTE the name clashes with MzScheme eval
+     (range-start)                 Start/End of the range passed with
+     (range-end)                           the Scheme command.
+     (beep)                        beep
+     (get-option {option-name} [buffer-or-window]) Get Vim option value (either
+                                   local or global, see set-option).
+@@ -184,11 +168,10 @@ Common
+                                   optname+=optval, etc.) When called with
+                                   {buffer} or {window} the local option will
+                                   be set. The symbol 'global can be passed
+                                   as {buffer-or-window}. Then |:setglobal|
+                                   will be used.
+-    global-namespace              The MzScheme main namespace.
  
-@@ -8129,15 +8319,15 @@ write_vim_spell(spin, fname)
-       l = (int)STRLEN(spin->si_sofofr);
-       put_bytes(fd, (long_u)(l + STRLEN(spin->si_sofoto) + 4), 4);
-                                                       /* <sectionlen> */
+ Buffers                                                        *mzscheme-buffer*
+ -------
+     (buff? {object})              Is object a buffer?
+     (buff-valid? {object})        Is object a valid buffer? (i.e.
+@@ -226,11 +209,10 @@ Buffers                                                   *mzscheme-buffer*
+     (open-buff {filename})        Open a new buffer (for file "name")
+     (get-buff-by-name {buffername}) Get a buffer by its filename or #f
+                                       if there is no such buffer.
+     (get-buff-by-num {buffernum})   Get a buffer by its number (return #f if
+                                   there is no buffer with this number).
+-    (get-buff-namespace [buffer])   Get buffer namespace.
  
-       put_bytes(fd, (long_u)l, 2);                    /* <sofofromlen> */
--      fwrite(spin->si_sofofr, l, (size_t)1, fd);      /* <sofofrom> */
-+      fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */
+ Windows                                                           *mzscheme-window*
+ ------
+     (win? {object})               Is object a window?
+     (win-valid? {object})         Is object a valid window (i.e. corresponds
+@@ -248,11 +230,17 @@ Windows                                                      *mzscheme-window*
+     (get-cursor [window])         Get cursor position in a window as
+                                   a pair (linenr . column).
+     (set-cursor (line . col) [window])  Set cursor position.
  
-       l = (int)STRLEN(spin->si_sofoto);
-       put_bytes(fd, (long_u)l, 2);                    /* <sofotolen> */
--      fwrite(spin->si_sofoto, l, (size_t)1, fd);      /* <sofoto> */
-+      fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */
-     }
+ ==============================================================================
+-5. Dynamic loading                                    *mzscheme-dynamic*
++5. mzeval() Vim function                                  *mzscheme-mzeval*
++
++To facilitate bi-directional interface, you can use |mzeval| function to
++evaluate MzScheme expressions and pass their values to VimL.
++
++==============================================================================
++6. Dynamic loading                                *mzscheme-dynamic* *E815*
  
-     /* SN_WORDS: <word> ...
-      * This is for making suggestions, section is not required. */
-     if (spin->si_commonwords.ht_used > 0)
-@@ -8158,11 +8348,11 @@ write_vim_spell(spin, fname)
-               if (!HASHITEM_EMPTY(hi))
-               {
-                   l = (int)STRLEN(hi->hi_key) + 1;
-                   len += l;
-                   if (round == 2)                     /* <word> */
--                      fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
-+                      fwv &= fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
-                   --todo;
-               }
-           if (round == 1)
-               put_bytes(fd, (long_u)len, 4);          /* <sectionlen> */
-       }
-@@ -8174,11 +8364,11 @@ write_vim_spell(spin, fname)
-     {
-       putc(SN_MAP, fd);                               /* <sectionID> */
-       putc(0, fd);                                    /* <sectionflags> */
-       l = spin->si_map.ga_len;
-       put_bytes(fd, (long_u)l, 4);                    /* <sectionlen> */
--      fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
-+      fwv &= fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
-                                                       /* <mapstr> */
-     }
-     /* SN_SUGFILE: <timestamp>
-      * This is used to notify that a .sug file may be available and at the
-@@ -8230,14 +8420,15 @@ write_vim_spell(spin, fname)
-                                                       /* <comppatcount> */
-       for (i = 0; i < spin->si_comppat.ga_len; ++i)
-       {
-           p = ((char_u **)(spin->si_comppat.ga_data))[i];
-           putc((int)STRLEN(p), fd);                   /* <comppatlen> */
--          fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* <comppattext> */
-+          fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);
-+                                                      /* <comppattext> */
-       }
-                                                       /* <compflags> */
--      fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
-+      fwv &= fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
-                                                              (size_t)1, fd);
-     }
+ On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version|
+ output then includes |+mzscheme/dyn|.
  
-     /* SN_NOBREAK: NOBREAK flag */
-     if (spin->si_nobreak)
-@@ -8257,11 +8448,12 @@ write_vim_spell(spin, fname)
-       putc(SN_SYLLABLE, fd);                          /* <sectionID> */
-       putc(0, fd);                                    /* <sectionflags> */
+ This means that Vim will search for the MzScheme DLL files only when needed.
+--- vim72.orig/runtime/doc/map.txt
++++ vim72/runtime/doc/map.txt
+@@ -222,10 +222,14 @@ define a new mapping or abbreviation, th
+ expression is evaluated to obtain the {rhs} that is used.  Example: >
+       :inoremap <expr> . InsertDot()
+ The result of the InsertDot() function will be inserted.  It could check the
+ text before the cursor and start omni completion when some condition is met.
  
-       l = (int)STRLEN(spin->si_syllable);
-       put_bytes(fd, (long_u)l, 4);                    /* <sectionlen> */
--      fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* <syllable> */
-+      fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd);
-+                                                      /* <syllable> */
-     }
++For abbreviations |v:char| is set to the character that was typed to trigger
++the abbreviation.  You can use this to decide how to expand the {lhs}.  You
++can't change v:char and you should not insert it.
++
+ Be very careful about side effects!  The expression is evaluated while
+ obtaining characters, you may very well make the command dysfunctional.
+ For this reason the following is blocked:
+ - Changing the buffer text |textlock|.
+ - Editing another buffer.
+--- vim72.orig/runtime/doc/netbeans.txt
++++ vim72/runtime/doc/netbeans.txt
+@@ -1,6 +1,6 @@
+-*netbeans.txt*  For Vim version 7.2.  Last change: 2008 Jun 28
++*netbeans.txt*  For Vim version 7.2.  Last change: 2009 Jan 06
  
-     /* end of <SECTIONS> */
-     putc(SN_END, fd);                                 /* <sectionend> */
  
-@@ -8293,17 +8485,22 @@ write_vim_spell(spin, fname)
+                 VIM REFERENCE MANUAL    by Gordon Prieur et al.
  
-       /* Write the nodes. */
-       (void)put_node(fd, tree, 0, regionmask, round == 3);
-     }
  
--    /* Write another byte to check for errors. */
-+    /* Write another byte to check for errors (file system full). */
-     if (putc(0, fd) == EOF)
-       retval = FAIL;
--
-+theend:
-     if (fclose(fd) == EOF)
-       retval = FAIL;
+@@ -720,12 +720,14 @@ keyCommand keyName
+ keyAtPos keyName lnum/col
+               Like "keyCommand" and also report the line number and column
+               of the cursor.
+               New in version 2.1.
  
-+    if (fwv != (size_t)1)
-+      retval = FAIL;
-+    if (retval == FAIL)
-+      EMSG(_(e_write));
-+
-     return retval;
- }
+-killed                A file was closed by the user.  Only for files that have been
+-              assigned a number by the IDE.
++killed                A file was deleted or wiped out by the user and the buffer
++              annotations have been removed.  The bufID number for this
++              buffer has become invalid.  Only for files that have been
++              assigned a bufID number by the IDE.
  
- /*
-  * Clear the index and wnode fields of "node", it siblings and its
-@@ -9888,10 +10085,11 @@ write_spell_prefcond(fd, gap)
- {
-     int               i;
-     char_u    *p;
-     int               len;
-     int               totlen;
-+    size_t    x = 1;  /* collect return value of fwrite() */
+ newDotAndMark off off
+               Reports the position of the cursor being at "off" bytes into
+               the buffer.  Only sent just before a "keyCommand" event.
  
-     if (fd != NULL)
-       put_bytes(fd, (long_u)gap->ga_len, 2);      /* <prefcondcnt> */
+--- vim72.orig/runtime/doc/options.txt
++++ vim72/runtime/doc/options.txt
+@@ -1,6 +1,6 @@
+-*options.txt* For Vim version 7.2.  Last change: 2008 Aug 06
++*options.txt* For Vim version 7.2.  Last change: 2008 Nov 25
  
-     totlen = 2 + gap->ga_len; /* length of <prefcondcnt> and <condlen> bytes */
-@@ -9904,11 +10102,11 @@ write_spell_prefcond(fd, gap)
-       {
-           len = (int)STRLEN(p);
-           if (fd != NULL)
-           {
-               fputc(len, fd);
--              fwrite(p, (size_t)len, (size_t)1, fd);
-+              x &= fwrite(p, (size_t)len, (size_t)1, fd);
-           }
-           totlen += len;
-       }
-       else if (fd != NULL)
-           fputc(0, fd);
-@@ -10052,10 +10250,11 @@ spell_suggest(count)
-     int               mouse_used;
-     int               need_cap;
-     int               limit;
-     int               selected = count;
-     int               badlen = 0;
-+    int               msg_scroll_save = msg_scroll;
  
-     if (no_spell_checking(curwin))
-       return;
+                 VIM REFERENCE MANUAL    by Bram Moolenaar
  
- #ifdef FEAT_VISUAL
-@@ -10105,11 +10304,14 @@ spell_suggest(count)
-     /* Get the word and its length. */
  
-     /* Figure out if the word should be capitalised. */
-     need_cap = check_need_cap(curwin->w_cursor.lnum, curwin->w_cursor.col);
+@@ -1441,10 +1441,18 @@ A jump table for the options with a shor
+                       Also applies to the modeless selection.
  
--    line = ml_get_curline();
-+    /* Make a copy of current line since autocommands may free the line. */
-+    line = vim_strsave(ml_get_curline());
-+    if (line == NULL)
-+      goto skip;
+       autoselectml    Like "autoselect", but for the modeless selection
+                       only.  Compare to the 'A' flag in 'guioptions'.
  
-     /* Get the list of suggestions.  Limit to 'lines' - 2 or the number in
-      * 'spellsuggest', whatever is smaller. */
-     if (sps_limit > (int)Rows - 2)
-       limit = (int)Rows - 2;
-@@ -10216,11 +10418,13 @@ spell_suggest(count)
- #endif
-       /* Ask for choice. */
-       selected = prompt_for_number(&mouse_used);
-       if (mouse_used)
-           selected -= lines_left;
--      lines_left = Rows;      /* avoid more prompt */
-+      lines_left = Rows;              /* avoid more prompt */
-+      /* don't delay for 'smd' in normal_cmd() */
-+      msg_scroll = msg_scroll_save;
-     }
++      html            When the clipboard contains HTML, use this when
++                      pasting.  When putting text on the clipboard, mark it
++                      as HTML.  This works to copy rendered HTML from
++                      Firefox, paste it as raw HTML in Vim, select the HTML
++                      in Vim and paste it in a rich edit box in Firefox.
++                      Only supported for GTK version 2 and later.
++                      Only available with the |+multi_byte| feature.
++
+       exclude:{pattern}
+                       Defines a pattern that is matched against the name of
+                       the terminal 'term'.  If there is a match, no
+                       connection will be made to the X server.  This is
+                       useful in this situation:
+@@ -4173,13 +4181,10 @@ A jump table for the options with a shor
+       care of translating these special characters to the original meaning
+       of the key.  This means you don't have to change the keyboard mode to
+       be able to execute Normal mode commands.
+       This is the opposite of the 'keymap' option, where characters are
+       mapped in Insert mode.
+-      This only works for 8-bit characters.  The value of 'langmap' may be
+-      specified with multi-byte characters (e.g., UTF-8), but only the lower
+-      8 bits of each character will be used.
  
-     if (selected > 0 && selected <= sug.su_ga.ga_len && u_save_cursor() == OK)
-     {
-       /* Save the from and to text for :spellrepall. */
-@@ -10241,11 +10445,12 @@ spell_suggest(count)
-           repl_from = vim_strnsave(sug.su_badptr, stp->st_orglen);
-           repl_to = vim_strsave(stp->st_word);
-       }
+       Example (for Greek, in UTF-8):                          *greek*  >
+           :set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz
+ <     Example (exchanges meaning of z and y for commands): >
+           :set langmap=zy,yz,ZY,YZ
+@@ -7470,11 +7475,13 @@ A jump table for the options with a shor
+                       global
+                       {not in Vi}
+                       {not available when compiled without the |+wildignore|
+                       feature}
+       A list of file patterns.  A file that matches with one of these
+-      patterns is ignored when completing file or directory names.
++      patterns is ignored when completing file or directory names, and
++      influences the result of |expand()|, |glob()| and |globpath()| unless
++      a flag is passed to disable this.
+       The pattern is used like with |:autocmd|, see |autocmd-patterns|.
+       Also see 'suffixes'.
+       Example: >
+               :set wildignore=*.o,*.obj
+ <     The use of |:set+=| and |:set-=| is preferred when adding or removing
+--- vim72.orig/runtime/doc/os_vms.txt
++++ vim72/runtime/doc/os_vms.txt
+@@ -1,6 +1,6 @@
+-*os_vms.txt*    For Vim version 7.2.  Last change: 2006 Nov 18
++*os_vms.txt*    For Vim version 7.2.  Last change: 2008 Aug 19
  
-       /* Replace the word. */
--      p = alloc((unsigned)STRLEN(line) - stp->st_orglen + stp->st_wordlen + 1);
-+      p = alloc((unsigned)STRLEN(line) - stp->st_orglen
-+                                                     + stp->st_wordlen + 1);
-       if (p != NULL)
-       {
-           c = (int)(sug.su_badptr - line);
-           mch_memmove(p, line, c);
-           STRCPY(p + c, stp->st_word);
-@@ -10266,10 +10471,12 @@ spell_suggest(count)
-     }
-     else
-       curwin->w_cursor = prev_cursor;
  
-     spell_find_cleanup(&sug);
-+skip:
-+    vim_free(line);
- }
+                 VIM REFERENCE MANUAL
  
- /*
-  * Check if the word at line "lnum" column "col" is required to start with a
-  * capital.  This uses 'spellcapcheck' of the current buffer.
-@@ -10341,14 +10548,13 @@ check_need_cap(lnum, col)
  
+@@ -310,11 +310,11 @@ features, it is worth to choose non GUI
  
- /*
-  * ":spellrepall"
-  */
--/*ARGSUSED*/
-     void
- ex_spellrepall(eap)
--    exarg_T *eap;
-+    exarg_T *eap UNUSED;
- {
-     pos_T     pos = curwin->w_cursor;
-     char_u    *frompat;
-     int               addlen;
-     char_u    *line;
-@@ -10728,11 +10934,11 @@ spell_suggest_intern(su, interactive)
-           /* Adjust the word score for the suggestions found so far for how
-            * they sounds like. */
-           rescore_suggestions(su);
+ ==============================================================================
  
-       /*
--       * While going throught the soundfold tree "su_maxscore" is the score
-+       * While going through the soundfold tree "su_maxscore" is the score
-        * for the soundfold word, limits the changes that are being tried,
-        * and "su_sfmaxscore" the rescored score, which is set by
-        * cleanup_suggestions().
-        * First find words with a small edit distance, because this is much
-        * faster and often already finds the top-N suggestions.  If we didn't
-@@ -11212,11 +11418,11 @@ suggest_trie_walk(su, lp, fword, soundfo
-     int               soundfold;
- {
-     char_u    tword[MAXWLEN];     /* good word collected so far */
-     trystate_T        stack[MAXWLEN];
-     char_u    preword[MAXWLEN * 3]; /* word found with proper case;
--                                     * concatanation of prefix compound
-+                                     * concatenation of prefix compound
-                                      * words and split word.  NUL terminated
-                                      * when going deeper but not when coming
-                                      * back. */
-     char_u    compflags[MAXWLEN];     /* compound flags, one for each word */
-     trystate_T        *sp;
-@@ -11478,19 +11684,28 @@ suggest_trie_walk(su, lp, fword, soundfo
-                   compflags[sp->ts_complen] = ((unsigned)flags >> 24);
-                   compflags[sp->ts_complen + 1] = NUL;
-                   vim_strncpy(preword + sp->ts_prewordlen,
-                           tword + sp->ts_splitoff,
-                           sp->ts_twordlen - sp->ts_splitoff);
--                  p = preword;
--                  while (*skiptowhite(p) != NUL)
--                      p = skipwhite(skiptowhite(p));
--                  if (fword_ends && !can_compound(slang, p,
--                                              compflags + sp->ts_compsplit))
--                      /* Compound is not allowed.  But it may still be
--                       * possible if we add another (short) word. */
-+
-+                  /* Verify CHECKCOMPOUNDPATTERN  rules. */
-+                  if (match_checkcompoundpattern(preword,  sp->ts_prewordlen,
-+                                                        &slang->sl_comppat))
-                       compound_ok = FALSE;
+ 8. Useful notes                                               *vms-notes*
  
-+                  if (compound_ok)
-+                  {
-+                      p = preword;
-+                      while (*skiptowhite(p) != NUL)
-+                          p = skipwhite(skiptowhite(p));
-+                      if (fword_ends && !can_compound(slang, p,
-+                                              compflags + sp->ts_compsplit))
-+                          /* Compound is not allowed.  But it may still be
-+                           * possible if we add another (short) word. */
-+                          compound_ok = FALSE;
-+                  }
-+
-                   /* Get pointer to last char of previous word. */
-                   p = preword + sp->ts_prewordlen;
-                   mb_ptr_back(preword, p);
-               }
-           }
-@@ -11683,14 +11898,13 @@ suggest_trie_walk(su, lp, fword, soundfo
-                                                     >= slang->sl_compminlen)
- #endif
-                       && (slang->sl_compsylmax < MAXWLEN
-                           || sp->ts_complen + 1 - sp->ts_compsplit
-                                                         < slang->sl_compmax)
--                      && (byte_in_str(sp->ts_complen == sp->ts_compsplit
--                                          ? slang->sl_compstartflags
--                                          : slang->sl_compallflags,
--                                                  ((unsigned)flags >> 24))))
-+                      && (can_be_compound(sp, slang,
-+                                       compflags, ((unsigned)flags >> 24))))
-+
-               {
-                   try_compound = TRUE;
-                   compflags[sp->ts_complen] = ((unsigned)flags >> 24);
-                   compflags[sp->ts_complen + 1] = NUL;
-               }
-@@ -14806,11 +15020,11 @@ soundalike_score(goodstart, badstart)
-           /* Failed to compare. */
-           break;
+-8.1 backspace/delete
++8.1 Backspace/delete
+ 8.2 Filters
+ 8.3 VMS file version numbers
+ 8.4 Directory conversion
+ 8.5 Remote host invocation
+ 8.6 Terminal problems
+@@ -324,12 +324,14 @@ features, it is worth to choose non GUI
+ 8.10 Setting up the symbols
+ 8.11 diff and other GNU programs
+ 8.12 diff-mode
+ 8.13 Allow '$' in C keywords
+ 8.14 VIMTUTOR for beginners
++8.15 Slow start in console mode issue
++8.16 Common VIM directory - different architectures
  
-       case 0:
-           /*
--           * Lenghts are equal, thus changes must result in same length: An
-+           * Lengths are equal, thus changes must result in same length: An
-            * insert is only possible in combination with a delete.
-            * 1: check if for identical strings
-            */
-           if (*pl == NUL)
-               return score;
-@@ -15396,14 +15610,13 @@ pop:
- #endif
+-8.1 backspace/delete
++8.1 Backspace/delete
  
- /*
-  * ":spellinfo"
-  */
--/*ARGSUSED*/
-     void
- ex_spellinfo(eap)
--    exarg_T *eap;
-+    exarg_T *eap UNUSED;
- {
-     int               lpi;
-     langp_T   *lp;
-     char_u    *p;
+ There are backspace/delete key inconsistencies with VMS.
+ :fixdel doesn't do the trick, but the solution is: >
  
-@@ -15943,15 +16156,13 @@ spell_expand_check_cap(col)
-  * Get list of spelling suggestions.
-  * Used for Insert mode completion CTRL-X ?.
-  * Returns the number of matches.  The matches are in "matchp[]", array of
-  * allocated strings.
-  */
--/*ARGSUSED*/
-     int
--expand_spelling(lnum, col, pat, matchp)
--    linenr_T  lnum;
--    int               col;
-+expand_spelling(lnum, pat, matchp)
-+    linenr_T  lnum UNUSED;
-     char_u    *pat;
-     char_u    ***matchp;
- {
-     garray_T  ga;
+       :inoremap ^? ^H         " for terminal mode
+@@ -661,16 +663,134 @@ start it with: >
  
---- vim72.orig/src/if_cscope.c
-+++ vim72/src/if_cscope.c
-@@ -44,11 +44,10 @@ static void            cs_file_results __ARGS((
- static void       cs_fill_results __ARGS((char *, int , int *, char ***,
-                       char ***, int *));
- static int        cs_find __ARGS((exarg_T *eap));
- static int        cs_find_common __ARGS((char *opt, char *pat, int, int, int));
- static int        cs_help __ARGS((exarg_T *eap));
--static void       cs_init __ARGS((void));
- static void       clear_csinfo __ARGS((int i));
- static int        cs_insert_filelist __ARGS((char *, char *, char *,
-                       struct stat *));
- static int        cs_kill __ARGS((exarg_T *eap));
- static void       cs_kill_execute __ARGS((int, char *));
-@@ -64,52 +63,167 @@ static void           cs_release_csp __ARGS((i
- static int        cs_reset __ARGS((exarg_T *eap));
- static char *     cs_resolve_file __ARGS((int, char *));
- static int        cs_show __ARGS((exarg_T *eap));
+       @vim:vimtutor
  
+ (Thomas.R.Wyant III, Vim 6.1)
  
--static csinfo_T           csinfo[CSCOPE_MAX_CONNECTIONS];
-+static csinfo_T *   csinfo = NULL;
-+static int        csinfo_size = 0;    /* number of items allocated in
-+                                         csinfo[] */
++8.14 Slow start in console mode issue
 +
- static int        eap_arg_len;    /* length of eap->arg, set in
-                                      cs_lookup_cmd() */
- static cscmd_T            cs_cmds[] =
- {
-     { "add",  cs_add,
-               N_("Add a new database"),     "add file|dir [pre-path] [flags]", 0 },
-     { "find", cs_find,
--              N_("Query for a pattern"),    FIND_USAGE, 1 },
-+              N_("Query for a pattern"),    "find c|d|e|f|g|i|s|t name", 1 },
-     { "help", cs_help,
-               N_("Show this message"),      "help", 0 },
-     { "kill", cs_kill,
-               N_("Kill a connection"),      "kill #", 0 },
-     { "reset",        cs_reset,
-               N_("Reinit all connections"), "reset", 0 },
-     { "show", cs_show,
-               N_("Show connections"),       "show", 0 },
--    { NULL }
-+    { NULL, NULL, NULL, NULL, 0 }
- };
-     static void
- cs_usage_msg(x)
-     csid_e x;
- {
-     (void)EMSG2(_("E560: Usage: cs[cope] %s"), cs_cmds[(int)x].usage);
- }
-+#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
++As GUI/GTK Vim works equally well in console mode, many administartors
++deploy those executables system wide.
++Unfortunately, on a remote slow connections GUI/GTK executables behave rather
++slow when user wants to run Vim just in the console mode - because of X environment detection timeout.
 +
-+static enum
-+{
-+    EXP_CSCOPE_SUBCMD,        /* expand ":cscope" sub-commands */
-+    EXP_SCSCOPE_SUBCMD,       /* expand ":scscope" sub-commands */
-+    EXP_CSCOPE_FIND,  /* expand ":cscope find" arguments */
-+    EXP_CSCOPE_KILL   /* expand ":cscope kill" arguments */
-+} expand_what;
++Luckily, there is a simple solution for that. Administrators need to deploy
++both GUI/GTK build and just console build executables, like below: >
 +
-+/*
-+ * Function given to ExpandGeneric() to obtain the cscope command
-+ * expansion.
-+ */
-+    char_u *
-+get_cscope_name(xp, idx)
-+    expand_T  *xp UNUSED;
-+    int               idx;
-+{
-+    int               current_idx;
-+    int               i;
++    |- vim72
++    |----- doc
++    |----- syntax
++       vimrc    (system rc files)
++       gvimrc
++       gvim.exe (the remaned GUI or GTK built vim.exe)
++       vim.exe  (the console only executable)
 +
-+    switch (expand_what)
-+    {
-+    case EXP_CSCOPE_SUBCMD:
-+      /* Complete with sub-commands of ":cscope":
-+       * add, find, help, kill, reset, show */
-+      return (char_u *)cs_cmds[idx].name;
-+    case EXP_SCSCOPE_SUBCMD:
-+      /* Complete with sub-commands of ":scscope": same sub-commands as
-+       * ":cscope" but skip commands which don't support split windows */
-+      for (i = 0, current_idx = 0; cs_cmds[i].name != NULL; i++)
-+          if (cs_cmds[i].cansplit)
-+              if (current_idx++ == idx)
-+                  break;
-+      return (char_u *)cs_cmds[i].name;
-+    case EXP_CSCOPE_FIND:
-+      {
-+          const char *query_type[] =
-+          {
-+              "c", "d", "e", "f", "g", "i", "s", "t", NULL
-+          };
++Define system symbols like below in for ex in LOGIN.COM or SYLOGIN.COM: >
 +
-+          /* Complete with query type of ":cscope find {query_type}".
-+           * {query_type} can be letters (c, d, ... t) or numbers (0, 1,
-+           * ..., 8) but only complete with letters, since numbers are
-+           * redundant. */
-+          return (char_u *)query_type[idx];
-+      }
-+    case EXP_CSCOPE_KILL:
-+      {
-+          static char connection[5];
++      $ define/nolog VIM RF10:[UTIL.VIM72] ! where you VIM directory is
++      $ vi*m  :== mcr VIM:VIM.EXE
++      $ gvi*m :== mcr VIM:GVIM.EXE
++      $ ! or you can try to spawn with
++      $ gv*im :== spawn/nowait/input=NLA0 mcr VIM:GVIM.EXE -g -GEOMETRY 80x40
 +
-+          /* ":cscope kill" accepts connection numbers or partial names of
-+           * the pathname of the cscope database as argument.  Only complete
-+           * with connection numbers. -1 can also be used to kill all
-+           * connections. */
-+          for (i = 0, current_idx = 0; i < csinfo_size; i++)
-+          {
-+              if (csinfo[i].fname == NULL)
-+                  continue;
-+              if (current_idx++ == idx)
-+              {
-+                  vim_snprintf(connection, sizeof(connection), "%d", i);
-+                  return (char_u *)connection;
-+              }
-+          }
-+          return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL;
-+      }
-+    default:
-+      return NULL;
-+    }
-+}
 +
-+/*
-+ * Handle command line completion for :cscope command.
-+ */
-+    void
-+set_context_in_cscope_cmd(xp, arg, cmdidx)
-+    expand_T  *xp;
-+    char_u    *arg;
-+    cmdidx_T  cmdidx;
-+{
-+    char_u    *p;
++Like this, users that do not have X environment and want to use Vim just in
++console mode can avoid performance problems.
 +
-+    /* Default: expand subcommands */
-+    xp->xp_context = EXPAND_CSCOPE;
-+    xp->xp_pattern = arg;
-+    expand_what = (cmdidx == CMD_scscope)
-+                      ? EXP_SCSCOPE_SUBCMD : EXP_CSCOPE_SUBCMD;
++(Zoltan Arpadffy, Vim 7.2)
 +
-+    /* (part of) subcommand already typed */
-+    if (*arg != NUL)
-+    {
-+      p = skiptowhite(arg);
-+      if (*p != NUL)              /* past first word */
-+      {
-+          xp->xp_pattern = skipwhite(p);
-+          if (*skiptowhite(xp->xp_pattern) != NUL)
-+              xp->xp_context = EXPAND_NOTHING;
-+          else if (STRNICMP(arg, "add", p - arg) == 0)
-+              xp->xp_context = EXPAND_FILES;
-+          else if (STRNICMP(arg, "kill", p - arg) == 0)
-+              expand_what = EXP_CSCOPE_KILL;
-+          else if (STRNICMP(arg, "find", p - arg) == 0)
-+              expand_what = EXP_CSCOPE_FIND;
-+          else
-+              xp->xp_context = EXPAND_NOTHING;
-+      }
-+    }
-+}
++8.15 Common VIM directory - different architectures
 +
-+#endif /* FEAT_CMDL_COMPL */
++In a cluster that contains nodes with different architectures like below:
 +
- /*
-  * PRIVATE: do_cscope_general
-  *
-- * find the command, print help if invalid, and the then call the
-- * corresponding command function,
-- * called from do_cscope and do_scscope
-+ * Find the command, print help if invalid, and then call the corresponding
-+ * command function.
-  */
-     static void
- do_cscope_general(eap, make_split)
-     exarg_T   *eap;
-     int               make_split; /* whether to split window */
- {
-     cscmd_T *cmdp;
++$show cluster
++View of Cluster from system ID 11655  node: TOR                                                                     18-AUG-2008 11:58:31
+++---------------------------------+
++¦        SYSTEMS        ¦ MEMBERS ¦
+++-----------------------+---------¦
++¦  NODE  ¦   SOFTWARE   ¦  STATUS ¦
+++--------+--------------+---------¦
++¦ TOR    ¦ VMS V7.3-2   ¦ MEMBER  ¦
++¦ TITAN2 ¦ VMS V8.3     ¦ MEMBER  ¦
++¦ ODIN   ¦ VMS V7.3-2   ¦ MEMBER  ¦
+++---------------------------------+
++
++It is convinient to have a common VIM directory but execute different
++executables.
++There are more solutions for this problem:
++
++solution 1. all executables in the same directory with different names
++This is easily done with the following script that can be added
++to the login.com or sylogin.com: >
++
++      $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX"
++      $ then
++      $       say "VAX platform"
++      $       vi*m:== mcr vim:VIM.EXE_VAX
++      $ endif
++      $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH"
++      $ then
++      $       say "ALPHA platform"
++      $       vi*m :== mcr vim:VIM.EXE_AXP
++      $ endif
++      $ if f$getsyi("ARCH_NAME") .eqs. "IA64"
++      $ then
++      $      say "IA64 platform"
++      $      vi*m :== mcr vim:VIM.EXE_IA64
++      $ endif
++
++solution 2. different directories: >
++
++      $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX"
++      $ then
++      $       say "VAX platform"
++      $       define/nolog VIM RF10:[UTIL.VAX_EXE] ! VAX executables
++      $ endif
++      $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH"
++      $ then
++      $       say "ALPHA platform"
++      $       define/nolog VIM RF10:[UTIL.AXP_EXE] ! AXP executables
++      $ endif
++      $ if f$getsyi("ARCH_NAME") .eqs. "IA64"
++      $ then
++      $      say "IA64 platform"
++      $      define/nolog VIM RF10:[UTIL.IA64_EXE] ! IA64 executables
++      $ endif
++        $! VIMRUNTIME must be defined in order to find runtime files
++      $ define/nolog VIMRUNTIME RF10:[UTIL.VIM72]
++
++A good examle for this approach is the [GNU]gnu_tools.com script from GNU_TOOLS.ZIP
++package downloadable from http://www.polarhome.com/vim/
++
++(Zoltan Arpadffy, Vim 7.2)
++
+ ==============================================================================
  
--    cs_init();
-     if ((cmdp = cs_lookup_cmd(eap)) == NULL)
-     {
-       cs_help(eap);
-       return;
-     }
-@@ -166,12 +280,10 @@ do_scscope(eap)
- do_cstag(eap)
-     exarg_T *eap;
- {
-     int ret = FALSE;
+ 9. VMS related changes                                        *vms-changes*
  
--    cs_init();
--
-     if (*eap->arg == NUL)
-     {
-       (void)EMSG(_("E562: Usage: cstag <ident>"));
-       return;
-     }
-@@ -323,11 +435,11 @@ cs_connection(num, dbpath, ppath)
-     int i;
+-Version 7
++Recent changes
++- The following plugins are included into VMS runtime:
++  genutils 2.4, multiselect 2.2, multvals 3.1, selectbuf 4.3,
++  bufexplorer 7.1.7, taglist 4.5
++- minor changes in vimrc (just in VMS runtime)
++- make_vms.mms - HUGE model is the default
++- [TESTDIR]make_vms.mms include as many tests possible
++- modify test30 and test54 for VMS
++- enable FLOAT feature in VMS port
++- os_vms.txt updated
++
++Version 7.2 (2008 Aug 9)
++- VCF files write corrected
++- CTAGS 5.7 included
++- corrected make_vms.mms (on VAX gave syntax error)
++
++Version 7.1 (2007 Jun 15)
++- create TAGS file from menu
++
++Version 7 (2006 May 8)
+ - Improved low level char input (affects just console mode)
++- Fixed plugin bug
++- CTAGS 5.6 included
  
-     if (num < 0 || num > 4 || (num > 0 && !dbpath))
-       return FALSE;
+ Version 6.4 (2005 Oct 15)
+ - GTKLIB and Vim build on IA64
+ - colors in terminal mode
+ - syntax highlighting in terminal mode
+@@ -804,10 +924,11 @@ Version 4.5 (1996 Dec 16)
  
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-     {
-       if (!csinfo[i].fname)
-           continue;
+ 10. Authors                                           *vms-authors*
  
-       if (num == 0)
-@@ -377,14 +489,13 @@ cs_connection(num, dbpath, ppath)
-  * add cscope database or a directory name (to look for cscope.out)
-  * to the cscope connection list
-  *
-  * MAXPATHL 256
-  */
--/* ARGSUSED */
-     static int
- cs_add(eap)
--    exarg_T *eap;
-+    exarg_T *eap UNUSED;
- {
-     char *fname, *ppath, *flags = NULL;
+ OpenVMS documentation and executables are maintained by:
+ Zoltan Arpadffy <arpadffy@polarhome.com>
++OpenVMS Vim page: http://www.polarhome.com/vim/
  
-     if ((fname = strtok((char *)NULL, (const char *)" ")) == NULL)
-     {
-@@ -567,11 +678,11 @@ cs_check_for_tags()
- cs_cnt_connections()
- {
-     short i;
-     short cnt = 0;
+ This document uses parts and remarks from earlier authors and contributors
+ of OS_VMS.TXT:
+       Charles E. Campbell, Jr. <cec@gryphon.gsfc.nasa.gov>
+       Bruce Hunsaker <BNHunsaker@chq.byu.edu>
+--- vim72.orig/runtime/doc/spell.txt
++++ vim72/runtime/doc/spell.txt
+@@ -1,6 +1,6 @@
+-*spell.txt*   For Vim version 7.2.  Last change: 2008 Jun 21
++*spell.txt*   For Vim version 7.2.  Last change: 2008 Nov 30
  
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-     {
-       if (csinfo[i].fname != NULL)
-           cnt++;
-     }
-     return cnt;
-@@ -657,10 +768,11 @@ cs_create_cmd(csoption, pattern)
-     char *csoption;
-     char *pattern;
- {
-     char *cmd;
-     short search;
-+    char *pat;
  
-     switch (csoption[0])
-     {
-     case '0' : case 's' :
-       search = 0;
-@@ -690,14 +802,21 @@ cs_create_cmd(csoption, pattern)
-       (void)EMSG(_("E561: unknown cscope search type"));
-       cs_usage_msg(Find);
-       return NULL;
-     }
+                 VIM REFERENCE MANUAL    by Bram Moolenaar
  
--    if ((cmd = (char *)alloc((unsigned)(strlen(pattern) + 2))) == NULL)
-+    /* Skip white space before the patter, except for text and pattern search,
-+     * they may want to use the leading white space. */
-+    pat = pattern;
-+    if (search != 4 && search != 6)
-+      while vim_iswhite(*pat)
-+          ++pat;
-+
-+    if ((cmd = (char *)alloc((unsigned)(strlen(pat) + 2))) == NULL)
-       return NULL;
  
--    (void)sprintf(cmd, "%d%s", search, pattern);
-+    (void)sprintf(cmd, "%d%s", search, pat);
+@@ -829,12 +829,15 @@ AFFIX FILE FORMAT                        *spell-aff-format* *
+                                                       *spell-affix-comment*
+ Comment lines in the .aff file start with a '#':
  
-     return cmd;
- } /* cs_create_cmd */
+       # comment line ~
  
+-With some items it's also possible to put a comment after it, but this isn't
+-supported in general.
++Items with a fixed number of arguments can be followed by a comment.  But only
++if none of the arguments can contain white space.  The comment must start with
++a "#" character.  Example:
++
++      KEEPCASE =  # fix case for words with this flag ~
  
-@@ -867,11 +986,11 @@ err_closing:
-       vim_free(prog);
- # endif
-       vim_free(ppath);
  
- #if defined(UNIX)
--      if (execl("/bin/sh", "sh", "-c", cmd, NULL) == -1)
-+      if (execl("/bin/sh", "sh", "-c", cmd, (char *)NULL) == -1)
-           PERROR(_("cs_create_connection exec failed"));
+ ENCODING                                                      *spell-SET*
  
-       exit(127);
-       /* NOTREACHED */
-     default:  /* parent. */
-@@ -987,28 +1106,33 @@ cs_find_common(opt, pat, forceit, verbos
-     int verbose;
-     int       use_ll;
- {
-     int i;
-     char *cmd;
--    int nummatches[CSCOPE_MAX_CONNECTIONS], totmatches;
-+    int *nummatches;
-+    int totmatches;
- #ifdef FEAT_QUICKFIX
-     char cmdletter;
-     char *qfpos;
- #endif
+ The affix file can be in any encoding that is supported by "iconv".  However,
+@@ -963,10 +966,13 @@ When using "caplong" the two-character f
+ "B1", "BB", etc.  This is useful to use one-character flags for the most
+ common items and two-character flags for uncommon items.
  
-     /* create the actual command to send to cscope */
-     cmd = cs_create_cmd(opt, pat);
-     if (cmd == NULL)
-       return FALSE;
+ Note: When using utf-8 only characters up to 65000 may be used for flags.
  
-+    nummatches = (int *)alloc(sizeof(int)*csinfo_size);
-+    if (nummatches == NULL)
-+      return FALSE;
++Note: even when using "num" or "long" the number of flags available to
++compounding and prefixes is limited to about 250.
 +
-     /* send query to all open connections, then count the total number
-      * of matches so we can alloc matchesp all in one swell foop
-      */
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-       nummatches[i] = 0;
-     totmatches = 0;
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-     {
-       if (csinfo[i].fname == NULL || csinfo[i].to_fp == NULL)
-           continue;
  
-       /* send cmd to cscope */
-@@ -1029,21 +1153,25 @@ cs_find_common(opt, pat, forceit, verbos
-     {
-       char *nf = _("E259: no matches found for cscope query %s of %s");
-       char *buf;
+ AFFIXES
+                                           *spell-PFX* *spell-SFX*
+ The usual PFX (prefix) and SFX (suffix) lines are supported (see the Myspell
+ documentation or the Aspell manual:
+@@ -1176,10 +1182,13 @@ Once a word has been marked as bad it wo
+ word as good.
  
-       if (!verbose)
-+      {
-+          vim_free(nummatches);
-           return FALSE;
-+      }
+ The flag also applies to the word with affixes, thus this can be used to mark
+ a whole bunch of related words as bad.
  
-       buf = (char *)alloc((unsigned)(strlen(opt) + strlen(pat) + strlen(nf)));
-       if (buf == NULL)
-           (void)EMSG(nf);
-       else
-       {
-           sprintf(buf, nf, opt, pat);
-           (void)EMSG(buf);
-           vim_free(buf);
-       }
-+      vim_free(nummatches);
-       return FALSE;
-     }
++                                                      *spell-FORBIDDENWORD*
++FORBIDDENWORD can be used just like BAD.  For compatibility with Hunspell.
++
+                                                       *spell-NEEDAFFIX*
+ The NEEDAFFIX flag is used to require that a word is used with an affix.  The
+ word itself is not a good word (unless there is an empty affix).  Example:
  
- #ifdef FEAT_QUICKFIX
-     /* get cmd letter */
-@@ -1092,10 +1220,11 @@ cs_find_common(opt, pat, forceit, verbos
-           {
-               sprintf(buf, nf, *qfpos, *(qfpos-1));
-               (void)EMSG(buf);
-               vim_free(buf);
-           }
-+          vim_free(nummatches);
-           return FALSE;
-       }
-     }
-     if (qfpos != NULL && *qfpos != '0' && totmatches > 0)
-     {
-@@ -1139,10 +1268,11 @@ cs_find_common(opt, pat, forceit, verbos
-               qf_jump(qi, 0, 0, forceit);
-           }
-       }
-       mch_remove(tmp);
-       vim_free(tmp);
-+      vim_free(nummatches);
-       return TRUE;
-     }
-     else
- #endif /* FEAT_QUICKFIX */
-     {
-@@ -1150,10 +1280,11 @@ cs_find_common(opt, pat, forceit, verbos
-       int matched = 0;
+       NEEDAFFIX + ~
+@@ -1266,10 +1275,14 @@ on the inside of a compound word.  This
+ The NEEDCOMPOUND flag is used to require that a word is used as part of a
+ compound word.  The word itself is not a good word.  Example:
  
-       /* read output */
-       cs_fill_results((char *)pat, totmatches, nummatches, &matches,
-                                                        &contexts, &matched);
-+      vim_free(nummatches);
-       if (matches == NULL)
-           return FALSE;
+       NEEDCOMPOUND & ~
  
-       (void)cs_manage_matches(matches, contexts, matched, Store);
++                                                      *spell-ONLYINCOMPOUND*
++The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND.  Supported for
++compatiblity with Hunspell.
++
+                                                       *spell-COMPOUNDMIN*
+ The minimal character length of a word used for compounding is specified with
+ COMPOUNDMIN.  Example:
+       COMPOUNDMIN 5 ~
  
-@@ -1165,52 +1296,48 @@ cs_find_common(opt, pat, forceit, verbos
- /*
-  * PRIVATE: cs_help
-  *
-  * print help
-  */
--/* ARGSUSED */
-     static int
- cs_help(eap)
--    exarg_T *eap;
-+    exarg_T *eap UNUSED;
- {
-     cscmd_T *cmdp = cs_cmds;
+@@ -1326,10 +1339,24 @@ Note: this doesn't work for postponed pr
+ The COMPOUNDROOT flag is used for words in the dictionary that are already a
+ compound.  This means it counts for two words when checking the compounding
+ rules.  Can also be used for an affix to count the affix as a compounding
+ word.
  
-     (void)MSG_PUTS(_("cscope commands:\n"));
-     while (cmdp->name != NULL)
-     {
--      (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"),
--                                    cmdp->name, _(cmdp->help), cmdp->usage);
-+      char *help = _(cmdp->help);
-+      int  space_cnt = 30 - vim_strsize((char_u *)help);
++                                              *spell-CHECKCOMPOUNDPATTERN*
++CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the
++position where two words are compounded together forbids the compound.
++For example:
++      CHECKCOMPOUNDPATTERN o e ~
 +
-+      /* Use %*s rather than %30s to ensure proper alignment in utf-8 */
-+      if (space_cnt < 0)
-+          space_cnt = 0;
-+      (void)smsg((char_u *)_("%-5s: %s%*s (Usage: %s)"),
-+                                    cmdp->name,
-+                                    help, space_cnt, " ",
-+                                    cmdp->usage);
-       if (strcmp(cmdp->name, "find") == 0)
--          MSG_PUTS(FIND_HELP);
-+          MSG_PUTS(_("\n"
-+                     "       c: Find functions calling this function\n"
-+                     "       d: Find functions called by this function\n"
-+                     "       e: Find this egrep pattern\n"
-+                     "       f: Find this file\n"
-+                     "       g: Find this definition\n"
-+                     "       i: Find files #including this file\n"
-+                     "       s: Find this C symbol\n"
-+                     "       t: Find assignments to\n"));
++This forbids compounding if the first word ends in "o" and the second word
++starts with "e".
 +
-       cmdp++;
-     }
++The arguments must be plain text, no patterns are actually supported, despite
++the item name.  Case is always ignored.
++
++The Hunspell feature to use three arguments and flags is not supported.
++
+                                                       *spell-SYLLABLE*
+ The SYLLABLE item defines characters or character sequences that are used to
+ count the number of syllables in a word.  Example:
+       SYLLABLE aáeéiíoóöõuúüûy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui ~
  
-     wait_return(TRUE);
-     return 0;
- } /* cs_help */
+@@ -1494,10 +1521,14 @@ These items appear in the affix file of
+ ignored, not supported or defined in another way.
  
+ ACCENT                (Hunspell)                              *spell-ACCENT*
+               Use MAP instead. |spell-MAP|
  
--/*
-- * PRIVATE: cs_init
-- *
-- * initialize cscope structure if not already
-- */
--    static void
--cs_init()
--{
--    short i;
--    static int init_already = FALSE;
--
--    if (init_already)
--      return;
--
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
--      clear_csinfo(i);
--
--    init_already = TRUE;
--} /* cs_init */
--
-     static void
- clear_csinfo(i)
-     int           i;
- {
-     csinfo[i].fname  = NULL;
-@@ -1255,17 +1382,16 @@ GetWin32Error()
- /*
-  * PRIVATE: cs_insert_filelist
-  *
-  * insert a new cscope database filename into the filelist
-  */
--/*ARGSUSED*/
-     static int
- cs_insert_filelist(fname, ppath, flags, sb)
-     char *fname;
-     char *ppath;
-     char *flags;
--    struct stat *sb;
-+    struct stat *sb UNUSED;
- {
-     short     i, j;
- #ifndef UNIX
-     HANDLE    hFile;
-     BY_HANDLE_FILE_INFORMATION bhfi;
-@@ -1304,11 +1430,11 @@ cs_insert_filelist(fname, ppath, flags,
-       CloseHandle(hFile);
-     }
- #endif
-     i = -1; /* can be set to the index of an empty item in csinfo */
--    for (j = 0; j < CSCOPE_MAX_CONNECTIONS; j++)
-+    for (j = 0; j < csinfo_size; j++)
-     {
-       if (csinfo[j].fname != NULL
- #if defined(UNIX)
-           && csinfo[j].st_dev == sb->st_dev && csinfo[j].st_ino == sb->st_ino
- #else
-@@ -1331,13 +1457,29 @@ cs_insert_filelist(fname, ppath, flags,
-           i = j; /* remember first empty entry */
-     }
++BREAK         (Hunspell)                              *spell-BREAK*
++              Define break points.  Unclear how it works exactly.
++              Not supported.
++
+ CHECKCOMPOUNDCASE  (Hunspell)                 *spell-CHECKCOMPOUNDCASE*
+               Disallow uppercase letters at compound word boundaries.
+               Not supported.
  
-     if (i == -1)
-     {
--      if (p_csverbose)
--          (void)EMSG(_("E569: maximum number of cscope connections reached"));
--      return -1;
-+      i = csinfo_size;
-+      if (csinfo_size == 0)
-+      {
-+          /* First time allocation: allocate only 1 connection. It should
-+           * be enough for most users.  If more is needed, csinfo will be
-+           * reallocated. */
-+          csinfo_size = 1;
-+          csinfo = (csinfo_T *)alloc_clear(sizeof(csinfo_T));
-+      }
-+      else
-+      {
-+          /* Reallocate space for more connections. */
-+          csinfo_size *= 2;
-+          csinfo = vim_realloc(csinfo, sizeof(csinfo_T)*csinfo_size);
-+      }
-+      if (csinfo == NULL)
-+          return -1;
-+      for (j = csinfo_size/2; j < csinfo_size; j++)
-+          clear_csinfo(j);
-     }
+ CHECKCOMPOUNDDUP  (Hunspell)                  *spell-CHECKCOMPOUNDDUP*
+@@ -1510,13 +1541,10 @@ CHECKCOMPOUNDREP  (Hunspell)                   *spell-CH
  
-     if ((csinfo[i].fname = (char *)alloc((unsigned)strlen(fname)+1)) == NULL)
-       return -1;
+ CHECKCOMPOUNDTRIPLE  (Hunspell)                       *spell-CHECKCOMPOUNDTRIPLE*
+               Forbid three identical characters when compounding.  Not
+               supported.
  
-@@ -1417,14 +1559,13 @@ cs_lookup_cmd(eap)
- /*
-  * PRIVATE: cs_kill
-  *
-  * nuke em
-  */
--/* ARGSUSED */
-     static int
- cs_kill(eap)
--    exarg_T *eap;
-+    exarg_T *eap UNUSED;
- {
-     char *stok;
-     short i;
+-CHECKCOMPOUNDPATTERN  (Hunspell)              *spell-CHECKCOMPOUNDPATTERN*
+-              Forbid compounding when patterns match.  Not supported.
+-
+ COMPLEXPREFIXES  (Hunspell)                           *spell-COMPLEXPREFIXES*
+               Enables using two prefixes.  Not supported.
  
-     if ((stok = strtok((char *)NULL, (const char *)" ")) == NULL)
-@@ -1441,28 +1582,27 @@ cs_kill(eap)
-     else
-     {
-       /* It must be part of a name.  We will try to find a match
-        * within all the names in the csinfo data structure
-        */
--      for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+      for (i = 0; i < csinfo_size; i++)
-       {
-           if (csinfo[i].fname != NULL && strstr(csinfo[i].fname, stok))
-               break;
-       }
-     }
+ COMPOUND      (Hunspell)                              *spell-COMPOUND*
+               This is one line with the count of COMPOUND items, followed by
+@@ -1534,16 +1562,21 @@ COMPOUNDEND    (Hunspell)                              *spell-COMPOUN
+               Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
  
--    if ((i >= CSCOPE_MAX_CONNECTIONS || i < -1 || csinfo[i].fname == NULL)
--          && i != -1)
-+    if ((i != -1) && (i >= csinfo_size || i < -1 || csinfo[i].fname == NULL))
-     {
-       if (p_csverbose)
-           (void)EMSG2(_("E261: cscope connection %s not found"), stok);
-     }
-     else
-     {
-       if (i == -1)
-       {
--          for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+          for (i = 0; i < csinfo_size; i++)
-           {
-               if (csinfo[i].fname)
-                   cs_kill_execute(i, csinfo[i].fname);
-           }
-       }
-@@ -1718,11 +1858,11 @@ cs_file_results(f, nummatches_a)
+ COMPOUNDMIDDLE        (Hunspell)                              *spell-COMPOUNDMIDDLE*
+               Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
  
-     buf = (char *)alloc(CSREAD_BUFSIZE);
-     if (buf == NULL)
-       return;
++COMPOUNDRULES (Hunspell)                              *spell-COMPOUNDRULES*
++              Number of COMPOUNDRULE lines following.  Ignored, but the
++              argument must be a number.
++
+ COMPOUNDSYLLABLE  (Hunspell)                  *spell-COMPOUNDSYLLABLE*
+               Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE|
+               |spell-COMPOUNDSYLMAX|
  
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-     {
-       if (nummatches_a[i] < 1)
-           continue;
+-FORBIDDENWORD (Hunspell)                              *spell-FORBIDDENWORD*
+-              Use BAD instead. |spell-BAD|
++KEY           (Hunspell)                              *spell-KEY*
++              Define characters that are close together on the keyboard.
++              Used to give better suggestions.  Not supported.
  
-       for (j = 0; j < nummatches_a[i]; j++)
-@@ -1790,11 +1930,11 @@ cs_fill_results(tagstr, totmatches, numm
-     if ((matches = (char **)alloc(sizeof(char *) * totmatches)) == NULL)
-       goto parse_out;
-     if ((cntxts = (char **)alloc(sizeof(char *) * totmatches)) == NULL)
-       goto parse_out;
+ LANG          (Hunspell)                              *spell-LANG*
+               This specifies language-specific behavior.  This actually
+               moves part of the language knowledge into the program,
+               therefore Vim does not support it.  Each language property
+@@ -1551,14 +1584,11 @@ LANG           (Hunspell)                              *spell-LANG*
  
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-     {
-       if (nummatches_a[i] < 1)
-           continue;
+ LEMMA_PRESENT (Hunspell)                              *spell-LEMMA_PRESENT*
+               Only needed for morphological analysis.
  
-       for (j = 0; j < nummatches_a[i]; j++)
-@@ -1927,11 +2067,11 @@ cs_print_tags_priv(matches, cntxts, num_
-        */
-       if ((tbuf = (char *)alloc((unsigned)strlen(matches[idx]) + 1)) == NULL)
-           continue;
-       (void)strcpy(tbuf, matches[idx]);
+ MAXNGRAMSUGS  (Hunspell)                              *spell-MAXNGRAMSUGS*
+-              Not supported.
+-
+-ONLYINCOMPOUND        (Hunspell)                              *spell-ONLYINCOMPOUND*
+-              Use NEEDCOMPOUND instead. |spell-NEEDCOMPOUND|
++              Set number of n-gram suggestions.  Not supported.
  
--      if ((fname = strtok(tbuf, (const char *)"\t")) == NULL)
-+      if (strtok(tbuf, (const char *)"\t") == NULL)
-           continue;
-       if ((fname = strtok(NULL, (const char *)"\t")) == NULL)
-           continue;
-       if ((lno = strtok(NULL, (const char *)"\t")) == NULL)
-           continue;
-@@ -2097,11 +2237,10 @@ cs_read_prompt(i)
+ PSEUDOROOT    (Hunspell)                              *spell-PSEUDOROOT*
+               Use NEEDAFFIX instead. |spell-NEEDAFFIX|
  
- #if defined(UNIX) && defined(SIGALRM)
- /*
-  * Used to catch and ignore SIGALRM below.
-  */
--/* ARGSUSED */
-     static RETSIGTYPE
- sig_handler SIGDEFARG(sigarg)
- {
-     /* do nothing */
-     SIGRETURN;
-@@ -2137,11 +2276,15 @@ cs_release_csp(i, freefnpp)
-       struct sigaction sa, old;
+ SUGSWITHDOTS  (Hunspell)                              *spell-SUGSWITHDOTS*
+--- vim72.orig/runtime/doc/starting.txt
++++ vim72/runtime/doc/starting.txt
+@@ -1,6 +1,6 @@
+-*starting.txt*  For Vim version 7.2.  Last change: 2008 Jun 21
++*starting.txt*  For Vim version 7.2.  Last change: 2008 Nov 09
  
-       /* Use sigaction() to limit the waiting time to two seconds. */
-       sigemptyset(&sa.sa_mask);
-       sa.sa_handler = sig_handler;
-+#  ifdef SA_NODEFER
-       sa.sa_flags = SA_NODEFER;
-+#  else
-+      sa.sa_flags = 0;
-+#  endif
-       sigaction(SIGALRM, &sa, &old);
-       alarm(2); /* 2 sec timeout */
  
-       /* Block until cscope exits or until timer expires */
-       pid = waitpid(csinfo[i].pid, &pstat, 0);
-@@ -2237,42 +2380,44 @@ cs_release_csp(i, freefnpp)
- /*
-  * PRIVATE: cs_reset
-  *
-  * calls cs_kill on all cscope connections then reinits
-  */
--/* ARGSUSED */
-     static int
- cs_reset(eap)
--    exarg_T *eap;
-+    exarg_T *eap UNUSED;
- {
-     char      **dblist = NULL, **pplist = NULL, **fllist = NULL;
-     int       i;
-     char buf[20]; /* for sprintf " (#%d)" */
+                 VIM REFERENCE MANUAL    by Bram Moolenaar
  
-+    if (csinfo_size == 0)
-+      return CSCOPE_SUCCESS;
-+
-     /* malloc our db and ppath list */
--    dblist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
--    pplist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
--    fllist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
-+    dblist = (char **)alloc(csinfo_size * sizeof(char *));
-+    pplist = (char **)alloc(csinfo_size * sizeof(char *));
-+    fllist = (char **)alloc(csinfo_size * sizeof(char *));
-     if (dblist == NULL || pplist == NULL || fllist == NULL)
-     {
-       vim_free(dblist);
-       vim_free(pplist);
-       vim_free(fllist);
-       return CSCOPE_FAILURE;
-     }
  
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-     {
-       dblist[i] = csinfo[i].fname;
-       pplist[i] = csinfo[i].ppath;
-       fllist[i] = csinfo[i].flags;
-       if (csinfo[i].fname != NULL)
-           cs_release_csp(i, FALSE);
-     }
+@@ -142,10 +142,18 @@ a slash.  Thus "-R" means recovery and "
+                       (nothing)               yes                 yes
+                       -u NONE                 no                  no
+                       -u NORC                 no                  yes
+                       --noplugin              yes                 no
  
-     /* rebuild the cscope connection list */
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-     {
-       if (dblist[i] != NULL)
-       {
-           cs_add_common(dblist[i], pplist[i], fllist[i]);
-           if (p_csverbose)
-@@ -2353,24 +2498,23 @@ cs_resolve_file(i, name)
- /*
-  * PRIVATE: cs_show
-  *
-  * show all cscope connections
-  */
--/* ARGSUSED */
-     static int
- cs_show(eap)
--    exarg_T *eap;
-+    exarg_T *eap UNUSED;
- {
-     short i;
-     if (cs_cnt_connections() == 0)
-       MSG_PUTS(_("no cscope connections\n"));
-     else
-     {
-       MSG_PUTS_ATTR(
-           _(" # pid    database name                       prepend path\n"),
-           hl_attr(HLF_T));
--      for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+      for (i = 0; i < csinfo_size; i++)
-       {
-           if (csinfo[i].fname == NULL)
-               continue;
++--startuptime {fname}                                 *--startuptime*
++              During startup write timing messages to the file {fname}.
++              This can be used to find out where time is spent while loading
++              your .vimrc, plugins and opening the first file.
++              When {fname} already exists new messages are appended.
++              (Only available when compiled with the |+startuptime|
++              feature).
++
+                                                       *--literal*
+ --literal     Take file names literally, don't expand wildcards.  Not needed
+               for Unix, because Vim always takes file names literally (the
+               shell expands wildcards).
+               Applies to all the names, also the ones that come before this
+@@ -469,10 +477,11 @@ a slash.  Thus "-R" means recovery and "
+                                                       *-X*
+ -X            Do not try connecting to the X server to get the current
+               window title and copy/paste using the X clipboard.  This
+               avoids a long startup time when running Vim in a terminal
+               emulator and the connection to the X server is slow.
++              See |--startuptime| to find out if affects you.
+               Only makes a difference on Unix or VMS, when compiled with the
+               |+X11| feature.  Otherwise it's ignored.
+               To disable the connection only for specific terminals, see the
+               'clipboard' option.
+               When the X11 Session Management Protocol (XSMP) handler has
+@@ -1335,12 +1344,13 @@ working on.  Viminfo and Session files t
+ enter Vim and directly start working in your desired setup. |session-file|
  
-           if (csinfo[i].ppath != NULL)
-@@ -2395,12 +2539,14 @@ cs_show(eap)
-     void
- cs_end()
- {
-     int i;
+                                                       *viminfo-read*
+ When Vim is started and the 'viminfo' option is non-empty, the contents of
+ the viminfo file are read and the info can be used in the appropriate places.
+-The marks are not read in at startup (but file marks are).  See
+-|initialization| for how to set the 'viminfo' option upon startup.
++The |v:oldfiles| variable is filled.  The marks are not read in at startup
++(but file marks are).  See |initialization| for how to set the 'viminfo'
++option upon startup.
  
--    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
-+    for (i = 0; i < csinfo_size; i++)
-       cs_release_csp(i, TRUE);
-+    vim_free(csinfo);
-+    csinfo_size = 0;
- }
+                                                       *viminfo-write*
+ When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
+ file (it's actually merged with the existing one, if one exists).  The
+ 'viminfo' option is a string containing information about what info should be
+@@ -1370,10 +1380,12 @@ about to abandon with ":bdel", use ":wv"
+ stored, but the '"' mark is.  The '"' mark is very useful for jumping to the
+ cursor position when the file was last exited.  No marks are saved for files
+ that start with any string given with the "r" flag in 'viminfo'.  This can be
+ used to avoid saving marks for files on removable media (for MS-DOS you would
+ use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:").
++The |v:oldfiles| variable is filled with the file names that the viminfo file
++has marks for.
  
- #endif        /* FEAT_CSCOPE */
+                                                       *viminfo-file-marks*
+ Uppercase marks ('A to 'Z) are stored when writing the viminfo file.  The
+ numbered marks ('0 to '9) are a bit special.  When the viminfo file is written
+ (when exiting or with the ":wviminfo" command), '0 is set to the current cursor
+@@ -1461,12 +1473,12 @@ either have to fix the error, or delete
+ most of the information will be restored).
  
- /* the end */
---- vim72.orig/src/if_cscope.h
-+++ vim72/src/if_cscope.h
-@@ -23,11 +23,10 @@
- # endif
- #endif
+                                                  *:rv* *:rviminfo* *E195*
+ :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above).
+                       If [!] is given, then any information that is
+-                      already set (registers, marks, etc.) will be
+-                      overwritten.  {not in Vi}
++                      already set (registers, marks, |v:oldfiles|, etc.)
++                      will be overwritten   {not in Vi}
  
- #define CSCOPE_SUCCESS                0
- #define CSCOPE_FAILURE                -1
--#define CSCOPE_MAX_CONNECTIONS        8   /* you actually need more? */
+                                       *:wv* *:wviminfo* *E137* *E138* *E574*
+ :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above).
+                       The information in the file is first read in to make
+                       a merge between old and new info.  When [!] is used,
+@@ -1477,6 +1489,22 @@ most of the information will be restored
+                       check that no old temp files were left behind (e.g.
+                       ~/.viminf*) and that you can write in the directory of
+                       the .viminfo file.
+                       {not in Vi}
  
- #define       CSCOPE_DBFILE           "cscope.out"
- #define       CSCOPE_PROMPT           ">> "
++                                              *:ol* *:oldfiles*
++:ol[dfiles]           List the files that have marks stored in the viminfo
++                      file.  This list is read on startup and only changes
++                      afterwards with ":rviminfo!".  Also see |v:oldfiles|.
++                      The number can be used with |c_#<|.
++                      {not in Vi, only when compiled with the +eval feature}
++
++:bro[wse] ol[dfiles][!]
++                      List file names as with |:oldfiles|, and then prompt
++                      for a number.  When the number is valid that file from
++                      the list is edited.
++                      If you get the |press-enter| prompt you can press "q"
++                      and still get the prompt to enter a file number.
++                      Use ! to abondon a modified buffer. |abandon|
++                      {not when compiled with tiny or small features}
++
+  vim:tw=78:ts=8:ft=help:norl:
+--- vim72.orig/runtime/doc/usr_21.txt
++++ vim72/runtime/doc/usr_21.txt
+@@ -1,6 +1,6 @@
+-*usr_21.txt*  For Vim version 7.2.  Last change: 2007 May 01
++*usr_21.txt*  For Vim version 7.2.  Last change: 2008 Nov 09
  
- /*
-@@ -40,21 +39,10 @@
-  *   5pattern change pattern -- NOT USED
-  * e 6pattern Find this egrep pattern
-  * f 7name    Find this file
-  * i 8name    Find files #including this file
-  */
--#define       FIND_USAGE "find c|d|e|f|g|i|s|t name"
--#define FIND_HELP "\n\
--       c: Find functions calling this function\n\
--       d: Find functions called by this function\n\
--       e: Find this egrep pattern\n\
--       f: Find this file\n\
--       g: Find this definition\n\
--       i: Find files #including this file\n\
--       s: Find this C symbol\n\
--       t: Find assignments to\n"
--
+                    VIM USER MANUAL - by Bram Moolenaar
  
- typedef struct {
-     char *  name;
-     int     (*func) __ARGS((exarg_T *eap));
-     char *  help;
---- vim72.orig/src/eval.c
-+++ vim72/src/eval.c
-@@ -30,10 +30,13 @@
- # include <math.h>
- #endif
+                          Go away and come back
  
- #define DICT_MAXNEST 100      /* maximum nesting of lists and dicts */
+@@ -151,11 +151,11 @@ See the 'viminfo' option and |viminfo-fi
+ When you run Vim multiple times, the last one exiting will store its
+ information.  This may cause information that previously exiting Vims stored
+ to be lost.  Each item can be remembered only once.
  
-+#define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not
-+                                 be freed. */
-+
- /*
-  * In a hashtab item "hi_key" points to "di_key" in a dictitem.
-  * This avoids adding a pointer to the hashtab item.
-  * DI2HIKEY() converts a dictitem pointer to a hashitem key pointer.
-  * HIKEY2DI() converts a hashitem key pointer to a dictitem pointer.
-@@ -124,12 +127,15 @@ static dictitem_T        globvars_var;
- static hashtab_T      compat_hashtab;
  
- /*
-  * When recursively copying lists and dicts we need to remember which ones we
-  * have done to avoid endless recursiveness.  This unique ID is used for that.
-+ * The last bit is used for previous_funccal, ignored when comparing.
-  */
- static int current_copyID = 0;
-+#define COPYID_INC 2
-+#define COPYID_MASK (~0x1)
+-GETTING BACK TO WHERE YOU WERE
++GETTING BACK TO WHERE YOU STOPPED VIM
  
- /*
-  * Array to hold the hashtab with variables local to each sourced script.
-  * Each item holds a variable (nameless) that points to the dict_T.
-  */
-@@ -278,11 +284,11 @@ typedef struct
- /* values for vv_flags: */
- #define VV_COMPAT     1       /* compatible, also used without "v:" */
- #define VV_RO         2       /* read-only */
- #define VV_RO_SBX     4       /* read-only in the sandbox */
+ You are halfway editing a file and it's time to leave for holidays.  You exit
+ Vim and go enjoy yourselves, forgetting all about your work.  After a couple
+ of weeks you start Vim, and type:
+ >
+@@ -166,10 +166,52 @@ And you are right back where you left Vi
+ position that '0 pointed to is made '1.  And '1 is made to '2, and so forth.
+ Mark '9 is lost.
+    The |:marks| command is useful to find out where '0 to '9 will take you.
  
--#define VV_NAME(s, t) s, {{t}}, {0}
-+#define VV_NAME(s, t) s, {{t, 0, {0}}, 0, {0}}, {0}
  
- static struct vimvar
- {
-     char      *vv_name;       /* name of variable, without v: */
-     dictitem_T        vv_di;          /* value and name for key */
-@@ -346,17 +352,19 @@ static struct vimvar
-     {VV_NAME("mouse_win",      VAR_NUMBER), 0},
-     {VV_NAME("mouse_lnum",     VAR_NUMBER), 0},
-     {VV_NAME("mouse_col",      VAR_NUMBER), 0},
-     {VV_NAME("operator",       VAR_STRING), VV_RO},
-     {VV_NAME("searchforward",  VAR_NUMBER), 0},
-+    {VV_NAME("oldfiles",       VAR_LIST), 0},
- };
- /* shorthand */
- #define vv_type               vv_di.di_tv.v_type
- #define vv_nr         vv_di.di_tv.vval.v_number
- #define vv_float      vv_di.di_tv.vval.v_float
- #define vv_str                vv_di.di_tv.vval.v_string
-+#define vv_list               vv_di.di_tv.vval.v_list
- #define vv_tv         vv_di.di_tv
- /*
-  * The v: variables are stored in dictionary "vimvardict".
-  * "vimvars_var" is the variable that is used for the "l:" scope.
-@@ -423,31 +431,27 @@ static int dict_equal __ARGS((dict_T *d1
- static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic));
- static listitem_T *list_find __ARGS((list_T *l, long n));
- static long list_find_nr __ARGS((list_T *l, long idx, int *errorp));
- static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
- static void list_append __ARGS((list_T *l, listitem_T *item));
--static int list_append_tv __ARGS((list_T *l, typval_T *tv));
--static int list_append_string __ARGS((list_T *l, char_u *str, int len));
- static int list_append_number __ARGS((list_T *l, varnumber_T n));
- static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item));
- static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef));
- static int list_concat __ARGS((list_T *l1, list_T *l2, typval_T *tv));
- static list_T *list_copy __ARGS((list_T *orig, int deep, int copyID));
- static void list_remove __ARGS((list_T *l, listitem_T *item, listitem_T *item2));
- static char_u *list2string __ARGS((typval_T *tv, int copyID));
- static int list_join __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo, int copyID));
-+static int free_unref_items __ARGS((int copyID));
- static void set_ref_in_ht __ARGS((hashtab_T *ht, int copyID));
- static void set_ref_in_list __ARGS((list_T *l, int copyID));
- static void set_ref_in_item __ARGS((typval_T *tv, int copyID));
- static void dict_unref __ARGS((dict_T *d));
- static void dict_free __ARGS((dict_T *d, int recurse));
--static dictitem_T *dictitem_alloc __ARGS((char_u *key));
- static dictitem_T *dictitem_copy __ARGS((dictitem_T *org));
- static void dictitem_remove __ARGS((dict_T *dict, dictitem_T *item));
--static void dictitem_free __ARGS((dictitem_T *item));
- static dict_T *dict_copy __ARGS((dict_T *orig, int deep, int copyID));
--static int dict_add __ARGS((dict_T *d, dictitem_T *item));
- static long dict_len __ARGS((dict_T *d));
- static dictitem_T *dict_find __ARGS((dict_T *d, char_u *key, int len));
- static char_u *dict2string __ARGS((typval_T *tv, int copyID));
- static int get_dict_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate));
- static char_u *echo_string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID));
-@@ -618,10 +622,13 @@ static void f_max __ARGS((typval_T *argv
- static void f_min __ARGS((typval_T *argvars, typval_T *rettv));
- #ifdef vim_mkdir
- static void f_mkdir __ARGS((typval_T *argvars, typval_T *rettv));
- #endif
- static void f_mode __ARGS((typval_T *argvars, typval_T *rettv));
-+#ifdef FEAT_MZSCHEME
-+static void f_mzeval __ARGS((typval_T *argvars, typval_T *rettv));
-+#endif
- static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv));
- static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv));
- static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv));
- #ifdef FEAT_FLOAT
- static void f_pow __ARGS((typval_T *argvars, typval_T *rettv));
-@@ -754,11 +761,10 @@ static void list_one_var __ARGS((dictite
- static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first));
- static void set_var __ARGS((char_u *name, typval_T *varp, int copy));
- static int var_check_ro __ARGS((int flags, char_u *name));
- static int var_check_fixed __ARGS((int flags, char_u *name));
- static int tv_check_lock __ARGS((int lock, char_u *name));
--static void copy_tv __ARGS((typval_T *from, typval_T *to));
- static int item_copy __ARGS((typval_T *from, typval_T *to, int deep, int copyID));
- static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
- static char_u *trans_function_name __ARGS((char_u **pp, int skip, int flags, funcdict_T *fd));
- static int eval_fname_script __ARGS((char_u *p));
- static int eval_fname_sid __ARGS((char_u *p));
-@@ -786,10 +792,12 @@ static char_u *autoload_name __ARGS((cha
- static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp));
- static void func_free __ARGS((ufunc_T *fp));
- static void func_unref __ARGS((char_u *name));
- static void func_ref __ARGS((char_u *name));
- static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict));
-+static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ;
-+static void free_funccal __ARGS((funccall_T *fc, int free_val));
- static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr));
- static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp));
- static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off));
- static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos));
- static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp));
-@@ -843,15 +851,21 @@ eval_clear()
-     for (i = 0; i < VV_LEN; ++i)
-     {
-       p = &vimvars[i];
-       if (p->vv_di.di_tv.v_type == VAR_STRING)
-       {
--          vim_free(p->vv_di.di_tv.vval.v_string);
--          p->vv_di.di_tv.vval.v_string = NULL;
-+          vim_free(p->vv_str);
-+          p->vv_str = NULL;
-+      }
-+      else if (p->vv_di.di_tv.v_type == VAR_LIST)
-+      {
-+          list_unref(p->vv_list);
-+          p->vv_list = NULL;
-       }
-     }
-     hash_clear(&vimvarht);
-+    hash_init(&vimvarht);  /* garbage_collect() will access it */
-     hash_clear(&compat_hashtab);
-     /* script-local variables */
-     for (i = 1; i <= ga_scripts.ga_len; ++i)
-       vars_clear(&SCRIPT_VARS(i));
-@@ -914,10 +928,14 @@ func_level(cookie)
- }
- /* pointer to funccal for currently active function */
- funccall_T *current_funccal = NULL;
-+/* pointer to list of previously used funccal, still around because some
-+ * item in it is still being used. */
-+funccall_T *previous_funccal = NULL;
++GETTING BACK TO SOME FILE
 +
- /*
-  * Return TRUE when a function was ended by a ":return" command.
-  */
-     int
- current_func_returned()
-@@ -966,17 +984,18 @@ var_redir_start(name, append)
- {
-     int               save_emsg;
-     int               err;
-     typval_T  tv;
--    /* Make sure a valid variable name is specified */
-+    /* Catch a bad name early. */
-     if (!eval_isnamec1(*name))
-     {
-       EMSG(_(e_invarg));
-       return FAIL;
-     }
++If you want to go back to a file that you edited recently, but not when
++exiting Vim, there is a slightly more complicated way.  You can see a list of
++files by typing the command: >
++
++      :oldfiles
++<     1: ~/.viminfo ~
++      2: ~/text/resume.txt ~
++      3: /tmp/draft ~
++
++Now you would like to edit the second file, which is in the list preceded by
++"2:".  You type: >
++
++      :e #<2
++
++Instead of ":e" you can use any command that has a file name argument, the
++"#<2" item works in the same place as "%" (current file name) and "#"
++(alternate file name).  So you can also split the window to edit the third
++file: >
++
++      :split #<3
++
++That #<123 thing is a bit complicated when you just want to edit a file.
++Fortunately there is a simpler way: >
++
++      :browse oldfiles
++<     1: ~/.viminfo ~
++      2: ~/text/resume.txt ~
++      3: /tmp/draft ~
++      -- More --
++
++You get the same list of files as with |:oldfiles|.  If you want to edit
++"resume.txt" first press "q" to stop the listing.  You will get a prompt:
++
++      Type number and <Enter> (empty cancels): ~
++
++Type "2" and press <Enter> to edit the second file.
++
++More info at |:oldfiles|, |v:oldfiles| and |c_#<|.
++
++
+ MOVE INFO FROM ONE VIM TO ANOTHER
  
-+    /* Make a copy of the name, it is used in redir_lval until redir ends. */
-     redir_varname = vim_strsave(name);
-     if (redir_varname == NULL)
-       return FAIL;
+ You can use the ":wviminfo" and ":rviminfo" commands to save and restore the
+ information while still running Vim.  This is useful for exchanging register
+ contents between two instances of Vim, for example.  In the first Vim do: >
+--- vim72.orig/runtime/doc/usr_41.txt
++++ vim72/runtime/doc/usr_41.txt
+@@ -866,10 +866,12 @@ Various:
+       setreg()                set contents and type of a register
  
-     redir_lval = (lval_T *)alloc_clear((unsigned)sizeof(lval_T));
-@@ -997,10 +1016,11 @@ var_redir_start(name, append)
-       if (redir_endp != NULL && *redir_endp != NUL)
-           /* Trailing characters are present after the variable name */
-           EMSG(_(e_trailing));
-       else
-           EMSG(_(e_invarg));
-+      redir_endp = NULL;  /* don't store a value, only cleanup */
-       var_redir_stop();
-       return FAIL;
-     }
+       taglist()               get list of matching tags
+       tagfiles()              get a list of tags files
  
-     /* check if we can write to the variable: set it to or append an empty
-@@ -1015,10 +1035,11 @@ var_redir_start(name, append)
-       set_var_lval(redir_lval, redir_endp, &tv, TRUE, (char_u *)"=");
-     err = did_emsg;
-     did_emsg |= save_emsg;
-     if (err)
-     {
-+      redir_endp = NULL;  /* don't store a value, only cleanup */
-       var_redir_stop();
-       return FAIL;
-     }
-     if (redir_lval->ll_newkey != NULL)
-     {
-@@ -1063,26 +1084,31 @@ var_redir_str(value, value_len)
-       var_redir_stop();
- }
++      mzeval()                evaluate |MzScheme| expression
++
+ ==============================================================================
+ *41.7*        Defining a function
  
- /*
-  * Stop redirecting command output to a variable.
-+ * Frees the allocated memory.
-  */
-     void
- var_redir_stop()
- {
-     typval_T  tv;
+ Vim enables you to define your own functions.  The basic function declaration
+ begins as follows: >
+--- vim72.orig/runtime/doc/various.txt
++++ vim72/runtime/doc/various.txt
+@@ -372,10 +372,11 @@ m  *+ruby*               Ruby interface |ruby|
+ m  *+ruby/dyn*                Ruby interface |ruby-dynamic| |/dyn|
+ N  *+scrollbind*      |'scrollbind'|
+ B  *+signs*           |:sign|
+ N  *+smartindent*     |'smartindent'|
+ m  *+sniff*           SniFF interface |sniff|
++N  *+startuptime*     |--startuptime| argument
+ N  *+statusline*      Options 'statusline', 'rulerformat' and special
+                       formats of 'titlestring' and 'iconstring'
+ m  *+sun_workshop*    |workshop|
+ N  *+syntax*          Syntax highlighting |syntax|
+    *+system()*                Unix only: opposite of |+fork|
+@@ -506,10 +507,21 @@ N  *+X11*                Unix only: can restore window
+                       ":silent menu ..." defines a menu that will not echo a
+                       Command-line command.  The command will still produce
+                       messages though.  Use ":silent" in the command itself
+                       to avoid that: ":silent menu .... :silent command".
  
-     if (redir_lval != NULL)
-     {
--      /* Append the trailing NUL. */
--      ga_append(&redir_ga, NUL);
-+      /* If there was no error: assign the text to the variable. */
-+      if (redir_endp != NULL)
-+      {
-+          ga_append(&redir_ga, NUL);  /* Append the trailing NUL. */
-+          tv.v_type = VAR_STRING;
-+          tv.vval.v_string = redir_ga.ga_data;
-+          set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)".");
-+      }
++                                              *:uns* *:unsilent*
++:uns[ilent] {command} Execute {command} not silently.  Only makes a
++                      difference when |:silent| was used to get to this
++                      command.
++                      Use this for giving a message even when |:silent| was
++                      used.  In this example |:silent| is used to avoid the
++                      message about reading the file and |:unsilent| to be
++                      able to list the first line of each file. >
++              :silent argdo unsilent echo expand('%') . ": " . getline(1)
++<
++
+                                               *:verb* *:verbose*
+ :[count]verb[ose] {command}
+                       Execute {command} with 'verbose' set to [count].  If
+                       [count] is omitted one is used. ":0verbose" can be
+                       used to set 'verbose' to zero.
+--- vim72.orig/runtime/filetype.vim
++++ vim72/runtime/filetype.vim
+@@ -2398,22 +2398,24 @@ au BufNewFile,BufRead /etc/xinetd.d/*          c
  
--      /* Assign the text to the variable. */
--      tv.v_type = VAR_STRING;
--      tv.vval.v_string = redir_ga.ga_data;
--      set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)".");
--      vim_free(tv.vval.v_string);
-+      /* free the collected output */
-+      vim_free(redir_ga.ga_data);
-+      redir_ga.ga_data = NULL;
+ " Z-Shell script
+ au BufNewFile,BufRead zsh*,zlog*              call s:StarSetf('zsh')
  
-       clear_lval(redir_lval);
-       vim_free(redir_lval);
-       redir_lval = NULL;
-     }
-@@ -1254,34 +1280,46 @@ skip_expr(pp)
-     return eval1(pp, &rettv, FALSE);
- }
  
- /*
-  * Top level evaluation function, returning a string.
-+ * When "convert" is TRUE convert a List into a sequence of lines and convert
-+ * a Float to a String.
-  * Return pointer to allocated memory, or NULL for failure.
-  */
-     char_u *
--eval_to_string(arg, nextcmd, dolist)
-+eval_to_string(arg, nextcmd, convert)
-     char_u    *arg;
-     char_u    **nextcmd;
--    int               dolist;         /* turn List into sequence of lines */
-+    int               convert;
- {
-     typval_T  tv;
-     char_u    *retval;
-     garray_T  ga;
-+#ifdef FEAT_FLOAT
-+    char_u    numbuf[NUMBUFLEN];
-+#endif
++
++" Use the filetype detect plugins.  They may overrule any of the previously
++" detected filetypes.
++runtime! ftdetect/*.vim
++
++
+ " Generic configuration file (check this last, it's just guessing!)
+ au BufNewFile,BufRead,StdinReadPost *
+       \ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
+       \    && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
+       \       || getline(4) =~ '^#' || getline(5) =~ '^#') |
+       \   setf conf |
+       \ endif
  
-     if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
-       retval = NULL;
-     else
-     {
--      if (dolist && tv.v_type == VAR_LIST)
-+      if (convert && tv.v_type == VAR_LIST)
-       {
-           ga_init2(&ga, (int)sizeof(char), 80);
-           if (tv.vval.v_list != NULL)
-               list_join(&ga, tv.vval.v_list, (char_u *)"\n", TRUE, 0);
-           ga_append(&ga, NUL);
-           retval = (char_u *)ga.ga_data;
-       }
-+#ifdef FEAT_FLOAT
-+      else if (convert && tv.v_type == VAR_FLOAT)
-+      {
-+          vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
-+          retval = vim_strsave(numbuf);
-+      }
-+#endif
-       else
-           retval = vim_strsave(get_tv_string(&tv));
-       clear_tv(&tv);
-     }
+-" Use the plugin-filetype checks last, they may overrule any of the previously
+-" detected filetypes.
+-runtime! ftdetect/*.vim
+-
+ augroup END
  
-@@ -3275,11 +3313,11 @@ ex_call(eap)
-     startarg = skipwhite(arg);
-     rettv.v_type = VAR_UNKNOWN;       /* clear_tv() uses this */
  
-     if (*startarg != '(')
-     {
--      EMSG2(_("E107: Missing braces: %s"), eap->arg);
-+      EMSG2(_("E107: Missing parentheses: %s"), eap->arg);
-       goto end;
-     }
+ " If the GUI is already running, may still need to install the Syntax menu.
+ " Don't do it when the 'M' flag is included in 'guioptions'.
+--- vim72.orig/runtime/plugin/gzip.vim
++++ vim72/runtime/plugin/gzip.vim
+@@ -1,8 +1,8 @@
+ " Vim plugin for editing compressed files.
+ " Maintainer: Bram Moolenaar <Bram@vim.org>
+-" Last Change: 2005 Jul 26
++" Last Change: 2010 Mar 10
  
-     /*
-      * When skipping, evaluate the function once, to find the end of the
-@@ -3655,12 +3693,12 @@ item_lock(tv, deep, lock)
-     }
-     --recurse;
- }
+ " Exit quickly when:
+ " - this plugin was already loaded
+ " - when 'compatible' is set
+ " - some autocommands are already taking care of compressed files
+@@ -18,19 +18,27 @@ augroup gzip
+   " Enable editing of gzipped files.
+   " The functions are defined in autoload/gzip.vim.
+   "
+   " Set binary mode before reading the file.
+   " Use "gzip -d", gunzip isn't always available.
+-  autocmd BufReadPre,FileReadPre      *.gz,*.bz2,*.Z setlocal bin
++  autocmd BufReadPre,FileReadPre      *.gz,*.bz2,*.Z,*.lzma,*.xz setlocal bin
+   autocmd BufReadPost,FileReadPost    *.gz  call gzip#read("gzip -dn")
+   autocmd BufReadPost,FileReadPost    *.bz2 call gzip#read("bzip2 -d")
+   autocmd BufReadPost,FileReadPost    *.Z   call gzip#read("uncompress")
++  autocmd BufReadPost,FileReadPost    *.lzma call gzip#read("lzma -d")
++  autocmd BufReadPost,FileReadPost    *.xz  call gzip#read("xz -d")
+   autocmd BufWritePost,FileWritePost  *.gz  call gzip#write("gzip")
+   autocmd BufWritePost,FileWritePost  *.bz2 call gzip#write("bzip2")
+   autocmd BufWritePost,FileWritePost  *.Z   call gzip#write("compress -f")
++  autocmd BufWritePost,FileWritePost  *.lzma call gzip#write("lzma -z")
++  autocmd BufWritePost,FileWritePost  *.xz  call gzip#write("xz -z")
+   autocmd FileAppendPre                       *.gz  call gzip#appre("gzip -dn")
+   autocmd FileAppendPre                       *.bz2 call gzip#appre("bzip2 -d")
+   autocmd FileAppendPre                       *.Z   call gzip#appre("uncompress")
++  autocmd FileAppendPre                       *.lzma call gzip#appre("lzma -d")
++  autocmd FileAppendPre                       *.xz   call gzip#appre("xz -d")
+   autocmd FileAppendPost              *.gz  call gzip#write("gzip")
+   autocmd FileAppendPost              *.bz2 call gzip#write("bzip2")
+   autocmd FileAppendPost              *.Z   call gzip#write("compress -f")
++  autocmd FileAppendPost              *.lzma call gzip#write("lzma -z")
++  autocmd FileAppendPost              *.xz call gzip#write("xz -z")
+ augroup END
+--- vim72.orig/runtime/scripts.vim
++++ vim72/runtime/scripts.vim
+@@ -232,10 +232,14 @@ else
  
- /*
-- * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or
-- * it refers to a List or Dictionary that is locked.
-+ * Return TRUE if typeval "tv" is locked: Either that value is locked itself
-+ * or it refers to a List or Dictionary that is locked.
-  */
-     static int
- tv_islocked(tv)
-     typval_T  *tv;
- {
-@@ -3742,11 +3780,10 @@ cat_prefix_varname(prefix, name)
+     " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
+   elseif s:line1 =~ '\<DTD\s\+XHTML\s'
+     set ft=xhtml
  
- /*
-  * Function given to ExpandGeneric() to obtain the list of user defined
-  * (global/buffer/window/built-in) variable names.
-  */
--/*ARGSUSED*/
-     char_u *
- get_user_var_name(xp, idx)
-     expand_T  *xp;
-     int               idx;
- {
-@@ -3900,11 +3937,11 @@ eval0(arg, rettv, nextcmd, evaluate)
-     return ret;
- }
++    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
++  elseif s:line1 =~? '\<DOCTYPE\s\+html\>'
++    set ft=html
++
+     " PDF
+   elseif s:line1 =~ '^%PDF-'
+     set ft=pdf
  
- /*
-  * Handle top level expression:
-- *    expr1 ? expr0 : expr0
-+ *    expr2 ? expr1 : expr1
-  *
-  * "arg" must point to the first non-white of the expression.
-  * "arg" is advanced to the next non-white after the recognized expression.
-  *
-  * Note: "rettv.v_lock" is not set.
-@@ -5833,11 +5870,12 @@ list_equal(l1, l2, ic)
-       if (!tv_equal(&item1->li_tv, &item2->li_tv, ic))
-           return FALSE;
-     return item1 == NULL && item2 == NULL;
- }
+     " XXD output
+--- vim72.orig/runtime/tools/README.txt
++++ vim72/runtime/tools/README.txt
+@@ -30,6 +30,8 @@ vim_vs_net.cmd: MS-Windows command file
+               later.
  
--#if defined(FEAT_PYTHON) || defined(PROTO)
-+#if defined(FEAT_RUBY) || defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) \
-+      || defined(PROTO)
- /*
-  * Return the dictitem that an entry in a hashtable points to.
-  */
-     dictitem_T *
- dict_lookup(hi)
-@@ -6045,10 +6083,29 @@ list_find_nr(l, idx, errorp)
-     }
-     return get_tv_number_chk(&li->li_tv, errorp);
- }
+ xcmdsrv_client.c:  Example for a client program that communicates with a Vim
+                  server through the X-Windows interface.
  
- /*
-+ * Get list item "l[idx - 1]" as a string.  Returns NULL for failure.
-+ */
-+    char_u *
-+list_find_str(l, idx)
-+    list_T    *l;
-+    long      idx;
-+{
-+    listitem_T        *li;
-+
-+    li = list_find(l, idx - 1);
-+    if (li == NULL)
-+    {
-+      EMSGN(_(e_listidx), idx);
-+      return NULL;
-+    }
-+    return get_tv_string(&li->li_tv);
-+}
++unicode.vim   Vim script to generate tables for src/mbyte.c.
 +
-+/*
-  * Locate "item" list "l" and return its index.
-  * Returns -1 when "item" is not in the list.
-  */
-     static long
- list_idx_of_item(l, item)
-@@ -6095,11 +6152,11 @@ list_append(l, item)
- /*
-  * Append typval_T "tv" to the end of list "l".
-  * Return FAIL when out of memory.
-  */
--    static int
-+    int
- list_append_tv(l, tv)
-     list_T    *l;
-     typval_T  *tv;
- {
-     listitem_T        *li = listitem_alloc();
-@@ -6135,11 +6192,11 @@ list_append_dict(list, dict)
- /*
-  * Make a copy of "str" and append it as an item to list "l".
-  * When "len" >= 0 use "str[len]".
-  * Returns FAIL when out of memory.
-  */
--    static int
-+    int
- list_append_string(l, str, len)
-     list_T    *l;
-     char_u    *str;
-     int               len;
- {
-@@ -6415,10 +6472,11 @@ list_join(gap, l, sep, echo, copyID)
-       if (s != NULL)
-           ga_concat(gap, s);
-       vim_free(tofree);
-       if (s == NULL)
-           return FAIL;
-+      line_breakcheck();
-     }
-     return OK;
- }
- /*
-@@ -6446,31 +6504,45 @@ list_join(gap, l, sep, echo, copyID)
-  * Return TRUE if some memory was freed.
-  */
-     int
- garbage_collect()
- {
--    dict_T    *dd;
--    list_T    *ll;
--    int               copyID = ++current_copyID;
-+    int               copyID;
-     buf_T     *buf;
-     win_T     *wp;
-     int               i;
--    funccall_T        *fc;
--    int               did_free = FALSE;
-+    funccall_T        *fc, **pfc;
-+    int               did_free;
-+    int               did_free_funccal = FALSE;
- #ifdef FEAT_WINDOWS
-     tabpage_T *tp;
- #endif
-     /* Only do this once. */
-     want_garbage_collect = FALSE;
-     may_garbage_collect = FALSE;
-     garbage_collect_at_exit = FALSE;
-+    /* We advance by two because we add one for items referenced through
-+     * previous_funccal. */
-+    current_copyID += COPYID_INC;
-+    copyID = current_copyID;
+ [xxd (and tee for OS/2) can be found in the src directory]
+--- /dev/null
++++ vim72/runtime/tools/unicode.vim
+@@ -0,0 +1,290 @@
++" Script to extract tables from Unicode .txt files, to be used in src/mbyte.c.
++" The format of the UnicodeData.txt file is explained here:
++" http://www.unicode.org/Public/5.1.0/ucd/UCD.html
++" For the other files see the header.
++"
++" Usage: Vim -S <this-file>
++"
++" Author: Bram Moolenaar
++" Last Update: 2010 Jan 12
 +
-     /*
-      * 1. Go through all accessible variables and mark all lists and dicts
-      *    with copyID.
-      */
++" Parse lines of UnicodeData.txt.  Creates a list of lists in s:dataprops.
++func! ParseDataToProps()
++  let s:dataprops = []
++  let lnum = 1
++  while lnum <= line('$')
++    let l = split(getline(lnum), '\s*;\s*', 1)
++    if len(l) != 15
++      echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 15'
++      return
++    endif
++    call add(s:dataprops, l)
++    let lnum += 1
++  endwhile
++endfunc
 +
-+    /* Don't free variables in the previous_funccal list unless they are only
-+     * referenced through previous_funccal.  This must be first, because if
-+     * the item is referenced elsewhere the funccal must not be freed. */
-+    for (fc = previous_funccal; fc != NULL; fc = fc->caller)
-+    {
-+      set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1);
-+      set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1);
-+    }
++" Parse lines of CaseFolding.txt.  Creates a list of lists in s:foldprops.
++func! ParseFoldProps()
++  let s:foldprops = []
++  let lnum = 1
++  while lnum <= line('$')
++    let line = getline(lnum)
++    if line !~ '^#' && line !~ '^\s*$'
++      let l = split(line, '\s*;\s*', 1)
++      if len(l) != 4
++      echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 4'
++      return
++      endif
++      call add(s:foldprops, l)
++    endif
++    let lnum += 1
++  endwhile
++endfunc
 +
-     /* script-local variables */
-     for (i = 1; i <= ga_scripts.ga_len; ++i)
-       set_ref_in_ht(&SCRIPT_VARS(i), copyID);
-     /* buffer-local variables */
-@@ -6495,15 +6567,58 @@ garbage_collect()
-     {
-       set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID);
-       set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID);
-     }
-+    /* v: vars */
-+    set_ref_in_ht(&vimvarht, copyID);
++" Parse lines of EastAsianWidth.txt.  Creates a list of lists in s:widthprops.
++func! ParseWidthProps()
++  let s:widthprops = []
++  let lnum = 1
++  while lnum <= line('$')
++    let line = getline(lnum)
++    if line !~ '^#' && line !~ '^\s*$'
++      let l = split(line, '\s*;\s*', 1)
++      if len(l) != 2
++      echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 2'
++      return
++      endif
++      call add(s:widthprops, l)
++    endif
++    let lnum += 1
++  endwhile
++endfunc
 +
-+    /*
-+     * 2. Free lists and dictionaries that are not referenced.
-+     */
-+    did_free = free_unref_items(copyID);
++" Build the toLower or toUpper table in a new buffer.
++" Uses s:dataprops.
++func! BuildCaseTable(name, index)
++  let start = -1
++  let end = -1
++  let step = 0
++  let add = -1
++  let ranges = []
++  for p in s:dataprops
++    if p[a:index] != ''
++      let n = ('0x' . p[0]) + 0
++      let nl = ('0x' . p[a:index]) + 0
++      if start >= 0 && add == nl - n && (step == 0 || n - end == step)
++      " continue with same range.
++      let step = n - end
++      let end = n
++      else
++      if start >= 0
++        " produce previous range
++        call Range(ranges, start, end, step, add)
++      endif
++      let start = n
++      let end = n
++      let step = 0
++      let add = nl - n
++      endif
++    endif
++  endfor
++  if start >= 0
++    call Range(ranges, start, end, step, add)
++  endif
 +
-     /*
--     * 2. Go through the list of dicts and free items without the copyID.
-+     * 3. Check if any funccal can be freed now.
-+     */
-+    for (pfc = &previous_funccal; *pfc != NULL; )
-+    {
-+      if (can_free_funccal(*pfc, copyID))
-+      {
-+          fc = *pfc;
-+          *pfc = fc->caller;
-+          free_funccal(fc, TRUE);
-+          did_free = TRUE;
-+          did_free_funccal = TRUE;
-+      }
++  " New buffer to put the result in.
++  new
++  exe "file to" . a:name
++  call setline(1, "static convertStruct to" . a:name . "[] =")
++  call setline(2, "{")
++  call append('$', ranges)
++  call setline('$', getline('$')[:-2])  " remove last comma
++  call setline(line('$') + 1, "};")
++  wincmd p
++endfunc
++
++" Build the foldCase table in a new buffer.
++" Uses s:foldprops.
++func! BuildFoldTable()
++  let start = -1
++  let end = -1
++  let step = 0
++  let add = -1
++  let ranges = []
++  for p in s:foldprops
++    if p[1] == 'C' || p[1] == 'S'
++      let n = ('0x' . p[0]) + 0
++      let nl = ('0x' . p[2]) + 0
++      if start >= 0 && add == nl - n && (step == 0 || n - end == step)
++      " continue with same range.
++      let step = n - end
++      let end = n
++      else
++      if start >= 0
++        " produce previous range
++        call Range(ranges, start, end, step, add)
++      endif
++      let start = n
++      let end = n
++      let step = 0
++      let add = nl - n
++      endif
++    endif
++  endfor
++  if start >= 0
++    call Range(ranges, start, end, step, add)
++  endif
++
++  " New buffer to put the result in.
++  new
++  file foldCase
++  call setline(1, "static convertStruct foldCase[] =")
++  call setline(2, "{")
++  call append('$', ranges)
++  call setline('$', getline('$')[:-2])  " remove last comma
++  call setline(line('$') + 1, "};")
++  wincmd p
++endfunc
++
++func! Range(ranges, start, end, step, add)
++  let s = printf("\t{0x%x,0x%x,%d,%d},", a:start, a:end, a:step == 0 ? -1 : a:step, a:add)
++  call add(a:ranges, s)
++endfunc
++
++" Build the combining table.
++" Uses s:dataprops.
++func! BuildCombiningTable()
++  let start = -1
++  let end = -1
++  let ranges = []
++  for p in s:dataprops
++    if p[2] == 'Mn' || p[2] == 'Mc' || p[2] == 'Me'
++      let n = ('0x' . p[0]) + 0
++      if start >= 0 && end + 1 == n
++      " continue with same range.
++      let end = n
++      else
++      if start >= 0
++        " produce previous range
++        call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
++      endif
++      let start = n
++      let end = n
++      endif
++    endif
++  endfor
++  if start >= 0
++    call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
++  endif
++
++  " New buffer to put the result in.
++  new
++  file combining
++  call setline(1, "    static struct interval combining[] =")
++  call setline(2, "    {")
++  call append('$', ranges)
++  call setline('$', getline('$')[:-2])  " remove last comma
++  call setline(line('$') + 1, "    };")
++  wincmd p
++endfunc
++
++" Build the double width or ambiguous width table in a new buffer.
++" Uses s:widthprops and s:dataprops.
++func! BuildWidthTable(pattern, tableName)
++  let start = -1
++  let end = -1
++  let ranges = []
++  let dataidx = 0
++  for p in s:widthprops
++    if p[1][0] =~ a:pattern
++      if p[0] =~ '\.\.'
++      " It is a range.  we don't check for composing char then.
++      let rng = split(p[0], '\.\.')
++      if len(rng) != 2
++        echoerr "Cannot parse range: '" . p[0] . "' in width table"
++      endif
++      let n = ('0x' . rng[0]) + 0
++      let n_last =  ('0x' . rng[1]) + 0
++      else
++      let n = ('0x' . p[0]) + 0
++      let n_last = n
++      endif
++      " Find this char in the data table.
++      while 1
++      let dn = ('0x' . s:dataprops[dataidx][0]) + 0
++      if dn >= n
++        break
++      endif
++      let dataidx += 1
++      endwhile
++      if dn != n && n_last == n
++      echoerr "Cannot find character " . n . " in data table"
++      endif
++      " Only use the char when it's not a composing char.
++      " But use all chars from a range.
++      let dp = s:dataprops[dataidx]
++      if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me')
++      if start >= 0 && end + 1 == n
++        " continue with same range.
 +      else
-+          pfc = &(*pfc)->caller;
-+    }
-+    if (did_free_funccal)
-+      /* When a funccal was freed some more items might be garbage
-+       * collected, so run again. */
-+      (void)garbage_collect();
++        if start >= 0
++          " produce previous range
++          call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
++        endif
++        let start = n
++      endif
++      let end = n_last
++      endif
++    endif
++  endfor
++  if start >= 0
++    call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
++  endif
 +
-+    return did_free;
-+}
++  " New buffer to put the result in.
++  new
++  exe "file " . a:tableName
++  call setline(1, "    static struct interval " . a:tableName . "[] =")
++  call setline(2, "    {")
++  call append('$', ranges)
++  call setline('$', getline('$')[:-2])  " remove last comma
++  call setline(line('$') + 1, "    };")
++  wincmd p
++endfunc
 +
-+/*
-+ * Free lists and dictionaries that are no longer referenced.
-+ */
-+    static int
-+free_unref_items(copyID)
-+    int copyID;
-+{
-+    dict_T    *dd;
-+    list_T    *ll;
-+    int               did_free = FALSE;
 +
-+    /*
-+     * Go through the list of dicts and free items without the copyID.
-      */
-     for (dd = first_dict; dd != NULL; )
--      if (dd->dv_copyID != copyID)
-+      if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
-       {
-           /* Free the Dictionary and ordinary items it contains, but don't
-            * recurse into Lists and Dictionaries, they will be in the list
-            * of dicts or list of lists. */
-           dict_free(dd, FALSE);
-@@ -6514,16 +6629,17 @@ garbage_collect()
++
++" Edit the Unicode text file.  Requires the netrw plugin.
++edit http://unicode.org/Public/UNIDATA/UnicodeData.txt
++
++" Parse each line, create a list of lists.
++call ParseDataToProps()
++
++" Build the toLower table.
++call BuildCaseTable("Lower", 13)
++
++" Build the toUpper table.
++call BuildCaseTable("Upper", 12)
++
++" Build the ranges of composing chars.
++call BuildCombiningTable()
++
++" Edit the case folding text file.  Requires the netrw plugin.
++edit http://www.unicode.org/Public/UNIDATA/CaseFolding.txt
++
++" Parse each line, create a list of lists.
++call ParseFoldProps()
++
++" Build the foldCase table.
++call BuildFoldTable()
++
++" Edit the width text file.  Requires the netrw plugin.
++edit http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
++
++" Parse each line, create a list of lists.
++call ParseWidthProps()
++
++" Build the double width table.
++call BuildWidthTable('[WF]', 'doublewidth')
++
++" Build the ambiguous width table.
++call BuildWidthTable('A', 'ambiguous')
+--- vim72.orig/src/GvimExt/Make_ming.mak
++++ vim72/src/GvimExt/Make_ming.mak
+@@ -18,28 +18,24 @@ CROSS = no
+ MINGWOLD = no
+ ifeq ($(CROSS),yes)
+ DEL = rm
+ ifeq ($(MINGWOLD),yes)
+-CXX = i586-mingw32msvc-g++
+ CXXFLAGS := -O2 -mno-cygwin -fvtable-thunks
+-WINDRES = i586-mingw32msvc-windres
+ else
+-CXX = i386-mingw32msvc-g++
+ CXXFLAGS := -O2 -mno-cygwin
+-WINDRES = i386-mingw32msvc-windres
+ endif
+ else
+-CXX := g++
+-WINDRES := windres
+ CXXFLAGS := -O2 -mno-cygwin
+ ifneq (sh.exe, $(SHELL))
+ DEL = rm
+ else
+ DEL = del
+ endif
+ endif
++CXX := $(CROSS_COMPILE)g++
++WINDRES := $(CROSS_COMPILE)windres
+ LIBS :=  -luuid
+ RES  := gvimext.res
+ DEFFILE = gvimext_ming.def
+ OBJ  := gvimext.o
+--- vim72.orig/src/GvimExt/gvimext.cpp
++++ vim72/src/GvimExt/gvimext.cpp
+@@ -633,11 +633,13 @@ STDMETHODIMP CShellExt::QueryContextMenu
+               --pos;
+           *pos = 0;
        }
-       else
-           dd = dd->dv_used_next;
+       // Now concatenate
+       strncpy(temp, _("Edit with existing Vim - "), BUFSIZE - 1);
+-      strncat(temp, title, BUFSIZE - 1);
++      temp[BUFSIZE - 1] = '\0';
++      strncat(temp, title, BUFSIZE - 1 - strlen(temp));
++      temp[BUFSIZE - 1] = '\0';
+       InsertMenu(hMenu,
+               indexMenu++,
+               MF_STRING|MF_BYPOSITION,
+               idCmd++,
+               temp);
+--- vim72.orig/src/GvimExt/gvimext.h
++++ vim72/src/GvimExt/gvimext.h
+@@ -12,13 +12,13 @@
+  */
  
-     /*
--     * 3. Go through the list of lists and free items without the copyID.
--     *    But don't free a list that has a watcher (used in a for loop), these
--     *    are not referenced anywhere.
-+     * Go through the list of lists and free items without the copyID.
-+     * But don't free a list that has a watcher (used in a for loop), these
-+     * are not referenced anywhere.
-      */
-     for (ll = first_list; ll != NULL; )
--      if (ll->lv_copyID != copyID && ll->lv_watch == NULL)
-+      if ((ll->lv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)
-+                                                    && ll->lv_watch == NULL)
-       {
-           /* Free the List and ordinary items it contains, but don't recurse
-            * into Lists and Dictionaries, they will be in the list of dicts
-            * or list of lists. */
-           list_free(ll, FALSE);
-@@ -6585,21 +6701,21 @@ set_ref_in_item(tv, copyID)
+ #if !defined(AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_)
+ #define AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_
  
-     switch (tv->v_type)
-     {
-       case VAR_DICT:
-           dd = tv->vval.v_dict;
--          if (dd->dv_copyID != copyID)
-+          if (dd != NULL && dd->dv_copyID != copyID)
-           {
-               /* Didn't see this dict yet. */
-               dd->dv_copyID = copyID;
-               set_ref_in_ht(&dd->dv_hashtab, copyID);
-           }
-           break;
+-#if _MSC_VER > 1000
++#if defined(_MSC_VER) && _MSC_VER > 1000
+ #pragma once
+-#endif // _MSC_VER > 1000
++#endif
  
-       case VAR_LIST:
-           ll = tv->vval.v_list;
--          if (ll->lv_copyID != copyID)
-+          if (ll != NULL && ll->lv_copyID != copyID)
-           {
-               /* Didn't see this list yet. */
-               ll->lv_copyID = copyID;
-               set_ref_in_list(ll, copyID);
-           }
-@@ -6693,11 +6809,11 @@ dict_free(d, recurse)
-  * Allocate a Dictionary item.
-  * The "key" is copied to the new item.
-  * Note that the value of the item "di_tv" still needs to be initialized!
-  * Returns NULL when out of memory.
-  */
--    static dictitem_T *
-+    dictitem_T *
- dictitem_alloc(key)
-     char_u    *key;
- {
-     dictitem_T *di;
+ // Insert your headers here
+ // #define WIN32_LEAN_AND_MEAN                // Exclude rarely-used stuff from Windows headers
  
-@@ -6749,11 +6865,11 @@ dictitem_remove(dict, item)
- }
+ //--------------------------------------------------------------
+@@ -32,21 +32,21 @@
+ #endif
  
- /*
-  * Free a dict item.  Also clears the value.
-  */
--    static void
-+    void
- dictitem_free(item)
-     dictitem_T *item;
- {
-     clear_tv(&item->di_tv);
-     vim_free(item);
-@@ -6829,11 +6945,11 @@ dict_copy(orig, deep, copyID)
+ #define INC_OLE2      // WIN32, get ole2 from windows.h
  
- /*
-  * Add item "item" to Dictionary "d".
-  * Returns FAIL when out of memory and when key already existed.
-  */
--    static int
-+    int
- dict_add(d, item)
-     dict_T    *d;
-     dictitem_T        *item;
- {
-     return hash_add(&d->dv_hashtab, item->di_key);
-@@ -7523,12 +7639,12 @@ static struct fst
-     {"getregtype",    0, 1, f_getregtype},
-     {"gettabwinvar",  3, 3, f_gettabwinvar},
-     {"getwinposx",    0, 0, f_getwinposx},
-     {"getwinposy",    0, 0, f_getwinposy},
-     {"getwinvar",     2, 2, f_getwinvar},
--    {"glob",          1, 1, f_glob},
--    {"globpath",      2, 2, f_globpath},
-+    {"glob",          1, 2, f_glob},
-+    {"globpath",      2, 3, f_globpath},
-     {"has",           1, 1, f_has},
-     {"has_key",               2, 2, f_has_key},
-     {"haslocaldir",   0, 0, f_haslocaldir},
-     {"hasmapto",      1, 3, f_hasmapto},
-     {"highlightID",   1, 1, f_hlID},          /* obsolete */
-@@ -7580,10 +7696,13 @@ static struct fst
-     {"min",           1, 1, f_min},
- #ifdef vim_mkdir
-     {"mkdir",         1, 3, f_mkdir},
+ /* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */
+-#if _MSC_VER >= 1400
++#if defined(_MSC_VER) && _MSC_VER >= 1400
+ # define _CRT_SECURE_NO_DEPRECATE
+ # define _CRT_NONSTDC_NO_DEPRECATE
  #endif
-     {"mode",          0, 1, f_mode},
-+#ifdef FEAT_MZSCHEME
-+    {"mzeval",                1, 1, f_mzeval},
-+#endif
-     {"nextnonblank",  1, 1, f_nextnonblank},
-     {"nr2char",               1, 1, f_nr2char},
-     {"pathshorten",   1, 1, f_pathshorten},
- #ifdef FEAT_FLOAT
-     {"pow",           2, 2, f_pow},
-@@ -7721,11 +7840,10 @@ get_function_name(xp, idx)
  
- /*
-  * Function given to ExpandGeneric() to obtain the list of internal or
-  * user defined variable or function names.
-  */
--/*ARGSUSED*/
-     char_u *
- get_expr_name(xp, idx)
-     expand_T  *xp;
-     int               idx;
- {
-@@ -7854,13 +7972,13 @@ get_func_tv(name, len, rettv, arg, first
-       ret = call_func(name, len, rettv, argcount, argvars,
-                         firstline, lastline, doesrange, evaluate, selfdict);
-     else if (!aborting())
-     {
-       if (argcount == MAX_FUNC_ARGS)
--          emsg_funcname("E740: Too many arguments for function %s", name);
-+          emsg_funcname(N_("E740: Too many arguments for function %s"), name);
-       else
--          emsg_funcname("E116: Invalid arguments for function %s", name);
-+          emsg_funcname(N_("E116: Invalid arguments for function %s"), name);
-     }
+ #include <windows.h>
+ #include <windowsx.h>
+ #include <shlobj.h>
  
-     while (--argcount >= 0)
-       clear_tv(&argvars[argcount]);
+ /* Accommodate old versions of VC that don't have a modern Platform SDK */
+-#if _MSC_VER < 1300
++#if defined(_MSC_VER) && _MSC_VER < 1300
+ # undef  UINT_PTR
+ # define UINT_PTR UINT
+ #endif
  
-@@ -7954,11 +8072,12 @@ call_func(name, len, rettv, argcount, ar
+ #define ResultFromShort(i)  ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(i)))
+--- vim72.orig/src/INSTALLpc.txt
++++ vim72/src/INSTALLpc.txt
+@@ -213,12 +213,13 @@ and you type:
+ After churning for a while, you will end up with 'gvim.exe' in the 'vim\src'
+ directory.
  
+ You should not need to do *any* editing of any files to get vim compiled this
+ way.  If, for some reason, you want the console-mode-only version of vim (this
+-is NOT recommended on Win32, especially on '95/'98!!!), you need only change
+-the 'gvim.exe' to 'vim.exe' in the 'make' commands given above.
++is NOT recommended on Win32, especially on '95/'98!!!), you can use:
++
++    make -f Make_ming.mak GUI=no vim.exe
  
-     /* execute the function if no errors detected and executing */
-     if (evaluate && error == ERROR_NONE)
-     {
--      rettv->v_type = VAR_NUMBER;     /* default is number rettv */
-+      rettv->v_type = VAR_NUMBER;     /* default rettv is number zero */
-+      rettv->vval.v_number = 0;
-       error = ERROR_UNKNOWN;
+ If you are dismayed by how big the EXE is, I strongly recommend you get 'UPX'
+ (also free!) and compress the file (typical compression is 50%). UPX can be
+ found at
+     http://www.upx.org/
+@@ -238,11 +239,11 @@ Use Make_cyg.mak with Cygwin's GCC. See
+     http://users.skynet.be/antoine.mechelynck/vim/compile.htm
  
-       if (!builtin_function(fname))
-       {
-           /*
-@@ -8089,10 +8208,11 @@ call_func(name, len, rettv, argcount, ar
-     return ret;
- }
+ The Cygnus one many not fully work yet.
+ With Cygnus gcc you can use the Unix Makefile instead (you need to get the
+ Unix archive then).  Then you get a Cygwin application (feels like Vim is
+-runnin on Unix), while with Make_cyg.mak you get a Windows application (like
++running on Unix), while with Make_cyg.mak you get a Windows application (like
+ with the other makefiles).
  
- /*
-  * Give an error message with a function name.  Handle <SNR> things.
-+ * "ermsg" is to be passed without translation, use N_() instead of _().
-  */
-     static void
- emsg_funcname(ermsg, name)
-     char      *ermsg;
-     char_u    *name;
-@@ -8203,11 +8323,10 @@ f_append(argvars, rettv)
-           l = argvars[1].vval.v_list;
-           if (l == NULL)
-               return;
-           li = l->lv_first;
-       }
--      rettv->vval.v_number = 0;       /* Default: Success */
-       for (;;)
-       {
-           if (l == NULL)
-               tv = &argvars[1];       /* append a string */
-           else if (li == NULL)
-@@ -8236,26 +8355,24 @@ f_append(argvars, rettv)
- }
  
- /*
-  * "argc()" function
-  */
--/* ARGSUSED */
-     static void
- f_argc(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->vval.v_number = ARGCOUNT;
- }
+ 4. Borland
+ ===========
+@@ -257,14 +258,17 @@ Use Make_bc5.mak with Borland C++ 5.x. S
+ [Update of 1) needs to be verified]
  
- /*
-  * "argidx()" function
-  */
--/* ARGSUSED */
-     static void
- f_argidx(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->vval.v_number = curwin->w_arg_idx;
- }
+ If you like, you can compile the 'mingw' Win32 version from the comfort of
+ your Linux (or other unix) box.  To do this, you need to follow a few steps:
+     1) Install the mingw32 cross-compiler. See
++      http://www.mingw.org/wiki/LinuxCrossMinGW
+       http://www.libsdl.org/extras/win32/cross/README.txt
+     2) Get and unpack both the Unix sources and the extra archive
+     3) in 'Make_ming.mak', set 'CROSS' to 'yes' instead of 'no'.
+        Make further changes to 'Make_ming.mak' as you wish.
++       If your cross-compiler prefix differs from the predefined value,
++       set 'CROSS_COMPILE' corresponding.
+     4) make -f Make_ming.mak gvim.exe
  
-@@ -8329,14 +8446,13 @@ f_atan(argvars, rettv)
- #endif
+ Now you have created the Windows binary from your Linux box!  Have fun...
  
- /*
-  * "browse(save, title, initdir, default)" function
-  */
--/* ARGSUSED */
-     static void
- f_browse(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_BROWSE
-     int               save;
-     char_u    *title;
-@@ -8364,14 +8480,13 @@ f_browse(argvars, rettv)
- }
  
- /*
-  * "browsedir(title, initdir)" function
-  */
--/* ARGSUSED */
-     static void
- f_browsedir(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_BROWSE
-     char_u    *title;
-     char_u    *initdir;
-@@ -8592,14 +8707,13 @@ f_bufwinnr(argvars, rettv)
- }
+--- vim72.orig/src/Make_cyg.mak
++++ vim72/src/Make_cyg.mak
+@@ -1,8 +1,8 @@
+ #
+ # Makefile for VIM on Win32, using Cygnus gcc
+-# Last updated by Dan Sharp.  Last Change: 2007 Sep 29
++# Last updated by Dan Sharp.  Last Change: 2010 Feb 24
+ #
+ # Also read INSTALLpc.txt!
+ #
+ # This compiles Vim as a Windows application.  If you want Vim to run as a
+ # Cygwin application use the Makefile (just like on Unix).
+@@ -30,13 +30,16 @@
+ # IME         no or yes: set to yes to include IME support (yes)
+ #   DYNAMIC_IME no or yes: set to yes to load imm32.dll dynamically (yes)
+ # OLE         no or yes: set to yes to make OLE gvim (no)
+ # DEBUG               no or yes: set to yes if you wish a DEBUGging build (no)
+ # CPUNR               No longer supported, use ARCH.
+-# ARCH                i386 through pentium4: select -march argument to compile with (i386)
++# ARCH                i386 through pentium4: select -march argument to compile with
++#               (i386)
+ # USEDLL      no or yes: set to yes to use the Runtime library DLL (no)
+ #             For USEDLL=yes the cygwin1.dll is required to run Vim.
++#             "no" does not work with latest version of Cygwin, use
++#             Make_ming.mak instead.  Or set CC to gcc-3.
+ # POSTSCRIPT  no or yes: set to yes for PostScript printing (no)
+ # FEATURES    TINY, SMALL, NORMAL, BIG or HUGE (BIG)
+ # WINVER      Lowest Win32 version to support.  (0x0400)
+ # CSCOPE      no or yes: to include cscope interface support (yes)
+ # OPTIMIZE    SPACE, SPEED, or MAXSPEED: set optimization level (MAXSPEED)
+@@ -97,10 +100,11 @@ endif
+ DEFINES = -DWIN32 -DHAVE_PATHDEF -DFEAT_$(FEATURES) \
+         -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER)
+ INCLUDES = -march=$(ARCH) -Iproto
  
- /*
-  * "byte2line(byte)" function
-  */
--/*ARGSUSED*/
-     static void
- f_byte2line(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifndef FEAT_BYTEOFF
-     rettv->vval.v_number = -1;
- #else
-@@ -8615,11 +8729,10 @@ f_byte2line(argvars, rettv)
- }
+ #>>>>> name of the compiler and linker, name of lib directory
++CROSS_COMPILE =
+ CC = gcc
+ RC = windres
  
- /*
-  * "byteidx()" function
-  */
--/*ARGSUSED*/
-     static void
- f_byteidx(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-@@ -8663,11 +8776,10 @@ f_call(argvars, rettv)
-     int               argc = 0;
-     listitem_T        *item;
-     int               dummy;
-     dict_T    *selfdict = NULL;
+ ##############################
+ # DYNAMIC_PERL=yes and no both work
+@@ -210,17 +214,38 @@ endif
  
--    rettv->vval.v_number = 0;
-     if (argvars[1].v_type != VAR_LIST)
-     {
-       EMSG(_(e_listreq));
-       return;
-     }
-@@ -8735,14 +8847,13 @@ f_ceil(argvars, rettv)
- #endif
+ ifndef MZSCHEME_VER
+ MZSCHEME_VER = 209_000
+ endif
  
- /*
-  * "changenr()" function
-  */
--/*ARGSUSED*/
-     static void
- f_changenr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->vval.v_number = curbuf->b_u_seq_cur;
- }
++ifndef MZSCHEME_PRECISE_GC
++MZSCHEME_PRECISE_GC=no
++endif
++
++# for version 4.x we need to generate byte-code for Scheme base
++ifndef MZSCHEME_GENERATE_BASE
++MZSCHEME_GENERATE_BASE=no
++endif
++
+ ifeq (yes, $(DYNAMIC_MZSCHEME))
+ DEFINES += -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
+ else
+ ifndef MZSCHEME_DLLS
+ MZSCHEME_DLLS = $(MZSCHEME)
+ endif
+-EXTRA_LIBS += -L$(MZSCHEME_DLLS) -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
++ifeq (yes,$(MZSCHEME_PRECISE_GC))
++MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
++else
++MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
++endif
++EXTRA_LIBS += -L$(MZSCHEME_DLLS) -L$(MZSCHEME_DLLS)/lib $(MZSCHEME_LIB)
++endif
++ifeq (yes,$(MZSCHEME_GENERATE_BASE))
++DEFINES += -DINCLUDE_MZSCHEME_BASE
++MZ_EXTRA_DEP += mzscheme_base.c
++endif
++ifeq (yes,$(MZSCHEME_PRECISE_GC))
++DEFINES += -DMZ_PRECISE_GC
+ endif
+ endif
  
-@@ -8788,15 +8899,14 @@ f_cindent(argvars, rettv)
- }
+ ##############################
+ # DYNAMIC_TCL=yes and no both work.
+@@ -444,14 +469,14 @@ all: $(EXE) xxd/xxd.exe vimrun.exe insta
+ # See /usr/doc/cygwin-doc-1.2/html/faq_toc.html#TOC93 for more information.
+ $(EXE): $(OUTDIR) $(OBJ)
+       $(CC) $(CFLAGS) -o $(EXE) $(OBJ) $(LIBS) -luuid -lole32 $(EXTRA_LIBS)
  
- /*
-  * "clearmatches()" function
-  */
--/*ARGSUSED*/
-     static void
- f_clearmatches(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
- #ifdef FEAT_SEARCH_EXTRA
-     clear_matches(curwin);
- #endif
- }
-@@ -8856,15 +8966,14 @@ f_col(argvars, rettv)
+ xxd/xxd.exe: xxd/xxd.c
+-      $(MAKE) -C xxd -f Make_cyg.mak USEDLL=$(USEDLL)
++      $(MAKE) -C xxd -f Make_cyg.mak CC=$(CC) USEDLL=$(USEDLL)
  
- #if defined(FEAT_INS_EXPAND)
- /*
-  * "complete()" function
-  */
--/*ARGSUSED*/
-     static void
- f_complete(argvars, rettv)
-     typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *rettv UNUSED;
- {
-     int           startcol;
+ GvimExt/gvimext.dll: GvimExt/gvimext.cpp GvimExt/gvimext.rc GvimExt/gvimext.h
+-      $(MAKE) -C GvimExt -f Make_ming.mak
++      $(MAKE) -C GvimExt -f Make_ming.mak CROSS_COMPILE=$(CROSS_COMPILE)
  
-     if ((State & INSERT) == 0)
-     {
-@@ -8891,11 +9000,10 @@ f_complete(argvars, rettv)
- }
+ vimrun.exe: vimrun.c
+       $(CC) $(CFLAGS) -o vimrun.exe vimrun.c  $(LIBS)
  
- /*
-  * "complete_add()" function
-  */
--/*ARGSUSED*/
-     static void
- f_complete_add(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-@@ -8903,14 +9011,13 @@ f_complete_add(argvars, rettv)
- }
+ install.exe: dosinst.c
+@@ -471,10 +496,13 @@ clean:
+       -rmdir $(OUTDIR)
+       -$(DEL) $(EXE) vimrun.exe install.exe uninstal.exe
+ ifdef PERL
+       -$(DEL) if_perl.c
+ endif
++ifdef MZSCHEME
++      -$(DEL) mzscheme_base.c
++endif
+       -$(DEL) pathdef.c
+       $(MAKE) -C xxd -f Make_cyg.mak clean
+       $(MAKE) -C GvimExt -f Make_ming.mak clean
  
- /*
-  * "complete_check()" function
-  */
--/*ARGSUSED*/
-     static void
- f_complete_check(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     int               saved = RedrawingDisabled;
+ distclean: clean
+@@ -521,13 +549,19 @@ ifeq (16, $(RUBY_VER))
+ endif
  
-     RedrawingDisabled = 0;
-@@ -8921,15 +9028,14 @@ f_complete_check(argvars, rettv)
- #endif
+ $(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_DEP)
+       $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o
  
- /*
-  * "confirm(message, buttons[, default [, type]])" function
-  */
--/*ARGSUSED*/
-     static void
- f_confirm(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
- #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
-     char_u    *message;
-     char_u    *buttons = NULL;
-     char_u    buf[NUMBUFLEN];
-@@ -8971,17 +9077,13 @@ f_confirm(argvars, rettv)
-     }
++$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP)
++      $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o
++
+ $(OUTDIR)/vimrc.o:    vim.rc version.h gui_w32_rc.h
+       $(RC) $(RCFLAGS) vim.rc -o $(OUTDIR)/vimrc.o
  
-     if (buttons == NULL || *buttons == NUL)
-       buttons = (char_u *)_("&Ok");
++mzscheme_base.c:
++      $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base
++
+ pathdef.c: $(INCL)
+ ifneq (sh.exe, $(SHELL))
+       @echo creating pathdef.c
+       @echo '/* pathdef.c */' > pathdef.c
+       @echo '#include "vim.h"' >> pathdef.c
+--- vim72.orig/src/Make_ming.mak
++++ vim72/src/Make_ming.mak
+@@ -113,18 +113,31 @@ endif
  
--    if (error)
--      rettv->vval.v_number = 0;
--    else
-+    if (!error)
-       rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
-                                                                  def, NULL);
--#else
--    rettv->vval.v_number = 0;
- #endif
- }
- /*
-  * "copy()" function
-@@ -9094,15 +9196,14 @@ f_count(argvars, rettv)
- /*
-  * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function
-  *
-  * Checks the existence of a cscope connection.
-  */
--/*ARGSUSED*/
-     static void
- f_cscope_connection(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
- #ifdef FEAT_CSCOPE
-     int               num = 0;
-     char_u    *dbpath = NULL;
-     char_u    *prepend = NULL;
-@@ -9116,31 +9217,30 @@ f_cscope_connection(argvars, rettv)
-       if (argvars[2].v_type != VAR_UNKNOWN)
-           prepend = get_tv_string_buf(&argvars[2], buf);
-     }
+ ifndef MZSCHEME_VER
+ MZSCHEME_VER=205_000
+ endif
  
-     rettv->vval.v_number = cs_connection(num, dbpath, prepend);
--#else
--    rettv->vval.v_number = 0;
- #endif
- }
++ifndef MZSCHEME_PRECISE_GC
++MZSCHEME_PRECISE_GC=no
++endif
++
++# for version 4.x we need to generate byte-code for Scheme base
++ifndef MZSCHEME_GENERATE_BASE
++MZSCHEME_GENERATE_BASE=no
++endif
++
+ ifeq (no,$(DYNAMIC_MZSCHEME))
++ifeq (yes,$(MZSCHEME_PRECISE_GC))
++MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
++else
+ MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
++endif
+ # the modern MinGW can dynamically link to dlls directly.
+ # point MZSCHEME_DLLS to where you put libmzschXXXXXXX.dll and libgcXXXXXXX.dll
+ ifndef MZSCHEME_DLLS
+ MZSCHEME_DLLS=$(MZSCHEME)
+ endif
+-MZSCHEME_LIBDIR=-L$(MZSCHEME_DLLS)
++MZSCHEME_LIBDIR=-L$(MZSCHEME_DLLS) -L$(MZSCHEME_DLLS)\lib
+ endif
  
- /*
-  * "cursor(lnum, col)" function
-  *
-- * Moves the cursor to the specified line and column
-+ * Moves the cursor to the specified line and column.
-+ * Returns 0 when the position could be set, -1 otherwise.
-  */
--/*ARGSUSED*/
-     static void
- f_cursor(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-     long      line, col;
- #ifdef FEAT_VIRTUALEDIT
-     long      coladd = 0;
- #endif
+ endif
  
-+    rettv->vval.v_number = -1;
-     if (argvars[1].v_type == VAR_UNKNOWN)
-     {
-       pos_T       pos;
+ # Python support -- works with the ActiveState python 2.0 release (and others
+@@ -197,27 +210,31 @@ RUBY_VER = 16
+ endif
+ ifndef RUBY_VER_LONG
+ RUBY_VER_LONG = 1.6
+ endif
  
-       if (list2fpos(argvars, &pos, NULL) == FAIL)
-@@ -9181,10 +9281,11 @@ f_cursor(argvars, rettv)
-     if (has_mbyte)
-       mb_adjust_cursor();
- #endif
+-ifeq ($(RUBY_VER), 16)
+ ifndef RUBY_PLATFORM
++ifeq ($(RUBY_VER), 16)
+ RUBY_PLATFORM = i586-mswin32
+-endif
+-ifndef RUBY_INSTALL_NAME
+-RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_VER)
+-endif
+ else
+-ifndef RUBY_PLATFORM
++ifneq ($(wildcard $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/i386-mingw32),)
++RUBY_PLATFORM = i386-mingw32
++else
+ RUBY_PLATFORM = i386-mswin32
+ endif
++endif
++endif
++
+ ifndef RUBY_INSTALL_NAME
++ifeq ($(RUBY_VER), 16)
++RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_VER)
++else
+ RUBY_INSTALL_NAME = msvcrt-ruby$(RUBY_VER)
+ endif
+ endif
  
-     curwin->w_set_curswant = TRUE;
-+    rettv->vval.v_number = 0;
- }
+-RUBYINC =-I $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/$(RUBY_PLATFORM)
++RUBYINC =-I $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/$(RUBY_PLATFORM) -I $(RUBY)/include/ruby-$(RUBY_VER_LONG) -I $(RUBY)/include/ruby-$(RUBY_VER_LONG)/$(RUBY_PLATFORM)
+ ifeq (no, $(DYNAMIC_RUBY))
+ RUBYLIB = -L$(RUBY)/lib -l$(RUBY_INSTALL_NAME)
+ endif
  
- /*
-  * "deepcopy()" function
-  */
-@@ -9198,11 +9299,14 @@ f_deepcopy(argvars, rettv)
-     if (argvars[1].v_type != VAR_UNKNOWN)
-       noref = get_tv_number_chk(&argvars[1], NULL);
-     if (noref < 0 || noref > 1)
-       EMSG(_(e_invarg));
-     else
--      item_copy(&argvars[0], rettv, TRUE, noref == 0 ? ++current_copyID : 0);
-+    {
-+      current_copyID += COPYID_INC;
-+      item_copy(&argvars[0], rettv, TRUE, noref == 0 ? current_copyID : 0);
-+    }
- }
+ endif # RUBY
+@@ -226,29 +243,30 @@ endif # RUBY
+ # Any other defines can be included here.
+ DEF_GUI=-DFEAT_GUI_W32 -DFEAT_CLIPBOARD
+ DEFINES=-DWIN32 -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) \
+       -DHAVE_PATHDEF -DFEAT_$(FEATURES)
+ ifeq ($(CROSS),yes)
+-# cross-compiler:
+-CC = i586-pc-mingw32msvc-gcc
++# cross-compiler prefix:
++CROSS_COMPILE = i586-pc-mingw32msvc-
+ DEL = rm
+ MKDIR = mkdir -p
+-WINDRES = i586-pc-mingw32msvc-windres
++DIRSLASH = /
+ else
+ # normal (Windows) compilation:
+-CC = gcc
++CROSS_COMPILE =
+ ifneq (sh.exe, $(SHELL))
+ DEL = rm
+ MKDIR = mkdir -p
+ DIRSLASH = /
+ else
+ DEL = del
+ MKDIR = mkdir
+ DIRSLASH = \\
+ endif
+-WINDRES = windres
+ endif
++CC := $(CROSS_COMPILE)gcc
++WINDRES := $(CROSS_COMPILE)windres
  
- /*
-  * "delete()" function
-  */
-@@ -9218,45 +9322,40 @@ f_delete(argvars, rettv)
- }
+ #>>>>> end of choices
+ ###########################################################################
  
- /*
-  * "did_filetype()" function
-  */
--/*ARGSUSED*/
-     static void
- f_did_filetype(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
- #ifdef FEAT_AUTOCMD
-     rettv->vval.v_number = did_filetype;
--#else
--    rettv->vval.v_number = 0;
- #endif
- }
+ CFLAGS = -Iproto $(DEFINES) -pipe -w -march=$(ARCH) -Wall
+@@ -408,10 +426,17 @@ ifdef PERL
+ OBJ += $(OUTDIR)/if_perl.o
+ endif
+ ifdef MZSCHEME
+ OBJ += $(OUTDIR)/if_mzsch.o
+ MZSCHEME_INCL = if_mzsch.h
++ifeq (yes,$(MZSCHEME_GENERATE_BASE))
++CFLAGS += -DINCLUDE_MZSCHEME_BASE
++MZ_EXTRA_DEP += mzscheme_base.c
++endif
++ifeq (yes,$(MZSCHEME_PRECISE_GC))
++CFLAGS += -DMZ_PRECISE_GC
++endif
+ endif
+ ifdef PYTHON
+ OBJ += $(OUTDIR)/if_python.o
+ endif
+ ifdef RUBY
+@@ -527,24 +552,27 @@ $(TARGET): $(OUTDIR) $(OBJ)
+ upx: exes
+       upx gvim.exe
+       upx vim.exe
  
- /*
-  * "diff_filler()" function
-  */
--/*ARGSUSED*/
-     static void
- f_diff_filler(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
- #ifdef FEAT_DIFF
-     rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
- #endif
- }
+ xxd/xxd.exe: xxd/xxd.c
+-      $(MAKE) -C xxd -f Make_cyg.mak
++      $(MAKE) -C xxd -f Make_cyg.mak CC=$(CC)
  
- /*
-  * "diff_hlID()" function
-  */
--/*ARGSUSED*/
-     static void
- f_diff_hlID(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
- #ifdef FEAT_DIFF
-     linenr_T          lnum = get_tv_lnum(argvars);
-     static linenr_T   prev_lnum = 0;
-     static int                changedtick = 0;
-@@ -9365,11 +9464,10 @@ f_escape(argvars, rettv)
- }
+ GvimExt/gvimext.dll: GvimExt/gvimext.cpp GvimExt/gvimext.rc GvimExt/gvimext.h
+-      $(MAKE) -C GvimExt -f Make_ming.mak
++      $(MAKE) -C GvimExt -f Make_ming.mak CROSS=$(CROSS) CROSS_COMPILE=$(CROSS_COMPILE)
  
- /*
-  * "eval()" function
-  */
--/*ARGSUSED*/
-     static void
- f_eval(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-@@ -9389,14 +9487,13 @@ f_eval(argvars, rettv)
- }
+ clean:
+       -$(DEL) $(OUTDIR)$(DIRSLASH)*.o
+       -$(DEL) $(OUTDIR)$(DIRSLASH)*.res
+       -rmdir $(OUTDIR)
+       -$(DEL) *.exe
+       -$(DEL) pathdef.c
+ ifdef PERL
+       -$(DEL) if_perl.c
+ endif
++ifdef MZSCHEME
++      -$(DEL) mzscheme_base.c
++endif
+       $(MAKE) -C GvimExt -f Make_ming.mak clean
+       $(MAKE) -C xxd -f Make_cyg.mak clean
  
- /*
-  * "eventhandler()" function
-  */
--/*ARGSUSED*/
-     static void
- f_eventhandler(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->vval.v_number = vgetc_busy;
- }
+ ###########################################################################
+ INCL = vim.h feature.h os_win32.h os_dos.h ascii.h keymap.h term.h macros.h \
+@@ -586,10 +614,16 @@ if_perl.c: if_perl.xs typemap
+            $(PERLLIB)/ExtUtils/typemap if_perl.xs > $@
  
-@@ -9516,11 +9613,11 @@ f_expand(argvars, rettv)
-       --emsg_off;
-     }
-     else
-     {
-       /* When the optional second argument is non-zero, don't remove matches
--       * for 'suffixes' and 'wildignore' */
-+       * for 'wildignore' and don't put matches for 'suffixes' at the end. */
-       if (argvars[1].v_type != VAR_UNKNOWN
-                                   && get_tv_number_chk(&argvars[1], &error))
-           flags |= WILD_KEEP_ALL;
-       if (!error)
-       {
-@@ -9540,11 +9637,10 @@ f_expand(argvars, rettv)
-     static void
- f_extend(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST)
-     {
-       list_T          *l1, *l2;
-       listitem_T      *item;
-       long            before;
-@@ -9650,15 +9746,14 @@ f_extend(argvars, rettv)
- }
+ $(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_INCL) $(NBDEBUG_SRC)
+       $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o
  
- /*
-  * "feedkeys()" function
-  */
--/*ARGSUSED*/
-     static void
- f_feedkeys(argvars, rettv)
-     typval_T    *argvars;
--    typval_T    *rettv;
-+    typval_T    *rettv UNUSED;
- {
-     int               remap = TRUE;
-     char_u    *keys, *flags;
-     char_u    nbuf[NUMBUFLEN];
-     int               typed = FALSE;
-@@ -9668,11 +9763,10 @@ f_feedkeys(argvars, rettv)
-      * executed in the sandbox it would be OK, but it probably happens later,
-      * when "sandbox" is no longer set. */
-     if (check_secure())
-       return;
++$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP)
++      $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o
++
++mzscheme_base.c:
++      $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base
++
+ pathdef.c: $(INCL)
+ ifneq (sh.exe, $(SHELL))
+       @echo creating pathdef.c
+       @echo '/* pathdef.c */' > pathdef.c
+       @echo '#include "vim.h"' >> pathdef.c
+--- vim72.orig/src/Make_mvc.mak
++++ vim72/src/Make_mvc.mak
+@@ -1,20 +1,20 @@
+ # Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me)
+ # and Win64, using the Microsoft Visual C++ compilers. Known to work with
+ # VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005),
+-# and VC9 (VS2008).
++# VC9 (VS2008), and VC10 (VS2010).
+ #
+ # To build using other Windows compilers, see INSTALLpc.txt
+ #
+ # This makefile can build the console, GUI, OLE-enable, Perl-enabled and
+-# Python-enabled versions of vim for Win32 platforms.
++# Python-enabled versions of Vim for Win32 platforms.
+ #
+-# The basic command line to build vim is:
++# The basic command line to build Vim is:
+ #
+ #     nmake -f Make_mvc.mak
+ #
+-# This will build the console version of vim with no additional interfaces.
++# This will build the console version of Vim with no additional interfaces.
+ # To add features, define any of the following:
+ #
+ #     !!!!  After changing features do "nmake clean" first  !!!!
+ #
+ #       Feature Set: FEATURES=[TINY, SMALL, NORMAL, BIG, HUGE] (default is BIG)
+@@ -32,10 +32,11 @@
+ #
+ #     MzScheme interface:
+ #       MZSCHEME=[Path to MzScheme directory]
+ #       DYNAMIC_MZSCHEME=yes (to load the MzScheme DLLs dynamically)
+ #       MZSCHEME_VER=[version, 205_000, ...]
++#       MZSCHEME_DEBUG=no
+ #
+ #     Perl interface:
+ #       PERL=[Path to Perl directory]
+ #       DYNAMIC_PERL=yes (to load the Perl DLL dynamically)
+ #       PERL_VER=[Perl version, in the form 55 (5.005), 56 (5.6.x), etc]
+@@ -352,10 +353,19 @@ MSVCVER = 8.0
+ MSVCVER = 9.0
+ !endif
+ !if "$(_NMAKE_VER)" == "9.00.21022.08"
+ MSVCVER = 9.0
+ !endif
++!if "$(_NMAKE_VER)" == "9.00.30729.01"
++MSVCVER = 9.0
++!endif
++!if "$(_NMAKE_VER)" == "10.00.20506.01"
++MSVCVER = 10.0
++!endif
++!if "$(_NMAKE_VER)" == "10.00.30128.01"
++MSVCVER = 10.0
++!endif
+ !endif
  
--    rettv->vval.v_number = 0;
-     keys = get_tv_string(&argvars[0]);
-     if (*keys != NUL)
-     {
-       if (argvars[1].v_type != VAR_UNKNOWN)
-       {
-@@ -9835,12 +9929,12 @@ filter_map(argvars, rettv, map)
-     typval_T  save_key;
-     int               rem;
-     int               todo;
-     char_u    *ermsg = map ? (char_u *)"map()" : (char_u *)"filter()";
-     int               save_did_emsg;
-+    int               index = 0;
+ # Abort bulding VIM if version of VC is unrecognised.
+ !ifndef MSVCVER
+ !message *** ERROR
+@@ -366,11 +376,11 @@ MSVCVER = 9.0
+ !message to handle the new value for _NMAKE_VER, "$(_NMAKE_VER)".
+ !error Make aborted.
+ !endif
  
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type == VAR_LIST)
-     {
-       if ((l = argvars[0].vval.v_list) == NULL
-               || (map && tv_check_lock(l->lv_lock, ermsg)))
-           return;
-@@ -9869,13 +9963,13 @@ filter_map(argvars, rettv, map)
-       /* We reset "did_emsg" to be able to detect whether an error
-        * occurred during evaluation of the expression. */
-       save_did_emsg = did_emsg;
-       did_emsg = FALSE;
+ # Convert processor ID to MVC-compatible number
+-!if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0")
++!if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0") && ("$(MSVCVER)" != "10.0")
+ !if "$(CPUNR)" == "i386"
+ CPUARG = /G3
+ !elseif "$(CPUNR)" == "i486"
+ CPUARG = /G4
+ !elseif "$(CPUNR)" == "i586"
+@@ -399,11 +409,11 @@ OPTFLAG = /O1
+ !elseif "$(OPTIMIZE)" == "SPEED"
+ OPTFLAG = /O2
+ !else # MAXSPEED
+ OPTFLAG = /Ox
+ !endif
+-!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0")
++!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") || ("$(MSVCVER)" == "10.0")
+ # Use link time code generation if not worried about size
+ !if "$(OPTIMIZE)" != "SPACE"
+ OPTFLAG = $(OPTFLAG) /GL
+ !endif
+ !endif
+@@ -616,19 +626,41 @@ PYTHON_LIB = $(PYTHON)\libs\python$(PYTH
+ !message MzScheme requested - root dir is "$(MZSCHEME)"
+ !ifndef MZSCHEME_VER
+ MZSCHEME_VER = 205_000
+ !endif
+ CFLAGS = $(CFLAGS) -DFEAT_MZSCHEME -I $(MZSCHEME)\include
++!if EXIST("$(MZSCHEME)\collects\scheme\base.ss")
++# for MzScheme 4.x we need to include byte code for basic Scheme stuff
++MZSCHEME_EXTRA_DEP = mzscheme_base.c
++CFLAGS = $(CFLAGS) -DINCLUDE_MZSCHEME_BASE
++!endif
++!if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib") \
++      && !EXIST("$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib")
++!message Building with Precise GC
++MZSCHEME_PRECISE_GC = yes
++CFLAGS = $(CFLAGS) -DMZ_PRECISE_GC
++!endif
+ !if "$(DYNAMIC_MZSCHEME)" == "yes"
++!if "$(MZSCHEME_PRECISE_GC)" == "yes"
++!error MzScheme with Precise GC cannot be loaded dynamically
++!endif
+ !message MzScheme DLLs will be loaded dynamically
+ CFLAGS = $(CFLAGS) -DDYNAMIC_MZSCHEME \
+               -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" \
+               -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
+ !else
++!if "$(MZSCHEME_DEBUG)" == "yes"
++CFLAGS = $(CFLAGS) -DMZSCHEME_FORCE_GC
++!endif
++!if "$(MZSCHEME_PRECISE_GC)" == "yes"
++# Precise GC does not use separate dll
++MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
++!else
+ MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib \
+               $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
+ !endif
++!endif
+ MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj
+ !endif
  
-+      prepare_vimvar(VV_KEY, &save_key);
-       if (argvars[0].v_type == VAR_DICT)
-       {
--          prepare_vimvar(VV_KEY, &save_key);
-           vimvars[VV_KEY].vv_type = VAR_STRING;
+ # Perl interface
+ !ifdef PERL
+@@ -765,11 +797,11 @@ LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(LIBC
+               $(MZSCHEME_LIB) $(PERL_LIB) $(PYTHON_LIB) $(RUBY_LIB) \
+               $(TCL_LIB) $(NETBEANS_LIB) $(XPM_LIB) $(LINK_PDB)
  
-           ht = &d->dv_hashtab;
-           hash_lock(ht);
-           todo = (int)ht->ht_used;
-@@ -9895,28 +9989,31 @@ filter_map(argvars, rettv, map)
-                       dictitem_remove(d, di);
-                   clear_tv(&vimvars[VV_KEY].vv_tv);
-               }
-           }
-           hash_unlock(ht);
--
--          restore_vimvar(VV_KEY, &save_key);
-       }
-       else
-       {
-+          vimvars[VV_KEY].vv_type = VAR_NUMBER;
+ # Report link time code generation progress if used. 
+ !ifdef NODEBUG
+-!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0")
++!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") || ("$(MSVCVER)" == "10.0")
+ !if "$(OPTIMIZE)" != "SPACE"
+ LINKARGS1 = $(LINKARGS1) /LTCG:STATUS
+ !endif
+ !endif
+ !endif
+@@ -834,10 +866,11 @@ clean:
+       - if exist if_perl.c del if_perl.c
+       - if exist dimm.h del dimm.h
+       - if exist dimm_i.c del dimm_i.c
+       - if exist dimm.tlb del dimm.tlb
+       - if exist dosinst.exe del dosinst.exe
++      - if exist mzscheme_base.c del mzscheme_base.c
+       cd xxd
+       $(MAKE) /NOLOGO -f Make_mvc.mak clean
+       cd ..
+       cd GvimExt
+       $(MAKE) /NOLOGO -f Makefile clean
+@@ -925,13 +958,15 @@ $(OUTDIR)/if_perl.obj: $(OUTDIR) if_perl
+       $(CC) $(CFLAGS) $(PERL_INC) if_perl.c
+ $(OUTDIR)/if_perlsfio.obj: $(OUTDIR) if_perlsfio.c  $(INCL)
+       $(CC) $(CFLAGS) $(PERL_INC) if_perlsfio.c
+-$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c  $(INCL)
++$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c  $(INCL) $(MZSCHEME_EXTRA_DEP)
+       $(CC) $(CFLAGS) if_mzsch.c \
+               -DMZSCHEME_COLLECTS=\"$(MZSCHEME:\=\\)\\collects\"
++mzscheme_base.c:
++      $(MZSCHEME)\mzc --c-mods mzscheme_base.c ++lib scheme/base
+ $(OUTDIR)/if_python.obj: $(OUTDIR) if_python.c  $(INCL)
+       $(CC) $(CFLAGS) $(PYTHON_INC) if_python.c
+ $(OUTDIR)/if_ole.obj: $(OUTDIR) if_ole.cpp  $(INCL) if_ole.h
+@@ -1007,11 +1042,11 @@ $(OUTDIR)/undo.obj:    $(OUTDIR) undo.c  $(
+ $(OUTDIR)/window.obj: $(OUTDIR) window.c  $(INCL)
+ $(OUTDIR)/xpm_w32.obj: $(OUTDIR) xpm_w32.c
+       $(CC) $(CFLAGS) $(XPM_INC) xpm_w32.c
+-$(OUTDIR)/vim.res:    $(OUTDIR) vim.rc version.h tools.bmp tearoff.bmp \
++$(OUTDIR)/vim.res:    $(OUTDIR) vim.rc gvim.exe.mnf version.h tools.bmp tearoff.bmp \
+               vim.ico vim_error.ico vim_alert.ico vim_info.ico vim_quest.ico
+       $(RC) /l 0x409 /Fo$(OUTDIR)/vim.res $(RCFLAGS) vim.rc
+ iid_ole.c if_ole.h vim.tlb: if_ole.idl
+       midl /nologo /error none /proxy nul /iid iid_ole.c /tlb vim.tlb \
+--- vim72.orig/src/Make_vms.mms
++++ vim72/src/Make_vms.mms
+@@ -1,10 +1,10 @@
+ #
+ # Makefile for Vim on OpenVMS
+ #
+ # Maintainer:   Zoltan Arpadffy <arpadffy@polarhome.com>
+-# Last change:  2007 Oct 22
++# Last change:  2008 Aug 16
+ #
+ # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64
+ # with MMS and MMK
+ #
+ # The following could be built:
+@@ -34,11 +34,11 @@ DECC = YES
+ # SMALL  - Few features enabled, as basic as possible
+ # NORMAL - A default selection of features enabled
+ # BIG    - Many features enabled, as rich as possible. (default)
+ # HUGE   - All possible featues enabled.
+ # Please select one of these alternatives above.
+-MODEL = BIG
++MODEL = HUGE
+ # GUI or terminal mode executable.
+ # Comment out if you want just the character terminal mode only.
+ # GUI with Motif
+ GUI = YES
+--- vim72.orig/src/Makefile
++++ vim72/src/Makefile
+@@ -103,12 +103,12 @@
+ #       solution for a non-standard system.
+ #
+ # 4. "make test"  {{{1
+ #     This is optional.  This will run Vim scripts on a number of test
+ #     files, and compare the produced output with the expected output.
+-#     If all is well, you will get the "ALL DONE" message in the end.  See
+-#     below (search for "/^test").
++#     If all is well, you will get the "ALL DONE" message in the end.  If a
++#     test fails you get "TEST FAILURE".  See below (search for "/^test").
+ #
+ # 5. "make install"  {{{1
+ #     If the new Vim seems to be working OK you can install it and the
+ #     documentation in the appropriate location. The default is
+ #     "/usr/local".  Change "prefix" below to change the location.
+@@ -393,11 +393,13 @@ CClink = $(CC)
+ #CONF_OPT_TCL = --enable-tclinterp
+ #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4
+ # RUBY
+ # Uncomment this when you want to include the Ruby interface.
+-#CONF_OPT_RUBY = --enable-rubyinterp
++# Note: you need the development package (e.g., ruby1.9.1-dev on Ubuntu).
++# CONF_OPT_RUBY = --enable-rubyinterp
++# CONF_OPT_RUBY = --enable-rubyinterp --with-ruby-command=ruby1.9.1
+ # MZSCHEME
+ # Uncomment this when you want to include the MzScheme interface.
+ #CONF_OPT_MZSCHEME = --enable-mzschemeinterp
+ # PLT/mrscheme/drscheme Home dir; the PLTHOME environment variable also works
+@@ -531,10 +533,15 @@ CClink = $(CC)
+ #CFLAGS = -g -Wall -Wmissing-prototypes
+ #CFLAGS = -O6 -fno-strength-reduce -Wall -Wshadow -Wmissing-prototypes
+ #CFLAGS = -g -DDEBUG -Wall -Wshadow -Wmissing-prototypes
+ #CFLAGS = -g -O2 '-DSTARTUPTIME="vimstartup"' -fno-strength-reduce -Wall -Wmissing-prototypes
++# Use this with GCC to check for mistakes, unused arguments, etc.
++#CFLAGS = -g -Wall -Wextra -Wmissing-prototypes -Wunreachable-code
++#PYTHON_CFLAGS_EXTRA = -Wno-missing-field-initializers
++#MZSCHEME_CFLAGS_EXTRA = -Wno-unreachable-code -Wno-unused-parameter
 +
-           for (li = l->lv_first; li != NULL; li = nli)
-           {
-               if (tv_check_lock(li->li_tv.v_lock, ermsg))
-                   break;
-               nli = li->li_next;
-+              vimvars[VV_KEY].vv_nr = index;
-               if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL
-                                                                 || did_emsg)
-                   break;
-               if (!map && rem)
-                   listitem_remove(l, li);
-+              ++index;
-           }
-       }
+ # EFENCE - Electric-Fence malloc debugging: catches memory accesses beyond
+ # allocated memory (and makes every malloc()/free() very slow).
+ # Electric Fence is free (search ftp sites).
+ # You may want to set the EF_PROTECT_BELOW environment variable to check the
+ # other side of allocated memory.
+@@ -549,11 +556,17 @@ CClink = $(CC)
+ #EXTRA_DEFS = -DNBDEBUG
  
-+      restore_vimvar(VV_KEY, &save_key);
-       restore_vimvar(VV_VAL, &save_val);
+ # }}}
  
-       did_emsg |= save_did_emsg;
-     }
+ # LINT - for running lint
++#  For standard Unix lint
++LINT = lint
+ LINT_OPTIONS = -beprxzF
++#  For splint
++#  It doesn't work well, crashes on include files and non-ascii characters.
++#LINT = splint
++#LINT_OPTIONS = +unixlib -weak -macrovarprefixexclude -showfunc -linelen 9999
  
-@@ -10019,12 +10116,10 @@ f_float2nr(argvars, rettv)
-       else if (f > 0x7fffffff)
-           rettv->vval.v_number = 0x7fffffff;
-       else
-           rettv->vval.v_number = (varnumber_T)f;
-     }
--    else
--      rettv->vval.v_number = 0;
- }
+ # PROFILING - Uncomment the next two lines to do profiling with gcc and gprof.
+ # Might not work with GUI or Perl.
+ # For unknown reasons adding "-lc" fixes a linking problem with GCC.  That's
+ # probably a bug in the "-pg" implementation.
+@@ -1257,20 +1270,20 @@ CPP_DEPEND = $(CC) -I$(srcdir) -M$(CPP_M
  
- /*
-  * "floor({float})" function
-  */
-@@ -10154,22 +10249,19 @@ f_foldlevel(argvars, rettv)
-     linenr_T  lnum;
+ # flags for cproto
+ #     This is for cproto 3 patchlevel 8 or below
+ #     __inline, __attribute__ and __extension__ are not recognized by cproto
+ #     G_IMPLEMENT_INLINES is to avoid functions defined in glib/gutils.h.
+-NO_ATTR = -D__inline= -D__inline__= -DG_IMPLEMENT_INLINES \
+-        -D"__attribute__\\(x\\)=" -D"__asm__\\(x\\)=" \
+-        -D__extension__= -D__restrict="" \
+-        -D__gnuc_va_list=char -D__builtin_va_list=char
++#NO_ATTR = -D__inline= -D__inline__= -DG_IMPLEMENT_INLINES \
++#       -D"__attribute__\\(x\\)=" -D"__asm__\\(x\\)=" \
++#       -D__extension__= -D__restrict="" \
++#       -D__gnuc_va_list=char -D__builtin_va_list=char
  
-     lnum = get_tv_lnum(argvars);
-     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
-       rettv->vval.v_number = foldLevel(lnum);
--    else
- #endif
--      rettv->vval.v_number = 0;
- }
+ #
+-#     This is for cproto 3 patchlevel 9 or above (currently 4.6)
++#     This is for cproto 3 patchlevel 9 or above (currently 4.6, 4.7g)
+ #     __inline and __attribute__ are now recognized by cproto
+ #     -D"foo()=" is not supported by all compilers so do not use it
+-# NO_ATTR=
++NO_ATTR=
+ #
+ #     maybe the "/usr/bin/cc -E" has to be adjusted for some systems
+ # This is for cproto 3.5 patchlevel 3:
+ # PROTO_FLAGS = -f4 -m__ARGS -d -E"$(CPP)" $(NO_ATTR)
+ #
+@@ -1430,10 +1443,11 @@ ALL_SRC = $(BASIC_SRC) $(ALL_GUI_SRC) $(
+ # The perl sources also don't work well with lint.
+ LINT_SRC = $(BASIC_SRC) $(GUI_SRC) $(HANGULIN_SRC) $(PYTHON_SRC) $(TCL_SRC) \
+       $(SNIFF_SRC) $(WORKSHOP_SRC) $(WSDEBUG_SRC) $(NETBEANS_SRC)
+ #LINT_SRC = $(SRC)
+ #LINT_SRC = $(ALL_SRC)
++#LINT_SRC = $(BASIC_SRC)
  
- /*
-  * "foldtext()" function
-  */
--/*ARGSUSED*/
-     static void
- f_foldtext(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_FOLDING
-     linenr_T  lnum;
-     char_u    *s;
-@@ -10230,14 +10322,13 @@ f_foldtext(argvars, rettv)
- }
+ OBJ = \
+       objects/buffer.o \
+       objects/charset.o \
+       objects/diff.o \
+@@ -1735,11 +1749,12 @@ types.vim: $(TAGS_SRC) $(TAGS_INCL)
+ #
+ # This will produce a lot of garbage on your screen, including a few error
+ # messages.  Don't worry about that.
+ # If there is a real error, there will be a difference between "test.out" and
+ # a "test99.ok" file.
+-# If everything is alright, the final message will be "ALL DONE".
++# If everything is alright, the final message will be "ALL DONE".  If not you
++# get "TEST FAILURE".
+ #
+ test check:
+       $(MAKE) -f Makefile $(VIMTARGET)
+       -if test -n "$(MAKEMO)" -a -f $(PODIR)/Makefile; then \
+               cd $(PODIR); $(MAKE) -f Makefile check VIM=../$(VIMTARGET); \
+@@ -2185,10 +2200,11 @@ uninstall_runtime:
+ clean celan: testclean
+       -rm -f *.o objects/* core $(VIMTARGET).core $(VIMTARGET) vim xxd/*.o
+       -rm -f $(TOOLS) auto/osdef.h auto/pathdef.c auto/if_perl.c
+       -rm -f conftest* *~ auto/link.sed
+       -rm -rf $(APPDIR)
++      -rm -rf mzscheme_base.c
+       if test -d $(PODIR); then \
+               cd $(PODIR); $(MAKE) prefix=$(DESTDIR)$(prefix) clean; \
+       fi
  
- /*
-  * "foldtextresult(lnum)" function
-  */
--/*ARGSUSED*/
-     static void
- f_foldtextresult(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_FOLDING
-     linenr_T  lnum;
-     char_u    *text;
-@@ -10266,17 +10357,15 @@ f_foldtextresult(argvars, rettv)
- }
+ # Make a shadow directory for compilation on another system or with different
+@@ -2270,16 +2286,16 @@ depend:
+               sed -e 's+^\([^ ]*\.o\)+objects/\1+' >> tmp_make; done
+       mv tmp_make Makefile
  
- /*
-  * "foreground()" function
-  */
--/*ARGSUSED*/
-     static void
- f_foreground(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
--    rettv->vval.v_number = 0;
- #ifdef FEAT_GUI
-     if (gui.in_use)
-       gui_mch_set_foreground();
- #else
- # ifdef WIN32
-@@ -10286,23 +10375,22 @@ f_foreground(argvars, rettv)
- }
+ # Run lint.  Clean up the *.ln files that are sometimes left behind.
+ lint:
+-      lint $(LINT_OPTIONS) $(LINT_CFLAGS) $(LINT_EXTRA) $(LINT_SRC)
++      $(LINT) $(LINT_OPTIONS) $(LINT_CFLAGS) $(LINT_EXTRA) $(LINT_SRC)
+       -rm -f *.ln
  
- /*
-  * "function()" function
-  */
--/*ARGSUSED*/
-     static void
- f_function(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-     char_u    *s;
+ # Check dosinst.c with lint.
+ lintinstall:
+-      lint $(LINT_OPTIONS) -DWIN32 -DUNIX_LINT dosinst.c
++      $(LINT) $(LINT_OPTIONS) -DWIN32 -DUNIX_LINT dosinst.c
+       -rm -f dosinst.ln
  
--    rettv->vval.v_number = 0;
-     s = get_tv_string(&argvars[0]);
-     if (s == NULL || *s == NUL || VIM_ISDIGIT(*s))
-       EMSG2(_(e_invarg2), s);
--    else if (!function_exists(s))
-+    /* Don't check an autoload name for existence here. */
-+    else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s))
-       EMSG2(_("E700: Unknown function: %s"), s);
-     else
-     {
-       rettv->vval.v_string = vim_strsave(s);
-       rettv->v_type = VAR_FUNC;
-@@ -10310,15 +10398,14 @@ f_function(argvars, rettv)
- }
+ ###########################################################################
  
- /*
-  * "garbagecollect()" function
-  */
--/*ARGSUSED*/
-     static void
- f_garbagecollect(argvars, rettv)
-     typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *rettv UNUSED;
- {
-     /* This is postponed until we are back at the toplevel, because we may be
-      * using Lists and Dicts internally.  E.g.: ":echo [garbagecollect()]". */
-     want_garbage_collect = TRUE;
+ .c.o:
+@@ -2418,21 +2434,24 @@ objects/if_cscope.o: if_cscope.c
+       $(CCC) -o $@ if_cscope.c
  
-@@ -10363,13 +10450,11 @@ f_get(argvars, rettv)
-     else
-       EMSG2(_(e_listdictarg), "get()");
+ objects/if_xcmdsrv.o: if_xcmdsrv.c
+       $(CCC) -o $@ if_xcmdsrv.c
  
-     if (tv == NULL)
-     {
--      if (argvars[2].v_type == VAR_UNKNOWN)
--          rettv->vval.v_number = 0;
--      else
-+      if (argvars[2].v_type != VAR_UNKNOWN)
-           copy_tv(&argvars[2], rettv);
-     }
-     else
-       copy_tv(tv, rettv);
- }
-@@ -10390,17 +10475,12 @@ get_buffer_lines(buf, start, end, retlis
-     int               retlist;
-     typval_T  *rettv;
- {
-     char_u    *p;
+-objects/if_mzsch.o: if_mzsch.c
+-      $(CCC) -o $@ if_mzsch.c
++objects/if_mzsch.o: if_mzsch.c $(MZSCHEME_EXTRA)
++      $(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c
++
++mzscheme_base.c:
++      $(MZSCHEME_MZC) --c-mods mzscheme_base.c ++lib scheme/base
  
--    if (retlist)
--    {
--      if (rettv_list_alloc(rettv) == FAIL)
--          return;
--    }
--    else
--      rettv->vval.v_number = 0;
-+    if (retlist && rettv_list_alloc(rettv) == FAIL)
-+      return;
+ objects/if_perl.o: auto/if_perl.c
+       $(CCC) -o $@ auto/if_perl.c
  
-     if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0)
-       return;
+ objects/if_perlsfio.o: if_perlsfio.c
+       $(CCC) -o $@ if_perlsfio.c
  
-     if (!retlist)
-@@ -10600,23 +10680,23 @@ f_getchar(argvars, rettv)
-           win_T       *win;
-           linenr_T    lnum;
- # ifdef FEAT_WINDOWS
-           win_T       *wp;
- # endif
--          int         n = 1;
-+          int         winnr = 1;
+ objects/if_python.o: if_python.c
+-      $(CCC) -o $@ if_python.c
++      $(CCC) -o $@ $(PYTHON_CFLAGS_EXTRA) if_python.c
  
-           if (row >= 0 && col >= 0)
-           {
-               /* Find the window at the mouse coordinates and compute the
-                * text position. */
-               win = mouse_find_win(&row, &col);
-               (void)mouse_comp_pos(win, &row, &col, &lnum);
- # ifdef FEAT_WINDOWS
-               for (wp = firstwin; wp != win; wp = wp->w_next)
--                  ++n;
-+                  ++winnr;
- # endif
--              vimvars[VV_MOUSE_WIN].vv_nr = n;
-+              vimvars[VV_MOUSE_WIN].vv_nr = winnr;
-               vimvars[VV_MOUSE_LNUM].vv_nr = lnum;
-               vimvars[VV_MOUSE_COL].vv_nr = col + 1;
-           }
-       }
- #endif
-@@ -10624,51 +10704,47 @@ f_getchar(argvars, rettv)
- }
+ objects/if_ruby.o: if_ruby.c
+       $(CCC) -o $@ if_ruby.c
  
- /*
-  * "getcharmod()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getcharmod(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->vval.v_number = mod_mask;
- }
+ objects/if_sniff.o: if_sniff.c
+--- vim72.orig/src/VisVim/Commands.cpp
++++ vim72/src/VisVim/Commands.cpp
+@@ -18,100 +18,103 @@ static char THIS_FILE[] = __FILE__;
+ #define CD_NONE                       2       // No cd
  
- /*
-  * "getcmdline()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getcmdline(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+ static BOOL g_bEnableVim = TRUE;      // Vim enabled
+ static BOOL g_bDevStudioEditor = FALSE;       // Open file in Dev Studio editor simultaneously
++static BOOL g_bNewTabs = FALSE;
+ static int g_ChangeDir = CD_NONE;     // CD after file open?
+-static void VimSetEnableState (BOOL bEnableState);
+-static BOOL VimOpenFile (BSTR& FileName, long LineNr);
+-static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method);
+-static void VimErrDiag (COleAutomationControl& VimOle);
+-static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName);
+-static void DebugMsg (char* Msg, char* Arg = NULL);
++static void VimSetEnableState(BOOL bEnableState);
++static BOOL VimOpenFile(BSTR& FileName, long LineNr);
++static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method);
++static void VimErrDiag(COleAutomationControl& VimOle);
++static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName);
++static void DebugMsg(char* Msg, char* Arg = NULL);
+ /////////////////////////////////////////////////////////////////////////////
+ // CCommands
+-CCommands::CCommands ()
++CCommands::CCommands()
  {
-     rettv->v_type = VAR_STRING;
-     rettv->vval.v_string = get_cmdline_str();
+       // m_pApplication == NULL; M$ Code generation bug!!!
+       m_pApplication = NULL;
+       m_pApplicationEventsObj = NULL;
+       m_pDebuggerEventsObj = NULL;
  }
  
- /*
-  * "getcmdpos()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getcmdpos(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-CCommands::~CCommands ()
++CCommands::~CCommands()
  {
-     rettv->vval.v_number = get_cmdline_pos() + 1;
+-      ASSERT (m_pApplication != NULL);
++      ASSERT(m_pApplication != NULL);
+       if (m_pApplication)
+       {
+-              m_pApplication->Release ();
++              m_pApplication->Release();
+               m_pApplication = NULL;
+       }
  }
  
- /*
-  * "getcmdtype()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getcmdtype(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-void CCommands::SetApplicationObject (IApplication * pApplication)
++void CCommands::SetApplicationObject(IApplication * pApplication)
  {
-     rettv->v_type = VAR_STRING;
-     rettv->vval.v_string = alloc(2);
-     if (rettv->vval.v_string != NULL)
-@@ -10679,14 +10755,13 @@ f_getcmdtype(argvars, rettv)
+       // This function assumes pApplication has already been AddRef'd
+       // for us, which CDSAddIn did in it's QueryInterface call
+       // just before it called us.
+       m_pApplication = pApplication;
+       if (! m_pApplication)
+               return;
+       // Create Application event handlers
+-      XApplicationEventsObj::CreateInstance (&m_pApplicationEventsObj);
++      XApplicationEventsObj::CreateInstance(&m_pApplicationEventsObj);
+       if (! m_pApplicationEventsObj)
+       {
+-              ReportInternalError ("XApplicationEventsObj::CreateInstance");
++              ReportInternalError("XApplicationEventsObj::CreateInstance");
+               return;
+       }
+-      m_pApplicationEventsObj->AddRef ();
+-      m_pApplicationEventsObj->Connect (m_pApplication);
++      m_pApplicationEventsObj->AddRef();
++      m_pApplicationEventsObj->Connect(m_pApplication);
+       m_pApplicationEventsObj->m_pCommands = this;
+ #ifdef NEVER
+       // Create Debugger event handler
+       CComPtr < IDispatch > pDebugger;
+-      if (SUCCEEDED (m_pApplication->get_Debugger (&pDebugger))
++      if (SUCCEEDED(m_pApplication->get_Debugger(&pDebugger))
+           && pDebugger != NULL)
+       {
+-              XDebuggerEventsObj::CreateInstance (&m_pDebuggerEventsObj);
+-              m_pDebuggerEventsObj->AddRef ();
+-              m_pDebuggerEventsObj->Connect (pDebugger);
++              XDebuggerEventsObj::CreateInstance(&m_pDebuggerEventsObj);
++              m_pDebuggerEventsObj->AddRef();
++              m_pDebuggerEventsObj->Connect(pDebugger);
+               m_pDebuggerEventsObj->m_pCommands = this;
+       }
+ #endif
+       // Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim
+-      HKEY hAppKey = GetAppKey ("Vim");
++      HKEY hAppKey = GetAppKey("Vim");
+       if (hAppKey)
+       {
+-              HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
++              HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
+               if (hSectionKey)
+               {
+-                      g_bEnableVim = GetRegistryInt (hSectionKey, "EnableVim",
++                      g_bEnableVim = GetRegistryInt(hSectionKey, "EnableVim",
+                                                      g_bEnableVim);
+-                      g_bDevStudioEditor = GetRegistryInt(hSectionKey,"DevStudioEditor",
+-                                                          g_bDevStudioEditor);
+-                      g_ChangeDir = GetRegistryInt (hSectionKey, "ChangeDir",
++                      g_bDevStudioEditor = GetRegistryInt(hSectionKey,
++                                      "DevStudioEditor", g_bDevStudioEditor);
++                      g_bNewTabs = GetRegistryInt(hSectionKey, "NewTabs",
++                                                  g_bNewTabs);
++                      g_ChangeDir = GetRegistryInt(hSectionKey, "ChangeDir",
+                                                     g_ChangeDir);
+-                      RegCloseKey (hSectionKey);
++                      RegCloseKey(hSectionKey);
+               }
+-              RegCloseKey (hAppKey);
++              RegCloseKey(hAppKey);
+       }
  }
  
- /*
-  * "getcwd()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getcwd(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-void CCommands::UnadviseFromEvents ()
++void CCommands::UnadviseFromEvents()
  {
-     char_u    cwd[MAXPATHL];
+-      ASSERT (m_pApplicationEventsObj != NULL);
++      ASSERT(m_pApplicationEventsObj != NULL);
+       if (m_pApplicationEventsObj)
+       {
+-              m_pApplicationEventsObj->Disconnect (m_pApplication);
+-              m_pApplicationEventsObj->Release ();
++              m_pApplicationEventsObj->Disconnect(m_pApplication);
++              m_pApplicationEventsObj->Release();
+               m_pApplicationEventsObj = NULL;
+       }
  
-     rettv->v_type = VAR_STRING;
-@@ -10703,14 +10778,13 @@ f_getcwd(argvars, rettv)
+ #ifdef NEVER
+       if (m_pDebuggerEventsObj)
+@@ -119,14 +122,14 @@ void CCommands::UnadviseFromEvents ()
+               // Since we were able to connect to the Debugger events, we
+               // should be able to access the Debugger object again to
+               // unadvise from its events (thus the VERIFY_OK below--see
+               // stdafx.h).
+               CComPtr < IDispatch > pDebugger;
+-              VERIFY_OK (m_pApplication->get_Debugger (&pDebugger));
+-              ASSERT (pDebugger != NULL);
+-              m_pDebuggerEventsObj->Disconnect (pDebugger);
+-              m_pDebuggerEventsObj->Release ();
++              VERIFY_OK(m_pApplication->get_Debugger(&pDebugger));
++              ASSERT(pDebugger != NULL);
++              m_pDebuggerEventsObj->Disconnect(pDebugger);
++              m_pDebuggerEventsObj->Release();
+               m_pDebuggerEventsObj = NULL;
+       }
+ #endif
  }
  
- /*
-  * "getfontname()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getfontname(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+@@ -134,365 +137,372 @@ void CCommands::UnadviseFromEvents ()
+ /////////////////////////////////////////////////////////////////////////////
+ // Event handlers
+ // Application events
+-HRESULT CCommands::XApplicationEvents::BeforeBuildStart ()
++HRESULT CCommands::XApplicationEvents::BeforeBuildStart()
  {
-     rettv->v_type = VAR_STRING;
-     rettv->vval.v_string = NULL;
- #ifdef FEAT_GUI
-@@ -10933,22 +11007,19 @@ f_getline(argvars, rettv)
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
- /*
-  * "getmatches()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getmatches(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-HRESULT CCommands::XApplicationEvents::BuildFinish (long nNumErrors, long nNumWarnings)
++HRESULT CCommands::XApplicationEvents::BuildFinish(long nNumErrors, long nNumWarnings)
  {
- #ifdef FEAT_SEARCH_EXTRA
-     dict_T    *dict;
-     matchitem_T       *cur = curwin->w_match_head;
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
+ }
  
--    rettv->vval.v_number = 0;
--
-     if (rettv_list_alloc(rettv) == OK)
-     {
-       while (cur != NULL)
+-HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown ()
++HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown()
+ {
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
+ }
+ // The open document event handle is the place where the real interface work
+ // is done.
+ // Vim gets called from here.
+ //
+-HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument)
++HRESULT CCommands::XApplicationEvents::DocumentOpen(IDispatch * theDocument)
+ {
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       if (! g_bEnableVim)
+               // Vim not enabled or empty command line entered
+               return S_OK;
+       // First get the current file name and line number
+       // Get the document object
+-      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument);
++      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument);
+       if (! pDoc)
+               return S_OK;
+       BSTR FileName;
+       long LineNr = -1;
+       // Get the document name
+-      if (FAILED (pDoc->get_FullName (&FileName)))
++      if (FAILED(pDoc->get_FullName(&FileName)))
+               return S_OK;
+       LPDISPATCH pDispSel;
+       // Get a selection object dispatch pointer
+-      if (SUCCEEDED (pDoc->get_Selection (&pDispSel)))
++      if (SUCCEEDED(pDoc->get_Selection(&pDispSel)))
        {
-           dict = dict_alloc();
-@@ -10966,14 +11037,13 @@ f_getmatches(argvars, rettv)
+               // Get the selection object
+-              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel);
++              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel);
+               if (pSel)
+                       // Get the selection line number
+-                      pSel->get_CurrentLine (&LineNr);
++                      pSel->get_CurrentLine(&LineNr);
+-              pDispSel->Release ();
++              pDispSel->Release();
+       }
+       // Open the file in Vim and position to the current line
+-      if (VimOpenFile (FileName, LineNr))
++      if (VimOpenFile(FileName, LineNr))
+       {
+               if (! g_bDevStudioEditor)
+               {
+                       // Close the document in developer studio
+                       CComVariant vSaveChanges = dsSaveChangesPrompt;
+                       DsSaveStatus Saved;
+-                      pDoc->Close (vSaveChanges, &Saved);
++                      pDoc->Close(vSaveChanges, &Saved);
+               }
+       }
+       // We're done here
+-      SysFreeString (FileName);
++      SysFreeString(FileName);
+       return S_OK;
  }
  
- /*
-  * "getpid()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getpid(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-HRESULT CCommands::XApplicationEvents::BeforeDocumentClose (IDispatch * theDocument)
++HRESULT CCommands::XApplicationEvents::BeforeDocumentClose(IDispatch * theDocument)
  {
-     rettv->vval.v_number = mch_get_pid();
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
-@@ -11013,21 +11083,19 @@ f_getpos(argvars, rettv)
+-HRESULT CCommands::XApplicationEvents::DocumentSave (IDispatch * theDocument)
++HRESULT CCommands::XApplicationEvents::DocumentSave(IDispatch * theDocument)
+ {
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
- /*
-  * "getqflist()" and "getloclist()" functions
-  */
--/*ARGSUSED*/
-     static void
- f_getqflist(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
+-HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument)
++HRESULT CCommands::XApplicationEvents::NewDocument(IDispatch * theDocument)
  {
- #ifdef FEAT_QUICKFIX
-     win_T     *wp;
- #endif
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
  
--    rettv->vval.v_number = 0;
- #ifdef FEAT_QUICKFIX
-     if (rettv_list_alloc(rettv) == OK)
-     {
-       wp = NULL;
-       if (argvars[0].v_type != VAR_UNKNOWN)   /* getloclist() */
-@@ -11133,14 +11201,13 @@ f_gettabwinvar(argvars, rettv)
+       if (! g_bEnableVim)
+               // Vim not enabled or empty command line entered
+               return S_OK;
+       // First get the current file name and line number
+-      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument);
++      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument);
+       if (! pDoc)
+               return S_OK;
+       BSTR FileName;
+       HRESULT hr;
+-      hr = pDoc->get_FullName (&FileName);
+-      if (FAILED (hr))
++      hr = pDoc->get_FullName(&FileName);
++      if (FAILED(hr))
+               return S_OK;
+       // Open the file in Vim and position to the current line
+-      if (VimOpenFile (FileName, 0))
++      if (VimOpenFile(FileName, 0))
+       {
+               if (! g_bDevStudioEditor)
+               {
+                       // Close the document in developer studio
+                       CComVariant vSaveChanges = dsSaveChangesPrompt;
+                       DsSaveStatus Saved;
+-                      pDoc->Close (vSaveChanges, &Saved);
++                      pDoc->Close(vSaveChanges, &Saved);
+               }
+       }
+-      SysFreeString (FileName);
++      SysFreeString(FileName);
+       return S_OK;
  }
  
- /*
-  * "getwinposx()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getwinposx(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-HRESULT CCommands::XApplicationEvents::WindowActivate (IDispatch * theWindow)
++HRESULT CCommands::XApplicationEvents::WindowActivate(IDispatch * theWindow)
  {
-     rettv->vval.v_number = -1;
- #ifdef FEAT_GUI
-     if (gui.in_use)
-@@ -11154,14 +11221,13 @@ f_getwinposx(argvars, rettv)
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
- /*
-  * "getwinposy()" function
-  */
--/*ARGSUSED*/
-     static void
- f_getwinposy(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->vval.v_number = -1;
- #ifdef FEAT_GUI
-     if (gui.in_use)
-@@ -11282,35 +11348,55 @@ getwinvar(argvars, rettv, off)
-     static void
- f_glob(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
+-HRESULT CCommands::XApplicationEvents::WindowDeactivate (IDispatch * theWindow)
++HRESULT CCommands::XApplicationEvents::WindowDeactivate(IDispatch * theWindow)
  {
-+    int               flags = WILD_SILENT|WILD_USE_NL;
-     expand_T  xpc;
-+    int               error = FALSE;
--    ExpandInit(&xpc);
--    xpc.xp_context = EXPAND_FILES;
-+    /* When the optional second argument is non-zero, don't remove matches
-+    * for 'wildignore' and don't put matches for 'suffixes' at the end. */
-+    if (argvars[1].v_type != VAR_UNKNOWN
-+                              && get_tv_number_chk(&argvars[1], &error))
-+      flags |= WILD_KEEP_ALL;
-     rettv->v_type = VAR_STRING;
--    rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
--                                   NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
-+    if (!error)
-+    {
-+      ExpandInit(&xpc);
-+      xpc.xp_context = EXPAND_FILES;
-+      rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
-+                                                     NULL, flags, WILD_ALL);
-+    }
-+    else
-+      rettv->vval.v_string = NULL;
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
- /*
-  * "globpath()" function
-  */
-     static void
- f_globpath(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
+-HRESULT CCommands::XApplicationEvents::WorkspaceOpen ()
++HRESULT CCommands::XApplicationEvents::WorkspaceOpen()
  {
-+    int               flags = 0;
-     char_u    buf1[NUMBUFLEN];
-     char_u    *file = get_tv_string_buf_chk(&argvars[1], buf1);
-+    int               error = FALSE;
-+    /* When the optional second argument is non-zero, don't remove matches
-+    * for 'wildignore' and don't put matches for 'suffixes' at the end. */
-+    if (argvars[2].v_type != VAR_UNKNOWN
-+                              && get_tv_number_chk(&argvars[2], &error))
-+      flags |= WILD_KEEP_ALL;
-     rettv->v_type = VAR_STRING;
--    if (file == NULL)
-+    if (file == NULL || error)
-       rettv->vval.v_string = NULL;
-     else
--      rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file);
-+      rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file,
-+                                                                     flags);
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
- /*
-  * "has()" function
-  */
-@@ -11368,11 +11454,11 @@ f_has(argvars, rettv)
-       "win32",
- #endif
- #if defined(UNIX) && (defined(__CYGWIN32__) || defined(__CYGWIN__))
-       "win32unix",
- #endif
--#ifdef WIN64
-+#if defined(WIN64) || defined(_WIN64)
-       "win64",
- #endif
- #ifdef EBCDIC
-       "ebcdic",
- #endif
-@@ -11655,10 +11741,13 @@ f_has(argvars, rettv)
-       "smartindent",
- #endif
- #ifdef FEAT_SNIFF
-       "sniff",
- #endif
-+#ifdef STARTUPTIME
-+      "startuptime",
-+#endif
- #ifdef FEAT_STL_OPT
-       "statusline",
- #endif
- #ifdef FEAT_SUN_WORKSHOP
-       "sun_workshop",
-@@ -11780,10 +11869,14 @@ f_has(argvars, rettv)
-     {
-       if (STRNICMP(name, "patch", 5) == 0)
-           n = has_patch(atoi((char *)name + 5));
-       else if (STRICMP(name, "vim_starting") == 0)
-           n = (starting != 0);
-+#ifdef FEAT_MBYTE
-+      else if (STRICMP(name, "multi_byte_encoding") == 0)
-+          n = has_mbyte;
-+#endif
- #if defined(FEAT_BEVAL) && defined(FEAT_GUI_W32)
-       else if (STRICMP(name, "balloon_multiline") == 0)
-           n = multiline_balloon_available();
- #endif
- #ifdef DYNAMIC_TCL
-@@ -11845,11 +11938,10 @@ f_has(argvars, rettv)
-     static void
- f_has_key(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
+-HRESULT CCommands::XApplicationEvents::WorkspaceClose ()
++HRESULT CCommands::XApplicationEvents::WorkspaceClose()
  {
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type != VAR_DICT)
-     {
-       EMSG(_(e_dictreq));
-       return;
-     }
-@@ -11861,14 +11953,13 @@ f_has_key(argvars, rettv)
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
- /*
-  * "haslocaldir()" function
-  */
--/*ARGSUSED*/
-     static void
- f_haslocaldir(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-HRESULT CCommands::XApplicationEvents::NewWorkspace ()
++HRESULT CCommands::XApplicationEvents::NewWorkspace()
  {
-     rettv->vval.v_number = (curwin->w_localdir != NULL);
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
-@@ -11902,14 +11993,13 @@ f_hasmapto(argvars, rettv)
+ // Debugger event
+-HRESULT CCommands::XDebuggerEvents::BreakpointHit (IDispatch * pBreakpoint)
++HRESULT CCommands::XDebuggerEvents::BreakpointHit(IDispatch * pBreakpoint)
+ {
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
+       return S_OK;
  }
  
- /*
-  * "histadd()" function
-  */
--/*ARGSUSED*/
-     static void
- f_histadd(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+ /////////////////////////////////////////////////////////////////////////////
+ // VisVim dialog
+ class CMainDialog : public CDialog
  {
- #ifdef FEAT_CMDHIST
-     int               histype;
-     char_u    *str;
-@@ -11925,10 +12015,11 @@ f_histadd(argvars, rettv)
-     if (histype >= 0)
-     {
-       str = get_tv_string_buf(&argvars[1], buf);
-       if (*str != NUL)
-       {
-+          init_history();
-           add_to_history(histype, str, FALSE, NUL);
-           rettv->vval.v_number = TRUE;
-           return;
-       }
-     }
-@@ -11936,15 +12027,14 @@ f_histadd(argvars, rettv)
- }
+     public:
+-      CMainDialog (CWnd * pParent = NULL);    // Standard constructor
++      CMainDialog(CWnd * pParent = NULL);     // Standard constructor
  
- /*
-  * "histdel()" function
-  */
--/*ARGSUSED*/
-     static void
- f_histdel(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
+       //{{AFX_DATA(CMainDialog)
+       enum { IDD = IDD_ADDINMAIN };
+       int     m_ChangeDir;
+       BOOL    m_bDevStudioEditor;
++      BOOL    m_bNewTabs;
+       //}}AFX_DATA
+       //{{AFX_VIRTUAL(CMainDialog)
+     protected:
+-      virtual void DoDataExchange (CDataExchange * pDX);      // DDX/DDV support
++      virtual void DoDataExchange(CDataExchange * pDX);       // DDX/DDV support
+       //}}AFX_VIRTUAL
+     protected:
+       //{{AFX_MSG(CMainDialog)
+       afx_msg void OnEnable();
+       afx_msg void OnDisable();
+       //}}AFX_MSG
+-      DECLARE_MESSAGE_MAP ()
++      DECLARE_MESSAGE_MAP()
+ };
+-CMainDialog::CMainDialog (CWnd * pParent /* =NULL */ )
+-      : CDialog (CMainDialog::IDD, pParent)
++CMainDialog::CMainDialog(CWnd * pParent /* =NULL */ )
++      : CDialog(CMainDialog::IDD, pParent)
  {
- #ifdef FEAT_CMDHIST
-     int               n;
-     char_u    buf[NUMBUFLEN];
-     char_u    *str;
-@@ -11962,22 +12052,19 @@ f_histdel(argvars, rettv)
-     else
-       /* string given: remove all matching entries */
-       n = del_history_entry(get_histtype(str),
-                                     get_tv_string_buf(&argvars[1], buf));
-     rettv->vval.v_number = n;
--#else
--    rettv->vval.v_number = 0;
- #endif
+       //{{AFX_DATA_INIT(CMainDialog)
+       m_ChangeDir = -1;
+       m_bDevStudioEditor = FALSE;
++      m_bNewTabs = FALSE;
+       //}}AFX_DATA_INIT
  }
  
- /*
-  * "histget()" function
-  */
--/*ARGSUSED*/
-     static void
- f_histget(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-void CMainDialog::DoDataExchange (CDataExchange * pDX)
++void CMainDialog::DoDataExchange(CDataExchange * pDX)
  {
- #ifdef FEAT_CMDHIST
-     int               type;
-     int               idx;
-@@ -12003,14 +12090,13 @@ f_histget(argvars, rettv)
+-      CDialog::DoDataExchange (pDX);
++      CDialog::DoDataExchange(pDX);
+       //{{AFX_DATA_MAP(CMainDialog)
+       DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir);
+-      DDX_Check (pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor);
++      DDX_Check(pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor);
++      DDX_Check(pDX, IDC_NEW_TABS, m_bNewTabs);
+       //}}AFX_DATA_MAP
  }
  
- /*
-  * "histnr()" function
-  */
--/*ARGSUSED*/
-     static void
- f_histnr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     int               i;
+-BEGIN_MESSAGE_MAP (CMainDialog, CDialog)
++BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
+       //{{AFX_MSG_MAP(CMainDialog)
+       //}}AFX_MSG_MAP
+-END_MESSAGE_MAP ()
++END_MESSAGE_MAP()
  
- #ifdef FEAT_CMDHIST
-@@ -12048,14 +12134,13 @@ f_hlexists(argvars, rettv)
- }
  
- /*
-  * "hostname()" function
-  */
--/*ARGSUSED*/
-     static void
- f_hostname(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+ /////////////////////////////////////////////////////////////////////////////
+ // CCommands methods
+-STDMETHODIMP CCommands::VisVimDialog ()
++STDMETHODIMP CCommands::VisVimDialog()
  {
-     char_u hostname[256];
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
  
-     mch_get_host_name(hostname, 256);
-@@ -12064,14 +12149,13 @@ f_hostname(argvars, rettv)
- }
+       // Use m_pApplication to access the Developer Studio Application
+       // object,
+       // and VERIFY_OK to see error strings in DEBUG builds of your add-in
+       // (see stdafx.h)
  
- /*
-  * iconv() function
-  */
--/*ARGSUSED*/
-     static void
- f_iconv(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_MBYTE
-     char_u    buf1[NUMBUFLEN];
-     char_u    buf2[NUMBUFLEN];
-@@ -12325,11 +12409,10 @@ f_inputlist(argvars, rettv)
- {
-     listitem_T        *li;
-     int               selected;
-     int               mouse_used;
+-      VERIFY_OK (m_pApplication->EnableModeless (VARIANT_FALSE));
++      VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE));
  
--    rettv->vval.v_number = 0;
- #ifdef NO_CONSOLE_INPUT
-     /* While starting up, there is no place to enter text. */
-     if (no_console_input())
-       return;
- #endif
-@@ -12363,22 +12446,21 @@ f_inputlist(argvars, rettv)
- static garray_T           ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL};
+       CMainDialog Dlg;
  
- /*
-  * "inputrestore()" function
-  */
--/*ARGSUSED*/
-     static void
- f_inputrestore(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     if (ga_userinput.ga_len > 0)
-     {
-       --ga_userinput.ga_len;
-       restore_typeahead((tasave_T *)(ga_userinput.ga_data)
-                                                      + ga_userinput.ga_len);
--      rettv->vval.v_number = 0; /* OK */
-+      /* default return is zero == OK */
-     }
-     else if (p_verbose > 1)
-     {
-       verb_msg((char_u *)_("called inputrestore() more often than inputsave()"));
-       rettv->vval.v_number = 1; /* Failed */
-@@ -12386,23 +12468,22 @@ f_inputrestore(argvars, rettv)
+       Dlg.m_bDevStudioEditor = g_bDevStudioEditor;
++      Dlg.m_bNewTabs = g_bNewTabs;
+       Dlg.m_ChangeDir = g_ChangeDir;
+-      if (Dlg.DoModal () == IDOK)
++      if (Dlg.DoModal() == IDOK)
+       {
+               g_bDevStudioEditor = Dlg.m_bDevStudioEditor;
++              g_bNewTabs = Dlg.m_bNewTabs;
+               g_ChangeDir = Dlg.m_ChangeDir;
+               // Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim
+-              HKEY hAppKey = GetAppKey ("Vim");
++              HKEY hAppKey = GetAppKey("Vim");
+               if (hAppKey)
+               {
+-                      HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
++                      HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
+                       if (hSectionKey)
+                       {
+-                              WriteRegistryInt (hSectionKey, "DevStudioEditor",
++                              WriteRegistryInt(hSectionKey, "DevStudioEditor",
+                                                 g_bDevStudioEditor);
+-                              WriteRegistryInt (hSectionKey, "ChangeDir", g_ChangeDir);
+-                              RegCloseKey (hSectionKey);
++                              WriteRegistryInt(hSectionKey, "NewTabs",
++                                                g_bNewTabs);
++                              WriteRegistryInt(hSectionKey, "ChangeDir", g_ChangeDir);
++                              RegCloseKey(hSectionKey);
+                       }
+-                      RegCloseKey (hAppKey);
++                      RegCloseKey(hAppKey);
+               }
+       }
+-      VERIFY_OK (m_pApplication->EnableModeless (VARIANT_TRUE));
++      VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE));
+       return S_OK;
  }
  
- /*
-  * "inputsave()" function
-  */
--/*ARGSUSED*/
-     static void
- f_inputsave(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-STDMETHODIMP CCommands::VisVimEnable ()
++STDMETHODIMP CCommands::VisVimEnable()
  {
-     /* Add an entry to the stack of typeahead storage. */
-     if (ga_grow(&ga_userinput, 1) == OK)
-     {
-       save_typeahead((tasave_T *)(ga_userinput.ga_data)
-                                                      + ga_userinput.ga_len);
-       ++ga_userinput.ga_len;
--      rettv->vval.v_number = 0; /* OK */
-+      /* default return is zero == OK */
-     }
-     else
-       rettv->vval.v_number = 1; /* Failed */
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+-      VimSetEnableState (true);
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
++      VimSetEnableState(true);
+       return S_OK;
  }
  
-@@ -12432,11 +12513,10 @@ f_insert(argvars, rettv)
-     long      before = 0;
-     listitem_T        *item;
-     list_T    *l;
-     int               error = FALSE;
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type != VAR_LIST)
-       EMSG2(_(e_listarg), "insert()");
-     else if ((l = argvars[0].vval.v_list) != NULL
-           && !tv_check_lock(l->lv_lock, (char_u *)"insert()"))
-     {
-@@ -12551,11 +12631,10 @@ dict_list(argvars, rettv, what)
-     listitem_T        *li;
-     listitem_T        *li2;
-     dict_T    *d;
-     int               todo;
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type != VAR_DICT)
-     {
-       EMSG(_(e_dictreq));
-       return;
-     }
-@@ -12639,11 +12718,10 @@ f_join(argvars, rettv)
-     typval_T  *rettv;
+-STDMETHODIMP CCommands::VisVimDisable ()
++STDMETHODIMP CCommands::VisVimDisable()
  {
-     garray_T  ga;
-     char_u    *sep;
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+-      VimSetEnableState (false);
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
++      VimSetEnableState(false);
+       return S_OK;
+ }
  
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type != VAR_LIST)
-     {
-       EMSG(_(e_listreq));
-       return;
-     }
-@@ -12679,14 +12757,13 @@ f_keys(argvars, rettv)
+-STDMETHODIMP CCommands::VisVimToggle ()
++STDMETHODIMP CCommands::VisVimToggle()
+ {
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+-      VimSetEnableState (! g_bEnableVim);
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
++      VimSetEnableState(! g_bEnableVim);
+       return S_OK;
  }
  
- /*
-  * "last_buffer_nr()" function.
-  */
--/*ARGSUSED*/
-     static void
- f_last_buffer_nr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+-STDMETHODIMP CCommands::VisVimLoad ()
++STDMETHODIMP CCommands::VisVimLoad()
  {
-     int               n = 0;
-     buf_T     *buf;
+-      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
++      AFX_MANAGE_STATE(AfxGetStaticModuleState());
  
-@@ -12737,13 +12814,11 @@ libcall_common(argvars, rettv, type)
-     char_u            **string_result;
-     int                       nr_result;
- #endif
+       // Use m_pApplication to access the Developer Studio Application object,
+       // and VERIFY_OK to see error strings in DEBUG builds of your add-in
+       // (see stdafx.h)
  
-     rettv->v_type = type;
--    if (type == VAR_NUMBER)
--      rettv->vval.v_number = 0;
--    else
-+    if (type != VAR_NUMBER)
-       rettv->vval.v_string = NULL;
+       CComBSTR bStr;
+       // Define dispatch pointers for document and selection objects
+       CComPtr < IDispatch > pDispDoc, pDispSel;
  
-     if (check_restricted() || check_secure())
-       return;
+       // Get a document object dispatch pointer
+-      VERIFY_OK (m_pApplication->get_ActiveDocument (&pDispDoc));
++      VERIFY_OK(m_pApplication->get_ActiveDocument(&pDispDoc));
+       if (! pDispDoc)
+               return S_OK;
  
-@@ -12811,14 +12886,13 @@ f_line(argvars, rettv)
- }
+       BSTR FileName;
+       long LineNr = -1;
  
- /*
-  * "line2byte(lnum)" function
-  */
--/*ARGSUSED*/
-     static void
- f_line2byte(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifndef FEAT_BYTEOFF
-     rettv->vval.v_number = -1;
- #else
-@@ -12860,14 +12934,13 @@ f_lispindent(argvars, rettv)
- }
+       // Get the document object
+-      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (pDispDoc);
++      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(pDispDoc);
  
- /*
-  * "localtime()" function
-  */
--/*ARGSUSED*/
-     static void
- f_localtime(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->vval.v_number = (varnumber_T)time(NULL);
- }
+       if (! pDoc)
+               return S_OK;
  
-@@ -13445,11 +13518,10 @@ f_mkdir(argvars, rettv)
- #endif
+       // Get the document name
+-      if (FAILED (pDoc->get_FullName (&FileName)))
++      if (FAILED(pDoc->get_FullName(&FileName)))
+               return S_OK;
  
- /*
-  * "mode()" function
-  */
--/*ARGSUSED*/
-     static void
- f_mode(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-@@ -13519,10 +13591,27 @@ f_mode(argvars, rettv)
+       // Get a selection object dispatch pointer
+-      if (SUCCEEDED (pDoc->get_Selection (&pDispSel)))
++      if (SUCCEEDED(pDoc->get_Selection(&pDispSel)))
+       {
+               // Get the selection object
+-              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel);
++              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel);
  
-     rettv->vval.v_string = vim_strsave(buf);
-     rettv->v_type = VAR_STRING;
- }
+               if (pSel)
+                       // Get the selection line number
+-                      pSel->get_CurrentLine (&LineNr);
++                      pSel->get_CurrentLine(&LineNr);
+       }
  
-+#ifdef FEAT_MZSCHEME
-+/*
-+ * "mzeval()" function
-+ */
-+    static void
-+f_mzeval(argvars, rettv)
-+    typval_T  *argvars;
-+    typval_T  *rettv;
-+{
-+    char_u    *str;
-+    char_u    buf[NUMBUFLEN];
-+
-+    str = get_tv_string_buf(&argvars[0], buf);
-+    do_mzeval(str, rettv);
-+}
-+#endif
-+
- /*
-  * "nextnonblank()" function
-  */
-     static void
- f_nextnonblank(argvars, rettv)
-@@ -13674,17 +13763,15 @@ f_printf(argvars, rettv)
- }
+       // Open the file in Vim
+-      VimOpenFile (FileName, LineNr);
++      VimOpenFile(FileName, LineNr);
  
- /*
-  * "pumvisible()" function
-  */
--/*ARGSUSED*/
-     static void
- f_pumvisible(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
--    rettv->vval.v_number = 0;
- #ifdef FEAT_INS_EXPAND
-     if (pum_visible())
-       rettv->vval.v_number = 1;
- #endif
+-      SysFreeString (FileName);
++      SysFreeString(FileName);
+       return S_OK;
  }
-@@ -13714,11 +13801,10 @@ f_range(argvars, rettv)
-       end = get_tv_number_chk(&argvars[1], &error);
-       if (argvars[2].v_type != VAR_UNKNOWN)
-           stride = get_tv_number_chk(&argvars[2], &error);
-     }
  
--    rettv->vval.v_number = 0;
-     if (error)
-       return;         /* type error; errmsg already given */
-     if (stride == 0)
-       EMSG(_("E726: Stride is zero"));
-     else if (stride > 0 ? end + 1 < start : end - 1 > start)
-@@ -14081,14 +14167,13 @@ remote_common(argvars, rettv, expr)
- #endif
  
- /*
-  * "remote_expr()" function
-  */
--/*ARGSUSED*/
-     static void
- f_remote_expr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     rettv->v_type = VAR_STRING;
-     rettv->vval.v_string = NULL;
- #ifdef FEAT_CLIENTSERVER
-@@ -14097,17 +14182,15 @@ f_remote_expr(argvars, rettv)
- }
+ //
+ // Here we do the actual processing and communication with Vim
+ //
  
- /*
-  * "remote_foreground()" function
-  */
--/*ARGSUSED*/
-     static void
- f_remote_foreground(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
--    rettv->vval.v_number = 0;
- #ifdef FEAT_CLIENTSERVER
- # ifdef WIN32
-     /* On Win32 it's done in this application. */
-     {
-       char_u  *server_name = get_tv_string_chk(&argvars[0]);
-@@ -14124,14 +14207,13 @@ f_remote_foreground(argvars, rettv)
-     vim_free(argvars[1].vval.v_string);
- # endif
- #endif
- }
--/*ARGSUSED*/
-     static void
- f_remote_peek(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_CLIENTSERVER
-     dictitem_T        v;
-     char_u    *s = NULL;
-@@ -14159,11 +14241,10 @@ f_remote_peek(argvars, rettv)
-     {
-       s = serverGetReply((HWND)n, FALSE, FALSE, FALSE);
-       rettv->vval.v_number = (s != NULL);
-     }
- # else
--    rettv->vval.v_number = 0;
-     if (check_connection() == FAIL)
-       return;
-     rettv->vval.v_number = serverPeekReply(X_DISPLAY,
-                                               serverStrToWin(serverid), &s);
-@@ -14183,14 +14264,13 @@ f_remote_peek(argvars, rettv)
- #else
-     rettv->vval.v_number = -1;
- #endif
- }
--/*ARGSUSED*/
-     static void
- f_remote_read(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+ // Set the enable state and save to registry
+ //
+-static void VimSetEnableState (BOOL bEnableState)
++static void VimSetEnableState(BOOL bEnableState)
  {
-     char_u    *r = NULL;
- #ifdef FEAT_CLIENTSERVER
-@@ -14218,14 +14298,13 @@ f_remote_read(argvars, rettv)
+       g_bEnableVim = bEnableState;
+-      HKEY hAppKey = GetAppKey ("Vim");
++      HKEY hAppKey = GetAppKey("Vim");
+       if (hAppKey)
+       {
+-              HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
++              HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
+               if (hSectionKey)
+-                      WriteRegistryInt (hSectionKey, "EnableVim", g_bEnableVim);
+-              RegCloseKey (hAppKey);
++                      WriteRegistryInt(hSectionKey, "EnableVim", g_bEnableVim);
++              RegCloseKey(hAppKey);
+       }
  }
  
- /*
-  * "remote_send()" function
-  */
--/*ARGSUSED*/
-     static void
- f_remote_send(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+ // Open the file 'FileName' in Vim and goto line 'LineNr'
+ // 'FileName' is expected to contain an absolute DOS path including the drive
+ // letter.
+ // 'LineNr' must contain a valid line number or 0, e. g. for a new file
+ //
+-static BOOL VimOpenFile (BSTR& FileName, long LineNr)
++static BOOL VimOpenFile(BSTR& FileName, long LineNr)
  {
-     rettv->v_type = VAR_STRING;
-     rettv->vval.v_string = NULL;
- #ifdef FEAT_CLIENTSERVER
-@@ -14248,11 +14327,10 @@ f_remove(argvars, rettv)
-     long      end;
-     char_u    *key;
-     dict_T    *d;
-     dictitem_T        *di;
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type == VAR_DICT)
-     {
-       if (argvars[2].v_type != VAR_UNKNOWN)
-           EMSG2(_(e_toomanyarg), "remove()");
-       else if ((d = argvars[0].vval.v_dict) != NULL
-@@ -14351,11 +14429,10 @@ f_rename(argvars, rettv)
- }
  
- /*
-  * "repeat()" function
-  */
--/*ARGSUSED*/
-     static void
- f_repeat(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-@@ -14606,11 +14683,10 @@ f_reverse(argvars, rettv)
-     typval_T  *rettv;
- {
-     list_T    *l;
-     listitem_T        *li, *ni;
+       // OLE automation object for com. with Vim
+       // When the object goes out of scope, it's destructor destroys the OLE
+       // connection;
+@@ -505,11 +515,11 @@ static BOOL VimOpenFile (BSTR& FileName,
+       // :cd D:/Src2/VisVim/
+       //
+       // Get a dispatch id for the SendKeys method of Vim;
+       // enables connection to Vim if necessary
+       DISPID DispatchId;
+-      DispatchId = VimGetDispatchId (VimOle, "SendKeys");
++      DispatchId = VimGetDispatchId(VimOle, "SendKeys");
+       if (! DispatchId)
+               // OLE error, can't obtain dispatch id
+               goto OleError;
  
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type != VAR_LIST)
-       EMSG2(_(e_listarg), "reverse()");
-     else if ((l = argvars[0].vval.v_list) != NULL
-           && !tv_check_lock(l->lv_lock, (char_u *)"reverse()"))
-     {
-@@ -14958,12 +15034,10 @@ f_searchpairpos(argvars, rettv)
- {
-     pos_T     match_pos;
-     int               lnum = 0;
-     int               col = 0;
+       OLECHAR Buf[MAX_OLE_STR];
+@@ -523,24 +533,32 @@ static BOOL VimOpenFile (BSTR& FileName,
+       VimCmd[2] = 0;
  
--    rettv->vval.v_number = 0;
--
-     if (rettv_list_alloc(rettv) == FAIL)
-       return;
+ #ifdef SINGLE_WINDOW
+       // Update the current file in Vim if it has been modified.
+       // Disabled, because it could write the file when you don't want to.
+-      sprintf (VimCmd + 2, ":up\n");
++      sprintf(VimCmd + 2, ":up\n");
+ #endif
+-      if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
++      if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
+               goto OleError;
  
-     if (searchpair_cmn(argvars, &match_pos) > 0)
-     {
-@@ -15146,12 +15220,10 @@ f_searchpos(argvars, rettv)
-     int               lnum = 0;
-     int               col = 0;
-     int               n;
-     int               flags = 0;
+       // Change Vim working directory to where the file is if desired
+       if (g_ChangeDir != CD_NONE)
+-              VimChangeDir (VimOle, DispatchId, FileName);
++              VimChangeDir(VimOle, DispatchId, FileName);
  
--    rettv->vval.v_number = 0;
--
-     if (rettv_list_alloc(rettv) == FAIL)
-       return;
+       // Make Vim open the file.
+       // In the filename convert all \ to /, put a \ before a space.
+-      sprintf(VimCmd, ":drop ");
++      if (g_bNewTabs)
++      {
++              sprintf(VimCmd, ":tab drop ");
++              s = VimCmd + 11;
++      }
++      else
++      {
++              sprintf(VimCmd, ":drop ");
++              s = VimCmd + 6;
++      }
+       sprintf(FileNameTmp, "%S", (char *)FileName);
+-      s = VimCmd + 6;
+       for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4;
+                                                                         ++p)
+               if (*p == '\\')
+                       *s++ = '/';
+               else
+@@ -550,51 +568,51 @@ static BOOL VimOpenFile (BSTR& FileName,
+                       *s++ = *p;
+               }
+       *s++ = '\n';
+       *s = '\0';
  
-     n = search_cmn(argvars, &match_pos, &flags);
-     if (n > 0)
-@@ -15165,14 +15237,13 @@ f_searchpos(argvars, rettv)
-     if (flags & SP_SUBPAT)
-       list_append_number(rettv->vval.v_list, (varnumber_T)n);
- }
+-      if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
++      if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
+               goto OleError;
  
+       if (LineNr > 0)
+       {
+               // Goto line
+-              sprintf (VimCmd, ":%d\n", LineNr);
+-              if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
++              sprintf(VimCmd, ":%d\n", LineNr);
++              if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
+                       goto OleError;
+       }
  
--/*ARGSUSED*/
-     static void
- f_server2client(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_CLIENTSERVER
-     char_u    buf[NUMBUFLEN];
-     char_u    *server = get_tv_string_chk(&argvars[0]);
-@@ -15197,14 +15268,13 @@ f_server2client(argvars, rettv)
- #else
-     rettv->vval.v_number = -1;
- #endif
- }
+       // Make Vim come to the foreground
+-      if (! VimOle.Method ("SetForeground"))
+-              VimOle.ErrDiag ();
++      if (! VimOle.Method("SetForeground"))
++              VimOle.ErrDiag();
  
--/*ARGSUSED*/
-     static void
- f_serverlist(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     char_u    *r = NULL;
+       // We're done
+       return true;
  
- #ifdef FEAT_CLIENTSERVER
-@@ -15221,24 +15291,21 @@ f_serverlist(argvars, rettv)
+     OleError:
+       // There was an OLE error
+       // Check if it's the "unknown class string" error
+-      VimErrDiag (VimOle);
++      VimErrDiag(VimOle);
+       return false;
  }
  
- /*
-  * "setbufvar()" function
-  */
--/*ARGSUSED*/
-     static void
- f_setbufvar(argvars, rettv)
-     typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *rettv UNUSED;
+ // Return the dispatch id for the Vim method 'Method'
+ // Create the Vim OLE object if necessary
+ // Returns a valid dispatch id or null on error
+ //
+-static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method)
++static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method)
  {
-     buf_T     *buf;
-     aco_save_T        aco;
-     char_u    *varname, *bufvarname;
-     typval_T  *varp;
-     char_u    nbuf[NUMBUFLEN];
--    rettv->vval.v_number = 0;
--
-     if (check_restricted() || check_secure())
-       return;
-     (void)get_tv_number(&argvars[0]);     /* issue errmsg if type error */
-     varname = get_tv_string_chk(&argvars[1]);
-     buf = get_buf_tv(&argvars[0]);
-@@ -15314,11 +15381,11 @@ f_setline(argvars, rettv)
-       li = l->lv_first;
-     }
-     else
-       line = get_tv_string_chk(&argvars[1]);
+       // Initialize Vim OLE connection if not already done
+-      if (! VimOle.IsCreated ())
++      if (! VimOle.IsCreated())
+       {
+-              if (! VimOle.CreateObject ("Vim.Application"))
++              if (! VimOle.CreateObject("Vim.Application"))
+                       return NULL;
+       }
  
--    rettv->vval.v_number = 0;         /* OK */
-+    /* default result is zero == OK */
-     for (;;)
-     {
-       if (l != NULL)
+       // Get the dispatch id for the SendKeys method.
+       // By doing this, we are checking if Vim is still there...
+-      DISPID DispatchId = VimOle.GetDispatchId ("SendKeys");
++      DISPID DispatchId = VimOle.GetDispatchId("SendKeys");
+       if (! DispatchId)
        {
-           /* list argument, get next string */
-@@ -15362,16 +15429,15 @@ f_setline(argvars, rettv)
- static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv));
+               // We can't get a dispatch id.
+               // This means that probably Vim has been terminated.
+               // Don't issue an error message here, instead
+@@ -602,62 +620,62 @@ static DISPID VimGetDispatchId (COleAuto
+               //
+               // In fact, this should never happen, because the OLE aut. object
+               // should not be kept long enough to allow the user to terminate Vim
+               // to avoid memory corruption (why the heck is there no system garbage
+               // collection for those damned OLE memory chunks???).
+-              VimOle.DeleteObject ();
+-              if (! VimOle.CreateObject ("Vim.Application"))
++              VimOle.DeleteObject();
++              if (! VimOle.CreateObject("Vim.Application"))
+                       // If this create fails, it's time for an error msg
+                       return NULL;
  
- /*
-  * Used by "setqflist()" and "setloclist()" functions
-  */
--/*ARGSUSED*/
-     static void
- set_qf_ll_list(wp, list_arg, action_arg, rettv)
--    win_T     *wp;
--    typval_T  *list_arg;
--    typval_T  *action_arg;
-+    win_T     *wp UNUSED;
-+    typval_T  *list_arg UNUSED;
-+    typval_T  *action_arg UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_QUICKFIX
-     char_u    *act;
-     int               action = ' ';
-@@ -15402,11 +15468,10 @@ set_qf_ll_list(wp, list_arg, action_arg,
- }
+-              if (! (DispatchId = VimOle.GetDispatchId ("SendKeys")))
++              if (! (DispatchId = VimOle.GetDispatchId("SendKeys")))
+                       // There is something wrong...
+                       return NULL;
+       }
  
- /*
-  * "setloclist()" function
-  */
--/*ARGSUSED*/
-     static void
- f_setloclist(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-@@ -15480,11 +15545,10 @@ f_setmatches(argvars, rettv)
+       return DispatchId;
  }
  
- /*
-  * "setpos()" function
-  */
--/*ARGSUSED*/
-     static void
- f_setpos(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
+ // Output an error message for an OLE error
+ // Check on the classstring error, which probably means Vim wasn't registered.
+ //
+-static void VimErrDiag (COleAutomationControl& VimOle)
++static void VimErrDiag(COleAutomationControl& VimOle)
  {
-@@ -15496,11 +15560,12 @@ f_setpos(argvars, rettv)
-     name = get_tv_string_chk(argvars);
-     if (name != NULL)
-     {
-       if (list2fpos(&argvars[1], &pos, &fnum) == OK)
+-      SCODE sc = GetScode (VimOle.GetResult ());
++      SCODE sc = GetScode(VimOle.GetResult());
+       if (sc == CO_E_CLASSSTRING)
        {
--          --pos.col;
-+          if (--pos.col < 0)
-+              pos.col = 0;
-           if (name[0] == '.' && name[1] == NUL)
-           {
-               /* set cursor */
-               if (fnum == curbuf->b_fnum)
-               {
-@@ -15524,11 +15589,10 @@ f_setpos(argvars, rettv)
+               char Buf[256];
+-              sprintf (Buf, "There is no registered OLE automation server named "
++              sprintf(Buf, "There is no registered OLE automation server named "
+                        "\"Vim.Application\".\n"
+                        "Use the OLE-enabled version of Vim with VisVim and "
+                        "make sure to register Vim by running \"vim -register\".");
+-              MessageBox (NULL, Buf, "OLE Error", MB_OK);
++              MessageBox(NULL, Buf, "OLE Error", MB_OK);
+       }
+       else
+-              VimOle.ErrDiag ();
++              VimOle.ErrDiag();
  }
  
- /*
-  * "setqflist()" function
-  */
--/*ARGSUSED*/
-     static void
- f_setqflist(argvars, rettv)
-     typval_T  *argvars;
-     typval_T  *rettv;
- {
-@@ -15630,11 +15694,11 @@ f_setwinvar(argvars, rettv)
-  * "setwinvar()" and "settabwinvar()" functions
-  */
-     static void
- setwinvar(argvars, rettv, off)
-     typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *rettv UNUSED;
-     int               off;
+ // Change directory to the directory the file 'FileName' is in or it's parent
+ // directory according to the setting of the global 'g_ChangeDir':
+ // 'FileName' is expected to contain an absolute DOS path including the drive
+ // letter.
+ //    CD_NONE
+ //    CD_SOURCE_PATH
+ //    CD_SOURCE_PARENT
+ //
+-static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName)
++static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName)
  {
-     win_T     *win;
- #ifdef FEAT_WINDOWS
-     win_T     *save_curwin;
-@@ -15643,12 +15707,10 @@ setwinvar(argvars, rettv, off)
-     char_u    *varname, *winvarname;
-     typval_T  *varp;
-     char_u    nbuf[NUMBUFLEN];
-     tabpage_T *tp;
--    rettv->vval.v_number = 0;
--
-     if (check_restricted() || check_secure())
-       return;
+       // Do a :cd first
  
- #ifdef FEAT_WINDOWS
-     if (off == 1)
-@@ -15836,14 +15898,13 @@ item_compare2(s1, s2)
-     clear_tv(&argv[1]);
+       // Get the path name of the file ("dir/")
+       CString StrFileName = FileName;
+       char Drive[_MAX_DRIVE];
+       char Dir[_MAX_DIR];
+       char DirUnix[_MAX_DIR * 2];
+       char *s, *t;
  
-     if (res == FAIL)
-       res = ITEM_COMPARE_FAIL;
-     else
--      /* return value has wrong type */
-       res = get_tv_number_chk(&rettv, &item_compare_func_err);
-     if (item_compare_func_err)
--      res = ITEM_COMPARE_FAIL;
-+      res = ITEM_COMPARE_FAIL;  /* return value has wrong type */
-     clear_tv(&rettv);
-     return res;
- }
+-      _splitpath (StrFileName, Drive, Dir, NULL, NULL);
++      _splitpath(StrFileName, Drive, Dir, NULL, NULL);
  
- /*
-@@ -15858,11 +15919,10 @@ f_sort(argvars, rettv)
-     listitem_T        *li;
-     listitem_T        **ptrs;
-     long      len;
-     long      i;
+       // Convert to Unix path name format, escape spaces.
+       t = DirUnix;
+       for (s = Dir; *s; ++s)
+               if (*s == '\\')
+@@ -674,21 +692,20 @@ static void VimChangeDir (COleAutomation
+       // Construct the cd command; append /.. if cd to parent
+       // directory and not in root directory
+       OLECHAR Buf[MAX_OLE_STR];
+       char VimCmd[MAX_OLE_STR];
  
--    rettv->vval.v_number = 0;
-     if (argvars[0].v_type != VAR_LIST)
-       EMSG2(_(e_listarg), "sort()");
-     else
-     {
-       l = argvars[0].vval.v_list;
-@@ -15950,14 +16010,13 @@ f_soundfold(argvars, rettv)
+-      sprintf (VimCmd, ":cd %s%s%s\n", Drive, DirUnix,
++      sprintf(VimCmd, ":cd %s%s%s\n", Drive, DirUnix,
+                g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : "");
+-      VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf));
++      VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf));
  }
  
- /*
-  * "spellbadword()" function
-  */
--/* ARGSUSED */
-     static void
- f_spellbadword(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
+ #ifdef _DEBUG
+ // Print out a debug message
+ //
+-static void DebugMsg (char* Msg, char* Arg)
++static void DebugMsg(char* Msg, char* Arg)
  {
-     char_u    *word = (char_u *)"";
-     hlf_T     attr = HLF_COUNT;
-     int               len = 0;
-@@ -16005,14 +16064,13 @@ f_spellbadword(argvars, rettv)
- }
- /*
-  * "spellsuggest()" function
-  */
--/*ARGSUSED*/
-     static void
- f_spellsuggest(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_SPELL
-     char_u    *str;
-     int               typeerr = FALSE;
-@@ -16491,14 +16549,13 @@ f_substitute(argvars, rettv)
+       char Buf[400];
+-      sprintf (Buf, Msg, Arg);
+-      AfxMessageBox (Buf);
++      sprintf(Buf, Msg, Arg);
++      AfxMessageBox(Buf);
  }
+ #endif
+-
+--- vim72.orig/src/VisVim/Resource.h
++++ vim72/src/VisVim/Resource.h
+@@ -14,10 +14,11 @@
+ #define IDD_ADDINMAIN                 130
+ #define IDC_DEVSTUDIO_EDITOR          1000
+ #define IDC_CD_SOURCE_PATH            1001
+ #define IDC_CD_SOURCE_PARENT          1002
+ #define IDC_CD_NONE                   1003
++#define IDC_NEW_TABS                  1004
  
- /*
-  * "synID(lnum, col, trans)" function
-  */
--/*ARGSUSED*/
-     static void
- f_synID(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     int               id = 0;
- #ifdef FEAT_SYN_HL
-     long      lnum;
-@@ -16519,14 +16576,13 @@ f_synID(argvars, rettv)
- }
+ // Next default values for new objects
+ //
+ #ifdef APSTUDIO_INVOKED
+ #ifndef APSTUDIO_READONLY_SYMBOLS
+--- vim72.orig/src/VisVim/VisVim.rc
++++ vim72/src/VisVim/VisVim.rc
+@@ -120,10 +120,13 @@ CAPTION "Vim Add-In 1.4"
+ FONT 8, "MS Sans Serif"
+ BEGIN
+     CONTROL         "&Open file in DevStudio editor simultaneously",
+                     IDC_DEVSTUDIO_EDITOR,"Button",BS_AUTOCHECKBOX | WS_GROUP | 
+                     WS_TABSTOP,7,7,153,10
++    CONTROL         "Open files in new tabs",
++                    IDC_NEW_TABS,"Button",BS_AUTOCHECKBOX | WS_GROUP |
++                    WS_TABSTOP,7,21,153,10
+     GROUPBOX        "Current directory",IDC_STATIC,7,35,164,58,WS_GROUP
+     CONTROL         "Set to &source file path",IDC_CD_SOURCE_PATH,"Button",
+                     BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,17,49,85,10
+     CONTROL         "Set to &parent directory of source file path",
+                     IDC_CD_SOURCE_PARENT,"Button",BS_AUTORADIOBUTTON,17,63,
+--- vim72.orig/src/auto/configure
++++ vim72/src/auto/configure
+@@ -1,8 +1,8 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.62.
++# Generated by GNU Autoconf 2.63.
+ #
+ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+ # This configure script is free software; the Free Software Foundation
+ # gives unlimited permission to copy, distribute and modify it.
+@@ -633,147 +633,151 @@ ac_includes_default="\
+ #endif
+ #ifdef HAVE_UNISTD_H
+ # include <unistd.h>
+ #endif"
  
- /*
-  * "synIDattr(id, what [, mode])" function
-  */
--/*ARGSUSED*/
-     static void
- f_synIDattr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     char_u    *p = NULL;
- #ifdef FEAT_SYN_HL
-     int               id;
-@@ -16569,11 +16625,11 @@ f_synIDattr(argvars, rettv)
-                   p = highlight_color(id, what, modec);
-               else                                    /* bold */
-                   p = highlight_has_attr(id, HL_BOLD, modec);
-               break;
+-ac_subst_vars='SHELL
+-PATH_SEPARATOR
+-PACKAGE_NAME
+-PACKAGE_TARNAME
+-PACKAGE_VERSION
+-PACKAGE_STRING
+-PACKAGE_BUGREPORT
+-exec_prefix
+-prefix
+-program_transform_name
+-bindir
+-sbindir
+-libexecdir
+-datarootdir
+-datadir
+-sysconfdir
+-sharedstatedir
+-localstatedir
+-includedir
+-oldincludedir
+-docdir
+-infodir
+-htmldir
+-dvidir
+-pdfdir
+-psdir
+-libdir
+-localedir
+-mandir
+-DEFS
+-ECHO_C
+-ECHO_N
+-ECHO_T
+-LIBS
+-build_alias
+-host_alias
+-target_alias
+-SET_MAKE
+-CC
+-CFLAGS
+-LDFLAGS
+-CPPFLAGS
+-ac_ct_CC
+-EXEEXT
+-OBJEXT
+-CPP
+-GREP
+-EGREP
+-AWK
+-STRIP
+-CPP_MM
+-OS_EXTRA_SRC
+-OS_EXTRA_OBJ
+-VIMNAME
+-EXNAME
+-VIEWNAME
+-line_break
+-dovimdiff
+-dogvimdiff
+-compiledby
+-vi_cv_path_mzscheme
+-MZSCHEME_SRC
+-MZSCHEME_OBJ
+-MZSCHEME_PRO
+-MZSCHEME_LIBS
+-MZSCHEME_CFLAGS
+-vi_cv_path_perl
+-vi_cv_perllib
+-shrpenv
+-PERL_SRC
+-PERL_OBJ
+-PERL_PRO
+-PERL_CFLAGS
+-PERL_LIBS
+-vi_cv_path_python
+-PYTHON_CONFDIR
+-PYTHON_LIBS
+-PYTHON_GETPATH_CFLAGS
+-PYTHON_CFLAGS
+-PYTHON_SRC
+-PYTHON_OBJ
+-vi_cv_path_tcl
+-TCL_SRC
+-TCL_OBJ
+-TCL_PRO
+-TCL_CFLAGS
+-TCL_LIBS
+-vi_cv_path_ruby
+-RUBY_SRC
+-RUBY_OBJ
+-RUBY_PRO
+-RUBY_CFLAGS
+-RUBY_LIBS
+-WORKSHOP_SRC
+-WORKSHOP_OBJ
+-NETBEANS_SRC
+-NETBEANS_OBJ
+-SNIFF_SRC
+-SNIFF_OBJ
+-xmkmfpath
+-XMKMF
+-X_CFLAGS
+-X_PRE_LIBS
+-X_LIBS
+-X_EXTRA_LIBS
+-X_LIB
+-GTK_CONFIG
+-GTK12_CONFIG
+-PKG_CONFIG
+-GTK_CFLAGS
+-GTK_LIBS
+-GTK_LIBNAME
+-GNOME_LIBS
+-GNOME_LIBDIR
+-GNOME_INCLUDEDIR
+-GNOME_CONFIG
+-MOTIF_LIBNAME
+-NARROW_PROTO
+-GUI_INC_LOC
+-GUI_LIB_LOC
+-GUITYPE
+-GUI_X_LIBS
+-HANGULIN_SRC
+-HANGULIN_OBJ
+-TAGPRG
+-INSTALL_LANGS
+-INSTALL_TOOL_LANGS
+-MSGFMT
+-MAKEMO
+-DEPEND_CFLAGS_FILTER
++ac_subst_vars='LTLIBOBJS
+ LIBOBJS
+-LTLIBOBJS'
++DEPEND_CFLAGS_FILTER
++MAKEMO
++MSGFMT
++INSTALL_TOOL_LANGS
++INSTALL_LANGS
++TAGPRG
++HANGULIN_OBJ
++HANGULIN_SRC
++GUI_X_LIBS
++GUITYPE
++GUI_LIB_LOC
++GUI_INC_LOC
++NARROW_PROTO
++MOTIF_LIBNAME
++GNOME_CONFIG
++GNOME_INCLUDEDIR
++GNOME_LIBDIR
++GNOME_LIBS
++GTK_LIBNAME
++GTK_LIBS
++GTK_CFLAGS
++PKG_CONFIG
++GTK12_CONFIG
++GTK_CONFIG
++X_LIB
++X_EXTRA_LIBS
++X_LIBS
++X_PRE_LIBS
++X_CFLAGS
++XMKMF
++xmkmfpath
++SNIFF_OBJ
++SNIFF_SRC
++NETBEANS_OBJ
++NETBEANS_SRC
++WORKSHOP_OBJ
++WORKSHOP_SRC
++RUBY_LIBS
++RUBY_CFLAGS
++RUBY_PRO
++RUBY_OBJ
++RUBY_SRC
++vi_cv_path_ruby
++TCL_LIBS
++TCL_CFLAGS
++TCL_PRO
++TCL_OBJ
++TCL_SRC
++vi_cv_path_tcl
++PYTHON_OBJ
++PYTHON_SRC
++PYTHON_CFLAGS
++PYTHON_GETPATH_CFLAGS
++PYTHON_LIBS
++PYTHON_CONFDIR
++vi_cv_path_python
++PERL_LIBS
++PERL_CFLAGS
++PERL_PRO
++PERL_OBJ
++PERL_SRC
++shrpenv
++vi_cv_perllib
++vi_cv_path_perl
++MZSCHEME_MZC
++MZSCHEME_EXTRA
++MZSCHEME_CFLAGS
++MZSCHEME_LIBS
++MZSCHEME_PRO
++MZSCHEME_OBJ
++MZSCHEME_SRC
++vi_cv_path_mzscheme
++compiledby
++dogvimdiff
++dovimdiff
++line_break
++VIEWNAME
++EXNAME
++VIMNAME
++OS_EXTRA_OBJ
++OS_EXTRA_SRC
++XCODE_SELECT
++CPP_MM
++STRIP
++AWK
++EGREP
++GREP
++CPP
++OBJEXT
++EXEEXT
++ac_ct_CC
++CPPFLAGS
++LDFLAGS
++CFLAGS
++CC
++SET_MAKE
++target_alias
++host_alias
++build_alias
++LIBS
++ECHO_T
++ECHO_N
++ECHO_C
++DEFS
++mandir
++localedir
++libdir
++psdir
++pdfdir
++dvidir
++htmldir
++infodir
++docdir
++oldincludedir
++includedir
++localstatedir
++sharedstatedir
++sysconfdir
++datadir
++datarootdir
++libexecdir
++sbindir
++bindir
++program_transform_name
++prefix
++exec_prefix
++PACKAGE_BUGREPORT
++PACKAGE_STRING
++PACKAGE_VERSION
++PACKAGE_TARNAME
++PACKAGE_NAME
++PATH_SEPARATOR
++SHELL'
+ ac_subst_files=''
+ ac_user_opts='
+ enable_option_checking
+ enable_darwin
+ with_mac_arch
++with_developer_dir
+ with_local_dir
+ with_vim_name
+ with_ex_name
+ with_view_name
+ with_global_runtime
+@@ -789,10 +793,11 @@ enable_perlinterp
+ enable_pythoninterp
+ with_python_config_dir
+ enable_tclinterp
+ with_tclsh
+ enable_rubyinterp
++with_ruby_command
+ enable_cscope
+ enable_workshop
+ enable_netbeans
+ enable_sniff
+ enable_multibyte
+@@ -1251,13 +1256,13 @@ if test -n "$ac_prev"; then
+ fi
  
--      case 'f':                                       /* fg[#] */
-+      case 'f':                                       /* fg[#] or font */
-               p = highlight_color(id, what, modec);
-               break;
+ if test -n "$ac_unrecognized_opts"; then
+   case $enable_option_checking in
+     no) ;;
+-    fatal) { $as_echo "$as_me: error: Unrecognized options: $ac_unrecognized_opts" >&2
++    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+    { (exit 1); exit 1; }; } ;;
+-    *)     $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2 ;;
++    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+   esac
+ fi
  
-       case 'i':
-               if (TOLOWER_ASC(what[1]) == 'n')        /* inverse */
-@@ -16588,12 +16644,15 @@ f_synIDattr(argvars, rettv)
+ # Check all directory arguments for consistency.
+ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+@@ -1306,11 +1311,11 @@ test "$silent" = yes && exec 6>/dev/null
  
-       case 'r':                                       /* reverse */
-               p = highlight_has_attr(id, HL_INVERSE, modec);
-               break;
  
--      case 's':                                       /* standout */
--              p = highlight_has_attr(id, HL_STANDOUT, modec);
-+      case 's':
-+              if (TOLOWER_ASC(what[1]) == 'p')        /* sp[#] */
-+                  p = highlight_color(id, what, modec);
-+              else                                    /* standout */
-+                  p = highlight_has_attr(id, HL_STANDOUT, modec);
-               break;
+ ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ ac_ls_di=`ls -di .` &&
+ ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+-  { $as_echo "$as_me: error: Working directory cannot be determined" >&2
++  { $as_echo "$as_me: error: working directory cannot be determined" >&2
+    { (exit 1); exit 1; }; }
+ test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+   { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+    { (exit 1); exit 1; }; }
  
-       case 'u':
-               if (STRLEN(what) <= 5 || TOLOWER_ASC(what[5]) != 'c')
-                                                       /* underline */
-@@ -16612,14 +16671,13 @@ f_synIDattr(argvars, rettv)
- }
+@@ -1487,10 +1492,11 @@ Optional Features:
  
- /*
-  * "synIDtrans(id)" function
-  */
--/*ARGSUSED*/
-     static void
- f_synIDtrans(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     int               id;
+ Optional Packages:
+   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+   --with-mac-arch=ARCH    current, intel, ppc or both
++  --with-developer-dir=PATH    use PATH as location for Xcode developer tools
+   --with-local-dir=PATH   search PATH instead of /usr/local for local libraries.
+   --without-local-dir     do not search /usr/local for local libraries.
+   --with-vim-name=NAME    what to call the Vim executable
+   --with-ex-name=NAME     what to call the Ex executable
+   --with-view-name=NAME   what to call the View executable
+@@ -1499,10 +1505,11 @@ Optional Packages:
+   --with-features=TYPE    tiny, small, normal, big or huge (default: normal)
+   --with-compiledby=NAME  name to show in :version message
+   --with-plthome=PLTHOME   Use PLTHOME.
+   --with-python-config-dir=PATH  Python's config directory
+   --with-tclsh=PATH       which tclsh to use (default: tclsh8.0)
++  --with-ruby-command=RUBY  name of the Ruby command (default: ruby)
+   --with-x                use the X Window System
+   --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)
+   --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)
+   --with-gnome-includes=DIR Specify location of GNOME headers
+   --with-gnome-libs=DIR   Specify location of GNOME libs
+@@ -1585,11 +1592,11 @@ fi
  
- #ifdef FEAT_SYN_HL
-@@ -16635,14 +16693,13 @@ f_synIDtrans(argvars, rettv)
- }
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+   cat <<\_ACEOF
+ configure
+-generated by GNU Autoconf 2.62
++generated by GNU Autoconf 2.63
  
- /*
-  * "synstack(lnum, col)" function
-  */
--/*ARGSUSED*/
-     static void
- f_synstack(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_SYN_HL
-     long      lnum;
-     long      col;
-@@ -16656,11 +16713,11 @@ f_synstack(argvars, rettv)
- #ifdef FEAT_SYN_HL
-     lnum = get_tv_lnum(argvars);              /* -1 on type error */
-     col = get_tv_number(&argvars[1]) - 1;     /* -1 on type error */
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+ This configure script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it.
+@@ -1599,11 +1606,11 @@ fi
+ cat >auto/config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
  
-     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
--          && col >= 0 && col < (long)STRLEN(ml_get(lnum))
-+          && col >= 0 && (col == 0 || col < (long)STRLEN(ml_get(lnum)))
-           && rettv_list_alloc(rettv) != FAIL)
-     {
-       (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE);
-       for (i = 0; ; ++i)
-       {
-@@ -16772,19 +16829,16 @@ done:
- }
+ It was created by $as_me, which was
+-generated by GNU Autoconf 2.62.  Invocation command line was
++generated by GNU Autoconf 2.63.  Invocation command line was
  
- /*
-  * "tabpagebuflist()" function
-  */
--/* ARGSUSED */
-     static void
- f_tabpagebuflist(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
--#ifndef FEAT_WINDOWS
--    rettv->vval.v_number = 0;
--#else
-+#ifdef FEAT_WINDOWS
-     tabpage_T *tp;
-     win_T     *wp = NULL;
+   $ $0 $@
  
-     if (argvars[0].v_type == VAR_UNKNOWN)
-       wp = firstwin;
-@@ -16792,35 +16846,27 @@ f_tabpagebuflist(argvars, rettv)
-     {
-       tp = find_tabpage((int)get_tv_number(&argvars[0]));
-       if (tp != NULL)
-           wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
-     }
--    if (wp == NULL)
--      rettv->vval.v_number = 0;
--    else
-+    if (wp != NULL && rettv_list_alloc(rettv) != FAIL)
-     {
--      if (rettv_list_alloc(rettv) == FAIL)
--          rettv->vval.v_number = 0;
--      else
--      {
--          for (; wp != NULL; wp = wp->w_next)
--              if (list_append_number(rettv->vval.v_list,
-+      for (; wp != NULL; wp = wp->w_next)
-+          if (list_append_number(rettv->vval.v_list,
-                                               wp->w_buffer->b_fnum) == FAIL)
--                  break;
--      }
-+              break;
-     }
- #endif
- }
+ _ACEOF
+ exec 5>>auto/config.log
+@@ -1722,12 +1729,12 @@ _ASBOX
+   for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+     eval ac_val=\$$ac_var
+     case $ac_val in #(
+     *${as_nl}*)
+       case $ac_var in #(
+-      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+-$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
++      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+       esac
+       case $ac_var in #(
+       _ | IFS | as_nl) ;; #(
+       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+       *) $as_unset $ac_var ;;
+@@ -1926,10 +1933,12 @@ $as_echo "$as_me:   current value: \`$ac
+       *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+     esac
+   fi
+ done
+ if $ac_cache_corrupted; then
++  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+   { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+ $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+   { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+ $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+    { (exit 1); exit 1; }; }
+@@ -2082,16 +2091,12 @@ fi
+   if test "x$ac_ct_CC" = x; then
+     CC=""
+   else
+     case $cross_compiling:$ac_tool_warned in
+ yes:)
+-{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+-whose name does not start with the host triplet.  If you think this
+-configuration is useful to you, please write to autoconf@gnu.org." >&5
+-$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+-whose name does not start with the host triplet.  If you think this
+-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ ac_tool_warned=yes ;;
+ esac
+     CC=$ac_ct_CC
+   fi
+ else
+@@ -2286,30 +2291,28 @@ done
+   if test "x$ac_ct_CC" = x; then
+     CC=""
+   else
+     case $cross_compiling:$ac_tool_warned in
+ yes:)
+-{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+-whose name does not start with the host triplet.  If you think this
+-configuration is useful to you, please write to autoconf@gnu.org." >&5
+-$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+-whose name does not start with the host triplet.  If you think this
+-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ ac_tool_warned=yes ;;
+ esac
+     CC=$ac_ct_CC
+   fi
+ fi
  
+ fi
  
- /*
-  * "tabpagenr()" function
-  */
--/* ARGSUSED */
-     static void
- f_tabpagenr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     int               nr = 1;
- #ifdef FEAT_WINDOWS
-     char_u    *arg;
-@@ -16898,14 +16944,13 @@ get_winnr(tp, argvar)
- #endif
  
- /*
-  * "tabpagewinnr()" function
-  */
--/* ARGSUSED */
-     static void
- f_tabpagewinnr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     int               nr = 1;
- #ifdef FEAT_WINDOWS
-     tabpage_T *tp;
-@@ -16921,25 +16966,21 @@ f_tabpagewinnr(argvars, rettv)
+-test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
++test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+ See \`config.log' for more details." >&5
+ $as_echo "$as_me: error: no acceptable C compiler found in \$PATH
+ See \`config.log' for more details." >&2;}
+-   { (exit 1); exit 1; }; }
++   { (exit 1); exit 1; }; }; }
  
+ # Provide some information about the compiler.
+ $as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+ set X $ac_compile
+ ac_compiler=$2
+@@ -2435,15 +2438,17 @@ fi
+ $as_echo "$ac_file" >&6; }
+ if test -z "$ac_file"; then
+   $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
- /*
-  * "tagfiles()" function
-  */
--/*ARGSUSED*/
-     static void
- f_tagfiles(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     char_u    fname[MAXPATHL + 1];
-     tagname_T tn;
-     int               first;
++{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
+ See \`config.log' for more details." >&5
+ $as_echo "$as_me: error: C compiler cannot create executables
+ See \`config.log' for more details." >&2;}
+-   { (exit 77); exit 77; }; }
++   { (exit 77); exit 77; }; }; }
+ fi
  
-     if (rettv_list_alloc(rettv) == FAIL)
--    {
--      rettv->vval.v_number = 0;
-       return;
--    }
+ ac_exeext=$ac_cv_exeext
  
-     for (first = TRUE; ; first = FALSE)
-       if (get_tagfname(&tn, first, fname) == FAIL
-               || list_append_string(rettv->vval.v_list, fname, -1) == FAIL)
-           break;
-@@ -16967,14 +17008,13 @@ f_taglist(argvars, rettv)
- }
+ # Check that the compiler produces executables we can run.  If not, either
+@@ -2467,17 +2472,19 @@ $as_echo "$ac_try_echo") >&5
+     cross_compiling=no
+   else
+     if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+     else
+-      { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
++      { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
+ If you meant to cross compile, use \`--host'.
+ See \`config.log' for more details." >&5
+ $as_echo "$as_me: error: cannot run C compiled programs.
+ If you meant to cross compile, use \`--host'.
+ See \`config.log' for more details." >&2;}
+-   { (exit 1); exit 1; }; }
++   { (exit 1); exit 1; }; }; }
+     fi
+   fi
+ fi
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+ $as_echo "yes" >&6; }
+@@ -2516,15 +2523,17 @@ for ac_file in conftest.exe conftest con
+         break;;
+     * ) break;;
+   esac
+ done
+ else
+-  { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
++  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+ See \`config.log' for more details." >&5
+ $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+ See \`config.log' for more details." >&2;}
+-   { (exit 1); exit 1; }; }
++   { (exit 1); exit 1; }; }; }
+ fi
  
- /*
-  * "tempname()" function
-  */
--/*ARGSUSED*/
-     static void
- f_tempname(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     static int        x = 'A';
+ rm -f conftest$ac_cv_exeext
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+ $as_echo "$ac_cv_exeext" >&6; }
+@@ -2574,15 +2583,17 @@ $as_echo "$ac_try_echo") >&5
+ done
+ else
+   $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
-     rettv->v_type = VAR_STRING;
-@@ -17003,15 +17043,14 @@ f_tempname(argvars, rettv)
- }
++{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+ See \`config.log' for more details." >&5
+ $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
+ See \`config.log' for more details." >&2;}
+-   { (exit 1); exit 1; }; }
++   { (exit 1); exit 1; }; }; }
+ fi
  
- /*
-  * "test(list)" function: Just checking the walls...
-  */
--/*ARGSUSED*/
-     static void
- f_test(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
-     /* Used for unit testing.  Change the code below to your liking. */
- #if 0
-     listitem_T        *li;
-     list_T    *l;
-@@ -17292,15 +17331,14 @@ f_virtcol(argvars, rettv)
- }
+ rm -f conftest.$ac_cv_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+@@ -3146,15 +3157,17 @@ done
+ # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+ rm -f conftest.err conftest.$ac_ext
+ if $ac_preproc_ok; then
+   :
+ else
+-  { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
++  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+ See \`config.log' for more details." >&5
+ $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+ See \`config.log' for more details." >&2;}
+-   { (exit 1); exit 1; }; }
++   { (exit 1); exit 1; }; }; }
+ fi
  
- /*
-  * "visualmode()" function
-  */
--/*ARGSUSED*/
-     static void
- f_visualmode(argvars, rettv)
--    typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *argvars UNUSED;
-+    typval_T  *rettv UNUSED;
- {
- #ifdef FEAT_VISUAL
-     char_u    str[2];
+ ac_ext=c
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+@@ -3821,17 +3834,82 @@ else
+   MACARCH="current"; { $as_echo "$as_me:$LINENO: result: defaulting to $MACARCH" >&5
+ $as_echo "defaulting to $MACARCH" >&6; }
+ fi
  
-     rettv->v_type = VAR_STRING;
-@@ -17309,12 +17347,10 @@ f_visualmode(argvars, rettv)
-     rettv->vval.v_string = vim_strsave(str);
  
-     /* A non-zero number or non-empty string argument: reset mode. */
-     if (non_zero_arg(&argvars[0]))
-       curbuf->b_visual_mode_eval = NUL;
--#else
--    rettv->vval.v_number = 0; /* return anything, it won't work anyway */
- #endif
- }
++  { $as_echo "$as_me:$LINENO: checking --with-developer-dir argument" >&5
++$as_echo_n "checking --with-developer-dir argument... " >&6; }
++
++# Check whether --with-developer-dir was given.
++if test "${with_developer_dir+set}" = set; then
++  withval=$with_developer_dir; DEVELOPER_DIR="$withval"; { $as_echo "$as_me:$LINENO: result: $DEVELOPER_DIR" >&5
++$as_echo "$DEVELOPER_DIR" >&6; }
++else
++  DEVELOPER_DIR=""; { $as_echo "$as_me:$LINENO: result: not present" >&5
++$as_echo "not present" >&6; }
++fi
++
++
++  if test "x$DEVELOPER_DIR" = "x"; then
++    # Extract the first word of "xcode-select", so it can be a program name with args.
++set dummy xcode-select; ac_word=$2
++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if test "${ac_cv_path_XCODE_SELECT+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  case $XCODE_SELECT in
++  [\\/]* | ?:[\\/]*)
++  ac_cv_path_XCODE_SELECT="$XCODE_SELECT" # Let the user override the test with a path.
++  ;;
++  *)
++  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++    ac_cv_path_XCODE_SELECT="$as_dir/$ac_word$ac_exec_ext"
++    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++IFS=$as_save_IFS
++
++  ;;
++esac
++fi
++XCODE_SELECT=$ac_cv_path_XCODE_SELECT
++if test -n "$XCODE_SELECT"; then
++  { $as_echo "$as_me:$LINENO: result: $XCODE_SELECT" >&5
++$as_echo "$XCODE_SELECT" >&6; }
++else
++  { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++    if test "x$XCODE_SELECT" != "x"; then
++      { $as_echo "$as_me:$LINENO: checking for developer dir using xcode-select" >&5
++$as_echo_n "checking for developer dir using xcode-select... " >&6; }
++      DEVELOPER_DIR=`$XCODE_SELECT -print-path`
++      { $as_echo "$as_me:$LINENO: result: $DEVELOPER_DIR" >&5
++$as_echo "$DEVELOPER_DIR" >&6; }
++    else
++      DEVELOPER_DIR=/Developer
++    fi
++  fi
++
+   if test "x$MACARCH" = "xboth"; then
+     { $as_echo "$as_me:$LINENO: checking for 10.4 universal SDK" >&5
+ $as_echo_n "checking for 10.4 universal SDK... " >&6; }
+                             save_cppflags="$CPPFLAGS"
+     save_cflags="$CFLAGS"
+     save_ldflags="$LDFLAGS"
+-    CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
++    CFLAGS="$CFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
+     cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+ _ACEOF
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+@@ -3948,13 +4026,13 @@ rm -f core conftest.err conftest.$ac_obj
+     MACOSX=yes
+     OS_EXTRA_SRC="os_macosx.c os_mac_conv.c";
+     OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
+         CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
+     if test "x$MACARCH" = "xboth"; then
+-      CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
++      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
+     else
+-      CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon"
++      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
+     fi
  
- /*
-  * "winbufnr(nr)" function
-@@ -17334,14 +17370,13 @@ f_winbufnr(argvars, rettv)
- }
+                 # On IRIX 5.3, sys/types and inttypes.h are conflicting.
  
- /*
-  * "wincol()" function
-  */
--/*ARGSUSED*/
-     static void
- f_wincol(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     validate_cursor();
-     rettv->vval.v_number = curwin->w_wcol + 1;
- }
-@@ -17364,27 +17399,25 @@ f_winheight(argvars, rettv)
- }
  
- /*
-  * "winline()" function
-  */
--/*ARGSUSED*/
-     static void
- f_winline(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     validate_cursor();
-     rettv->vval.v_number = curwin->w_wrow + 1;
- }
+@@ -4014,12 +4092,13 @@ rm -f core conftest.err conftest.$ac_obj
+ fi
+ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
- /*
-  * "winnr()" function
-  */
--/* ARGSUSED */
-     static void
- f_winnr(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     int               nr = 1;
+ fi
+@@ -4152,11 +4231,11 @@ else
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_header_Carbon_Carbon_h" >&5
+ $as_echo "$ac_cv_header_Carbon_Carbon_h" >&6; }
  
- #ifdef FEAT_WINDOWS
-@@ -17394,14 +17427,13 @@ f_winnr(argvars, rettv)
- }
+ fi
+-if test $ac_cv_header_Carbon_Carbon_h = yes; then
++if test "x$ac_cv_header_Carbon_Carbon_h" = x""yes; then
+   CARBON=yes
+ fi
  
- /*
-  * "winrestcmd()" function
-  */
--/* ARGSUSED */
-     static void
- f_winrestcmd(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
- #ifdef FEAT_WINDOWS
-     win_T     *wp;
-     int               winnr = 1;
-@@ -17429,15 +17461,14 @@ f_winrestcmd(argvars, rettv)
- }
- /*
-  * "winrestview()" function
-  */
--/* ARGSUSED */
-     static void
- f_winrestview(argvars, rettv)
-     typval_T  *argvars;
--    typval_T  *rettv;
-+    typval_T  *rettv UNUSED;
- {
-     dict_T    *dict;
-     if (argvars[0].v_type != VAR_DICT
-           || (dict = argvars[0].vval.v_dict) == NULL)
-@@ -17475,14 +17506,13 @@ f_winrestview(argvars, rettv)
- }
  
- /*
-  * "winsaveview()" function
-  */
--/* ARGSUSED */
-     static void
- f_winsaveview(argvars, rettv)
--    typval_T  *argvars;
-+    typval_T  *argvars UNUSED;
-     typval_T  *rettv;
- {
-     dict_T    *dict;
+     if test "x$CARBON" = "xyes"; then
+@@ -4482,11 +4561,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_selinux_is_selinux_enabled" >&5
+ $as_echo "$ac_cv_lib_selinux_is_selinux_enabled" >&6; }
+-if test $ac_cv_lib_selinux_is_selinux_enabled = yes; then
++if test "x$ac_cv_lib_selinux_is_selinux_enabled" = x""yes; then
+   LIBS="$LIBS -lselinux"
+          cat >>confdefs.h <<\_ACEOF
+ #define HAVE_SELINUX 1
+ _ACEOF
  
-     dict = dict_alloc();
-@@ -18095,18 +18125,57 @@ get_vim_var_str(idx)
- {
-     return get_tv_string(&vimvars[idx].vv_tv);
- }
+@@ -4632,12 +4711,12 @@ $as_echo_n "checking PLTHOME environment
+     if test "X$PLTHOME" != "X"; then
+       { $as_echo "$as_me:$LINENO: result: \"$PLTHOME\"" >&5
+ $as_echo "\"$PLTHOME\"" >&6; }
+       vi_cv_path_mzscheme_pfx="$PLTHOME"
+     else
+-      { $as_echo "$as_me:$LINENO: result: \"not set\"" >&5
+-$as_echo "\"not set\"" >&6; }
++      { $as_echo "$as_me:$LINENO: result: not set" >&5
++$as_echo "not set" >&6; }
+               # Extract the first word of "mzscheme", so it can be a program name with args.
+ set dummy mzscheme; ac_word=$2
+ { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+ if test "${ac_cv_path_vi_cv_path_mzscheme+set}" = set; then
+@@ -4688,66 +4767,90 @@ fi
+                   { $as_echo "$as_me:$LINENO: checking MzScheme install prefix" >&5
+ $as_echo_n "checking MzScheme install prefix... " >&6; }
+ if test "${vi_cv_path_mzscheme_pfx+set}" = set; then
+   $as_echo_n "(cached) " >&6
+ else
+-   vi_cv_path_mzscheme_pfx=`
+-          ${vi_cv_path_mzscheme} -evm \
+-          "(display (simplify-path            \
++                  echo "(display (simplify-path               \
+              (build-path (call-with-values    \
+               (lambda () (split-path (find-system-path (quote exec-file)))) \
+-              (lambda (base name must-be-dir?) base)) (quote up))))"`
++              (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
++                   vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
++              sed -e 's+/$++'`
+ fi
+ { $as_echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme_pfx" >&5
+ $as_echo "$vi_cv_path_mzscheme_pfx" >&6; }
+-                  vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
++          rm -f mzdirs.scm
+       fi
+     fi
+   fi
  
- /*
-- * Set v:count, v:count1 and v:prevcount.
-+ * Get List v: variable value.  Caller must take care of reference count when
-+ * needed.
-+ */
-+    list_T *
-+get_vim_var_list(idx)
-+    int               idx;
-+{
-+    return vimvars[idx].vv_list;
-+}
-+
-+/*
-+ * Set v:char to character "c".
-  */
-     void
--set_vcount(count, count1)
-+set_vim_var_char(c)
-+    int c;
-+{
-+#ifdef FEAT_MBYTE
-+    char_u    buf[MB_MAXBYTES];
-+#else
-+    char_u    buf[2];
-+#endif
-+
-+#ifdef FEAT_MBYTE
-+    if (has_mbyte)
-+      buf[(*mb_char2bytes)(c, buf)] = NUL;
-+    else
-+#endif
-+    {
-+      buf[0] = c;
-+      buf[1] = NUL;
-+    }
-+    set_vim_var_string(VV_CHAR, buf, -1);
-+}
-+
-+/*
-+ * Set v:count to "count" and v:count1 to "count1".
-+ * When "set_prevcount" is TRUE first set v:prevcount from v:count.
-+ */
-+    void
-+set_vcount(count, count1, set_prevcount)
-     long      count;
-     long      count1;
-+    int               set_prevcount;
- {
--    vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
-+    if (set_prevcount)
-+      vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
-     vimvars[VV_COUNT].vv_nr = count;
-     vimvars[VV_COUNT1].vv_nr = count1;
- }
+   SCHEME_INC=
+   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+     { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include" >&5
+ $as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include... " >&6; }
+     if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
+-      { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
+-$as_echo "\"yes\"" >&6; }
++      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
++      { $as_echo "$as_me:$LINENO: result: yes" >&5
++$as_echo "yes" >&6; }
+     else
+-      { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
+-$as_echo "\"no\"" >&6; }
+-      { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include" >&5
+-$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include... " >&6; }
++      { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++      { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt" >&5
++$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt... " >&6; }
+       if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
+-      { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
+-$as_echo "\"yes\"" >&6; }
+-      SCHEME_INC=/plt
++      { $as_echo "$as_me:$LINENO: result: yes" >&5
++$as_echo "yes" >&6; }
++      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
+       else
+-      { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
+-$as_echo "\"no\"" >&6; }
+-      vi_cv_path_mzscheme_pfx=
++      { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++      { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in /usr/include/plt/" >&5
++$as_echo_n "checking if scheme.h can be found in /usr/include/plt/... " >&6; }
++      if test -f /usr/include/plt/scheme.h; then
++        { $as_echo "$as_me:$LINENO: result: yes" >&5
++$as_echo "yes" >&6; }
++        SCHEME_INC=/usr/include/plt
++      else
++        { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++        vi_cv_path_mzscheme_pfx=
++      fi
+       fi
+     fi
+   fi
  
- /*
-@@ -18130,10 +18199,24 @@ set_vim_var_string(idx, val, len)
+   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+     if test "x$MACOSX" = "xyes"; then
+       MZSCHEME_LIBS="-framework PLT_MzScheme"
++    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
++      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
++      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+     elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
+       MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
      else
-       vimvars[idx].vv_str = vim_strnsave(val, len);
- }
+-      MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
++            if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
++        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
++      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
++      else
++        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
++      fi
+       if test "$GCC" = yes; then
+-                      MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
++                      MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+       elif test "`(uname) 2>/dev/null`" = SunOS &&
+                              uname -r | grep '^5' >/dev/null; then
+-      MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
++      MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
+       fi
+     fi
+     if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
+       SCHEME_COLLECTS=lib/plt/
+     fi
+-    MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC}   \
++    if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
++            MZSCHEME_EXTRA="mzscheme_base.c"
++      MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
++      MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
++    fi
++    MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
+       -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
+     MZSCHEME_SRC="if_mzsch.c"
+     MZSCHEME_OBJ="objects/if_mzsch.o"
+     MZSCHEME_PRO="if_mzsch.pro"
+     cat >>confdefs.h <<\_ACEOF
+@@ -4758,10 +4861,12 @@ _ACEOF
  
- /*
-+ * Set List v: variable to "val".
-+ */
-+    void
-+set_vim_var_list(idx, val)
-+    int               idx;
-+    list_T    *val;
-+{
-+    list_unref(vimvars[idx].vv_list);
-+    vimvars[idx].vv_list = val;
-+    if (val != NULL)
-+      ++val->lv_refcount;
-+}
-+
-+/*
-  * Set v:register if needed.
-  */
-     void
- set_reg_var(c)
-     int               c;
-@@ -18866,11 +18949,12 @@ new_script_vars(id)
- init_var_dict(dict, dict_var)
-     dict_T    *dict;
-     dictitem_T        *dict_var;
- {
-     hash_init(&dict->dv_hashtab);
--    dict->dv_refcount = 99999;
-+    dict->dv_refcount = DO_NOT_FREE_CNT;
-+    dict->dv_copyID = 0;
-     dict_var->di_tv.vval.v_dict = dict;
-     dict_var->di_tv.v_type = VAR_DICT;
-     dict_var->di_tv.v_lock = VAR_FIXED;
-     dict_var->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
-     dict_var->di_key[0] = NUL;
-@@ -18949,11 +19033,12 @@ list_one_var(v, prefix, first)
- {
-     char_u    *tofree;
-     char_u    *s;
-     char_u    numbuf[NUMBUFLEN];
  
--    s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID);
-+    current_copyID += COPYID_INC;
-+    s = echo_string(&v->di_tv, &tofree, numbuf, current_copyID);
-     list_one_var_a(prefix, v->di_key, v->di_tv.v_type,
-                                        s == NULL ? (char_u *)"" : s, first);
-     vim_free(tofree);
- }
  
-@@ -19203,12 +19288,14 @@ tv_check_lock(lock, name)
  
- /*
-  * Copy the values from typval_T "from" to typval_T "to".
-  * When needed allocates string or increases reference count.
-  * Does not make a copy of a list or dict but copies the reference!
-+ * It is OK for "from" and "to" to point to the same item.  This is used to
-+ * make a copy later.
-  */
--    static void
-+    void
- copy_tv(from, to)
-     typval_T *from;
-     typval_T *to;
- {
-     to->v_type = from->v_type;
-@@ -19382,11 +19469,12 @@ ex_echo(eap)
-               if (eap->cmdidx == CMD_echo)
-                   msg_start();
-           }
-           else if (eap->cmdidx == CMD_echo)
-               msg_puts_attr((char_u *)" ", echo_attr);
--          p = echo_string(&rettv, &tofree, numbuf, ++current_copyID);
-+          current_copyID += COPYID_INC;
-+          p = echo_string(&rettv, &tofree, numbuf, current_copyID);
-           if (p != NULL)
-               for ( ; *p != NUL && !got_int; ++p)
-               {
-                   if (*p == '\n' || *p == '\r' || *p == TAB)
-                   {
-@@ -19658,10 +19746,11 @@ ex_function(eap)
-                       if (!isdigit(*fp->uf_name)
-                                   && vim_regexec(&regmatch, fp->uf_name, 0))
-                           list_func_head(fp, FALSE);
-                   }
-               }
-+              vim_free(regmatch.regprog);
-           }
-       }
-       if (*p == '/')
-           ++p;
-       eap->nextcmd = check_nextcmd(p);
-@@ -19746,11 +19835,11 @@ ex_function(eap)
-                   msg_putchar('\n');
-                   msg_puts((char_u *)"   endfunction");
-               }
-           }
-           else
--              emsg_funcname("E123: Undefined function: %s", name);
-+              emsg_funcname(N_("E123: Undefined function: %s"), name);
-       }
-       goto ret_free;
-     }
  
-     /*
-@@ -19790,11 +19879,11 @@ ex_function(eap)
-               j = 0;
-           while (arg[j] != NUL && (j == 0 ? eval_isnamec1(arg[j])
-                                                     : eval_isnamec(arg[j])))
-               ++j;
-           if (arg[j] != NUL)
--              emsg_funcname(_(e_invarg2), arg);
-+              emsg_funcname((char *)e_invarg2, arg);
-       }
-     }
++
++
+ fi
  
-     /*
-      * Isolate the arguments: "arg1, arg2, ...)"
-@@ -20062,11 +20151,11 @@ ex_function(eap)
-     if (fudi.fd_dict == NULL)
-     {
-       v = find_var(name, &ht);
-       if (v != NULL && v->di_tv.v_type == VAR_FUNC)
-       {
--          emsg_funcname("E707: Function name conflicts with variable: %s",
-+          emsg_funcname(N_("E707: Function name conflicts with variable: %s"),
-                                                                       name);
-           goto erret;
-       }
  
-       fp = find_func(name);
-@@ -20077,11 +20166,11 @@ ex_function(eap)
-               emsg_funcname(e_funcexts, name);
-               goto erret;
-           }
-           if (fp->uf_calls > 0)
-           {
--              emsg_funcname("E127: Cannot redefine function %s: It is in use",
-+              emsg_funcname(N_("E127: Cannot redefine function %s: It is in use"),
-                                                                       name);
-               goto erret;
-           }
-           /* redefine existing function */
-           ga_clear_strings(&(fp->uf_args));
-@@ -20588,10 +20677,13 @@ func_dump_profile(fd)
-     int               i;
-     ufunc_T   **sorttab;
-     int               st_len = 0;
+ { $as_echo "$as_me:$LINENO: checking --enable-perlinterp argument" >&5
+ $as_echo_n "checking --enable-perlinterp argument... " >&6; }
+@@ -5089,11 +5194,11 @@ if test "${vi_cv_path_python_conf+set}"
+   $as_echo_n "(cached) " >&6
+ else
  
-     todo = (int)func_hashtab.ht_used;
-+    if (todo == 0)
-+      return;     /* nothing to dump */
+       vi_cv_path_python_conf=
+       for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do
+-        for subdir in lib share; do
++        for subdir in lib64 lib share; do
+           d="${path}/${subdir}/python${vi_cv_var_python_version}/config"
+           if test -d "$d" && test -f "$d/config.c"; then
+             vi_cv_path_python_conf="$d"
+           fi
+         done
+@@ -5666,13 +5771,25 @@ else
+ fi
+ { $as_echo "$as_me:$LINENO: result: $enable_rubyinterp" >&5
+ $as_echo "$enable_rubyinterp" >&6; }
+ if test "$enable_rubyinterp" = "yes"; then
++  { $as_echo "$as_me:$LINENO: checking --with-ruby-command argument" >&5
++$as_echo_n "checking --with-ruby-command argument... " >&6; }
 +
-     sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo));
++# Check whether --with-ruby-command was given.
++if test "${with_ruby_command+set}" = set; then
++  withval=$with_ruby_command; RUBY_CMD="$withval"; { $as_echo "$as_me:$LINENO: result: $RUBY_CMD" >&5
++$as_echo "$RUBY_CMD" >&6; }
++else
++  RUBY_CMD="ruby"; { $as_echo "$as_me:$LINENO: result: defaulting to $RUBY_CMD" >&5
++$as_echo "defaulting to $RUBY_CMD" >&6; }
++fi
  
-     for (hi = func_hashtab.ht_array; todo > 0; ++hi)
-     {
-       if (!HASHITEM_EMPTY(hi))
-@@ -20636,10 +20728,12 @@ func_dump_profile(fd)
-       prof_sort_list(fd, sorttab, st_len, "TOTAL", FALSE);
-       qsort((void *)sorttab, (size_t)st_len, sizeof(ufunc_T *),
-                                                             prof_self_cmp);
-       prof_sort_list(fd, sorttab, st_len, "SELF", TRUE);
-     }
+-  # Extract the first word of "ruby", so it can be a program name with args.
+-set dummy ruby; ac_word=$2
 +
-+    vim_free(sorttab);
- }
++  # Extract the first word of "$RUBY_CMD", so it can be a program name with args.
++set dummy $RUBY_CMD; ac_word=$2
+ { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+ if test "${ac_cv_path_vi_cv_path_ruby+set}" = set; then
+   $as_echo_n "(cached) " >&6
+ else
+@@ -5715,15 +5832,21 @@ $as_echo_n "checking Ruby version... " >
+     if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
+       { $as_echo "$as_me:$LINENO: result: OK" >&5
+ $as_echo "OK" >&6; }
+       { $as_echo "$as_me:$LINENO: checking Ruby header files" >&5
+ $as_echo_n "checking Ruby header files... " >&6; }
+-      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
++      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["rubyhdrdir"] || Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
+       if test "X$rubyhdrdir" != "X"; then
+       { $as_echo "$as_me:$LINENO: result: $rubyhdrdir" >&5
+ $as_echo "$rubyhdrdir" >&6; }
+       RUBY_CFLAGS="-I$rubyhdrdir"
++        rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["arch"]'`
++        if test -d "$rubyhdrdir/$rubyarch"; then
++          RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
++        fi
++        rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["ruby_version"].gsub(/\./, "")[0,2]'`
++        RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
+       rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LIBS"]'`
+       if test "X$rubylibs" != "X"; then
+         RUBY_LIBS="$rubylibs"
+       fi
+       librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG["LIBRUBYARG"])'`
+@@ -5743,22 +5866,25 @@ $as_echo "$rubyhdrdir" >&6; }
+       if test "X$librubyarg" != "X"; then
+         RUBY_LIBS="$librubyarg $RUBY_LIBS"
+       fi
+       rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LDFLAGS"]'`
+       if test "X$rubyldflags" != "X"; then
+-        LDFLAGS="$rubyldflags $LDFLAGS"
++                                rubyldflags=`echo "$rubyldflags" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//'`
++        if test "X$rubyldflags" != "X"; then
++          LDFLAGS="$rubyldflags $LDFLAGS"
++        fi
+       fi
+       RUBY_SRC="if_ruby.c"
+       RUBY_OBJ="objects/if_ruby.o"
+       RUBY_PRO="if_ruby.pro"
+       cat >>confdefs.h <<\_ACEOF
+ #define FEAT_RUBY 1
+ _ACEOF
  
-     static void
- prof_sort_list(fd, sorttab, st_len, title, prefer_self)
-     FILE      *fd;
-@@ -21010,11 +21104,11 @@ call_user_func(fp, argcount, argvars, re
-     dict_T    *selfdict;      /* Dictionary for "self" */
- {
-     char_u    *save_sourcing_name;
-     linenr_T  save_sourcing_lnum;
-     scid_T    save_current_SID;
--    funccall_T        fc;
-+    funccall_T        *fc;
-     int               save_did_emsg;
-     static int        depth = 0;
-     dictitem_T        *v;
-     int               fixvar_idx = 0; /* index in fixvar[] */
-     int               i;
-@@ -21036,40 +21130,41 @@ call_user_func(fp, argcount, argvars, re
-     }
-     ++depth;
+       else
+-      { $as_echo "$as_me:$LINENO: result: not found" >&5
+-$as_echo "not found" >&6; }
++      { $as_echo "$as_me:$LINENO: result: not found; disabling Ruby" >&5
++$as_echo "not found; disabling Ruby" >&6; }
+       fi
+     else
+       { $as_echo "$as_me:$LINENO: result: too old; need Ruby version 1.6.0 or later" >&5
+ $as_echo "too old; need Ruby version 1.6.0 or later" >&6; }
+     fi
+@@ -5889,11 +6015,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5
+ $as_echo "$ac_cv_lib_socket_socket" >&6; }
+-if test $ac_cv_lib_socket_socket = yes; then
++if test "x$ac_cv_lib_socket_socket" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBSOCKET 1
+ _ACEOF
  
-     line_breakcheck();                /* check for CTRL-C hit */
+   LIBS="-lsocket $LIBS"
+@@ -5964,11 +6090,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
+ $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
+-if test $ac_cv_lib_nsl_gethostbyname = yes; then
++if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBNSL 1
+ _ACEOF
  
--    fc.caller = current_funccal;
--    current_funccal = &fc;
--    fc.func = fp;
--    fc.rettv = rettv;
-+    fc = (funccall_T *)alloc(sizeof(funccall_T));
-+    fc->caller = current_funccal;
-+    current_funccal = fc;
-+    fc->func = fp;
-+    fc->rettv = rettv;
-     rettv->vval.v_number = 0;
--    fc.linenr = 0;
--    fc.returned = FALSE;
--    fc.level = ex_nesting_level;
-+    fc->linenr = 0;
-+    fc->returned = FALSE;
-+    fc->level = ex_nesting_level;
-     /* Check if this function has a breakpoint. */
--    fc.breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
--    fc.dbg_tick = debug_tick;
-+    fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
-+    fc->dbg_tick = debug_tick;
+   LIBS="-lnsl $LIBS"
+@@ -6201,12 +6327,12 @@ fi
+ if test "x$with_x" = xno; then
+   # The user explicitly disabled X.
+   have_x=disabled
+ else
+   case $x_includes,$x_libraries in #(
+-    *\'*) { { $as_echo "$as_me:$LINENO: error: Cannot use X directory names containing '" >&5
+-$as_echo "$as_me: error: Cannot use X directory names containing '" >&2;}
++    *\'*) { { $as_echo "$as_me:$LINENO: error: cannot use X directory names containing '" >&5
++$as_echo "$as_me: error: cannot use X directory names containing '" >&2;}
+    { (exit 1); exit 1; }; };; #(
+     *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then
+   $as_echo_n "(cached) " >&6
+ else
+   # One or both of the vars are not set, and there is no cached value.
+@@ -6240,11 +6366,11 @@ _ACEOF
+     case $ac_im_incroot in
+       /usr/include) ac_x_includes= ;;
+       *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+     esac
+     case $ac_im_usrlibdir in
+-      /usr/lib | /lib) ;;
++      /usr/lib | /usr/lib64 | /lib | /lib64) ;;
+       *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+     esac
+   fi
+   cd ..
+   rm -f -r conftest.dir
+@@ -6680,11 +6806,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+ $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
+-if test $ac_cv_lib_dnet_dnet_ntoa = yes; then
++if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+ fi
  
-     /*
--     * Note about using fc.fixvar[]: This is an array of FIXVAR_CNT variables
-+     * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables
-      * with names up to VAR_SHORT_LEN long.  This avoids having to alloc/free
-      * each argument variable and saves a lot of time.
-      */
-     /*
-      * Init l: variables.
-      */
--    init_var_dict(&fc.l_vars, &fc.l_vars_var);
-+    init_var_dict(&fc->l_vars, &fc->l_vars_var);
-     if (selfdict != NULL)
-     {
-       /* Set l:self to "selfdict".  Use "name" to avoid a warning from
-        * some compiler that checks the destination size. */
--      v = &fc.fixvar[fixvar_idx++].var;
-+      v = &fc->fixvar[fixvar_idx++].var;
-       name = v->di_key;
-       STRCPY(name, "self");
-       v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX;
--      hash_add(&fc.l_vars.dv_hashtab, DI2HIKEY(v));
-+      hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v));
-       v->di_tv.v_type = VAR_DICT;
-       v->di_tv.v_lock = 0;
-       v->di_tv.vval.v_dict = selfdict;
-       ++selfdict->dv_refcount;
-     }
-@@ -21077,32 +21172,35 @@ call_user_func(fp, argcount, argvars, re
-     /*
-      * Init a: variables.
-      * Set a:0 to "argcount".
-      * Set a:000 to a list with room for the "..." arguments.
-      */
--    init_var_dict(&fc.l_avars, &fc.l_avars_var);
--    add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0",
-+    init_var_dict(&fc->l_avars, &fc->l_avars_var);
-+    add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0",
-                               (varnumber_T)(argcount - fp->uf_args.ga_len));
--    v = &fc.fixvar[fixvar_idx++].var;
--    STRCPY(v->di_key, "000");
-+    /* Use "name" to avoid a warning from some compiler that checks the
-+     * destination size. */
-+    v = &fc->fixvar[fixvar_idx++].var;
-+    name = v->di_key;
-+    STRCPY(name, "000");
-     v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
--    hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
-+    hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
-     v->di_tv.v_type = VAR_LIST;
-     v->di_tv.v_lock = VAR_FIXED;
--    v->di_tv.vval.v_list = &fc.l_varlist;
--    vim_memset(&fc.l_varlist, 0, sizeof(list_T));
--    fc.l_varlist.lv_refcount = 99999;
--    fc.l_varlist.lv_lock = VAR_FIXED;
-+    v->di_tv.vval.v_list = &fc->l_varlist;
-+    vim_memset(&fc->l_varlist, 0, sizeof(list_T));
-+    fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT;
-+    fc->l_varlist.lv_lock = VAR_FIXED;
+     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+       { $as_echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5
+@@ -6750,11 +6876,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+ $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
+-if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then
++if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+ fi
  
-     /*
-      * Set a:firstline to "firstline" and a:lastline to "lastline".
-      * Set a:name to named arguments.
-      * Set a:N to the "..." arguments.
-      */
--    add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "firstline",
-+    add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline",
-                                                     (varnumber_T)firstline);
--    add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "lastline",
-+    add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline",
-                                                      (varnumber_T)lastline);
-     for (i = 0; i < argcount; ++i)
-     {
-       ai = i - fp->uf_args.ga_len;
-       if (ai < 0)
-@@ -21114,11 +21212,11 @@ call_user_func(fp, argcount, argvars, re
-           sprintf((char *)numbuf, "%d", ai + 1);
-           name = numbuf;
-       }
-       if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN)
-       {
--          v = &fc.fixvar[fixvar_idx++].var;
-+          v = &fc->fixvar[fixvar_idx++].var;
-           v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
-       }
-       else
-       {
-           v = (dictitem_T *)alloc((unsigned)(sizeof(dictitem_T)
-@@ -21126,22 +21224,22 @@ call_user_func(fp, argcount, argvars, re
-           if (v == NULL)
-               break;
-           v->di_flags = DI_FLAGS_RO;
-       }
-       STRCPY(v->di_key, name);
--      hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
-+      hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
+     fi
+ fi
+@@ -6922,11 +7048,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
+ $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
+-if test $ac_cv_lib_nsl_gethostbyname = yes; then
++if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+ fi
  
-       /* Note: the values are copied directly to avoid alloc/free.
-        * "argvars" must have VAR_FIXED for v_lock. */
-       v->di_tv = argvars[i];
-       v->di_tv.v_lock = VAR_FIXED;
+       if test $ac_cv_lib_nsl_gethostbyname = no; then
+       { $as_echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5
+@@ -6992,11 +7118,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5
+ $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
+-if test $ac_cv_lib_bsd_gethostbyname = yes; then
++if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+ fi
  
-       if (ai >= 0 && ai < MAX_FUNC_ARGS)
-       {
--          list_append(&fc.l_varlist, &fc.l_listitems[ai]);
--          fc.l_listitems[ai].li_tv = argvars[i];
--          fc.l_listitems[ai].li_tv.v_lock = VAR_FIXED;
-+          list_append(&fc->l_varlist, &fc->l_listitems[ai]);
-+          fc->l_listitems[ai].li_tv = argvars[i];
-+          fc->l_listitems[ai].li_tv.v_lock = VAR_FIXED;
-       }
-     }
+       fi
+     fi
+@@ -7158,11 +7284,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
+ $as_echo "$ac_cv_lib_socket_connect" >&6; }
+-if test $ac_cv_lib_socket_connect = yes; then
++if test "x$ac_cv_lib_socket_connect" = x""yes; then
+   X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+ fi
  
-     /* Don't redraw while executing the function. */
-     ++RedrawingDisabled;
-@@ -21202,11 +21300,11 @@ call_user_func(fp, argcount, argvars, re
-     if (do_profiling == PROF_YES)
-     {
-       if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
-           func_do_profile(fp);
-       if (fp->uf_profiling
--                     || (fc.caller != NULL && &fc.caller->func->uf_profiling))
-+                  || (fc->caller != NULL && fc->caller->func->uf_profiling))
-       {
-           ++fp->uf_tm_count;
-           profile_start(&call_start);
-           profile_zero(&fp->uf_tm_children);
-       }
-@@ -21218,11 +21316,11 @@ call_user_func(fp, argcount, argvars, re
-     current_SID = fp->uf_script_ID;
-     save_did_emsg = did_emsg;
-     did_emsg = FALSE;
+     fi
  
-     /* call do_cmdline() to execute the lines */
--    do_cmdline(NULL, get_func_line, (void *)&fc,
-+    do_cmdline(NULL, get_func_line, (void *)fc,
-                                    DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
+@@ -7317,11 +7443,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5
+ $as_echo "$ac_cv_lib_posix_remove" >&6; }
+-if test $ac_cv_lib_posix_remove = yes; then
++if test "x$ac_cv_lib_posix_remove" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+ fi
  
-     --RedrawingDisabled;
+     fi
  
-     /* when the function was aborted because of an error, return -1 */
-@@ -21233,20 +21331,20 @@ call_user_func(fp, argcount, argvars, re
-       rettv->vval.v_number = -1;
-     }
+@@ -7476,11 +7602,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5
+ $as_echo "$ac_cv_lib_ipc_shmat" >&6; }
+-if test $ac_cv_lib_ipc_shmat = yes; then
++if test "x$ac_cv_lib_ipc_shmat" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+ fi
  
- #ifdef FEAT_PROFILE
-     if (do_profiling == PROF_YES && (fp->uf_profiling
--                  || (fc.caller != NULL && &fc.caller->func->uf_profiling)))
-+                  || (fc->caller != NULL && fc->caller->func->uf_profiling)))
-     {
-       profile_end(&call_start);
-       profile_sub_wait(&wait_start, &call_start);
-       profile_add(&fp->uf_tm_total, &call_start);
-       profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children);
--      if (fc.caller != NULL && &fc.caller->func->uf_profiling)
-+      if (fc->caller != NULL && fc->caller->func->uf_profiling)
-       {
--          profile_add(&fc.caller->func->uf_tm_children, &call_start);
--          profile_add(&fc.caller->func->uf_tml_children, &call_start);
-+          profile_add(&fc->caller->func->uf_tm_children, &call_start);
-+          profile_add(&fc->caller->func->uf_tml_children, &call_start);
-       }
-     }
- #endif
+     fi
+   fi
+@@ -7557,11 +7683,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+ $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
+-if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then
++if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then
+   X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+ fi
  
-     /* when being verbose, mention the return value */
-@@ -21255,24 +21353,24 @@ call_user_func(fp, argcount, argvars, re
-       ++no_wait_return;
-       verbose_enter_scroll();
+   LDFLAGS=$ac_save_LDFLAGS
  
-       if (aborting())
-           smsg((char_u *)_("%s aborted"), sourcing_name);
--      else if (fc.rettv->v_type == VAR_NUMBER)
-+      else if (fc->rettv->v_type == VAR_NUMBER)
-           smsg((char_u *)_("%s returning #%ld"), sourcing_name,
--                                             (long)fc.rettv->vval.v_number);
-+                                             (long)fc->rettv->vval.v_number);
-       else
-       {
-           char_u      buf[MSG_BUF_LEN];
-           char_u      numbuf2[NUMBUFLEN];
-           char_u      *tofree;
-           char_u      *s;
+@@ -7725,11 +7851,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&5
+ $as_echo "$ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&6; }
+-if test $ac_cv_lib_Xdmcp__XdmcpAuthDoIt = yes; then
++if test "x$ac_cv_lib_Xdmcp__XdmcpAuthDoIt" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -lXdmcp"
+ fi
  
-           /* The value may be very long.  Skip the middle part, so that we
-            * have some idea how it starts and ends. smsg() would always
-            * truncate it at the end. */
--          s = tv2string(fc.rettv, &tofree, numbuf2, 0);
-+          s = tv2string(fc->rettv, &tofree, numbuf2, 0);
-           if (s != NULL)
-           {
-               trunc_string(s, buf, MSG_BUF_CLEN);
-               smsg((char_u *)_("%s returning %s"), sourcing_name, buf);
-               vim_free(tofree);
-@@ -21304,18 +21402,88 @@ call_user_func(fp, argcount, argvars, re
-       verbose_leave_scroll();
-       --no_wait_return;
-     }
  
-     did_emsg |= save_did_emsg;
--    current_funccal = fc.caller;
-+    current_funccal = fc->caller;
-+    --depth;
+                     { $as_echo "$as_me:$LINENO: checking for IceOpenConnection in -lICE" >&5
+@@ -7795,11 +7921,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceOpenConnection" >&5
+ $as_echo "$ac_cv_lib_ICE_IceOpenConnection" >&6; }
+-if test $ac_cv_lib_ICE_IceOpenConnection = yes; then
++if test "x$ac_cv_lib_ICE_IceOpenConnection" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -lSM -lICE"
+ fi
  
--    /* The a: variables typevals were not allocated, only free the allocated
--     * variables. */
--    vars_clear_ext(&fc.l_avars.dv_hashtab, FALSE);
-+    /* If the a:000 list and the l: and a: dicts are not referenced we can
-+     * free the funccall_T and what's in it. */
-+    if (fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT
-+          && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT
-+          && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT)
-+    {
-+      free_funccal(fc, FALSE);
-+    }
-+    else
-+    {
-+      hashitem_T      *hi;
-+      listitem_T      *li;
-+      int             todo;
  
--    vars_clear(&fc.l_vars.dv_hashtab);                /* free all l: variables */
--    --depth;
-+      /* "fc" is still in use.  This can happen when returning "a:000" or
-+       * assigning "l:" to a global variable.
-+       * Link "fc" in the list for garbage collection later. */
-+      fc->caller = previous_funccal;
-+      previous_funccal = fc;
-+
-+      /* Make a copy of the a: variables, since we didn't do that above. */
-+      todo = (int)fc->l_avars.dv_hashtab.ht_used;
-+      for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi)
-+      {
-+          if (!HASHITEM_EMPTY(hi))
-+          {
-+              --todo;
-+              v = HI2DI(hi);
-+              copy_tv(&v->di_tv, &v->di_tv);
-+          }
-+      }
+         LDFLAGS="$X_LIBS $ac_save_LDFLAGS"
+@@ -7866,11 +7992,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&5
+ $as_echo "$ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&6; }
+-if test $ac_cv_lib_Xpm_XpmCreatePixmapFromData = yes; then
++if test "x$ac_cv_lib_Xpm_XpmCreatePixmapFromData" = x""yes; then
+   X_PRE_LIBS="$X_PRE_LIBS -lXpm"
+ fi
+         { $as_echo "$as_me:$LINENO: checking if X11 header files implicitly declare return values" >&5
+@@ -7968,10 +8094,86 @@ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     CFLAGS=$cflags_save
+     LDFLAGS="$ac_save_LDFLAGS"
++    { $as_echo "$as_me:$LINENO: checking size of wchar_t is 2 bytes" >&5
++$as_echo_n "checking size of wchar_t is 2 bytes... " >&6; }
++    if test "${ac_cv_small_wchar_t+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  if test "$cross_compiling" = yes; then
++  { { $as_echo "$as_me:$LINENO: error: failed to compile test program" >&5
++$as_echo "$as_me: error: failed to compile test program" >&2;}
++   { (exit 1); exit 1; }; }
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
 +
-+      /* Make a copy of the a:000 items, since we didn't do that above. */
-+      for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
-+          copy_tv(&li->li_tv, &li->li_tv);
-+    }
-+}
++#include <X11/Xlib.h>
++#if STDC_HEADERS
++# include <stdlib.h>
++# include <stddef.h>
++#endif
++              main()
++              {
++                if (sizeof(wchar_t) <= 2)
++                  exit(1);
++                exit(0);
++              }
++_ACEOF
++rm -f conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
++  { (case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_try") 2>&5
++  ac_status=$?
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }; then
++  ac_cv_small_wchar_t="no"
++else
++  $as_echo "$as_me: program exited with status $ac_status" >&5
++$as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
 +
-+/*
-+ * Return TRUE if items in "fc" do not have "copyID".  That means they are not
-+ * referenced from anywhere that is in use.
-+ */
-+    static int
-+can_free_funccal(fc, copyID)
-+    funccall_T        *fc;
-+    int               copyID;
-+{
-+    return (fc->l_varlist.lv_copyID != copyID
-+          && fc->l_vars.dv_copyID != copyID
-+          && fc->l_avars.dv_copyID != copyID);
-+}
++( exit $ac_status )
++ac_cv_small_wchar_t="yes"
++fi
++rm -rf conftest.dSYM
++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
++fi
 +
-+/*
-+ * Free "fc" and what it contains.
-+ */
-+   static void
-+free_funccal(fc, free_val)
-+    funccall_T        *fc;
-+    int               free_val;  /* a: vars were allocated */
-+{
-+    listitem_T        *li;
 +
-+    /* The a: variables typevals may not have been allocated, only free the
-+     * allocated variables. */
-+    vars_clear_ext(&fc->l_avars.dv_hashtab, free_val);
++fi
 +
-+    /* free all l: variables */
-+    vars_clear(&fc->l_vars.dv_hashtab);
++    { $as_echo "$as_me:$LINENO: result: $ac_cv_small_wchar_t" >&5
++$as_echo "$ac_cv_small_wchar_t" >&6; }
++    if test "x$ac_cv_small_wchar_t" = "xyes" ; then
++      cat >>confdefs.h <<\_ACEOF
++#define SMALL_WCHAR_T 1
++_ACEOF
 +
-+    /* Free the a:000 variables if they were allocated. */
-+    if (free_val)
-+      for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
-+          clear_tv(&li->li_tv);
++    fi
 +
-+    vim_free(fc);
- }
+   fi
+ fi
  
- /*
-  * Add a number variable "name" to dict "dp" with value "nr".
-  */
-@@ -21510,16 +21678,15 @@ get_return_cmd(rettv)
- /*
-  * Get next function line.
-  * Called by do_cmdline() to get the next line.
-  * Returns allocated string, or NULL for end of function.
-  */
--/* ARGSUSED */
-     char_u *
- get_func_line(c, cookie, indent)
--    int           c;              /* not used */
-+    int           c UNUSED;
-     void    *cookie;
--    int           indent;         /* not used */
-+    int           indent UNUSED;
- {
-     funccall_T        *fcp = (funccall_T *)cookie;
-     ufunc_T   *fp = fcp->func;
-     char_u    *retval;
-     garray_T  *gap;  /* growarray with function lines */
-@@ -21884,10 +22051,65 @@ last_set_msg(scriptID)
-           verbose_leave();
-       }
-     }
- }
+ test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no
  
-+/*
-+ * List v:oldfiles in a nice way.
-+ */
-+    void
-+ex_oldfiles(eap)
-+    exarg_T   *eap UNUSED;
-+{
-+    list_T    *l = vimvars[VV_OLDFILES].vv_list;
-+    listitem_T        *li;
-+    int               nr = 0;
-+
-+    if (l == NULL)
-+      msg((char_u *)_("No old files"));
-+    else
-+    {
-+      msg_start();
-+      msg_scroll = TRUE;
-+      for (li = l->lv_first; li != NULL && !got_int; li = li->li_next)
-+      {
-+          msg_outnum((long)++nr);
-+          MSG_PUTS(": ");
-+          msg_outtrans(get_tv_string(&li->li_tv));
-+          msg_putchar('\n');
-+          out_flush();            /* output one line at a time */
-+          ui_breakcheck();
-+      }
-+      /* Assume "got_int" was set to truncate the listing. */
-+      got_int = FALSE;
-+
-+#ifdef FEAT_BROWSE_CMD
-+      if (cmdmod.browse)
-+      {
-+          quit_more = FALSE;
-+          nr = prompt_for_number(FALSE);
-+          msg_starthere();
-+          if (nr > 0)
-+          {
-+              char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES),
-+                                                                  (long)nr);
-+
-+              if (p != NULL)
-+              {
-+                  p = expand_env_save(p);
-+                  eap->arg = p;
-+                  eap->cmdidx = CMD_edit;
-+                  cmdmod.browse = FALSE;
-+                  do_exedit(eap, NULL);
-+                  vim_free(p);
-+              }
-+          }
-+      }
-+#endif
-+    }
-+}
-+
- #endif /* FEAT_EVAL */
+@@ -9249,11 +9451,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xext_XShapeQueryExtension" >&5
+ $as_echo "$ac_cv_lib_Xext_XShapeQueryExtension" >&6; }
+-if test $ac_cv_lib_Xext_XShapeQueryExtension = yes; then
++if test "x$ac_cv_lib_Xext_XShapeQueryExtension" = x""yes; then
+   GUI_X_LIBS="-lXext"
+ fi
  
+     { $as_echo "$as_me:$LINENO: checking for wslen in -lw" >&5
+ $as_echo_n "checking for wslen in -lw... " >&6; }
+@@ -9318,11 +9520,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_w_wslen" >&5
+ $as_echo "$ac_cv_lib_w_wslen" >&6; }
+-if test $ac_cv_lib_w_wslen = yes; then
++if test "x$ac_cv_lib_w_wslen" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -lw"
+ fi
  
- #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO)
+   { $as_echo "$as_me:$LINENO: checking for dlsym in -ldl" >&5
+ $as_echo_n "checking for dlsym in -ldl... " >&6; }
+@@ -9387,11 +9589,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlsym" >&5
+ $as_echo "$ac_cv_lib_dl_dlsym" >&6; }
+-if test $ac_cv_lib_dl_dlsym = yes; then
++if test "x$ac_cv_lib_dl_dlsym" = x""yes; then
+   X_EXTRA_LIBS="$X_EXTRA_LIBS -ldl"
+ fi
  
---- vim72.orig/runtime/scripts.vim
-+++ vim72/runtime/scripts.vim
-@@ -232,10 +232,14 @@ else
+   { $as_echo "$as_me:$LINENO: checking for XmuCreateStippledPixmap in -lXmu" >&5
+ $as_echo_n "checking for XmuCreateStippledPixmap in -lXmu... " >&6; }
+@@ -9456,11 +9658,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&5
+ $as_echo "$ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&6; }
+-if test $ac_cv_lib_Xmu_XmuCreateStippledPixmap = yes; then
++if test "x$ac_cv_lib_Xmu_XmuCreateStippledPixmap" = x""yes; then
+   GUI_X_LIBS="-lXmu $GUI_X_LIBS"
+ fi
  
-     " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
-   elseif s:line1 =~ '\<DTD\s\+XHTML\s'
-     set ft=xhtml
+   if test -z "$SKIP_MOTIF"; then
+     { $as_echo "$as_me:$LINENO: checking for XpEndJob in -lXp" >&5
+@@ -9526,11 +9728,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xp_XpEndJob" >&5
+ $as_echo "$ac_cv_lib_Xp_XpEndJob" >&6; }
+-if test $ac_cv_lib_Xp_XpEndJob = yes; then
++if test "x$ac_cv_lib_Xp_XpEndJob" = x""yes; then
+   GUI_X_LIBS="-lXp $GUI_X_LIBS"
+ fi
  
-+    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
-+  elseif s:line1 =~? '\<DOCTYPE\s\+html\>'
-+    set ft=html
-+
-     " PDF
-   elseif s:line1 =~ '^%PDF-'
-     set ft=pdf
+   fi
+   LDFLAGS=$ldflags_save
+@@ -9697,12 +9899,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
  
-     " XXD output
---- vim72.orig/runtime/doc/os_vms.txt
-+++ vim72/runtime/doc/os_vms.txt
-@@ -1,6 +1,6 @@
--*os_vms.txt*    For Vim version 7.2.  Last change: 2006 Nov 18
-+*os_vms.txt*    For Vim version 7.2.  Last change: 2008 Aug 19
+ fi
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
+ fi
+@@ -9850,12 +10053,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
  
-                 VIM REFERENCE MANUAL
+ fi
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
+ fi
+@@ -10096,12 +10300,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
  
-@@ -310,11 +310,11 @@ features, it is worth to choose non GUI
+ fi
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
- ==============================================================================
+ fi
+@@ -10360,10 +10565,60 @@ sed 's/^/| /' conftest.$ac_ext >&5
+ $as_echo "no" >&6; }
+ fi
  
- 8. Useful notes                                               *vms-notes*
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  
--8.1 backspace/delete
-+8.1 Backspace/delete
- 8.2 Filters
- 8.3 VMS file version numbers
- 8.4 Directory conversion
- 8.5 Remote host invocation
- 8.6 Terminal problems
-@@ -324,12 +324,14 @@ features, it is worth to choose non GUI
- 8.10 Setting up the symbols
- 8.11 diff and other GNU programs
- 8.12 diff-mode
- 8.13 Allow '$' in C keywords
- 8.14 VIMTUTOR for beginners
-+8.15 Slow start in console mode issue
-+8.16 Common VIM directory - different architectures
++{ $as_echo "$as_me:$LINENO: checking whether __attribute__((unused)) is allowed" >&5
++$as_echo_n "checking whether __attribute__((unused)) is allowed... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <stdio.h>
++int
++main ()
++{
++int x __attribute__((unused));
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++       test -z "$ac_c_werror_flag" ||
++       test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  { $as_echo "$as_me:$LINENO: result: yes" >&5
++$as_echo "yes" >&6; }; cat >>confdefs.h <<\_ACEOF
++#define HAVE_ATTRIBUTE_UNUSED 1
++_ACEOF
++
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++      { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++
+ if test "${ac_cv_header_elf_h+set}" = set; then
+   { $as_echo "$as_me:$LINENO: checking for elf.h" >&5
+ $as_echo_n "checking for elf.h... " >&6; }
+ if test "${ac_cv_header_elf_h+set}" = set; then
+   $as_echo_n "(cached) " >&6
+@@ -10487,11 +10742,11 @@ else
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_header_elf_h" >&5
+ $as_echo "$ac_cv_header_elf_h" >&6; }
  
--8.1 backspace/delete
-+8.1 Backspace/delete
+ fi
+-if test $ac_cv_header_elf_h = yes; then
++if test "x$ac_cv_header_elf_h" = x""yes; then
+   HAS_ELF=1
+ fi
  
- There are backspace/delete key inconsistencies with VMS.
- :fixdel doesn't do the trick, but the solution is: >
  
-       :inoremap ^? ^H         " for terminal mode
-@@ -661,16 +663,134 @@ start it with: >
+ if test "$HAS_ELF" = 1; then
+@@ -10553,11 +10808,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_elf_main" >&5
+ $as_echo "$ac_cv_lib_elf_main" >&6; }
+-if test $ac_cv_lib_elf_main = yes; then
++if test "x$ac_cv_lib_elf_main" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBELF 1
+ _ACEOF
  
-       @vim:vimtutor
+   LIBS="-lelf $LIBS"
+@@ -10627,12 +10882,13 @@ rm -f core conftest.err conftest.$ac_obj
+ fi
+ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+ _ACEOF
  
- (Thomas.R.Wyant III, Vim 6.1)
+ ac_header_dirent=$ac_hdr; break
+@@ -10914,19 +11170,18 @@ fi
  
-+8.14 Slow start in console mode issue
-+
-+As GUI/GTK Vim works equally well in console mode, many administartors
-+deploy those executables system wide.
-+Unfortunately, on a remote slow connections GUI/GTK executables behave rather
-+slow when user wants to run Vim just in the console mode - because of X environment detection timeout.
-+
-+Luckily, there is a simple solution for that. Administrators need to deploy
-+both GUI/GTK build and just console build executables, like below: >
-+
-+    |- vim72
-+    |----- doc
-+    |----- syntax
-+       vimrc    (system rc files)
-+       gvimrc
-+       gvim.exe (the remaned GUI or GTK built vim.exe)
-+       vim.exe  (the console only executable)
-+
-+Define system symbols like below in for ex in LOGIN.COM or SYLOGIN.COM: >
-+
-+      $ define/nolog VIM RF10:[UTIL.VIM72] ! where you VIM directory is
-+      $ vi*m  :== mcr VIM:VIM.EXE
-+      $ gvi*m :== mcr VIM:GVIM.EXE
-+      $ ! or you can try to spawn with
-+      $ gv*im :== spawn/nowait/input=NLA0 mcr VIM:GVIM.EXE -g -GEOMETRY 80x40
-+
-+
-+Like this, users that do not have X environment and want to use Vim just in
-+console mode can avoid performance problems.
-+
-+(Zoltan Arpadffy, Vim 7.2)
-+
-+8.15 Common VIM directory - different architectures
-+
-+In a cluster that contains nodes with different architectures like below:
+-
+ for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \
+       termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h sys/types.h termio.h \
+       iconv.h langinfo.h math.h unistd.h stropts.h errno.h \
+       sys/resource.h sys/systeminfo.h locale.h \
+       sys/stream.h termios.h libc.h sys/statfs.h \
+       poll.h sys/poll.h pwd.h utime.h sys/param.h libintl.h \
+       libgen.h util/debug.h util/msg18n.h frame.h \
+-      sys/acl.h sys/access.h sys/sysctl.h sys/sysinfo.h wchar.h wctype.h
++      sys/acl.h sys/access.h sys/sysinfo.h wchar.h wctype.h
+ do
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+   { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+ $as_echo_n "checking for $ac_header... " >&6; }
+@@ -11048,31 +11303,97 @@ esac
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+ $as_echo_n "checking for $ac_header... " >&6; }
+ if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+   $as_echo_n "(cached) " >&6
+ else
+-  eval "$as_ac_Header=\$ac_header_preproc"
++  eval "$as_ac_Header=\$ac_header_preproc"
++fi
++ac_res=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++             { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
 +
-+$show cluster
-+View of Cluster from system ID 11655  node: TOR                                                                     18-AUG-2008 11:58:31
-++---------------------------------+
-+¦        SYSTEMS        ¦ MEMBERS ¦
-++-----------------------+---------¦
-+¦  NODE  ¦   SOFTWARE   ¦  STATUS ¦
-++--------+--------------+---------¦
-+¦ TOR    ¦ VMS V7.3-2   ¦ MEMBER  ¦
-+¦ TITAN2 ¦ VMS V8.3     ¦ MEMBER  ¦
-+¦ ODIN   ¦ VMS V7.3-2   ¦ MEMBER  ¦
-++---------------------------------+
++fi
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
++  cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
++_ACEOF
 +
-+It is convinient to have a common VIM directory but execute different
-+executables.
-+There are more solutions for this problem:
++fi
 +
-+solution 1. all executables in the same directory with different names
-+This is easily done with the following script that can be added
-+to the login.com or sylogin.com: >
++done
 +
-+      $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX"
-+      $ then
-+      $       say "VAX platform"
-+      $       vi*m:== mcr vim:VIM.EXE_VAX
-+      $ endif
-+      $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH"
-+      $ then
-+      $       say "ALPHA platform"
-+      $       vi*m :== mcr vim:VIM.EXE_AXP
-+      $ endif
-+      $ if f$getsyi("ARCH_NAME") .eqs. "IA64"
-+      $ then
-+      $      say "IA64 platform"
-+      $      vi*m :== mcr vim:VIM.EXE_IA64
-+      $ endif
 +
-+solution 2. different directories: >
 +
-+      $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX"
-+      $ then
-+      $       say "VAX platform"
-+      $       define/nolog VIM RF10:[UTIL.VAX_EXE] ! VAX executables
-+      $ endif
-+      $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH"
-+      $ then
-+      $       say "ALPHA platform"
-+      $       define/nolog VIM RF10:[UTIL.AXP_EXE] ! AXP executables
-+      $ endif
-+      $ if f$getsyi("ARCH_NAME") .eqs. "IA64"
-+      $ then
-+      $      say "IA64 platform"
-+      $      define/nolog VIM RF10:[UTIL.IA64_EXE] ! IA64 executables
-+      $ endif
-+        $! VIMRUNTIME must be defined in order to find runtime files
-+      $ define/nolog VIMRUNTIME RF10:[UTIL.VIM72]
++for ac_header in sys/ptem.h
++do
++as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
++{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
++$as_echo_n "checking for $ac_header... " >&6; }
++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#if defined HAVE_SYS_STREAM_H
++#  include <sys/stream.h>
++#endif
 +
-+A good examle for this approach is the [GNU]gnu_tools.com script from GNU_TOOLS.ZIP
-+package downloadable from http://www.polarhome.com/vim/
++#include <$ac_header>
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++       test -z "$ac_c_werror_flag" ||
++       test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  eval "$as_ac_Header=yes"
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
 +
-+(Zoltan Arpadffy, Vim 7.2)
++      eval "$as_ac_Header=no"
++fi
 +
- ==============================================================================
- 9. VMS related changes                                        *vms-changes*
--Version 7
-+Recent changes
-+- The following plugins are included into VMS runtime:
-+  genutils 2.4, multiselect 2.2, multvals 3.1, selectbuf 4.3,
-+  bufexplorer 7.1.7, taglist 4.5
-+- minor changes in vimrc (just in VMS runtime)
-+- make_vms.mms - HUGE model is the default
-+- [TESTDIR]make_vms.mms include as many tests possible
-+- modify test30 and test54 for VMS
-+- enable FLOAT feature in VMS port
-+- os_vms.txt updated
-+
-+Version 7.2 (2008 Aug 9)
-+- VCF files write corrected
-+- CTAGS 5.7 included
-+- corrected make_vms.mms (on VAX gave syntax error)
-+
-+Version 7.1 (2007 Jun 15)
-+- create TAGS file from menu
-+
-+Version 7 (2006 May 8)
- - Improved low level char input (affects just console mode)
-+- Fixed plugin bug
-+- CTAGS 5.6 included
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-
+-fi
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
- Version 6.4 (2005 Oct 15)
- - GTKLIB and Vim build on IA64
- - colors in terminal mode
- - syntax highlighting in terminal mode
-@@ -804,10 +924,11 @@ Version 4.5 (1996 Dec 16)
+ fi
  
- 10. Authors                                           *vms-authors*
+ done
  
- OpenVMS documentation and executables are maintained by:
- Zoltan Arpadffy <arpadffy@polarhome.com>
-+OpenVMS Vim page: http://www.polarhome.com/vim/
  
- This document uses parts and remarks from earlier authors and contributors
- of OS_VMS.TXT:
-       Charles E. Campbell, Jr. <cec@gryphon.gsfc.nasa.gov>
-       Bruce Hunsaker <BNHunsaker@chq.byu.edu>
---- vim72.orig/src/Make_vms.mms
-+++ vim72/src/Make_vms.mms
-@@ -1,10 +1,10 @@
- #
- # Makefile for Vim on OpenVMS
- #
- # Maintainer:   Zoltan Arpadffy <arpadffy@polarhome.com>
--# Last change:  2007 Oct 22
-+# Last change:  2008 Aug 16
- #
- # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64
- # with MMS and MMK
- #
- # The following could be built:
-@@ -34,11 +34,11 @@ DECC = YES
- # SMALL  - Few features enabled, as basic as possible
- # NORMAL - A default selection of features enabled
- # BIG    - Many features enabled, as rich as possible. (default)
- # HUGE   - All possible featues enabled.
- # Please select one of these alternatives above.
--MODEL = BIG
-+MODEL = HUGE
  
- # GUI or terminal mode executable.
- # Comment out if you want just the character terminal mode only.
- # GUI with Motif
- GUI = YES
---- vim72.orig/src/os_vms_conf.h
-+++ vim72/src/os_vms_conf.h
-@@ -112,10 +112,12 @@
- #define       HAVE_ERRNO_H
- #define HAVE_OPENDIR
- #define HAVE_PUTENV
- #define HAVE_SETENV
- #define HAVE_SETJMP_H
-+#define HAVE_MATH_H
-+#define HAVE_FLOAT_FUNCS
+-for ac_header in sys/ptem.h
++for ac_header in sys/sysctl.h
+ do
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+ $as_echo_n "checking for $ac_header... " >&6; }
+ if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+@@ -11082,12 +11403,12 @@ else
+ /* confdefs.h.  */
+ _ACEOF
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+-#if defined HAVE_SYS_STREAM_H
+-#  include <sys/stream.h>
++#if defined HAVE_SYS_PARAM_H
++#  include <sys/param.h>
+ #endif
  
- #undef        HAVE_DIRENT_H
- #undef        HAVE_SYS_NDIR_H
- #undef        HAVE_SYS_DIR_H
- #undef        HAVE_NDIR_H
---- vim72.orig/src/testdir/Make_vms.mms
-+++ vim72/src/testdir/Make_vms.mms
-@@ -2,13 +2,13 @@
- # Makefile to run all tests for Vim on VMS
- #
- # Authors:    Zoltan Arpadffy, <arpadffy@polarhome.com>
- #             Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
- #
--# Last change:  2008 Jun 19
-+# Last change:  2009 Sep 11
- #
--# This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX.
-+# This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
- # Edit the lines in the Configuration section below to select.
- #
- # Execute with:
- #             mms/descrip=Make_vms.mms
- # Cleanup with:
-@@ -30,10 +30,19 @@
- # Comment out if you want to run Unix specific tests as well, but please
- # be aware, that on OpenVMS will fail, because of cat, rm, etc commands
- # and directory handling.
- # WANT_UNIX = YES
+ #include <$ac_header>
+ _ACEOF
+ rm -f conftest.$ac_objext
+@@ -11120,12 +11441,13 @@ rm -f core conftest.err conftest.$ac_obj
+ fi
+ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
-+# Comment out if you want to run Win32 specific tests as well, but please
-+# be aware, that on OpenVMS will fail, because of cat, rm, etc commands
-+# and directory handling.
-+# WANT_WIN = YES
-+
-+# Comment out if you want to run spell checker tests.
-+# They fail because VMS does not support file names.
-+# WANT_SPELL = YES
-+
- # Comment out if you have gzip on your system
- # HAVE_GZIP = YES
+ fi
+@@ -11320,12 +11642,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
  
- # Comment out if you have GNU compatible diff on your system
- # HAVE_GDIFF = YES
-@@ -51,25 +60,34 @@ VIMPROG = <->vim.exe
- SCRIPT = test1.out  test2.out  test3.out  test4.out  test5.out  \
-        test6.out  test7.out  test8.out  test9.out  test10a.out\
-        test13.out test14.out test15.out test17.out \
-        test18.out test19.out test20.out test21.out test22.out \
-        test23.out test24.out test26.out \
--       test28.out test29.out test31.out test32.out \
-+       test28.out test29.out test30.out test31.out test32.out \
-        test33.out test34.out test35.out test36.out test37.out \
-        test38.out test39.out test40.out test41.out test42.out \
-        test43.out test44.out test45.out test46.out \
-        test48.out test51.out test53.out test54.out test55.out \
--       test56.out test57.out test58.out test59.out test60.out \
--       test61.out test62.out test63.out test64.out test65.out
-+       test56.out test57.out test60.out \
-+       test61.out test62.out test63.out test64.out test65.out \
-+       test66.out test67.out test68.out test69.out
+ fi
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
- .IFDEF WANT_GUI
- SCRIPT_GUI = test16.out
- GUI_OPTION = -g
.ENDIF
+ fi
+@@ -11563,10 +11886,71 @@ cat >>confdefs.h <<\_ACEOF
+ #define const /**/
_ACEOF
  
- .IFDEF WANT_UNIX
--SCRIPT_UNIX = test10.out test12.out test25.out test27.out test30.out test49.out
-+SCRIPT_UNIX = test10.out test12.out test25.out test27.out test49.out
-+.ENDIF
+ fi
++{ $as_echo "$as_me:$LINENO: checking for working volatile" >&5
++$as_echo_n "checking for working volatile... " >&6; }
++if test "${ac_cv_c_volatile+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
 +
-+.IFDEF WANT_WIN
-+SCRIPT_WIN = test50.out test52.out
-+.ENDIF
++int
++main ()
++{
 +
-+.IFDEF WANT_SPELL
-+SCRIPT_SPELL = test58.out test59.out
- .ENDIF
++volatile int x;
++int * volatile y = (int *) 0;
++return !x && !y;
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++       test -z "$ac_c_werror_flag" ||
++       test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  ac_cv_c_volatile=yes
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++      ac_cv_c_volatile=no
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5
++$as_echo "$ac_cv_c_volatile" >&6; }
++if test $ac_cv_c_volatile = no; then
++
++cat >>confdefs.h <<\_ACEOF
++#define volatile /**/
++_ACEOF
++
++fi
++
+ { $as_echo "$as_me:$LINENO: checking for mode_t" >&5
+ $as_echo_n "checking for mode_t... " >&6; }
+ if test "${ac_cv_type_mode_t+set}" = set; then
+   $as_echo_n "(cached) " >&6
+ else
+@@ -11657,11 +12041,11 @@ fi
  
- .IFDEF HAVE_GZIP
- SCRIPT_GZIP = test11.out
- .ENDIF
-@@ -82,15 +100,15 @@ SCRIPT_GDIFF = test47.out
-       -@ write sys$output " "
-       -@ write sys$output "-----------------------------------------------"
-       -@ write sys$output "                "$*" "
-       -@ write sys$output "-----------------------------------------------"
-       -@ create/term/wait mcr $(VIMPROG) $(GUI_OPTION) -u vms.vim --noplugin -s dotest.in $*.in
--      -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences test.out $*.ok;
-+      -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences /par test.out $*.ok;
-       -@ if "''F$SEARCH("test.out.*")'" .NES. "" then rename test.out $*.out
-       -@ if "''F$SEARCH("Xdotest.*")'"  .NES. "" then delete/noconfirm/nolog Xdotest.*.*
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5
+ $as_echo "$ac_cv_type_mode_t" >&6; }
+-if test $ac_cv_type_mode_t = yes; then
++if test "x$ac_cv_type_mode_t" = x""yes; then
+   :
+ else
  
--all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_GZIP) $(SCRIPT_GDIFF)
-+all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_WIN) $(SCRIPT_SPELL) $(SCRIPT_GZIP) $(SCRIPT_GDIFF)
-       -@ write sys$output " "
-       -@ write sys$output "-----------------------------------------------"
-       -@ write sys$output "                All done"
-       -@ write sys$output "-----------------------------------------------"
-       -@ deassign sys$output
-@@ -111,16 +129,26 @@ nolog :
-       -@ write sys$output "                Test results:"
-       -@ write sys$output "-----------------------------------------------"
-       -@ write sys$output "MAKE_VMS.MMS options:"
-       -@ write sys$output "   WANT_GUI  = ""$(WANT_GUI)"" "
-       -@ write sys$output "   WANT_UNIX = ""$(WANT_UNIX)"" "
-+      -@ write sys$output "   WANT_WIN  = ""$(WANT_WIN)"" "
-+      -@ write sys$output "   WANT_SPELL= ""$(WANT_SPELL)"" "
-       -@ write sys$output "   HAVE_GZIP = ""$(HAVE_GZIP)"" "
-       -@ write sys$output "   HAVE_GDIFF= ""$(HAVE_GDIFF)"" "
-       -@ write sys$output "Default vimrc file is VMS.VIM:
-       -@ write sys$output "-----------------------------------------------"
-       -@ type VMS.VIM
+ cat >>confdefs.h <<_ACEOF
+ #define mode_t int
+@@ -11761,11 +12145,11 @@ fi
  
- clean :
-       -@ if "''F$SEARCH("*.out")'"     .NES. "" then delete/noconfirm/nolog *.out.*
-       -@ if "''F$SEARCH("test.log")'"  .NES. "" then delete/noconfirm/nolog test.log.*
-+      -@ if "''F$SEARCH("test.ok")'"   .NES. "" then delete/noconfirm/nolog test.ok.*
-       -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.*
-       -@ if "''F$SEARCH("*.*_sw*")'"   .NES. "" then delete/noconfirm/nolog *.*_sw*.*
-+      -@ if "''F$SEARCH("*.failed")'"  .NES. "" then delete/noconfirm/nolog *.failed.*
-+      -@ if "''F$SEARCH("*.rej")'"     .NES. "" then delete/noconfirm/nolog *.rej.*
-+      -@ if "''F$SEARCH("tiny.vim")'"  .NES. "" then delete/noconfirm/nolog tiny.vim.*
-+      -@ if "''F$SEARCH("small.vim")'" .NES. "" then delete/noconfirm/nolog small.vim.*
-+      -@ if "''F$SEARCH("mbyte.vim")'" .NES. "" then delete/noconfirm/nolog mbyte.vim.*
-+      -@ if "''F$SEARCH("viminfo.*")'" .NES. "" then delete/noconfirm/nolog viminfo.*.*
-+
---- vim72.orig/src/testdir/test30.in
-+++ vim72/src/testdir/test30.in
-@@ -22,14 +22,21 @@ STARTTEST
- :set bin noeol
- :$w! XXMac
- :set nobin eol
- :bwipe XXUnix XXDos XXMac
- :" create mixed format files
--:!cat XXUnix XXDos >XXUxDs
--:!cat XXUnix XXMac >XXUxMac
--:!cat XXDos XXMac >XXDosMac
--:!cat XXUnix XXDos XXMac >XXUxDsMc
-+:if has("vms")
-+: !copy XXUnix,XXDos XXUxDs.
-+: !copy XXUnix,XXMac XXUxMac.
-+: !copy XXDos,XXMac  XXDosMac.
-+: !copy XXUnix,XXDos,XXMac XXUxDsMc.
-+:else
-+: !cat XXUnix XXDos >XXUxDs
-+: !cat XXUnix XXMac >XXUxMac
-+: !cat XXDos XXMac >XXDosMac
-+: !cat XXUnix XXDos XXMac >XXUxDsMc
-+:endif
- :"
- :" try reading and writing with 'fileformats' empty
- :set fileformat=unix
- :e! XXUnix
- :w! test.out
---- vim72.orig/src/testdir/test54.in
-+++ vim72/src/testdir/test54.in
-@@ -1,12 +1,17 @@
- Some tests for buffer-local autocommands
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+ $as_echo "$ac_cv_type_off_t" >&6; }
+-if test $ac_cv_type_off_t = yes; then
++if test "x$ac_cv_type_off_t" = x""yes; then
+   :
+ else
  
- STARTTEST
- :so small.vim
- :e xx
--:!rm -f test.out
--:au BufLeave <buffer> :!echo buffer-local autommand in %>> test.out
-+:if has("vms")
-+: !del test.out.*
-+: au BufLeave <buffer> :!write sys$output "buffer-local autommand in %" > test.out
-+:else
-+: !rm -f test.out
-+: au BufLeave <buffer> :!echo buffer-local autommand in %>> test.out
-+:endif
- :e somefile           " here, autocommand for xx shall write test.out 
- :                     " but autocommand shall not apply to buffer named <buffer>
- :bwipe xx             " here, autocommand shall be auto-deleted
- :e xx                 " nothing shall be written
- :e somefile           " nothing shall be written
---- vim72.orig/src/buffer.c
-+++ vim72/src/buffer.c
-@@ -31,21 +31,22 @@
- static char_u *buflist_match __ARGS((regprog_T *prog, buf_T *buf));
- # define HAVE_BUFLIST_MATCH
- static char_u *fname_match __ARGS((regprog_T *prog, char_u *name));
- #endif
- static void   buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options));
--static wininfo_T *find_wininfo __ARGS((buf_T *buf));
-+static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer));
- #ifdef UNIX
- static buf_T  *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st));
- static int    otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp));
- static int    buf_same_ino __ARGS((buf_T *buf, struct stat *stp));
- #else
- static int    otherfile_buf __ARGS((buf_T *buf, char_u *ffname));
- #endif
- #ifdef FEAT_TITLE
- static int    ti_change __ARGS((char_u *str, char_u **last));
- #endif
-+static int    append_arg_number __ARGS((win_T *wp, char_u *buf, int buflen, int add_file));
- static void   free_buffer __ARGS((buf_T *));
- static void   free_buffer_stuff __ARGS((buf_T *buf, int free_options));
- static void   clear_wininfo __ARGS((buf_T *buf));
+ cat >>confdefs.h <<_ACEOF
+ #define off_t long int
+@@ -11865,11 +12249,11 @@ fi
  
- #ifdef UNIX
-@@ -112,11 +113,11 @@ open_buffer(read_stdin, eap)
-     old_curbuf = curbuf;
-     modified_was_set = FALSE;
- #endif
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5
+ $as_echo "$ac_cv_type_pid_t" >&6; }
+-if test $ac_cv_type_pid_t = yes; then
++if test "x$ac_cv_type_pid_t" = x""yes; then
+   :
+ else
  
-     /* mark cursor position as being invalid */
--    changed_line_abv_curs();
-+    curwin->w_valid = 0;
+ cat >>confdefs.h <<_ACEOF
+ #define pid_t int
+@@ -11969,11 +12353,11 @@ fi
  
-     if (curbuf->b_ffname != NULL
- #ifdef FEAT_NETBEANS_INTG
-           && netbeansReadFile
- #endif
-@@ -312,11 +313,11 @@ close_buffer(win, buf, action)
-     buf_T     *buf;
-     int               action;
- {
- #ifdef FEAT_AUTOCMD
-     int               is_curbuf;
--    int               nwindows = buf->b_nwindows;
-+    int               nwindows;
- #endif
-     int               unload_buf = (action != 0);
-     int               del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
-     int               wipe_buf = (action == DOBUF_WIPE);
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+ $as_echo "$ac_cv_type_size_t" >&6; }
+-if test $ac_cv_type_size_t = yes; then
++if test "x$ac_cv_type_size_t" = x""yes; then
+   :
+ else
  
-@@ -435,14 +436,10 @@ close_buffer(win, buf, action)
-      */
-     if (buf == curbuf && !is_curbuf)
-       return;
- #endif
+ cat >>confdefs.h <<_ACEOF
+ #define size_t unsigned int
+@@ -12173,11 +12557,11 @@ fi
  
--#ifdef FEAT_NETBEANS_INTG
--    if (usingNetbeans)
--      netbeans_file_closed(buf);
--#endif
-     /* Change directories when the 'acd' option is set. */
-     DO_AUTOCHDIR
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_type_ino_t" >&5
+ $as_echo "$ac_cv_type_ino_t" >&6; }
+-if test $ac_cv_type_ino_t = yes; then
++if test "x$ac_cv_type_ino_t" = x""yes; then
+   :
+ else
  
-     /*
-      * Remove the buffer from the list.
-@@ -513,16 +510,15 @@ buf_clear_file(buf)
+ cat >>confdefs.h <<_ACEOF
+ #define ino_t long
+@@ -12277,11 +12661,11 @@ fi
  
- /*
-  * buf_freeall() - free all things allocated for a buffer that are related to
-  * the file.
-  */
--/*ARGSUSED*/
-     void
- buf_freeall(buf, del_buf, wipe_buf)
-     buf_T     *buf;
--    int               del_buf;        /* buffer is going to be deleted */
--    int               wipe_buf;       /* buffer is going to be wiped out */
-+    int               del_buf UNUSED;     /* buffer is going to be deleted */
-+    int               wipe_buf UNUSED;    /* buffer is going to be wiped out */
- {
- #ifdef FEAT_AUTOCMD
-     int               is_curbuf = (buf == curbuf);
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_type_dev_t" >&5
+ $as_echo "$ac_cv_type_dev_t" >&6; }
+-if test $ac_cv_type_dev_t = yes; then
++if test "x$ac_cv_type_dev_t" = x""yes; then
+   :
+ else
  
-     apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf);
-@@ -637,18 +633,25 @@ free_buffer_stuff(buf, free_options)
-     uc_clear(&buf->b_ucmds);          /* clear local user commands */
- #endif
- #ifdef FEAT_SIGNS
-     buf_delete_signs(buf);            /* delete any signs */
- #endif
-+#ifdef FEAT_NETBEANS_INTG
-+    if (usingNetbeans)
-+        netbeans_file_killed(buf);
-+#endif
- #ifdef FEAT_LOCALMAP
-     map_clear_int(buf, MAP_ALL_MODES, TRUE, FALSE);  /* clear local mappings */
-     map_clear_int(buf, MAP_ALL_MODES, TRUE, TRUE);   /* clear local abbrevs */
- #endif
- #ifdef FEAT_MBYTE
-     vim_free(buf->b_start_fenc);
-     buf->b_start_fenc = NULL;
- #endif
-+#ifdef FEAT_SPELL
-+    ga_clear(&buf->b_langp);
-+#endif
- }
+ cat >>confdefs.h <<_ACEOF
+ #define dev_t unsigned
+@@ -12567,12 +12951,13 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ ac_res=`eval 'as_val=${'$as_ac_Lib'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if test `eval 'as_val=${'$as_ac_Lib'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Lib'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_LIB${libname}" | $as_tr_cpp` 1
+ _ACEOF
  
- /*
-  * Free the b_wininfo list for buffer "buf".
-  */
-@@ -810,13 +813,10 @@ do_bufdel(command, arg, addr_count, star
-     int               deleted = 0;    /* number of buffers deleted */
-     char_u    *errormsg = NULL; /* return value */
-     int               bnr;            /* buffer number */
-     char_u    *p;
+   LIBS="-l${libname} $LIBS"
+@@ -13419,24 +13804,24 @@ $as_echo "$ac_try_echo") >&5
+       fi
+       { $as_echo "$as_me:$LINENO: result: pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group" >&5
+ $as_echo "pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group" >&6; }
+       else
+       vim_cv_tty_group=world
+-      { $as_echo "$as_me:$LINENO: result: ptys are world accessable" >&5
+-$as_echo "ptys are world accessable" >&6; }
++      { $as_echo "$as_me:$LINENO: result: ptys are world accessible" >&5
++$as_echo "ptys are world accessible" >&6; }
+       fi
  
--#ifdef FEAT_NETBEANS_INTG
--    netbeansCloseFile = 1;
--#endif
-     if (addr_count == 0)
-     {
-       (void)do_buffer(command, DOBUF_CURRENT, FORWARD, 0, forceit);
-     }
-     else
-@@ -907,13 +907,10 @@ do_bufdel(command, arg, addr_count, star
-                   smsg((char_u *)_("%d buffers wiped out"), deleted);
-           }
-       }
-     }
+ else
+   $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
--#ifdef FEAT_NETBEANS_INTG
--    netbeansCloseFile = 0;
--#endif
+ ( exit $ac_status )
  
-     return errormsg;
- }
+       vim_cv_tty_group=world
+-      { $as_echo "$as_me:$LINENO: result: can't determine - assume ptys are world accessable" >&5
+-$as_echo "can't determine - assume ptys are world accessable" >&6; }
++      { $as_echo "$as_me:$LINENO: result: can't determine - assume ptys are world accessible" >&5
++$as_echo "can't determine - assume ptys are world accessible" >&6; }
  
- /*
-@@ -1088,11 +1085,11 @@ do_buffer(action, start, dir, count, for
- #ifdef FEAT_WINDOWS
-           close_windows(buf, TRUE);
- #endif
-           setpcmark();
-           retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE,
--                                                forceit ? ECMD_FORCEIT : 0);
-+                                        forceit ? ECMD_FORCEIT : 0, curwin);
+ fi
+ rm -rf conftest.dSYM
+ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+ fi
+@@ -13719,14 +14104,13 @@ fi
  
-           /*
-            * do_ecmd() may create a new buffer, then we have to delete
-            * the old one.  But do_ecmd() may have done that already, check
-            * if the buffer still exists.
-@@ -1235,11 +1232,11 @@ do_buffer(action, start, dir, count, for
- # ifdef FEAT_WINDOWS
-       /* If 'switchbuf' contains "useopen": jump to first window containing
-        * "buf" if one exists */
-       if ((swb_flags & SWB_USEOPEN) && buf_jump_open_win(buf))
-           return OK;
--      /* If 'switchbuf' contians "usetab": jump to first window in any tab
-+      /* If 'switchbuf' contains "usetab": jump to first window in any tab
-        * page containing "buf" if one exists */
-       if ((swb_flags & SWB_USETAB) && buf_jump_open_tab(buf))
-           return OK;
-       if (win_split(0, 0) == FAIL)
- # endif
-@@ -1311,11 +1308,11 @@ set_curbuf(buf, action)
-                                                    || action == DOBUF_WIPE);
  
-     setpcmark();
-     if (!cmdmod.keepalt)
-       curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */
--    buflist_altfpos();                         /* remember curpos */
-+    buflist_altfpos(curwin);                   /* remember curpos */
  
- #ifdef FEAT_VISUAL
-     /* Don't restart Select mode after switching to another buffer. */
-     VIsual_reselect = FALSE;
- #endif
-@@ -1349,15 +1346,16 @@ set_curbuf(buf, action)
-                       && !P_HID(prevbuf)
-                       && !bufIsChanged(prevbuf)) ? DOBUF_UNLOAD : 0);
-       }
-     }
- #ifdef FEAT_AUTOCMD
-+    /* An autocommand may have deleted "buf", already entered it (e.g., when
-+     * it did ":bunload") or aborted the script processing! */
- # ifdef FEAT_EVAL
--    /* An autocommand may have deleted buf or aborted the script processing! */
--    if (buf_valid(buf) && !aborting())
-+    if (buf_valid(buf) && buf != curbuf && !aborting())
- # else
--    if (buf_valid(buf))           /* an autocommand may have deleted buf! */
-+    if (buf_valid(buf) && buf != curbuf)
- # endif
- #endif
-       enter_buffer(buf);
- }
  
-@@ -1395,10 +1393,16 @@ enter_buffer(buf)
-     curwin->w_cursor.col = 0;
- #ifdef FEAT_VIRTUALEDIT
-     curwin->w_cursor.coladd = 0;
- #endif
-     curwin->w_set_curswant = TRUE;
-+#ifdef FEAT_AUTOCMD
-+    curwin->w_topline_was_set = FALSE;
-+#endif
-+
-+    /* mark cursor position as being invalid */
-+    curwin->w_valid = 0;
  
-     /* Make sure the buffer is loaded. */
-     if (curbuf->b_ml.ml_mfp == NULL)  /* need to load the file */
-     {
- #ifdef FEAT_AUTOCMD
-@@ -1434,11 +1438,12 @@ enter_buffer(buf)
-     check_arg_idx(curwin);            /* check for valid arg_idx */
- #ifdef FEAT_TITLE
-     maketitle();
- #endif
- #ifdef FEAT_AUTOCMD
--    if (curwin->w_topline == 1)               /* when autocmds didn't change it */
-+      /* when autocmds didn't change it */
-+    if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
- #endif
-       scroll_cursor_halfway(FALSE);   /* redisplay at correct position */
+-
+-for ac_func in bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \
++for ac_func in bcmp fchdir fchown fsync getcwd getpseudotty \
+       getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \
+-      memset nanosleep opendir putenv qsort readlink select setenv \
++      memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
+       setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
+       sigvec strcasecmp strerror strftime stricmp strncasecmp \
+       strnicmp strpbrk strtol tgetent towlower towupper iswupper \
+       usleep utime utimes
+ do
+@@ -13816,19 +14200,152 @@ rm -f core conftest.err conftest.$ac_obj
+ fi
+ ac_res=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if test `eval 'as_val=${'$as_ac_var'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_var'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
  
- #ifdef FEAT_NETBEANS_INTG
-     /* Send fileOpened event because we've changed buffers. */
-@@ -1449,17 +1454,17 @@ enter_buffer(buf)
-     /* Change directories when the 'acd' option is set. */
-     DO_AUTOCHDIR
+ fi
+ done
  
- #ifdef FEAT_KEYMAP
-     if (curbuf->b_kmap_state & KEYMAP_INIT)
--      keymap_init();
-+      (void)keymap_init();
- #endif
- #ifdef FEAT_SPELL
-     /* May need to set the spell language.  Can only do this after the buffer
-      * has been properly setup. */
-     if (!curbuf->b_help && curwin->w_p_spell && *curbuf->b_p_spl != NUL)
--      did_set_spelllang(curbuf);
-+      (void)did_set_spelllang(curbuf);
- #endif
++{ $as_echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5
++$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
++if test "${ac_cv_sys_largefile_source+set}" = set; then
++  $as_echo_n "(cached) " >&6
++else
++  while :; do
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <sys/types.h> /* for off_t */
++     #include <stdio.h>
++int
++main ()
++{
++int (*fp) (FILE *, off_t, int) = fseeko;
++     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++       test -z "$ac_c_werror_flag" ||
++       test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++       test "$cross_compiling" = yes ||
++       $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_sys_largefile_source=no; break
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#define _LARGEFILE_SOURCE 1
++#include <sys/types.h> /* for off_t */
++     #include <stdio.h>
++int
++main ()
++{
++int (*fp) (FILE *, off_t, int) = fseeko;
++     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext conftest$ac_exeext
++if { (ac_try="$ac_link"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_link") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++       test -z "$ac_c_werror_flag" ||
++       test ! -s conftest.err
++       } && test -s conftest$ac_exeext && {
++       test "$cross_compiling" = yes ||
++       $as_test_x conftest$ac_exeext
++       }; then
++  ac_cv_sys_largefile_source=1; break
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++
++fi
++
++rm -rf conftest.dSYM
++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++      conftest$ac_exeext conftest.$ac_ext
++  ac_cv_sys_largefile_source=unknown
++  break
++done
++fi
++{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5
++$as_echo "$ac_cv_sys_largefile_source" >&6; }
++case $ac_cv_sys_largefile_source in #(
++  no | unknown) ;;
++  *)
++cat >>confdefs.h <<_ACEOF
++#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
++_ACEOF
++;;
++esac
++rm -rf conftest*
++
++# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
++# in glibc 2.1.3, but that breaks too many other things.
++# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
++if test $ac_cv_sys_largefile_source != unknown; then
++
++cat >>confdefs.h <<\_ACEOF
++#define HAVE_FSEEKO 1
++_ACEOF
++
++fi
++
  
-     redraw_later(NOT_VALID);
- }
+ { $as_echo "$as_me:$LINENO: checking for st_blksize" >&5
+ $as_echo_n "checking for st_blksize... " >&6; }
+ cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+@@ -14200,11 +14717,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_strtod" >&5
+ $as_echo "$ac_cv_lib_m_strtod" >&6; }
+-if test $ac_cv_lib_m_strtod = yes; then
++if test "x$ac_cv_lib_m_strtod" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBM 1
+ _ACEOF
  
-@@ -1673,13 +1678,14 @@ buflist_new(ffname, sfname, lnum, flags)
- #endif
+   LIBS="-lm $LIBS"
+@@ -14360,11 +14877,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix1e_acl_get_file" >&5
+ $as_echo "$ac_cv_lib_posix1e_acl_get_file" >&6; }
+-if test $ac_cv_lib_posix1e_acl_get_file = yes; then
++if test "x$ac_cv_lib_posix1e_acl_get_file" = x""yes; then
+   LIBS="$LIBS -lposix1e"
+ else
+   { $as_echo "$as_me:$LINENO: checking for acl_get_file in -lacl" >&5
+ $as_echo_n "checking for acl_get_file in -lacl... " >&6; }
+ if test "${ac_cv_lib_acl_acl_get_file+set}" = set; then
+@@ -14428,11 +14945,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_acl_acl_get_file" >&5
+ $as_echo "$ac_cv_lib_acl_acl_get_file" >&6; }
+-if test $ac_cv_lib_acl_acl_get_file = yes; then
++if test "x$ac_cv_lib_acl_acl_get_file" = x""yes; then
+   LIBS="$LIBS -lacl"
+                 { $as_echo "$as_me:$LINENO: checking for fgetxattr in -lattr" >&5
+ $as_echo_n "checking for fgetxattr in -lattr... " >&6; }
+ if test "${ac_cv_lib_attr_fgetxattr+set}" = set; then
+   $as_echo_n "(cached) " >&6
+@@ -14495,11 +15012,11 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_attr_fgetxattr" >&5
+ $as_echo "$ac_cv_lib_attr_fgetxattr" >&6; }
+-if test $ac_cv_lib_attr_fgetxattr = yes; then
++if test "x$ac_cv_lib_attr_fgetxattr" = x""yes; then
+   LIBS="$LIBS -lattr"
+ fi
  
-     buf->b_fname = buf->b_sfname;
- #ifdef UNIX
-     if (st.st_dev == (dev_T)-1)
--      buf->b_dev = -1;
-+      buf->b_dev_valid = FALSE;
-     else
-     {
-+      buf->b_dev_valid = TRUE;
-       buf->b_dev = st.st_dev;
-       buf->b_ino = st.st_ino;
-     }
- #endif
-     buf->b_u_synced = TRUE;
-@@ -2020,17 +2026,16 @@ buflist_findname_stat(ffname, stp)
- /*
-  * Find file in buffer list by a regexp pattern.
-  * Return fnum of the found buffer.
-  * Return < 0 for error.
-  */
--/*ARGSUSED*/
-     int
- buflist_findpat(pattern, pattern_end, unlisted, diffmode)
-     char_u    *pattern;
-     char_u    *pattern_end;   /* pointer to first char after pattern */
-     int               unlisted;       /* find unlisted buffers */
--    int               diffmode;       /* find diff-mode buffers only */
-+    int               diffmode UNUSED; /* find diff-mode buffers only */
- {
-     buf_T     *buf;
-     regprog_T *prog;
-     int               match = -1;
-     int               find_listed;
-@@ -2398,26 +2403,73 @@ buflist_setfpos(buf, win, lnum, col, cop
-       wip->wi_next->wi_prev = wip;
+ fi
  
-     return;
- }
+@@ -14873,10 +15390,62 @@ _ACEOF
+ else
+   { $as_echo "$as_me:$LINENO: result: yes" >&5
+ $as_echo "yes" >&6; }
+ fi
  
-+#ifdef FEAT_DIFF
-+static int wininfo_other_tab_diff __ARGS((wininfo_T *wip));
-+
-+/*
-+ * Return TRUE when "wip" has 'diff' set and the diff is only for another tab
-+ * page.  That's because a diff is local to a tab page.
-+ */
-+    static int
-+wininfo_other_tab_diff(wip)
-+    wininfo_T *wip;
++{ $as_echo "$as_me:$LINENO: checking for FD_CLOEXEC" >&5
++$as_echo_n "checking for FD_CLOEXEC... " >&6; }
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#if HAVE_FCNTL_H
++# include <fcntl.h>
++#endif
++int
++main ()
 +{
-+    win_T     *wp;
-+
-+    if (wip->wi_opt.wo_diff)
-+    {
-+      for (wp = firstwin; wp != NULL; wp = wp->w_next)
-+          /* return FALSE when it's a window in the current tab page, thus
-+           * the buffer was in diff mode here */
-+          if (wip->wi_win == wp)
-+              return FALSE;
-+      return TRUE;
-+    }
-+    return FALSE;
++      int flag = FD_CLOEXEC;
++  ;
++  return 0;
 +}
-+#endif
++_ACEOF
++rm -f conftest.$ac_objext
++if { (ac_try="$ac_compile"
++case "(($ac_try" in
++  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++  *) ac_try_echo=$ac_try;;
++esac
++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
++$as_echo "$ac_try_echo") >&5
++  (eval "$ac_compile") 2>conftest.er1
++  ac_status=$?
++  grep -v '^ *+' conftest.er1 >conftest.err
++  rm -f conftest.er1
++  cat conftest.err >&5
++  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); } && {
++       test -z "$ac_c_werror_flag" ||
++       test ! -s conftest.err
++       } && test -s conftest.$ac_objext; then
++  { $as_echo "$as_me:$LINENO: result: yes" >&5
++$as_echo "yes" >&6; }; cat >>confdefs.h <<\_ACEOF
++#define HAVE_FD_CLOEXEC 1
++_ACEOF
 +
- /*
-  * Find info for the current window in buffer "buf".
-  * If not found, return the info for the most recently used window.
-+ * When "skip_diff_buffer" is TRUE avoid windows with 'diff' set that is in
-+ * another tab page.
-  * Returns NULL when there isn't any info.
-  */
-     static wininfo_T *
--find_wininfo(buf)
-+find_wininfo(buf, skip_diff_buffer)
-     buf_T     *buf;
-+    int               skip_diff_buffer UNUSED;
- {
-     wininfo_T *wip;
-     for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
--      if (wip->wi_win == curwin)
-+      if (wip->wi_win == curwin
-+#ifdef FEAT_DIFF
-+              && (!skip_diff_buffer || !wininfo_other_tab_diff(wip))
-+#endif
-+         )
-           break;
--    if (wip == NULL)  /* if no fpos for curwin, use the first in the list */
--      wip = buf->b_wininfo;
++else
++  $as_echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
 +
-+    /* If no wininfo for curwin, use the first in the list (that doesn't have
-+     * 'diff' set and is in another tab page). */
-+    if (wip == NULL)
-+    {
-+#ifdef FEAT_DIFF
-+      if (skip_diff_buffer)
-+      {
-+          for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
-+              if (!wininfo_other_tab_diff(wip))
-+                  break;
-+      }
-+      else
-+#endif
-+          wip = buf->b_wininfo;
-+    }
-     return wip;
- }
++      { $as_echo "$as_me:$LINENO: result: not usable" >&5
++$as_echo "not usable" >&6; }
++fi
++
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++
+ { $as_echo "$as_me:$LINENO: checking for rename" >&5
+ $as_echo_n "checking for rename... " >&6; }
+ cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+ _ACEOF
+@@ -15224,11 +15793,10 @@ cat >>confdefs.h <<_ACEOF
+ #define SIZEOF_INT $ac_cv_sizeof_int
+ _ACEOF
  
- /*
-  * Reset the local window options to the values last used in this window.
-@@ -2434,11 +2486,11 @@ get_winopts(buf)
-     clear_winopt(&curwin->w_onebuf_opt);
- #ifdef FEAT_FOLDING
-     clearFolding(curwin);
+-
+ bcopy_test_prog='
+ #include "confdefs.h"
+ #ifdef HAVE_STRING_H
+ # include <string.h>
  #endif
+@@ -15456,11 +16024,11 @@ fi
  
--    wip = find_wininfo(buf);
-+    wip = find_wininfo(buf, TRUE);
-     if (wip != NULL && wip->wi_optset)
-     {
-       copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt);
- #ifdef FEAT_FOLDING
-       curwin->w_fold_manual = wip->wi_fold_manual;
-@@ -2464,13 +2516,13 @@ get_winopts(buf)
-     pos_T *
- buflist_findfpos(buf)
-     buf_T     *buf;
- {
-     wininfo_T *wip;
--    static pos_T no_position = {1, 0};
-+    static pos_T no_position = INIT_POS_T(1, 0, 0);
  
--    wip = find_wininfo(buf);
-+    wip = find_wininfo(buf, FALSE);
-     if (wip != NULL)
-       return &(wip->wi_fpos);
-     else
-       return &no_position;
- }
-@@ -2487,11 +2539,10 @@ buflist_findlnum(buf)
+ if test "$enable_multibyte" = "yes"; then
+   cflags_save=$CFLAGS
+   ldflags_save=$LDFLAGS
+-  if test -n "$x_includes" ; then
++  if test "x$x_includes" != "xNONE" ; then
+     CFLAGS="$CFLAGS -I$x_includes"
+     LDFLAGS="$X_LIBS $LDFLAGS -lX11"
+     { $as_echo "$as_me:$LINENO: checking whether X_LOCALE needed" >&5
+ $as_echo_n "checking whether X_LOCALE needed... " >&6; }
+     cat >conftest.$ac_ext <<_ACEOF
+@@ -15633,21 +16201,22 @@ rm -f core conftest.err conftest.$ac_obj
+       conftest$ac_exeext conftest.$ac_ext
+ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_xpg4__xpg4_setrunelocale" >&5
+ $as_echo "$ac_cv_lib_xpg4__xpg4_setrunelocale" >&6; }
+-if test $ac_cv_lib_xpg4__xpg4_setrunelocale = yes; then
++if test "x$ac_cv_lib_xpg4__xpg4_setrunelocale" = x""yes; then
+   LIBS="$LIBS -lxpg4"
+ fi
  
- #if defined(FEAT_LISTCMDS) || defined(PROTO)
- /*
-  * List all know file names (for :files and :buffers command).
-  */
--/*ARGSUSED*/
-     void
- buflist_list(eap)
-     exarg_T   *eap;
- {
-     buf_T     *buf;
-@@ -2525,12 +2576,12 @@ buflist_list(eap)
-       i = 40 - vim_strsize(IObuff);
-       do
-       {
-           IObuff[len++] = ' ';
-       } while (--i > 0 && len < IOSIZE - 18);
--      vim_snprintf((char *)IObuff + len, IOSIZE - len, _("line %ld"),
--              buf == curbuf ? curwin->w_cursor.lnum
-+      vim_snprintf((char *)IObuff + len, (size_t)(IOSIZE - len),
-+              _("line %ld"), buf == curbuf ? curwin->w_cursor.lnum
-                                              : (long)buflist_findlnum(buf));
-       msg_outtrans(IObuff);
-       out_flush();        /* output one line at a time */
-       ui_breakcheck();
-     }
-@@ -2640,13 +2691,14 @@ setfname(buf, ffname, sfname, message)
-       buf->b_sfname = sfname;
-     }
-     buf->b_fname = buf->b_sfname;
- #ifdef UNIX
-     if (st.st_dev == (dev_T)-1)
--      buf->b_dev = -1;
-+      buf->b_dev_valid = FALSE;
-     else
-     {
-+      buf->b_dev_valid = TRUE;
-       buf->b_dev = st.st_dev;
-       buf->b_ino = st.st_ino;
-     }
- #endif
  
-@@ -2787,18 +2839,18 @@ buflist_slash_adjust()
-     }
- }
- #endif
+ { $as_echo "$as_me:$LINENO: checking how to create tags" >&5
+ $as_echo_n "checking how to create tags... " >&6; }
+ test -f tags && mv tags tags.save
+ if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&5 2>&1; then
+   TAGPRG="ctags -I INIT+ --fields=+S"
+ else
++  TAGPRG="ctags"
+   (eval etags    /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags"
+   (eval etags -c   /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags -c"
+   (eval ctags    /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags"
+   (eval ctags -t   /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -t"
+   (eval ctags -ts  /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -ts"
+@@ -15931,12 +16500,13 @@ rm -f core conftest.err conftest.$ac_obj
+ fi
+ ac_res=`eval 'as_val=${'$as_ac_var'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if test `eval 'as_val=${'$as_ac_var'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_var'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
  
- /*
-- * Set alternate cursor position for current window.
-+ * Set alternate cursor position for the current buffer and window "win".
-  * Also save the local window option values.
-  */
-     void
--buflist_altfpos()
-+buflist_altfpos(win)
-+    win_T *win;
- {
--    buflist_setfpos(curbuf, curwin, curwin->w_cursor.lnum,
--                                                curwin->w_cursor.col, TRUE);
-+    buflist_setfpos(curbuf, win, win->w_cursor.lnum, win->w_cursor.col, TRUE);
- }
+ fi
+@@ -16132,11 +16702,11 @@ else
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5
+ $as_echo "$ac_cv_header_dlfcn_h" >&6; }
  
- /*
-  * Return TRUE if 'ffname' is not the same file as current file.
-  * Fname must have a full path (expanded by mch_FullName()).
-@@ -2836,11 +2888,11 @@ otherfile_buf(buf, ffname
-       struct stat     st;
+ fi
+-if test $ac_cv_header_dlfcn_h = yes; then
++if test "x$ac_cv_header_dlfcn_h" = x""yes; then
+   DLL=dlfcn.h
+ else
+   if test "${ac_cv_header_dl_h+set}" = set; then
+   { $as_echo "$as_me:$LINENO: checking for dl.h" >&5
+ $as_echo_n "checking for dl.h... " >&6; }
+@@ -16262,11 +16832,11 @@ else
+ fi
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_header_dl_h" >&5
+ $as_echo "$ac_cv_header_dl_h" >&6; }
  
-       /* If no struct stat given, get it now */
-       if (stp == NULL)
-       {
--          if (buf->b_dev < 0 || mch_stat((char *)ffname, &st) < 0)
-+          if (!buf->b_dev_valid || mch_stat((char *)ffname, &st) < 0)
-               st.st_dev = (dev_T)-1;
-           stp = &st;
-       }
-       /* Use dev/ino to check if the files are the same, even when the names
-        * are different (possible with links).  Still need to compare the
-@@ -2873,26 +2925,27 @@ buf_setino(buf)
- {
-     struct stat       st;
+ fi
+-if test $ac_cv_header_dl_h = yes; then
++if test "x$ac_cv_header_dl_h" = x""yes; then
+   DLL=dl.h
+ fi
  
-     if (buf->b_fname != NULL && mch_stat((char *)buf->b_fname, &st) >= 0)
-     {
-+      buf->b_dev_valid = TRUE;
-       buf->b_dev = st.st_dev;
-       buf->b_ino = st.st_ino;
-     }
-     else
--      buf->b_dev = -1;
-+      buf->b_dev_valid = FALSE;
- }
  
- /*
-  * Return TRUE if dev/ino in buffer "buf" matches with "stp".
-  */
-     static int
- buf_same_ino(buf, stp)
-     buf_T     *buf;
-     struct stat *stp;
- {
--    return (buf->b_dev >= 0
-+    return (buf->b_dev_valid
-           && stp->st_dev == buf->b_dev
-           && stp->st_ino == buf->b_ino);
- }
- #endif
+ fi
+@@ -16781,12 +17351,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
+                $as_echo "$as_val"'`
+              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
  
-@@ -2915,11 +2968,11 @@ fileinfo(fullname, shorthelp, dont_trunc
-     if (buffer == NULL)
-       return;
+ fi
+-if test `eval 'as_val=${'$as_ac_Header'}
+-               $as_echo "$as_val"'` = yes; then
++as_val=`eval 'as_val=${'$as_ac_Header'}
++               $as_echo "$as_val"'`
++   if test "x$as_val" = x""yes; then
+   cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
  
-     if (fullname > 1)     /* 2 CTRL-G: include buffer number */
-     {
--      sprintf((char *)buffer, "buf %d: ", curbuf->b_fnum);
-+      vim_snprintf((char *)buffer, IOSIZE, "buf %d: ", curbuf->b_fnum);
-       p = buffer + STRLEN(buffer);
-     }
-     else
-       p = buffer;
+ fi
+@@ -16814,28 +17385,36 @@ $as_echo "yes" >&6; }
+     { $as_echo "$as_me:$LINENO: result: no" >&5
+ $as_echo "no" >&6; }
+   fi
+ fi
+ if test "x$MACARCH" = "xboth"; then
+-  LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
++  LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
+ fi
  
-@@ -2989,15 +3042,16 @@ fileinfo(fullname, shorthelp, dont_trunc
-               _("line %ld of %ld --%d%%-- col "),
-               (long)curwin->w_cursor.lnum,
-               (long)curbuf->b_ml.ml_line_count,
-               n);
-       validate_virtcol();
--      col_print(buffer + STRLEN(buffer),
-+      len = STRLEN(buffer);
-+      col_print(buffer + len, IOSIZE - len,
-                  (int)curwin->w_cursor.col + 1, (int)curwin->w_virtcol + 1);
-     }
+-{ $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
+-$as_echo_n "checking for GCC 3 or later... " >&6; }
+ DEPEND_CFLAGS_FILTER=
+ if test "$GCC" = yes; then
++  { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
++$as_echo_n "checking for GCC 3 or later... " >&6; }
+   gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'`
+   if test "$gccmajor" -gt "2"; then
+     DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
+-  fi
+-fi
+-if test "$DEPEND_CFLAGS_FILTER" = ""; then
+-  { $as_echo "$as_me:$LINENO: result: no" >&5
++    { $as_echo "$as_me:$LINENO: result: yes" >&5
++$as_echo "yes" >&6; }
++  else
++    { $as_echo "$as_me:$LINENO: result: no" >&5
+ $as_echo "no" >&6; }
+-else
+-  { $as_echo "$as_me:$LINENO: result: yes" >&5
++  fi
++        { $as_echo "$as_me:$LINENO: checking whether we need -D_FORTIFY_SOURCE=1" >&5
++$as_echo_n "checking whether we need -D_FORTIFY_SOURCE=1... " >&6; }
++  if test "$gccmajor" -gt "3"; then
++    CFLAGS=`echo "$CFLAGS" | sed -e 's/-Wp,-D_FORTIFY_SOURCE=.//g' -e 's/-D_FORTIFY_SOURCE=.//g' -e 's/$/ -D_FORTIFY_SOURCE=1/'`
++    { $as_echo "$as_me:$LINENO: result: yes" >&5
+ $as_echo "yes" >&6; }
++  else
++    { $as_echo "$as_me:$LINENO: result: no" >&5
++$as_echo "no" >&6; }
++  fi
+ fi
  
--    (void)append_arg_number(curwin, buffer, !shortmess(SHM_FILE), IOSIZE);
-+    (void)append_arg_number(curwin, buffer, IOSIZE, !shortmess(SHM_FILE));
  
-     if (dont_truncate)
-     {
-       /* Temporarily set msg_scroll to avoid the message being truncated.
-        * First call msg_start() to get the message in the right place. */
-@@ -3021,19 +3075,20 @@ fileinfo(fullname, shorthelp, dont_trunc
+ ac_config_files="$ac_config_files auto/config.mk:config.mk.in"
  
-     vim_free(buffer);
- }
+@@ -16864,12 +17443,12 @@ _ACEOF
+   for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+     eval ac_val=\$$ac_var
+     case $ac_val in #(
+     *${as_nl}*)
+       case $ac_var in #(
+-      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+-$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
++      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+       esac
+       case $ac_var in #(
+       _ | IFS | as_nl) ;; #(
+       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+       *) $as_unset $ac_var ;;
+@@ -17257,11 +17836,11 @@ exec 6>&1
+ # Save the log message, to keep $[0] and so on meaningful, and to
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+ This file was extended by $as_me, which was
+-generated by GNU Autoconf 2.62.  Invocation command line was
++generated by GNU Autoconf 2.63.  Invocation command line was
  
-     void
--col_print(buf, col, vcol)
-+col_print(buf, buflen, col, vcol)
-     char_u  *buf;
-+    size_t  buflen;
-     int           col;
-     int           vcol;
- {
-     if (col == vcol)
--      sprintf((char *)buf, "%d", col);
-+      vim_snprintf((char *)buf, buflen, "%d", col);
-     else
--      sprintf((char *)buf, "%d-%d", col, vcol);
-+      vim_snprintf((char *)buf, buflen, "%d-%d", col, vcol);
- }
+   CONFIG_FILES    = $CONFIG_FILES
+   CONFIG_HEADERS  = $CONFIG_HEADERS
+   CONFIG_LINKS    = $CONFIG_LINKS
+   CONFIG_COMMANDS = $CONFIG_COMMANDS
+@@ -17270,10 +17849,19 @@ generated by GNU Autoconf 2.62.  Invocat
+ on `(hostname || uname -n) 2>/dev/null | sed 1q`
+ "
  
- #if defined(FEAT_TITLE) || defined(PROTO)
- /*
-  * put file name in title bar of window and in icon title
-@@ -3142,22 +3197,22 @@ maketitle()
-               /* remove the file name */
-               p = gettail_sep(buf + off);
-               if (p == buf + off)
-                   /* must be a help buffer */
-                   vim_strncpy(buf + off, (char_u *)_("help"),
--                                                          IOSIZE - off - 1);
-+                                                (size_t)(IOSIZE - off - 1));
-               else
-                   *p = NUL;
+ _ACEOF
  
-               /* translate unprintable chars */
-               p = transstr(buf + off);
--              vim_strncpy(buf + off, p, IOSIZE - off - 1);
-+              vim_strncpy(buf + off, p, (size_t)(IOSIZE - off - 1));
-               vim_free(p);
-               STRCAT(buf, ")");
-           }
++case $ac_config_files in *"
++"*) set x $ac_config_files; shift; ac_config_files=$*;;
++esac
++
++case $ac_config_headers in *"
++"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
++esac
++
++
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ # Files that config.status was made for.
+ config_files="$ac_config_files"
+ config_headers="$ac_config_headers"
  
--          append_arg_number(curwin, buf, FALSE, IOSIZE);
-+          append_arg_number(curwin, buf, IOSIZE, FALSE);
+@@ -17282,20 +17870,21 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ ac_cs_usage="\
+ \`$as_me' instantiates files from templates according to the
+ current configuration.
  
- #if defined(FEAT_CLIENTSERVER)
-           if (serverName != NULL)
-           {
-               STRCAT(buf, " - ");
-@@ -3290,18 +3345,17 @@ free_titles()
-  * Item: %-<minwid>.<maxwid><itemch> All but <itemch> are optional
-  *
-  * If maxwidth is not zero, the string will be filled at any middle marker
-  * or truncated if too long, fillchar is used for all whitespace.
-  */
--/*ARGSUSED*/
-     int
- build_stl_str_hl(wp, out, outlen, fmt, use_sandbox, fillchar, maxwidth, hltab, tabtab)
-     win_T     *wp;
-     char_u    *out;           /* buffer to write into != NameBuff */
-     size_t    outlen;         /* length of out[] */
-     char_u    *fmt;
--    int               use_sandbox;    /* "fmt" was set insecurely, use sandbox */
-+    int               use_sandbox UNUSED; /* "fmt" was set insecurely, use sandbox */
-     int               fillchar;
-     int               maxwidth;
-     struct stl_hlrec *hltab;  /* return: HL attributes (can be NULL) */
-     struct stl_hlrec *tabtab; /* return: tab page nrs (can be NULL) */
- {
-@@ -3468,11 +3522,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
-               else
- #endif
-                   n = (long)(p - t) - item[groupitem[groupdepth]].maxwid + 1;
+-Usage: $0 [OPTIONS] [FILE]...
++Usage: $0 [OPTION]... [FILE]...
  
-               *t = '<';
--              mch_memmove(t + 1, t + n, p - (t + n));
-+              mch_memmove(t + 1, t + n, (size_t)(p - (t + n)));
-               p = p - n + 1;
- #ifdef FEAT_MBYTE
-               /* Fill up space left over by half a double-wide char. */
-               while (++l < item[groupitem[groupdepth]].minwid)
-                   *p++ = fillchar;
-@@ -3498,11 +3552,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
-                       *p++ = fillchar;
-               }
-               else
-               {
-                   /* fill by inserting characters */
--                  mch_memmove(t + n - l, t, p - t);
-+                  mch_memmove(t + n - l, t, (size_t)(p - t));
-                   l = n - l;
-                   if (p + l >= out + outlen)
-                       l = (long)((out + outlen) - p - 1);
-                   p += l;
-                   for (n = groupitem[groupdepth] + 1; n < curitem; n++)
-@@ -3634,11 +3688,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
-           s++;
-           *p = 0;
-           p = t;
+   -h, --help       print this help, then exit
+   -V, --version    print version number and configuration settings, then exit
+-  -q, --quiet      do not print progress messages
++  -q, --quiet, --silent
++                   do not print progress messages
+   -d, --debug      don't remove temporary files
+       --recheck    update $as_me by reconfiguring in the same conditions
+-  --file=FILE[:TEMPLATE]
++      --file=FILE[:TEMPLATE]
+                    instantiate the configuration file FILE
+-  --header=FILE[:TEMPLATE]
++      --header=FILE[:TEMPLATE]
+                    instantiate the configuration header FILE
  
- #ifdef FEAT_EVAL
--          sprintf((char *)tmp, "%d", curbuf->b_fnum);
-+          vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
-           set_internal_string_var((char_u *)"actual_curbuf", tmp);
+ Configuration files:
+ $config_files
  
-           o_curbuf = curbuf;
-           o_curwin = curwin;
-           curwin = wp;
-@@ -3701,17 +3755,17 @@ build_stl_str_hl(wp, out, outlen, fmt, u
-                       (long)wp->w_buffer->b_ml.ml_line_count);
-           break;
+@@ -17306,11 +17895,11 @@ Report bugs to <bug-autoconf@gnu.org>."
  
-       case STL_ALTPERCENT:
-           str = tmp;
--          get_rel_pos(wp, str);
-+          get_rel_pos(wp, str, TMPLEN);
-           break;
+ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_version="\\
+ config.status
+-configured by $0, generated by GNU Autoconf 2.62,
++configured by $0, generated by GNU Autoconf 2.63,
+   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
  
-       case STL_ARGLISTSTAT:
-           fillable = FALSE;
-           tmp[0] = 0;
--          if (append_arg_number(wp, tmp, FALSE, (int)sizeof(tmp)))
-+          if (append_arg_number(wp, tmp, (int)sizeof(tmp), FALSE))
-               str = tmp;
-           break;
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ This config.status script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it."
+@@ -17503,11 +18092,12 @@ for ac_last_try in false false false fal
+   . ./conf$$subs.sh ||
+     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+ $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+    { (exit 1); exit 1; }; }
  
-       case STL_KEYMAP:
-           fillable = FALSE;
-@@ -3742,11 +3796,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
-           break;
+-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then
++  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
++  if test $ac_delim_n = $ac_delim_num; then
+     break
+   elif $ac_last_try; then
+     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+ $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+    { (exit 1); exit 1; }; }
+@@ -17708,21 +18298,21 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+     defundef = substr(arg[1], 2)
+     mac1 = arg[2]
+   }
+   split(mac1, mac2, "(") #)
+   macro = mac2[1]
++  prefix = substr(line, 1, index(line, defundef) - 1)
+   if (D_is_set[macro]) {
+     # Preserve the white space surrounding the "#".
+-    prefix = substr(line, 1, index(line, defundef) - 1)
+     print prefix "define", macro P[macro] D[macro]
+     next
+   } else {
+     # Replace #undef with comments.  This is necessary, for example,
+     # in the case of _POSIX_SOURCE, which is predefined and required
+     # on some systems where configure will not decide to define it.
+     if (defundef == "undef") {
+-      print "/*", line, "*/"
++      print "/*", prefix defundef, macro, "*/"
+       next
+     }
+   }
+ }
+ { print }
+@@ -17742,12 +18332,12 @@ do
+   case $ac_tag in
+   :[FHLC]) ac_mode=$ac_tag; continue;;
+   esac
+   case $ac_mode$ac_tag in
+   :[FHL]*:*);;
+-  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+-$as_echo "$as_me: error: Invalid tag $ac_tag." >&2;}
++  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
++$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
+    { (exit 1); exit 1; }; };;
+   :[FH]-) ac_tag=-:-;;
+   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+   esac
+   ac_save_IFS=$IFS
+@@ -18061,10 +18651,10 @@ if test "$no_create" != yes; then
+   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+   # would make configure fail if this is the last instruction.
+   $ac_cs_success || { (exit 1); exit 1; }
+ fi
+ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+-  { $as_echo "$as_me:$LINENO: WARNING: Unrecognized options: $ac_unrecognized_opts" >&5
+-$as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;}
++  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
++$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ fi
  
-       case STL_BYTEVAL_X:
-           base = 'X';
-       case STL_BYTEVAL:
--          if (wp->w_cursor.col > STRLEN(linecont))
-+          if (wp->w_cursor.col > (colnr_T)STRLEN(linecont))
-               num = 0;
-           else
-           {
- #ifdef FEAT_MBYTE
-               num = (*mb_ptr2char)(linecont + wp->w_cursor.col);
-@@ -3915,11 +3969,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
-           }
-           *t++ = '%';
-           if (zeropad)
-               *t++ = '0';
-           *t++ = '*';
--          *t++ = nbase == 16 ? base : (nbase == 8 ? 'o' : 'd');
-+          *t++ = nbase == 16 ? base : (char_u)(nbase == 8 ? 'o' : 'd');
-           *t = 0;
  
-           for (n = num, l = 1; n >= nbase; n /= nbase)
-               l++;
-           if (opt == STL_VIRTCOL_ALT)
-@@ -3961,11 +4015,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+--- vim72.orig/src/buffer.c
++++ vim72/src/buffer.c
+@@ -31,21 +31,22 @@
+ static char_u *buflist_match __ARGS((regprog_T *prog, buf_T *buf));
+ # define HAVE_BUFLIST_MATCH
+ static char_u *fname_match __ARGS((regprog_T *prog, char_u *name));
+ #endif
+ static void   buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options));
+-static wininfo_T *find_wininfo __ARGS((buf_T *buf));
++static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer));
+ #ifdef UNIX
+ static buf_T  *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st));
+ static int    otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp));
+ static int    buf_same_ino __ARGS((buf_T *buf, struct stat *stp));
+ #else
+ static int    otherfile_buf __ARGS((buf_T *buf, char_u *ffname));
  #endif
+ #ifdef FEAT_TITLE
+ static int    ti_change __ARGS((char_u *str, char_u **last));
+ #endif
++static int    append_arg_number __ARGS((win_T *wp, char_u *buf, int buflen, int add_file));
+ static void   free_buffer __ARGS((buf_T *));
+ static void   free_buffer_stuff __ARGS((buf_T *buf, int free_options));
+ static void   clear_wininfo __ARGS((buf_T *buf));
  
-     width = vim_strsize(out);
-     if (maxwidth > 0 && width > maxwidth)
-     {
--      /* Result is too long, must trunctate somewhere. */
-+      /* Result is too long, must truncate somewhere. */
-       l = 0;
-       if (itemcnt == 0)
-           s = out;
-       else
-       {
-@@ -4108,64 +4162,67 @@ build_stl_str_hl(wp, out, outlen, fmt, u
- #endif /* FEAT_STL_OPT */
+ #ifdef UNIX
+@@ -112,11 +113,11 @@ open_buffer(read_stdin, eap)
+     old_curbuf = curbuf;
+     modified_was_set = FALSE;
+ #endif
  
- #if defined(FEAT_STL_OPT) || defined(FEAT_CMDL_INFO) \
-           || defined(FEAT_GUI_TABLINE) || defined(PROTO)
- /*
-- * Get relative cursor position in window into "str[]", in the form 99%, using
-- * "Top", "Bot" or "All" when appropriate.
-+ * Get relative cursor position in window into "buf[buflen]", in the form 99%,
-+ * using "Top", "Bot" or "All" when appropriate.
-  */
-     void
--get_rel_pos(wp, str)
-+get_rel_pos(wp, buf, buflen)
-     win_T     *wp;
--    char_u    *str;
-+    char_u    *buf;
-+    int               buflen;
- {
-     long      above; /* number of lines above window */
-     long      below; /* number of lines below window */
+     /* mark cursor position as being invalid */
+-    changed_line_abv_curs();
++    curwin->w_valid = 0;
  
-     above = wp->w_topline - 1;
- #ifdef FEAT_DIFF
-     above += diff_check_fill(wp, wp->w_topline) - wp->w_topfill;
- #endif
-     below = wp->w_buffer->b_ml.ml_line_count - wp->w_botline + 1;
-     if (below <= 0)
--      STRCPY(str, above == 0 ? _("All") : _("Bot"));
-+      vim_strncpy(buf, (char_u *)(above == 0 ? _("All") : _("Bot")),
-+                                                      (size_t)(buflen - 1));
-     else if (above <= 0)
--      STRCPY(str, _("Top"));
-+      vim_strncpy(buf, (char_u *)_("Top"), (size_t)(buflen - 1));
-     else
--      sprintf((char *)str, "%2d%%", above > 1000000L
-+      vim_snprintf((char *)buf, (size_t)buflen, "%2d%%", above > 1000000L
-                                   ? (int)(above / ((above + below) / 100L))
-                                   : (int)(above * 100L / (above + below)));
- }
+     if (curbuf->b_ffname != NULL
+ #ifdef FEAT_NETBEANS_INTG
+           && netbeansReadFile
  #endif
- /*
-- * Append (file 2 of 8) to 'buf', if editing more than one file.
-+ * Append (file 2 of 8) to "buf[buflen]", if editing more than one file.
-  * Return TRUE if it was appended.
-  */
--    int
--append_arg_number(wp, buf, add_file, maxlen)
-+    static int
-+append_arg_number(wp, buf, buflen, add_file)
-     win_T     *wp;
-     char_u    *buf;
-+    int               buflen;
-     int               add_file;       /* Add "file" before the arg number */
--    int               maxlen;         /* maximum nr of chars in buf or zero*/
+@@ -312,11 +313,11 @@ close_buffer(win, buf, action)
+     buf_T     *buf;
+     int               action;
  {
-     char_u    *p;
+ #ifdef FEAT_AUTOCMD
+     int               is_curbuf;
+-    int               nwindows = buf->b_nwindows;
++    int               nwindows;
+ #endif
+     int               unload_buf = (action != 0);
+     int               del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
+     int               wipe_buf = (action == DOBUF_WIPE);
  
-     if (ARGCOUNT <= 1)                /* nothing to do */
-       return FALSE;
+@@ -435,14 +436,10 @@ close_buffer(win, buf, action)
+      */
+     if (buf == curbuf && !is_curbuf)
+       return;
+ #endif
  
--    p = buf + STRLEN(buf);            /* go to the end of the buffer */
--    if (maxlen && p - buf + 35 >= maxlen) /* getting too long */
-+    p = buf + STRLEN(buf);    /* go to the end of the buffer */
-+    if (p - buf + 35 >= buflen)       /* getting too long */
-       return FALSE;
-     *p++ = ' ';
-     *p++ = '(';
-     if (add_file)
-     {
-       STRCPY(p, "file ");
-       p += 5;
-     }
--    sprintf((char *)p, wp->w_arg_idx_invalid ? "(%d) of %d)"
-+    vim_snprintf((char *)p, (size_t)(buflen - (p - buf)),
-+              wp->w_arg_idx_invalid ? "(%d) of %d)"
-                                 : "%d of %d)", wp->w_arg_idx + 1, ARGCOUNT);
-     return TRUE;
- }
+-#ifdef FEAT_NETBEANS_INTG
+-    if (usingNetbeans)
+-      netbeans_file_closed(buf);
+-#endif
+     /* Change directories when the 'acd' option is set. */
+     DO_AUTOCHDIR
  
- /*
-@@ -4217,14 +4274,13 @@ fix_fname(fname)
+     /*
+      * Remove the buffer from the list.
+@@ -513,16 +510,15 @@ buf_clear_file(buf)
  
  /*
-  * Make "ffname" a full file name, set "sfname" to "ffname" if not NULL.
-  * "ffname" becomes a pointer to allocated memory (or NULL).
+  * buf_freeall() - free all things allocated for a buffer that are related to
+  * the file.
   */
 -/*ARGSUSED*/
      void
- fname_expand(buf, ffname, sfname)
--    buf_T     *buf;
-+    buf_T     *buf UNUSED;
-     char_u    **ffname;
-     char_u    **sfname;
+ buf_freeall(buf, del_buf, wipe_buf)
+     buf_T     *buf;
+-    int               del_buf;        /* buffer is going to be deleted */
+-    int               wipe_buf;       /* buffer is going to be wiped out */
++    int               del_buf UNUSED;     /* buffer is going to be deleted */
++    int               wipe_buf UNUSED;    /* buffer is going to be wiped out */
  {
-     if (*ffname == NULL)      /* if no file name given, nothing to do */
-       return;
-@@ -4486,11 +4542,11 @@ do_arg_all(count, forceit, keep_tabs)
-           }
-           (void)do_ecmd(0, alist_name(&AARGLIST(alist)[i]), NULL, NULL,
-                     ECMD_ONE,
-                     ((P_HID(curwin->w_buffer)
-                          || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0)
--                                                             + ECMD_OLDBUF);
-+                                                     + ECMD_OLDBUF, curwin);
  #ifdef FEAT_AUTOCMD
-           if (use_firstwin)
-               ++autocmd_no_leave;
+     int               is_curbuf = (buf == curbuf);
+     apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf);
+@@ -637,18 +633,25 @@ free_buffer_stuff(buf, free_options)
+     uc_clear(&buf->b_ucmds);          /* clear local user commands */
  #endif
-           use_firstwin = FALSE;
-@@ -4944,11 +5000,11 @@ read_viminfo_bufferlist(virp, writing)
-       col = 0;
-       tab = vim_strrchr(xline, '\t');
-       if (tab != NULL)
-       {
-           *tab++ = '\0';
--          col = atoi((char *)tab);
-+          col = (colnr_T)atoi((char *)tab);
-           tab = vim_strrchr(xline, '\t');
-           if (tab != NULL)
-           {
-               *tab++ = '\0';
-               lnum = atol((char *)tab);
-@@ -4982,19 +5038,21 @@ write_viminfo_bufferlist(fp)
-     win_T     *win;
-     tabpage_T *tp;
+ #ifdef FEAT_SIGNS
+     buf_delete_signs(buf);            /* delete any signs */
  #endif
-     char_u    *line;
-     int               max_buffers;
-+    size_t    len;
-     if (find_viminfo_parameter('%') == NULL)
-       return;
-     /* Without a number -1 is returned: do all buffers. */
-     max_buffers = get_viminfo_parameter('%');
-     /* Allocate room for the file name, lnum and col. */
--    line = alloc(MAXPATHL + 40);
-+#define LINE_BUF_LEN (MAXPATHL + 40)
-+    line = alloc(LINE_BUF_LEN);
-     if (line == NULL)
-       return;
++#ifdef FEAT_NETBEANS_INTG
++    if (usingNetbeans)
++        netbeans_file_killed(buf);
++#endif
+ #ifdef FEAT_LOCALMAP
+     map_clear_int(buf, MAP_ALL_MODES, TRUE, FALSE);  /* clear local mappings */
+     map_clear_int(buf, MAP_ALL_MODES, TRUE, TRUE);   /* clear local abbrevs */
+ #endif
+ #ifdef FEAT_MBYTE
+     vim_free(buf->b_start_fenc);
+     buf->b_start_fenc = NULL;
+ #endif
++#ifdef FEAT_SPELL
++    ga_clear(&buf->b_langp);
++#endif
+ }
  
- #ifdef FEAT_WINDOWS
-     FOR_ALL_TAB_WINDOWS(tp, win)
-@@ -5016,11 +5074,12 @@ write_viminfo_bufferlist(fp)
+ /*
+  * Free the b_wininfo list for buffer "buf".
+  */
+@@ -810,13 +813,10 @@ do_bufdel(command, arg, addr_count, star
+     int               deleted = 0;    /* number of buffers deleted */
+     char_u    *errormsg = NULL; /* return value */
+     int               bnr;            /* buffer number */
+     char_u    *p;
  
-       if (max_buffers-- == 0)
-           break;
-       putc('%', fp);
-       home_replace(NULL, buf->b_ffname, line, MAXPATHL, TRUE);
--      sprintf((char *)line + STRLEN(line), "\t%ld\t%d",
-+      len = STRLEN(line);
-+      vim_snprintf((char *)line + len, len - LINE_BUF_LEN, "\t%ld\t%d",
-                       (long)buf->b_last_cursor.lnum,
-                       buf->b_last_cursor.col);
-       viminfo_writestring(fp, line);
-     }
-     vim_free(line);
-@@ -5046,11 +5105,12 @@ buf_spname(buf)
-        * For location list window, w_llist_ref points to the location list.
-        * For quickfix window, w_llist_ref is NULL.
-        */
-       FOR_ALL_TAB_WINDOWS(tp, win)
-           if (win->w_buffer == buf)
--              break;
-+              goto win_found;
-+win_found:
-       if (win != NULL && win->w_llist_ref != NULL)
-           return _("[Location List]");
-       else
-           return _("[Quickfix List]");
-     }
-@@ -5060,11 +5120,11 @@ buf_spname(buf)
-      * contains the name as specified by the user */
-     if (bt_nofile(buf))
+-#ifdef FEAT_NETBEANS_INTG
+-    netbeansCloseFile = 1;
+-#endif
+     if (addr_count == 0)
      {
-       if (buf->b_sfname != NULL)
-           return (char *)buf->b_sfname;
--      return "[Scratch]";
-+      return _("[Scratch]");
+       (void)do_buffer(command, DOBUF_CURRENT, FORWARD, 0, forceit);
      }
- #endif
-     if (buf->b_fname == NULL)
-       return _("[No Name]");
-     return NULL;
-@@ -5173,11 +5233,11 @@ buf_addsign(buf, id, lnum, typenr)
-     insert_sign(buf, prev, sign, id, lnum, typenr);
-     return;
- }
--    int
-+    linenr_T
- buf_change_sign_type(buf, markId, typenr)
-     buf_T     *buf;           /* buffer to store sign in */
-     int               markId;         /* sign ID */
-     int               typenr;         /* typenr of sign we are adding */
- {
-@@ -5190,14 +5250,14 @@ buf_change_sign_type(buf, markId, typenr
-           sign->typenr = typenr;
-           return sign->lnum;
+     else
+@@ -907,13 +907,10 @@ do_bufdel(command, arg, addr_count, star
+                   smsg((char_u *)_("%d buffers wiped out"), deleted);
+           }
        }
      }
  
--    return 0;
-+    return (linenr_T)0;
+-#ifdef FEAT_NETBEANS_INTG
+-    netbeansCloseFile = 0;
+-#endif
+     return errormsg;
  }
  
--    int_u
-+    int
- buf_getsigntype(buf, lnum, type)
-     buf_T     *buf;
-     linenr_T  lnum;
-     int               type;   /* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */
- {
-@@ -5512,15 +5572,14 @@ buf_contents_changed(buf)
  /*
-  * Wipe out a buffer and decrement the last buffer number if it was used for
-  * this buffer.  Call this to wipe out a temp buffer that does not contain any
-  * marks.
-  */
--/*ARGSUSED*/
-     void
- wipe_buffer(buf, aucmd)
-     buf_T     *buf;
--    int               aucmd;      /* When TRUE trigger autocommands. */
-+    int               aucmd UNUSED;       /* When TRUE trigger autocommands. */
- {
-     if (buf->b_fnum == top_file_num - 1)
-       --top_file_num;
- #ifdef FEAT_AUTOCMD
---- vim72.orig/src/if_perl.xs
-+++ vim72/src/if_perl.xs
-@@ -60,10 +60,15 @@
- #endif
- #if (PERL_REVISION == 5) && (PERL_VERSION >= 9)
- # define PERL589_OR_LATER
+@@ -1088,11 +1085,11 @@ do_buffer(action, start, dir, count, for
+ #ifdef FEAT_WINDOWS
+           close_windows(buf, TRUE);
  #endif
+           setpcmark();
+           retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE,
+-                                                forceit ? ECMD_FORCEIT : 0);
++                                        forceit ? ECMD_FORCEIT : 0, curwin);
  
-+#if (PERL_REVISION == 5) && ((PERL_VERSION > 10) || \
-+    (PERL_VERSION == 10) && (PERL_SUBVERSION >= 1))
-+# define PERL5101_OR_LATER
-+#endif
-+
- #ifndef pTHX
- #    define pTHX void
- #    define pTHX_
- #endif
+           /*
+            * do_ecmd() may create a new buffer, then we have to delete
+            * the old one.  But do_ecmd() may have done that already, check
+            * if the buffer still exists.
+@@ -1235,11 +1232,11 @@ do_buffer(action, start, dir, count, for
+ # ifdef FEAT_WINDOWS
+       /* If 'switchbuf' contains "useopen": jump to first window containing
+        * "buf" if one exists */
+       if ((swb_flags & SWB_USEOPEN) && buf_jump_open_win(buf))
+           return OK;
+-      /* If 'switchbuf' contians "usetab": jump to first window in any tab
++      /* If 'switchbuf' contains "usetab": jump to first window in any tab
+        * page containing "buf" if one exists */
+       if ((swb_flags & SWB_USETAB) && buf_jump_open_tab(buf))
+           return OK;
+       if (win_split(0, 0) == FAIL)
+ # endif
+@@ -1311,11 +1308,11 @@ set_curbuf(buf, action)
+                                                    || action == DOBUF_WIPE);
  
-@@ -91,10 +96,13 @@ EXTERN_C void boot_DynaLoader __ARGS((pT
- # define perl_run dll_perl_run
- # define perl_destruct dll_perl_destruct
- # define perl_free dll_perl_free
- # define Perl_get_context dll_Perl_get_context
- # define Perl_croak dll_Perl_croak
-+# ifdef PERL5101_OR_LATER
-+#  define Perl_croak_xs_usage dll_Perl_croak_xs_usage
-+# endif
- # ifndef PROTO
- #  define Perl_croak_nocontext dll_Perl_croak_nocontext
- #  define Perl_call_argv dll_Perl_call_argv
- #  define Perl_call_pv dll_Perl_call_pv
- #  define Perl_eval_sv dll_Perl_eval_sv
-@@ -134,10 +142,13 @@ EXTERN_C void boot_DynaLoader __ARGS((pT
- #ifdef PERL589_OR_LATER
- #  define Perl_sv_2iv_flags dll_Perl_sv_2iv_flags
- #  define Perl_newXS_flags dll_Perl_newXS_flags
+     setpcmark();
+     if (!cmdmod.keepalt)
+       curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */
+-    buflist_altfpos();                         /* remember curpos */
++    buflist_altfpos(curwin);                   /* remember curpos */
+ #ifdef FEAT_VISUAL
+     /* Don't restart Select mode after switching to another buffer. */
+     VIsual_reselect = FALSE;
  #endif
- # define Perl_sv_free dll_Perl_sv_free
-+# if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
-+#  define Perl_sv_free2 dll_Perl_sv_free2
-+# endif
- # define Perl_sv_isa dll_Perl_sv_isa
- # define Perl_sv_magic dll_Perl_sv_magic
- # define Perl_sv_setiv dll_Perl_sv_setiv
- # define Perl_sv_setpv dll_Perl_sv_setpv
- # define Perl_sv_setpvn dll_Perl_sv_setpvn
-@@ -161,11 +172,11 @@ EXTERN_C void boot_DynaLoader __ARGS((pT
- # define Perl_Idefgv_ptr dll_Perl_Idefgv_ptr
- # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr
- # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr
- # define boot_DynaLoader dll_boot_DynaLoader
--# define Perl_sys_init3 dll_Perl_sys_init3
-+# define Perl_sys_init dll_Perl_sys_init
- # define Perl_sys_term dll_Perl_sys_term
- # define Perl_ISv_ptr dll_Perl_ISv_ptr
- # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr
- # define Perl_Istack_base_ptr dll_Perl_Istack_base_ptr
- # define Perl_Itmps_ix_ptr dll_Perl_Itmps_ix_ptr
-@@ -197,10 +208,13 @@ static void (*perl_destruct)(PerlInterpr
- static void (*perl_free)(PerlInterpreter*);
- static int (*perl_run)(PerlInterpreter*);
- static int (*perl_parse)(PerlInterpreter*, XSINIT_t, int, char**, char**);
- static void* (*Perl_get_context)(void);
- static void (*Perl_croak)(pTHX_ const char*, ...);
-+#ifdef PERL5101_OR_LATER
-+static void (*Perl_croak_xs_usage)(pTHX_ const CV *const, const char *const params);
-+#endif
- static void (*Perl_croak_nocontext)(const char*, ...);
- static I32 (*Perl_dowantarray)(pTHX);
- static void (*Perl_free_tmps)(pTHX);
- static HV* (*Perl_gv_stashpv)(pTHX_ const char*, I32);
- static void (*Perl_markstack_grow)(pTHX);
-@@ -266,11 +280,12 @@ static GV** (*Perl_Idefgv_ptr)(register
- static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*);
- static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*);
- static void (*boot_DynaLoader)_((pTHX_ CV*));
- #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
--static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env);
-+static void (*Perl_sv_free2)(pTHX_ SV*);
-+static void (*Perl_sys_init)(int* argc, char*** argv);
- static void (*Perl_sys_term)(void);
- static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
- static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*);
- static SV*** (*Perl_Istack_base_ptr)(register PerlInterpreter*);
- static XPV** (*Perl_IXpv_ptr)(register PerlInterpreter*);
-@@ -300,10 +315,13 @@ static struct {
-     {"perl_free", (PERL_PROC*)&perl_free},
-     {"perl_run", (PERL_PROC*)&perl_run},
-     {"perl_parse", (PERL_PROC*)&perl_parse},
-     {"Perl_get_context", (PERL_PROC*)&Perl_get_context},
-     {"Perl_croak", (PERL_PROC*)&Perl_croak},
-+#ifdef PERL5101_OR_LATER
-+    {"Perl_croak_xs_usage", (PERL_PROC*)&Perl_croak_xs_usage},
-+#endif
-     {"Perl_croak_nocontext", (PERL_PROC*)&Perl_croak_nocontext},
-     {"Perl_dowantarray", (PERL_PROC*)&Perl_dowantarray},
-     {"Perl_free_tmps", (PERL_PROC*)&Perl_free_tmps},
-     {"Perl_gv_stashpv", (PERL_PROC*)&Perl_gv_stashpv},
-     {"Perl_markstack_grow", (PERL_PROC*)&Perl_markstack_grow},
-@@ -365,11 +383,12 @@ static struct {
-     {"Perl_Tmarkstack_max_ptr", (PERL_PROC*)&Perl_Tmarkstack_max_ptr},
-     {"Perl_TSv_ptr", (PERL_PROC*)&Perl_TSv_ptr},
-     {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr},
-     {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
- #else
--    {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3},
-+    {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
-+    {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init},
-     {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
-     {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
-     {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
-     {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr},
-     {"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr},
-@@ -453,11 +472,11 @@ perl_init()
-     char *bootargs[] = { "VI", NULL };
-     int argc = 3;
-     static char *argv[] = { "", "-e", "" };
+@@ -1349,15 +1346,16 @@ set_curbuf(buf, action)
+                       && !P_HID(prevbuf)
+                       && !bufIsChanged(prevbuf)) ? DOBUF_UNLOAD : 0);
+       }
+     }
+ #ifdef FEAT_AUTOCMD
++    /* An autocommand may have deleted "buf", already entered it (e.g., when
++     * it did ":bunload") or aborted the script processing! */
+ # ifdef FEAT_EVAL
+-    /* An autocommand may have deleted buf or aborted the script processing! */
+-    if (buf_valid(buf) && !aborting())
++    if (buf_valid(buf) && buf != curbuf && !aborting())
+ # else
+-    if (buf_valid(buf))           /* an autocommand may have deleted buf! */
++    if (buf_valid(buf) && buf != curbuf)
+ # endif
+ #endif
+       enter_buffer(buf);
+ }
  
- #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
--    Perl_sys_init3(&argc, (char***)&argv, NULL);
-+    Perl_sys_init(&argc, (char***)&argv);
+@@ -1395,10 +1393,16 @@ enter_buffer(buf)
+     curwin->w_cursor.col = 0;
+ #ifdef FEAT_VIRTUALEDIT
+     curwin->w_cursor.coladd = 0;
  #endif
-     perl_interp = perl_alloc();
-     perl_construct(perl_interp);
-     perl_parse(perl_interp, xs_init, argc, argv, 0);
-     perl_call_argv("VIM::bootstrap", (long)G_DISCARD, bootargs);
-@@ -713,13 +732,16 @@ ex_perl(eap)
-     }
+     curwin->w_set_curswant = TRUE;
++#ifdef FEAT_AUTOCMD
++    curwin->w_topline_was_set = FALSE;
++#endif
++
++    /* mark cursor position as being invalid */
++    curwin->w_valid = 0;
  
- #ifdef HAVE_SANDBOX
-     if (sandbox)
+     /* Make sure the buffer is loaded. */
+     if (curbuf->b_ml.ml_mfp == NULL)  /* need to load the file */
      {
--      if ((safe = perl_get_sv( "VIM::safe", FALSE )) == NULL || !SvTRUE(safe))
-+      safe = perl_get_sv( "VIM::safe", FALSE );
-+# ifndef MAKE_TEST  /* avoid a warning for unreachable code */
-+      if (safe == NULL || !SvTRUE(safe))
-           EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module"));
-       else
-+# endif
-       {
-           PUSHMARK(SP);
-           XPUSHs(safe);
-           XPUSHs(sv);
-           PUTBACK;
-@@ -1226,13 +1248,12 @@ Delete(vimbuf, ...)
-                   aucmd_prepbuf(&aco, vimbuf);
+ #ifdef FEAT_AUTOCMD
+@@ -1434,11 +1438,12 @@ enter_buffer(buf)
+     check_arg_idx(curwin);            /* check for valid arg_idx */
+ #ifdef FEAT_TITLE
+     maketitle();
+ #endif
+ #ifdef FEAT_AUTOCMD
+-    if (curwin->w_topline == 1)               /* when autocmds didn't change it */
++      /* when autocmds didn't change it */
++    if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
+ #endif
+       scroll_cursor_halfway(FALSE);   /* redisplay at correct position */
  
-                   if (u_savedel(lnum, 1) == OK)
-                   {
-                       ml_delete(lnum, 0);
-+                      check_cursor();
-                       deleted_lines_mark(lnum, 1L);
--                      if (aco.save_buf == curbuf)
--                          check_cursor();
-                   }
+ #ifdef FEAT_NETBEANS_INTG
+     /* Send fileOpened event because we've changed buffers. */
+@@ -1449,17 +1454,17 @@ enter_buffer(buf)
+     /* Change directories when the 'acd' option is set. */
+     DO_AUTOCHDIR
  
-                   /* restore curwin/curbuf and a few other things */
-                   aucmd_restbuf(&aco);
-                   /* Careful: autocommands may have made "vimbuf" invalid! */
---- vim72.orig/src/mbyte.c
-+++ vim72/src/mbyte.c
-@@ -24,11 +24,11 @@
-  *                The cell width on the display needs to be determined from
-  *                the character value.
-  *                Recognizing bytes is easy: 0xxx.xxxx is a single-byte
-  *                char, 10xx.xxxx is a trailing byte, 11xx.xxxx is a leading
-  *                byte of a multi-byte character.
-- *                To make things complicated, up to two composing characters
-+ *                To make things complicated, up to six composing characters
-  *                are allowed.  These are drawn on top of the first char.
-  *                For most editing the sequence of bytes with composing
-  *                characters included is considered to be one character.
-  * "enc_unicode"    When 2 use 16-bit Unicode characters (or UTF-16).
-  *                When 4 use 32-but Unicode characters.
-@@ -125,29 +125,50 @@
+ #ifdef FEAT_KEYMAP
+     if (curbuf->b_kmap_state & KEYMAP_INIT)
+-      keymap_init();
++      (void)keymap_init();
+ #endif
+ #ifdef FEAT_SPELL
+     /* May need to set the spell language.  Can only do this after the buffer
+      * has been properly setup. */
+     if (!curbuf->b_help && curwin->w_p_spell && *curbuf->b_p_spl != NUL)
+-      did_set_spelllang(curbuf);
++      (void)did_set_spelllang(curbuf);
+ #endif
  
- static int enc_canon_search __ARGS((char_u *name));
- static int dbcs_char2len __ARGS((int c));
- static int dbcs_char2bytes __ARGS((int c, char_u *buf));
- static int dbcs_ptr2len __ARGS((char_u *p));
-+static int dbcs_ptr2len_len __ARGS((char_u *p, int size));
-+static int utf_ptr2cells_len __ARGS((char_u *p, int size));
- static int dbcs_char2cells __ARGS((int c));
-+static int dbcs_ptr2cells_len __ARGS((char_u *p, int size));
- static int dbcs_ptr2char __ARGS((char_u *p));
+     redraw_later(NOT_VALID);
+ }
  
--/* Lookup table to quickly get the length in bytes of a UTF-8 character from
-- * the first byte of a UTF-8 string.  Bytes which are illegal when used as the
-- * first byte have a one, because these will be used separately. */
-+/*
-+ * Lookup table to quickly get the length in bytes of a UTF-8 character from
-+ * the first byte of a UTF-8 string.
-+ * Bytes which are illegal when used as the first byte have a 1.
-+ * The NUL byte has length 1.
-+ */
- static char utf8len_tab[256] =
- {
-     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
--    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/
--    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/
-+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-     2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1,
- };
+@@ -1673,13 +1678,14 @@ buflist_new(ffname, sfname, lnum, flags)
+ #endif
  
- /*
-+ * Like utf8len_tab above, but using a zero for illegal lead bytes.
-+ */
-+static char utf8len_tab_zero[256] =
-+{
-+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-+    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-+    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-+    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0,
-+};
-+
-+/*
-  * XIM often causes trouble.  Define XIM_DEBUG to get a log of XIM callbacks
-  * in the "xim.log" file.
-  */
- /* #define XIM_DEBUG */
- #ifdef XIM_DEBUG
-@@ -604,35 +625,41 @@ codepage_invalid:
-      * Set the function pointers.
-      */
-     if (enc_utf8)
-     {
-       mb_ptr2len = utfc_ptr2len;
-+      mb_ptr2len_len = utfc_ptr2len_len;
-       mb_char2len = utf_char2len;
-       mb_char2bytes = utf_char2bytes;
-       mb_ptr2cells = utf_ptr2cells;
-+      mb_ptr2cells_len = utf_ptr2cells_len;
-       mb_char2cells = utf_char2cells;
-       mb_off2cells = utf_off2cells;
-       mb_ptr2char = utf_ptr2char;
-       mb_head_off = utf_head_off;
-     }
-     else if (enc_dbcs != 0)
-     {
-       mb_ptr2len = dbcs_ptr2len;
-+      mb_ptr2len_len = dbcs_ptr2len_len;
-       mb_char2len = dbcs_char2len;
-       mb_char2bytes = dbcs_char2bytes;
-       mb_ptr2cells = dbcs_ptr2cells;
-+      mb_ptr2cells_len = dbcs_ptr2cells_len;
-       mb_char2cells = dbcs_char2cells;
-       mb_off2cells = dbcs_off2cells;
-       mb_ptr2char = dbcs_ptr2char;
-       mb_head_off = dbcs_head_off;
-     }
+     buf->b_fname = buf->b_sfname;
+ #ifdef UNIX
+     if (st.st_dev == (dev_T)-1)
+-      buf->b_dev = -1;
++      buf->b_dev_valid = FALSE;
      else
      {
-       mb_ptr2len = latin_ptr2len;
-+      mb_ptr2len_len = latin_ptr2len_len;
-       mb_char2len = latin_char2len;
-       mb_char2bytes = latin_char2bytes;
-       mb_ptr2cells = latin_ptr2cells;
-+      mb_ptr2cells_len = latin_ptr2cells_len;
-       mb_char2cells = latin_char2cells;
-       mb_off2cells = latin_off2cells;
-       mb_ptr2char = latin_ptr2char;
-       mb_head_off = latin_head_off;
++      buf->b_dev_valid = TRUE;
+       buf->b_dev = st.st_dev;
+       buf->b_ino = st.st_ino;
      }
-@@ -715,11 +742,11 @@ codepage_invalid:
-                    * mblen() should return -1 for invalid (means the leading
-                    * multibyte) character.  However there are some platforms
-                    * where mblen() returns 0 for invalid character.
-                    * Therefore, following condition includes 0.
-                    */
--                  (void)mblen(NULL, 0);       /* First reset the state. */
-+                  ignored = mblen(NULL, 0);   /* First reset the state. */
-                   if (mblen(buf, (size_t)1) <= 0)
-                       n = 2;
-                   else
-                       n = 1;
-               }
-@@ -1013,14 +1040,13 @@ dbcs_class(lead, trail)
+ #endif
+     buf->b_u_synced = TRUE;
+@@ -2020,17 +2026,16 @@ buflist_findname_stat(ffname, stp)
  /*
-  * mb_char2len() function pointer.
-  * Return length in bytes of character "c".
-  * Returns 1 for a single-byte character.
+  * Find file in buffer list by a regexp pattern.
+  * Return fnum of the found buffer.
+  * Return < 0 for error.
   */
--/* ARGSUSED */
+-/*ARGSUSED*/
      int
- latin_char2len(c)
--    int               c;
-+    int               c UNUSED;
+ buflist_findpat(pattern, pattern_end, unlisted, diffmode)
+     char_u    *pattern;
+     char_u    *pattern_end;   /* pointer to first char after pattern */
+     int               unlisted;       /* find unlisted buffers */
+-    int               diffmode;       /* find diff-mode buffers only */
++    int               diffmode UNUSED; /* find diff-mode buffers only */
  {
-     return 1;
- }
+     buf_T     *buf;
+     regprog_T *prog;
+     int               match = -1;
+     int               find_listed;
+@@ -2398,26 +2403,73 @@ buflist_setfpos(buf, win, lnum, col, cop
+       wip->wi_next->wi_prev = wip;
  
-     static int
-@@ -1068,11 +1094,10 @@ dbcs_char2bytes(c, buf)
- /*
-  * mb_ptr2len() function pointer.
-  * Get byte length of character at "*p" but stop at a NUL.
-  * For UTF-8 this includes following composing characters.
-  * Returns 0 when *p is NUL.
-- *
-  */
-     int
- latin_ptr2len(p)
-     char_u    *p;
- {
-@@ -1090,14 +1115,48 @@ dbcs_ptr2len(p)
-     if (len == 2 && p[1] == NUL)
-       len = 1;
-     return len;
+     return;
  }
  
++#ifdef FEAT_DIFF
++static int wininfo_other_tab_diff __ARGS((wininfo_T *wip));
++
 +/*
-+ * mb_ptr2len_len() function pointer.
-+ * Like mb_ptr2len(), but limit to read "size" bytes.
-+ * Returns 0 for an empty string.
-+ * Returns 1 for an illegal char or an incomplete byte sequence.
++ * Return TRUE when "wip" has 'diff' set and the diff is only for another tab
++ * page.  That's because a diff is local to a tab page.
 + */
-+    int
-+latin_ptr2len_len(p, size)
-+    char_u    *p;
-+    int               size;
-+{
-+    if (size < 1 || *p == NUL)
-+      return 0;
-+    return 1;
-+}
-+
 +    static int
-+dbcs_ptr2len_len(p, size)
-+    char_u    *p;
-+    int               size;
++wininfo_other_tab_diff(wip)
++    wininfo_T *wip;
 +{
-+    int               len;
++    win_T     *wp;
 +
-+    if (size < 1 || *p == NUL)
-+      return 0;
-+    if (size == 1)
-+      return 1;
-+    /* Check that second byte is not missing. */
-+    len = MB_BYTE2LEN(*p);
-+    if (len == 2 && p[1] == NUL)
-+      len = 1;
-+    return len;
++    if (wip->wi_opt.wo_diff)
++    {
++      for (wp = firstwin; wp != NULL; wp = wp->w_next)
++          /* return FALSE when it's a window in the current tab page, thus
++           * the buffer was in diff mode here */
++          if (wip->wi_win == wp)
++              return FALSE;
++      return TRUE;
++    }
++    return FALSE;
 +}
++#endif
 +
- struct interval
+ /*
+  * Find info for the current window in buffer "buf".
+  * If not found, return the info for the most recently used window.
++ * When "skip_diff_buffer" is TRUE avoid windows with 'diff' set that is in
++ * another tab page.
+  * Returns NULL when there isn't any info.
+  */
+     static wininfo_T *
+-find_wininfo(buf)
++find_wininfo(buf, skip_diff_buffer)
+     buf_T     *buf;
++    int               skip_diff_buffer UNUSED;
  {
--    unsigned short first;
--    unsigned short last;
-+    long first;
-+    long last;
- };
- static int intable __ARGS((struct interval *table, size_t size, int c));
+     wininfo_T *wip;
+     for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+-      if (wip->wi_win == curwin)
++      if (wip->wi_win == curwin
++#ifdef FEAT_DIFF
++              && (!skip_diff_buffer || !wininfo_other_tab_diff(wip))
++#endif
++         )
+           break;
+-    if (wip == NULL)  /* if no fpos for curwin, use the first in the list */
+-      wip = buf->b_wininfo;
++
++    /* If no wininfo for curwin, use the first in the list (that doesn't have
++     * 'diff' set and is in another tab page). */
++    if (wip == NULL)
++    {
++#ifdef FEAT_DIFF
++      if (skip_diff_buffer)
++      {
++          for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
++              if (!wininfo_other_tab_diff(wip))
++                  break;
++      }
++      else
++#endif
++          wip = buf->b_wininfo;
++    }
+     return wip;
+ }
  
  /*
-  * Return TRUE if "c" is in "table[size / sizeof(struct interval)]".
-@@ -1139,66 +1198,238 @@ intable(table, size, c)
+  * Reset the local window options to the values last used in this window.
+@@ -2434,11 +2486,11 @@ get_winopts(buf)
+     clear_winopt(&curwin->w_onebuf_opt);
+ #ifdef FEAT_FOLDING
+     clearFolding(curwin);
+ #endif
+-    wip = find_wininfo(buf);
++    wip = find_wininfo(buf, TRUE);
+     if (wip != NULL && wip->wi_optset)
+     {
+       copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt);
+ #ifdef FEAT_FOLDING
+       curwin->w_fold_manual = wip->wi_fold_manual;
+@@ -2464,13 +2516,13 @@ get_winopts(buf)
+     pos_T *
+ buflist_findfpos(buf)
+     buf_T     *buf;
+ {
+     wininfo_T *wip;
+-    static pos_T no_position = {1, 0};
++    static pos_T no_position = INIT_POS_T(1, 0, 0);
+-    wip = find_wininfo(buf);
++    wip = find_wininfo(buf, FALSE);
+     if (wip != NULL)
+       return &(wip->wi_fpos);
+     else
+       return &no_position;
+ }
+@@ -2487,11 +2539,10 @@ buflist_findlnum(buf)
+ #if defined(FEAT_LISTCMDS) || defined(PROTO)
+ /*
+  * List all know file names (for :files and :buffers command).
   */
-     int
- utf_char2cells(c)
-     int               c;
+-/*ARGSUSED*/
+     void
+ buflist_list(eap)
+     exarg_T   *eap;
  {
--    /* sorted list of non-overlapping intervals of East Asian Ambiguous
--     * characters, generated with:
--     * "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
--    static struct interval ambiguous[] = {
--      {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8},
--      {0x00AA, 0x00AA}, {0x00AE, 0x00AE}, {0x00B0, 0x00B4},
--      {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6},
--      {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1},
--      {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED},
--      {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA},
--      {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101},
--      {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B},
--      {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133},
--      {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144},
--      {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153},
--      {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE},
--      {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4},
--      {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA},
--      {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261},
--      {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB},
--      {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB},
--      {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0391, 0x03A1},
--      {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, {0x03C3, 0x03C9},
--      {0x0401, 0x0401}, {0x0410, 0x044F}, {0x0451, 0x0451},
--      {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019},
--      {0x201C, 0x201D}, {0x2020, 0x2022}, {0x2024, 0x2027},
--      {0x2030, 0x2030}, {0x2032, 0x2033}, {0x2035, 0x2035},
--      {0x203B, 0x203B}, {0x203E, 0x203E}, {0x2074, 0x2074},
--      {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC},
--      {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109},
--      {0x2113, 0x2113}, {0x2116, 0x2116}, {0x2121, 0x2122},
--      {0x2126, 0x2126}, {0x212B, 0x212B}, {0x2153, 0x2154},
--      {0x215B, 0x215E}, {0x2160, 0x216B}, {0x2170, 0x2179},
--      {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2},
--      {0x21D4, 0x21D4}, {0x21E7, 0x21E7}, {0x2200, 0x2200},
--      {0x2202, 0x2203}, {0x2207, 0x2208}, {0x220B, 0x220B},
--      {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215},
--      {0x221A, 0x221A}, {0x221D, 0x2220}, {0x2223, 0x2223},
--      {0x2225, 0x2225}, {0x2227, 0x222C}, {0x222E, 0x222E},
--      {0x2234, 0x2237}, {0x223C, 0x223D}, {0x2248, 0x2248},
--      {0x224C, 0x224C}, {0x2252, 0x2252}, {0x2260, 0x2261},
--      {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F},
--      {0x2282, 0x2283}, {0x2286, 0x2287}, {0x2295, 0x2295},
--      {0x2299, 0x2299}, {0x22A5, 0x22A5}, {0x22BF, 0x22BF},
--      {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B},
--      {0x2550, 0x2573}, {0x2580, 0x258F}, {0x2592, 0x2595},
--      {0x25A0, 0x25A1}, {0x25A3, 0x25A9}, {0x25B2, 0x25B3},
--      {0x25B6, 0x25B7}, {0x25BC, 0x25BD}, {0x25C0, 0x25C1},
--      {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1},
--      {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606},
--      {0x2609, 0x2609}, {0x260E, 0x260F}, {0x2614, 0x2615},
--      {0x261C, 0x261C}, {0x261E, 0x261E}, {0x2640, 0x2640},
--      {0x2642, 0x2642}, {0x2660, 0x2661}, {0x2663, 0x2665},
--      {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F},
--      {0x273D, 0x273D}, {0x2776, 0x277F}, {0xE000, 0xF8FF},
--      {0xFFFD, 0xFFFD}, /* {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD} */
-+    /* Sorted list of non-overlapping intervals of East Asian double width
-+     * characters, generated with ../runtime/tools/unicode.vim. */
-+    static struct interval doublewidth[] =
-+    {
-+      {0x1100, 0x115f},
-+      {0x11a3, 0x11a7},
-+      {0x11fa, 0x11ff},
-+      {0x2329, 0x232a},
-+      {0x2e80, 0x2e99},
-+      {0x2e9b, 0x2ef3},
-+      {0x2f00, 0x2fd5},
-+      {0x2ff0, 0x2ffb},
-+      {0x3000, 0x3029},
-+      {0x3030, 0x303e},
-+      {0x3041, 0x3096},
-+      {0x309b, 0x30ff},
-+      {0x3105, 0x312d},
-+      {0x3131, 0x318e},
-+      {0x3190, 0x31b7},
-+      {0x31c0, 0x31e3},
-+      {0x31f0, 0x321e},
-+      {0x3220, 0x3247},
-+      {0x3250, 0x32fe},
-+      {0x3300, 0x4dbf},
-+      {0x4e00, 0xa48c},
-+      {0xa490, 0xa4c6},
-+      {0xa960, 0xa97c},
-+      {0xac00, 0xd7a3},
-+      {0xd7b0, 0xd7c6},
-+      {0xd7cb, 0xd7fb},
-+      {0xf900, 0xfaff},
-+      {0xfe10, 0xfe19},
-+      {0xfe30, 0xfe52},
-+      {0xfe54, 0xfe66},
-+      {0xfe68, 0xfe6b},
-+      {0xff01, 0xff60},
-+      {0xffe0, 0xffe6},
-+      {0x1f200, 0x1f200},
-+      {0x1f210, 0x1f231},
-+      {0x1f240, 0x1f248},
-+      {0x20000, 0x2fffd},
-+      {0x30000, 0x3fffd}
-+    };
-+    /* Sorted list of non-overlapping intervals of East Asian Ambiguous
-+     * characters, generated with ../runtime/tools/unicode.vim. */
-+    static struct interval ambiguous[] =
-+    {
-+      {0x00a1, 0x00a1},
-+      {0x00a4, 0x00a4},
-+      {0x00a7, 0x00a8},
-+      {0x00aa, 0x00aa},
-+      {0x00ad, 0x00ae},
-+      {0x00b0, 0x00b4},
-+      {0x00b6, 0x00ba},
-+      {0x00bc, 0x00bf},
-+      {0x00c6, 0x00c6},
-+      {0x00d0, 0x00d0},
-+      {0x00d7, 0x00d8},
-+      {0x00de, 0x00e1},
-+      {0x00e6, 0x00e6},
-+      {0x00e8, 0x00ea},
-+      {0x00ec, 0x00ed},
-+      {0x00f0, 0x00f0},
-+      {0x00f2, 0x00f3},
-+      {0x00f7, 0x00fa},
-+      {0x00fc, 0x00fc},
-+      {0x00fe, 0x00fe},
-+      {0x0101, 0x0101},
-+      {0x0111, 0x0111},
-+      {0x0113, 0x0113},
-+      {0x011b, 0x011b},
-+      {0x0126, 0x0127},
-+      {0x012b, 0x012b},
-+      {0x0131, 0x0133},
-+      {0x0138, 0x0138},
-+      {0x013f, 0x0142},
-+      {0x0144, 0x0144},
-+      {0x0148, 0x014b},
-+      {0x014d, 0x014d},
-+      {0x0152, 0x0153},
-+      {0x0166, 0x0167},
-+      {0x016b, 0x016b},
-+      {0x01ce, 0x01ce},
-+      {0x01d0, 0x01d0},
-+      {0x01d2, 0x01d2},
-+      {0x01d4, 0x01d4},
-+      {0x01d6, 0x01d6},
-+      {0x01d8, 0x01d8},
-+      {0x01da, 0x01da},
-+      {0x01dc, 0x01dc},
-+      {0x0251, 0x0251},
-+      {0x0261, 0x0261},
-+      {0x02c4, 0x02c4},
-+      {0x02c7, 0x02c7},
-+      {0x02c9, 0x02cb},
-+      {0x02cd, 0x02cd},
-+      {0x02d0, 0x02d0},
-+      {0x02d8, 0x02db},
-+      {0x02dd, 0x02dd},
-+      {0x02df, 0x02df},
-+      {0x0391, 0x03a1},
-+      {0x03a3, 0x03a9},
-+      {0x03b1, 0x03c1},
-+      {0x03c3, 0x03c9},
-+      {0x0401, 0x0401},
-+      {0x0410, 0x044f},
-+      {0x0451, 0x0451},
-+      {0x2010, 0x2010},
-+      {0x2013, 0x2016},
-+      {0x2018, 0x2019},
-+      {0x201c, 0x201d},
-+      {0x2020, 0x2022},
-+      {0x2024, 0x2027},
-+      {0x2030, 0x2030},
-+      {0x2032, 0x2033},
-+      {0x2035, 0x2035},
-+      {0x203b, 0x203b},
-+      {0x203e, 0x203e},
-+      {0x2074, 0x2074},
-+      {0x207f, 0x207f},
-+      {0x2081, 0x2084},
-+      {0x20ac, 0x20ac},
-+      {0x2103, 0x2103},
-+      {0x2105, 0x2105},
-+      {0x2109, 0x2109},
-+      {0x2113, 0x2113},
-+      {0x2116, 0x2116},
-+      {0x2121, 0x2122},
-+      {0x2126, 0x2126},
-+      {0x212b, 0x212b},
-+      {0x2153, 0x2154},
-+      {0x215b, 0x215e},
-+      {0x2160, 0x216b},
-+      {0x2170, 0x2179},
-+      {0x2189, 0x2189},
-+      {0x2190, 0x2199},
-+      {0x21b8, 0x21b9},
-+      {0x21d2, 0x21d2},
-+      {0x21d4, 0x21d4},
-+      {0x21e7, 0x21e7},
-+      {0x2200, 0x2200},
-+      {0x2202, 0x2203},
-+      {0x2207, 0x2208},
-+      {0x220b, 0x220b},
-+      {0x220f, 0x220f},
-+      {0x2211, 0x2211},
-+      {0x2215, 0x2215},
-+      {0x221a, 0x221a},
-+      {0x221d, 0x2220},
-+      {0x2223, 0x2223},
-+      {0x2225, 0x2225},
-+      {0x2227, 0x222c},
-+      {0x222e, 0x222e},
-+      {0x2234, 0x2237},
-+      {0x223c, 0x223d},
-+      {0x2248, 0x2248},
-+      {0x224c, 0x224c},
-+      {0x2252, 0x2252},
-+      {0x2260, 0x2261},
-+      {0x2264, 0x2267},
-+      {0x226a, 0x226b},
-+      {0x226e, 0x226f},
-+      {0x2282, 0x2283},
-+      {0x2286, 0x2287},
-+      {0x2295, 0x2295},
-+      {0x2299, 0x2299},
-+      {0x22a5, 0x22a5},
-+      {0x22bf, 0x22bf},
-+      {0x2312, 0x2312},
-+      {0x2460, 0x24e9},
-+      {0x24eb, 0x254b},
-+      {0x2550, 0x2573},
-+      {0x2580, 0x258f},
-+      {0x2592, 0x2595},
-+      {0x25a0, 0x25a1},
-+      {0x25a3, 0x25a9},
-+      {0x25b2, 0x25b3},
-+      {0x25b6, 0x25b7},
-+      {0x25bc, 0x25bd},
-+      {0x25c0, 0x25c1},
-+      {0x25c6, 0x25c8},
-+      {0x25cb, 0x25cb},
-+      {0x25ce, 0x25d1},
-+      {0x25e2, 0x25e5},
-+      {0x25ef, 0x25ef},
-+      {0x2605, 0x2606},
-+      {0x2609, 0x2609},
-+      {0x260e, 0x260f},
-+      {0x2614, 0x2615},
-+      {0x261c, 0x261c},
-+      {0x261e, 0x261e},
-+      {0x2640, 0x2640},
-+      {0x2642, 0x2642},
-+      {0x2660, 0x2661},
-+      {0x2663, 0x2665},
-+      {0x2667, 0x266a},
-+      {0x266c, 0x266d},
-+      {0x266f, 0x266f},
-+      {0x269e, 0x269f},
-+      {0x26be, 0x26bf},
-+      {0x26c4, 0x26cd},
-+      {0x26cf, 0x26e1},
-+      {0x26e3, 0x26e3},
-+      {0x26e8, 0x26ff},
-+      {0x273d, 0x273d},
-+      {0x2757, 0x2757},
-+      {0x2776, 0x277f},
-+      {0x2b55, 0x2b59},
-+      {0x3248, 0x324f},
-+      {0xe000, 0xf8ff},
-+      {0xfffd, 0xfffd},
-+      {0x1f100, 0x1f10a},
-+      {0x1f110, 0x1f12d},
-+      {0x1f131, 0x1f131},
-+      {0x1f13d, 0x1f13d},
-+      {0x1f13f, 0x1f13f},
-+      {0x1f142, 0x1f142},
-+      {0x1f146, 0x1f146},
-+      {0x1f14a, 0x1f14e},
-+      {0x1f157, 0x1f157},
-+      {0x1f15f, 0x1f15f},
-+      {0x1f179, 0x1f179},
-+      {0x1f17b, 0x1f17c},
-+      {0x1f17f, 0x1f17f},
-+      {0x1f18a, 0x1f18d},
-+      {0x1f190, 0x1f190},
-+      {0xf0000, 0xffffd},
-+      {0x100000, 0x10fffd}
-     };
-     if (c >= 0x100)
+     buf_T     *buf;
+@@ -2525,12 +2576,12 @@ buflist_list(eap)
+       i = 40 - vim_strsize(IObuff);
+       do
+       {
+           IObuff[len++] = ' ';
+       } while (--i > 0 && len < IOSIZE - 18);
+-      vim_snprintf((char *)IObuff + len, IOSIZE - len, _("line %ld"),
+-              buf == curbuf ? curwin->w_cursor.lnum
++      vim_snprintf((char *)IObuff + len, (size_t)(IOSIZE - len),
++              _("line %ld"), buf == curbuf ? curwin->w_cursor.lnum
+                                              : (long)buflist_findlnum(buf));
+       msg_outtrans(IObuff);
+       out_flush();        /* output one line at a time */
+       ui_breakcheck();
+     }
+@@ -2640,13 +2691,14 @@ setfname(buf, ffname, sfname, message)
+       buf->b_sfname = sfname;
+     }
+     buf->b_fname = buf->b_sfname;
+ #ifdef UNIX
+     if (st.st_dev == (dev_T)-1)
+-      buf->b_dev = -1;
++      buf->b_dev_valid = FALSE;
+     else
      {
- #ifdef USE_WCHAR_FUNCTIONS
-@@ -1213,24 +1444,11 @@ utf_char2cells(c)
-       if (n > 1)
-           return n;
- #else
-       if (!utf_printable(c))
-           return 6;           /* unprintable, displays <xxxx> */
--      if (c >= 0x1100
--          && (c <= 0x115f                     /* Hangul Jamo */
--              || c == 0x2329
--              || c == 0x232a
--              || (c >= 0x2e80 && c <= 0xa4cf
--                  && c != 0x303f)             /* CJK ... Yi */
--              || (c >= 0xac00 && c <= 0xd7a3) /* Hangul Syllables */
--              || (c >= 0xf900 && c <= 0xfaff) /* CJK Compatibility
--                                                 Ideographs */
--              || (c >= 0xfe30 && c <= 0xfe6f) /* CJK Compatibility Forms */
--              || (c >= 0xff00 && c <= 0xff60) /* Fullwidth Forms */
--              || (c >= 0xffe0 && c <= 0xffe6)
--              || (c >= 0x20000 && c <= 0x2fffd)
--              || (c >= 0x30000 && c <= 0x3fffd)))
-+      if (intable(doublewidth, sizeof(doublewidth), c))
-           return 2;
++      buf->b_dev_valid = TRUE;
+       buf->b_dev = st.st_dev;
+       buf->b_ino = st.st_ino;
+     }
  #endif
+@@ -2787,18 +2839,18 @@ buflist_slash_adjust()
      }
+ }
+ #endif
  
-     /* Characters below 0x100 are influenced by 'isprint' option */
-@@ -1246,14 +1464,13 @@ utf_char2cells(c)
  /*
-  * mb_ptr2cells() function pointer.
-  * Return the number of display cells character at "*p" occupies.
-  * This doesn't take care of unprintable characters, use ptr2cells() for that.
+- * Set alternate cursor position for current window.
++ * Set alternate cursor position for the current buffer and window "win".
+  * Also save the local window option values.
   */
--/*ARGSUSED*/
-     int
- latin_ptr2cells(p)
--    char_u    *p;
-+    char_u    *p UNUSED;
+     void
+-buflist_altfpos()
++buflist_altfpos(win)
++    win_T *win;
  {
-     return 1;
- }
-     int
-@@ -1287,18 +1504,66 @@ dbcs_ptr2cells(p)
-       return 1;
-     return MB_BYTE2LEN(*p);
+-    buflist_setfpos(curbuf, curwin, curwin->w_cursor.lnum,
+-                                                curwin->w_cursor.col, TRUE);
++    buflist_setfpos(curbuf, win, win->w_cursor.lnum, win->w_cursor.col, TRUE);
  }
  
  /*
-+ * mb_ptr2cells_len() function pointer.
-+ * Like mb_ptr2cells(), but limit string length to "size".
-+ * For an empty string or truncated character returns 1.
-+ */
-+    int
-+latin_ptr2cells_len(p, size)
-+    char_u    *p UNUSED;
-+    int               size UNUSED;
-+{
-+    return 1;
-+}
-+
-+    static int
-+utf_ptr2cells_len(p, size)
-+    char_u    *p;
-+    int               size;
-+{
-+    int               c;
-+
-+    /* Need to convert to a wide character. */
-+    if (size > 0 && *p >= 0x80)
-+    {
-+      if (utf_ptr2len_len(p, size) < utf8len_tab[*p])
-+          return 1;  /* truncated */
-+      c = utf_ptr2char(p);
-+      /* An illegal byte is displayed as <xx>. */
-+      if (utf_ptr2len(p) == 1 || c == NUL)
-+          return 4;
-+      /* If the char is ASCII it must be an overlong sequence. */
-+      if (c < 0x80)
-+          return char2cells(c);
-+      return utf_char2cells(c);
-+    }
-+    return 1;
-+}
-+
-+    static int
-+dbcs_ptr2cells_len(p, size)
-+    char_u    *p;
-+    int               size;
-+{
-+    /* Number of cells is equal to number of bytes, except for euc-jp when
-+     * the first byte is 0x8e. */
-+    if (size <= 1 || (enc_dbcs == DBCS_JPNU && *p == 0x8e))
-+      return 1;
-+    return MB_BYTE2LEN(*p);
-+}
-+
-+/*
-  * mb_char2cells() function pointer.
-  * Return the number of display cells character "c" occupies.
-  * Only takes care of multi-byte chars, not "^C" and such.
-  */
--/*ARGSUSED*/
-     int
- latin_char2cells(c)
--    int               c;
-+    int               c UNUSED;
+  * Return TRUE if 'ffname' is not the same file as current file.
+  * Fname must have a full path (expanded by mch_FullName()).
+@@ -2836,11 +2888,11 @@ otherfile_buf(buf, ffname
+       struct stat     st;
+       /* If no struct stat given, get it now */
+       if (stp == NULL)
+       {
+-          if (buf->b_dev < 0 || mch_stat((char *)ffname, &st) < 0)
++          if (!buf->b_dev_valid || mch_stat((char *)ffname, &st) < 0)
+               st.st_dev = (dev_T)-1;
+           stp = &st;
+       }
+       /* Use dev/ino to check if the files are the same, even when the names
+        * are different (possible with links).  Still need to compare the
+@@ -2873,26 +2925,27 @@ buf_setino(buf)
  {
-     return 1;
+     struct stat       st;
+     if (buf->b_fname != NULL && mch_stat((char *)buf->b_fname, &st) >= 0)
+     {
++      buf->b_dev_valid = TRUE;
+       buf->b_dev = st.st_dev;
+       buf->b_ino = st.st_ino;
+     }
+     else
+-      buf->b_dev = -1;
++      buf->b_dev_valid = FALSE;
  }
  
-     static int
-@@ -1316,15 +1581,14 @@ dbcs_char2cells(c)
  /*
-  * mb_off2cells() function pointer.
-  * Return number of display cells for char at ScreenLines[off].
-  * We make sure that the offset used is less than "max_off".
+  * Return TRUE if dev/ino in buffer "buf" matches with "stp".
   */
--/*ARGSUSED*/
-     int
- latin_off2cells(off, max_off)
--    unsigned  off;
--    unsigned  max_off;
-+    unsigned  off UNUSED;
-+    unsigned  max_off UNUSED;
+     static int
+ buf_same_ino(buf, stp)
+     buf_T     *buf;
+     struct stat *stp;
  {
-     return 1;
+-    return (buf->b_dev >= 0
++    return (buf->b_dev_valid
+           && stp->st_dev == buf->b_dev
+           && stp->st_ino == buf->b_ino);
  }
+ #endif
  
-     int
-@@ -1384,11 +1648,11 @@ utf_ptr2char(p)
-     int               len;
+@@ -2915,11 +2968,11 @@ fileinfo(fullname, shorthelp, dont_trunc
+     if (buffer == NULL)
+       return;
  
-     if (p[0] < 0x80)  /* be quick for ASCII */
-       return p[0];
+     if (fullname > 1)     /* 2 CTRL-G: include buffer number */
+     {
+-      sprintf((char *)buffer, "buf %d: ", curbuf->b_fnum);
++      vim_snprintf((char *)buffer, IOSIZE, "buf %d: ", curbuf->b_fnum);
+       p = buffer + STRLEN(buffer);
+     }
+     else
+       p = buffer;
  
--    len = utf8len_tab[p[0]];
-+    len = utf8len_tab_zero[p[0]];
-     if (len > 1 && (p[1] & 0xc0) == 0x80)
+@@ -2989,15 +3042,16 @@ fileinfo(fullname, shorthelp, dont_trunc
+               _("line %ld of %ld --%d%%-- col "),
+               (long)curwin->w_cursor.lnum,
+               (long)curbuf->b_ml.ml_line_count,
+               n);
+       validate_virtcol();
+-      col_print(buffer + STRLEN(buffer),
++      len = STRLEN(buffer);
++      col_print(buffer + len, IOSIZE - len,
+                  (int)curwin->w_cursor.col + 1, (int)curwin->w_virtcol + 1);
+     }
+-    (void)append_arg_number(curwin, buffer, !shortmess(SHM_FILE), IOSIZE);
++    (void)append_arg_number(curwin, buffer, IOSIZE, !shortmess(SHM_FILE));
+     if (dont_truncate)
      {
-       if (len == 2)
-           return ((p[0] & 0x1f) << 6) + (p[1] & 0x3f);
-       if ((p[2] & 0xc0) == 0x80)
-@@ -1634,10 +1898,11 @@ utf_ptr2len(p)
+       /* Temporarily set msg_scroll to avoid the message being truncated.
+        * First call msg_start() to get the message in the right place. */
+@@ -3021,19 +3075,20 @@ fileinfo(fullname, shorthelp, dont_trunc
+     vim_free(buffer);
  }
  
- /*
-  * Return length of UTF-8 character, obtained from the first byte.
-  * "b" must be between 0 and 255!
-+ * Returns 1 for an invalid first byte value.
-  */
-     int
- utf_byte2len(b)
-     int               b;
+     void
+-col_print(buf, col, vcol)
++col_print(buf, buflen, col, vcol)
+     char_u  *buf;
++    size_t  buflen;
+     int           col;
+     int           vcol;
  {
-@@ -1648,25 +1913,28 @@ utf_byte2len(b)
-  * Get the length of UTF-8 byte sequence "p[size]".  Does not include any
-  * following composing characters.
-  * Returns 1 for "".
-  * Returns 1 for an illegal byte sequence (also in incomplete byte seq.).
-  * Returns number > "size" for an incomplete byte sequence.
-+ * Never returns zero.
+     if (col == vcol)
+-      sprintf((char *)buf, "%d", col);
++      vim_snprintf((char *)buf, buflen, "%d", col);
+     else
+-      sprintf((char *)buf, "%d-%d", col, vcol);
++      vim_snprintf((char *)buf, buflen, "%d-%d", col, vcol);
+ }
+ #if defined(FEAT_TITLE) || defined(PROTO)
+ /*
+  * put file name in title bar of window and in icon title
+@@ -3142,22 +3197,22 @@ maketitle()
+               /* remove the file name */
+               p = gettail_sep(buf + off);
+               if (p == buf + off)
+                   /* must be a help buffer */
+                   vim_strncpy(buf + off, (char_u *)_("help"),
+-                                                          IOSIZE - off - 1);
++                                                (size_t)(IOSIZE - off - 1));
+               else
+                   *p = NUL;
+               /* translate unprintable chars */
+               p = transstr(buf + off);
+-              vim_strncpy(buf + off, p, IOSIZE - off - 1);
++              vim_strncpy(buf + off, p, (size_t)(IOSIZE - off - 1));
+               vim_free(p);
+               STRCAT(buf, ")");
+           }
+-          append_arg_number(curwin, buf, FALSE, IOSIZE);
++          append_arg_number(curwin, buf, IOSIZE, FALSE);
+ #if defined(FEAT_CLIENTSERVER)
+           if (serverName != NULL)
+           {
+               STRCAT(buf, " - ");
+@@ -3290,18 +3345,17 @@ free_titles()
+  * Item: %-<minwid>.<maxwid><itemch> All but <itemch> are optional
+  *
+  * If maxwidth is not zero, the string will be filled at any middle marker
+  * or truncated if too long, fillchar is used for all whitespace.
   */
+-/*ARGSUSED*/
      int
- utf_ptr2len_len(p, size)
-     char_u    *p;
-     int               size;
+ build_stl_str_hl(wp, out, outlen, fmt, use_sandbox, fillchar, maxwidth, hltab, tabtab)
+     win_T     *wp;
+     char_u    *out;           /* buffer to write into != NameBuff */
+     size_t    outlen;         /* length of out[] */
+     char_u    *fmt;
+-    int               use_sandbox;    /* "fmt" was set insecurely, use sandbox */
++    int               use_sandbox UNUSED; /* "fmt" was set insecurely, use sandbox */
+     int               fillchar;
+     int               maxwidth;
+     struct stl_hlrec *hltab;  /* return: HL attributes (can be NULL) */
+     struct stl_hlrec *tabtab; /* return: tab page nrs (can be NULL) */
  {
-     int               len;
-     int               i;
-     int               m;
+@@ -3468,11 +3522,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+               else
+ #endif
+                   n = (long)(p - t) - item[groupitem[groupdepth]].maxwid + 1;
  
--    if (*p == NUL)
--      return 1;
--    m = len = utf8len_tab[*p];
-+    len = utf8len_tab[*p];
-+    if (len == 1)
-+      return 1;       /* NUL, ascii or illegal lead byte */
-     if (len > size)
-       m = size;       /* incomplete byte sequence. */
-+    else
-+      m = len;
-     for (i = 1; i < m; ++i)
-       if ((p[i] & 0xc0) != 0x80)
-           return 1;
-     return len;
- }
-@@ -1696,11 +1964,11 @@ utfc_ptr2len(p)
-     /* Check for illegal byte. */
-     if (len == 1 && b0 >= 0x80)
-       return 1;
+               *t = '<';
+-              mch_memmove(t + 1, t + n, p - (t + n));
++              mch_memmove(t + 1, t + n, (size_t)(p - (t + n)));
+               p = p - n + 1;
+ #ifdef FEAT_MBYTE
+               /* Fill up space left over by half a double-wide char. */
+               while (++l < item[groupitem[groupdepth]].minwid)
+                   *p++ = fillchar;
+@@ -3498,11 +3552,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+                       *p++ = fillchar;
+               }
+               else
+               {
+                   /* fill by inserting characters */
+-                  mch_memmove(t + n - l, t, p - t);
++                  mch_memmove(t + n - l, t, (size_t)(p - t));
+                   l = n - l;
+                   if (p + l >= out + outlen)
+                       l = (long)((out + outlen) - p - 1);
+                   p += l;
+                   for (n = groupitem[groupdepth] + 1; n < curitem; n++)
+@@ -3634,11 +3688,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+           s++;
+           *p = 0;
+           p = t;
  
-     /*
--     * Check for composing characters.  We can handle only the first two, but
-+     * Check for composing characters.  We can handle only the first six, but
-      * skip all of them (otherwise the cursor would get stuck).
-      */
- #ifdef FEAT_ARABIC
-     prevlen = 0;
+ #ifdef FEAT_EVAL
+-          sprintf((char *)tmp, "%d", curbuf->b_fnum);
++          vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
+           set_internal_string_var((char_u *)"actual_curbuf", tmp);
+           o_curbuf = curbuf;
+           o_curwin = curwin;
+           curwin = wp;
+@@ -3701,17 +3755,17 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+                       (long)wp->w_buffer->b_ml.ml_line_count);
+           break;
+       case STL_ALTPERCENT:
+           str = tmp;
+-          get_rel_pos(wp, str);
++          get_rel_pos(wp, str, TMPLEN);
+           break;
+       case STL_ARGLISTSTAT:
+           fillable = FALSE;
+           tmp[0] = 0;
+-          if (append_arg_number(wp, tmp, FALSE, (int)sizeof(tmp)))
++          if (append_arg_number(wp, tmp, (int)sizeof(tmp), FALSE))
+               str = tmp;
+           break;
+       case STL_KEYMAP:
+           fillable = FALSE;
+@@ -3742,11 +3796,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+           break;
+       case STL_BYTEVAL_X:
+           base = 'X';
+       case STL_BYTEVAL:
+-          if (wp->w_cursor.col > STRLEN(linecont))
++          if (wp->w_cursor.col > (colnr_T)STRLEN(linecont))
+               num = 0;
+           else
+           {
+ #ifdef FEAT_MBYTE
+               num = (*mb_ptr2char)(linecont + wp->w_cursor.col);
+@@ -3915,11 +3969,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+           }
+           *t++ = '%';
+           if (zeropad)
+               *t++ = '0';
+           *t++ = '*';
+-          *t++ = nbase == 16 ? base : (nbase == 8 ? 'o' : 'd');
++          *t++ = nbase == 16 ? base : (char_u)(nbase == 8 ? 'o' : 'd');
+           *t = 0;
+           for (n = num, l = 1; n >= nbase; n /= nbase)
+               l++;
+           if (opt == STL_VIRTCOL_ALT)
+@@ -3961,11 +4015,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u
  #endif
-@@ -1718,10 +1986,11 @@ utfc_ptr2len(p)
+     width = vim_strsize(out);
+     if (maxwidth > 0 && width > maxwidth)
+     {
+-      /* Result is too long, must trunctate somewhere. */
++      /* Result is too long, must truncate somewhere. */
+       l = 0;
+       if (itemcnt == 0)
+           s = out;
+       else
+       {
+@@ -4108,64 +4162,67 @@ build_stl_str_hl(wp, out, outlen, fmt, u
+ #endif /* FEAT_STL_OPT */
+ #if defined(FEAT_STL_OPT) || defined(FEAT_CMDL_INFO) \
+           || defined(FEAT_GUI_TABLINE) || defined(PROTO)
+ /*
+- * Get relative cursor position in window into "str[]", in the form 99%, using
+- * "Top", "Bot" or "All" when appropriate.
++ * Get relative cursor position in window into "buf[buflen]", in the form 99%,
++ * using "Top", "Bot" or "All" when appropriate.
+  */
+     void
+-get_rel_pos(wp, str)
++get_rel_pos(wp, buf, buflen)
+     win_T     *wp;
+-    char_u    *str;
++    char_u    *buf;
++    int               buflen;
+ {
+     long      above; /* number of lines above window */
+     long      below; /* number of lines below window */
+     above = wp->w_topline - 1;
+ #ifdef FEAT_DIFF
+     above += diff_check_fill(wp, wp->w_topline) - wp->w_topfill;
+ #endif
+     below = wp->w_buffer->b_ml.ml_line_count - wp->w_botline + 1;
+     if (below <= 0)
+-      STRCPY(str, above == 0 ? _("All") : _("Bot"));
++      vim_strncpy(buf, (char_u *)(above == 0 ? _("All") : _("Bot")),
++                                                      (size_t)(buflen - 1));
+     else if (above <= 0)
+-      STRCPY(str, _("Top"));
++      vim_strncpy(buf, (char_u *)_("Top"), (size_t)(buflen - 1));
+     else
+-      sprintf((char *)str, "%2d%%", above > 1000000L
++      vim_snprintf((char *)buf, (size_t)buflen, "%2d%%", above > 1000000L
+                                   ? (int)(above / ((above + below) / 100L))
+                                   : (int)(above * 100L / (above + below)));
  }
+ #endif
  
  /*
-  * Return the number of bytes the UTF-8 encoding of the character at "p[size]"
-  * takes.  This includes following composing characters.
-+ * Returns 0 for an empty string.
-  * Returns 1 for an illegal char or an incomplete byte sequence.
+- * Append (file 2 of 8) to 'buf', if editing more than one file.
++ * Append (file 2 of 8) to "buf[buflen]", if editing more than one file.
+  * Return TRUE if it was appended.
   */
-     int
- utfc_ptr2len_len(p, size)
+-    int
+-append_arg_number(wp, buf, add_file, maxlen)
++    static int
++append_arg_number(wp, buf, buflen, add_file)
+     win_T     *wp;
+     char_u    *buf;
++    int               buflen;
+     int               add_file;       /* Add "file" before the arg number */
+-    int               maxlen;         /* maximum nr of chars in buf or zero*/
+ {
      char_u    *p;
-@@ -1730,11 +1999,11 @@ utfc_ptr2len_len(p, size)
-     int               len;
- #ifdef FEAT_ARABIC
-     int               prevlen;
+     if (ARGCOUNT <= 1)                /* nothing to do */
+       return FALSE;
+-    p = buf + STRLEN(buf);            /* go to the end of the buffer */
+-    if (maxlen && p - buf + 35 >= maxlen) /* getting too long */
++    p = buf + STRLEN(buf);    /* go to the end of the buffer */
++    if (p - buf + 35 >= buflen)       /* getting too long */
+       return FALSE;
+     *p++ = ' ';
+     *p++ = '(';
+     if (add_file)
+     {
+       STRCPY(p, "file ");
+       p += 5;
+     }
+-    sprintf((char *)p, wp->w_arg_idx_invalid ? "(%d) of %d)"
++    vim_snprintf((char *)p, (size_t)(buflen - (p - buf)),
++              wp->w_arg_idx_invalid ? "(%d) of %d)"
+                                 : "%d of %d)", wp->w_arg_idx + 1, ARGCOUNT);
+     return TRUE;
+ }
+ /*
+@@ -4217,14 +4274,13 @@ fix_fname(fname)
+ /*
+  * Make "ffname" a full file name, set "sfname" to "ffname" if not NULL.
+  * "ffname" becomes a pointer to allocated memory (or NULL).
+  */
+-/*ARGSUSED*/
+     void
+ fname_expand(buf, ffname, sfname)
+-    buf_T     *buf;
++    buf_T     *buf UNUSED;
+     char_u    **ffname;
+     char_u    **sfname;
+ {
+     if (*ffname == NULL)      /* if no file name given, nothing to do */
+       return;
+@@ -4486,11 +4542,11 @@ do_arg_all(count, forceit, keep_tabs)
+           }
+           (void)do_ecmd(0, alist_name(&AARGLIST(alist)[i]), NULL, NULL,
+                     ECMD_ONE,
+                     ((P_HID(curwin->w_buffer)
+                          || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0)
+-                                                             + ECMD_OLDBUF);
++                                                     + ECMD_OLDBUF, curwin);
+ #ifdef FEAT_AUTOCMD
+           if (use_firstwin)
+               ++autocmd_no_leave;
+ #endif
+           use_firstwin = FALSE;
+@@ -4944,11 +5000,11 @@ read_viminfo_bufferlist(virp, writing)
+       col = 0;
+       tab = vim_strrchr(xline, '\t');
+       if (tab != NULL)
+       {
+           *tab++ = '\0';
+-          col = atoi((char *)tab);
++          col = (colnr_T)atoi((char *)tab);
+           tab = vim_strrchr(xline, '\t');
+           if (tab != NULL)
+           {
+               *tab++ = '\0';
+               lnum = atol((char *)tab);
+@@ -4982,19 +5038,21 @@ write_viminfo_bufferlist(fp)
+     win_T     *win;
+     tabpage_T *tp;
  #endif
+     char_u    *line;
+     int               max_buffers;
++    size_t    len;
  
--    if (*p == NUL)
-+    if (size < 1 || *p == NUL)
-       return 0;
-     if (p[0] < 0x80 && (size == 1 || p[1] < 0x80)) /* be quick for ASCII */
-       return 1;
+     if (find_viminfo_parameter('%') == NULL)
+       return;
  
-     /* Skip over first UTF-8 char, stopping at a NUL byte. */
-@@ -1743,11 +2012,11 @@ utfc_ptr2len_len(p, size)
-     /* Check for illegal byte and incomplete byte sequence. */
-     if ((len == 1 && p[0] >= 0x80) || len > size)
-       return 1;
+     /* Without a number -1 is returned: do all buffers. */
+     max_buffers = get_viminfo_parameter('%');
  
-     /*
--     * Check for composing characters.  We can handle only the first two, but
-+     * Check for composing characters.  We can handle only the first six, but
-      * skip all of them (otherwise the cursor would get stuck).
-      */
- #ifdef FEAT_ARABIC
-     prevlen = 0;
+     /* Allocate room for the file name, lnum and col. */
+-    line = alloc(MAXPATHL + 40);
++#define LINE_BUF_LEN (MAXPATHL + 40)
++    line = alloc(LINE_BUF_LEN);
+     if (line == NULL)
+       return;
+ #ifdef FEAT_WINDOWS
+     FOR_ALL_TAB_WINDOWS(tp, win)
+@@ -5016,11 +5074,12 @@ write_viminfo_bufferlist(fp)
+       if (max_buffers-- == 0)
+           break;
+       putc('%', fp);
+       home_replace(NULL, buf->b_ffname, line, MAXPATHL, TRUE);
+-      sprintf((char *)line + STRLEN(line), "\t%ld\t%d",
++      len = STRLEN(line);
++      vim_snprintf((char *)line + len, len - LINE_BUF_LEN, "\t%ld\t%d",
+                       (long)buf->b_last_cursor.lnum,
+                       buf->b_last_cursor.col);
+       viminfo_writestring(fp, line);
+     }
+     vim_free(line);
+@@ -5046,11 +5105,12 @@ buf_spname(buf)
+        * For location list window, w_llist_ref points to the location list.
+        * For quickfix window, w_llist_ref is NULL.
+        */
+       FOR_ALL_TAB_WINDOWS(tp, win)
+           if (win->w_buffer == buf)
+-              break;
++              goto win_found;
++win_found:
+       if (win != NULL && win->w_llist_ref != NULL)
+           return _("[Location List]");
+       else
+           return _("[Quickfix List]");
+     }
+@@ -5060,11 +5120,11 @@ buf_spname(buf)
+      * contains the name as specified by the user */
+     if (bt_nofile(buf))
+     {
+       if (buf->b_sfname != NULL)
+           return (char *)buf->b_sfname;
+-      return "[Scratch]";
++      return _("[Scratch]");
+     }
  #endif
-@@ -1861,42 +2130,202 @@ utf_char2bytes(c, buf)
+     if (buf->b_fname == NULL)
+       return _("[No Name]");
+     return NULL;
+@@ -5173,11 +5233,11 @@ buf_addsign(buf, id, lnum, typenr)
+     insert_sign(buf, prev, sign, id, lnum, typenr);
+     return;
+ }
+-    int
++    linenr_T
+ buf_change_sign_type(buf, markId, typenr)
+     buf_T     *buf;           /* buffer to store sign in */
+     int               markId;         /* sign ID */
+     int               typenr;         /* typenr of sign we are adding */
+ {
+@@ -5190,14 +5250,14 @@ buf_change_sign_type(buf, markId, typenr
+           sign->typenr = typenr;
+           return sign->lnum;
+       }
+     }
+-    return 0;
++    return (linenr_T)0;
+ }
+-    int_u
++    int
+ buf_getsigntype(buf, lnum, type)
+     buf_T     *buf;
+     linenr_T  lnum;
+     int               type;   /* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */
+ {
+@@ -5512,15 +5572,14 @@ buf_contents_changed(buf)
+ /*
+  * Wipe out a buffer and decrement the last buffer number if it was used for
+  * this buffer.  Call this to wipe out a temp buffer that does not contain any
+  * marks.
   */
-     int
- utf_iscomposing(c)
-     int               c;
+-/*ARGSUSED*/
+     void
+ wipe_buffer(buf, aucmd)
+     buf_T     *buf;
+-    int               aucmd;      /* When TRUE trigger autocommands. */
++    int               aucmd UNUSED;       /* When TRUE trigger autocommands. */
  {
--    /* sorted list of non-overlapping intervals */
-+    /* Sorted list of non-overlapping intervals.
-+     * Generated by ../runtime/tools/unicode.vim. */
-     static struct interval combining[] =
-     {
--      {0x0300, 0x034f}, {0x0360, 0x036f}, {0x0483, 0x0486}, {0x0488, 0x0489},
--      {0x0591, 0x05a1}, {0x05a3, 0x05b9}, {0x05bb, 0x05bd}, {0x05bf, 0x05bf},
--      {0x05c1, 0x05c2}, {0x05c4, 0x05c4}, {0x0610, 0x0615}, {0x064b, 0x0658},
--      {0x0670, 0x0670}, {0x06d6, 0x06dc}, {0x06de, 0x06e4}, {0x06e7, 0x06e8},
--      {0x06ea, 0x06ed}, {0x0711, 0x0711}, {0x0730, 0x074a}, {0x07a6, 0x07b0},
--      {0x0901, 0x0903}, {0x093c, 0x093c}, {0x093e, 0x094d}, {0x0951, 0x0954},
--      {0x0962, 0x0963}, {0x0981, 0x0983}, {0x09bc, 0x09bc}, {0x09be, 0x09c4},
--      {0x09c7, 0x09c8}, {0x09cb, 0x09cd}, {0x09d7, 0x09d7}, {0x09e2, 0x09e3},
--      {0x0a01, 0x0a03}, {0x0a3c, 0x0a3c}, {0x0a3e, 0x0a42}, {0x0a47, 0x0a48},
--      {0x0a4b, 0x0a4d}, {0x0a70, 0x0a71}, {0x0a81, 0x0a83}, {0x0abc, 0x0abc},
--      {0x0abe, 0x0ac5}, {0x0ac7, 0x0ac9}, {0x0acb, 0x0acd}, {0x0ae2, 0x0ae3},
--      {0x0b01, 0x0b03}, {0x0b3c, 0x0b3c}, {0x0b3e, 0x0b43}, {0x0b47, 0x0b48},
--      {0x0b4b, 0x0b4d}, {0x0b56, 0x0b57}, {0x0b82, 0x0b82}, {0x0bbe, 0x0bc2},
--      {0x0bc6, 0x0bc8}, {0x0bca, 0x0bcd}, {0x0bd7, 0x0bd7}, {0x0c01, 0x0c03},
--      {0x0c3e, 0x0c44}, {0x0c46, 0x0c48}, {0x0c4a, 0x0c4d}, {0x0c55, 0x0c56},
--      {0x0c82, 0x0c83}, {0x0cbc, 0x0cbc}, {0x0cbe, 0x0cc4}, {0x0cc6, 0x0cc8},
--      {0x0cca, 0x0ccd}, {0x0cd5, 0x0cd6}, {0x0d02, 0x0d03}, {0x0d3e, 0x0d43},
--      {0x0d46, 0x0d48}, {0x0d4a, 0x0d4d}, {0x0d57, 0x0d57}, {0x0d82, 0x0d83},
--      {0x0dca, 0x0dca}, {0x0dcf, 0x0dd4}, {0x0dd6, 0x0dd6}, {0x0dd8, 0x0ddf},
--      {0x0df2, 0x0df3}, {0x0e31, 0x0e31}, {0x0e34, 0x0e3a}, {0x0e47, 0x0e4e},
--      {0x0eb1, 0x0eb1}, {0x0eb4, 0x0eb9}, {0x0ebb, 0x0ebc}, {0x0ec8, 0x0ecd},
--      {0x0f18, 0x0f19}, {0x0f35, 0x0f35}, {0x0f37, 0x0f37}, {0x0f39, 0x0f39},
--      {0x0f3e, 0x0f3f}, {0x0f71, 0x0f84}, {0x0f86, 0x0f87}, {0x0f90, 0x0f97},
--      {0x0f99, 0x0fbc}, {0x0fc6, 0x0fc6}, {0x102c, 0x1032}, {0x1036, 0x1039},
--      {0x1056, 0x1059}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753},
--      {0x1772, 0x1773}, {0x17b6, 0x17d3}, {0x17dd, 0x17dd}, {0x180b, 0x180d},
--      {0x18a9, 0x18a9}, {0x1920, 0x192b}, {0x1930, 0x193b}, {0x20d0, 0x20ea},
--      {0x302a, 0x302f}, {0x3099, 0x309a}, {0xfb1e, 0xfb1e}, {0xfe00, 0xfe0f},
--      {0xfe20, 0xfe23},
-+      {0x0300, 0x036f},
-+      {0x0483, 0x0489},
-+      {0x0591, 0x05bd},
-+      {0x05bf, 0x05bf},
-+      {0x05c1, 0x05c2},
-+      {0x05c4, 0x05c5},
-+      {0x05c7, 0x05c7},
-+      {0x0610, 0x061a},
-+      {0x064b, 0x065e},
-+      {0x0670, 0x0670},
-+      {0x06d6, 0x06dc},
-+      {0x06de, 0x06e4},
-+      {0x06e7, 0x06e8},
-+      {0x06ea, 0x06ed},
-+      {0x0711, 0x0711},
-+      {0x0730, 0x074a},
-+      {0x07a6, 0x07b0},
-+      {0x07eb, 0x07f3},
-+      {0x0816, 0x0819},
-+      {0x081b, 0x0823},
-+      {0x0825, 0x0827},
-+      {0x0829, 0x082d},
-+      {0x0900, 0x0903},
-+      {0x093c, 0x093c},
-+      {0x093e, 0x094e},
-+      {0x0951, 0x0955},
-+      {0x0962, 0x0963},
-+      {0x0981, 0x0983},
-+      {0x09bc, 0x09bc},
-+      {0x09be, 0x09c4},
-+      {0x09c7, 0x09c8},
-+      {0x09cb, 0x09cd},
-+      {0x09d7, 0x09d7},
-+      {0x09e2, 0x09e3},
-+      {0x0a01, 0x0a03},
-+      {0x0a3c, 0x0a3c},
-+      {0x0a3e, 0x0a42},
-+      {0x0a47, 0x0a48},
-+      {0x0a4b, 0x0a4d},
-+      {0x0a51, 0x0a51},
-+      {0x0a70, 0x0a71},
-+      {0x0a75, 0x0a75},
-+      {0x0a81, 0x0a83},
-+      {0x0abc, 0x0abc},
-+      {0x0abe, 0x0ac5},
-+      {0x0ac7, 0x0ac9},
-+      {0x0acb, 0x0acd},
-+      {0x0ae2, 0x0ae3},
-+      {0x0b01, 0x0b03},
-+      {0x0b3c, 0x0b3c},
-+      {0x0b3e, 0x0b44},
-+      {0x0b47, 0x0b48},
-+      {0x0b4b, 0x0b4d},
-+      {0x0b56, 0x0b57},
-+      {0x0b62, 0x0b63},
-+      {0x0b82, 0x0b82},
-+      {0x0bbe, 0x0bc2},
-+      {0x0bc6, 0x0bc8},
-+      {0x0bca, 0x0bcd},
-+      {0x0bd7, 0x0bd7},
-+      {0x0c01, 0x0c03},
-+      {0x0c3e, 0x0c44},
-+      {0x0c46, 0x0c48},
-+      {0x0c4a, 0x0c4d},
-+      {0x0c55, 0x0c56},
-+      {0x0c62, 0x0c63},
-+      {0x0c82, 0x0c83},
-+      {0x0cbc, 0x0cbc},
-+      {0x0cbe, 0x0cc4},
-+      {0x0cc6, 0x0cc8},
-+      {0x0cca, 0x0ccd},
-+      {0x0cd5, 0x0cd6},
-+      {0x0ce2, 0x0ce3},
-+      {0x0d02, 0x0d03},
-+      {0x0d3e, 0x0d44},
-+      {0x0d46, 0x0d48},
-+      {0x0d4a, 0x0d4d},
-+      {0x0d57, 0x0d57},
-+      {0x0d62, 0x0d63},
-+      {0x0d82, 0x0d83},
-+      {0x0dca, 0x0dca},
-+      {0x0dcf, 0x0dd4},
-+      {0x0dd6, 0x0dd6},
-+      {0x0dd8, 0x0ddf},
-+      {0x0df2, 0x0df3},
-+      {0x0e31, 0x0e31},
-+      {0x0e34, 0x0e3a},
-+      {0x0e47, 0x0e4e},
-+      {0x0eb1, 0x0eb1},
-+      {0x0eb4, 0x0eb9},
-+      {0x0ebb, 0x0ebc},
-+      {0x0ec8, 0x0ecd},
-+      {0x0f18, 0x0f19},
-+      {0x0f35, 0x0f35},
-+      {0x0f37, 0x0f37},
-+      {0x0f39, 0x0f39},
-+      {0x0f3e, 0x0f3f},
-+      {0x0f71, 0x0f84},
-+      {0x0f86, 0x0f87},
-+      {0x0f90, 0x0f97},
-+      {0x0f99, 0x0fbc},
-+      {0x0fc6, 0x0fc6},
-+      {0x102b, 0x103e},
-+      {0x1056, 0x1059},
-+      {0x105e, 0x1060},
-+      {0x1062, 0x1064},
-+      {0x1067, 0x106d},
-+      {0x1071, 0x1074},
-+      {0x1082, 0x108d},
-+      {0x108f, 0x108f},
-+      {0x109a, 0x109d},
-+      {0x135f, 0x135f},
-+      {0x1712, 0x1714},
-+      {0x1732, 0x1734},
-+      {0x1752, 0x1753},
-+      {0x1772, 0x1773},
-+      {0x17b6, 0x17d3},
-+      {0x17dd, 0x17dd},
-+      {0x180b, 0x180d},
-+      {0x18a9, 0x18a9},
-+      {0x1920, 0x192b},
-+      {0x1930, 0x193b},
-+      {0x19b0, 0x19c0},
-+      {0x19c8, 0x19c9},
-+      {0x1a17, 0x1a1b},
-+      {0x1a55, 0x1a5e},
-+      {0x1a60, 0x1a7c},
-+      {0x1a7f, 0x1a7f},
-+      {0x1b00, 0x1b04},
-+      {0x1b34, 0x1b44},
-+      {0x1b6b, 0x1b73},
-+      {0x1b80, 0x1b82},
-+      {0x1ba1, 0x1baa},
-+      {0x1c24, 0x1c37},
-+      {0x1cd0, 0x1cd2},
-+      {0x1cd4, 0x1ce8},
-+      {0x1ced, 0x1ced},
-+      {0x1cf2, 0x1cf2},
-+      {0x1dc0, 0x1de6},
-+      {0x1dfd, 0x1dff},
-+      {0x20d0, 0x20f0},
-+      {0x2cef, 0x2cf1},
-+      {0x2de0, 0x2dff},
-+      {0x302a, 0x302f},
-+      {0x3099, 0x309a},
-+      {0xa66f, 0xa672},
-+      {0xa67c, 0xa67d},
-+      {0xa6f0, 0xa6f1},
-+      {0xa802, 0xa802},
-+      {0xa806, 0xa806},
-+      {0xa80b, 0xa80b},
-+      {0xa823, 0xa827},
-+      {0xa880, 0xa881},
-+      {0xa8b4, 0xa8c4},
-+      {0xa8e0, 0xa8f1},
-+      {0xa926, 0xa92d},
-+      {0xa947, 0xa953},
-+      {0xa980, 0xa983},
-+      {0xa9b3, 0xa9c0},
-+      {0xaa29, 0xaa36},
-+      {0xaa43, 0xaa43},
-+      {0xaa4c, 0xaa4d},
-+      {0xaa7b, 0xaa7b},
-+      {0xaab0, 0xaab0},
-+      {0xaab2, 0xaab4},
-+      {0xaab7, 0xaab8},
-+      {0xaabe, 0xaabf},
-+      {0xaac1, 0xaac1},
-+      {0xabe3, 0xabea},
-+      {0xabec, 0xabed},
-+      {0xfb1e, 0xfb1e},
-+      {0xfe00, 0xfe0f},
-+      {0xfe20, 0xfe26},
-+      {0x101fd, 0x101fd},
-+      {0x10a01, 0x10a03},
-+      {0x10a05, 0x10a06},
-+      {0x10a0c, 0x10a0f},
-+      {0x10a38, 0x10a3a},
-+      {0x10a3f, 0x10a3f},
-+      {0x11080, 0x11082},
-+      {0x110b0, 0x110ba},
-+      {0x1d165, 0x1d169},
-+      {0x1d16d, 0x1d172},
-+      {0x1d17b, 0x1d182},
-+      {0x1d185, 0x1d18b},
-+      {0x1d1aa, 0x1d1ad},
-+      {0x1d242, 0x1d244},
-+      {0xe0100, 0xe01ef}
-     };
+     if (buf->b_fnum == top_file_num - 1)
+       --top_file_num;
  
-     return intable(combining, sizeof(combining), c);
- }
+ #ifdef FEAT_AUTOCMD
+--- vim72.orig/src/charset.c
++++ vim72/src/charset.c
+@@ -15,11 +15,11 @@ static int win_chartabsize __ARGS((win_T
  
-@@ -2040,64 +2469,185 @@ utf_class(c)
+ #ifdef FEAT_MBYTE
+ static int win_nolbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp));
+ #endif
  
- /*
-  * Code for Unicode case-dependent operations.  Based on notes in
-  * http://www.unicode.org/Public/UNIDATA/CaseFolding.txt
-  * This code uses simple case folding, not full case folding.
-+ * Last updated for Unicode 5.2.
-  */
+-static int nr2hex __ARGS((int c));
++static unsigned nr2hex __ARGS((unsigned c));
  
- /*
-- * The following table is built by foldExtract.pl < CaseFolding.txt .
-- * It must be in numeric order, because we use binary search on it.
-- * An entry such as {0x41,0x5a,1,32} means that UCS-4 characters in the range
-- * from 0x41 to 0x5a inclusive, stepping by 1, are folded by adding 32.
-+ * The following tables are built by ../runtime/tools/unicode.vim.
-+ * They must be in numeric order, because we use binary search.
-+ * An entry such as {0x41,0x5a,1,32} means that Unicode characters in the
-+ * range from 0x41 to 0x5a inclusive, stepping by 1, are changed to
-+ * folded/upper/lower by adding 32.
-  */
--
- typedef struct
- {
-     int rangeStart;
-     int rangeEnd;
-     int step;
-     int offset;
- } convertStruct;
+ static int    chartab_initialized = FALSE;
  
- static convertStruct foldCase[] =
- {
--      {0x41,0x5a,1,32}, {0xc0,0xd6,1,32}, {0xd8,0xde,1,32},
--      {0x100,0x12e,2,1}, {0x130,0x130,-1,-199}, {0x132,0x136,2,1},
--      {0x139,0x147,2,1}, {0x14a,0x176,2,1}, {0x178,0x178,-1,-121},
--      {0x179,0x17d,2,1}, {0x181,0x181,-1,210}, {0x182,0x184,2,1},
--      {0x186,0x186,-1,206}, {0x187,0x187,-1,1}, {0x189,0x18a,1,205},
--      {0x18b,0x18b,-1,1}, {0x18e,0x18e,-1,79}, {0x18f,0x18f,-1,202},
--      {0x190,0x190,-1,203}, {0x191,0x191,-1,1}, {0x193,0x193,-1,205},
--      {0x194,0x194,-1,207}, {0x196,0x196,-1,211}, {0x197,0x197,-1,209},
--      {0x198,0x198,-1,1}, {0x19c,0x19c,-1,211}, {0x19d,0x19d,-1,213},
--      {0x19f,0x19f,-1,214}, {0x1a0,0x1a4,2,1}, {0x1a6,0x1a6,-1,218},
--      {0x1a7,0x1a7,-1,1}, {0x1a9,0x1a9,-1,218}, {0x1ac,0x1ac,-1,1},
--      {0x1ae,0x1ae,-1,218}, {0x1af,0x1af,-1,1}, {0x1b1,0x1b2,1,217},
--      {0x1b3,0x1b5,2,1}, {0x1b7,0x1b7,-1,219}, {0x1b8,0x1bc,4,1},
--      {0x1c4,0x1c4,-1,2}, {0x1c5,0x1c5,-1,1}, {0x1c7,0x1c7,-1,2},
--      {0x1c8,0x1c8,-1,1}, {0x1ca,0x1ca,-1,2}, {0x1cb,0x1db,2,1},
--      {0x1de,0x1ee,2,1}, {0x1f1,0x1f1,-1,2}, {0x1f2,0x1f4,2,1},
--      {0x1f6,0x1f6,-1,-97}, {0x1f7,0x1f7,-1,-56}, {0x1f8,0x21e,2,1},
--      {0x220,0x220,-1,-130}, {0x222,0x232,2,1}, {0x386,0x386,-1,38},
--      {0x388,0x38a,1,37}, {0x38c,0x38c,-1,64}, {0x38e,0x38f,1,63},
--      {0x391,0x3a1,1,32}, {0x3a3,0x3ab,1,32}, {0x3d8,0x3ee,2,1},
--      {0x3f4,0x3f4,-1,-60}, {0x3f7,0x3f7,-1,1}, {0x3f9,0x3f9,-1,-7},
--      {0x3fa,0x3fa,-1,1}, {0x400,0x40f,1,80}, {0x410,0x42f,1,32},
--      {0x460,0x480,2,1}, {0x48a,0x4be,2,1}, {0x4c1,0x4cd,2,1},
--      {0x4d0,0x4f4,2,1}, {0x4f8,0x500,8,1}, {0x502,0x50e,2,1},
--      {0x531,0x556,1,48}, {0x1e00,0x1e94,2,1}, {0x1ea0,0x1ef8,2,1},
--      {0x1f08,0x1f0f,1,-8}, {0x1f18,0x1f1d,1,-8}, {0x1f28,0x1f2f,1,-8},
--      {0x1f38,0x1f3f,1,-8}, {0x1f48,0x1f4d,1,-8}, {0x1f59,0x1f5f,2,-8},
--      {0x1f68,0x1f6f,1,-8}, {0x1f88,0x1f8f,1,-8}, {0x1f98,0x1f9f,1,-8},
--      {0x1fa8,0x1faf,1,-8}, {0x1fb8,0x1fb9,1,-8}, {0x1fba,0x1fbb,1,-74},
--      {0x1fbc,0x1fbc,-1,-9}, {0x1fc8,0x1fcb,1,-86}, {0x1fcc,0x1fcc,-1,-9},
--      {0x1fd8,0x1fd9,1,-8}, {0x1fda,0x1fdb,1,-100}, {0x1fe8,0x1fe9,1,-8},
--      {0x1fea,0x1feb,1,-112}, {0x1fec,0x1fec,-1,-7}, {0x1ff8,0x1ff9,1,-128},
--      {0x1ffa,0x1ffb,1,-126}, {0x1ffc,0x1ffc,-1,-9}, {0x2126,0x2126,-1,-7517},
--      {0x212a,0x212a,-1,-8383}, {0x212b,0x212b,-1,-8262},
--      {0x2160,0x216f,1,16}, {0x24b6,0x24cf,1,26}, {0xff21,0xff3a,1,32},
-+      {0x41,0x5a,1,32},
-+      {0xb5,0xb5,-1,775},
-+      {0xc0,0xd6,1,32},
-+      {0xd8,0xde,1,32},
-+      {0x100,0x12e,2,1},
-+      {0x132,0x136,2,1},
-+      {0x139,0x147,2,1},
-+      {0x14a,0x176,2,1},
-+      {0x178,0x178,-1,-121},
-+      {0x179,0x17d,2,1},
-+      {0x17f,0x17f,-1,-268},
-+      {0x181,0x181,-1,210},
-+      {0x182,0x184,2,1},
-+      {0x186,0x186,-1,206},
-+      {0x187,0x187,-1,1},
-+      {0x189,0x18a,1,205},
-+      {0x18b,0x18b,-1,1},
-+      {0x18e,0x18e,-1,79},
-+      {0x18f,0x18f,-1,202},
-+      {0x190,0x190,-1,203},
-+      {0x191,0x191,-1,1},
-+      {0x193,0x193,-1,205},
-+      {0x194,0x194,-1,207},
-+      {0x196,0x196,-1,211},
-+      {0x197,0x197,-1,209},
-+      {0x198,0x198,-1,1},
-+      {0x19c,0x19c,-1,211},
-+      {0x19d,0x19d,-1,213},
-+      {0x19f,0x19f,-1,214},
-+      {0x1a0,0x1a4,2,1},
-+      {0x1a6,0x1a6,-1,218},
-+      {0x1a7,0x1a7,-1,1},
-+      {0x1a9,0x1a9,-1,218},
-+      {0x1ac,0x1ac,-1,1},
-+      {0x1ae,0x1ae,-1,218},
-+      {0x1af,0x1af,-1,1},
-+      {0x1b1,0x1b2,1,217},
-+      {0x1b3,0x1b5,2,1},
-+      {0x1b7,0x1b7,-1,219},
-+      {0x1b8,0x1bc,4,1},
-+      {0x1c4,0x1c4,-1,2},
-+      {0x1c5,0x1c5,-1,1},
-+      {0x1c7,0x1c7,-1,2},
-+      {0x1c8,0x1c8,-1,1},
-+      {0x1ca,0x1ca,-1,2},
-+      {0x1cb,0x1db,2,1},
-+      {0x1de,0x1ee,2,1},
-+      {0x1f1,0x1f1,-1,2},
-+      {0x1f2,0x1f4,2,1},
-+      {0x1f6,0x1f6,-1,-97},
-+      {0x1f7,0x1f7,-1,-56},
-+      {0x1f8,0x21e,2,1},
-+      {0x220,0x220,-1,-130},
-+      {0x222,0x232,2,1},
-+      {0x23a,0x23a,-1,10795},
-+      {0x23b,0x23b,-1,1},
-+      {0x23d,0x23d,-1,-163},
-+      {0x23e,0x23e,-1,10792},
-+      {0x241,0x241,-1,1},
-+      {0x243,0x243,-1,-195},
-+      {0x244,0x244,-1,69},
-+      {0x245,0x245,-1,71},
-+      {0x246,0x24e,2,1},
-+      {0x345,0x345,-1,116},
-+      {0x370,0x372,2,1},
-+      {0x376,0x376,-1,1},
-+      {0x386,0x386,-1,38},
-+      {0x388,0x38a,1,37},
-+      {0x38c,0x38c,-1,64},
-+      {0x38e,0x38f,1,63},
-+      {0x391,0x3a1,1,32},
-+      {0x3a3,0x3ab,1,32},
-+      {0x3c2,0x3c2,-1,1},
-+      {0x3cf,0x3cf,-1,8},
-+      {0x3d0,0x3d0,-1,-30},
-+      {0x3d1,0x3d1,-1,-25},
-+      {0x3d5,0x3d5,-1,-15},
-+      {0x3d6,0x3d6,-1,-22},
-+      {0x3d8,0x3ee,2,1},
-+      {0x3f0,0x3f0,-1,-54},
-+      {0x3f1,0x3f1,-1,-48},
-+      {0x3f4,0x3f4,-1,-60},
-+      {0x3f5,0x3f5,-1,-64},
-+      {0x3f7,0x3f7,-1,1},
-+      {0x3f9,0x3f9,-1,-7},
-+      {0x3fa,0x3fa,-1,1},
-+      {0x3fd,0x3ff,1,-130},
-+      {0x400,0x40f,1,80},
-+      {0x410,0x42f,1,32},
-+      {0x460,0x480,2,1},
-+      {0x48a,0x4be,2,1},
-+      {0x4c0,0x4c0,-1,15},
-+      {0x4c1,0x4cd,2,1},
-+      {0x4d0,0x524,2,1},
-+      {0x531,0x556,1,48},
-+      {0x10a0,0x10c5,1,7264},
-+      {0x1e00,0x1e94,2,1},
-+      {0x1e9b,0x1e9b,-1,-58},
-+      {0x1e9e,0x1e9e,-1,-7615},
-+      {0x1ea0,0x1efe,2,1},
-+      {0x1f08,0x1f0f,1,-8},
-+      {0x1f18,0x1f1d,1,-8},
-+      {0x1f28,0x1f2f,1,-8},
-+      {0x1f38,0x1f3f,1,-8},
-+      {0x1f48,0x1f4d,1,-8},
-+      {0x1f59,0x1f5f,2,-8},
-+      {0x1f68,0x1f6f,1,-8},
-+      {0x1f88,0x1f8f,1,-8},
-+      {0x1f98,0x1f9f,1,-8},
-+      {0x1fa8,0x1faf,1,-8},
-+      {0x1fb8,0x1fb9,1,-8},
-+      {0x1fba,0x1fbb,1,-74},
-+      {0x1fbc,0x1fbc,-1,-9},
-+      {0x1fbe,0x1fbe,-1,-7173},
-+      {0x1fc8,0x1fcb,1,-86},
-+      {0x1fcc,0x1fcc,-1,-9},
-+      {0x1fd8,0x1fd9,1,-8},
-+      {0x1fda,0x1fdb,1,-100},
-+      {0x1fe8,0x1fe9,1,-8},
-+      {0x1fea,0x1feb,1,-112},
-+      {0x1fec,0x1fec,-1,-7},
-+      {0x1ff8,0x1ff9,1,-128},
-+      {0x1ffa,0x1ffb,1,-126},
-+      {0x1ffc,0x1ffc,-1,-9},
-+      {0x2126,0x2126,-1,-7517},
-+      {0x212a,0x212a,-1,-8383},
-+      {0x212b,0x212b,-1,-8262},
-+      {0x2132,0x2132,-1,28},
-+      {0x2160,0x216f,1,16},
-+      {0x2183,0x2183,-1,1},
-+      {0x24b6,0x24cf,1,26},
-+      {0x2c00,0x2c2e,1,48},
-+      {0x2c60,0x2c60,-1,1},
-+      {0x2c62,0x2c62,-1,-10743},
-+      {0x2c63,0x2c63,-1,-3814},
-+      {0x2c64,0x2c64,-1,-10727},
-+      {0x2c67,0x2c6b,2,1},
-+      {0x2c6d,0x2c6d,-1,-10780},
-+      {0x2c6e,0x2c6e,-1,-10749},
-+      {0x2c6f,0x2c6f,-1,-10783},
-+      {0x2c70,0x2c70,-1,-10782},
-+      {0x2c72,0x2c75,3,1},
-+      {0x2c7e,0x2c7f,1,-10815},
-+      {0x2c80,0x2ce2,2,1},
-+      {0x2ceb,0x2ced,2,1},
-+      {0xa640,0xa65e,2,1},
-+      {0xa662,0xa66c,2,1},
-+      {0xa680,0xa696,2,1},
-+      {0xa722,0xa72e,2,1},
-+      {0xa732,0xa76e,2,1},
-+      {0xa779,0xa77b,2,1},
-+      {0xa77d,0xa77d,-1,-35332},
-+      {0xa77e,0xa786,2,1},
-+      {0xa78b,0xa78b,-1,1},
-+      {0xff21,0xff3a,1,32},
-       {0x10400,0x10427,1,40}
- };
+ /* b_chartab[] is an array of 32 bytes, each bit representing one of the
+  * characters 0-255. */
+@@ -172,21 +172,31 @@ buf_init_chartab(buf, global)
+               ++p;
+           }
+           if (VIM_ISDIGIT(*p))
+               c = getdigits(&p);
+           else
++#ifdef FEAT_MBYTE
++               if (has_mbyte)
++              c = mb_ptr2char_adv(&p);
++          else
++#endif
+               c = *p++;
+           c2 = -1;
+           if (*p == '-' && p[1] != NUL)
+           {
+               ++p;
+               if (VIM_ISDIGIT(*p))
+                   c2 = getdigits(&p);
+               else
++#ifdef FEAT_MBYTE
++                   if (has_mbyte)
++                  c2 = mb_ptr2char_adv(&p);
++              else
++#endif
+                   c2 = *p++;
+           }
+-          if (c <= 0 || (c2 < c && c2 != -1) || c2 >= 256
++          if (c <= 0 || c >= 256 || (c2 < c && c2 != -1) || c2 >= 256
+                                                || !(*p == NUL || *p == ','))
+               return FAIL;
  
- static int utf_convert(int a, convertStruct table[], int tableSize);
+           if (c2 == -1)       /* not a range */
+           {
+@@ -662,23 +672,23 @@ transchar_hex(buf, c)
+       buf[++i] = nr2hex((unsigned)c >> 12);
+       buf[++i] = nr2hex((unsigned)c >> 8);
+     }
+ #endif
+     buf[++i] = nr2hex((unsigned)c >> 4);
+-    buf[++i] = nr2hex(c);
++    buf[++i] = nr2hex((unsigned)c);
+     buf[++i] = '>';
+     buf[++i] = NUL;
+ }
  
-@@ -2141,89 +2691,310 @@ utf_fold(a)
-     int               a;
+ /*
+  * Convert the lower 4 bits of byte "c" to its hex character.
+  * Lower case letters are used to avoid the confusion of <F1> being 0xf1 or
+  * function key 1.
+  */
+-    static int
++    static unsigned
+ nr2hex(c)
+-    int               c;
++    unsigned  c;
  {
-     return utf_convert(a, foldCase, sizeof(foldCase));
+     if ((c & 0xf) <= 9)
+       return (c & 0xf) + '0';
+     return (c & 0xf) - 10 + 'a';
  }
--/*
-- * The following tables are built by upperLowerExtract.pl < UnicodeData.txt .
-- * They must be in numeric order, because we use binary search on them.
-- * An entry such as {0x41,0x5a,1,32} means that UCS-4 characters in the range
-- * from 0x41 to 0x5a inclusive, stepping by 1, are switched to lower (for
-- * example) by adding 32.
-- */
- static convertStruct toLower[] =
+@@ -882,11 +892,11 @@ vim_iswordc(c)
  {
--      {0x41,0x5a,1,32}, {0xc0,0xd6,1,32}, {0xd8,0xde,1,32},
--      {0x100,0x12e,2,1}, {0x130,0x130,-1,-199}, {0x132,0x136,2,1},
--      {0x139,0x147,2,1}, {0x14a,0x176,2,1}, {0x178,0x178,-1,-121},
--      {0x179,0x17d,2,1}, {0x181,0x181,-1,210}, {0x182,0x184,2,1},
--      {0x186,0x186,-1,206}, {0x187,0x187,-1,1}, {0x189,0x18a,1,205},
--      {0x18b,0x18b,-1,1}, {0x18e,0x18e,-1,79}, {0x18f,0x18f,-1,202},
--      {0x190,0x190,-1,203}, {0x191,0x191,-1,1}, {0x193,0x193,-1,205},
--      {0x194,0x194,-1,207}, {0x196,0x196,-1,211}, {0x197,0x197,-1,209},
--      {0x198,0x198,-1,1}, {0x19c,0x19c,-1,211}, {0x19d,0x19d,-1,213},
--      {0x19f,0x19f,-1,214}, {0x1a0,0x1a4,2,1}, {0x1a6,0x1a6,-1,218},
--      {0x1a7,0x1a7,-1,1}, {0x1a9,0x1a9,-1,218}, {0x1ac,0x1ac,-1,1},
--      {0x1ae,0x1ae,-1,218}, {0x1af,0x1af,-1,1}, {0x1b1,0x1b2,1,217},
--      {0x1b3,0x1b5,2,1}, {0x1b7,0x1b7,-1,219}, {0x1b8,0x1bc,4,1},
--      {0x1c4,0x1ca,3,2}, {0x1cd,0x1db,2,1}, {0x1de,0x1ee,2,1},
--      {0x1f1,0x1f1,-1,2}, {0x1f4,0x1f4,-1,1}, {0x1f6,0x1f6,-1,-97},
--      {0x1f7,0x1f7,-1,-56}, {0x1f8,0x21e,2,1}, {0x220,0x220,-1,-130},
--      {0x222,0x232,2,1}, {0x386,0x386,-1,38}, {0x388,0x38a,1,37},
--      {0x38c,0x38c,-1,64}, {0x38e,0x38f,1,63}, {0x391,0x3a1,1,32},
--      {0x3a3,0x3ab,1,32}, {0x3d8,0x3ee,2,1}, {0x3f4,0x3f4,-1,-60},
--      {0x3f7,0x3f7,-1,1}, {0x3f9,0x3f9,-1,-7}, {0x3fa,0x3fa,-1,1},
--      {0x400,0x40f,1,80}, {0x410,0x42f,1,32}, {0x460,0x480,2,1},
--      {0x48a,0x4be,2,1}, {0x4c1,0x4cd,2,1}, {0x4d0,0x4f4,2,1},
--      {0x4f8,0x500,8,1}, {0x502,0x50e,2,1}, {0x531,0x556,1,48},
--      {0x1e00,0x1e94,2,1}, {0x1ea0,0x1ef8,2,1}, {0x1f08,0x1f0f,1,-8},
--      {0x1f18,0x1f1d,1,-8}, {0x1f28,0x1f2f,1,-8}, {0x1f38,0x1f3f,1,-8},
--      {0x1f48,0x1f4d,1,-8}, {0x1f59,0x1f5f,2,-8}, {0x1f68,0x1f6f,1,-8},
--      {0x1fb8,0x1fb9,1,-8}, {0x1fba,0x1fbb,1,-74}, {0x1fc8,0x1fcb,1,-86},
--      {0x1fd8,0x1fd9,1,-8}, {0x1fda,0x1fdb,1,-100}, {0x1fe8,0x1fe9,1,-8},
--      {0x1fea,0x1feb,1,-112}, {0x1fec,0x1fec,-1,-7}, {0x1ff8,0x1ff9,1,-128},
--      {0x1ffa,0x1ffb,1,-126}, {0x2126,0x2126,-1,-7517}, {0x212a,0x212a,-1,-8383},
--      {0x212b,0x212b,-1,-8262}, {0xff21,0xff3a,1,32}, {0x10400,0x10427,1,40}
-+      {0x41,0x5a,1,32},
-+      {0xc0,0xd6,1,32},
-+      {0xd8,0xde,1,32},
-+      {0x100,0x12e,2,1},
-+      {0x130,0x130,-1,-199},
-+      {0x132,0x136,2,1},
-+      {0x139,0x147,2,1},
-+      {0x14a,0x176,2,1},
-+      {0x178,0x178,-1,-121},
-+      {0x179,0x17d,2,1},
-+      {0x181,0x181,-1,210},
-+      {0x182,0x184,2,1},
-+      {0x186,0x186,-1,206},
-+      {0x187,0x187,-1,1},
-+      {0x189,0x18a,1,205},
-+      {0x18b,0x18b,-1,1},
-+      {0x18e,0x18e,-1,79},
-+      {0x18f,0x18f,-1,202},
-+      {0x190,0x190,-1,203},
-+      {0x191,0x191,-1,1},
-+      {0x193,0x193,-1,205},
-+      {0x194,0x194,-1,207},
-+      {0x196,0x196,-1,211},
-+      {0x197,0x197,-1,209},
-+      {0x198,0x198,-1,1},
-+      {0x19c,0x19c,-1,211},
-+      {0x19d,0x19d,-1,213},
-+      {0x19f,0x19f,-1,214},
-+      {0x1a0,0x1a4,2,1},
-+      {0x1a6,0x1a6,-1,218},
-+      {0x1a7,0x1a7,-1,1},
-+      {0x1a9,0x1a9,-1,218},
-+      {0x1ac,0x1ac,-1,1},
-+      {0x1ae,0x1ae,-1,218},
-+      {0x1af,0x1af,-1,1},
-+      {0x1b1,0x1b2,1,217},
-+      {0x1b3,0x1b5,2,1},
-+      {0x1b7,0x1b7,-1,219},
-+      {0x1b8,0x1bc,4,1},
-+      {0x1c4,0x1c4,-1,2},
-+      {0x1c5,0x1c5,-1,1},
-+      {0x1c7,0x1c7,-1,2},
-+      {0x1c8,0x1c8,-1,1},
-+      {0x1ca,0x1ca,-1,2},
-+      {0x1cb,0x1db,2,1},
-+      {0x1de,0x1ee,2,1},
-+      {0x1f1,0x1f1,-1,2},
-+      {0x1f2,0x1f4,2,1},
-+      {0x1f6,0x1f6,-1,-97},
-+      {0x1f7,0x1f7,-1,-56},
-+      {0x1f8,0x21e,2,1},
-+      {0x220,0x220,-1,-130},
-+      {0x222,0x232,2,1},
-+      {0x23a,0x23a,-1,10795},
-+      {0x23b,0x23b,-1,1},
-+      {0x23d,0x23d,-1,-163},
-+      {0x23e,0x23e,-1,10792},
-+      {0x241,0x241,-1,1},
-+      {0x243,0x243,-1,-195},
-+      {0x244,0x244,-1,69},
-+      {0x245,0x245,-1,71},
-+      {0x246,0x24e,2,1},
-+      {0x370,0x372,2,1},
-+      {0x376,0x376,-1,1},
-+      {0x386,0x386,-1,38},
-+      {0x388,0x38a,1,37},
-+      {0x38c,0x38c,-1,64},
-+      {0x38e,0x38f,1,63},
-+      {0x391,0x3a1,1,32},
-+      {0x3a3,0x3ab,1,32},
-+      {0x3cf,0x3cf,-1,8},
-+      {0x3d8,0x3ee,2,1},
-+      {0x3f4,0x3f4,-1,-60},
-+      {0x3f7,0x3f7,-1,1},
-+      {0x3f9,0x3f9,-1,-7},
-+      {0x3fa,0x3fa,-1,1},
-+      {0x3fd,0x3ff,1,-130},
-+      {0x400,0x40f,1,80},
-+      {0x410,0x42f,1,32},
-+      {0x460,0x480,2,1},
-+      {0x48a,0x4be,2,1},
-+      {0x4c0,0x4c0,-1,15},
-+      {0x4c1,0x4cd,2,1},
-+      {0x4d0,0x524,2,1},
-+      {0x531,0x556,1,48},
-+      {0x10a0,0x10c5,1,7264},
-+      {0x1e00,0x1e94,2,1},
-+      {0x1e9e,0x1e9e,-1,-7615},
-+      {0x1ea0,0x1efe,2,1},
-+      {0x1f08,0x1f0f,1,-8},
-+      {0x1f18,0x1f1d,1,-8},
-+      {0x1f28,0x1f2f,1,-8},
-+      {0x1f38,0x1f3f,1,-8},
-+      {0x1f48,0x1f4d,1,-8},
-+      {0x1f59,0x1f5f,2,-8},
-+      {0x1f68,0x1f6f,1,-8},
-+      {0x1f88,0x1f8f,1,-8},
-+      {0x1f98,0x1f9f,1,-8},
-+      {0x1fa8,0x1faf,1,-8},
-+      {0x1fb8,0x1fb9,1,-8},
-+      {0x1fba,0x1fbb,1,-74},
-+      {0x1fbc,0x1fbc,-1,-9},
-+      {0x1fc8,0x1fcb,1,-86},
-+      {0x1fcc,0x1fcc,-1,-9},
-+      {0x1fd8,0x1fd9,1,-8},
-+      {0x1fda,0x1fdb,1,-100},
-+      {0x1fe8,0x1fe9,1,-8},
-+      {0x1fea,0x1feb,1,-112},
-+      {0x1fec,0x1fec,-1,-7},
-+      {0x1ff8,0x1ff9,1,-128},
-+      {0x1ffa,0x1ffb,1,-126},
-+      {0x1ffc,0x1ffc,-1,-9},
-+      {0x2126,0x2126,-1,-7517},
-+      {0x212a,0x212a,-1,-8383},
-+      {0x212b,0x212b,-1,-8262},
-+      {0x2132,0x2132,-1,28},
-+      {0x2160,0x216f,1,16},
-+      {0x2183,0x2183,-1,1},
-+      {0x24b6,0x24cf,1,26},
-+      {0x2c00,0x2c2e,1,48},
-+      {0x2c60,0x2c60,-1,1},
-+      {0x2c62,0x2c62,-1,-10743},
-+      {0x2c63,0x2c63,-1,-3814},
-+      {0x2c64,0x2c64,-1,-10727},
-+      {0x2c67,0x2c6b,2,1},
-+      {0x2c6d,0x2c6d,-1,-10780},
-+      {0x2c6e,0x2c6e,-1,-10749},
-+      {0x2c6f,0x2c6f,-1,-10783},
-+      {0x2c70,0x2c70,-1,-10782},
-+      {0x2c72,0x2c75,3,1},
-+      {0x2c7e,0x2c7f,1,-10815},
-+      {0x2c80,0x2ce2,2,1},
-+      {0x2ceb,0x2ced,2,1},
-+      {0xa640,0xa65e,2,1},
-+      {0xa662,0xa66c,2,1},
-+      {0xa680,0xa696,2,1},
-+      {0xa722,0xa72e,2,1},
-+      {0xa732,0xa76e,2,1},
-+      {0xa779,0xa77b,2,1},
-+      {0xa77d,0xa77d,-1,-35332},
-+      {0xa77e,0xa786,2,1},
-+      {0xa78b,0xa78b,-1,1},
-+      {0xff21,0xff3a,1,32},
-+      {0x10400,0x10427,1,40}
- };
- static convertStruct toUpper[] =
- {
--      {0x61,0x7a,1,-32}, {0xb5,0xb5,-1,743}, {0xe0,0xf6,1,-32},
--      {0xf8,0xfe,1,-32}, {0xff,0xff,-1,121}, {0x101,0x12f,2,-1},
--      {0x131,0x131,-1,-232}, {0x133,0x137,2,-1}, {0x13a,0x148,2,-1},
--      {0x14b,0x177,2,-1}, {0x17a,0x17e,2,-1}, {0x17f,0x17f,-1,-300},
--      {0x183,0x185,2,-1}, {0x188,0x18c,4,-1}, {0x192,0x192,-1,-1},
--      {0x195,0x195,-1,97}, {0x199,0x199,-1,-1}, {0x19e,0x19e,-1,130},
--      {0x1a1,0x1a5,2,-1}, {0x1a8,0x1ad,5,-1}, {0x1b0,0x1b4,4,-1},
--      {0x1b6,0x1b9,3,-1}, {0x1bd,0x1bd,-1,-1}, {0x1bf,0x1bf,-1,56},
--      {0x1c5,0x1c6,1,-1}, {0x1c8,0x1c9,1,-1}, {0x1cb,0x1cc,1,-1},
--      {0x1ce,0x1dc,2,-1}, {0x1dd,0x1dd,-1,-79}, {0x1df,0x1ef,2,-1},
--      {0x1f2,0x1f3,1,-1}, {0x1f5,0x1f9,4,-1}, {0x1fb,0x21f,2,-1},
--      {0x223,0x233,2,-1}, {0x253,0x253,-1,-210}, {0x254,0x254,-1,-206},
--      {0x256,0x257,1,-205}, {0x259,0x259,-1,-202}, {0x25b,0x25b,-1,-203},
--      {0x260,0x260,-1,-205}, {0x263,0x263,-1,-207}, {0x268,0x268,-1,-209},
--      {0x269,0x26f,6,-211}, {0x272,0x272,-1,-213}, {0x275,0x275,-1,-214},
--      {0x280,0x283,3,-218}, {0x288,0x288,-1,-218}, {0x28a,0x28b,1,-217},
--      {0x292,0x292,-1,-219}, {0x3ac,0x3ac,-1,-38}, {0x3ad,0x3af,1,-37},
--      {0x3b1,0x3c1,1,-32}, {0x3c2,0x3c2,-1,-31}, {0x3c3,0x3cb,1,-32},
--      {0x3cc,0x3cc,-1,-64}, {0x3cd,0x3ce,1,-63}, {0x3d0,0x3d0,-1,-62},
--      {0x3d1,0x3d1,-1,-57}, {0x3d5,0x3d5,-1,-47}, {0x3d6,0x3d6,-1,-54},
--      {0x3d9,0x3ef,2,-1}, {0x3f0,0x3f0,-1,-86}, {0x3f1,0x3f1,-1,-80},
--      {0x3f2,0x3f2,-1,7}, {0x3f5,0x3f5,-1,-96}, {0x3f8,0x3fb,3,-1},
--      {0x430,0x44f,1,-32}, {0x450,0x45f,1,-80}, {0x461,0x481,2,-1},
--      {0x48b,0x4bf,2,-1}, {0x4c2,0x4ce,2,-1}, {0x4d1,0x4f5,2,-1},
--      {0x4f9,0x501,8,-1}, {0x503,0x50f,2,-1}, {0x561,0x586,1,-48},
--      {0x1e01,0x1e95,2,-1}, {0x1e9b,0x1e9b,-1,-59}, {0x1ea1,0x1ef9,2,-1},
--      {0x1f00,0x1f07,1,8}, {0x1f10,0x1f15,1,8}, {0x1f20,0x1f27,1,8},
--      {0x1f30,0x1f37,1,8}, {0x1f40,0x1f45,1,8}, {0x1f51,0x1f57,2,8},
--      {0x1f60,0x1f67,1,8}, {0x1f70,0x1f71,1,74}, {0x1f72,0x1f75,1,86},
--      {0x1f76,0x1f77,1,100}, {0x1f78,0x1f79,1,128}, {0x1f7a,0x1f7b,1,112},
--      {0x1f7c,0x1f7d,1,126}, {0x1f80,0x1f87,1,8}, {0x1f90,0x1f97,1,8},
--      {0x1fa0,0x1fa7,1,8}, {0x1fb0,0x1fb1,1,8}, {0x1fb3,0x1fb3,-1,9},
--      {0x1fbe,0x1fbe,-1,-7205}, {0x1fc3,0x1fc3,-1,9}, {0x1fd0,0x1fd1,1,8},
--      {0x1fe0,0x1fe1,1,8}, {0x1fe5,0x1fe5,-1,7}, {0x1ff3,0x1ff3,-1,9},
--      {0xff41,0xff5a,1,-32}, {0x10428,0x1044f,1,-40}
-+      {0x61,0x7a,1,-32},
-+      {0xb5,0xb5,-1,743},
-+      {0xe0,0xf6,1,-32},
-+      {0xf8,0xfe,1,-32},
-+      {0xff,0xff,-1,121},
-+      {0x101,0x12f,2,-1},
-+      {0x131,0x131,-1,-232},
-+      {0x133,0x137,2,-1},
-+      {0x13a,0x148,2,-1},
-+      {0x14b,0x177,2,-1},
-+      {0x17a,0x17e,2,-1},
-+      {0x17f,0x17f,-1,-300},
-+      {0x180,0x180,-1,195},
-+      {0x183,0x185,2,-1},
-+      {0x188,0x18c,4,-1},
-+      {0x192,0x192,-1,-1},
-+      {0x195,0x195,-1,97},
-+      {0x199,0x199,-1,-1},
-+      {0x19a,0x19a,-1,163},
-+      {0x19e,0x19e,-1,130},
-+      {0x1a1,0x1a5,2,-1},
-+      {0x1a8,0x1ad,5,-1},
-+      {0x1b0,0x1b4,4,-1},
-+      {0x1b6,0x1b9,3,-1},
-+      {0x1bd,0x1bd,-1,-1},
-+      {0x1bf,0x1bf,-1,56},
-+      {0x1c5,0x1c5,-1,-1},
-+      {0x1c6,0x1c6,-1,-2},
-+      {0x1c8,0x1c8,-1,-1},
-+      {0x1c9,0x1c9,-1,-2},
-+      {0x1cb,0x1cb,-1,-1},
-+      {0x1cc,0x1cc,-1,-2},
-+      {0x1ce,0x1dc,2,-1},
-+      {0x1dd,0x1dd,-1,-79},
-+      {0x1df,0x1ef,2,-1},
-+      {0x1f2,0x1f2,-1,-1},
-+      {0x1f3,0x1f3,-1,-2},
-+      {0x1f5,0x1f9,4,-1},
-+      {0x1fb,0x21f,2,-1},
-+      {0x223,0x233,2,-1},
-+      {0x23c,0x23c,-1,-1},
-+      {0x23f,0x240,1,10815},
-+      {0x242,0x247,5,-1},
-+      {0x249,0x24f,2,-1},
-+      {0x250,0x250,-1,10783},
-+      {0x251,0x251,-1,10780},
-+      {0x252,0x252,-1,10782},
-+      {0x253,0x253,-1,-210},
-+      {0x254,0x254,-1,-206},
-+      {0x256,0x257,1,-205},
-+      {0x259,0x259,-1,-202},
-+      {0x25b,0x25b,-1,-203},
-+      {0x260,0x260,-1,-205},
-+      {0x263,0x263,-1,-207},
-+      {0x268,0x268,-1,-209},
-+      {0x269,0x269,-1,-211},
-+      {0x26b,0x26b,-1,10743},
-+      {0x26f,0x26f,-1,-211},
-+      {0x271,0x271,-1,10749},
-+      {0x272,0x272,-1,-213},
-+      {0x275,0x275,-1,-214},
-+      {0x27d,0x27d,-1,10727},
-+      {0x280,0x283,3,-218},
-+      {0x288,0x288,-1,-218},
-+      {0x289,0x289,-1,-69},
-+      {0x28a,0x28b,1,-217},
-+      {0x28c,0x28c,-1,-71},
-+      {0x292,0x292,-1,-219},
-+      {0x345,0x345,-1,84},
-+      {0x371,0x373,2,-1},
-+      {0x377,0x377,-1,-1},
-+      {0x37b,0x37d,1,130},
-+      {0x3ac,0x3ac,-1,-38},
-+      {0x3ad,0x3af,1,-37},
-+      {0x3b1,0x3c1,1,-32},
-+      {0x3c2,0x3c2,-1,-31},
-+      {0x3c3,0x3cb,1,-32},
-+      {0x3cc,0x3cc,-1,-64},
-+      {0x3cd,0x3ce,1,-63},
-+      {0x3d0,0x3d0,-1,-62},
-+      {0x3d1,0x3d1,-1,-57},
-+      {0x3d5,0x3d5,-1,-47},
-+      {0x3d6,0x3d6,-1,-54},
-+      {0x3d7,0x3d7,-1,-8},
-+      {0x3d9,0x3ef,2,-1},
-+      {0x3f0,0x3f0,-1,-86},
-+      {0x3f1,0x3f1,-1,-80},
-+      {0x3f2,0x3f2,-1,7},
-+      {0x3f5,0x3f5,-1,-96},
-+      {0x3f8,0x3fb,3,-1},
-+      {0x430,0x44f,1,-32},
-+      {0x450,0x45f,1,-80},
-+      {0x461,0x481,2,-1},
-+      {0x48b,0x4bf,2,-1},
-+      {0x4c2,0x4ce,2,-1},
-+      {0x4cf,0x4cf,-1,-15},
-+      {0x4d1,0x525,2,-1},
-+      {0x561,0x586,1,-48},
-+      {0x1d79,0x1d79,-1,35332},
-+      {0x1d7d,0x1d7d,-1,3814},
-+      {0x1e01,0x1e95,2,-1},
-+      {0x1e9b,0x1e9b,-1,-59},
-+      {0x1ea1,0x1eff,2,-1},
-+      {0x1f00,0x1f07,1,8},
-+      {0x1f10,0x1f15,1,8},
-+      {0x1f20,0x1f27,1,8},
-+      {0x1f30,0x1f37,1,8},
-+      {0x1f40,0x1f45,1,8},
-+      {0x1f51,0x1f57,2,8},
-+      {0x1f60,0x1f67,1,8},
-+      {0x1f70,0x1f71,1,74},
-+      {0x1f72,0x1f75,1,86},
-+      {0x1f76,0x1f77,1,100},
-+      {0x1f78,0x1f79,1,128},
-+      {0x1f7a,0x1f7b,1,112},
-+      {0x1f7c,0x1f7d,1,126},
-+      {0x1f80,0x1f87,1,8},
-+      {0x1f90,0x1f97,1,8},
-+      {0x1fa0,0x1fa7,1,8},
-+      {0x1fb0,0x1fb1,1,8},
-+      {0x1fb3,0x1fb3,-1,9},
-+      {0x1fbe,0x1fbe,-1,-7205},
-+      {0x1fc3,0x1fc3,-1,9},
-+      {0x1fd0,0x1fd1,1,8},
-+      {0x1fe0,0x1fe1,1,8},
-+      {0x1fe5,0x1fe5,-1,7},
-+      {0x1ff3,0x1ff3,-1,9},
-+      {0x214e,0x214e,-1,-28},
-+      {0x2170,0x217f,1,-16},
-+      {0x2184,0x2184,-1,-1},
-+      {0x24d0,0x24e9,1,-26},
-+      {0x2c30,0x2c5e,1,-48},
-+      {0x2c61,0x2c61,-1,-1},
-+      {0x2c65,0x2c65,-1,-10795},
-+      {0x2c66,0x2c66,-1,-10792},
-+      {0x2c68,0x2c6c,2,-1},
-+      {0x2c73,0x2c76,3,-1},
-+      {0x2c81,0x2ce3,2,-1},
-+      {0x2cec,0x2cee,2,-1},
-+      {0x2d00,0x2d25,1,-7264},
-+      {0xa641,0xa65f,2,-1},
-+      {0xa663,0xa66d,2,-1},
-+      {0xa681,0xa697,2,-1},
-+      {0xa723,0xa72f,2,-1},
-+      {0xa733,0xa76f,2,-1},
-+      {0xa77a,0xa77c,2,-1},
-+      {0xa77f,0xa787,2,-1},
-+      {0xa78c,0xa78c,-1,-1},
-+      {0xff41,0xff5a,1,-32},
-+      {0x10428,0x1044f,1,-40}
- };
- /*
-  * Return the upper-case equivalent of "a", which is a UCS-4 character.  Use
-  * simple case folding.
-@@ -2415,17 +3186,17 @@ show_utf8()
- }
- /*
-  * mb_head_off() function pointer.
-  * Return offset from "p" to the first byte of the character it points into.
-+ * If "p" points to the NUL at the end of the string return 0.
-  * Returns 0 when already at the first byte of a character.
+ #ifdef FEAT_MBYTE
+     if (c >= 0x100)
+     {
+       if (enc_dbcs != 0)
+-          return dbcs_class((unsigned)c >> 8, c & 0xff) >= 2;
++          return dbcs_class((unsigned)c >> 8, (unsigned)(c & 0xff)) >= 2;
+       if (enc_utf8)
+           return utf_class(c) >= 2;
+     }
+ #endif
+     return (c > 0 && c < 0x100 && GET_CHARTAB(curbuf, c) != 0);
+@@ -1024,17 +1034,16 @@ lbr_chartabsize_adv(s, col)
+  *
+  * If "headp" not NULL, set *headp to the size of what we for 'showbreak'
+  * string at start of line.  Warning: *headp is only set if it's a non-zero
+  * value, init to 0 before calling.
   */
 -/*ARGSUSED*/
      int
- latin_head_off(base, p)
--    char_u    *base;
--    char_u    *p;
-+    char_u    *base UNUSED;
-+    char_u    *p UNUSED;
+ win_lbr_chartabsize(wp, s, col, headp)
+     win_T     *wp;
+     char_u    *s;
+     colnr_T   col;
+-    int               *headp;
++    int               *headp UNUSED;
  {
-     return 0;
- }
+ #ifdef FEAT_LINEBREAK
+     int               c;
+     int               size;
+     colnr_T   col2;
+@@ -1088,11 +1097,11 @@ win_lbr_chartabsize(wp, s, col, headp)
+        * Count all characters from first non-blank after a blank up to next
+        * non-blank after a blank.
+        */
+       numberextra = win_col_off(wp);
+       col2 = col;
+-      colmax = W_WIDTH(wp) - numberextra;
++      colmax = (colnr_T)(W_WIDTH(wp) - numberextra);
+       if (col >= colmax)
+       {
+           n = colmax + win_col_off2(wp);
+           if (n > 0)
+               colmax += (((col - colmax) / n) + 1) * n;
+@@ -1199,23 +1208,25 @@ win_nolbr_chartabsize(wp, s, col, headp)
      int
-@@ -2435,11 +3206,11 @@ dbcs_head_off(base, p)
+ in_win_border(wp, vcol)
+     win_T     *wp;
+     colnr_T   vcol;
  {
-     char_u    *q;
-     /* It can't be a trailing byte when not using DBCS, at the start of the
-      * string or the previous byte can't start a double-byte. */
--    if (p <= base || MB_BYTE2LEN(p[-1]) == 1)
-+    if (p <= base || MB_BYTE2LEN(p[-1]) == 1 || *p == NUL)
-       return 0;
+-    colnr_T   width1;         /* width of first line (after line number) */
+-    colnr_T   width2;         /* width of further lines */
++    int               width1;         /* width of first line (after line number) */
++    int               width2;         /* width of further lines */
  
-     /* This is slow: need to start at the base and go forward until the
-      * byte we are looking for.  Return 1 when we went past it, 0 otherwise. */
-     q = base;
-@@ -2463,11 +3234,12 @@ dbcs_screen_head_off(base, p)
-      * string or the previous byte can't start a double-byte.
-      * For euc-jp an 0x8e byte in the previous cell always means we have a
-      * lead byte in the current cell. */
-     if (p <= base
-           || (enc_dbcs == DBCS_JPNU && p[-1] == 0x8e)
--          || MB_BYTE2LEN(p[-1]) == 1)
-+          || MB_BYTE2LEN(p[-1]) == 1
-+          || *p == NUL)
-       return 0;
+ #ifdef FEAT_VERTSPLIT
+     if (wp->w_width == 0)     /* there is no border */
+       return FALSE;
+ #endif
+     width1 = W_WIDTH(wp) - win_col_off(wp);
+-    if (vcol < width1 - 1)
++    if ((int)vcol < width1 - 1)
+       return FALSE;
+-    if (vcol == width1 - 1)
++    if ((int)vcol == width1 - 1)
+       return TRUE;
+     width2 = width1 + win_col_off2(wp);
++    if (width2 <= 0)
++      return FALSE;
+     return ((vcol - width1) % width2 == width2 - 1);
+ }
+ #endif /* FEAT_MBYTE */
  
-     /* This is slow: need to start at the base and go forward until the
-      * byte we are looking for.  Return 1 when we went past it, 0 otherwise.
-      * For DBCS_JPNU look out for 0x8e, which means the second byte is not
-@@ -2489,10 +3261,11 @@ utf_head_off(base, p)
-     char_u    *p;
- {
-     char_u    *q;
-     char_u    *s;
+ /*
+@@ -1242,11 +1253,14 @@ getvcol(wp, pos, start, cursor, end)
+     int               ts = wp->w_buffer->b_p_ts;
      int               c;
-+    int               len;
- #ifdef FEAT_ARABIC
-     char_u    *j;
- #endif
  
-     if (*p < 0x80)            /* be quick for ASCII */
-@@ -2508,12 +3281,12 @@ utf_head_off(base, p)
-       /* Move q to the first byte of this char. */
-       while (q > base && (*q & 0xc0) == 0x80)
-           --q;
-       /* Check for illegal sequence. Do allow an illegal byte after where we
-        * started. */
--      if (utf8len_tab[*q] != (int)(s - q + 1)
--                                     && utf8len_tab[*q] != (int)(p - q + 1))
-+      len = utf8len_tab[*q];
-+      if (len != (int)(s - q + 1) && len != (int)(p - q + 1))
-           return 0;
+     vcol = 0;
+     ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE);
+-    posptr = ptr + pos->col;
++    if (pos->col == MAXCOL)
++      posptr = NULL;  /* continue until the NUL */
++    else
++      posptr = ptr + pos->col;
  
-       if (q <= base)
-           break;
+     /*
+      * This function is used very often, do some speed optimizations.
+      * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop.
+      * Also use this when 'list' is set but tabs take their normal size.
+@@ -1300,11 +1314,11 @@ getvcol(wp, pos, start, cursor, end)
+               else
+ #endif
+                   incr = CHARSIZE(c);
+           }
  
-@@ -2538,11 +3311,10 @@ utf_head_off(base, p)
-     }
+-          if (ptr >= posptr)  /* character at pos->col */
++          if (posptr != NULL && ptr >= posptr) /* character at pos->col */
+               break;
  
-     return (int)(p - q);
- }
+           vcol += incr;
+           mb_ptr_adv(ptr);
+       }
+@@ -1321,11 +1335,11 @@ getvcol(wp, pos, start, cursor, end)
+           {
+               incr = 1;       /* NUL at end of line only takes one column */
+               break;
+           }
  
--#if defined(FEAT_EVAL) || defined(PROTO)
- /*
-  * Copy a character from "*fp" to "*tp" and advance the pointers.
-  */
-     void
- mb_copy_char(fp, tp)
-@@ -2553,11 +3325,10 @@ mb_copy_char(fp, tp)
+-          if (ptr >= posptr)  /* character at pos->col */
++          if (posptr != NULL && ptr >= posptr) /* character at pos->col */
+               break;
  
-     mch_memmove(*tp, *fp, (size_t)l);
-     *tp += l;
-     *fp += l;
- }
--#endif
+           vcol += incr;
+           mb_ptr_adv(ptr);
+       }
+@@ -1394,17 +1408,17 @@ getvvcol(wp, pos, start, cursor, end)
+       coladd = pos->coladd;
+       endadd = 0;
+ # ifdef FEAT_MBYTE
+       /* Cannot put the cursor on part of a wide character. */
+       ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE);
+-      if (pos->col < STRLEN(ptr))
++      if (pos->col < (colnr_T)STRLEN(ptr))
+       {
+           int c = (*mb_ptr2char)(ptr + pos->col);
  
- /*
-  * Return the offset from "p" to the first byte of a character.  When "p" is
-  * at the start of a character 0 is returned, otherwise the offset to the next
-  * character.  Can start anywhere in a stream of bytes.
-@@ -2723,13 +3494,13 @@ utf_valid_string(s, end)
-     int               l;
-     char_u    *p = s;
-     while (end == NULL ? *p != NUL : p < end)
-     {
--      if ((*p & 0xc0) == 0x80)
-+      l = utf8len_tab_zero[*p];
-+      if (l == 0)
-           return FALSE;       /* invalid lead byte */
--      l = utf8len_tab[*p];
-       if (end != NULL && p + l > end)
-           return FALSE;       /* incomplete byte sequence */
-       ++p;
-       while (--l > 0)
-           if ((*p++ & 0xc0) != 0x80)
-@@ -3131,11 +3902,11 @@ enc_locale()
-           s = buf + 10;
-       }
-       else
-           s = p + 1;
-     }
--    for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i)
-+    for (i = 0; s[i] != NUL && i < (int)sizeof(buf) - 1; ++i)
-     {
-       if (s[i] == '_' || s[i] == '-')
-           buf[i] = '-';
-       else if (isalnum((int)s[i]))
-           buf[i] = TOLOWER_ASC(s[i]);
-@@ -3178,11 +3949,11 @@ encname2codepage(name)
- }
- #endif
- # if defined(USE_ICONV) || defined(PROTO)
+           if (c != TAB && vim_isprintc(c))
+           {
+-              endadd = char2cells(c) - 1;
++              endadd = (colnr_T)(char2cells(c) - 1);
+               if (coladd > endadd)    /* past end of line */
+                   endadd = 0;
+               else
+                   coladd = 0;
+           }
+--- vim72.orig/src/config.h.in
++++ vim72/src/config.h.in
+@@ -28,16 +28,22 @@
+ #undef HAVE_OUTFUNTYPE
  
--static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp));
-+static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp, int *resultlenp));
+ /* Define when __DATE__ " " __TIME__ can be used */
+ #undef HAVE_DATE_TIME
  
- /*
-  * Call iconv_open() with a check if iconv() works properly (there are broken
-  * versions).
-  * Returns (void *)-1 if failed.
-@@ -3239,17 +4010,19 @@ my_iconv_open(to, from)
- /*
-  * Convert the string "str[slen]" with iconv().
-  * If "unconvlenp" is not NULL handle the string ending in an incomplete
-  * sequence and set "*unconvlenp" to the length of it.
-  * Returns the converted string in allocated memory.  NULL for an error.
-+ * If resultlenp is not NULL, sets it to the result length in bytes.
-  */
-     static char_u *
--iconv_string(vcp, str, slen, unconvlenp)
-+iconv_string(vcp, str, slen, unconvlenp, resultlenp)
-     vimconv_T *vcp;
-     char_u    *str;
-     int               slen;
-     int               *unconvlenp;
-+    int               *resultlenp;
- {
-     const char        *from;
-     size_t    fromlen;
-     char      *to;
-     size_t    tolen;
-@@ -3331,10 +4104,13 @@ iconv_string(vcp, str, slen, unconvlenp)
-           break;
-       }
-       /* Not enough room or skipping illegal sequence. */
-       done = to - (char *)result;
-     }
++/* Define when __attribute__((unused)) can be used */
++#undef HAVE_ATTRIBUTE_UNUSED
 +
-+    if (resultlenp != NULL)
-+      *resultlenp = (int)(to - (char *)result);
-     return result;
- }
- #  if defined(DYNAMIC_ICONV) || defined(PROTO)
- /*
-@@ -3582,13 +4358,14 @@ im_show_info(void)
+ /* defined always when using configure */
+ #undef UNIX
  
- /*
-  * Callback invoked when the user finished preediting.
-  * Put the final string into the input buffer.
-  */
--/*ARGSUSED0*/
-     static void
--im_commit_cb(GtkIMContext *context, const gchar *str, gpointer data)
-+im_commit_cb(GtkIMContext *context UNUSED,
-+           const gchar *str,
-+           gpointer data UNUSED)
- {
-     int       slen = (int)STRLEN(str);
-     int       add_to_input = TRUE;
-     int       clen;
-     int       len = slen;
-@@ -3670,13 +4447,12 @@ im_commit_cb(GtkIMContext *context, cons
- }
+ /* Defined to the size of an int */
+ #undef SIZEOF_INT
  
++/* Define when wchar_t is only 2 bytes. */
++#undef SMALL_WCHAR_T
++
  /*
-  * Callback invoked after start to the preedit.
+  * If we cannot trust one of the following from the libraries, we use our
+  * own safe but probably slower vim_memmove().
   */
--/*ARGSUSED*/
-     static void
--im_preedit_start_cb(GtkIMContext *context, gpointer data)
-+im_preedit_start_cb(GtkIMContext *context UNUSED, gpointer data UNUSED)
- {
- #ifdef XIM_DEBUG
-     xim_log("im_preedit_start_cb()\n");
- #endif
-@@ -3687,13 +4463,12 @@ im_preedit_start_cb(GtkIMContext *contex
- }
+ #undef USEBCOPY
+@@ -48,10 +54,13 @@
+ #undef USEMAN_S
  
- /*
-  * Callback invoked after end to the preedit.
-  */
--/*ARGSUSED*/
-     static void
--im_preedit_end_cb(GtkIMContext *context, gpointer data)
-+im_preedit_end_cb(GtkIMContext *context UNUSED, gpointer data UNUSED)
- {
- #ifdef XIM_DEBUG
-     xim_log("im_preedit_end_cb()\n");
- #endif
-     im_delete_preedit();
-@@ -3748,13 +4523,12 @@ im_preedit_end_cb(GtkIMContext *context,
-  * at the receiving end of the queue.  This, however, would have a rather large
-  * impact on the code base.  If there is an easy way to force processing of all
-  * remaining input from within the "retrieve_surrounding" signal handler, this
-  * might not be necessary.  Gotta ask on vim-dev for opinions.
-  */
--/*ARGSUSED1*/
-     static void
--im_preedit_changed_cb(GtkIMContext *context, gpointer data)
-+im_preedit_changed_cb(GtkIMContext *context, gpointer data UNUSED)
- {
-     char    *preedit_string = NULL;
-     int           cursor_index    = 0;
-     int           num_move_back   = 0;
-     char_u  *str;
-@@ -4616,15 +5390,14 @@ xim_set_focus(focus)
- #endif
-       }
-     }
- }
+ /* Define to empty if the keyword does not work.  */
+ #undef const
  
--/*ARGSUSED*/
-     void
- im_set_position(row, col)
--    int               row;
--    int               col;
-+    int               row UNUSED;
-+    int               col UNUSED;
- {
-     xim_set_preedit();
- }
++/* Define to empty if the keyword does not work.  */
++#undef volatile
++
+ /* Define to `int' if <sys/types.h> doesn't define.  */
+ #undef mode_t
  
- /*
-@@ -4927,16 +5700,15 @@ static int xim_real_init __ARGS((Window
+ /* Define to `long' if <sys/types.h> doesn't define.  */
+ #undef off_t
+@@ -133,11 +142,10 @@
+ #undef HAVE_BCMP
+ #undef HAVE_FCHDIR
+ #undef HAVE_FCHOWN
+ #undef HAVE_FSEEKO
+ #undef HAVE_FSYNC
+-#undef HAVE_FTELLO
+ #undef HAVE_GETCWD
+ #undef HAVE_GETPSEUDOTTY
+ #undef HAVE_GETPWNAM
+ #undef HAVE_GETPWUID
+ #undef HAVE_GETRLIMIT
+@@ -146,10 +154,11 @@
+ #undef HAVE_ICONV
+ #undef HAVE_NL_LANGINFO_CODESET
+ #undef HAVE_LSTAT
+ #undef HAVE_MEMCMP
+ #undef HAVE_MEMSET
++#undef HAVE_MKDTEMP
+ #undef HAVE_NANOSLEEP
+ #undef HAVE_OPENDIR
+ #undef HAVE_FLOAT_FUNCS
+ #undef HAVE_PUTENV
+ #undef HAVE_QSORT
+@@ -376,5 +385,8 @@
+ /* Define name of who modified a released Vim */
+ #undef MODIFIED_BY
  
- #ifdef USE_X11R6_XIM
- static void xim_instantiate_cb __ARGS((Display *display, XPointer client_data, XPointer       call_data));
- static void xim_destroy_cb __ARGS((XIM im, XPointer client_data, XPointer call_data));
+ /* Define if you want XSMP interaction as well as vanilla swapfile safety */
+ #undef USE_XSMP_INTERACT
++
++/* Define if fcntl()'s F_SETFD command knows about FD_CLOEXEC */
++#undef HAVE_FD_CLOEXEC
+--- vim72.orig/src/config.mk.in
++++ vim72/src/config.mk.in
+@@ -39,10 +39,12 @@ X_LIBS             = @X_LIB@
+ MZSCHEME_LIBS = @MZSCHEME_LIBS@
+ MZSCHEME_SRC  = @MZSCHEME_SRC@
+ MZSCHEME_OBJ  = @MZSCHEME_OBJ@
+ MZSCHEME_CFLAGS       = @MZSCHEME_CFLAGS@
+ MZSCHEME_PRO  = @MZSCHEME_PRO@
++MZSCHEME_EXTRA  = @MZSCHEME_EXTRA@
++MZSCHEME_MZC  = @MZSCHEME_MZC@
  
--/*ARGSUSED*/
-     static void
- xim_instantiate_cb(display, client_data, call_data)
-     Display   *display;
--    XPointer  client_data;
--    XPointer  call_data;
-+    XPointer  client_data UNUSED;
-+    XPointer  call_data UNUSED;
- {
-     Window    x11_window;
-     Display   *x11_display;
+ PERL          = @vi_cv_path_perl@
+ PERLLIB               = @vi_cv_perllib@
+ PERL_LIBS     = @PERL_LIBS@
+ SHRPENV               = @shrpenv@
+--- vim72.orig/src/configure.in
++++ vim72/src/configure.in
+@@ -114,10 +114,26 @@ if test "`(uname) 2>/dev/null`" = Darwin
+   AC_MSG_CHECKING(--with-mac-arch argument)
+   AC_ARG_WITH(mac-arch, [  --with-mac-arch=ARCH    current, intel, ppc or both],
+       MACARCH="$withval"; AC_MSG_RESULT($MACARCH),
+       MACARCH="current"; AC_MSG_RESULT(defaulting to $MACARCH))
  
- #ifdef XIM_DEBUG
-@@ -4952,16 +5724,15 @@ xim_instantiate_cb(display, client_data,
-     if (xic != NULL)
-       XUnregisterIMInstantiateCallback(x11_display, NULL, NULL, NULL,
-                                        xim_instantiate_cb, NULL);
- }
++  AC_MSG_CHECKING(--with-developer-dir argument)
++  AC_ARG_WITH(developer-dir, [  --with-developer-dir=PATH    use PATH as location for Xcode developer tools],
++      DEVELOPER_DIR="$withval"; AC_MSG_RESULT($DEVELOPER_DIR),
++        DEVELOPER_DIR=""; AC_MSG_RESULT(not present))
++
++  if test "x$DEVELOPER_DIR" = "x"; then
++    AC_PATH_PROG(XCODE_SELECT, xcode-select)
++    if test "x$XCODE_SELECT" != "x"; then
++      AC_MSG_CHECKING(for developer dir using xcode-select)
++      DEVELOPER_DIR=`$XCODE_SELECT -print-path`
++      AC_MSG_RESULT([$DEVELOPER_DIR])
++    else
++      DEVELOPER_DIR=/Developer
++    fi
++  fi
++
+   if test "x$MACARCH" = "xboth"; then
+     AC_MSG_CHECKING(for 10.4 universal SDK)
+     dnl There is a terrible inconsistency (but we appear to get away with it):
+     dnl $CFLAGS uses the 10.4u SDK library for the headers, while $CPPFLAGS
+     dnl doesn't, because "gcc -E" doesn't grok it.  That means the configure
+@@ -125,11 +141,11 @@ if test "`(uname) 2>/dev/null`" = Darwin
+     dnl files. $LDFLAGS is set at the end, because configure uses it together
+     dnl with $CFLAGS and we can only have one -sysroot argument.
+     save_cppflags="$CPPFLAGS"
+     save_cflags="$CFLAGS"
+     save_ldflags="$LDFLAGS"
+-    CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
++    CFLAGS="$CFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
+     AC_TRY_LINK([ ], [ ],
+       AC_MSG_RESULT(found, will make universal binary),
  
--/*ARGSUSED*/
-     static void
- xim_destroy_cb(im, client_data, call_data)
--    XIM               im;
--    XPointer  client_data;
--    XPointer  call_data;
-+    XIM               im UNUSED;
-+    XPointer  client_data UNUSED;
-+    XPointer  call_data UNUSED;
- {
-     Window    x11_window;
-     Display   *x11_display;
+       AC_MSG_RESULT(not found)
+       CFLAGS="$save_cflags"
+@@ -155,13 +171,13 @@ if test "`(uname) 2>/dev/null`" = Darwin
+     OS_EXTRA_SRC="os_macosx.c os_mac_conv.c";
+     OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
+     dnl TODO: use -arch i386 on Intel machines
+     CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
+     if test "x$MACARCH" = "xboth"; then
+-      CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
++      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
+     else
+-      CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon"
++      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
+     fi
  
- #ifdef XIM_DEBUG
-@@ -5276,13 +6047,14 @@ xim_decide_input_style()
-           supported_style &= ~(int)GDK_IM_STATUS_AREA;
-       xim_input_style = (int)gdk_im_decide_style((GdkIMStyle)supported_style);
-     }
- }
+     dnl If Carbon is found, assume we don't want X11
+     dnl unless it was specifically asked for (--with-x)
+     dnl or Motif, Athena or GTK GUI is used.
+@@ -412,11 +428,11 @@ if test "$enable_mzschemeinterp" = "yes"
+     AC_MSG_CHECKING(PLTHOME environment var)
+     if test "X$PLTHOME" != "X"; then
+       AC_MSG_RESULT("$PLTHOME")
+       vi_cv_path_mzscheme_pfx="$PLTHOME"
+     else
+-      AC_MSG_RESULT("not set")
++      AC_MSG_RESULT(not set)
+       dnl -- try to find MzScheme executable
+       AC_PATH_PROG(vi_cv_path_mzscheme, mzscheme)
  
--/*ARGSUSED*/
-     static void
--preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data)
-+preedit_start_cbproc(XIC thexic UNUSED,
-+                   XPointer client_data UNUSED,
-+                   XPointer call_data UNUSED)
- {
- #ifdef XIM_DEBUG
-     xim_log("xim_decide_input_style()\n");
- #endif
+       dnl resolve symbolic link, the executable is often elsewhere and there
+       dnl are no links for the include files.
+@@ -428,60 +444,85 @@ if test "$enable_mzschemeinterp" = "yes"
+       fi
  
-@@ -5310,13 +6082,14 @@ xim_back_delete(int n)
- }
+       if test "X$vi_cv_path_mzscheme" != "X"; then
+           dnl -- find where MzScheme thinks it was installed
+           AC_CACHE_CHECK(MzScheme install prefix,vi_cv_path_mzscheme_pfx,
+-          [ vi_cv_path_mzscheme_pfx=`
+-          ${vi_cv_path_mzscheme} -evm \
+-          "(display (simplify-path            \
++          dnl different versions of MzScheme differ in command line processing
++          dnl use universal approach
++          echo "(display (simplify-path               \
+              (build-path (call-with-values    \
+               (lambda () (split-path (find-system-path (quote exec-file)))) \
+-              (lambda (base name must-be-dir?) base)) (quote up))))"` ])
+-          dnl Remove a trailing slash.
+-          vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
++              (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
++          dnl Remove a trailing slash
++          [ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
++              sed -e 's+/$++'` ])
++          rm -f mzdirs.scm
+       fi
+     fi
+   fi
  
- static GSList *key_press_event_queue = NULL;
- static gboolean processing_queued_event = FALSE;
+   SCHEME_INC=
+   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+     AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include)
+     if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
+-      AC_MSG_RESULT("yes")
++      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
++      AC_MSG_RESULT(yes)
+     else
+-      AC_MSG_RESULT("no")
+-      AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include)
++      AC_MSG_RESULT(no)
++      AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt)
+       if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
+-      AC_MSG_RESULT("yes")
+-      SCHEME_INC=/plt
++      AC_MSG_RESULT(yes)
++      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
+       else
+-      AC_MSG_RESULT("no")
+-      vi_cv_path_mzscheme_pfx=
++      AC_MSG_RESULT(no)
++      AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/)
++      if test -f /usr/include/plt/scheme.h; then
++        AC_MSG_RESULT(yes)
++        SCHEME_INC=/usr/include/plt
++      else
++        AC_MSG_RESULT(no)
++        vi_cv_path_mzscheme_pfx=
++      fi
+       fi
+     fi
+   fi
  
--/*ARGSUSED*/
-     static void
--preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data)
-+preedit_draw_cbproc(XIC thexic UNUSED,
-+                  XPointer client_data UNUSED,
-+                  XPointer call_data)
- {
-     XIMPreeditDrawCallbackStruct *draw_data;
-     XIMText   *text;
-     char      *src;
-     GSList    *event_queue;
-@@ -5384,11 +6157,11 @@ preedit_draw_cbproc(XIC xic, XPointer cl
-               {
-                   if (draw_feedback == NULL)
-                       draw_feedback = (char *)alloc(draw_data->chg_first
-                                                             + text->length);
-                   else
--                      draw_feedback = realloc(draw_feedback,
-+                      draw_feedback = vim_realloc(draw_feedback,
-                                        draw_data->chg_first + text->length);
-                   if (draw_feedback != NULL)
-                   {
-                       draw_feedback[nfeedback + draw_data->chg_first]
-                                      = draw_data->text->feedback[nfeedback];
-@@ -5451,22 +6224,24 @@ im_get_feedback_attr(int col)
-     }
+   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
+     if test "x$MACOSX" = "xyes"; then
+       MZSCHEME_LIBS="-framework PLT_MzScheme"
++    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
++      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
++      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+     elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
+       MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
+     else
+-      MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
++      dnl Using shared objects
++      if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
++        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
++      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
++      else
++        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
++      fi
+       if test "$GCC" = yes; then
+       dnl Make Vim remember the path to the library.  For when it's not in
+       dnl $LD_LIBRARY_PATH.
+-      MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
++      MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+       elif test "`(uname) 2>/dev/null`" = SunOS &&
+                              uname -r | grep '^5' >/dev/null; then
+-      MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
++      MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
+       fi
+     fi
+     if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
+       SCHEME_COLLECTS=lib/plt/
+     fi
+-    MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC}   \
++    if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
++      dnl need to generate bytecode for MzScheme base
++      MZSCHEME_EXTRA="mzscheme_base.c"
++      MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
++      MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
++    fi
++    MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
+       -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
+     MZSCHEME_SRC="if_mzsch.c"
+     MZSCHEME_OBJ="objects/if_mzsch.o"
+     MZSCHEME_PRO="if_mzsch.pro"
+     AC_DEFINE(FEAT_MZSCHEME)
+@@ -489,10 +530,12 @@ if test "$enable_mzschemeinterp" = "yes"
+   AC_SUBST(MZSCHEME_SRC)
+   AC_SUBST(MZSCHEME_OBJ)
+   AC_SUBST(MZSCHEME_PRO)
+   AC_SUBST(MZSCHEME_LIBS)
+   AC_SUBST(MZSCHEME_CFLAGS)
++  AC_SUBST(MZSCHEME_EXTRA)
++  AC_SUBST(MZSCHEME_MZC)
+ fi
  
-     return -1;
- }
  
--/*ARGSUSED*/
-     static void
--preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data)
-+preedit_caret_cbproc(XIC thexic UNUSED,
-+                   XPointer client_data UNUSED,
-+                   XPointer call_data UNUSED)
- {
- #ifdef XIM_DEBUG
-     xim_log("preedit_caret_cbproc()\n");
- #endif
- }
+ AC_MSG_CHECKING(--enable-perlinterp argument)
+ AC_ARG_ENABLE(perlinterp,
+@@ -657,11 +700,11 @@ if test "$enable_pythoninterp" = "yes";
  
--/*ARGSUSED*/
-     static void
--preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data)
-+preedit_done_cbproc(XIC thexic UNUSED,
-+                  XPointer client_data UNUSED,
-+                  XPointer call_data UNUSED)
- {
- #ifdef XIM_DEBUG
-     xim_log("preedit_done_cbproc()\n");
- #endif
+       AC_CACHE_CHECK(Python's configuration directory,vi_cv_path_python_conf,
+       [
+       vi_cv_path_python_conf=
+       for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do
+-        for subdir in lib share; do
++        for subdir in lib64 lib share; do
+           d="${path}/${subdir}/python${vi_cv_var_python_version}/config"
+           if test -d "$d" && test -f "$d/config.c"; then
+             vi_cv_path_python_conf="$d"
+           fi
+         done
+@@ -920,21 +963,31 @@ AC_MSG_CHECKING(--enable-rubyinterp argu
+ AC_ARG_ENABLE(rubyinterp,
+       [  --enable-rubyinterp     Include Ruby interpreter.], ,
+       [enable_rubyinterp="no"])
+ AC_MSG_RESULT($enable_rubyinterp)
+ if test "$enable_rubyinterp" = "yes"; then
++  AC_MSG_CHECKING(--with-ruby-command argument)
++  AC_ARG_WITH(ruby-command, [  --with-ruby-command=RUBY  name of the Ruby command (default: ruby)],
++      RUBY_CMD="$withval"; AC_MSG_RESULT($RUBY_CMD),
++      RUBY_CMD="ruby"; AC_MSG_RESULT(defaulting to $RUBY_CMD))
+   AC_SUBST(vi_cv_path_ruby)
+-  AC_PATH_PROG(vi_cv_path_ruby, ruby)
++  AC_PATH_PROG(vi_cv_path_ruby, $RUBY_CMD)
+   if test "X$vi_cv_path_ruby" != "X"; then
+     AC_MSG_CHECKING(Ruby version)
+     if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
+       AC_MSG_RESULT(OK)
+       AC_MSG_CHECKING(Ruby header files)
+-      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
++      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["rubyhdrdir"]] || Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
+       if test "X$rubyhdrdir" != "X"; then
+       AC_MSG_RESULT($rubyhdrdir)
+       RUBY_CFLAGS="-I$rubyhdrdir"
++        rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["arch"]]'`
++        if test -d "$rubyhdrdir/$rubyarch"; then
++          RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
++        fi
++        rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["ruby_version"]].gsub(/\./, "")[[0,2]]'`
++        RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
+       rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LIBS"]]'`
+       if test "X$rubylibs" != "X"; then
+         RUBY_LIBS="$rubylibs"
+       fi
+       librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG[["LIBRUBYARG"]])'`
+@@ -955,18 +1008,24 @@ if test "$enable_rubyinterp" = "yes"; th
+       if test "X$librubyarg" != "X"; then
+         RUBY_LIBS="$librubyarg $RUBY_LIBS"
+       fi
+       rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LDFLAGS"]]'`
+       if test "X$rubyldflags" != "X"; then
+-        LDFLAGS="$rubyldflags $LDFLAGS"
++        dnl Ruby on Mac OS X 10.5 adds "-arch" flags but these should only
++        dnl be included if requested by passing --with-mac-arch to
++        dnl configure, so strip these flags first (if present)
++        rubyldflags=`echo "$rubyldflags" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//'`
++        if test "X$rubyldflags" != "X"; then
++          LDFLAGS="$rubyldflags $LDFLAGS"
++        fi
+       fi
+       RUBY_SRC="if_ruby.c"
+       RUBY_OBJ="objects/if_ruby.o"
+       RUBY_PRO="if_ruby.pro"
+       AC_DEFINE(FEAT_RUBY)
+       else
+-      AC_MSG_RESULT(not found, disabling Ruby)
++      AC_MSG_RESULT(not found; disabling Ruby)
+       fi
+     else
+       AC_MSG_RESULT(too old; need Ruby version 1.6.0 or later)
+     fi
+   fi
+@@ -1191,10 +1250,32 @@ else
+     )
+     CFLAGS=$cflags_save
  
-@@ -5501,13 +6276,12 @@ xim_reset(void)
-       if (text != NULL)
-           XFree(text);
-     }
- }
+     LDFLAGS="$ac_save_LDFLAGS"
  
--/*ARGSUSED*/
-     int
--xim_queue_key_press_event(GdkEventKey *event, int down)
-+xim_queue_key_press_event(GdkEventKey *event, int down UNUSED)
- {
- #ifdef XIM_DEBUG
-     xim_log("xim_queue_key_press_event()\n");
- #endif
++    AC_MSG_CHECKING(size of wchar_t is 2 bytes)
++    AC_CACHE_VAL(ac_cv_small_wchar_t,
++      [AC_TRY_RUN([
++#include <X11/Xlib.h>
++#if STDC_HEADERS
++# include <stdlib.h>
++# include <stddef.h>
++#endif
++              main()
++              {
++                if (sizeof(wchar_t) <= 2)
++                  exit(1);
++                exit(0);
++              }],
++              ac_cv_small_wchar_t="no",
++              ac_cv_small_wchar_t="yes",
++              AC_MSG_ERROR(failed to compile test program))])
++    AC_MSG_RESULT($ac_cv_small_wchar_t)
++    if test "x$ac_cv_small_wchar_t" = "xyes" ; then
++      AC_DEFINE(SMALL_WCHAR_T)
++    fi
++
+   fi
+ fi
  
-@@ -5519,13 +6293,12 @@ xim_queue_key_press_event(GdkEventKey *e
-     key_press_event_queue = g_slist_append(key_press_event_queue,
-                                          gdk_event_copy((GdkEvent *)event));
-     return TRUE;
- }
+ test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no
  
--/*ARGSUSED*/
-     static void
--preedit_callback_setup(GdkIC *ic)
-+preedit_callback_setup(GdkIC *ic UNUSED)
- {
-     XIC xxic;
-     XVaNestedList preedit_attr;
-     XIMCallback preedit_start_cb;
-     XIMCallback preedit_draw_cb;
-@@ -5546,13 +6319,12 @@ preedit_callback_setup(GdkIC *ic)
-                              NULL);
-     XSetICValues(xxic, XNPreeditAttributes, preedit_attr, NULL);
-     XFree(preedit_attr);
- }
+@@ -2065,10 +2146,15 @@ fi
+ AC_MSG_CHECKING(whether __DATE__ and __TIME__ work)
+ AC_TRY_COMPILE([#include <stdio.h>], [printf("(" __DATE__ " " __TIME__ ")");],
+       AC_MSG_RESULT(yes); AC_DEFINE(HAVE_DATE_TIME),
+       AC_MSG_RESULT(no))
  
--/*ARGSUSED*/
-     static void
--reset_state_setup(GdkIC *ic)
-+reset_state_setup(GdkIC *ic UNUSED)
- {
- #ifdef USE_X11R6_XIM
-     /* don't change the input context when we call reset */
-     XSetICValues(((GdkICPrivate *)ic)->xic, XNResetState, XIMPreserveState,
-                                                                       NULL);
-@@ -5754,12 +6526,29 @@ im_is_preediting()
- convert_setup(vcp, from, to)
-     vimconv_T *vcp;
-     char_u    *from;
-     char_u    *to;
- {
-+    return convert_setup_ext(vcp, from, TRUE, to, TRUE);
-+}
++AC_MSG_CHECKING(whether __attribute__((unused)) is allowed)
++AC_TRY_COMPILE([#include <stdio.h>], [int x __attribute__((unused));],
++      AC_MSG_RESULT(yes); AC_DEFINE(HAVE_ATTRIBUTE_UNUSED),
++      AC_MSG_RESULT(no))
 +
-+/*
-+ * As convert_setup(), but only when from_unicode_is_utf8 is TRUE will all
-+ * "from" unicode charsets be considered utf-8.  Same for "to".
-+ */
-+    int
-+convert_setup_ext(vcp, from, from_unicode_is_utf8, to, to_unicode_is_utf8)
-+    vimconv_T *vcp;
-+    char_u    *from;
-+    int               from_unicode_is_utf8;
-+    char_u    *to;
-+    int               to_unicode_is_utf8;
-+{
-     int               from_prop;
-     int               to_prop;
-+    int               from_is_utf8;
-+    int               to_is_utf8;
+ dnl Checks for header files.
+ AC_CHECK_HEADER(elf.h, HAS_ELF=1)
+ dnl AC_CHECK_HEADER(dwarf.h, SVR4=1)
+ if test "$HAS_ELF" = 1; then
+   AC_CHECK_LIB(elf, main)
+@@ -2093,18 +2179,24 @@ AC_CHECK_HEADERS(stdarg.h stdlib.h strin
+       iconv.h langinfo.h math.h unistd.h stropts.h errno.h \
+       sys/resource.h sys/systeminfo.h locale.h \
+       sys/stream.h termios.h libc.h sys/statfs.h \
+       poll.h sys/poll.h pwd.h utime.h sys/param.h libintl.h \
+       libgen.h util/debug.h util/msg18n.h frame.h \
+-      sys/acl.h sys/access.h sys/sysctl.h sys/sysinfo.h wchar.h wctype.h)
++      sys/acl.h sys/access.h sys/sysinfo.h wchar.h wctype.h)
  
-     /* Reset to no conversion. */
- # ifdef USE_ICONV
-     if (vcp->vc_type == CONV_ICONV && vcp->vc_fd != (iconv_t)-1)
-       iconv_close(vcp->vc_fd);
-@@ -5773,69 +6562,78 @@ convert_setup(vcp, from, to)
-                                                    || STRCMP(from, to) == 0)
-       return OK;
+ dnl sys/ptem.h depends on sys/stream.h on Solaris
+ AC_CHECK_HEADERS(sys/ptem.h, [], [],
+ [#if defined HAVE_SYS_STREAM_H
+ #  include <sys/stream.h>
+ #endif])
  
-     from_prop = enc_canon_props(from);
-     to_prop = enc_canon_props(to);
--    if ((from_prop & ENC_LATIN1) && (to_prop & ENC_UNICODE))
-+    if (from_unicode_is_utf8)
-+      from_is_utf8 = from_prop & ENC_UNICODE;
-+    else
-+      from_is_utf8 = from_prop == ENC_UNICODE;
-+    if (to_unicode_is_utf8)
-+      to_is_utf8 = to_prop & ENC_UNICODE;
-+    else
-+      to_is_utf8 = to_prop == ENC_UNICODE;
-+
-+    if ((from_prop & ENC_LATIN1) && to_is_utf8)
-     {
-       /* Internal latin1 -> utf-8 conversion. */
-       vcp->vc_type = CONV_TO_UTF8;
-       vcp->vc_factor = 2;     /* up to twice as long */
-     }
--    else if ((from_prop & ENC_LATIN9) && (to_prop & ENC_UNICODE))
-+    else if ((from_prop & ENC_LATIN9) && to_is_utf8)
-     {
-       /* Internal latin9 -> utf-8 conversion. */
-       vcp->vc_type = CONV_9_TO_UTF8;
-       vcp->vc_factor = 3;     /* up to three as long (euro sign) */
-     }
--    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN1))
-+    else if (from_is_utf8 && (to_prop & ENC_LATIN1))
-     {
-       /* Internal utf-8 -> latin1 conversion. */
-       vcp->vc_type = CONV_TO_LATIN1;
-     }
--    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN9))
-+    else if (from_is_utf8 && (to_prop & ENC_LATIN9))
-     {
-       /* Internal utf-8 -> latin9 conversion. */
-       vcp->vc_type = CONV_TO_LATIN9;
-     }
- #ifdef WIN3264
-     /* Win32-specific codepage <-> codepage conversion without iconv. */
--    else if (((from_prop & ENC_UNICODE) || encname2codepage(from) > 0)
--          && ((to_prop & ENC_UNICODE) || encname2codepage(to) > 0))
-+    else if ((from_is_utf8 || encname2codepage(from) > 0)
-+          && (to_is_utf8 || encname2codepage(to) > 0))
-     {
-       vcp->vc_type = CONV_CODEPAGE;
-       vcp->vc_factor = 2;     /* up to twice as long */
--      vcp->vc_cpfrom = (from_prop & ENC_UNICODE) ? 0 : encname2codepage(from);
--      vcp->vc_cpto = (to_prop & ENC_UNICODE) ? 0 : encname2codepage(to);
-+      vcp->vc_cpfrom = from_is_utf8 ? 0 : encname2codepage(from);
-+      vcp->vc_cpto = to_is_utf8 ? 0 : encname2codepage(to);
-     }
- #endif
- #ifdef MACOS_X
-     else if ((from_prop & ENC_MACROMAN) && (to_prop & ENC_LATIN1))
-     {
-       vcp->vc_type = CONV_MAC_LATIN1;
-     }
--    else if ((from_prop & ENC_MACROMAN) && (to_prop & ENC_UNICODE))
-+    else if ((from_prop & ENC_MACROMAN) && to_is_utf8)
-     {
-       vcp->vc_type = CONV_MAC_UTF8;
-       vcp->vc_factor = 2;     /* up to twice as long */
-     }
-     else if ((from_prop & ENC_LATIN1) && (to_prop & ENC_MACROMAN))
-     {
-       vcp->vc_type = CONV_LATIN1_MAC;
-     }
--    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_MACROMAN))
-+    else if (from_is_utf8 && (to_prop & ENC_MACROMAN))
-     {
-       vcp->vc_type = CONV_UTF8_MAC;
-     }
- #endif
- # ifdef USE_ICONV
-     else
-     {
-       /* Use iconv() for conversion. */
-       vcp->vc_fd = (iconv_t)my_iconv_open(
--              (to_prop & ENC_UNICODE) ? (char_u *)"utf-8" : to,
--              (from_prop & ENC_UNICODE) ? (char_u *)"utf-8" : from);
-+              to_is_utf8 ? (char_u *)"utf-8" : to,
-+              from_is_utf8 ? (char_u *)"utf-8" : from);
-       if (vcp->vc_fd != (iconv_t)-1)
-       {
-           vcp->vc_type = CONV_ICONV;
-           vcp->vc_factor = 4; /* could be longer too... */
-       }
-@@ -6003,16 +6801,24 @@ string_convert_ext(vcp, ptr, lenp, uncon
-           if (retval == NULL)
-               break;
-           d = retval;
-           for (i = 0; i < len; ++i)
-           {
--              l = utf_ptr2len(ptr + i);
-+              l = utf_ptr2len_len(ptr + i, len - i);
-               if (l == 0)
-                   *d++ = NUL;
-               else if (l == 1)
-               {
--                  if (unconvlenp != NULL && utf8len_tab[ptr[i]] > len - i)
-+                  int l_w = utf8len_tab_zero[ptr[i]];
++dnl sys/sysctl.h depends on sys/param.h on OpenBSD
++AC_CHECK_HEADERS(sys/sysctl.h, [], [],
++[#if defined HAVE_SYS_PARAM_H
++#  include <sys/param.h>
++#endif])
 +
-+                  if (l_w == 0)
-+                  {
-+                      /* Illegal utf-8 byte cannot be converted */
-+                      vim_free(retval);
-+                      return NULL;
-+                  }
-+                  if (unconvlenp != NULL && l_w > len - i)
-                   {
-                       /* Incomplete sequence at the end. */
-                       *unconvlenp = len - i;
-                       break;
-                   }
-@@ -6087,13 +6893,11 @@ string_convert_ext(vcp, ptr, lenp, uncon
-           break;
- # endif
  
- # ifdef USE_ICONV
-       case CONV_ICONV:        /* conversion with output_conv.vc_fd */
--          retval = iconv_string(vcp, ptr, len, unconvlenp);
--          if (retval != NULL && lenp != NULL)
--              *lenp = (int)STRLEN(retval);
-+          retval = iconv_string(vcp, ptr, len, unconvlenp, lenp);
-           break;
- # endif
- # ifdef WIN3264
-       case CONV_CODEPAGE:             /* codepage -> codepage */
-       {
-@@ -6101,33 +6905,33 @@ string_convert_ext(vcp, ptr, lenp, uncon
-           int         tmp_len;
-           short_u     *tmp;
+ dnl pthread_np.h may exist but can only be used after including pthread.h
+ AC_MSG_CHECKING([for pthread_np.h])
+ AC_TRY_COMPILE([
+ #include <pthread.h>
+@@ -2146,10 +2238,11 @@ CPPFLAGS=$cppflags_save
+ fi
  
-           /* 1. codepage/UTF-8  ->  ucs-2. */
-           if (vcp->vc_cpfrom == 0)
--              tmp_len = utf8_to_ucs2(ptr, len, NULL, NULL);
-+              tmp_len = utf8_to_utf16(ptr, len, NULL, NULL);
-           else
-               tmp_len = MultiByteToWideChar(vcp->vc_cpfrom, 0,
-                                                             ptr, len, 0, 0);
-           tmp = (short_u *)alloc(sizeof(short_u) * tmp_len);
-           if (tmp == NULL)
-               break;
-           if (vcp->vc_cpfrom == 0)
--              utf8_to_ucs2(ptr, len, tmp, unconvlenp);
-+              utf8_to_utf16(ptr, len, tmp, unconvlenp);
-           else
-               MultiByteToWideChar(vcp->vc_cpfrom, 0, ptr, len, tmp, tmp_len);
+ dnl Checks for typedefs, structures, and compiler characteristics.
+ AC_PROG_GCC_TRADITIONAL
+ AC_C_CONST
++AC_C_VOLATILE
+ AC_TYPE_MODE_T
+ AC_TYPE_OFF_T
+ AC_TYPE_PID_T
+ AC_TYPE_SIZE_T
+ AC_TYPE_UID_T
+@@ -2488,15 +2581,15 @@ main()
+         vim_cv_tty_mode=0620
+       fi
+       AC_MSG_RESULT([pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group])
+       else
+       vim_cv_tty_group=world
+-      AC_MSG_RESULT([ptys are world accessable])
++      AC_MSG_RESULT([ptys are world accessible])
+       fi
+     ],[
+       vim_cv_tty_group=world
+-      AC_MSG_RESULT([can't determine - assume ptys are world accessable])
++      AC_MSG_RESULT([can't determine - assume ptys are world accessible])
+     ],[
+       AC_MSG_ERROR(cross-compiling: please set 'vim_cv_tty_group' and 'vim_cv_tty_mode')
+     ])
+   ])
+ rm -f conftest_grp
+@@ -2563,18 +2656,20 @@ main()
  
-           /* 2. ucs-2  ->  codepage/UTF-8. */
-           if (vcp->vc_cpto == 0)
--              retlen = ucs2_to_utf8(tmp, tmp_len, NULL);
-+              retlen = utf16_to_utf8(tmp, tmp_len, NULL);
-           else
-               retlen = WideCharToMultiByte(vcp->vc_cpto, 0,
-                                                   tmp, tmp_len, 0, 0, 0, 0);
-           retval = alloc(retlen + 1);
-           if (retval != NULL)
-           {
-               if (vcp->vc_cpto == 0)
--                  ucs2_to_utf8(tmp, tmp_len, retval);
-+                  utf16_to_utf8(tmp, tmp_len, retval);
-               else
-                   WideCharToMultiByte(vcp->vc_cpto, 0,
-                                         tmp, tmp_len, retval, retlen, 0, 0);
-               retval[retlen] = NUL;
-               if (lenp != NULL)
---- vim72.orig/src/misc2.c
-+++ vim72/src/misc2.c
-@@ -154,11 +154,11 @@ coladvance2(pos, addspaces, finetune, wc
- #endif
- #ifdef FEAT_VIRTUALEDIT
-                   || ((ve_flags & VE_ONEMORE) && wcol < MAXCOL)
- #endif
-                   ;
--    line = ml_get_curline();
-+    line = ml_get_buf(curbuf, pos->lnum, FALSE);
+ if test "x$vim_cv_getcwd_broken" = "xyes" ; then
+   AC_DEFINE(BAD_GETCWD)
+ fi
  
-     if (wcol >= MAXCOL)
-     {
-           idx = (int)STRLEN(line) - 1 + one_more;
-           col = wcol;
-@@ -330,13 +330,13 @@ coladvance2(pos, addspaces, finetune, wc
-       }
-     }
- #endif
+-dnl Check for functions in one big call, to reduce the size of configure
+-AC_CHECK_FUNCS(bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \
++dnl Check for functions in one big call, to reduce the size of configure.
++dnl Can only be used for functions that do not require any include.
++AC_CHECK_FUNCS(bcmp fchdir fchown fsync getcwd getpseudotty \
+       getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \
+-      memset nanosleep opendir putenv qsort readlink select setenv \
++      memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
+       setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
+       sigvec strcasecmp strerror strftime stricmp strncasecmp \
+       strnicmp strpbrk strtol tgetent towlower towupper iswupper \
+       usleep utime utimes)
++AC_FUNC_FSEEKO
  
- #ifdef FEAT_MBYTE
--    /* prevent cursor from moving on the trail byte */
-+    /* prevent from moving onto a trail byte */
-     if (has_mbyte)
--      mb_adjust_cursor();
-+      mb_adjustpos(pos);
- #endif
+ dnl fstatfs() can take 2 to 4 arguments, try to use st_blksize if possible
+ AC_MSG_CHECKING(for st_blksize)
+ AC_TRY_COMPILE(
+ [#include <sys/types.h>
+@@ -2786,10 +2881,20 @@ if test "$enable_sysmouse" = "yes"; then
+   fi
+ else
+   AC_MSG_RESULT(yes)
+ fi
  
-     if (col < wcol)
-       return FAIL;
-     return OK;
-@@ -494,11 +494,12 @@ check_cursor_lnum()
-     void
- check_cursor_col()
- {
-     colnr_T len;
- #ifdef FEAT_VIRTUALEDIT
--    colnr_T oldcol = curwin->w_cursor.col + curwin->w_cursor.coladd;
-+    colnr_T oldcol = curwin->w_cursor.col;
-+    colnr_T oldcoladd = curwin->w_cursor.col + curwin->w_cursor.coladd;
- #endif
++dnl make sure the FD_CLOEXEC flag for fcntl()'s F_SETFD command is known
++AC_MSG_CHECKING(for FD_CLOEXEC)
++AC_TRY_COMPILE(
++[#if HAVE_FCNTL_H
++# include <fcntl.h>
++#endif],
++[     int flag = FD_CLOEXEC;],
++      AC_MSG_RESULT(yes); AC_DEFINE(HAVE_FD_CLOEXEC),
++      AC_MSG_RESULT(not usable))
++
+ dnl rename needs to be checked separately to work on Nextstep with cc
+ AC_MSG_CHECKING(for rename)
+ AC_TRY_LINK([#include <stdio.h>], [rename("this", "that")],
+       AC_MSG_RESULT(yes); AC_DEFINE(HAVE_RENAME),
+       AC_MSG_RESULT(no))
+@@ -2867,11 +2972,10 @@ main()
+           ac_cv_sizeof_int=0,
+           AC_MSG_ERROR(failed to compile test program))])
+ AC_MSG_RESULT($ac_cv_sizeof_int)
+ AC_DEFINE_UNQUOTED(SIZEOF_INT, $ac_cv_sizeof_int)
  
-     len = (colnr_T)STRLEN(ml_get_curline());
-     if (len == 0)
-       curwin->w_cursor.col = 0;
-@@ -525,19 +526,27 @@ check_cursor_col()
-           if (has_mbyte)
-               mb_adjust_cursor();
- #endif
-       }
-     }
-+    else if (curwin->w_cursor.col < 0)
-+      curwin->w_cursor.col = 0;
+-
+ dnl Check for memmove() before bcopy(), makes memmove() be used when both are
+ dnl present, fixes problem with incompatibility between Solaris 2.4 and 2.5.
  
- #ifdef FEAT_VIRTUALEDIT
-     /* If virtual editing is on, we can leave the cursor on the old position,
-      * only we must set it to virtual.  But don't do it when at the end of the
-      * line. */
-     if (oldcol == MAXCOL)
-       curwin->w_cursor.coladd = 0;
-     else if (ve_flags == VE_ALL)
--      curwin->w_cursor.coladd = oldcol - curwin->w_cursor.col;
-+    {
-+      if (oldcoladd > curwin->w_cursor.col)
-+          curwin->w_cursor.coladd = oldcoladd - curwin->w_cursor.col;
-+      else
-+          /* avoid weird number when there is a miscalculation or overflow */
-+          curwin->w_cursor.coladd = 0;
-+    }
- #endif
- }
- /*
-  * make sure curwin->w_cursor in on a valid character
-@@ -871,11 +880,11 @@ lalloc(size, message)
-           allocated = 0;
- # endif
-           /* 3. check for available memory: call mch_avail_mem() */
-           if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing)
-           {
--              vim_free((char *)p);    /* System is low... no go! */
-+              free((char *)p);        /* System is low... no go! */
-               p = NULL;
-           }
-           else
-               goto theend;
- #endif
-@@ -996,22 +1005,30 @@ free_all_mem()
- # endif
- # ifdef FEAT_MENU
-     /* Clear menus. */
-     do_cmdline_cmd((char_u *)"aunmenu *");
-+#  ifdef FEAT_MULTI_LANG
-+    do_cmdline_cmd((char_u *)"menutranslate clear");
-+#  endif
- # endif
+ [bcopy_test_prog='
+ #include "confdefs.h"
+@@ -2949,11 +3053,11 @@ dnl Find out if _Xsetlocale() is support
+ dnl Check if X_LOCALE should be defined.
  
-     /* Clear mappings, abbreviations, breakpoints. */
-+    do_cmdline_cmd((char_u *)"lmapclear");
-+    do_cmdline_cmd((char_u *)"xmapclear");
-     do_cmdline_cmd((char_u *)"mapclear");
-     do_cmdline_cmd((char_u *)"mapclear!");
-     do_cmdline_cmd((char_u *)"abclear");
- # if defined(FEAT_EVAL)
-     do_cmdline_cmd((char_u *)"breakdel *");
- # endif
- # if defined(FEAT_PROFILE)
-     do_cmdline_cmd((char_u *)"profdel *");
- # endif
-+# if defined(FEAT_KEYMAP)
-+    do_cmdline_cmd((char_u *)"set keymap=");
-+#endif
+ if test "$enable_multibyte" = "yes"; then
+   cflags_save=$CFLAGS
+   ldflags_save=$LDFLAGS
+-  if test -n "$x_includes" ; then
++  if test "x$x_includes" != "xNONE" ; then
+     CFLAGS="$CFLAGS -I$x_includes"
+     LDFLAGS="$X_LIBS $LDFLAGS -lX11"
+     AC_MSG_CHECKING(whether X_LOCALE needed)
+     AC_TRY_COMPILE([#include <X11/Xlocale.h>],,
+       AC_TRY_LINK_FUNC([_Xsetlocale], [AC_MSG_RESULT(yes)
+@@ -2965,11 +3069,11 @@ if test "$enable_multibyte" = "yes"; the
+ fi
  
- # ifdef FEAT_TITLE
-     free_titles();
- # endif
- # if defined(FEAT_SEARCHPATH)
-@@ -1032,10 +1049,13 @@ free_all_mem()
-     free_last_insert();
-     free_prev_shellcmd();
-     free_regexp_stuff();
-     free_tag_stuff();
-     free_cd_dir();
-+# ifdef FEAT_SIGNS
-+    free_signs();
-+# endif
- # ifdef FEAT_EVAL
-     set_expr_line(NULL);
- # endif
- # ifdef FEAT_DIFF
-     diff_clear(curtab);
-@@ -1060,15 +1080,16 @@ free_all_mem()
-     init_history();
- # endif
+ dnl Link with xpg4, it is said to make Korean locale working
+ AC_CHECK_LIB(xpg4, _xpg4_setrunelocale, [LIBS="$LIBS -lxpg4"],,)
  
- #ifdef FEAT_QUICKFIX
-     {
--      win_T   *win;
-+      win_T       *win;
-+      tabpage_T   *tab;
+-dnl Check how we can run ctags
++dnl Check how we can run ctags.  Default to "ctags" when nothing works.
+ dnl --version for Exuberant ctags (preferred)
+ dnl       Add --fields=+S to get function signatures for omni completion.
+ dnl -t for typedefs (many ctags have this)
+ dnl -s for static functions (Elvis ctags only?)
+ dnl -v for variables. Dangerous, most ctags take this for 'vgrind style'.
+@@ -2977,10 +3081,11 @@ dnl -i+m to test for older Exuberant cta
+ AC_MSG_CHECKING(how to create tags)
+ test -f tags && mv tags tags.save
+ if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&AC_FD_CC 2>&1; then
+   TAGPRG="ctags -I INIT+ --fields=+S"
+ else
++  TAGPRG="ctags"
+   (eval etags    /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags"
+   (eval etags -c   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags -c"
+   (eval ctags    /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags"
+   (eval ctags -t   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -t"
+   (eval ctags -ts  /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -ts"
+@@ -3142,30 +3247,38 @@ if test "x$MACOSX" = "xyes" && test "x$C
+   else
+     AC_MSG_RESULT(no)
+   fi
+ fi
+ if test "x$MACARCH" = "xboth"; then
+-  LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
++  LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
+ fi
  
-       qf_free_all(NULL);
-       /* Free all location lists */
--      FOR_ALL_WINDOWS(win)
-+      FOR_ALL_TAB_WINDOWS(tab, win)
-           qf_free_all(win);
-     }
- #endif
+ dnl gcc 3.1 changed the meaning of -MM.  The only solution appears to be to
+ dnl use "-isystem" instead of "-I" for all non-Vim include dirs.
+ dnl But only when making dependencies, cproto and lint don't take "-isystem".
+ dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow
+ dnl the number before the version number.
+-AC_MSG_CHECKING(for GCC 3 or later)
+ DEPEND_CFLAGS_FILTER=
+ if test "$GCC" = yes; then
++  AC_MSG_CHECKING(for GCC 3 or later)
+   gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'`
+   if test "$gccmajor" -gt "2"; then
+     DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
++    AC_MSG_RESULT(yes)
++  else
++    AC_MSG_RESULT(no)
++  fi
++  dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is
++  dnl declared as char x[1] but actually longer.  Introduced in gcc 4.0.
++  dnl Also remove duplicate _FORTIFY_SOURCE arguments.
++  AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1)
++  if test "$gccmajor" -gt "3"; then
++    CFLAGS=`echo "$CFLAGS" | sed -e 's/-Wp,-D_FORTIFY_SOURCE=.//g' -e 's/-D_FORTIFY_SOURCE=.//g' -e 's/$/ -D_FORTIFY_SOURCE=1/'`
++    AC_MSG_RESULT(yes)
++  else
++    AC_MSG_RESULT(no)
+   fi
+-fi
+-if test "$DEPEND_CFLAGS_FILTER" = ""; then
+-  AC_MSG_RESULT(no)
+-else
+-  AC_MSG_RESULT(yes)
+ fi
+ AC_SUBST(DEPEND_CFLAGS_FILTER)
  
-     /* Close all script inputs. */
-@@ -1255,25 +1276,22 @@ vim_strsave_escaped_ext(string, esc_char
-       *p2 = NUL;
-     }
-     return escaped_string;
- }
+ dnl write output files
+ AC_OUTPUT(auto/config.mk:config.mk.in)
+--- vim72.orig/src/diff.c
++++ vim72/src/diff.c
+@@ -6,11 +6,11 @@
+  * Do ":help credits" in Vim to see a list of people who contributed.
+  * See README.txt for an overview of the Vim source code.
+  */
  
--#if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)
  /*
-  * Return TRUE when 'shell' has "csh" in the tail.
+- * diff.c: code for diff'ing two or three buffers.
++ * diff.c: code for diff'ing two, three or four buffers.
   */
-     int
- csh_like_shell()
- {
-     return (strstr((char *)gettail(p_sh), "csh") != NULL);
+ #include "vim.h"
+ #if defined(FEAT_DIFF) || defined(PROTO)
+@@ -71,10 +71,12 @@ diff_buf_delete(buf)
+       i = diff_buf_idx_tp(buf, tp);
+       if (i != DB_COUNT)
+       {
+           tp->tp_diffbuf[i] = NULL;
+           tp->tp_diff_invalid = TRUE;
++          if (tp == curtab)
++              diff_redraw(TRUE);
+       }
+     }
  }
--#endif
  
--#if defined(FEAT_EVAL) || defined(PROTO)
  /*
-  * Escape "string" for use as a shell argument with system().
-- * This uses single quotes, except when we know we need to use double qoutes
-+ * This uses single quotes, except when we know we need to use double quotes
-  * (MS-DOS and MS-Windows without 'shellslash' set).
-  * Escape a newline, depending on the 'shell' option.
-  * When "do_special" is TRUE also replace "!", "%", "#" and things starting
-  * with "<" like "<cfile>".
-  * Returns the result in allocated memory, NULL if we have run out.
-@@ -1372,10 +1390,11 @@ vim_strsave_shellescape(string, do_speci
-           if (do_special && find_cmdline_var(p, &l) >= 0)
+@@ -100,10 +102,11 @@ diff_buf_adjust(win)
+           i = diff_buf_idx(win->w_buffer);
+           if (i != DB_COUNT)
            {
-               *d++ = '\\';            /* insert backslash */
-               while (--l >= 0)        /* copy the var */
-                   *d++ = *p++;
-+              continue;
+               curtab->tp_diffbuf[i] = NULL;
+               curtab->tp_diff_invalid = TRUE;
++              diff_redraw(TRUE);
            }
-           MB_COPY_CHAR(p, d);
        }
-@@ -1389,11 +1408,10 @@ vim_strsave_shellescape(string, do_speci
-       *d = NUL;
      }
-     return escaped_string;
- }
--#endif
+     else
+       diff_buf_add(win->w_buffer);
+@@ -111,11 +114,11 @@ diff_buf_adjust(win)
  
  /*
-  * Like vim_strsave(), but make all characters uppercase.
-  * This uses ASCII lower-to-upper case translation, language independent.
+  * Add a buffer to make diffs for.
+  * Call this when a new buffer is being edited in the current window where
+  * 'diff' is set.
+- * Marks the current buffer as being part of the diff and requireing updating.
++ * Marks the current buffer as being part of the diff and requiring updating.
+  * This must be done before any autocmd, because a command may use info
+  * about the screen contents.
   */
-@@ -1525,11 +1543,11 @@ copy_spaces(ptr, count)
- }
+     void
+ diff_buf_add(buf)
+@@ -129,10 +132,11 @@ diff_buf_add(buf)
+     for (i = 0; i < DB_COUNT; ++i)
+       if (curtab->tp_diffbuf[i] == NULL)
+       {
+           curtab->tp_diffbuf[i] = buf;
+           curtab->tp_diff_invalid = TRUE;
++          diff_redraw(TRUE);
+           return;
+       }
  
- #if defined(FEAT_VISUALEXTRA) || defined(PROTO)
- /*
-  * Copy a character a number of times.
-- * Does not work for multi-byte charactes!
-+ * Does not work for multi-byte characters!
+     EMSGN(_("E96: Can not diff more than %ld buffers"), DB_COUNT);
+ }
+@@ -646,23 +650,23 @@ diff_write(buf, fname)
+  * Completely update the diffs for the buffers involved.
+  * This uses the ordinary "diff" command.
+  * The buffers are written to a file, also for unmodified buffers (the file
+  * could have been produced by autocommands, e.g. the netrw plugin).
   */
+-/*ARGSUSED*/
      void
- copy_chars(ptr, count, c)
-     char_u    *ptr;
-     size_t    count;
-@@ -2563,11 +2581,11 @@ trans_special(srcp, dst, keycode)
+ ex_diffupdate(eap)
+-    exarg_T   *eap;       /* can be NULL, it's not used */
++    exarg_T   *eap UNUSED;        /* can be NULL */
  {
-     int               modifiers = 0;
-     int               key;
-     int               dlen = 0;
+     buf_T     *buf;
+     int               idx_orig;
+     int               idx_new;
+     char_u    *tmp_orig;
+     char_u    *tmp_new;
+     char_u    *tmp_diff;
+     FILE      *fd;
+     int               ok;
++    int               io_error = FALSE;
  
--    key = find_special_key(srcp, &modifiers, keycode);
-+    key = find_special_key(srcp, &modifiers, keycode, FALSE);
-     if (key == 0)
-       return 0;
+     /* Delete all diffblocks. */
+     diff_clear(curtab);
+     curtab->tp_diff_invalid = FALSE;
  
-     /* Put the appropriate modifier in a string */
-     if (modifiers != 0)
-@@ -2599,14 +2617,15 @@ trans_special(srcp, dst, keycode)
-  * Try translating a <> name at (*srcp)[], return the key and modifiers.
-  * srcp is advanced to after the <> name.
-  * returns 0 if there is no match.
-  */
-     int
--find_special_key(srcp, modp, keycode)
-+find_special_key(srcp, modp, keycode, keep_x_key)
-     char_u    **srcp;
-     int               *modp;
--    int               keycode; /* prefer key code, e.g. K_DEL instead of DEL */
-+    int               keycode;     /* prefer key code, e.g. K_DEL instead of DEL */
-+    int               keep_x_key;  /* don't translate xHome to Home key */
- {
-     char_u    *last_dash;
-     char_u    *end_of_name;
-     char_u    *src;
-     char_u    *bp;
-@@ -2670,11 +2689,12 @@ find_special_key(srcp, modp, keycode)
-           if (modifiers != 0 && last_dash[2] == '>')
-               key = last_dash[1];
-           else
+@@ -695,22 +699,30 @@ ex_diffupdate(eap)
+      */
+     for (;;)
+     {
+       ok = FALSE;
+       fd = mch_fopen((char *)tmp_orig, "w");
+-      if (fd != NULL)
++      if (fd == NULL)
++          io_error = TRUE;
++      else
+       {
+-          fwrite("line1\n", (size_t)6, (size_t)1, fd);
++          if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1)
++              io_error = TRUE;
+           fclose(fd);
+           fd = mch_fopen((char *)tmp_new, "w");
+-          if (fd != NULL)
++          if (fd == NULL)
++              io_error = TRUE;
++          else
            {
-               key = get_special_key_code(last_dash + 1);
--              key = handle_x_keys(key);
-+              if (!keep_x_key)
-+                  key = handle_x_keys(key);
-           }
+-              fwrite("line2\n", (size_t)6, (size_t)1, fd);
++              if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1)
++                  io_error = TRUE;
+               fclose(fd);
+               diff_file(tmp_orig, tmp_new, tmp_diff);
+               fd = mch_fopen((char *)tmp_diff, "r");
+-              if (fd != NULL)
++              if (fd == NULL)
++                  io_error = TRUE;
++              else
+               {
+                   char_u      linebuf[LBUFLEN];
  
-           /*
-            * get_special_key_code() may return NUL for invalid
-            * special key name.
-@@ -2827,11 +2847,11 @@ get_special_key_code(name)
- #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
-     char_u *
- get_key_name(i)
-     int           i;
+                   for (;;)
+                   {
+@@ -759,10 +771,12 @@ ex_diffupdate(eap)
+       if (ok)
+           break;
+     }
+     if (!ok)
+     {
++      if (io_error)
++          EMSG(_("E810: Cannot read or write temp files"));
+       EMSG(_("E97: Cannot create diffs"));
+       diff_a_works = MAYBE;
+ #if defined(MSWIN) || defined(MSDOS)
+       diff_bin_works = MAYBE;
+ #endif
+@@ -810,40 +824,42 @@ diff_file(tmp_orig, tmp_new, tmp_diff)
+     char_u    *tmp_orig;
+     char_u    *tmp_new;
+     char_u    *tmp_diff;
  {
--    if (i >= KEY_NAMES_TABLE_LEN)
-+    if (i >= (int)KEY_NAMES_TABLE_LEN)
-       return NULL;
-     return  key_names_table[i].name;
- }
+     char_u    *cmd;
++    size_t    len;
+ #ifdef FEAT_EVAL
+     if (*p_dex != NUL)
+       /* Use 'diffexpr' to generate the diff file. */
+       eval_diff(tmp_orig, tmp_new, tmp_diff);
+     else
  #endif
+     {
+-      cmd = alloc((unsigned)(STRLEN(tmp_orig) + STRLEN(tmp_new)
+-                              + STRLEN(tmp_diff) + STRLEN(p_srr) + 27));
++      len = STRLEN(tmp_orig) + STRLEN(tmp_new)
++                                    + STRLEN(tmp_diff) + STRLEN(p_srr) + 27;
++      cmd = alloc((unsigned)len);
+       if (cmd != NULL)
+       {
+           /* We don't want $DIFF_OPTIONS to get in the way. */
+           if (getenv("DIFF_OPTIONS"))
+               vim_setenv((char_u *)"DIFF_OPTIONS", (char_u *)"");
  
-@@ -3855,11 +3875,12 @@ typedef struct ff_visited
+           /* Build the diff command and execute it.  Always use -a, binary
+            * differences are of no use.  Ignore errors, diff returns
+            * non-zero when differences have been found. */
+-          sprintf((char *)cmd, "diff %s%s%s%s%s %s",
++          vim_snprintf((char *)cmd, len, "diff %s%s%s%s%s %s",
+                   diff_a_works == FALSE ? "" : "-a ",
+ #if defined(MSWIN) || defined(MSDOS)
+                   diff_bin_works == TRUE ? "--binary " : "",
+ #else
+                   "",
  #endif
-     /* for unix use inode etc for comparison (needed because of links), else
-      * use filename.
-      */
+                   (diff_flags & DIFF_IWHITE) ? "-b " : "",
+                   (diff_flags & DIFF_ICASE) ? "-i " : "",
+                   tmp_orig, tmp_new);
+-          append_redir(cmd, p_srr, tmp_diff);
++          append_redir(cmd, (int)len, p_srr, tmp_diff);
+ #ifdef FEAT_AUTOCMD
+           block_autocmds();   /* Avoid ShellCmdPost stuff */
+ #endif
+           (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT);
+ #ifdef FEAT_AUTOCMD
+@@ -864,20 +880,22 @@ ex_diffpatch(eap)
+     exarg_T   *eap;
+ {
+     char_u    *tmp_orig;      /* name of original temp file */
+     char_u    *tmp_new;       /* name of patched temp file */
+     char_u    *buf = NULL;
++    size_t    buflen;
+     win_T     *old_curwin = curwin;
+     char_u    *newname = NULL;        /* name of patched file buffer */
  #ifdef UNIX
--    int                       ffv_dev;        /* device number (-1 if not set) */
-+    int                       ffv_dev_valid;  /* ffv_dev and ffv_ino were set */
-+    dev_t             ffv_dev;        /* device number */
-     ino_t             ffv_ino;        /* inode number */
+     char_u    dirbuf[MAXPATHL];
+     char_u    *fullname = NULL;
  #endif
-     /* The memory for this struct is allocated according to the length of
-      * ffv_fname.
-      */
-@@ -4045,17 +4066,16 @@ vim_findnext()
-  * must be NULL.
-  *
-  * This function silently ignores a few errors, vim_findfile() will have
-  * limited functionality then.
-  */
--/*ARGSUSED*/
-     void *
- vim_findfile_init(path, filename, stopdirs, level, free_visited, find_what,
-                                          search_ctx_arg, tagfile, rel_fname)
-     char_u    *path;
-     char_u    *filename;
--    char_u    *stopdirs;
-+    char_u    *stopdirs UNUSED;
-     int               level;
-     int               free_visited;
-     int               find_what;
-     void      *search_ctx_arg;
-     int               tagfile;
-@@ -4246,11 +4266,11 @@ vim_findfile_init(path, filename, stopdi
-        * The octet after a '**' is used as a (binary) counter.
-        * So '**3' is transposed to '**^C' ('^C' is ASCII value 3)
-        * or '**76' is transposed to '**N'( 'N' is ASCII value 76).
-        * For EBCDIC you get different character values.
-        * If no restrict is given after '**' the default is used.
--       * Due to this technic the path looks awful if you print it as a
-+       * Due to this technique the path looks awful if you print it as a
-        * string.
-        */
-       len = 0;
-       while (*wc_part != NUL)
-       {
-@@ -4635,11 +4655,11 @@ vim_findfile(search_ctx_arg)
-                   {
-                       if (!path_with_url(stackp->ffs_filearray[i])
-                                     && !mch_isdir(stackp->ffs_filearray[i]))
-                           continue;   /* not a directory */
--                      /* prepare the filename to be checked for existance
-+                      /* prepare the filename to be checked for existence
-                        * below */
-                       STRCPY(file_path, stackp->ffs_filearray[i]);
-                       add_pathsep(file_path);
-                       STRCAT(file_path, search_ctx->ffsc_file_to_search);
-@@ -4696,11 +4716,12 @@ vim_findfile(search_ctx_arg)
+ #ifdef FEAT_BROWSE
+     char_u    *browseFile = NULL;
+     int               browse_flag = cmdmod.browse;
+ #endif
++    struct stat st;
  
-                               /* push dir to examine rest of subdirs later */
-                               stackp->ffs_filearray_cur = i + 1;
-                               ff_push(search_ctx, stackp);
+ #ifdef FEAT_BROWSE
+     if (cmdmod.browse)
+     {
+       browseFile = do_browse(0, (char_u *)_("Patch file"),
+@@ -903,34 +921,35 @@ ex_diffpatch(eap)
  
--                              simplify_filename(file_path);
-+                              if (!path_with_url(file_path))
-+                                  simplify_filename(file_path);
-                               if (mch_dirname(ff_expand_buffer, MAXPATHL)
-                                                                       == OK)
-                               {
-                                   p = shorten_fname(file_path,
-                                                           ff_expand_buffer);
-@@ -5048,14 +5069,13 @@ ff_check_visited(visited_list, fname
-     /* check against list of already visited files */
-     for (vp = *visited_list; vp != NULL; vp = vp->ffv_next)
-     {
-       if (
  #ifdef UNIX
--              !url
--                  ? (vp->ffv_dev == st.st_dev
--                      && vp->ffv_ino == st.st_ino)
--                  :
-+              !url ? (vp->ffv_dev_valid && vp->ffv_dev == st.st_dev
-+                                                && vp->ffv_ino == st.st_ino)
-+                   :
+     /* Get the absolute path of the patchfile, changing directory below. */
+     fullname = FullName_save(eap->arg, FALSE);
  #endif
-               fnamecmp(vp->ffv_fname, ff_expand_buffer) == 0
-          )
-       {
- #ifdef FEAT_PATH_EXTRA
-@@ -5076,18 +5096,18 @@ ff_check_visited(visited_list, fname
-     if (vp != NULL)
-     {
+-    buf = alloc((unsigned)(STRLEN(tmp_orig) + (
++    buflen = STRLEN(tmp_orig) + (
+ # ifdef UNIX
+                   fullname != NULL ? STRLEN(fullname) :
+ # endif
+-                  STRLEN(eap->arg)) + STRLEN(tmp_new) + 16));
++                  STRLEN(eap->arg)) + STRLEN(tmp_new) + 16;
++    buf = alloc((unsigned)buflen);
+     if (buf == NULL)
+       goto theend;
  #ifdef UNIX
-       if (!url)
-       {
-+          vp->ffv_dev_valid = TRUE;
-           vp->ffv_ino = st.st_ino;
-           vp->ffv_dev = st.st_dev;
-           vp->ffv_fname[0] = NUL;
-       }
+-    /* Temporaraly chdir to /tmp, to avoid patching files in the current
++    /* Temporarily chdir to /tmp, to avoid patching files in the current
+      * directory when the patch file contains more than one patch.  When we
+      * have our own temp dir use that instead, it will be cleaned up when we
+      * exit (any .rej files created).  Don't change directory if we can't
+      * return to the current. */
+     if (mch_dirname(dirbuf, MAXPATHL) != OK || mch_chdir((char *)dirbuf) != 0)
+       dirbuf[0] = NUL;
+     else
+     {
+ # ifdef TEMPDIRNAMES
+       if (vim_tempdir != NULL)
+-          mch_chdir((char *)vim_tempdir);
++          ignored = mch_chdir((char *)vim_tempdir);
        else
-       {
--          vp->ffv_ino = 0;
--          vp->ffv_dev = -1;
-+          vp->ffv_dev_valid = FALSE;
- #endif
-           STRCPY(vp->ffv_fname, ff_expand_buffer);
- #ifdef UNIX
-       }
- #endif
-@@ -5424,11 +5444,11 @@ find_file_in_path_option(ptr, len, optio
-           /* "..", "../path", "." and "./path": don't use the path_option */
-           || rel_to_curdir
- #if defined(MSWIN) || defined(MSDOS) || defined(OS2)
-           /* handle "\tmp" as absolute path */
-           || vim_ispathsep(ff_file_to_find[0])
--          /* handle "c:name" as absulute path */
-+          /* handle "c:name" as absolute path */
-           || (ff_file_to_find[0] != NUL && ff_file_to_find[1] == ':')
+ # endif
+-          mch_chdir("/tmp");
++          ignored = mch_chdir("/tmp");
+       shorten_fnames(TRUE);
+     }
  #endif
- #ifdef AMIGA
-           /* handle ":tmp" as absolute path */
-           || ff_file_to_find[0] == ':'
-@@ -5667,11 +5687,11 @@ qsort(base, elm_count, elm_size, cmp)
-               /* Compare the elements. */
-               p1 = (char_u *)base + j * elm_size;
-               p2 = (char_u *)base + (j + gap) * elm_size;
-               if ((*cmp)((void *)p1, (void *)p2) <= 0)
-                   break;
--              /* Exchange the elemets. */
-+              /* Exchange the elements. */
-               mch_memmove(buf, p1, elm_size);
-               mch_memmove(p1, p2, elm_size);
-               mch_memmove(p2, buf, elm_size);
-           }
  
---- vim72.orig/src/normal.c
-+++ vim72/src/normal.c
-@@ -181,10 +181,12 @@ static void      nv_drop __ARGS((cmdarg_T *ca
+ #ifdef FEAT_EVAL
+@@ -944,11 +963,12 @@ ex_diffpatch(eap)
+     else
  #endif
+     {
+       /* Build the patch command and execute it.  Ignore errors.  Switch to
+        * cooked mode to allow the user to respond to prompts. */
+-      sprintf((char *)buf, "patch -o %s %s < \"%s\"", tmp_new, tmp_orig,
++      vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"",
++              tmp_new, tmp_orig,
+ # ifdef UNIX
+               fullname != NULL ? fullname :
+ # endif
+               eap->arg);
  #ifdef FEAT_AUTOCMD
- static void   nv_cursorhold __ARGS((cmdarg_T *cap));
- #endif
+@@ -978,48 +998,55 @@ ex_diffpatch(eap)
+     mch_remove(buf);
+     STRCPY(buf, tmp_new);
+     STRCAT(buf, ".rej");
+     mch_remove(buf);
  
-+static char *e_noident = N_("E349: No identifier under cursor");
-+
- /*
-  * Function to be called for a Normal or Visual mode command.
-  * The argument is a cmdarg_T.
-  */
- typedef void (*nv_func_T) __ARGS((cmdarg_T *cap));
-@@ -489,18 +491,18 @@ nv_compare(s1, s2)
- init_normal_cmds()
- {
-     int               i;
+-    if (curbuf->b_fname != NULL)
++    /* Only continue if the output file was created. */
++    if (mch_stat((char *)tmp_new, &st) < 0 || st.st_size == 0)
++      EMSG(_("E816: Cannot read patch output"));
++    else
+     {
+-      newname = vim_strnsave(curbuf->b_fname,
++      if (curbuf->b_fname != NULL)
++      {
++          newname = vim_strnsave(curbuf->b_fname,
+                                         (int)(STRLEN(curbuf->b_fname) + 4));
+-      if (newname != NULL)
+-          STRCAT(newname, ".new");
+-    }
++          if (newname != NULL)
++              STRCAT(newname, ".new");
++      }
  
-     /* Fill the index table with a one to one relation. */
--    for (i = 0; i < NV_CMDS_SIZE; ++i)
-+    for (i = 0; i < (int)NV_CMDS_SIZE; ++i)
-       nv_cmd_idx[i] = i;
+ #ifdef FEAT_GUI
+-    need_mouse_correct = TRUE;
++      need_mouse_correct = TRUE;
+ #endif
+-    /* don't use a new tab page, each tab page has its own diffs */
+-    cmdmod.tab = 0;
+-
+-    if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
+-    {
+-      /* Pretend it was a ":split fname" command */
+-      eap->cmdidx = CMD_split;
+-      eap->arg = tmp_new;
+-      do_exedit(eap, old_curwin);
++      /* don't use a new tab page, each tab page has its own diffs */
++      cmdmod.tab = 0;
  
-     /* Sort the commands by the command character.  */
-     qsort((void *)&nv_cmd_idx, (size_t)NV_CMDS_SIZE, sizeof(short), nv_compare);
+-      if (curwin != old_curwin)               /* split must have worked */
++      if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
+       {
+-          /* Set 'diff', 'scrollbind' on and 'wrap' off. */
+-          diff_win_options(curwin, TRUE);
+-          diff_win_options(old_curwin, TRUE);
++          /* Pretend it was a ":split fname" command */
++          eap->cmdidx = CMD_split;
++          eap->arg = tmp_new;
++          do_exedit(eap, old_curwin);
  
-     /* Find the first entry that can't be indexed by the command character. */
--    for (i = 0; i < NV_CMDS_SIZE; ++i)
-+    for (i = 0; i < (int)NV_CMDS_SIZE; ++i)
-       if (i != nv_cmds[nv_cmd_idx[i]].cmd_char)
-           break;
-     nv_max_linear = i - 1;
- }
+-          if (newname != NULL)
++          /* check that split worked and editing tmp_new */
++          if (curwin != old_curwin && win_valid(old_curwin))
+           {
+-              /* do a ":file filename.new" on the patched buffer */
+-              eap->arg = newname;
+-              ex_file(eap);
++              /* Set 'diff', 'scrollbind' on and 'wrap' off. */
++              diff_win_options(curwin, TRUE);
++              diff_win_options(old_curwin, TRUE);
++
++              if (newname != NULL)
++              {
++                  /* do a ":file filename.new" on the patched buffer */
++                  eap->arg = newname;
++                  ex_file(eap);
  
-@@ -557,15 +559,14 @@ find_command(cmdchar)
+ #ifdef FEAT_AUTOCMD
+-              /* Do filetype detection with the new name. */
+-              if (au_has_group((char_u *)"filetypedetect"))
+-                  do_cmdline_cmd((char_u *)":doau filetypedetect BufRead");
++                  /* Do filetype detection with the new name. */
++                  if (au_has_group((char_u *)"filetypedetect"))
++                      do_cmdline_cmd((char_u *)":doau filetypedetect BufRead");
+ #endif
++              }
+           }
+       }
+     }
+ theend:
+@@ -1072,14 +1099,13 @@ ex_diffsplit(eap)
  }
  
  /*
-  * Execute a command in Normal mode.
+  * Set options to show difs for the current window.
   */
 -/*ARGSUSED*/
      void
- normal_cmd(oap, toplevel)
-     oparg_T   *oap;
--    int               toplevel;               /* TRUE when called from main() */
-+    int               toplevel UNUSED;        /* TRUE when called from main() */
+ ex_diffthis(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
-     cmdarg_T  ca;                     /* command arguments */
-     int               c;
-     int               ctrl_w = FALSE;         /* got CTRL-W command */
-     int               old_col = curwin->w_curswant;
-@@ -576,10 +577,13 @@ normal_cmd(oap, toplevel)
-     pos_T     old_pos;                /* cursor position before command */
-     int               mapped_len;
-     static int        old_mapped_len = 0;
- #endif
-     int               idx;
-+#ifdef FEAT_EVAL
-+    int               set_prevcount = FALSE;
-+#endif
-     vim_memset(&ca, 0, sizeof(ca));   /* also resets ca.retval */
-     ca.oap = oap;
-     /* Use a count remembered from before entering an operator.  After typing
-@@ -611,11 +615,16 @@ normal_cmd(oap, toplevel)
- #endif
-     /* When not finishing an operator and no register name typed, reset the
-      * count. */
-     if (!finish_op && !oap->regname)
-+    {
-       ca.opcount = 0;
-+#ifdef FEAT_EVAL
-+      set_prevcount = TRUE;
-+#endif
-+    }
- #ifdef FEAT_AUTOCMD
-     /* Restore counts from before receiving K_CURSORHOLD.  This means after
-      * typing "3", handling K_CURSORHOLD and then typing "2" we get "32", not
-      * "3 * 2". */
-@@ -639,14 +648,11 @@ normal_cmd(oap, toplevel)
-     /*
-      * Get the command character from the user.
-      */
-     c = safe_vgetc();
--
--#ifdef FEAT_LANGMAP
-     LANGMAP_ADJUST(c, TRUE);
--#endif
+     /* Set 'diff', 'scrollbind' on and 'wrap' off. */
+     diff_win_options(curwin, TRUE);
+ }
  
- #ifdef FEAT_VISUAL
-     /*
-      * If a mapping was started in Visual or Select mode, remember the length
-      * of the mapping.  This is used below to not return to Insert mode for as
-@@ -715,22 +721,28 @@ getcount:
- #ifdef FEAT_EVAL
-           /* Set v:count here, when called from main() and not a stuffed
-            * command, so that v:count can be used in an expression mapping
-            * right after the count. */
-           if (toplevel && stuff_empty())
--              set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0);
-+          {
-+              long count = ca.count0;
+@@ -1089,30 +1115,35 @@ ex_diffthis(eap)
+     void
+ diff_win_options(wp, addbuf)
+     win_T     *wp;
+     int               addbuf;         /* Add buffer to diff. */
+ {
++# ifdef FEAT_FOLDING
++    win_T *old_curwin = curwin;
 +
-+              /* multiply with ca.opcount the same way as below */
-+              if (ca.opcount != 0)
-+                  count = ca.opcount * (count == 0 ? 1 : count);
-+              set_vcount(count, count == 0 ? 1 : count, set_prevcount);
-+              set_prevcount = FALSE;  /* only set v:prevcount once */
-+          }
- #endif
-           if (ctrl_w)
-           {
-               ++no_mapping;
-               ++allow_keys;           /* no mapping for nchar, but keys */
-           }
-           ++no_zero_mapping;          /* don't map zero here */
-           c = plain_vgetc();
--#ifdef FEAT_LANGMAP
-           LANGMAP_ADJUST(c, TRUE);
--#endif
-           --no_zero_mapping;
-           if (ctrl_w)
-           {
-               --no_mapping;
-               --allow_keys;
-@@ -749,13 +761,11 @@ getcount:
-           ca.opcount = ca.count0;     /* remember first count */
-           ca.count0 = 0;
-           ++no_mapping;
-           ++allow_keys;               /* no mapping for nchar, but keys */
-           c = plain_vgetc();          /* get next character */
--#ifdef FEAT_LANGMAP
-           LANGMAP_ADJUST(c, TRUE);
--#endif
-           --no_mapping;
-           --allow_keys;
- #ifdef FEAT_CMDL_INFO
-           need_flushbuf |= add_to_showcmd(c);
- #endif
-@@ -802,11 +812,11 @@ getcount:
- #ifdef FEAT_EVAL
-     /*
-      * Only set v:count when called from main() and not a stuffed command.
-      */
-     if (toplevel && stuff_empty())
--      set_vcount(ca.count0, ca.count1);
-+      set_vcount(ca.count0, ca.count1, set_prevcount);
- #endif
-     /*
-      * Find the command character in the table of commands.
-      * For CTRL-W we already got nchar when looking for a count.
-@@ -939,13 +949,11 @@ getcount:
-           /*
-            * For 'g' get the next character now, so that we can check for
-            * "gr", "g'" and "g`".
-            */
-           ca.nchar = plain_vgetc();
--#ifdef FEAT_LANGMAP
-           LANGMAP_ADJUST(ca.nchar, TRUE);
--#endif
- #ifdef FEAT_CMDL_INFO
-           need_flushbuf |= add_to_showcmd(ca.nchar);
- #endif
-           if (ca.nchar == 'r' || ca.nchar == '\'' || ca.nchar == '`'
-                                                     || ca.nchar == Ctrl_BSL)
-@@ -1042,14 +1050,12 @@ getcount:
++    /* close the manually opened folds */
++    curwin = wp;
++    newFoldLevel();
++    curwin = old_curwin;
++# endif
++
+     wp->w_p_diff = TRUE;
+     wp->w_p_scb = TRUE;
+     wp->w_p_wrap = FALSE;
+ # ifdef FEAT_FOLDING
+-    {
+-      win_T       *old_curwin = curwin;
+-
+-      curwin = wp;
+-      curbuf = curwin->w_buffer;
+-      set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
++    curwin = wp;
++    curbuf = curwin->w_buffer;
++    set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
+                                                      OPT_LOCAL|OPT_FREE, 0);
+-      curwin = old_curwin;
+-      curbuf = curwin->w_buffer;
+-      wp->w_p_fdc = diff_foldcolumn;
+-      wp->w_p_fen = TRUE;
+-      wp->w_p_fdl = 0;
+-      foldUpdateAll(wp);
+-      /* make sure topline is not halfway a fold */
+-      changed_window_setting_win(wp);
+-    }
++    curwin = old_curwin;
++    curbuf = curwin->w_buffer;
++    wp->w_p_fdc = diff_foldcolumn;
++    wp->w_p_fen = TRUE;
++    wp->w_p_fdl = 0;
++    foldUpdateAll(wp);
++    /* make sure topline is not halfway a fold */
++    changed_window_setting_win(wp);
  # endif
-                   }
-               }
- #endif
--#ifdef FEAT_LANGMAP
-               /* adjust chars > 127, except after "tTfFr" commands */
-               LANGMAP_ADJUST(*cp, !lang);
--#endif
- #ifdef FEAT_RIGHTLEFT
-               /* adjust Hebrew mapped char */
-               if (p_hkmap && lang && KeyTyped)
-                   *cp = hkmap(*cp);
- # ifdef FEAT_FKMAP
-@@ -1130,11 +1136,12 @@ getcount:
-      */
-     if (need_flushbuf)
-       out_flush();
+ #ifdef FEAT_SCROLLBIND
+     if (vim_strchr(p_sbo, 'h') == NULL)
+       do_cmdline_cmd((char_u *)"set sbo+=hor");
  #endif
- #ifdef FEAT_AUTOCMD
--    did_cursorhold = FALSE;
-+    if (ca.cmdchar != K_IGNORE)
-+      did_cursorhold = FALSE;
+@@ -1136,11 +1167,11 @@ ex_diffoff(eap)
+     int               diffwin = FALSE;
  #endif
  
-     State = NORMAL;
+     for (wp = firstwin; wp != NULL; wp = wp->w_next)
+     {
+-      if (wp == curwin || eap->forceit)
++      if (wp == curwin || (eap->forceit && wp->w_p_diff))
+       {
+           /* Set 'diff', 'scrollbind' off and 'wrap' on. */
+           wp->w_p_diff = FALSE;
+           wp->w_p_scb = FALSE;
+           wp->w_p_wrap = TRUE;
+@@ -2112,10 +2143,12 @@ ex_diffgetput(eap)
+       if (buf == NULL)
+       {
+           EMSG2(_("E102: Can't find buffer \"%s\""), eap->arg);
+           return;
+       }
++      if (buf == curbuf)
++          return;             /* nothing to do */
+       idx_other = diff_buf_idx(buf);
+       if (idx_other == DB_COUNT)
+       {
+           EMSG2(_("E103: Buffer \"%s\" is not in diff mode"), eap->arg);
+           return;
+--- vim72.orig/src/digraph.c
++++ vim72/src/digraph.c
+@@ -30,11 +30,11 @@ typedef struct digraph
  
-     if (ca.nchar == ESC)
-@@ -2178,14 +2185,13 @@ op_colon(oap)
- }
+ static int getexactdigraph __ARGS((int, int, int));
+ static void printdigraph __ARGS((digr_T *));
+ /* digraphs added by the user */
+-static garray_T       user_digraphs = {0, 0, sizeof(digr_T), 10, NULL};
++static garray_T       user_digraphs = {0, 0, (int)sizeof(digr_T), 10, NULL};
  
  /*
-  * Handle the "g@" operator: call 'operatorfunc'.
+  * Note: Characters marked with XX are not included literally, because some
+  * compilers cannot handle them (Amiga SAS/C is the most picky one).
   */
--/*ARGSUSED*/
-     static void
- op_function(oap)
--    oparg_T   *oap;
-+    oparg_T   *oap UNUSED;
- {
- #ifdef FEAT_EVAL
-     char_u    *(argv[1]);
-     if (*p_opfunc == NUL)
-@@ -3507,11 +3513,11 @@ find_ident_at_pos(wp, lnum, startcol, st
-        * didn't find an identifier or string
-        */
-       if (find_type & FIND_STRING)
-           EMSG(_("E348: No string under cursor"));
+@@ -2369,14 +2369,14 @@ printdigraph(dp)
+               *p++ = ' ';
+           p += (*mb_char2bytes)(dp->result, p);
+       }
        else
--          EMSG(_("E349: No identifier under cursor"));
-+          EMSG(_(e_noident));
-       return 0;
+ #endif
+-          *p++ = dp->result;
++          *p++ = (char_u)dp->result;
+       if (char2cells(dp->result) == 1)
+           *p++ = ' ';
+-      sprintf((char *)p, " %3d", dp->result);
++      vim_snprintf((char *)p, sizeof(buf) - (p - buf), " %3d", dp->result);
+       msg_outtrans(buf);
      }
-     ptr += col;
-     *string = ptr;
+ }
  
-@@ -3699,17 +3705,17 @@ clear_showcmd()
-       return;
+ #endif /* FEAT_DIGRAPHS */
+@@ -2393,11 +2393,14 @@ typedef struct
+ #define KMAP_MAXLEN 20            /* maximum length of "from" or "to" */
  
- #ifdef FEAT_VISUAL
-     if (VIsual_active && !char_avail())
-     {
--      int             i = lt(VIsual, curwin->w_cursor);
-+      int             cursor_bot = lt(VIsual, curwin->w_cursor);
-       long            lines;
-       colnr_T         leftcol, rightcol;
-       linenr_T        top, bot;
-       /* Show the size of the Visual area. */
--      if (i)
-+      if (cursor_bot)
-       {
-           top = VIsual.lnum;
-           bot = curwin->w_cursor.lnum;
-       }
-       else
-@@ -3724,18 +3730,27 @@ clear_showcmd()
- # endif
-       lines = bot - top + 1;
-       if (VIsual_mode == Ctrl_V)
-       {
-+#ifdef FEAT_LINEBREAK
-+          char_u *saved_sbr = p_sbr;
-+
-+          /* Make 'sbr' empty for a moment to get the correct size. */
-+          p_sbr = empty_option;
-+#endif
-           getvcols(curwin, &curwin->w_cursor, &VIsual, &leftcol, &rightcol);
-+#ifdef FEAT_LINEBREAK
-+          p_sbr = saved_sbr;
-+#endif
-           sprintf((char *)showcmd_buf, "%ldx%ld", lines,
-                                             (long)(rightcol - leftcol + 1));
-       }
-       else if (VIsual_mode == 'V' || VIsual.lnum != curwin->w_cursor.lnum)
-           sprintf((char *)showcmd_buf, "%ld", lines);
-       else
--          sprintf((char *)showcmd_buf, "%ld", (long)(i
-+          sprintf((char *)showcmd_buf, "%ld", (long)(cursor_bot
-                   ? curwin->w_cursor.col - VIsual.col
-                   : VIsual.col - curwin->w_cursor.col) + (*p_sel != 'e'));
-       showcmd_buf[SHOWCMD_COLS] = NUL;        /* truncate */
-       showcmd_visual = TRUE;
-     }
-@@ -4081,14 +4096,13 @@ nv_ignore(cap)
+ static void keymap_unload __ARGS((void));
  
  /*
-  * Command character that doesn't do anything, but unlike nv_ignore() does
-  * start edit().  Used for "startinsert" executed while starting up.
+- * Set up key mapping tables for the 'keymap' option
++ * Set up key mapping tables for the 'keymap' option.
++ * Returns NULL if OK, an error message for failure.  This only needs to be
++ * used when setting the option, not later when the value has already been
++ * checked.
   */
--/*ARGSUSED */
-     static void
- nv_nop(cap)
--    cmdarg_T  *cap;
-+    cmdarg_T  *cap UNUSED;
+     char_u *
+ keymap_init()
  {
- }
- /*
-  * Command character doesn't exist.
-@@ -4609,13 +4623,11 @@ nv_zet(cap)
-           dont_scroll = TRUE;         /* disallow scrolling here */
- #endif
-           ++no_mapping;
-           ++allow_keys;   /* no mapping for nchar, but allow key codes */
-           nchar = plain_vgetc();
--#ifdef FEAT_LANGMAP
-           LANGMAP_ADJUST(nchar, TRUE);
--#endif
-           --no_mapping;
-           --allow_keys;
- #ifdef FEAT_CMDL_INFO
-           (void)add_to_showcmd(nchar);
- #endif
-@@ -4967,13 +4979,11 @@ dozet:
- #ifdef FEAT_SPELL
-     case 'u': /* "zug" and "zuw": undo "zg" and "zw" */
-               ++no_mapping;
-               ++allow_keys;   /* no mapping for nchar, but allow key codes */
-               nchar = plain_vgetc();
--#ifdef FEAT_LANGMAP
-               LANGMAP_ADJUST(nchar, TRUE);
--#endif
-               --no_mapping;
-               --allow_keys;
- #ifdef FEAT_CMDL_INFO
-               (void)add_to_showcmd(nchar);
- #endif
-@@ -5226,11 +5236,11 @@ nv_colon(cap)
-       /* The start of the operator may have become invalid by the Ex
-        * command. */
-       if (cap->oap->op_type != OP_NOP
-               && (cap->oap->start.lnum > curbuf->b_ml.ml_line_count
-                   || cap->oap->start.col >
--                                       STRLEN(ml_get(cap->oap->start.lnum))))
-+                             (colnr_T)STRLEN(ml_get(cap->oap->start.lnum))))
-           clearopbeep(cap->oap);
+     curbuf->b_kmap_state &= ~KEYMAP_INIT;
+@@ -2410,29 +2413,33 @@ keymap_init()
+       do_cmdline_cmd((char_u *)"unlet! b:keymap_name");
      }
- }
+     else
+     {
+       char_u  *buf;
++      size_t  buflen;
  
- /*
-@@ -5394,10 +5404,11 @@ nv_ident(cap)
-     char_u    *kp;            /* value of 'keywordprg' */
-     int               kp_help;        /* 'keywordprg' is ":help" */
-     int               n = 0;          /* init for GCC */
-     int               cmdchar;
-     int               g_cmd;          /* "g" command */
-+    int               tag_cmd = FALSE;
-     char_u    *aux_ptr;
-     int               isman;
-     int               isman_s;
+       /* Source the keymap file.  It will contain a ":loadkeymap" command
+        * which will call ex_loadkeymap() below. */
+-      buf = alloc((unsigned)(STRLEN(curbuf->b_p_keymap)
++      buflen = STRLEN(curbuf->b_p_keymap)
+ # ifdef FEAT_MBYTE
+-                                                     + STRLEN(p_enc)
++                                         + STRLEN(p_enc)
+ # endif
+-                                                     + 14));
++                                                     + 14;
++      buf = alloc((unsigned)buflen);
+       if (buf == NULL)
+           return e_outofmem;
  
-     if (cap->cmdchar == 'g')  /* "g*", "g#", "g]" and "gCTRL-]" */
-@@ -5467,10 +5478,24 @@ nv_ident(cap)
-       case 'K':
-           if (kp_help)
-               STRCPY(buf, "he! ");
-           else
+ # ifdef FEAT_MBYTE
+       /* try finding "keymap/'keymap'_'encoding'.vim"  in 'runtimepath' */
+-      sprintf((char *)buf, "keymap/%s_%s.vim", curbuf->b_p_keymap, p_enc);
++      vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim",
++                                                 curbuf->b_p_keymap, p_enc);
+       if (source_runtime(buf, FALSE) == FAIL)
+ # endif
+       {
+           /* try finding "keymap/'keymap'.vim" in 'runtimepath'  */
+-          sprintf((char *)buf, "keymap/%s.vim", curbuf->b_p_keymap);
++          vim_snprintf((char *)buf, buflen, "keymap/%s.vim",
++                                                        curbuf->b_p_keymap);
+           if (source_runtime(buf, FALSE) == FAIL)
            {
-+              /* An external command will probably use an argument starting
-+               * with "-" as an option.  To avoid trouble we skip the "-". */
-+              while (*ptr == '-' && n > 0)
-+              {
-+                  ++ptr;
-+                  --n;
-+              }
-+              if (n == 0)
-+              {
-+                  EMSG(_(e_noident));  /* found dashes only */
-+                  vim_free(buf);
-+                  return;
-+              }
-+
-               /* When a count is given, turn it into a range.  Is this
-                * really what we want? */
-               isman = (STRCMP(kp, "man") == 0);
-               isman_s = (STRCMP(kp, "man -s") == 0);
-               if (cap->count0 != 0 && !(isman || isman_s))
-@@ -5489,10 +5514,11 @@ nv_ident(cap)
-               }
+               vim_free(buf);
+               return (char_u *)N_("E544: Keymap file not found");
            }
-           break;
+--- vim72.orig/src/edit.c
++++ vim72/src/edit.c
+@@ -55,11 +55,11 @@ static char *ctrl_x_msgs[] =
+     N_(" Omni completion (^O^N^P)"),
+     N_(" Spelling suggestion (s^N^P)"),
+     N_(" Keyword Local completion (^N^P)"),
+ };
  
-       case ']':
-+          tag_cmd = TRUE;
- #ifdef FEAT_CSCOPE
-           if (p_cst)
-               STRCPY(buf, "cstag ");
-           else
- #endif
-@@ -5500,50 +5526,78 @@ nv_ident(cap)
-           break;
+-static char_u e_hitend[] = N_("Hit end of paragraph");
++static char e_hitend[] = N_("Hit end of paragraph");
  
-       default:
-           if (curbuf->b_help)
-               STRCPY(buf, "he! ");
--          else if (g_cmd)
--              STRCPY(buf, "tj ");
-           else
--              sprintf((char *)buf, "%ldta ", cap->count0);
-+          {
-+              tag_cmd = TRUE;
-+              if (g_cmd)
-+                  STRCPY(buf, "tj ");
-+              else
-+                  sprintf((char *)buf, "%ldta ", cap->count0);
-+          }
-     }
+ /*
+  * Structure used to store one match for insert completion.
+  */
+ typedef struct compl_S compl_T;
+@@ -112,10 +112,14 @@ static int         compl_restarting = FALSE;     /
  
-     /*
-      * Now grab the chars in the identifier
-      */
--    if (cmdchar == '*')
--      aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
--    else if (cmdchar == '#')
--      aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
--    else if (cmdchar == 'K' && !kp_help)
--      aux_ptr = (char_u *)" \t\\\"|!";
--    else
--      /* Don't escape spaces and Tabs in a tag with a backslash */
--      aux_ptr = (char_u *)"\\|\"";
--
--    p = buf + STRLEN(buf);
--    while (n-- > 0)
--    {
--      /* put a backslash before \ and some others */
--      if (vim_strchr(aux_ptr, *ptr) != NULL)
--          *p++ = '\\';
--#ifdef FEAT_MBYTE
--      /* When current byte is a part of multibyte character, copy all bytes
--       * of that character. */
--      if (has_mbyte)
-+    if (cmdchar == 'K' && !kp_help)
-+    {
-+      /* Escape the argument properly for a shell command */
-+      ptr = vim_strnsave(ptr, n);
-+      p = vim_strsave_shellescape(ptr, TRUE);
-+      vim_free(ptr);
-+      if (p == NULL)
-       {
--          int i;
--          int len = (*mb_ptr2len)(ptr) - 1;
--
--          for (i = 0; i < len && n >= 1; ++i, --n)
--              *p++ = *ptr++;
-+          vim_free(buf);
-+          return;
-+      }
-+      buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1);
-+      if (buf == NULL)
-+      {
-+          vim_free(buf);
-+          vim_free(p);
-+          return;
-       }
-+      STRCAT(buf, p);
-+      vim_free(p);
-+    }
-+    else
-+    {
-+      if (cmdchar == '*')
-+          aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
-+      else if (cmdchar == '#')
-+          aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
-+      else if (tag_cmd)
-+          /* Don't escape spaces and Tabs in a tag with a backslash */
-+          aux_ptr = (char_u *)"\\|\"\n[";
-+      else
-+          aux_ptr = (char_u *)"\\|\"\n*?[";
-+
-+      p = buf + STRLEN(buf);
-+      while (n-- > 0)
-+      {
-+          /* put a backslash before \ and some others */
-+          if (vim_strchr(aux_ptr, *ptr) != NULL)
-+              *p++ = '\\';
-+#ifdef FEAT_MBYTE
-+          /* When current byte is a part of multibyte character, copy all
-+           * bytes of that character. */
-+          if (has_mbyte)
-+          {
-+              int i;
-+              int len = (*mb_ptr2len)(ptr) - 1;
+ /* When the first completion is done "compl_started" is set.  When it's
+  * FALSE the word to be completed must be located. */
+ static int      compl_started = FALSE;
++/* Set when doing something for completion that may call edit() recursively,
++ * which is not allowed. */
++static int      compl_busy = FALSE;
 +
-+              for (i = 0; i < len && n >= 1; ++i, --n)
-+                  *p++ = *ptr++;
-+          }
- #endif
--      *p++ = *ptr++;
-+          *p++ = *ptr++;
-+      }
-+      *p = NUL;
-     }
--    *p = NUL;
+ static int      compl_matches = 0;
+ static char_u   *compl_pattern = NULL;
+ static int      compl_direction = FORWARD;
+ static int      compl_shows_dir = FORWARD;
+ static int      compl_pending = 0;        /* > 1 for postponed CTRL-N */
+@@ -145,10 +149,11 @@ static char_u *find_line_end __ARGS((cha
+ static void ins_compl_free __ARGS((void));
+ static void ins_compl_clear __ARGS((void));
+ static int  ins_compl_bs __ARGS((void));
+ static void ins_compl_new_leader __ARGS((void));
+ static void ins_compl_addleader __ARGS((int c));
++static int ins_compl_len __ARGS((void));
+ static void ins_compl_restart __ARGS((void));
+ static void ins_compl_set_original_text __ARGS((char_u *str));
+ static void ins_compl_addfrommatch __ARGS((void));
+ static int  ins_compl_prep __ARGS((int c));
+ static buf_T *ins_compl_next_buf __ARGS((buf_T *buf, int flag));
+@@ -162,11 +167,11 @@ static int  ins_compl_next __ARGS((int a
+ static int  ins_compl_key2dir __ARGS((int c));
+ static int  ins_compl_pum_key __ARGS((int c));
+ static int  ins_compl_key2count __ARGS((int c));
+ static int  ins_compl_use_match __ARGS((int c));
+ static int  ins_complete __ARGS((int c));
+-static int  quote_meta __ARGS((char_u *dest, char_u *str, int len));
++static unsigned  quote_meta __ARGS((char_u *dest, char_u *str, int len));
+ #endif /* FEAT_INS_EXPAND */
  
-     /*
-      * Execute the command.
-      */
-     if (cmdchar == '*' || cmdchar == '#')
-@@ -5554,10 +5608,11 @@ nv_ident(cap)
+ #define BACKSPACE_CHAR                    1
+ #define BACKSPACE_WORD                    2
+ #define BACKSPACE_WORD_NOT_SPACE    3
+@@ -174,11 +179,11 @@ static int  quote_meta __ARGS((char_u *d
+ static void ins_redraw __ARGS((int ready));
+ static void ins_ctrl_v __ARGS((void));
+ static void undisplay_dollar __ARGS((void));
+ static void insert_special __ARGS((int, int, int));
+-static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only));
++static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only, int c));
+ static void check_auto_format __ARGS((int));
+ static void redo_literal __ARGS((int c));
+ static void start_arrow __ARGS((pos_T *end_insert_pos));
+ #ifdef FEAT_SPELL
+ static void check_spell_redraw __ARGS((void));
+@@ -195,11 +200,12 @@ static void replace_join __ARGS((int off
+ static void replace_pop_ins __ARGS((void));
+ #ifdef FEAT_MBYTE
+ static void mb_replace_pop_ins __ARGS((int cc));
  #endif
-               vim_iswordc(ptr[-1])))
-           STRCAT(buf, "\\>");
- #ifdef FEAT_CMDHIST
-       /* put pattern in search history */
-+      init_history();
      add_to_history(HIST_SEARCH, buf, TRUE, NUL);
+ static void replace_flush __ARGS((void));
+-static void replace_do_bs __ARGS((void));
++static void replace_do_bs __ARGS((int limit_col));
++static int del_char_after_col __ARGS((int limit_col));
+ #ifdef FEAT_CINDENT
static int cindent_on __ARGS((void));
  #endif
-       normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0);
+ static void ins_reg __ARGS((void));
+ static void ins_ctrl_g __ARGS((void));
+@@ -302,11 +308,11 @@ edit(cmdchar, startln, count)
+     long      count;
+ {
+     int               c = 0;
+     char_u    *ptr;
+     int               lastc;
+-    colnr_T   mincol;
++    int               mincol;
+     static linenr_T o_lnum = 0;
+     int               i;
+     int               did_backspace = TRUE;       /* previous char was backspace */
+ #ifdef FEAT_CINDENT
+     int               line_is_white = FALSE;      /* line is empty before insert */
+@@ -342,11 +348,11 @@ edit(cmdchar, startln, count)
+       return FALSE;
      }
-     else
-@@ -5765,11 +5820,14 @@ nv_right(cap)
- #endif
  
-     for (n = cap->count1; n > 0; --n)
+ #ifdef FEAT_INS_EXPAND
+     /* Don't allow recursive insert mode when busy with completion. */
+-    if (compl_started || pum_visible())
++    if (compl_started || compl_busy || pum_visible())
      {
-       if ((!PAST_LINE && oneright() == FAIL)
--              || (PAST_LINE && *ml_get_cursor() == NUL))
-+#ifdef FEAT_VISUAL
-+              || (PAST_LINE && *ml_get_cursor() == NUL)
-+#endif
-+              )
-       {
-           /*
-            *    <Space> wraps to next line if 'whichwrap' has 's'.
-            *        'l' wraps to next line if 'whichwrap' has 'l'.
-            * CURS_RIGHT wraps to next line if 'whichwrap' has '>'.
-@@ -6009,11 +6067,11 @@ nv_gotofile(cap)
-       /* do autowrite if necessary */
-       if (curbufIsChanged() && curbuf->b_nwindows <= 1 && !P_HID(curbuf))
-           autowrite(curbuf, FALSE);
-       setpcmark();
-       (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST,
--                                             P_HID(curbuf) ? ECMD_HIDE : 0);
-+                                     P_HID(curbuf) ? ECMD_HIDE : 0, curwin);
-       if (cap->nchar == 'F' && lnum >= 0)
-       {
-           curwin->w_cursor.lnum = lnum;
-           check_cursor_lnum();
-           beginline(BL_SOL | BL_FIX);
-@@ -6726,10 +6784,12 @@ nv_replace(cap)
- #ifdef FEAT_VISUAL
-     /* Visual mode "r" */
-     if (VIsual_active)
+       EMSG(_(e_secure));
+       return FALSE;
+     }
+     ins_compl_clear();            /* clear stuff for CTRL-X mode */
+@@ -383,11 +389,11 @@ edit(cmdchar, startln, count)
      {
-+      if (got_int)
-+          reset_VIsual();
-       nv_operator(cap);
-       return;
+       Insstart = curwin->w_cursor;
+       if (startln)
+           Insstart.col = 0;
      }
- #endif
+-    Insstart_textlen = linetabsize(ml_get_curline());
++    Insstart_textlen = (colnr_T)linetabsize(ml_get_curline());
+     Insstart_blank_vcol = MAXCOL;
+     if (!did_ai)
+       ai_col = 0;
  
-@@ -7782,11 +7842,11 @@ nv_g_cmd(cap)
-               i = (curwin->w_virtcol - width1) / width2 * width2 + width1;
-       }
-       else
-           i = curwin->w_leftcol;
-       /* Go to the middle of the screen line.  When 'number' is on and lines
--       * are wrapping the middle can be more to the left.*/
-+       * are wrapping the middle can be more to the left. */
-       if (cap->nchar == 'm')
-           i += (W_WIDTH(curwin) - curwin_col_off()
-                   + ((curwin->w_p_wrap && i > 0)
-                       ? curwin_col_off2() : 0)) / 2;
-       coladvance((colnr_T)i);
-@@ -7819,10 +7879,13 @@ nv_g_cmd(cap)
-           /* Decrease the cursor column until it's on a non-blank. */
-           while (curwin->w_cursor.col > 0
-                                   && vim_iswhite(ptr[curwin->w_cursor.col]))
-               --curwin->w_cursor.col;
-           curwin->w_set_curswant = TRUE;
-+#ifdef FEAT_VISUAL
-+          adjust_for_sel(cap);
-+#endif
-       }
-       break;
+     if (cmdchar != NUL && restart_edit == 0)
+@@ -649,11 +655,11 @@ edit(cmdchar, startln, count)
+               )
+       {
+           mincol = curwin->w_wcol;
+           validate_cursor_col();
  
-     case '$':
-     case K_END:
-@@ -9190,14 +9253,13 @@ nv_open(cap)
- #endif
-       n_opencmd(cap);
- }
+-          if ((int)curwin->w_wcol < (int)mincol - curbuf->b_p_ts
++          if ((int)curwin->w_wcol < mincol - curbuf->b_p_ts
+                   && curwin->w_wrow == W_WINROW(curwin)
+                                                + curwin->w_height - 1 - p_so
+                   && (curwin->w_cursor.lnum != curwin->w_topline
+ #ifdef FEAT_DIFF
+                       || curwin->w_topfill > 0
+@@ -749,11 +755,11 @@ edit(cmdchar, startln, count)
+               /* CTRL-L: Add one character from the current match to
+                * "compl_leader".  Except when at the original match and
+                * there is nothing to add, CTRL-L works like CTRL-P then. */
+               if (c == Ctrl_L
+                       && (ctrl_x_mode != CTRL_X_WHOLE_LINE
+-                          || STRLEN(compl_shown_match->cp_str)
++                          || (int)STRLEN(compl_shown_match->cp_str)
+                                         > curwin->w_cursor.col - compl_col))
+               {
+                   ins_compl_addfrommatch();
+                   continue;
+               }
+@@ -1336,12 +1342,14 @@ doESCkey:
+                   && ctrl_x_mode != 0
+                   && !(compl_cont_status & CONT_LOCAL))
+               goto normalchar;
  
- #ifdef FEAT_SNIFF
+ docomplete:
++          compl_busy = TRUE;
+           if (ins_complete(c) == FAIL)
+               compl_cont_status = 0;
++          compl_busy = FALSE;
+           break;
+ #endif /* FEAT_INS_EXPAND */
+       case Ctrl_Y:    /* copy from previous line or scroll down */
+       case Ctrl_E:    /* copy from next line     or scroll up */
+@@ -1439,14 +1447,13 @@ force_cindent:
+  * This is postponed until getting the next character to make '$' in the 'cpo'
+  * option work correctly.
+  * Only redraw when there are no characters available.  This speeds up
+  * inserting sequences of characters (e.g., for CTRL-R).
+  */
 -/*ARGSUSED*/
      static void
nv_sniff(cap)
--    cmdarg_T  *cap;
-+    cmdarg_T  *cap UNUSED;
ins_redraw(ready)
+-    int               ready;      /* not busy with something */
++    int               ready UNUSED;       /* not busy with something */
  {
-     ProcessSniffRequests();
- }
- #endif
-@@ -9209,14 +9271,13 @@ nv_nbcmd(cap)
-     netbeans_keycommand(cap->nchar);
- }
- #endif
+     if (!char_avail())
+     {
+ #ifdef FEAT_AUTOCMD
+       /* Trigger CursorMoved if the cursor moved.  Not when the popup menu is
+@@ -1769,11 +1776,11 @@ change_indent(type, amount, round, repla
+     {
+       /*
+        * Compute the screen column where the cursor should be.
+        */
+       vcol = get_indent() - vcol;
+-      curwin->w_virtcol = (vcol < 0) ? 0 : vcol;
++      curwin->w_virtcol = (colnr_T)((vcol < 0) ? 0 : vcol);
  
- #ifdef FEAT_DND
--/*ARGSUSED*/
-     static void
- nv_drop(cap)
--    cmdarg_T  *cap;
-+    cmdarg_T  *cap UNUSED;
- {
-     do_put('~', BACKWARD, 1L, PUT_CURSEND);
- }
- #endif
+       /*
+        * Advance the cursor until we reach the right screen column.
+        */
+       vcol = last_vcol = 0;
+@@ -1796,13 +1803,13 @@ change_indent(type, amount, round, repla
+        * May need to insert spaces to be able to position the cursor on
+        * the right screen column.
+        */
+       if (vcol != (int)curwin->w_virtcol)
+       {
+-          curwin->w_cursor.col = new_cursor_col;
++          curwin->w_cursor.col = (colnr_T)new_cursor_col;
+           i = (int)curwin->w_virtcol - vcol;
+-          ptr = alloc(i + 1);
++          ptr = alloc((unsigned)(i + 1));
+           if (ptr != NULL)
+           {
+               new_cursor_col += i;
+               ptr[i] = NUL;
+               while (--i >= 0)
+@@ -1822,11 +1829,11 @@ change_indent(type, amount, round, repla
+     curwin->w_p_list = save_p_list;
  
-@@ -9224,11 +9285,10 @@ nv_drop(cap)
- /*
-  * Trigger CursorHold event.
-  * When waiting for a character for 'updatetime' K_CURSORHOLD is put in the
-  * input buffer.  "did_cursorhold" is set to avoid retriggering.
-  */
--/*ARGSUSED*/
-     static void
- nv_cursorhold(cap)
-     cmdarg_T  *cap;
- {
-     apply_autocmds(EVENT_CURSORHOLD, NULL, NULL, FALSE, curbuf);
---- vim72.orig/src/ex_cmds2.c
-+++ vim72/src/ex_cmds2.c
-@@ -26,11 +26,12 @@ static void        cmd_source __ARGS((char_u *f
-  * script when going through the list. */
- typedef struct scriptitem_S
- {
-     char_u    *sn_name;
- # ifdef UNIX
--    int               sn_dev;
-+    int               sn_dev_valid;
-+    dev_t     sn_dev;
-     ino_t     sn_ino;
- # endif
- # ifdef FEAT_PROFILE
-     int               sn_prof_on;     /* TRUE when script is/was profiled */
-     int               sn_pr_force;    /* forceit: profile functions in this script */
-@@ -678,14 +679,13 @@ ex_breakdel(eap)
- }
+     if (new_cursor_col <= 0)
+       curwin->w_cursor.col = 0;
+     else
+-      curwin->w_cursor.col = new_cursor_col;
++      curwin->w_cursor.col = (colnr_T)new_cursor_col;
+     curwin->w_set_curswant = TRUE;
+     changed_cline_bef_curs();
  
+     /*
+      * May have to adjust the start of the insert.
+@@ -1931,26 +1938,64 @@ truncate_spaces(line)
+ #if defined(FEAT_VREPLACE) || defined(FEAT_INS_EXPAND) \
+       || defined(FEAT_COMMENTS) || defined(PROTO)
  /*
-  * ":breaklist".
+  * Backspace the cursor until the given column.  Handles REPLACE and VREPLACE
+  * modes correctly.  May also be used when not in insert mode at all.
++ * Will attempt not to go before "col" even when there is a composing
++ * character.
   */
--/*ARGSUSED*/
      void
- ex_breaklist(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ backspace_until_column(col)
+     int           col;
  {
-     struct debuggy *bp;
-     int               i;
-     if (dbg_breakp.ga_len == 0)
-@@ -1090,11 +1090,11 @@ ex_profile(eap)
-       do_profiling = PROF_YES;
-       profile_zero(&prof_wait_time);
-       set_vim_var_nr(VV_PROFILING, 1L);
-     }
-     else if (do_profiling == PROF_NONE)
--      EMSG(_("E750: First use :profile start <fname>"));
-+      EMSG(_("E750: First use \":profile start {fname}\""));
-     else if (STRCMP(eap->arg, "pause") == 0)
+     while ((int)curwin->w_cursor.col > col)
      {
-       if (do_profiling == PROF_YES)
-           profile_start(&pause_time);
-       do_profiling = PROF_PAUSED;
-@@ -1113,10 +1113,81 @@ ex_profile(eap)
-       /* The rest is similar to ":breakadd". */
-       ex_breakadd(eap);
+       curwin->w_cursor.col--;
+       if (State & REPLACE_FLAG)
+-          replace_do_bs();
+-      else
+-          (void)del_char(FALSE);
++          replace_do_bs(col);
++      else if (!del_char_after_col(col))
++          break;
      }
  }
+ #endif
  
-+/* Command line expansion for :profile. */
-+static enum
-+{
-+    PEXP_SUBCMD,      /* expand :profile sub-commands */
-+    PEXP_FUNC,                /* expand :profile func {funcname} */
-+} pexpand_what;
-+
-+static char *pexpand_cmds[] = {
-+                      "start",
-+#define PROFCMD_START 0
-+                      "pause",
-+#define PROFCMD_PAUSE 1
-+                      "continue",
-+#define PROFCMD_CONTINUE 2
-+                      "func",
-+#define PROFCMD_FUNC  3
-+                      "file",
-+#define PROFCMD_FILE  4
-+                      NULL
-+#define PROFCMD_LAST  5
-+};
-+
 +/*
-+ * Function given to ExpandGeneric() to obtain the profile command
-+ * specific expansion.
++ * Like del_char(), but make sure not to go before column "limit_col".
++ * Only matters when there are composing characters.
++ * Return TRUE when something was deleted.
 + */
-+    char_u *
-+get_profile_name(xp, idx)
-+    expand_T  *xp UNUSED;
-+    int               idx;
++   static int
++del_char_after_col(limit_col)
++    int limit_col UNUSED;
 +{
-+    switch (pexpand_what)
++#ifdef FEAT_MBYTE
++    if (enc_utf8 && limit_col >= 0)
 +    {
-+    case PEXP_SUBCMD:
-+      return (char_u *)pexpand_cmds[idx];
-+    /* case PEXP_FUNC: TODO */
-+    default:
-+      return NULL;
-+    }
-+}
-+
-+/*
-+ * Handle command line completion for :profile command.
-+ */
-+    void
-+set_context_in_profile_cmd(xp, arg)
-+    expand_T  *xp;
-+    char_u    *arg;
-+{
-+    char_u    *end_subcmd;
-+
-+    /* Default: expand subcommands. */
-+    xp->xp_context = EXPAND_PROFILE;
-+    pexpand_what = PEXP_SUBCMD;
-+    xp->xp_pattern = arg;
++      colnr_T ecol = curwin->w_cursor.col + 1;
 +
-+    end_subcmd = skiptowhite(arg);
-+    if (*end_subcmd == NUL)
-+      return;
++      /* Make sure the cursor is at the start of a character, but
++       * skip forward again when going too far back because of a
++       * composing character. */
++      mb_adjust_cursor();
++      while (curwin->w_cursor.col < (colnr_T)limit_col)
++      {
++          int l = utf_ptr2len(ml_get_cursor());
 +
-+    if (end_subcmd - arg == 5 && STRNCMP(arg, "start", 5) == 0)
-+    {
-+      xp->xp_context = EXPAND_FILES;
-+      xp->xp_pattern = skipwhite(end_subcmd);
-+      return;
++          if (l == 0)  /* end of line */
++              break;
++          curwin->w_cursor.col += l;
++      }
++      if (*ml_get_cursor() == NUL || curwin->w_cursor.col == ecol)
++          return FALSE;
++      del_bytes((long)((int)ecol - curwin->w_cursor.col), FALSE, TRUE);
 +    }
-+
-+    /* TODO: expand function names after "func" */
-+    xp->xp_context = EXPAND_NOTHING;
++    else
++#endif
++      (void)del_char(FALSE);
++    return TRUE;
 +}
 +
+ #if defined(FEAT_INS_EXPAND) || defined(PROTO)
  /*
-  * Dump the profiling info.
-  */
-     void
- profile_dump()
-@@ -1340,18 +1411,17 @@ autowrite_all()
- }
- /*
-  * return TRUE if buffer was changed and cannot be abandoned.
+  * CTRL-X pressed in Insert mode.
   */
--/*ARGSUSED*/
-     int
- check_changed(buf, checkaw, mult_win, forceit, allbuf)
-     buf_T     *buf;
-     int               checkaw;        /* do autowrite if buffer was changed */
-     int               mult_win;       /* check also when several wins for the buf */
-     int               forceit;
--    int               allbuf;         /* may write all buffers */
-+    int               allbuf UNUSED;  /* may write all buffers */
+     static void
+@@ -2117,11 +2162,11 @@ ins_compl_add_infercase(str, len, icase,
  {
-     if (       !forceit
-           && bufIsChanged(buf)
-           && (mult_win || buf->b_nwindows <= 1)
-           && (!checkaw || autowrite(buf, forceit) == FAIL))
-@@ -1757,16 +1827,15 @@ set_arglist(str)
-  * "what" == AL_ADD: add files in 'str' to the argument list after "after".
-  * "what" == AL_DEL: remove files in 'str' from the argument list.
-  *
-  * Return FAIL for failure, OK otherwise.
+     char_u    *p;
+     int               i, c;
+     int               actual_len;             /* Take multi-byte characters */
+     int               actual_compl_length;    /* into account. */
+-    int               *wca;                   /* Wide character array. */
++    int               *wca;                   /* Wide character array. */
+     int               has_lower = FALSE;
+     int               was_letter = FALSE;
+     if (p_ic && curbuf->b_p_inf && len > 0)
+     {
+@@ -2158,11 +2203,11 @@ ins_compl_add_infercase(str, len, icase,
+       else
+ #endif
+           actual_compl_length = compl_length;
+       /* Allocate wide character array for the completion and fill it. */
+-      wca = (int *)alloc(actual_len * sizeof(int));
++      wca = (int *)alloc((unsigned)(actual_len * sizeof(int)));
+       if (wca != NULL)
+       {
+           p = str;
+           for (i = 0; i < actual_len; ++i)
+ #ifdef FEAT_MBYTE
+@@ -2416,11 +2461,11 @@ ins_compl_longest_match(match)
+       compl_leader = vim_strsave(match->cp_str);
+       if (compl_leader != NULL)
+       {
+           had_match = (curwin->w_cursor.col > compl_col);
+           ins_compl_delete();
+-          ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
++          ins_bytes(compl_leader + ins_compl_len());
+           ins_redraw(FALSE);
+           /* When the match isn't there (to avoid matching itself) remove it
+            * again after redrawing. */
+           if (!had_match)
+@@ -2468,11 +2513,11 @@ ins_compl_longest_match(match)
+       {
+           /* Leader was shortened, need to change the inserted text. */
+           *p = NUL;
+           had_match = (curwin->w_cursor.col > compl_col);
+           ins_compl_delete();
+-          ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
++          ins_bytes(compl_leader + ins_compl_len());
+           ins_redraw(FALSE);
+           /* When the match isn't there (to avoid matching itself) remove it
+            * again after redrawing. */
+           if (!had_match)
+@@ -2537,25 +2582,25 @@ ins_compl_make_cyclic()
+  * "startcol" is where the matched text starts (1 is first column).
+  * "list" is the list of matches.
   */
--/*ARGSUSED*/
-     static int
- do_arglist(str, what, after)
-     char_u    *str;
--    int               what;
--    int               after;          /* 0 means before first one */
-+    int               what UNUSED;
-+    int               after UNUSED;           /* 0 means before first one */
+     void
+ set_completion(startcol, list)
+-    int           startcol;
++    colnr_T startcol;
+     list_T  *list;
  {
-     garray_T  new_ga;
-     int               exp_count;
-     char_u    **exp_files;
-     int               i;
-@@ -2130,12 +2199,12 @@ do_argfile(eap, argn)
-       /* Edit the file; always use the last known line number.
-        * When it fails (e.g. Abort for already edited file) restore the
-        * argument index. */
-       if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL,
-                     eap, ECMD_LAST,
--                    (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) +
--                                 (eap->forceit ? ECMD_FORCEIT : 0)) == FAIL)
-+                    (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0)
-+                       + (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL)
-           curwin->w_arg_idx = old_arg_idx;
-       /* like Vi: set the mark where the cursor is in the file. */
-       else if (eap->cmdidx != CMD_argdo)
-           setmark('\'');
-     }
-@@ -2496,43 +2565,44 @@ ex_compiler(eap)
-           {
-               /* ":compiler! {name}" sets local options.
-                * To remain backwards compatible "current_compiler" is always
-                * used.  A user's compiler plugin may set it, the distributed
-                * plugin will then skip the settings.  Afterwards set
--               * "b:current_compiler" and restore "current_compiler". */
--              old_cur_comp = get_var_value((char_u *)"current_compiler");
-+               * "b:current_compiler" and restore "current_compiler".
-+               * Explicitly prepend "g:" to make it work in a function. */
-+              old_cur_comp = get_var_value((char_u *)"g:current_compiler");
-               if (old_cur_comp != NULL)
-                   old_cur_comp = vim_strsave(old_cur_comp);
-               do_cmdline_cmd((char_u *)
-                             "command -nargs=* CompilerSet setlocal <args>");
-           }
--          do_unlet((char_u *)"current_compiler", TRUE);
-+          do_unlet((char_u *)"g:current_compiler", TRUE);
-           do_unlet((char_u *)"b:current_compiler", TRUE);
+     /* If already doing completions stop it. */
+     if (ctrl_x_mode != 0)
+       ins_compl_prep(' ');
+     ins_compl_clear();
  
-           sprintf((char *)buf, "compiler/%s.vim", eap->arg);
-           if (source_runtime(buf, TRUE) == FAIL)
-               EMSG2(_("E666: compiler not supported: %s"), eap->arg);
-           vim_free(buf);
+     if (stop_arrow() == FAIL)
+       return;
  
-           do_cmdline_cmd((char_u *)":delcommand CompilerSet");
+-    if (startcol > (int)curwin->w_cursor.col)
++    if (startcol > curwin->w_cursor.col)
+       startcol = curwin->w_cursor.col;
+     compl_col = startcol;
+-    compl_length = curwin->w_cursor.col - startcol;
++    compl_length = (int)curwin->w_cursor.col - (int)startcol;
+     /* compl_pattern doesn't need to be set */
+     compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length);
+     if (compl_orig_text == NULL || ins_compl_add(compl_orig_text,
+                       -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE) != OK)
+       return;
+@@ -2817,11 +2862,10 @@ ins_compl_dictionaries(dict_start, pat,
+     char_u    *ptr;
+     char_u    *buf;
+     regmatch_T        regmatch;
+     char_u    **files;
+     int               count;
+-    int               i;
+     int               save_p_scs;
+     int               dir = compl_direction;
  
-           /* Set "b:current_compiler" from "current_compiler". */
--          p = get_var_value((char_u *)"current_compiler");
-+          p = get_var_value((char_u *)"g:current_compiler");
-           if (p != NULL)
-               set_internal_string_var((char_u *)"b:current_compiler", p);
+     if (*dict == NUL)
+     {
+@@ -2849,21 +2893,22 @@ ins_compl_dictionaries(dict_start, pat,
+      * to only match at the start of a line.  Otherwise just match the
+      * pattern. Also need to double backslashes. */
+     if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
+     {
+       char_u *pat_esc = vim_strsave_escaped(pat, (char_u *)"\\");
++      size_t len;
  
-           /* Restore "current_compiler" for ":compiler {name}". */
-           if (!eap->forceit)
-           {
-               if (old_cur_comp != NULL)
-               {
--                  set_internal_string_var((char_u *)"current_compiler",
-+                  set_internal_string_var((char_u *)"g:current_compiler",
-                                                               old_cur_comp);
-                   vim_free(old_cur_comp);
-               }
-               else
--                  do_unlet((char_u *)"current_compiler", TRUE);
-+                  do_unlet((char_u *)"g:current_compiler", TRUE);
-           }
+       if (pat_esc == NULL)
+           goto theend;
+-      i = (int)STRLEN(pat_esc) + 10;
+-      ptr = alloc(i);
++      len = STRLEN(pat_esc) + 10;
++      ptr = alloc((unsigned)len);
+       if (ptr == NULL)
+       {
+           vim_free(pat_esc);
+           goto theend;
        }
+-      vim_snprintf((char *)ptr, i, "^\\s*\\zs\\V%s", pat_esc);
++      vim_snprintf((char *)ptr, len, "^\\s*\\zs\\V%s", pat_esc);
+       regmatch.regprog = vim_regcomp(ptr, RE_MAGIC);
+       vim_free(pat_esc);
+       vim_free(ptr);
      }
- }
- #endif
-@@ -2547,15 +2617,14 @@ ex_runtime(eap)
-     source_runtime(eap->arg, eap->forceit);
- }
+     else
+@@ -2950,11 +2995,11 @@ ins_compl_files(count, files, thesaurus,
+       fp = mch_fopen((char *)files[i], "r");  /* open dictionary file */
+       if (flags != DICT_EXACT)
+       {
+           vim_snprintf((char *)IObuff, IOSIZE,
+                             _("Scanning dictionary: %s"), (char *)files[i]);
+-          msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
++          (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
+       }
  
- static void source_callback __ARGS((char_u *fname, void *cookie));
+       if (fp != NULL)
+       {
+           /*
+@@ -3131,10 +3176,11 @@ ins_compl_free()
+       for (i = 0; i < CPT_COUNT; ++i)
+           vim_free(match->cp_text[i]);
+       vim_free(match);
+     } while (compl_curr_match != NULL && compl_curr_match != compl_first_match);
+     compl_first_match = compl_curr_match = NULL;
++    compl_shown_match = NULL;
+ }
  
--/*ARGSUSED*/
      static void
- source_callback(fname, cookie)
-     char_u    *fname;
--    void      *cookie;
-+    void      *cookie UNUSED;
+ ins_compl_clear()
  {
-     (void)do_source(fname, FALSE, DOSO_NONE);
+@@ -3207,11 +3253,11 @@ ins_compl_bs()
+     static void
+ ins_compl_new_leader()
+ {
+     ins_compl_del_pum();
+     ins_compl_delete();
+-    ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
++    ins_bytes(compl_leader + ins_compl_len());
+     compl_used_match = FALSE;
+     if (compl_started)
+       ins_compl_set_original_text(compl_leader);
+     else
+@@ -3262,10 +3308,24 @@ ins_compl_new_leader()
+     if (compl_match_array == NULL)
+       compl_enter_selects = FALSE;
  }
  
  /*
-@@ -2678,14 +2747,13 @@ do_in_runtimepath(name, all, callback, c
++ * Return the length of the completion, from the completion start column to
++ * the cursor column.  Making sure it never goes below zero.
++ */
++    static int
++ins_compl_len()
++{
++    int off = (int)curwin->w_cursor.col - (int)compl_col;
++
++    if (off < 0)
++      return 0;
++    return off;
++}
++
++/*
+  * Append one character to the match leader.  May reduce the number of
+  * matches.
+  */
+     static void
+ ins_compl_addleader(c)
+@@ -3290,11 +3350,11 @@ ins_compl_addleader(c)
+     if (compl_was_interrupted)
+       ins_compl_restart();
+     vim_free(compl_leader);
+     compl_leader = vim_strnsave(ml_get_curline() + compl_col,
+-                                          curwin->w_cursor.col - compl_col);
++                                   (int)(curwin->w_cursor.col - compl_col));
+     if (compl_leader != NULL)
+       ins_compl_new_leader();
+ }
  
- #if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
  /*
-  * ":options"
+@@ -3338,11 +3398,11 @@ ins_compl_set_original_text(str)
   */
--/*ARGSUSED*/
-     void
- ex_options(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+     static void
+ ins_compl_addfrommatch()
  {
-     cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
- }
+     char_u    *p;
+-    int               len = curwin->w_cursor.col - compl_col;
++    int               len = (int)curwin->w_cursor.col - (int)compl_col;
+     int               c;
+     compl_T   *cp;
+     p = compl_shown_match->cp_str;
+     if ((int)STRLEN(p) <= len)   /* the match is too short */
+@@ -3619,14 +3679,13 @@ ins_compl_prep(c)
+           /* CTRL-E means completion is Ended, go back to the typed text. */
+           if (c == Ctrl_E)
+           {
+               ins_compl_delete();
+               if (compl_leader != NULL)
+-                  ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
++                  ins_bytes(compl_leader + ins_compl_len());
+               else if (compl_first_match != NULL)
+-                  ins_bytes(compl_orig_text
+-                                        + curwin->w_cursor.col - compl_col);
++                  ins_bytes(compl_orig_text + ins_compl_len());
+               retval = TRUE;
+           }
+           auto_format(FALSE, TRUE);
+@@ -3905,11 +3964,11 @@ ins_compl_get_exp(ini)
+                       ins_buf->b_fname == NULL
+                           ? buf_spname(ins_buf)
+                           : ins_buf->b_sfname == NULL
+                               ? (char *)ins_buf->b_fname
+                               : (char *)ins_buf->b_sfname);
+-              msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
++              (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
+           }
+           else if (*e_cpt == NUL)
+               break;
+           else
+           {
+@@ -3934,12 +3993,12 @@ ins_compl_get_exp(ini)
+                   type = CTRL_X_PATH_DEFINES;
  #endif
+               else if (*e_cpt == ']' || *e_cpt == 't')
+               {
+                   type = CTRL_X_TAGS;
+-                  sprintf((char*)IObuff, _("Scanning tags."));
+-                  msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
++                  vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags."));
++                  (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
+               }
+               else
+                   type = -1;
  
-@@ -2803,24 +2871,39 @@ source_level(cookie)
- }
+               /* in any case e_cpt is advanced to the next entry */
+@@ -3987,11 +4046,11 @@ ins_compl_get_exp(ini)
+       case CTRL_X_TAGS:
+           /* set p_ic according to p_ic, p_scs and pat for find_tags(). */
+           save_p_ic = p_ic;
+           p_ic = ignorecase(compl_pattern);
+-          /* Find up to TAG_MANY matches.  Avoids that an enourmous number
++          /* Find up to TAG_MANY matches.  Avoids that an enormous number
+            * of matches is found when compl_pattern is empty */
+           if (find_tags(compl_pattern, &num_matches, &matches,
+                   TAG_REGEXP | TAG_NAMES | TAG_NOIC |
+                   TAG_INS_COMP | (ctrl_x_mode ? TAG_VERBOSE : 0),
+                   TAG_MANY, curbuf->b_ffname) == OK && num_matches > 0)
+@@ -4033,11 +4092,11 @@ ins_compl_get_exp(ini)
  #endif
  
- static char_u *get_one_sourceline __ARGS((struct source_cookie *sp));
+       case CTRL_X_SPELL:
+ #ifdef FEAT_SPELL
+           num_matches = expand_spelling(first_match_pos.lnum,
+-                               first_match_pos.col, compl_pattern, &matches);
++                                                   compl_pattern, &matches);
+           if (num_matches > 0)
+               ins_compl_add_matches(num_matches, matches, p_ic);
+ #endif
+           break;
  
--#if defined(WIN32) && defined(FEAT_CSCOPE)
-+#if (defined(WIN32) && defined(FEAT_CSCOPE)) || defined(HAVE_FD_CLOEXEC)
-+# define USE_FOPEN_NOINH
- static FILE *fopen_noinh_readbin __ARGS((char *filename));
+@@ -4158,11 +4217,11 @@ ins_compl_get_exp(ini)
+                                                                      == NULL
+                                               && (IObuff[len - 2] == '?'
+                                                || IObuff[len - 2] == '!'))))
+                                       IObuff[len++] = ' ';
+                               }
+-                              /* copy as much as posible of the new word */
++                              /* copy as much as possible of the new word */
+                               if (tmp_ptr - ptr >= IOSIZE - len)
+                                   tmp_ptr = ptr + IOSIZE - len - 1;
+                               STRNCPY(IObuff + len, ptr, tmp_ptr - ptr);
+                               len += (int)(tmp_ptr - ptr);
+                               flags |= CONT_S_IPOS;
+@@ -4185,11 +4244,11 @@ ins_compl_get_exp(ini)
+           p_scs = save_p_scs;
+           p_ws = save_p_ws;
+       }
  
- /*
-  * Special function to open a file without handle inheritance.
-+ * When possible the handle is closed on exec().
-  */
-     static FILE *
- fopen_noinh_readbin(filename)
-     char    *filename;
- {
-+# ifdef WIN32
-     int       fd_tmp = mch_open(filename, O_RDONLY | O_BINARY | O_NOINHERIT, 0);
-+# else
-+    int       fd_tmp = mch_open(filename, O_RDONLY, 0);
-+# endif
+       /* check if compl_curr_match has changed, (e.g. other type of
+-       * expansion added somenthing) */
++       * expansion added something) */
+       if (type != 0 && compl_curr_match != old_match)
+           found_new_match = OK;
  
-     if (fd_tmp == -1)
-       return NULL;
-+
-+# ifdef HAVE_FD_CLOEXEC
-+    {
-+      int fdflags = fcntl(fd_tmp, F_GETFD);
-+      if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
-+          fcntl(fd_tmp, F_SETFD, fdflags | FD_CLOEXEC);
-+    }
-+# endif
-+
-     return fdopen(fd_tmp, READBIN);
+       /* break the loop for specialized modes (use 'complete' just for the
+        * generic ctrl_x_mode == 0) or when we've found a new match */
+@@ -4254,11 +4313,11 @@ ins_compl_delete()
+ /* Insert the new text being completed. */
+     static void
+ ins_compl_insert()
+ {
+-    ins_bytes(compl_shown_match->cp_str + curwin->w_cursor.col - compl_col);
++    ins_bytes(compl_shown_match->cp_str + ins_compl_len());
+     if (compl_shown_match->cp_flags & ORIGINAL_TEXT)
+       compl_used_match = FALSE;
+     else
+       compl_used_match = TRUE;
  }
- #endif
+@@ -4423,11 +4482,11 @@ ins_compl_next(allow_get_expansion, coun
+     if (insert_match)
+     {
+       if (!compl_get_longest || compl_used_match)
+           ins_compl_insert();
+       else
+-          ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
++          ins_bytes(compl_leader + ins_compl_len());
+     }
+     else
+       compl_used_match = FALSE;
  
+     if (!allow_get_expansion)
+@@ -4623,10 +4682,11 @@ ins_complete(c)
+ {
+     char_u    *line;
+     int               startcol = 0;       /* column where searched text starts */
+     colnr_T   curs_col;           /* cursor column */
+     int               n;
++    int               save_w_wrow;
  
-@@ -2840,10 +2923,11 @@ do_source(fname, check_other, is_vimrc)
-     struct source_cookie    cookie;
-     char_u                *save_sourcing_name;
-     linenr_T              save_sourcing_lnum;
-     char_u                *p;
-     char_u                *fname_exp;
-+    char_u                *firstline = NULL;
-     int                           retval = FAIL;
- #ifdef FEAT_EVAL
-     scid_T                save_current_SID;
-     static scid_T         last_current_SID = 0;
-     void                  *save_funccalp;
-@@ -2895,11 +2979,11 @@ do_source(fname, check_other, is_vimrc)
+     compl_direction = ins_compl_key2dir(c);
+     if (!compl_started)
+     {
+       /* First time we hit ^N or ^P (in a row, I mean) */
+@@ -4686,11 +4746,11 @@ ins_complete(c)
+                   }
+                   compl_col = compl_startpos.col;
+               }
+               compl_length = curwin->w_cursor.col - (int)compl_col;
+               /* IObuff is used to add a "word from the next line" would we
+-               * have enough space?  just being paranoic */
++               * have enough space?  just being paranoid */
+ #define       MIN_SPACE 75
+               if (compl_length > (IOSIZE - MIN_SPACE))
+               {
+                   compl_cont_status &= ~CONT_SOL;
+                   compl_length = (IOSIZE - MIN_SPACE);
+@@ -4743,14 +4803,13 @@ ins_complete(c)
+           }
+           else if (compl_cont_status & CONT_ADDING)
+           {
+               char_u      *prefix = (char_u *)"\\<";
  
-     /* Apply SourcePre autocommands, they may get the file. */
-     apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
- #endif
+-              /* we need 3 extra chars, 1 for the NUL and
+-               * 2 >= strlen(prefix)  -- Acevedo */
++              /* we need up to 2 extra chars for the prefix */
+               compl_pattern = alloc(quote_meta(NULL, line + compl_col,
+-                                                         compl_length) + 3);
++                                                         compl_length) + 2);
+               if (compl_pattern == NULL)
+                   return FAIL;
+               if (!vim_iswordp(line + compl_col)
+                       || (compl_col > 0
+                           && (
+@@ -4821,11 +4880,11 @@ ins_complete(c)
+                   STRCAT((char *)compl_pattern, "\\k");
+               }
+               else
+               {
+                   compl_pattern = alloc(quote_meta(NULL, line + compl_col,
+-                                                         compl_length) + 3);
++                                                         compl_length) + 2);
+                   if (compl_pattern == NULL)
+                       return FAIL;
+                   STRCPY((char *)compl_pattern, "\\<");
+                   (void)quote_meta(compl_pattern + 2, line + compl_col,
+                                                               compl_length);
+@@ -4903,11 +4962,11 @@ ins_complete(c)
+           curwin->w_cursor = pos;     /* restore the cursor position */
  
--#if defined(WIN32) && defined(FEAT_CSCOPE)
-+#ifdef USE_FOPEN_NOINH
-     cookie.fp = fopen_noinh_readbin((char *)fname_exp);
- #else
-     cookie.fp = mch_fopen((char *)fname_exp, READBIN);
- #endif
-     if (cookie.fp == NULL && check_other)
-@@ -2916,11 +3000,11 @@ do_source(fname, check_other, is_vimrc)
-       {
-           if (*p == '_')
-               *p = '.';
-           else
-               *p = '_';
--#if defined(WIN32) && defined(FEAT_CSCOPE)
-+#ifdef USE_FOPEN_NOINH
-           cookie.fp = fopen_noinh_readbin((char *)fname_exp);
- #else
-           cookie.fp = mch_fopen((char *)fname_exp, READBIN);
- #endif
-       }
-@@ -2990,38 +3074,43 @@ do_source(fname, check_other, is_vimrc)
-     cookie.fname = fname_exp;
-     cookie.dbg_tick = debug_tick;
+           if (col < 0)
+               col = curs_col;
+           compl_col = col;
+-          if ((colnr_T)compl_col > curs_col)
++          if (compl_col > curs_col)
+               compl_col = curs_col;
  
-     cookie.level = ex_nesting_level;
- #endif
--#ifdef FEAT_MBYTE
--    cookie.conv.vc_type = CONV_NONE;          /* no conversion */
--
--    /* Try reading the first few bytes to check for a UTF-8 BOM. */
--    {
--      char_u      buf[3];
--
--      if (fread((char *)buf, sizeof(char_u), (size_t)3, cookie.fp)
--                                                                == (size_t)3
--              && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)
--          /* Found BOM, setup conversion and skip over it. */
--          convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
--      else
--          /* No BOM found, rewind. */
--          fseek(cookie.fp, 0L, SEEK_SET);
--    }
--#endif
+           /* Setup variables for completion.  Need to obtain "line" again,
+            * it may have become invalid. */
+           line = ml_get(curwin->w_cursor.lnum);
+@@ -5007,10 +5066,11 @@ ins_complete(c)
+     compl_shows_dir = compl_direction;
  
      /*
-      * Keep the sourcing name/lnum, for recursive calls.
+      * Find next match (and following matches).
       */
-     save_sourcing_name = sourcing_name;
-     sourcing_name = fname_exp;
-     save_sourcing_lnum = sourcing_lnum;
-     sourcing_lnum = 0;
++    save_w_wrow = curwin->w_wrow;
+     n = ins_compl_next(TRUE, ins_compl_key2count(c), ins_compl_use_match(c));
  
-+#ifdef FEAT_MBYTE
-+    cookie.conv.vc_type = CONV_NONE;          /* no conversion */
+     /* may undisplay the popup menu */
+     ins_compl_upd_pum();
+@@ -5160,10 +5220,16 @@ ins_complete(c)
+     if (!compl_interrupted)
+     {
+       /* RedrawingDisabled may be set when invoked through complete(). */
+       n = RedrawingDisabled;
+       RedrawingDisabled = 0;
 +
-+    /* Read the first line so we can check for a UTF-8 BOM. */
-+    firstline = getsourceline(0, (void *)&cookie, 0);
-+    if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
-+                            && firstline[1] == 0xbb && firstline[2] == 0xbf)
-+    {
-+      /* Found BOM; setup conversion, skip over BOM and recode the line. */
-+      convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
-+      p = string_convert(&cookie.conv, firstline + 3, NULL);
-+      if (p == NULL)
-+          p = vim_strsave(firstline + 3);
-+      if (p != NULL)
-+      {
-+          vim_free(firstline);
-+          firstline = p;
-+      }
-+    }
-+#endif
++      /* If the cursor moved we need to remove the pum first. */
++      setcursor();
++      if (save_w_wrow != curwin->w_wrow)
++          ins_compl_del_pum();
 +
- #ifdef STARTUPTIME
--    time_push(&tv_rel, &tv_start);
-+    if (time_fd != NULL)
-+      time_push(&tv_rel, &tv_start);
- #endif
+       ins_compl_show_pum();
+       setcursor();
+       RedrawingDisabled = n;
+     }
+     compl_was_interrupted = compl_interrupted;
+@@ -5176,19 +5242,19 @@ ins_complete(c)
+  * Looks in the first "len" chars. of "src" for search-metachars.
+  * If dest is not NULL the chars. are copied there quoting (with
+  * a backslash) the metachars, and dest would be NUL terminated.
+  * Returns the length (needed) of dest
+  */
+-    static int
++    static unsigned
+ quote_meta(dest, src, len)
+     char_u    *dest;
+     char_u    *src;
+     int               len;
+ {
+-    int       m;
++    unsigned  m = (unsigned)len + 1;  /* one extra for the NUL */
  
- #ifdef FEAT_EVAL
- # ifdef FEAT_PROFILE
-     if (do_profiling == PROF_YES)
-@@ -3047,11 +3136,11 @@ do_source(fname, check_other, is_vimrc)
-               && (
- # ifdef UNIX
-                   /* Compare dev/ino when possible, it catches symbolic
-                    * links.  Also compare file names, the inode may change
-                    * when the file was edited. */
--                  ((stat_ok && si->sn_dev != -1)
-+                  ((stat_ok && si->sn_dev_valid)
-                       && (si->sn_dev == st.st_dev
-                           && si->sn_ino == st.st_ino)) ||
- # endif
-               fnamecmp(si->sn_name, fname_exp) == 0))
-           break;
-@@ -3074,15 +3163,16 @@ do_source(fname, check_other, is_vimrc)
-       si->sn_name = fname_exp;
-       fname_exp = NULL;
- # ifdef UNIX
-       if (stat_ok)
+-    for (m = len; --len >= 0; src++)
++    for ( ; --len >= 0; src++)
+     {
+       switch (*src)
        {
-+          si->sn_dev_valid = TRUE;
-           si->sn_dev = st.st_dev;
-           si->sn_ino = st.st_ino;
+           case '.':
+           case '*':
+@@ -5498,11 +5564,11 @@ insertchar(c, flags, second_indent)
+            * was called. */
+           ins_need_undo = TRUE;
        }
-       else
--          si->sn_dev = -1;
-+          si->sn_dev_valid = FALSE;
- # endif
-       /* Allocate the local script variables to use for this script. */
-       new_script_vars(current_SID);
-     }
-@@ -3109,13 +3199,12 @@ do_source(fname, check_other, is_vimrc)
+       if (do_internal)
  #endif
+-          internal_format(textwidth, second_indent, flags, c == NUL);
++          internal_format(textwidth, second_indent, flags, c == NUL, c);
+     }
+     if (c == NUL)         /* only formatting was wanted */
+       return;
+@@ -5678,15 +5744,16 @@ insertchar(c, flags, second_indent)
+ /*
+  * Format text at the current insert position.
+  */
+     static void
+-internal_format(textwidth, second_indent, flags, format_only)
++internal_format(textwidth, second_indent, flags, format_only, c)
+     int               textwidth;
+     int               second_indent;
+     int               flags;
+     int               format_only;
++    int               c; /* character to be inserted (can be NUL) */
+ {
+     int               cc;
+     int               save_char = NUL;
+     int               haveto_redraw = FALSE;
+     int               fo_ins_blank = has_format_option(FO_INS_BLANK);
+@@ -5703,11 +5770,15 @@ internal_format(textwidth, second_indent
  
      /*
-      * Call do_cmdline, which will call getsourceline() to get the lines.
+      * When 'ai' is off we don't want a space under the cursor to be
+      * deleted.  Replace it with an 'x' temporarily.
       */
--    do_cmdline(NULL, getsourceline, (void *)&cookie,
-+    do_cmdline(firstline, getsourceline, (void *)&cookie,
-                                    DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
--
-     retval = OK;
- #ifdef FEAT_PROFILE
-     if (do_profiling == PROF_YES)
+-    if (!curbuf->b_p_ai)
++    if (!curbuf->b_p_ai
++#ifdef FEAT_VREPLACE
++          && !(State & VREPLACE_FLAG)
++#endif
++          )
      {
-@@ -3143,13 +3232,16 @@ do_source(fname, check_other, is_vimrc)
-       if (sourcing_name != NULL)
-           smsg((char_u *)_("continuing in %s"), sourcing_name);
-       verbose_leave();
-     }
- #ifdef STARTUPTIME
--    vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname);
--    time_msg(IObuff, &tv_start);
--    time_pop(&tv_rel);
-+    if (time_fd != NULL)
-+    {
-+      vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
-+      time_msg((char *)IObuff, &tv_start);
-+      time_pop(&tv_rel);
-+    }
+       cc = gchar_cursor();
+       if (vim_iswhite(cc))
+       {
+           save_char = cc;
+@@ -5729,13 +5800,15 @@ internal_format(textwidth, second_indent
+ #ifdef FEAT_VREPLACE
+       int     orig_col = 0;
+       char_u  *saved_text = NULL;
  #endif
+       colnr_T col;
++      colnr_T end_col;
  
- #ifdef FEAT_EVAL
-     /*
-      * After a "finish" in debug mode, need to break at first command of next
-@@ -3169,10 +3261,11 @@ almosttheend:
-       prof_child_exit(&wait_start);           /* leaving a child now */
- # endif
- #endif
-     fclose(cookie.fp);
-     vim_free(cookie.nextline);
-+    vim_free(firstline);
- #ifdef FEAT_MBYTE
-     convert_setup(&cookie.conv, NULL, NULL);
+-      virtcol = get_nolist_virtcol();
+-      if (virtcol < (colnr_T)textwidth)
++      virtcol = get_nolist_virtcol()
++              + char2cells(c != NUL ? c : gchar_cursor());
++      if (virtcol <= (colnr_T)textwidth)
+           break;
+ #ifdef FEAT_COMMENTS
+       if (no_leader)
+           do_comments = FALSE;
+@@ -5760,42 +5833,37 @@ internal_format(textwidth, second_indent
+ #ifdef FEAT_COMMENTS
+               && leader_len == 0
  #endif
+               && !has_format_option(FO_WRAP))
  
- theend:
-@@ -3183,14 +3276,13 @@ theend:
- #if defined(FEAT_EVAL) || defined(PROTO)
+-      {
+-          textwidth = 0;
+           break;
+-      }
+       if ((startcol = curwin->w_cursor.col) == 0)
+           break;
  
- /*
-  * ":scriptnames"
-  */
--/*ARGSUSED*/
-     void
- ex_scriptnames(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     int i;
+       /* find column of textwidth border */
+       coladvance((colnr_T)textwidth);
+       wantcol = curwin->w_cursor.col;
  
-     for (i = 1; i <= script_items.ga_len && !got_int; ++i)
-       if (SCRIPT_ITEM(i).sn_name != NULL)
-@@ -3310,16 +3402,15 @@ fgets_cr(s, n, stream)
-  * Called by do_cmdline() when it's called from do_source().
-  *
-  * Return a pointer to the line in allocated memory.
-  * Return NULL for end-of-file or some error.
-  */
--/* ARGSUSED */
-     char_u *
- getsourceline(c, cookie, indent)
--    int               c;              /* not used */
-+    int               c UNUSED;
-     void      *cookie;
--    int               indent;         /* not used */
-+    int               indent UNUSED;
- {
-     struct source_cookie *sp = (struct source_cookie *)cookie;
-     char_u            *line;
-     char_u            *p, *s;
-@@ -3366,11 +3457,11 @@ getsourceline(c, cookie, indent)
-           if (sp->nextline == NULL)
-               break;
-           p = skipwhite(sp->nextline);
-           if (*p != '\\')
-               break;
--          s = alloc((int)(STRLEN(line) + STRLEN(p)));
-+          s = alloc((unsigned)(STRLEN(line) + STRLEN(p)));
-           if (s == NULL)      /* out of memory */
-               break;
-           STRCPY(s, line);
-           STRCAT(s, p + 1);
-           vim_free(line);
-@@ -3642,14 +3733,13 @@ script_line_end()
+-      curwin->w_cursor.col = startcol - 1;
+-#ifdef FEAT_MBYTE
+-      /* Correct cursor for multi-byte character. */
+-      if (has_mbyte)
+-          mb_adjust_cursor();
+-#endif
++      curwin->w_cursor.col = startcol;
+       foundcol = 0;
  
- /*
-  * ":scriptencoding": Set encoding conversion for a sourced script.
-  * Without the multi-byte feature it's simply ignored.
-  */
--/*ARGSUSED*/
-     void
- ex_scriptencoding(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
- #ifdef FEAT_MBYTE
-     struct source_cookie      *sp;
-     char_u                    *name;
+       /*
+        * Find position to break at.
+        * Stop at first entered white when 'formatoptions' has 'v'
+        */
+       while ((!fo_ins_blank && !has_format_option(FO_INS_VI))
+                   || curwin->w_cursor.lnum != Insstart.lnum
+                   || curwin->w_cursor.col >= Insstart.col)
+       {
+-          cc = gchar_cursor();
++          if (curwin->w_cursor.col == startcol && c != NUL)
++              cc = c;
++          else
++              cc = gchar_cursor();
+           if (WHITECHAR(cc))
+           {
+               /* remember position of blank just before text */
+-              end_foundcol = curwin->w_cursor.col;
++              end_col = curwin->w_cursor.col;
  
-@@ -4094,14 +4184,13 @@ ex_language(eap)
- # if defined(FEAT_CMDL_COMPL) || defined(PROTO)
- /*
-  * Function given to ExpandGeneric() to obtain the possible arguments of the
-  * ":language" command.
-  */
--/*ARGSUSED*/
-     char_u *
- get_lang_arg(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
- {
-     if (idx == 0)
-       return (char_u *)"messages";
-     if (idx == 1)
---- vim72.orig/src/ui.c
-+++ vim72/src/ui.c
-@@ -318,14 +318,13 @@ ui_get_shellsize()
- /*
-  * Set the size of the Vim shell according to Rows and Columns, if possible.
-  * The gui_set_shellsize() or mch_set_shellsize() function will try to set the
-  * new size.  If this is not possible, it will adjust Rows and Columns.
-  */
--/*ARGSUSED*/
-     void
- ui_set_shellsize(mustset)
--    int               mustset;        /* set by the user */
-+    int               mustset UNUSED; /* set by the user */
- {
- #ifdef FEAT_GUI
-     if (gui.in_use)
-       gui_set_shellsize(mustset,
- # ifdef WIN3264
-@@ -1125,14 +1124,13 @@ clip_invert_rectangle(row, col, height,
- /*
-  * Copy the currently selected area into the '*' register so it will be
-  * available for pasting.
-  * When "both" is TRUE also copy to the '+' register.
-  */
--/*ARGSUSED*/
-     void
- clip_copy_modeless_selection(both)
--    int               both;
-+    int               both UNUSED;
- {
-     char_u    *buffer;
-     char_u    *bufp;
-     int               row;
-     int               start_col;
-@@ -1699,14 +1697,13 @@ read_from_input_buf(buf, maxlen)
-     if (inbufcount)
-       mch_memmove(inbuf, inbuf + maxlen, (size_t)inbufcount);
-     return (int)maxlen;
- }
+               /* find start of sequence of blanks */
+               while (curwin->w_cursor.col > 0 && WHITECHAR(cc))
+               {
+                   dec_cursor();
+@@ -5811,39 +5879,77 @@ internal_format(textwidth, second_indent
+               if (has_format_option(FO_ONE_LETTER))
+               {
+                   /* do not break after one-letter words */
+                   if (curwin->w_cursor.col == 0)
+                       break;  /* one-letter word at begin */
+-
++#ifdef FEAT_COMMENTS
++                  /* do not break "#a b" when 'tw' is 2 */
++                  if (curwin->w_cursor.col <= leader_len)
++                      break;
++#endif
+                   col = curwin->w_cursor.col;
+                   dec_cursor();
+                   cc = gchar_cursor();
  
--/*ARGSUSED*/
-     void
- fill_input_buf(exit_on_error)
--    int       exit_on_error;
-+    int       exit_on_error UNUSED;
- {
- #if defined(UNIX) || defined(OS2) || defined(VMS) || defined(MACOS_X_UNIX)
-     int               len;
-     int               try;
-     static int        did_read_something = FALSE;
-@@ -1818,11 +1815,11 @@ fill_input_buf(exit_on_error)
-            * what it was. */
-           settmode(TMODE_COOK);
- #ifdef HAVE_DUP
-           /* Use stderr for stdin, also works for shell commands. */
-           close(0);
--          dup(2);
-+          ignored = dup(2);
- #else
-           read_cmd_fd = 2;    /* read from stderr instead of stdin */
+                   if (WHITECHAR(cc))
+                       continue;       /* one-letter, continue */
+                   curwin->w_cursor.col = col;
+               }
+-#ifdef FEAT_MBYTE
+-              if (has_mbyte)
+-                  foundcol = curwin->w_cursor.col
+-                                       + (*mb_ptr2len)(ml_get_cursor());
+-              else
+-#endif
+-                  foundcol = curwin->w_cursor.col + 1;
+-              if (curwin->w_cursor.col < (colnr_T)wantcol)
++
++              inc_cursor();
++
++              end_foundcol = end_col + 1;
++              foundcol = curwin->w_cursor.col;
++              if (curwin->w_cursor.col <= (colnr_T)wantcol)
+                   break;
+           }
+ #ifdef FEAT_MBYTE
+-          else if (cc >= 0x100 && fo_multibyte
+-                            && curwin->w_cursor.col <= (colnr_T)wantcol)
++          else if (cc >= 0x100 && fo_multibyte)
+           {
+               /* Break after or before a multi-byte character. */
++              if (curwin->w_cursor.col != startcol)
++              {
++#ifdef FEAT_COMMENTS
++                  /* Don't break until after the comment leader */
++                  if (curwin->w_cursor.col < leader_len)
++                      break;
++#endif
++                  col = curwin->w_cursor.col;
++                  inc_cursor();
++                  /* Don't change end_foundcol if already set. */
++                  if (foundcol != curwin->w_cursor.col)
++                  {
++                      foundcol = curwin->w_cursor.col;
++                      end_foundcol = foundcol;
++                      if (curwin->w_cursor.col <= (colnr_T)wantcol)
++                          break;
++                  }
++                  curwin->w_cursor.col = col;
++              }
++
++              if (curwin->w_cursor.col == 0)
++                  break;
++
++              col = curwin->w_cursor.col;
++
++              dec_cursor();
++              cc = gchar_cursor();
++
++              if (WHITECHAR(cc))
++                  continue;           /* break with space */
++#ifdef FEAT_COMMENTS
++              /* Don't break until after the comment leader */
++              if (curwin->w_cursor.col < leader_len)
++                  break;
++#endif
++
++              curwin->w_cursor.col = col;
++
+               foundcol = curwin->w_cursor.col;
+-              if (curwin->w_cursor.col < (colnr_T)wantcol)
+-                  foundcol += (*mb_char2len)(cc);
+               end_foundcol = foundcol;
+-              break;
++              if (curwin->w_cursor.col <= (colnr_T)wantcol)
++                  break;
+           }
  #endif
-           settmode(m);
-       }
-@@ -1990,15 +1987,14 @@ x11_setup_atoms(dpy)
-  * X Selection stuff, for cutting and pasting text to other windows.
-  */
+           if (curwin->w_cursor.col == 0)
+               break;
+           dec_cursor();
+@@ -5866,18 +5972,19 @@ internal_format(textwidth, second_indent
+ #ifdef FEAT_VREPLACE
+       if (State & VREPLACE_FLAG)
+           orig_col = startcol;        /* Will start backspacing from here */
+       else
+ #endif
+-          replace_offset = startcol - end_foundcol - 1;
++          replace_offset = startcol - end_foundcol;
  
- static void  clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *));
+       /*
+        * adjust startcol for spaces that will be deleted and
+        * characters that will remain on top line
+        */
+       curwin->w_cursor.col = foundcol;
+-      while (cc = gchar_cursor(), WHITECHAR(cc))
++      while ((cc = gchar_cursor(), WHITECHAR(cc))
++                  && (!fo_white_par || curwin->w_cursor.col < startcol))
+           inc_cursor();
+       startcol -= curwin->w_cursor.col;
+       if (startcol < 0)
+           startcol = 0;
  
--/* ARGSUSED */
-     static void
- clip_x11_request_selection_cb(w, success, sel_atom, type, value, length,
-                             format)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer success;
-     Atom      *sel_atom;
-     Atom      *type;
-     XtPointer value;
-     long_u    *length;
-@@ -2018,11 +2014,11 @@ clip_x11_request_selection_cb(w, success
-     else
-       cbd = &clip_star;
+@@ -6013,11 +6120,11 @@ auto_format(trailblank, prev_line)
+     /* Don't format in Insert mode when the cursor is on a trailing blank, the
+      * user might insert normal text next.  Also skip formatting when "1" is
+      * in 'formatoptions' and there is a single character before the cursor.
+      * Otherwise the line would be broken and when typing another non-white
+      * next they are not joined back together. */
+-    wasatend = (pos.col == STRLEN(old));
++    wasatend = (pos.col == (colnr_T)STRLEN(old));
+     if (*old != NUL && !trailblank && wasatend)
+     {
+       dec_cursor();
+       cc = gchar_cursor();
+       if (!WHITECHAR(cc) && curwin->w_cursor.col > 0
+@@ -6190,11 +6297,11 @@ redo_literal(c)
  
-     if (value == NULL || *length == 0)
+     /* Only digits need special treatment.  Translate them into a string of
+      * three digits. */
+     if (VIM_ISDIGIT(c))
      {
--      clip_free_selection(cbd);       /* ???  [what's the query?] */
-+      clip_free_selection(cbd);       /* nothing received, clear register */
-       *(int *)success = FALSE;
-       return;
+-      sprintf((char *)buf, "%03d", c);
++      vim_snprintf((char *)buf, sizeof(buf), "%03d", c);
+       AppendToRedobuff(buf);
      }
-     motion_type = MCHAR;
-     p = (char_u *)value;
-@@ -2074,11 +2070,11 @@ clip_x11_request_selection_cb(w, success
-       int             status;
-       text_prop.value = (unsigned char *)value;
-       text_prop.encoding = *type;
-       text_prop.format = *format;
--      text_prop.nitems = STRLEN(value);
-+      text_prop.nitems = len;
-       status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
-                                                        &text_list, &n_text);
-       if (status != Success || n_text < 1)
+     else
+       AppendCharToRedobuff(c);
+ }
+@@ -6264,11 +6371,11 @@ stop_arrow()
        {
-           *(int *)success = FALSE;
-@@ -2106,12 +2102,12 @@ clip_x11_request_selection(myShell, dpy,
- {
-     XEvent    event;
-     Atom      type;
-     static int        success;
-     int               i;
--    int               nbytes = 0;
--    char_u    *buffer;
-+    time_t    start_time;
-+    int               timed_out = FALSE;
-     for (i =
- #ifdef FEAT_MBYTE
-           0
- #else
-@@ -2127,10 +2123,11 @@ clip_x11_request_selection(myShell, dpy,
-           case 1:  type = vim_atom;           break;
-           case 2:  type = compound_text_atom; break;
-           case 3:  type = text_atom;          break;
-           default: type = XA_STRING;
+           arrow_used = FALSE;
+           ins_need_undo = FALSE;
        }
-+      success = MAYBE;
-       XtGetSelectionValue(myShell, cbd->sel_atom, type,
-           clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
-       /* Make sure the request for the selection goes out before waiting for
-        * a response. */
-@@ -2139,51 +2136,63 @@ clip_x11_request_selection(myShell, dpy,
-       /*
-        * Wait for result of selection request, otherwise if we type more
-        * characters, then they will appear before the one that requested the
-        * paste!  Don't worry, we will catch up with any other events later.
-        */
--      for (;;)
-+      start_time = time(NULL);
-+      while (success == MAYBE)
+       Insstart = curwin->w_cursor;    /* new insertion starts here */
+-      Insstart_textlen = linetabsize(ml_get_curline());
++      Insstart_textlen = (colnr_T)linetabsize(ml_get_curline());
+       ai_col = 0;
+ #ifdef FEAT_VREPLACE
+       if (State & VREPLACE_FLAG)
        {
--          if (XCheckTypedEvent(dpy, SelectionNotify, &event))
--              break;
--          if (XCheckTypedEvent(dpy, SelectionRequest, &event))
--              /* We may get a SelectionRequest here and if we don't handle
--               * it we hang.  KDE klipper does this, for example. */
-+          if (XCheckTypedEvent(dpy, SelectionNotify, &event)
-+                  || XCheckTypedEvent(dpy, SelectionRequest, &event)
-+                  || XCheckTypedEvent(dpy, PropertyNotify, &event))
-+          {
-+              /* This is where clip_x11_request_selection_cb() should be
-+               * called.  It may actually happen a bit later, so we loop
-+               * until "success" changes.
-+               * We may get a SelectionRequest here and if we don't handle
-+               * it we hang.  KDE klipper does this, for example.
-+               * We need to handle a PropertyNotify for large selections. */
-               XtDispatchEvent(&event);
-+              continue;
-+          }
-+
-+          /* Time out after 2 to 3 seconds to avoid that we hang when the
-+           * other process doesn't respond.  Note that the SelectionNotify
-+           * event may still come later when the selection owner comes back
-+           * to life and the text gets inserted unexpectedly.  Don't know
-+           * why that happens or how to avoid that :-(. */
-+          if (time(NULL) > start_time + 2)
-+          {
-+              timed_out = TRUE;
-+              break;
-+          }
+           orig_line_count = curbuf->b_ml.ml_line_count;
+@@ -6367,25 +6474,30 @@ stop_insert(end_insert_pos, esc)
+       /* If a space was inserted for auto-formatting, remove it now. */
+       check_auto_format(TRUE);
  
-           /* Do we need this?  Probably not. */
-           XSync(dpy, False);
+       /* If we just did an auto-indent, remove the white space from the end
+        * of the line, and put the cursor back.
+-       * Do this when ESC was used or moving the cursor up/down. */
++       * Do this when ESC was used or moving the cursor up/down.
++       * Check for the old position still being valid, just in case the text
++       * got changed unexpectedly. */
+       if (did_ai && (esc || (vim_strchr(p_cpo, CPO_INDENT) == NULL
+-                      && curwin->w_cursor.lnum != end_insert_pos->lnum)))
++                      && curwin->w_cursor.lnum != end_insert_pos->lnum))
++              && end_insert_pos->lnum <= curbuf->b_ml.ml_line_count)
+       {
+           pos_T       tpos = curwin->w_cursor;
  
--          /* Bernhard Walle solved a slow paste response in an X terminal by
--           * adding: usleep(10000); here. */
-+          /* Wait for 1 msec to avoid that we eat up all CPU time. */
-+          ui_delay(1L, TRUE);
+           curwin->w_cursor = *end_insert_pos;
++          check_cursor_col();  /* make sure it is not past the line */
+           for (;;)
+           {
+               if (gchar_cursor() == NUL && curwin->w_cursor.col > 0)
+                   --curwin->w_cursor.col;
+               cc = gchar_cursor();
+               if (!vim_iswhite(cc))
+                   break;
+-              (void)del_char(TRUE);
++              if (del_char(TRUE) == FAIL)
++                  break;  /* should not happen */
+           }
+           if (curwin->w_cursor.lnum != tpos.lnum)
+               curwin->w_cursor = tpos;
+           else if (cc != NUL)
+               ++curwin->w_cursor.col; /* put cursor back on the NUL */
+@@ -6393,14 +6505,15 @@ stop_insert(end_insert_pos, esc)
+ #ifdef FEAT_VISUAL
+           /* <C-S-Right> may have started Visual mode, adjust the position for
+            * deleted characters. */
+           if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum)
+           {
+-              cc = (int)STRLEN(ml_get_curline());
+-              if (VIsual.col > (colnr_T)cc)
++              int len = (int)STRLEN(ml_get_curline());
++
++              if (VIsual.col > len)
+               {
+-                  VIsual.col = cc;
++                  VIsual.col = len;
+ # ifdef FEAT_VIRTUALEDIT
+                   VIsual.coladd = 0;
+ # endif
+               }
+           }
+@@ -7121,13 +7234,16 @@ replace_flush()
+  * Handle doing a BS for one character.
+  * cc < 0: replace stack empty, just move cursor
+  * cc == 0: character was inserted, delete it
+  * cc > 0: character was replaced, put cc (first byte of original char) back
+  * and check for more characters to be put back
++ * When "limit_col" is >= 0, don't delete before this column.  Matters when
++ * using composing characters, use del_char_after_col() instead of del_char().
+  */
+     static void
+-replace_do_bs()
++replace_do_bs(limit_col)
++    int               limit_col;
+ {
+     int               cc;
+ #ifdef FEAT_VREPLACE
+     int               orig_len = 0;
+     int               ins_len;
+@@ -7151,11 +7267,11 @@ replace_do_bs()
        }
+ #endif
+ #ifdef FEAT_MBYTE
+       if (has_mbyte)
+       {
+-          del_char(FALSE);
++          (void)del_char_after_col(limit_col);
+ # ifdef FEAT_VREPLACE
+           if (State & VREPLACE_FLAG)
+               orig_len = (int)STRLEN(ml_get_cursor());
+ # endif
+           replace_push(cc);
+@@ -7201,11 +7317,11 @@ replace_do_bs()
  
--      /* this is where clip_x11_request_selection_cb() is actually called */
--      XtDispatchEvent(&event);
--
--      if (success)
-+      if (success == TRUE)
-           return;
-+
-+      /* don't do a retry with another type after timing out, otherwise we
-+       * hang for 15 seconds. */
-+      if (timed_out)
-+          break;
+       /* mark the buffer as changed and prepare for displaying */
+       changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
      }
-     /* Final fallback position - use the X CUT_BUFFER0 store */
--    buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0);
--    if (nbytes > 0)
--    {
--      /* Got something */
--      clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
--      XFree((void *)buffer);
--      if (p_verbose > 0)
--          verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection"));
--    }
-+    yank_cut_buffer0(dpy, cbd);
+     else if (cc == 0)
+-      (void)del_char(FALSE);
++      (void)del_char_after_col(limit_col);
  }
  
- static Boolean        clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *));
+ #ifdef FEAT_CINDENT
+ /*
+  * Return TRUE if C-indenting is on.
+@@ -7284,10 +7400,14 @@ in_cinkeys(keytyped, when, line_is_empty
+     char_u    *p;
+     char_u    *line;
+     int               icase;
+     int               i;
  
--/* ARGSUSED */
-     static Boolean
- clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format)
--    Widget    w;
-+    Widget    w UNUSED;
-     Atom      *sel_atom;
-     Atom      *target;
-     Atom      *type;
-     XtPointer *value;
-     long_u    *length;
-@@ -2306,14 +2315,13 @@ clip_x11_convert_selection_cb(w, sel_ato
-     return True;
- }
++    if (keytyped == NUL)
++      /* Can happen with CTRL-Y and CTRL-E on a short line. */
++      return FALSE;
++
+ #ifdef FEAT_EVAL
+     if (*curbuf->b_p_inde != NUL)
+       look = curbuf->b_p_indk;        /* 'indentexpr' set: use 'indentkeys' */
+     else
+ #endif
+@@ -7644,24 +7764,20 @@ ins_reg()
+      * Don't map the register name. This also prevents the mode message to be
+      * deleted when ESC is hit.
+      */
+     ++no_mapping;
+     regname = plain_vgetc();
+-#ifdef FEAT_LANGMAP
+     LANGMAP_ADJUST(regname, TRUE);
+-#endif
+     if (regname == Ctrl_R || regname == Ctrl_O || regname == Ctrl_P)
+     {
+       /* Get a third key for literal register insertion */
+       literally = regname;
+ #ifdef FEAT_CMDL_INFO
+       add_to_showcmd_c(literally);
+ #endif
+       regname = plain_vgetc();
+-#ifdef FEAT_LANGMAP
+       LANGMAP_ADJUST(regname, TRUE);
+-#endif
+     }
+     --no_mapping;
  
- static void  clip_x11_lose_ownership_cb __ARGS((Widget, Atom *));
+ #ifdef FEAT_EVAL
+     /*
+@@ -8148,11 +8264,11 @@ ins_ctrl_o()
+ }
  
--/* ARGSUSED */
+ /*
+  * If the cursor is on an indent, ^T/^D insert/delete one
+  * shiftwidth.        Otherwise ^T/^D behave like a "<<" or ">>".
+- * Always round the indent to 'shiftwith', this is compatible
++ * Always round the indent to 'shiftwidth', this is compatible
+  * with vi.  But vi only supports ^T and ^D after an
+  * autoindent, we support it everywhere.
+  */
      static void
- clip_x11_lose_ownership_cb(w, sel_atom)
--    Widget  w;
-+    Widget  w UNUSED;
-     Atom    *sel_atom;
- {
-     if (*sel_atom == clip_plus.sel_atom)
-       clip_lose_selection(&clip_plus);
+ ins_shift(c, lastc)
+@@ -8237,11 +8353,11 @@ ins_bs_one(vcolp)
+     {
+       /* Don't delete characters before the insert point when in
+        * Replace mode */
+       if (curwin->w_cursor.lnum != Insstart.lnum
+               || curwin->w_cursor.col >= Insstart.col)
+-          replace_do_bs();
++          replace_do_bs(-1);
+     }
      else
-@@ -2342,18 +2350,71 @@ clip_x11_own_selection(myShell, cbd)
+       (void)del_char(FALSE);
+ }
  
- /*
-  * Send the current selection to the clipboard.  Do nothing for X because we
-  * will fill in the selection only when requested by another app.
-  */
--/*ARGSUSED*/
-     void
- clip_x11_set_selection(cbd)
--    VimClipboard *cbd;
-+    VimClipboard *cbd UNUSED;
+@@ -8256,10 +8372,11 @@ ins_bs(c, mode, inserted_space_p)
+     int               *inserted_space_p;
  {
- }
+     linenr_T  lnum;
+     int               cc;
+     int               temp = 0;           /* init for GCC */
++    colnr_T   save_col;
+     colnr_T   mincol;
+     int               did_backspace = FALSE;
+     int               in_indent;
+     int               oldState;
+ #ifdef FEAT_MBYTE
+@@ -8413,17 +8530,17 @@ ins_bs(c, mode, inserted_space_p)
+               /*
+                * restore characters (blanks) deleted after cursor
+                */
+               while (cc > 0)
+               {
+-                  temp = curwin->w_cursor.col;
++                  save_col = curwin->w_cursor.col;
+ #ifdef FEAT_MBYTE
+                   mb_replace_pop_ins(cc);
+ #else
+                   ins_char(cc);
+ #endif
+-                  curwin->w_cursor.col = temp;
++                  curwin->w_cursor.col = save_col;
+                   cc = replace_pop();
+               }
+               /* restore the characters that NL replaced */
+               replace_pop_ins();
+               State = oldState;
+@@ -8443,23 +8560,23 @@ ins_bs(c, mode, inserted_space_p)
+       mincol = 0;
+                                               /* keep indent */
+       if (mode == BACKSPACE_LINE
+               && (curbuf->b_p_ai
+ #ifdef FEAT_CINDENT
+-                    || cindent_on()
++                  || cindent_on()
  #endif
+                  )
+ #ifdef FEAT_RIGHTLEFT
+               && !revins_on
+ #endif
+                           )
+       {
+-          temp = curwin->w_cursor.col;
++          save_col = curwin->w_cursor.col;
+           beginline(BL_WHITE);
+-          if (curwin->w_cursor.col < (colnr_T)temp)
++          if (curwin->w_cursor.col < save_col)
+               mincol = curwin->w_cursor.col;
+-          curwin->w_cursor.col = temp;
++          curwin->w_cursor.col = save_col;
+       }
  
-+#if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11) \
-+    || defined(FEAT_GUI_GTK) || defined(PROTO)
-+/*
-+ * Get the contents of the X CUT_BUFFER0 and put it in "cbd".
-+ */
-+    void
-+yank_cut_buffer0(dpy, cbd)
-+    Display           *dpy;
-+    VimClipboard      *cbd;
-+{
-+    int               nbytes = 0;
-+    char_u    *buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0);
-+
-+    if (nbytes > 0)
-+    {
-+#ifdef FEAT_MBYTE
-+      int  done = FALSE;
-+
-+      /* CUT_BUFFER0 is supposed to be always latin1.  Convert to 'enc' when
-+       * using a multi-byte encoding.  Conversion between two 8-bit
-+       * character sets usually fails and the text might actually be in
-+       * 'enc' anyway. */
-+      if (has_mbyte)
-+      {
-+          char_u      *conv_buf;
-+          vimconv_T   vc;
-+
-+          vc.vc_type = CONV_NONE;
-+          if (convert_setup(&vc, (char_u *)"latin1", p_enc) == OK)
-+          {
-+              conv_buf = string_convert(&vc, buffer, &nbytes);
-+              if (conv_buf != NULL)
-+              {
-+                  clip_yank_selection(MCHAR, conv_buf, (long)nbytes, cbd);
-+                  vim_free(conv_buf);
-+                  done = TRUE;
-+              }
-+              convert_setup(&vc, NULL, NULL);
-+          }
-+      }
-+      if (!done)  /* use the text without conversion */
-+#endif
-+          clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
-+      XFree((void *)buffer);
-+      if (p_verbose > 0)
-+      {
-+          verbose_enter();
-+          verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection"));
-+          verbose_leave();
-+      }
-+    }
-+}
+       /*
+        * Handle deleting one 'shiftwidth' or 'softtabstop'.
+        */
+@@ -8554,11 +8671,11 @@ ins_bs(c, mode, inserted_space_p)
+                   dec_cursor();
+ #endif
+               break;
+           }
+           if (State & REPLACE_FLAG)
+-              replace_do_bs();
++              replace_do_bs(-1);
+           else
+           {
+ #ifdef FEAT_MBYTE
+               if (enc_utf8 && p_deco)
+                   (void)utfc_ptr2char(ml_get_cursor(), cpc);
+@@ -8929,11 +9046,14 @@ ins_right()
+ #ifdef FEAT_FOLDING
+     if ((fdo_flags & FDO_HOR) && KeyTyped)
+       foldOpenCursor();
+ #endif
+     undisplay_dollar();
+-    if (gchar_cursor() != NUL || virtual_active()
++    if (gchar_cursor() != NUL
++#ifdef FEAT_VIRTUALEDIT
++          || virtual_active()
 +#endif
+           )
+     {
+       start_arrow(&curwin->w_cursor);
+       curwin->w_set_curswant = TRUE;
+ #ifdef FEAT_VIRTUALEDIT
+--- vim72.orig/src/eval.c
++++ vim72/src/eval.c
+@@ -30,10 +30,13 @@
+ # include <math.h>
+ #endif
+ #define DICT_MAXNEST 100      /* maximum nesting of lists and dicts */
++#define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not
++                                 be freed. */
 +
- #if defined(FEAT_MOUSE) || defined(PROTO)
+ /*
+  * In a hashtab item "hi_key" points to "di_key" in a dictitem.
+  * This avoids adding a pointer to the hashtab item.
+  * DI2HIKEY() converts a dictitem pointer to a hashitem key pointer.
+  * HIKEY2DI() converts a hashitem key pointer to a dictitem pointer.
+@@ -124,12 +127,15 @@ static dictitem_T        globvars_var;
+ static hashtab_T      compat_hashtab;
  
  /*
-  * Move the cursor to the specified row and column on the screen.
-  * Change current window if necessary.        Returns an integer with the
-@@ -2535,18 +2596,11 @@ retnomove:
- #endif
- #ifdef FEAT_CMDWIN
-       if (cmdwin_type != 0 && wp != curwin)
-       {
-           /* A click outside the command-line window: Use modeless
--           * selection if possible.  Allow dragging the status line of
--           * windows just above the command-line window. */
--          if (wp->w_winrow + wp->w_height
--                     != curwin->w_prev->w_winrow + curwin->w_prev->w_height)
--          {
--              on_status_line = 0;
--              dragwin = NULL;
--          }
-+           * selection if possible.  Allow dragging the status lines. */
- # ifdef FEAT_VERTSPLIT
-           on_sep_line = 0;
- # endif
- # ifdef FEAT_CLIPBOARD
-           if (on_status_line)
-@@ -2896,15 +2950,14 @@ mouse_comp_pos(win, rowp, colp, lnump)
- #if defined(FEAT_WINDOWS) || defined(PROTO)
+  * When recursively copying lists and dicts we need to remember which ones we
+  * have done to avoid endless recursiveness.  This unique ID is used for that.
++ * The last bit is used for previous_funccal, ignored when comparing.
+  */
+ static int current_copyID = 0;
++#define COPYID_INC 2
++#define COPYID_MASK (~0x1)
  /*
-  * Find the window at screen position "*rowp" and "*colp".  The positions are
-  * updated to become relative to the top-left of the window.
+  * Array to hold the hashtab with variables local to each sourced script.
+  * Each item holds a variable (nameless) that points to the dict_T.
   */
--/*ARGSUSED*/
-     win_T *
- mouse_find_win(rowp, colp)
-     int               *rowp;
--    int               *colp;
-+    int               *colp UNUSED;
- {
-     frame_T   *fp;
+@@ -278,11 +284,11 @@ typedef struct
+ /* values for vv_flags: */
+ #define VV_COMPAT     1       /* compatible, also used without "v:" */
+ #define VV_RO         2       /* read-only */
+ #define VV_RO_SBX     4       /* read-only in the sandbox */
  
-     fp = topframe;
-     *rowp -= firstwin->w_winrow;
-@@ -2993,22 +3046,21 @@ vcol2col(wp, lnum, vcol)
-     win_T     *wp;
-     linenr_T  lnum;
-     int               vcol;
+-#define VV_NAME(s, t) s, {{t}}, {0}
++#define VV_NAME(s, t) s, {{t, 0, {0}}, 0, {0}}, {0}
+ static struct vimvar
  {
-     /* try to advance to the specified column */
--    int               col = 0;
-     int               count = 0;
-     char_u    *ptr;
-+    char_u    *start;
+     char      *vv_name;       /* name of variable, without v: */
+     dictitem_T        vv_di;          /* value and name for key */
+@@ -346,17 +352,19 @@ static struct vimvar
+     {VV_NAME("mouse_win",      VAR_NUMBER), 0},
+     {VV_NAME("mouse_lnum",     VAR_NUMBER), 0},
+     {VV_NAME("mouse_col",      VAR_NUMBER), 0},
+     {VV_NAME("operator",       VAR_STRING), VV_RO},
+     {VV_NAME("searchforward",  VAR_NUMBER), 0},
++    {VV_NAME("oldfiles",       VAR_LIST), 0},
+ };
  
--    ptr = ml_get_buf(wp->w_buffer, lnum, FALSE);
-+    start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE);
-     while (count <= vcol && *ptr != NUL)
+ /* shorthand */
+ #define vv_type               vv_di.di_tv.v_type
+ #define vv_nr         vv_di.di_tv.vval.v_number
+ #define vv_float      vv_di.di_tv.vval.v_float
+ #define vv_str                vv_di.di_tv.vval.v_string
++#define vv_list               vv_di.di_tv.vval.v_list
+ #define vv_tv         vv_di.di_tv
+ /*
+  * The v: variables are stored in dictionary "vimvardict".
+  * "vimvars_var" is the variable that is used for the "l:" scope.
+@@ -423,31 +431,27 @@ static int dict_equal __ARGS((dict_T *d1
+ static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic));
+ static listitem_T *list_find __ARGS((list_T *l, long n));
+ static long list_find_nr __ARGS((list_T *l, long idx, int *errorp));
+ static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
+ static void list_append __ARGS((list_T *l, listitem_T *item));
+-static int list_append_tv __ARGS((list_T *l, typval_T *tv));
+-static int list_append_string __ARGS((list_T *l, char_u *str, int len));
+ static int list_append_number __ARGS((list_T *l, varnumber_T n));
+ static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item));
+ static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef));
+ static int list_concat __ARGS((list_T *l1, list_T *l2, typval_T *tv));
+ static list_T *list_copy __ARGS((list_T *orig, int deep, int copyID));
+ static void list_remove __ARGS((list_T *l, listitem_T *item, listitem_T *item2));
+ static char_u *list2string __ARGS((typval_T *tv, int copyID));
+ static int list_join __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo, int copyID));
++static int free_unref_items __ARGS((int copyID));
+ static void set_ref_in_ht __ARGS((hashtab_T *ht, int copyID));
+ static void set_ref_in_list __ARGS((list_T *l, int copyID));
+ static void set_ref_in_item __ARGS((typval_T *tv, int copyID));
+ static void dict_unref __ARGS((dict_T *d));
+ static void dict_free __ARGS((dict_T *d, int recurse));
+-static dictitem_T *dictitem_alloc __ARGS((char_u *key));
+ static dictitem_T *dictitem_copy __ARGS((dictitem_T *org));
+ static void dictitem_remove __ARGS((dict_T *dict, dictitem_T *item));
+-static void dictitem_free __ARGS((dictitem_T *item));
+ static dict_T *dict_copy __ARGS((dict_T *orig, int deep, int copyID));
+-static int dict_add __ARGS((dict_T *d, dictitem_T *item));
+ static long dict_len __ARGS((dict_T *d));
+ static dictitem_T *dict_find __ARGS((dict_T *d, char_u *key, int len));
+ static char_u *dict2string __ARGS((typval_T *tv, int copyID));
+ static int get_dict_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate));
+ static char_u *echo_string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID));
+@@ -618,10 +622,13 @@ static void f_max __ARGS((typval_T *argv
+ static void f_min __ARGS((typval_T *argvars, typval_T *rettv));
+ #ifdef vim_mkdir
+ static void f_mkdir __ARGS((typval_T *argvars, typval_T *rettv));
+ #endif
+ static void f_mode __ARGS((typval_T *argvars, typval_T *rettv));
++#ifdef FEAT_MZSCHEME
++static void f_mzeval __ARGS((typval_T *argvars, typval_T *rettv));
++#endif
+ static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv));
+ #ifdef FEAT_FLOAT
+ static void f_pow __ARGS((typval_T *argvars, typval_T *rettv));
+@@ -754,11 +761,10 @@ static void list_one_var __ARGS((dictite
+ static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first));
+ static void set_var __ARGS((char_u *name, typval_T *varp, int copy));
+ static int var_check_ro __ARGS((int flags, char_u *name));
+ static int var_check_fixed __ARGS((int flags, char_u *name));
+ static int tv_check_lock __ARGS((int lock, char_u *name));
+-static void copy_tv __ARGS((typval_T *from, typval_T *to));
+ static int item_copy __ARGS((typval_T *from, typval_T *to, int deep, int copyID));
+ static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
+ static char_u *trans_function_name __ARGS((char_u **pp, int skip, int flags, funcdict_T *fd));
+ static int eval_fname_script __ARGS((char_u *p));
+ static int eval_fname_sid __ARGS((char_u *p));
+@@ -786,10 +792,12 @@ static char_u *autoload_name __ARGS((cha
+ static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp));
+ static void func_free __ARGS((ufunc_T *fp));
+ static void func_unref __ARGS((char_u *name));
+ static void func_ref __ARGS((char_u *name));
+ static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict));
++static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ;
++static void free_funccal __ARGS((funccall_T *fc, int free_val));
+ static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr));
+ static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp));
+ static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off));
+ static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos));
+ static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp));
+@@ -843,15 +851,21 @@ eval_clear()
+     for (i = 0; i < VV_LEN; ++i)
      {
--      ++col;
-       count += win_lbr_chartabsize(wp, ptr, count, NULL);
-       mb_ptr_adv(ptr);
+       p = &vimvars[i];
+       if (p->vv_di.di_tv.v_type == VAR_STRING)
+       {
+-          vim_free(p->vv_di.di_tv.vval.v_string);
+-          p->vv_di.di_tv.vval.v_string = NULL;
++          vim_free(p->vv_str);
++          p->vv_str = NULL;
++      }
++      else if (p->vv_di.di_tv.v_type == VAR_LIST)
++      {
++          list_unref(p->vv_list);
++          p->vv_list = NULL;
+       }
      }
--    return col;
-+    return (int)(ptr - start);
- }
- #endif
- #endif /* FEAT_MOUSE */
+     hash_clear(&vimvarht);
++    hash_init(&vimvarht);  /* garbage_collect() will access it */
+     hash_clear(&compat_hashtab);
  
---- vim72.orig/src/testdir/Makefile
-+++ vim72/src/testdir/Makefile
-@@ -2,13 +2,15 @@
- # Makefile to run all tests for Vim
- #
+     /* script-local variables */
+     for (i = 1; i <= ga_scripts.ga_len; ++i)
+       vars_clear(&SCRIPT_VARS(i));
+@@ -914,10 +928,14 @@ func_level(cookie)
+ }
  
- VIMPROG = ../vim
+ /* pointer to funccal for currently active function */
+ funccall_T *current_funccal = NULL;
  
--# Uncomment this line for using valgrind.
--# The output goes into a file "valgrind.$PID" (sorry, no test number).
--# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --logfile=valgrind
-+# Uncomment this line to use valgrind for memory leaks and extra warnings.
-+#   The output goes into a file "valgrind.testN"
-+#   Vim should be compiled with EXITFREE to avoid false warnings.
-+#   This will make testing about 10 times as slow.
-+# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --log-file=valgrind.$*
++/* pointer to list of previously used funccal, still around because some
++ * item in it is still being used. */
++funccall_T *previous_funccal = NULL;
++
+ /*
+  * Return TRUE when a function was ended by a ":return" command.
+  */
+     int
+ current_func_returned()
+@@ -966,17 +984,18 @@ var_redir_start(name, append)
+ {
+     int               save_emsg;
+     int               err;
+     typval_T  tv;
  
- SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
-               test7.out test8.out test9.out test10.out test11.out \
-               test12.out  test13.out test14.out test15.out test17.out \
-               test18.out test19.out test20.out test21.out test22.out \
-@@ -18,33 +20,36 @@ SCRIPTS = test1.out test2.out test3.out
-               test38.out test39.out test40.out test41.out test42.out \
-               test43.out test44.out test45.out test46.out test47.out \
-               test48.out test49.out test51.out test52.out test53.out \
-               test54.out test55.out test56.out test57.out test58.out \
-               test59.out test60.out test61.out test62.out test63.out \
--              test64.out test65.out
-+              test64.out test65.out test66.out test67.out test68.out \
-+              test69.out test70.out
+-    /* Make sure a valid variable name is specified */
++    /* Catch a bad name early. */
+     if (!eval_isnamec1(*name))
+     {
+       EMSG(_(e_invarg));
+       return FAIL;
+     }
  
- SCRIPTS_GUI = test16.out
++    /* Make a copy of the name, it is used in redir_lval until redir ends. */
+     redir_varname = vim_strsave(name);
+     if (redir_varname == NULL)
+       return FAIL;
  
- .SUFFIXES: .in .out
+     redir_lval = (lval_T *)alloc_clear((unsigned)sizeof(lval_T));
+@@ -997,10 +1016,11 @@ var_redir_start(name, append)
+       if (redir_endp != NULL && *redir_endp != NUL)
+           /* Trailing characters are present after the variable name */
+           EMSG(_(e_trailing));
+       else
+           EMSG(_(e_invarg));
++      redir_endp = NULL;  /* don't store a value, only cleanup */
+       var_redir_stop();
+       return FAIL;
+     }
  
--nongui:       nolog $(SCRIPTS)
--      @echo
--      @cat test.log
--      @echo ALL DONE
-+nongui:       nolog $(SCRIPTS) report
-+
-+gui:  nolog $(SCRIPTS) $(SCRIPTS_GUI) report
--gui:  nolog $(SCRIPTS) $(SCRIPTS_GUI)
-+report:
-       @echo
--      @cat test.log
--      @echo ALL DONE
-+      @echo 'Test results:'
-+      @/bin/sh -c "if test -f test.log; \
-+              then cat test.log; echo TEST FAILURE; exit 1; \
-+              else echo ALL DONE; \
-+              fi"
- $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
- clean:
--      -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* valgrind.pid* viminfo
-+      -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* valgrind.pid* viminfo
- test1.out: test1.in
--      -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo
-+      -rm -f $*.failed tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* viminfo
-       $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in
-       @/bin/sh -c "if diff test.out $*.ok; \
-               then mv -f test.out $*.out; \
-               else echo; \
-               echo test1 FAILED - Something basic is wrong; \
-@@ -69,6 +74,6 @@ test1.out: test1.in
- test49.out: test49.vim
+     /* check if we can write to the variable: set it to or append an empty
+@@ -1015,10 +1035,11 @@ var_redir_start(name, append)
+       set_var_lval(redir_lval, redir_endp, &tv, TRUE, (char_u *)"=");
+     err = did_emsg;
+     did_emsg |= save_emsg;
+     if (err)
+     {
++      redir_endp = NULL;  /* don't store a value, only cleanup */
+       var_redir_stop();
+       return FAIL;
+     }
+     if (redir_lval->ll_newkey != NULL)
+     {
+@@ -1063,26 +1084,31 @@ var_redir_str(value, value_len)
+       var_redir_stop();
+ }
  
- test60.out: test60.vim
+ /*
+  * Stop redirecting command output to a variable.
++ * Frees the allocated memory.
+  */
+     void
+ var_redir_stop()
+ {
+     typval_T  tv;
  
- nolog:
--      -echo Test results: >test.log
-+      -rm -f test.log
---- vim72.orig/src/ex_getln.c
-+++ vim72/src/ex_getln.c
-@@ -29,18 +29,24 @@ struct cmdline_info
-     int               cmdindent;      /* number of spaces before cmdline */
-     char_u    *cmdprompt;     /* message in front of cmdline */
-     int               cmdattr;        /* attributes for prompt */
-     int               overstrike;     /* Typing mode on the command line.  Shared by
-                                  getcmdline() and put_on_cmdline(). */
-+    expand_T  *xpc;           /* struct being used for expansion, xp_pattern
-+                                 may point into cmdbuff */
-     int               xp_context;     /* type of expansion */
- # ifdef FEAT_EVAL
-     char_u    *xp_arg;        /* user-defined expansion arg */
-     int               input_fn;       /* when TRUE Invoked for input() function */
- # endif
- };
+     if (redir_lval != NULL)
+     {
+-      /* Append the trailing NUL. */
+-      ga_append(&redir_ga, NUL);
++      /* If there was no error: assign the text to the variable. */
++      if (redir_endp != NULL)
++      {
++          ga_append(&redir_ga, NUL);  /* Append the trailing NUL. */
++          tv.v_type = VAR_STRING;
++          tv.vval.v_string = redir_ga.ga_data;
++          set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)".");
++      }
  
--static struct cmdline_info ccline;    /* current cmdline_info */
-+/* The current cmdline_info.  It is initialized in getcmdline() and after that
-+ * used by other functions.  When invoking getcmdline() recursively it needs
-+ * to be saved with save_cmdline() and restored with restore_cmdline().
-+ * TODO: make it local to getcmdline() and pass it around. */
-+static struct cmdline_info ccline;
+-      /* Assign the text to the variable. */
+-      tv.v_type = VAR_STRING;
+-      tv.vval.v_string = redir_ga.ga_data;
+-      set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)".");
+-      vim_free(tv.vval.v_string);
++      /* free the collected output */
++      vim_free(redir_ga.ga_data);
++      redir_ga.ga_data = NULL;
  
- static int    cmd_showtail;           /* Only show path tail in lists ? */
+       clear_lval(redir_lval);
+       vim_free(redir_lval);
+       redir_lval = NULL;
+     }
+@@ -1254,34 +1280,46 @@ skip_expr(pp)
+     return eval1(pp, &rettv, FALSE);
+ }
  
- #ifdef FEAT_EVAL
- static int    new_cmdpos;     /* position set by set_cmdline_pos() */
-@@ -132,15 +138,14 @@ static int       ex_window __ARGS((void));
-  * Careful: getcmdline() can be called recursively!
-  *
-  * Return pointer to allocated string if there is a commandline, NULL
-  * otherwise.
+ /*
+  * Top level evaluation function, returning a string.
++ * When "convert" is TRUE convert a List into a sequence of lines and convert
++ * a Float to a String.
+  * Return pointer to allocated memory, or NULL for failure.
   */
--/*ARGSUSED*/
      char_u *
- getcmdline(firstc, count, indent)
-     int               firstc;
--    long      count;          /* only used for incremental search */
-+    long      count UNUSED;   /* only used for incremental search */
-     int               indent;         /* indent for inside conditionals */
+-eval_to_string(arg, nextcmd, dolist)
++eval_to_string(arg, nextcmd, convert)
+     char_u    *arg;
+     char_u    **nextcmd;
+-    int               dolist;         /* turn List into sequence of lines */
++    int               convert;
  {
-     int               c;
-     int               i;
-     int               j;
-@@ -236,10 +241,11 @@ getcmdline(firstc, count, indent)
-       ccline.cmdspos = indent;
-       ccline.cmdlen = indent;
-     }
-     ExpandInit(&xpc);
-+    ccline.xpc = &xpc;
- #ifdef FEAT_RIGHTLEFT
-     if (curwin->w_p_rl && *curwin->w_p_rlc == 's'
-                                         && (firstc == '/' || firstc == '?'))
-       cmdmsg_rl = TRUE;
-@@ -316,11 +322,11 @@ getcmdline(firstc, count, indent)
-     hiscnt = hislen;          /* set hiscnt to impossible history value */
-     histype = hist_char2type(firstc);
- #endif
- #ifdef FEAT_DIGRAPHS
--    do_digraph(-1);           /* init digraph typahead */
-+    do_digraph(-1);           /* init digraph typeahead */
- #endif
+     typval_T  tv;
+     char_u    *retval;
+     garray_T  ga;
++#ifdef FEAT_FLOAT
++    char_u    numbuf[NUMBUFLEN];
++#endif
  
-     /*
-      * Collect the command string, handling editing keys.
-      */
-@@ -406,13 +412,14 @@ getcmdline(firstc, count, indent)
-           lookfor = NULL;
+     if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
+       retval = NULL;
+     else
+     {
+-      if (dolist && tv.v_type == VAR_LIST)
++      if (convert && tv.v_type == VAR_LIST)
+       {
+           ga_init2(&ga, (int)sizeof(char), 80);
+           if (tv.vval.v_list != NULL)
+               list_join(&ga, tv.vval.v_list, (char_u *)"\n", TRUE, 0);
+           ga_append(&ga, NUL);
+           retval = (char_u *)ga.ga_data;
        }
- #endif
++#ifdef FEAT_FLOAT
++      else if (convert && tv.v_type == VAR_FLOAT)
++      {
++          vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
++          retval = vim_strsave(numbuf);
++      }
++#endif
+       else
+           retval = vim_strsave(get_tv_string(&tv));
+       clear_tv(&tv);
+     }
  
-       /*
--       * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
-+       * When there are matching completions to select <S-Tab> works like
-+       * CTRL-P (unless 'wc' is <S-Tab>).
-        */
--      if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)
-+      if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0)
-           c = Ctrl_P;
+@@ -3275,11 +3313,11 @@ ex_call(eap)
+     startarg = skipwhite(arg);
+     rettv.v_type = VAR_UNKNOWN;       /* clear_tv() uses this */
  
- #ifdef FEAT_WILDMENU
-       /* Special translations for 'wildmenu' */
-       if (did_wild_list && p_wmnu)
-@@ -1511,10 +1518,11 @@ getcmdline(firstc, count, indent)
-                   char_u      *p;
-                   int         len;
-                   int         old_firstc;
+     if (*startarg != '(')
+     {
+-      EMSG2(_("E107: Missing braces: %s"), eap->arg);
++      EMSG2(_("E107: Missing parentheses: %s"), eap->arg);
+       goto end;
+     }
  
-                   vim_free(ccline.cmdbuff);
-+                  xpc.xp_context = EXPAND_NOTHING;
-                   if (hiscnt == hislen)
-                       p = lookfor;    /* back to the old one */
-                   else
-                       p = history[histype][hiscnt].hisstr;
+     /*
+      * When skipping, evaluate the function once, to find the end of the
+@@ -3655,12 +3693,12 @@ item_lock(tv, deep, lock)
+     }
+     --recurse;
+ }
  
-@@ -1837,10 +1845,11 @@ returncmd:
- #ifdef FEAT_FKMAP
-     cmd_fkmap = 0;
- #endif
+ /*
+- * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or
+- * it refers to a List or Dictionary that is locked.
++ * Return TRUE if typeval "tv" is locked: Either that value is locked itself
++ * or it refers to a List or Dictionary that is locked.
+  */
+     static int
+ tv_islocked(tv)
+     typval_T  *tv;
+ {
+@@ -3742,11 +3780,10 @@ cat_prefix_varname(prefix, name)
  
-     ExpandCleanup(&xpc);
-+    ccline.xpc = NULL;
+ /*
+  * Function given to ExpandGeneric() to obtain the list of user defined
+  * (global/buffer/window/built-in) variable names.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_user_var_name(xp, idx)
+     expand_T  *xp;
+     int               idx;
+ {
+@@ -3900,11 +3937,11 @@ eval0(arg, rettv, nextcmd, evaluate)
+     return ret;
+ }
  
- #ifdef FEAT_SEARCH_EXTRA
-     if (did_incsearch)
-     {
-       curwin->w_cursor = old_cursor;
-@@ -1988,21 +1997,36 @@ text_locked_msg()
-       EMSG(_(e_secure));
+ /*
+  * Handle top level expression:
+- *    expr1 ? expr0 : expr0
++ *    expr2 ? expr1 : expr1
+  *
+  * "arg" must point to the first non-white of the expression.
+  * "arg" is advanced to the next non-white after the recognized expression.
+  *
+  * Note: "rettv.v_lock" is not set.
+@@ -5833,11 +5870,12 @@ list_equal(l1, l2, ic)
+       if (!tv_equal(&item1->li_tv, &item2->li_tv, ic))
+           return FALSE;
+     return item1 == NULL && item2 == NULL;
  }
  
- #if defined(FEAT_AUTOCMD) || defined(PROTO)
+-#if defined(FEAT_PYTHON) || defined(PROTO)
++#if defined(FEAT_RUBY) || defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) \
++      || defined(PROTO)
  /*
-- * Check if "curbuf_lock" is set and return TRUE when it is and give an error
-- * message.
-+ * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
-+ * and give an error message.
+  * Return the dictitem that an entry in a hashtable points to.
   */
-     int
- curbuf_locked()
- {
-     if (curbuf_lock > 0)
-     {
-       EMSG(_("E788: Not allowed to edit another buffer now"));
-       return TRUE;
+     dictitem_T *
+ dict_lookup(hi)
+@@ -6045,10 +6083,29 @@ list_find_nr(l, idx, errorp)
      }
-+    return allbuf_locked();
-+}
-+
-+/*
-+ * Check if "allbuf_lock" is set and return TRUE when it is and give an error
-+ * message.
+     return get_tv_number_chk(&li->li_tv, errorp);
+ }
+ /*
++ * Get list item "l[idx - 1]" as a string.  Returns NULL for failure.
 + */
-+    int
-+allbuf_locked()
++    char_u *
++list_find_str(l, idx)
++    list_T    *l;
++    long      idx;
 +{
-+    if (allbuf_lock > 0)
++    listitem_T        *li;
++
++    li = list_find(l, idx - 1);
++    if (li == NULL)
 +    {
-+      EMSG(_("E811: Not allowed to change buffer information now"));
-+      return TRUE;
++      EMSGN(_(e_listidx), idx);
++      return NULL;
 +    }
-     return FALSE;
- }
- #endif
-     static int
-@@ -2086,15 +2110,14 @@ correct_cmdspos(idx, cells)
- #endif
++    return get_tv_string(&li->li_tv);
++}
++
++/*
+  * Locate "item" list "l" and return its index.
+  * Returns -1 when "item" is not in the list.
+  */
+     static long
+ list_idx_of_item(l, item)
+@@ -6095,11 +6152,11 @@ list_append(l, item)
  
  /*
-  * Get an Ex command line for the ":" command.
+  * Append typval_T "tv" to the end of list "l".
+  * Return FAIL when out of memory.
   */
--/* ARGSUSED */
-     char_u *
--getexline(c, dummy, indent)
-+getexline(c, cookie, indent)
-     int               c;              /* normally ':', NUL for ":append" */
--    void      *dummy;         /* cookie not used */
-+    void      *cookie UNUSED;
-     int               indent;         /* indent for inside conditionals */
+-    static int
++    int
+ list_append_tv(l, tv)
+     list_T    *l;
+     typval_T  *tv;
  {
-     /* When executing a register, remove ':' that's in front of each line. */
-     if (exec_from_reg && vpeekc() == ':')
-       (void)vgetc();
-@@ -2105,16 +2128,15 @@ getexline(c, dummy, indent)
-  * Get an Ex command line for Ex mode.
-  * In Ex mode we only use the OS supplied line editing features and no
-  * mappings or abbreviations.
-  * Returns a string in allocated memory or NULL.
+     listitem_T        *li = listitem_alloc();
+@@ -6135,11 +6192,11 @@ list_append_dict(list, dict)
+ /*
+  * Make a copy of "str" and append it as an item to list "l".
+  * When "len" >= 0 use "str[len]".
+  * Returns FAIL when out of memory.
   */
--/* ARGSUSED */
-     char_u *
--getexmodeline(promptc, dummy, indent)
-+getexmodeline(promptc, cookie, indent)
-     int               promptc;        /* normally ':', NUL for ":append" and '?' for
-                                  :s prompt */
--    void      *dummy;         /* cookie not used */
-+    void      *cookie UNUSED;
-     int               indent;         /* indent for inside conditionals */
+-    static int
++    int
+ list_append_string(l, str, len)
+     list_T    *l;
+     char_u    *str;
+     int               len;
  {
-     garray_T  line_ga;
-     char_u    *pend;
-     int               startcol = 0;
-@@ -2169,11 +2191,10 @@ getexmodeline(promptc, dummy, indent)
-     got_int = FALSE;
-     while (!got_int)
-     {
-       if (ga_grow(&line_ga, 40) == FAIL)
-           break;
--      pend = (char_u *)line_ga.ga_data + line_ga.ga_len;
-       /* Get one character at a time.  Don't use inchar(), it can't handle
-        * special characters. */
-       prev_char = c1;
-       c1 = vgetc();
-@@ -2506,10 +2527,24 @@ realloc_cmdbuff(len)
-       ccline.cmdbuff = p;             /* keep the old one */
-       return FAIL;
+@@ -6415,10 +6472,11 @@ list_join(gap, l, sep, echo, copyID)
+       if (s != NULL)
+           ga_concat(gap, s);
+       vim_free(tofree);
+       if (s == NULL)
+           return FAIL;
++      line_breakcheck();
      }
-     mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1);
-     vim_free(p);
-+
-+    if (ccline.xpc != NULL
-+          && ccline.xpc->xp_pattern != NULL
-+          && ccline.xpc->xp_context != EXPAND_NOTHING
-+          && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL)
-+    {
-+      int i = (int)(ccline.xpc->xp_pattern - p);
-+
-+      /* If xp_pattern points inside the old cmdbuff it needs to be adjusted
-+       * to point into the newly allocated memory. */
-+      if (i >= 0 && i <= ccline.cmdlen)
-+          ccline.xpc->xp_pattern = ccline.cmdbuff + i;
-+    }
-+
      return OK;
  }
  
- #if defined(FEAT_ARABIC) || defined(PROTO)
- static char_u *arshape_buf = NULL;
-@@ -2873,10 +2908,11 @@ save_cmdline(ccp)
-     }
-     *ccp = prev_ccline;
-     prev_ccline = ccline;
-     ccline.cmdbuff = NULL;
-     ccline.cmdprompt = NULL;
-+    ccline.xpc = NULL;
- }
  /*
-  * Restore ccline after it has been saved with save_cmdline().
+@@ -6446,31 +6504,45 @@ list_join(gap, l, sep, echo, copyID)
+  * Return TRUE if some memory was freed.
   */
-@@ -3227,11 +3263,10 @@ nextwild(xp, type, options)
-     int               options;        /* extra options for ExpandOne() */
+     int
+ garbage_collect()
  {
-     int               i, j;
-     char_u    *p1;
-     char_u    *p2;
--    int               oldlen;
-     int               difflen;
-     int               v;
-     if (xp->xp_numfiles == -1)
-     {
-@@ -3252,11 +3287,11 @@ nextwild(xp, type, options)
+-    dict_T    *dd;
+-    list_T    *ll;
+-    int               copyID = ++current_copyID;
++    int               copyID;
+     buf_T     *buf;
+     win_T     *wp;
+     int               i;
+-    funccall_T        *fc;
+-    int               did_free = FALSE;
++    funccall_T        *fc, **pfc;
++    int               did_free;
++    int               did_free_funccal = FALSE;
+ #ifdef FEAT_WINDOWS
+     tabpage_T *tp;
+ #endif
  
-     MSG_PUTS("...");      /* show that we are busy */
-     out_flush();
+     /* Only do this once. */
+     want_garbage_collect = FALSE;
+     may_garbage_collect = FALSE;
+     garbage_collect_at_exit = FALSE;
  
-     i = (int)(xp->xp_pattern - ccline.cmdbuff);
--    oldlen = ccline.cmdpos - i;
-+    xp->xp_pattern_len = ccline.cmdpos - i;
++    /* We advance by two because we add one for items referenced through
++     * previous_funccal. */
++    current_copyID += COPYID_INC;
++    copyID = current_copyID;
++
+     /*
+      * 1. Go through all accessible variables and mark all lists and dicts
+      *    with copyID.
+      */
++
++    /* Don't free variables in the previous_funccal list unless they are only
++     * referenced through previous_funccal.  This must be first, because if
++     * the item is referenced elsewhere the funccal must not be freed. */
++    for (fc = previous_funccal; fc != NULL; fc = fc->caller)
++    {
++      set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1);
++      set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1);
++    }
++
+     /* script-local variables */
+     for (i = 1; i <= ga_scripts.ga_len; ++i)
+       set_ref_in_ht(&SCRIPT_VARS(i), copyID);
  
-     if (type == WILD_NEXT || type == WILD_PREV)
-     {
-       /*
-        * Get next/previous match for a previous expanded pattern.
-@@ -3266,22 +3301,24 @@ nextwild(xp, type, options)
-     else
+     /* buffer-local variables */
+@@ -6495,15 +6567,58 @@ garbage_collect()
      {
-       /*
-        * Translate string into pattern and expand it.
-        */
--      if ((p1 = addstar(&ccline.cmdbuff[i], oldlen, xp->xp_context)) == NULL)
-+      if ((p1 = addstar(xp->xp_pattern, xp->xp_pattern_len,
-+                                                   xp->xp_context)) == NULL)
-           p2 = NULL;
-       else
-       {
--          p2 = ExpandOne(xp, p1, vim_strnsave(&ccline.cmdbuff[i], oldlen),
-+          p2 = ExpandOne(xp, p1,
-+                       vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len),
-                   WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT|WILD_ESCAPE
-                                                             |options, type);
-           vim_free(p1);
--          /* longest match: make sure it is not shorter (happens with :help */
-+          /* longest match: make sure it is not shorter, happens with :help */
-           if (p2 != NULL && type == WILD_LONGEST)
-           {
--              for (j = 0; j < oldlen; ++j)
-+              for (j = 0; j < xp->xp_pattern_len; ++j)
-                    if (ccline.cmdbuff[i + j] == '*'
-                            || ccline.cmdbuff[i + j] == '?')
-                        break;
-               if ((int)STRLEN(p2) < j)
-               {
-@@ -3292,11 +3329,11 @@ nextwild(xp, type, options)
-       }
+       set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID);
+       set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID);
      }
  
-     if (p2 != NULL && !got_int)
-     {
--      difflen = (int)STRLEN(p2) - oldlen;
-+      difflen = (int)STRLEN(p2) - xp->xp_pattern_len;
-       if (ccline.cmdlen + difflen > ccline.cmdbufflen - 4)
++    /* v: vars */
++    set_ref_in_ht(&vimvarht, copyID);
++
++    /*
++     * 2. Free lists and dictionaries that are not referenced.
++     */
++    did_free = free_unref_items(copyID);
++
+     /*
+-     * 2. Go through the list of dicts and free items without the copyID.
++     * 3. Check if any funccal can be freed now.
++     */
++    for (pfc = &previous_funccal; *pfc != NULL; )
++    {
++      if (can_free_funccal(*pfc, copyID))
++      {
++          fc = *pfc;
++          *pfc = fc->caller;
++          free_funccal(fc, TRUE);
++          did_free = TRUE;
++          did_free_funccal = TRUE;
++      }
++      else
++          pfc = &(*pfc)->caller;
++    }
++    if (did_free_funccal)
++      /* When a funccal was freed some more items might be garbage
++       * collected, so run again. */
++      (void)garbage_collect();
++
++    return did_free;
++}
++
++/*
++ * Free lists and dictionaries that are no longer referenced.
++ */
++    static int
++free_unref_items(copyID)
++    int copyID;
++{
++    dict_T    *dd;
++    list_T    *ll;
++    int               did_free = FALSE;
++
++    /*
++     * Go through the list of dicts and free items without the copyID.
+      */
+     for (dd = first_dict; dd != NULL; )
+-      if (dd->dv_copyID != copyID)
++      if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK))
        {
-           v = realloc_cmdbuff(ccline.cmdlen + difflen);
-           xp->xp_pattern = ccline.cmdbuff + i;
+           /* Free the Dictionary and ordinary items it contains, but don't
+            * recurse into Lists and Dictionaries, they will be in the list
+            * of dicts or list of lists. */
+           dict_free(dd, FALSE);
+@@ -6514,16 +6629,17 @@ garbage_collect()
        }
-@@ -3580,10 +3617,12 @@ ExpandOne(xp, str, orig, options, mode)
+       else
+           dd = dd->dv_used_next;
+     /*
+-     * 3. Go through the list of lists and free items without the copyID.
+-     *    But don't free a list that has a watcher (used in a for loop), these
+-     *    are not referenced anywhere.
++     * Go through the list of lists and free items without the copyID.
++     * But don't free a list that has a watcher (used in a for loop), these
++     * are not referenced anywhere.
+      */
+     for (ll = first_list; ll != NULL; )
+-      if (ll->lv_copyID != copyID && ll->lv_watch == NULL)
++      if ((ll->lv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)
++                                                    && ll->lv_watch == NULL)
+       {
+           /* Free the List and ordinary items it contains, but don't recurse
+            * into Lists and Dictionaries, they will be in the list of dicts
+            * or list of lists. */
+           list_free(ll, FALSE);
+@@ -6585,21 +6701,21 @@ set_ref_in_item(tv, copyID)
+     switch (tv->v_type)
+     {
+       case VAR_DICT:
+           dd = tv->vval.v_dict;
+-          if (dd->dv_copyID != copyID)
++          if (dd != NULL && dd->dv_copyID != copyID)
+           {
+               /* Didn't see this dict yet. */
+               dd->dv_copyID = copyID;
+               set_ref_in_ht(&dd->dv_hashtab, copyID);
+           }
+           break;
+       case VAR_LIST:
+           ll = tv->vval.v_list;
+-          if (ll->lv_copyID != copyID)
++          if (ll != NULL && ll->lv_copyID != copyID)
+           {
+               /* Didn't see this list yet. */
+               ll->lv_copyID = copyID;
+               set_ref_in_list(ll, copyID);
+           }
+@@ -6693,11 +6809,11 @@ dict_free(d, recurse)
+  * Allocate a Dictionary item.
+  * The "key" is copied to the new item.
+  * Note that the value of the item "di_tv" still needs to be initialized!
+  * Returns NULL when out of memory.
   */
-     void
- ExpandInit(xp)
-     expand_T  *xp;
+-    static dictitem_T *
++    dictitem_T *
+ dictitem_alloc(key)
+     char_u    *key;
  {
-+    xp->xp_pattern = NULL;
-+    xp->xp_pattern_len = 0;
-     xp->xp_backslash = XP_BS_NONE;
- #ifndef BACKSLASH_IN_FILENAME
-     xp->xp_shell = FALSE;
+     dictitem_T *di;
+@@ -6749,11 +6865,11 @@ dictitem_remove(dict, item)
+ }
+ /*
+  * Free a dict item.  Also clears the value.
+  */
+-    static void
++    void
+ dictitem_free(item)
+     dictitem_T *item;
+ {
+     clear_tv(&item->di_tv);
+     vim_free(item);
+@@ -6829,11 +6945,11 @@ dict_copy(orig, deep, copyID)
+ /*
+  * Add item "item" to Dictionary "d".
+  * Returns FAIL when out of memory and when key already existed.
+  */
+-    static int
++    int
+ dict_add(d, item)
+     dict_T    *d;
+     dictitem_T        *item;
+ {
+     return hash_add(&d->dv_hashtab, item->di_key);
+@@ -7523,12 +7639,12 @@ static struct fst
+     {"getregtype",    0, 1, f_getregtype},
+     {"gettabwinvar",  3, 3, f_gettabwinvar},
+     {"getwinposx",    0, 0, f_getwinposx},
+     {"getwinposy",    0, 0, f_getwinposy},
+     {"getwinvar",     2, 2, f_getwinvar},
+-    {"glob",          1, 1, f_glob},
+-    {"globpath",      2, 2, f_globpath},
++    {"glob",          1, 2, f_glob},
++    {"globpath",      2, 3, f_globpath},
+     {"has",           1, 1, f_has},
+     {"has_key",               2, 2, f_has_key},
+     {"haslocaldir",   0, 0, f_haslocaldir},
+     {"hasmapto",      1, 3, f_hasmapto},
+     {"highlightID",   1, 1, f_hlID},          /* obsolete */
+@@ -7580,10 +7696,13 @@ static struct fst
+     {"min",           1, 1, f_min},
+ #ifdef vim_mkdir
+     {"mkdir",         1, 3, f_mkdir},
  #endif
-     xp->xp_numfiles = -1;
-@@ -3789,15 +3828,14 @@ tilde_replace(orig_pat, num_files, files
+     {"mode",          0, 1, f_mode},
++#ifdef FEAT_MZSCHEME
++    {"mzeval",                1, 1, f_mzeval},
++#endif
+     {"nextnonblank",  1, 1, f_nextnonblank},
+     {"nr2char",               1, 1, f_nr2char},
+     {"pathshorten",   1, 1, f_pathshorten},
+ #ifdef FEAT_FLOAT
+     {"pow",           2, 2, f_pow},
+@@ -7721,11 +7840,10 @@ get_function_name(xp, idx)
  /*
-  * Show all matches for completion on the command line.
-  * Returns EXPAND_NOTHING when the character that triggered expansion should
-  * be inserted like a normal character.
+  * Function given to ExpandGeneric() to obtain the list of internal or
+  * user defined variable or function names.
   */
 -/*ARGSUSED*/
-     static int
showmatches(xp, wildmenu)
+     char_u *
get_expr_name(xp, idx)
      expand_T  *xp;
--    int               wildmenu;
-+    int               wildmenu UNUSED;
+     int               idx;
  {
- #define L_SHOWFILE(m) (showtail ? sm_gettail(files_found[m]) : files_found[m])
-     int               num_files;
-     char_u    **files_found;
-     int               i, j, k;
-@@ -4272,12 +4310,12 @@ expand_cmdline(xp, str, col, matchcount,
-       /* Caller can use the character as a normal char instead */
-       return EXPAND_NOTHING;
+@@ -7854,13 +7972,13 @@ get_func_tv(name, len, rettv, arg, first
+       ret = call_func(name, len, rettv, argcount, argvars,
+                         firstline, lastline, doesrange, evaluate, selfdict);
+     else if (!aborting())
+     {
+       if (argcount == MAX_FUNC_ARGS)
+-          emsg_funcname("E740: Too many arguments for function %s", name);
++          emsg_funcname(N_("E740: Too many arguments for function %s"), name);
+       else
+-          emsg_funcname("E116: Invalid arguments for function %s", name);
++          emsg_funcname(N_("E116: Invalid arguments for function %s"), name);
      }
  
-     /* add star to file name, or convert to regexp if not exp. files. */
--    file_str = addstar(xp->xp_pattern,
--                         (int)(str + col - xp->xp_pattern), xp->xp_context);
-+    xp->xp_pattern_len = (int)(str + col - xp->xp_pattern);
-+    file_str = addstar(xp->xp_pattern, xp->xp_pattern_len, xp->xp_context);
-     if (file_str == NULL)
-       return EXPAND_UNSUCCESSFUL;
-     /* find all files that match the description */
-     if (ExpandFromContext(xp, file_str, matchcount, matches,
-@@ -4381,11 +4419,12 @@ ExpandFromContext(xp, pat, num_file, fil
+     while (--argcount >= 0)
+       clear_tv(&argvars[argcount]);
  
-       if (xp->xp_context == EXPAND_FILES)
-           flags |= EW_FILE;
-       else
-           flags = (flags | EW_DIR) & ~EW_FILE;
--      ret = expand_wildcards(1, &pat, num_file, file, flags);
-+      /* Expand wildcards, supporting %:h and the like. */
-+      ret = expand_wildcards_eval(&pat, num_file, file, flags);
-       if (free_pat)
-           vim_free(pat);
-       return ret;
-     }
+@@ -7954,11 +8072,12 @@ call_func(name, len, rettv, argcount, ar
  
-@@ -4451,10 +4490,11 @@ ExpandFromContext(xp, pat, num_file, fil
-           char_u      *((*func)__ARGS((expand_T *, int)));
-           int         ic;
-       } tab[] =
-       {
-           {EXPAND_COMMANDS, get_command_name, FALSE},
-+          {EXPAND_BEHAVE, get_behave_arg, TRUE},
- #ifdef FEAT_USR_CMDS
-           {EXPAND_USER_COMMANDS, get_user_commands, FALSE},
-           {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE},
-           {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE},
-           {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE},
-@@ -4475,10 +4515,19 @@ ExpandFromContext(xp, pat, num_file, fil
-           {EXPAND_HIGHLIGHT, get_highlight_name, TRUE},
- #ifdef FEAT_AUTOCMD
-           {EXPAND_EVENTS, get_event_name, TRUE},
-           {EXPAND_AUGROUP, get_augroup_name, TRUE},
- #endif
-+#ifdef FEAT_CSCOPE
-+          {EXPAND_CSCOPE, get_cscope_name, TRUE},
-+#endif
-+#ifdef FEAT_SIGNS
-+          {EXPAND_SIGN, get_sign_name, TRUE},
-+#endif
-+#ifdef FEAT_PROFILE
-+          {EXPAND_PROFILE, get_profile_name, TRUE},
-+#endif
- #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \
-       && (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE))
-           {EXPAND_LANGUAGE, get_lang_arg, TRUE},
- #endif
-           {EXPAND_ENV_VARS, get_env_name, TRUE},
-@@ -4488,11 +4537,11 @@ ExpandFromContext(xp, pat, num_file, fil
-       /*
-        * Find a context in the table and call the ExpandGeneric() with the
-        * right function to do the expansion.
-        */
-       ret = FAIL;
--      for (i = 0; i < sizeof(tab) / sizeof(struct expgen); ++i)
-+      for (i = 0; i < (int)(sizeof(tab) / sizeof(struct expgen)); ++i)
-           if (xp->xp_context == tab[i].context)
-           {
-               if (tab[i].ic)
-                   regmatch.rm_ic = TRUE;
-               ret = ExpandGeneric(xp, &regmatch, num_file, file, tab[i].func);
-@@ -4736,11 +4785,11 @@ call_user_expand_func(user_expand_func,
-       keep = ccline.cmdbuff[ccline.cmdlen];
-       ccline.cmdbuff[ccline.cmdlen] = 0;
-       sprintf((char *)num, "%d", ccline.cmdpos);
-       args[1] = ccline.cmdbuff;
-     }
--    args[0] = xp->xp_pattern;
-+    args[0] = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len);
-     args[2] = num;
  
-     /* Save the cmdline, we don't know what the function may do. */
-     save_ccline = ccline;
-     ccline.cmdbuff = NULL;
-@@ -4752,10 +4801,11 @@ call_user_expand_func(user_expand_func,
-     ccline = save_ccline;
-     current_SID = save_current_SID;
-     if (ccline.cmdbuff != NULL)
-       ccline.cmdbuff[ccline.cmdlen] = keep;
+     /* execute the function if no errors detected and executing */
+     if (evaluate && error == ERROR_NONE)
+     {
+-      rettv->v_type = VAR_NUMBER;     /* default is number rettv */
++      rettv->v_type = VAR_NUMBER;     /* default rettv is number zero */
++      rettv->vval.v_number = 0;
+       error = ERROR_UNKNOWN;
  
-+    vim_free(args[0]);
+       if (!builtin_function(fname))
+       {
+           /*
+@@ -8089,10 +8208,11 @@ call_func(name, len, rettv, argcount, ar
      return ret;
  }
  
  /*
-  * Expand names with a function defined by the user.
-@@ -4829,18 +4879,18 @@ ExpandUserList(xp, num_file, file)
+  * Give an error message with a function name.  Handle <SNR> things.
++ * "ermsg" is to be passed without translation, use N_() instead of _().
+  */
+     static void
+ emsg_funcname(ermsg, name)
+     char      *ermsg;
+     char_u    *name;
+@@ -8203,11 +8323,10 @@ f_append(argvars, rettv)
+           l = argvars[1].vval.v_list;
+           if (l == NULL)
+               return;
+           li = l->lv_first;
+       }
+-      rettv->vval.v_number = 0;       /* Default: Success */
+       for (;;)
+       {
+           if (l == NULL)
+               tv = &argvars[1];       /* append a string */
+           else if (li == NULL)
+@@ -8236,26 +8355,24 @@ f_append(argvars, rettv)
+ }
  
-     ga_init2(&ga, (int)sizeof(char *), 3);
-     /* Loop over the items in the list. */
-     for (li = retlist->lv_first; li != NULL; li = li->li_next)
-     {
--      if (li->li_tv.v_type != VAR_STRING)
--          continue;  /* Skip non-string items */
-+      if (li->li_tv.v_type != VAR_STRING || li->li_tv.vval.v_string == NULL)
-+          continue;  /* Skip non-string items and empty strings */
+ /*
+  * "argc()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_argc(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = ARGCOUNT;
+ }
  
-       if (ga_grow(&ga, 1) == FAIL)
-           break;
+ /*
+  * "argidx()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_argidx(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = curwin->w_arg_idx;
+ }
  
-       ((char_u **)ga.ga_data)[ga.ga_len] =
--          vim_strsave(li->li_tv.vval.v_string);
-+                                       vim_strsave(li->li_tv.vval.v_string);
-       ++ga.ga_len;
-     }
-     list_unref(retlist);
+@@ -8329,14 +8446,13 @@ f_atan(argvars, rettv)
+ #endif
  
-     *file = ga.ga_data;
-@@ -4869,11 +4919,11 @@ ExpandRTDir(pat, num_file, file, dirname
-     *file = NULL;
-     s = alloc((unsigned)(STRLEN(pat) + STRLEN(dirname) + 7));
-     if (s == NULL)
-       return FAIL;
-     sprintf((char *)s, "%s/%s*.vim", dirname, pat);
--    all = globpath(p_rtp, s);
-+    all = globpath(p_rtp, s, 0);
-     vim_free(s);
-     if (all == NULL)
-       return FAIL;
+ /*
+  * "browse(save, title, initdir, default)" function
+  */
+-/* ARGSUSED */
+     static void
+ f_browse(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+ #ifdef FEAT_BROWSE
+     int               save;
+     char_u    *title;
+@@ -8364,14 +8480,13 @@ f_browse(argvars, rettv)
+ }
  
-     ga_init2(&ga, (int)sizeof(char *), 3);
-@@ -4910,13 +4960,14 @@ ExpandRTDir(pat, num_file, file, dirname
-  * Expand "file" for all comma-separated directories in "path".
-  * Returns an allocated string with all matches concatenated, separated by
-  * newlines.  Returns NULL for an error or no matches.
+ /*
+  * "browsedir(title, initdir)" function
   */
-     char_u *
--globpath(path, file)
-+globpath(path, file, expand_options)
-     char_u    *path;
-     char_u    *file;
-+    int               expand_options;
+-/* ARGSUSED */
+     static void
+ f_browsedir(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     expand_T  xpc;
-     char_u    *buf;
-     garray_T  ga;
-     int               i;
-@@ -4941,14 +4992,14 @@ globpath(path, file)
-       copy_option_part(&path, buf, MAXPATHL, ",");
-       if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL)
-       {
-           add_pathsep(buf);
-           STRCAT(buf, file);
--          if (ExpandFromContext(&xpc, buf, &num_p, &p, WILD_SILENT) != FAIL
--                                                               && num_p > 0)
-+          if (ExpandFromContext(&xpc, buf, &num_p, &p,
-+                           WILD_SILENT|expand_options) != FAIL && num_p > 0)
-           {
--              ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT);
-+              ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options);
-               for (len = 0, i = 0; i < num_p; ++i)
-                   len += (int)STRLEN(p[i]) + 1;
+ #ifdef FEAT_BROWSE
+     char_u    *title;
+     char_u    *initdir;
+@@ -8592,14 +8707,13 @@ f_bufwinnr(argvars, rettv)
+ }
  
-               /* Concatenate new results to previous ones. */
-               if (ga_grow(&ga, len) == OK)
-@@ -5639,11 +5690,11 @@ ex_history(eap)
-       i = *end;
-       *end = NUL;
-       histype1 = get_histtype(arg);
-       if (histype1 == -1)
-       {
--          if (STRICMP(arg, "all") == 0)
-+          if (STRNICMP(arg, "all", STRLEN(arg)) == 0)
-           {
-               histype1 = 0;
-               histype2 = HIST_COUNT-1;
-           }
-           else
-@@ -6018,20 +6069,21 @@ ex_window()
- # ifdef FEAT_AUTOCMD
-       unblock_autocmds();
- # endif
-       return K_IGNORE;
-     }
--    cmdwin_type = ccline.cmdfirstc;
--    if (cmdwin_type == NUL)
--      cmdwin_type = '-';
-+    cmdwin_type = get_cmdline_type();
+ /*
+  * "byte2line(byte)" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_byte2line(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+ #ifndef FEAT_BYTEOFF
+     rettv->vval.v_number = -1;
+ #else
+@@ -8615,11 +8729,10 @@ f_byte2line(argvars, rettv)
+ }
  
-     /* Create the command-line buffer empty. */
--    (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
-+    (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL);
-     (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE);
-     set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
-     set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
-     curbuf->b_p_ma = TRUE;
-+#ifdef FEAT_FOLDING
-+    curwin->w_p_fen = FALSE;
-+#endif
- # ifdef FEAT_RIGHTLEFT
-     curwin->w_p_rl = cmdmsg_rl;
-     cmdmsg_rl = FALSE;
- # endif
- # ifdef FEAT_SCROLLBIND
-@@ -6044,11 +6096,11 @@ ex_window()
- # endif
-     /* Showing the prompt may have set need_wait_return, reset it. */
-     need_wait_return = FALSE;
+ /*
+  * "byteidx()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_byteidx(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+@@ -8663,11 +8776,10 @@ f_call(argvars, rettv)
+     int               argc = 0;
+     listitem_T        *item;
+     int               dummy;
+     dict_T    *selfdict = NULL;
  
--    histtype = hist_char2type(ccline.cmdfirstc);
-+    histtype = hist_char2type(cmdwin_type);
-     if (histtype == HIST_CMD || histtype == HIST_DEBUG)
+-    rettv->vval.v_number = 0;
+     if (argvars[1].v_type != VAR_LIST)
      {
-       if (p_wc == TAB)
-       {
-           add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT);
-@@ -6198,11 +6250,15 @@ ex_window()
- # endif
-       wp = curwin;
-       bp = curbuf;
-       win_goto(old_curwin);
-       win_close(wp, TRUE);
--      close_buffer(NULL, bp, DOBUF_WIPE);
-+
-+      /* win_close() may have already wiped the buffer when 'bh' is
-+       * set to 'wipe' */
-+      if (buf_valid(bp))
-+          close_buffer(NULL, bp, DOBUF_WIPE);
-       /* Restore window sizes. */
-       win_size_restore(&winsizes);
- # ifdef FEAT_AUTOCMD
---- vim72.orig/src/ex_cmds.c
-+++ vim72/src/ex_cmds.c
-@@ -22,11 +22,11 @@
- static int linelen __ARGS((int *has_tab));
- #endif
- static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out));
- #ifdef FEAT_VIMINFO
- static char_u *viminfo_filename __ARGS((char_u        *));
--static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read));
-+static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags));
- static int viminfo_encoding __ARGS((vir_T *virp));
- static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing));
+       EMSG(_(e_listreq));
+       return;
+     }
+@@ -8735,14 +8847,13 @@ f_ceil(argvars, rettv)
  #endif
  
- static int check_overwrite __ARGS((exarg_T *eap, buf_T *buf, char_u *fname, char_u *ffname, int other));
-@@ -41,16 +41,16 @@ static int
-       help_compare __ARGS((const void *s1, const void *s2));
  /*
-  * ":ascii" and "ga".
+  * "changenr()" function
   */
 -/*ARGSUSED*/
-     void
- do_ascii(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+     static void
+ f_changenr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     int               c;
-+    int               cval;
-     char      buf1[20];
-     char      buf2[20];
-     char_u    buf3[7];
- #ifdef FEAT_MBYTE
-     int               cc[MAX_MCO];
-@@ -73,30 +73,35 @@ do_ascii(eap)
-     if (!has_mbyte || (enc_dbcs != 0 && c < 0x100) || c < 0x80)
- #endif
-     {
-       if (c == NL)        /* NUL is stored as NL */
-           c = NUL;
-+      if (c == CAR && get_fileformat(curbuf) == EOL_MAC)
-+          cval = NL;      /* NL is stored as CR */
-+      else
-+          cval = c;
-       if (vim_isprintc_strict(c) && (c < ' '
- #ifndef EBCDIC
-                   || c > '~'
- #endif
-                              ))
-       {
-           transchar_nonprint(buf3, c);
--          sprintf(buf1, "  <%s>", (char *)buf3);
-+          vim_snprintf(buf1, sizeof(buf1), "  <%s>", (char *)buf3);
-       }
-       else
-           buf1[0] = NUL;
- #ifndef EBCDIC
-       if (c >= 0x80)
--          sprintf(buf2, "  <M-%s>", transchar(c & 0x7f));
-+          vim_snprintf(buf2, sizeof(buf2), "  <M-%s>",
-+                                               (char *)transchar(c & 0x7f));
-       else
- #endif
-           buf2[0] = NUL;
-       vim_snprintf((char *)IObuff, IOSIZE,
-               _("<%s>%s%s  %d,  Hex %02x,  Octal %03o"),
--                                         transchar(c), buf1, buf2, c, c, c);
-+                                transchar(c), buf1, buf2, cval, cval, cval);
- #ifdef FEAT_MBYTE
-       if (enc_utf8)
-           c = cc[ci++];
-       else
-           c = 0;
-@@ -351,11 +356,11 @@ ex_sort(eap)
-     regmatch_T        regmatch;
-     int               len;
-     linenr_T  lnum;
-     long      maxlen = 0;
-     sorti_T   *nrs;
--    size_t    count = eap->line2 - eap->line1 + 1;
-+    size_t    count = (size_t)(eap->line2 - eap->line1 + 1);
-     size_t    i;
-     char_u    *p;
-     char_u    *s;
-     char_u    *s2;
-     char_u    c;                      /* temporary character storage */
-@@ -950,11 +955,11 @@ do_bang(addr_count, eap, forceit, do_in,
-               vim_free(newcmd);
-               return;
-           }
-           len += (int)STRLEN(prevcmd);
-       }
--      if ((t = alloc(len)) == NULL)
-+      if ((t = alloc((unsigned)len)) == NULL)
-       {
-           vim_free(newcmd);
-           return;
-       }
-       *t = NUL;
-@@ -1541,11 +1546,11 @@ make_filter_cmd(cmd, itmp, otmp)
-     /*
-      * Put braces around the command (for concatenated commands) when
-      * redirecting input and/or output.
-      */
-     if (itmp != NULL || otmp != NULL)
--      sprintf((char *)buf, "(%s)", (char *)cmd);
-+      vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
-     else
-       STRCPY(buf, cmd);
-     if (itmp != NULL)
-     {
-       STRCAT(buf, " < ");
-@@ -1590,41 +1595,45 @@ make_filter_cmd(cmd, itmp, otmp)
-           }
-       }
-     }
- #endif
-     if (otmp != NULL)
--      append_redir(buf, p_srr, otmp);
-+      append_redir(buf, (int)len, p_srr, otmp);
+     rettv->vval.v_number = curbuf->b_u_seq_cur;
+ }
  
-     return buf;
+@@ -8788,15 +8899,14 @@ f_cindent(argvars, rettv)
  }
  
  /*
-- * Append output redirection for file "fname" to the end of string buffer "buf"
-+ * Append output redirection for file "fname" to the end of string buffer
-+ * "buf[buflen]"
-  * Works with the 'shellredir' and 'shellpipe' options.
-  * The caller should make sure that there is enough room:
-  *    STRLEN(opt) + STRLEN(fname) + 3
+  * "clearmatches()" function
   */
-     void
--append_redir(buf, opt, fname)
-+append_redir(buf, buflen, opt, fname)
-     char_u    *buf;
-+    int               buflen;
-     char_u    *opt;
-     char_u    *fname;
+-/*ARGSUSED*/
+     static void
+ f_clearmatches(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
  {
-     char_u    *p;
-+    char_u    *end;
--    buf += STRLEN(buf);
-+    end = buf + STRLEN(buf);
-     /* find "%s", skipping "%%" */
-     for (p = opt; (p = vim_strchr(p, '%')) != NULL; ++p)
-       if (p[1] == 's')
-           break;
-     if (p != NULL)
-     {
--      *buf = ' '; /* not really needed? Not with sh, ksh or bash */
--      sprintf((char *)buf + 1, (char *)opt, (char *)fname);
-+      *end = ' '; /* not really needed? Not with sh, ksh or bash */
-+      vim_snprintf((char *)end + 1, (size_t)(buflen - (end + 1 - buf)),
-+                                                (char *)opt, (char *)fname);
-     }
-     else
--      sprintf((char *)buf,
-+      vim_snprintf((char *)end, (size_t)(buflen - (end - buf)),
- #ifdef FEAT_QUICKFIX
- # ifndef RISCOS
-               opt != p_sp ? " %s%s" :
- # endif
-               " %s %s",
-@@ -1674,50 +1683,48 @@ viminfo_error(errnum, message, line)
-     return FALSE;
+ #ifdef FEAT_SEARCH_EXTRA
+     clear_matches(curwin);
+ #endif
  }
+@@ -8856,15 +8966,14 @@ f_col(argvars, rettv)
  
+ #if defined(FEAT_INS_EXPAND)
  /*
-  * read_viminfo() -- Read the viminfo file.  Registers etc. which are already
-- * set are not over-written unless force is TRUE. -- webb
-+ * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb
+  * "complete()" function
   */
-     int
--read_viminfo(file, want_info, want_marks, forceit)
--    char_u    *file;
--    int               want_info;
--    int               want_marks;
--    int               forceit;
-+read_viminfo(file, flags)
-+    char_u    *file;      /* file name or NULL to use default name */
-+    int               flags;      /* VIF_WANT_INFO et al. */
+-/*ARGSUSED*/
+     static void
+ f_complete(argvars, rettv)
+     typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *rettv UNUSED;
  {
-     FILE      *fp;
-     char_u    *fname;
-     if (no_viminfo())
-       return FAIL;
--    fname = viminfo_filename(file);       /* may set to default if NULL */
-+    fname = viminfo_filename(file);   /* get file name in allocated buffer */
-     if (fname == NULL)
-       return FAIL;
-     fp = mch_fopen((char *)fname, READBIN);
+     int           startcol;
  
-     if (p_verbose > 0)
+     if ((State & INSERT) == 0)
      {
-       verbose_enter();
-       smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
-               fname,
--              want_info ? _(" info") : "",
--              want_marks ? _(" marks") : "",
-+              (flags & VIF_WANT_INFO) ? _(" info") : "",
-+              (flags & VIF_WANT_MARKS) ? _(" marks") : "",
-+              (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "",
-               fp == NULL ? _(" FAILED") : "");
-       verbose_leave();
-     }
-     vim_free(fname);
-     if (fp == NULL)
-       return FAIL;
-     viminfo_errcnt = 0;
--    do_viminfo(fp, NULL, want_info, want_marks, forceit);
-+    do_viminfo(fp, NULL, flags);
-     fclose(fp);
--
-     return OK;
+@@ -8891,11 +9000,10 @@ f_complete(argvars, rettv)
  }
  
  /*
-  * write_viminfo() -- Write the viminfo file.  The old one is read in first so
-@@ -1784,11 +1791,11 @@ write_viminfo(file, forceit)
-       /*
-        * For Unix we check the owner of the file.  It's not very nice to
-        * overwrite a user's viminfo file after a "su root", with a
-        * viminfo file that the user can't read.
-        */
--      st_old.st_dev = 0;
-+      st_old.st_dev = (dev_t)0;
-       st_old.st_ino = 0;
-       st_old.st_mode = 0600;
-       if (mch_stat((char *)fname, &st_old) == 0
-               && getuid() != ROOT_UID
-               && !(st_old.st_uid == getuid()
-@@ -1941,11 +1948,11 @@ write_viminfo(file, forceit)
-           /*
-            * Make sure the owner can read/write it.  This only works for
-            * root.
-            */
-           if (fp_out != NULL)
--              (void)fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
-+              ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
- #endif
-       }
-     }
-     /*
-@@ -1966,11 +1973,11 @@ write_viminfo(file, forceit)
-       smsg((char_u *)_("Writing viminfo file \"%s\""), fname);
-       verbose_leave();
-     }
+  * "complete_add()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_complete_add(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+@@ -8903,14 +9011,13 @@ f_complete_add(argvars, rettv)
+ }
  
-     viminfo_errcnt = 0;
--    do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);
-+    do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS));
+ /*
+  * "complete_check()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_complete_check(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     int               saved = RedrawingDisabled;
  
-     fclose(fp_out);       /* errors are ignored !? */
-     if (fp_in != NULL)
-     {
-       fclose(fp_in);
-@@ -2039,16 +2046,14 @@ viminfo_filename(file)
+     RedrawingDisabled = 0;
+@@ -8921,15 +9028,14 @@ f_complete_check(argvars, rettv)
+ #endif
  
  /*
-  * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
+  * "confirm(message, buttons[, default [, type]])" function
   */
+-/*ARGSUSED*/
      static void
--do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)
-+do_viminfo(fp_in, fp_out, flags)
-     FILE      *fp_in;
-     FILE      *fp_out;
--    int               want_info;
--    int               want_marks;
--    int               force_read;
-+    int               flags;
+ f_confirm(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
  {
-     int               count = 0;
-     int               eof = FALSE;
-     vir_T     vir;
+ #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
+     char_u    *message;
+     char_u    *buttons = NULL;
+     char_u    buf[NUMBUFLEN];
+@@ -8971,17 +9077,13 @@ f_confirm(argvars, rettv)
+     }
  
-@@ -2059,12 +2064,13 @@ do_viminfo(fp_in, fp_out, want_info, wan
-     vir.vir_conv.vc_type = CONV_NONE;
- #endif
+     if (buttons == NULL || *buttons == NUL)
+       buttons = (char_u *)_("&Ok");
  
-     if (fp_in != NULL)
-     {
--      if (want_info)
--          eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL);
-+      if (flags & VIF_WANT_INFO)
-+          eof = read_viminfo_up_to_marks(&vir,
-+                                       flags & VIF_FORCEIT, fp_out != NULL);
-       else
-           /* Skip info, find start of marks */
-           while (!(eof = viminfo_readline(&vir))
-                   && vir.vir_line[0] != '>')
-               ;
-@@ -2090,12 +2096,13 @@ do_viminfo(fp_in, fp_out, want_info, wan
+-    if (error)
+-      rettv->vval.v_number = 0;
+-    else
++    if (!error)
+       rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
+                                                                  def, NULL);
+-#else
+-    rettv->vval.v_number = 0;
  #endif
-       write_viminfo_filemarks(fp_out);
-       write_viminfo_bufferlist(fp_out);
-       count = write_viminfo_marks(fp_out);
-     }
--    if (fp_in != NULL && want_marks)
--      copy_viminfo_marks(&vir, fp_out, count, eof);
-+    if (fp_in != NULL
-+          && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT)))
-+      copy_viminfo_marks(&vir, fp_out, count, eof, flags);
+ }
  
-     vim_free(vir.vir_line);
- #ifdef FEAT_MBYTE
-     if (vir.vir_conv.vc_type != CONV_NONE)
-       convert_setup(&vir.vir_conv, NULL, NULL);
-@@ -2246,16 +2253,15 @@ viminfo_readline(virp)
-  *
-  * Check for a long line as written by viminfo_writestring().
+ /*
+  * "copy()" function
+@@ -9094,15 +9196,14 @@ f_count(argvars, rettv)
+ /*
+  * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function
   *
-  * Return the string in allocated memory (NULL when out of memory).
+  * Checks the existence of a cscope connection.
   */
 -/*ARGSUSED*/
-     char_u *
viminfo_readstring(virp, off, convert)
-     vir_T     *virp;
-     int               off;                /* offset for virp->vir_line */
--    int               convert;            /* convert the string */
-+    int               convert UNUSED;     /* convert the string */
+     static void
f_cscope_connection(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
  {
-     char_u    *retval;
-     char_u    *s, *d;
-     long      len;
+ #ifdef FEAT_CSCOPE
+     int               num = 0;
+     char_u    *dbpath = NULL;
+     char_u    *prepend = NULL;
+@@ -9116,31 +9217,30 @@ f_cscope_connection(argvars, rettv)
+       if (argvars[2].v_type != VAR_UNKNOWN)
+           prepend = get_tv_string_buf(&argvars[2], buf);
+     }
  
-@@ -2363,14 +2369,13 @@ viminfo_writestring(fd, p)
-  * Implementation of ":fixdel", also used by get_stty().
-  *  <BS>    resulting <Del>
-  *   ^?               ^H
-  * not ^?     ^?
+     rettv->vval.v_number = cs_connection(num, dbpath, prepend);
+-#else
+-    rettv->vval.v_number = 0;
+ #endif
+ }
+ /*
+  * "cursor(lnum, col)" function
+  *
+- * Moves the cursor to the specified line and column
++ * Moves the cursor to the specified line and column.
++ * Returns 0 when the position could be set, -1 otherwise.
   */
 -/*ARGSUSED*/
-     void
- do_fixdel(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     char_u  *p;
-     p = find_termcode((char_u *)"kb");
-     add_termcode((char_u *)"kD", p != NULL
-@@ -2385,11 +2390,12 @@ print_line_no_prefix(lnum, use_number, l
+     static void
+ f_cursor(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
  {
-     char_u    numbuf[30];
+     long      line, col;
+ #ifdef FEAT_VIRTUALEDIT
+     long      coladd = 0;
+ #endif
  
-     if (curwin->w_p_nu || use_number)
++    rettv->vval.v_number = -1;
+     if (argvars[1].v_type == VAR_UNKNOWN)
      {
--      sprintf((char *)numbuf, "%*ld ", number_width(curwin), (long)lnum);
-+      vim_snprintf((char *)numbuf, sizeof(numbuf),
-+                                 "%*ld ", number_width(curwin), (long)lnum);
-       msg_puts_attr(numbuf, hl_attr(HLF_N));  /* Highlight line nrs */
-     }
-     msg_prt_line(ml_get(lnum), list);
- }
+       pos_T       pos;
  
-@@ -2412,12 +2418,12 @@ print_line(lnum, use_number, list)
-     {
-       msg_putchar('\n');
-       cursor_on();            /* msg_start() switches it off */
-       out_flush();
-       silent_mode = save_silent;
--      info_message = FALSE;
-     }
-+    info_message = FALSE;
+       if (list2fpos(argvars, &pos, NULL) == FAIL)
+@@ -9181,10 +9281,11 @@ f_cursor(argvars, rettv)
+     if (has_mbyte)
+       mb_adjust_cursor();
+ #endif
+     curwin->w_set_curswant = TRUE;
++    rettv->vval.v_number = 0;
  }
  
  /*
-  * ":file[!] [fname]".
+  * "deepcopy()" function
   */
-@@ -2702,11 +2708,16 @@ do_write(eap)
-       /* After ":saveas fname" reset 'readonly'. */
-       if (eap->cmdidx == CMD_saveas)
-       {
-           if (retval == OK)
-+          {
-               curbuf->b_p_ro = FALSE;
-+#ifdef FEAT_WINDOWS
-+              redraw_tabline = TRUE;
-+#endif
-+          }
-           /* Change directories when the 'acd' option is set. */
-           DO_AUTOCHDIR
-       }
-     }
+@@ -9198,11 +9299,14 @@ f_deepcopy(argvars, rettv)
+     if (argvars[1].v_type != VAR_UNKNOWN)
+       noref = get_tv_number_chk(&argvars[1], NULL);
+     if (noref < 0 || noref > 1)
+       EMSG(_(e_invarg));
+     else
+-      item_copy(&argvars[0], rettv, TRUE, noref == 0 ? ++current_copyID : 0);
++    {
++      current_copyID += COPYID_INC;
++      item_copy(&argvars[0], rettv, TRUE, noref == 0 ? current_copyID : 0);
++    }
+ }
  
-@@ -2722,11 +2733,10 @@ theend:
-  * Check if it is allowed to overwrite a file.  If b_flags has BF_NOTEDITED,
-  * BF_NEW or BF_READERR, check for overwriting current file.
-  * May set eap->forceit if a dialog says it's OK to overwrite.
-  * Return OK if it's OK, FAIL if it is not.
+ /*
+  * "delete()" function
   */
--/*ARGSUSED*/
-     static int
- check_overwrite(eap, buf, fname, ffname, other)
-     exarg_T   *eap;
-     buf_T     *buf;
-     char_u    *fname;     /* file name to be used (can differ from
-@@ -3052,11 +3062,12 @@ getfile(fnum, ffname, sfname, setpm, lnu
-       check_cursor_lnum();
-       beginline(BL_SOL | BL_FIX);
-       retval = 0;     /* it's in the same file */
-     }
-     else if (do_ecmd(fnum, ffname, sfname, NULL, lnum,
--              (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0)) == OK)
-+              (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0),
-+              curwin) == OK)
-       retval = -1;    /* opened another file */
-     else
-       retval = 1;     /* error encountered */
+@@ -9218,45 +9322,40 @@ f_delete(argvars, rettv)
+ }
  
- theend:
-@@ -3085,21 +3096,25 @@ theend:
-  *       ECMD_HIDE: if TRUE don't free the current buffer
-  *     ECMD_SET_HELP: set b_help flag of (new) buffer before opening file
-  *     ECMD_OLDBUF: use existing buffer if it exists
-  *    ECMD_FORCEIT: ! used for Ex command
-  *     ECMD_ADDBUF: don't edit, just add to buffer list
-+ *   oldwin: Should be "curwin" when editing a new buffer in the current
-+ *           window, NULL when splitting the window first.  When not NULL info
-+ *           of the previous buffer for "oldwin" is stored.
-  *
-  * return FAIL for failure, OK otherwise
+ /*
+  * "did_filetype()" function
   */
-     int
--do_ecmd(fnum, ffname, sfname, eap, newlnum, flags)
-+do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin)
-     int               fnum;
-     char_u    *ffname;
-     char_u    *sfname;
-     exarg_T   *eap;                   /* can be NULL! */
-     linenr_T  newlnum;
-     int               flags;
-+    win_T     *oldwin;
+-/*ARGSUSED*/
+     static void
+ f_did_filetype(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
  {
-     int               other_file;             /* TRUE if editing another file */
-     int               oldbuf;                 /* TRUE if using existing buffer */
  #ifdef FEAT_AUTOCMD
-     int               auto_buf = FALSE;       /* TRUE if autocommands brought us
-@@ -3267,11 +3282,12 @@ do_ecmd(fnum, ffname, sfname, eap, newln
-       if (!(flags & ECMD_ADDBUF))
+     rettv->vval.v_number = did_filetype;
+-#else
+-    rettv->vval.v_number = 0;
  #endif
-       {
-           if (!cmdmod.keepalt)
-               curwin->w_alt_fnum = curbuf->b_fnum;
--          buflist_altfpos();
-+          if (oldwin != NULL)
-+              buflist_altfpos(oldwin);
-       }
+ }
  
-       if (fnum)
-           buf = buflist_findnr(fnum);
-       else
-@@ -3371,11 +3387,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln
+ /*
+  * "diff_filler()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_diff_filler(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+ #ifdef FEAT_DIFF
+     rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
  #endif
-                   buf_copy_options(buf, BCO_ENTER);
+ }
  
-               /* close the link to the current buffer */
-               u_sync(FALSE);
--              close_buffer(curwin, curbuf,
-+              close_buffer(oldwin, curbuf,
-                                     (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD);
+ /*
+  * "diff_hlID()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_diff_hlID(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+ #ifdef FEAT_DIFF
+     linenr_T          lnum = get_tv_lnum(argvars);
+     static linenr_T   prev_lnum = 0;
+     static int                changedtick = 0;
+@@ -9365,11 +9464,10 @@ f_escape(argvars, rettv)
+ }
  
- #ifdef FEAT_AUTOCMD
- # ifdef FEAT_EVAL
-               if (aborting())     /* autocmds may abort script processing */
-@@ -3699,11 +3715,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln
+ /*
+  * "eval()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_eval(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+@@ -9389,14 +9487,13 @@ f_eval(argvars, rettv)
+ }
  
- #ifdef FEAT_SPELL
-     /* If the window options were changed may need to set the spell language.
-      * Can only do this after the buffer has been properly setup. */
-     if (did_get_winopts && curwin->w_p_spell && *curbuf->b_p_spl != NUL)
--      did_set_spelllang(curbuf);
-+      (void)did_set_spelllang(curbuf);
- #endif
+ /*
+  * "eventhandler()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_eventhandler(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = vgetc_busy;
+ }
  
-     if (command == NULL)
+@@ -9516,11 +9613,11 @@ f_expand(argvars, rettv)
+       --emsg_off;
+     }
+     else
      {
-       if (newcol >= 0)        /* position set by autocommands */
-@@ -3772,11 +3788,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln
-     if (command != NULL)
-       do_cmdline(command, NULL, NULL, DOCMD_VERBOSE);
+       /* When the optional second argument is non-zero, don't remove matches
+-       * for 'suffixes' and 'wildignore' */
++       * for 'wildignore' and don't put matches for 'suffixes' at the end. */
+       if (argvars[1].v_type != VAR_UNKNOWN
+                                   && get_tv_number_chk(&argvars[1], &error))
+           flags |= WILD_KEEP_ALL;
+       if (!error)
+       {
+@@ -9540,11 +9637,10 @@ f_expand(argvars, rettv)
+     static void
+ f_extend(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST)
+     {
+       list_T          *l1, *l2;
+       listitem_T      *item;
+       long            before;
+@@ -9650,15 +9746,14 @@ f_extend(argvars, rettv)
+ }
  
- #ifdef FEAT_KEYMAP
-     if (curbuf->b_kmap_state & KEYMAP_INIT)
--      keymap_init();
-+      (void)keymap_init();
- #endif
+ /*
+  * "feedkeys()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_feedkeys(argvars, rettv)
+     typval_T    *argvars;
+-    typval_T    *rettv;
++    typval_T    *rettv UNUSED;
+ {
+     int               remap = TRUE;
+     char_u    *keys, *flags;
+     char_u    nbuf[NUMBUFLEN];
+     int               typed = FALSE;
+@@ -9668,11 +9763,10 @@ f_feedkeys(argvars, rettv)
+      * executed in the sandbox it would be OK, but it probably happens later,
+      * when "sandbox" is no longer set. */
+     if (check_secure())
+       return;
  
-     --RedrawingDisabled;
-     if (!skip_redraw)
-     {
-@@ -3995,10 +4011,13 @@ ex_change(eap)
+-    rettv->vval.v_number = 0;
+     keys = get_tv_string(&argvars[0]);
+     if (*keys != NUL)
      {
-       if (curbuf->b_ml.ml_flags & ML_EMPTY)       /* nothing to delete */
-           break;
-       ml_delete(eap->line1, FALSE);
-     }
-+
-+    /* make sure the cursor is not beyond the end of the file now */
-+    check_cursor_lnum();
-     deleted_lines_mark(eap->line1, (long)(eap->line2 - lnum));
+       if (argvars[1].v_type != VAR_UNKNOWN)
+       {
+@@ -9835,12 +9929,12 @@ filter_map(argvars, rettv, map)
+     typval_T  save_key;
+     int               rem;
+     int               todo;
+     char_u    *ermsg = map ? (char_u *)"map()" : (char_u *)"filter()";
+     int               save_did_emsg;
++    int               index = 0;
  
-     /* ":append" on the line above the deleted lines. */
-     eap->line2 = eap->line1;
-     ex_append(eap);
-@@ -4020,12 +4039,14 @@ ex_z(eap)
-      * 'scroll' */
-     if (eap->forceit)
-       bigness = curwin->w_height;
-     else if (firstwin == lastwin)
-       bigness = curwin->w_p_scr * 2;
-+#ifdef FEAT_WINDOWS
-     else
-       bigness = curwin->w_height - 3;
-+#endif
-     if (bigness < 1)
-       bigness = 1;
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type == VAR_LIST)
+     {
+       if ((l = argvars[0].vval.v_list) == NULL
+               || (map && tv_check_lock(l->lv_lock, ermsg)))
+           return;
+@@ -9869,13 +9963,13 @@ filter_map(argvars, rettv, map)
+       /* We reset "did_emsg" to be able to detect whether an error
+        * occurred during evaluation of the expression. */
+       save_did_emsg = did_emsg;
+       did_emsg = FALSE;
  
-     x = eap->arg;
-     kind = x;
-@@ -4470,11 +4491,11 @@ do_sub(eap)
-           char_u      *new_end, *new_start = NULL;
-           unsigned    new_start_len = 0;
-           char_u      *p1;
-           int         did_sub = FALSE;
-           int         lastone;
--          unsigned    len, needed_len;
-+          int         len, copy_len, needed_len;
-           long        nmatch_tl = 0;  /* nr of lines matched below lnum */
-           int         do_again;       /* do it again after joining lines */
-           int         skip_match = FALSE;
-           linenr_T    sub_firstlnum;  /* nr of first sub line */
++      prepare_vimvar(VV_KEY, &save_key);
+       if (argvars[0].v_type == VAR_DICT)
+       {
+-          prepare_vimvar(VV_KEY, &save_key);
+           vimvars[VV_KEY].vv_type = VAR_STRING;
  
-@@ -4615,10 +4636,12 @@ do_sub(eap)
-                   goto skip;
+           ht = &d->dv_hashtab;
+           hash_lock(ht);
+           todo = (int)ht->ht_used;
+@@ -9895,28 +9989,31 @@ filter_map(argvars, rettv, map)
+                       dictitem_remove(d, di);
+                   clear_tv(&vimvars[VV_KEY].vv_tv);
                }
-               if (do_ask)
-               {
-+                  int typed = 0;
+           }
+           hash_unlock(ht);
+-
+-          restore_vimvar(VV_KEY, &save_key);
+       }
+       else
+       {
++          vimvars[VV_KEY].vv_type = VAR_NUMBER;
 +
-                   /* change State to CONFIRM, so that the mouse works
-                    * properly */
-                   save_State = State;
-                   State = CONFIRM;
- #ifdef FEAT_MOUSE
-@@ -4653,11 +4676,11 @@ do_sub(eap)
-                               msg_putchar('^');
-                           resp = getexmodeline('?', NULL, 0);
-                           if (resp != NULL)
-                           {
--                              i = *resp;
-+                              typed = *resp;
-                               vim_free(resp);
-                           }
-                       }
-                       else
-                       {
-@@ -4705,61 +4728,61 @@ do_sub(eap)
- #ifdef USE_ON_FLY_SCROLL
-                           dont_scroll = FALSE; /* allow scrolling here */
- #endif
-                           ++no_mapping;       /* don't map this key */
-                           ++allow_keys;       /* allow special keys */
--                          i = plain_vgetc();
-+                          typed = plain_vgetc();
-                           --allow_keys;
-                           --no_mapping;
-                           /* clear the question */
-                           msg_didout = FALSE; /* don't scroll up */
-                           msg_col = 0;
-                           gotocmdline(TRUE);
-                       }
-                       need_wait_return = FALSE; /* no hit-return prompt */
--                      if (i == 'q' || i == ESC || i == Ctrl_C
-+                      if (typed == 'q' || typed == ESC || typed == Ctrl_C
- #ifdef UNIX
--                              || i == intr_char
-+                              || typed == intr_char
- #endif
-                               )
-                       {
-                           got_quit = TRUE;
-                           break;
-                       }
--                      if (i == 'n')
-+                      if (typed == 'n')
-                           break;
--                      if (i == 'y')
-+                      if (typed == 'y')
-                           break;
--                      if (i == 'l')
-+                      if (typed == 'l')
-                       {
-                           /* last: replace and then stop */
-                           do_all = FALSE;
-                           line2 = lnum;
-                           break;
-                       }
--                      if (i == 'a')
-+                      if (typed == 'a')
-                       {
-                           do_ask = FALSE;
-                           break;
-                       }
- #ifdef FEAT_INS_EXPAND
--                      if (i == Ctrl_E)
-+                      if (typed == Ctrl_E)
-                           scrollup_clamp();
--                      else if (i == Ctrl_Y)
-+                      else if (typed == Ctrl_Y)
-                           scrolldown_clamp();
- #endif
-                   }
-                   State = save_State;
- #ifdef FEAT_MOUSE
-                   setmouse();
- #endif
-                   if (vim_strchr(p_cpo, CPO_UNDO) != NULL)
-                       --no_u_sync;
--                  if (i == 'n')
-+                  if (typed == 'n')
-                   {
-                       /* For a multi-line match, put matchcol at the NUL at
-                        * the end of the line and set nmatch to one, so that
-                        * we continue looking for a match on the next line.
-                        * Avoids that ":%s/\nB\@=//gc" and ":%s/\n/,\r/gc"
-@@ -4806,13 +4829,13 @@ do_sub(eap)
-               else
-               {
-                   p1 = ml_get(sub_firstlnum + nmatch - 1);
-                   nmatch_tl += nmatch - 1;
-               }
--              i = regmatch.startpos[0].col - copycol;
--              needed_len = i + ((unsigned)STRLEN(p1) - regmatch.endpos[0].col)
--                                                               + sublen + 1;
-+              copy_len = regmatch.startpos[0].col - copycol;
-+              needed_len = copy_len + ((unsigned)STRLEN(p1)
-+                                     - regmatch.endpos[0].col) + sublen + 1;
-               if (new_start == NULL)
-               {
-                   /*
-                    * Get some space for a temporary buffer to do the
-                    * substitution into (and some extra space to avoid
-@@ -4831,11 +4854,11 @@ do_sub(eap)
-                    * substitution into.  If not, make it larger (with a bit
-                    * extra to avoid too many calls to alloc()/free()).
-                    */
-                   len = (unsigned)STRLEN(new_start);
-                   needed_len += len;
--                  if (needed_len > new_start_len)
-+                  if (needed_len > (int)new_start_len)
-                   {
-                       new_start_len = needed_len + 50;
-                       if ((p1 = alloc_check(new_start_len)) == NULL)
-                       {
-                           vim_free(new_start);
-@@ -4849,12 +4872,12 @@ do_sub(eap)
-               }
-               /*
-                * copy the text up to the part that matched
-                */
--              mch_memmove(new_end, sub_firstline + copycol, (size_t)i);
--              new_end += i;
-+              mch_memmove(new_end, sub_firstline + copycol, (size_t)copy_len);
-+              new_end += copy_len;
-               (void)vim_regsub_multi(&regmatch,
-                                   sub_firstlnum - regmatch.startpos[0].lnum,
-                                          sub, new_end, TRUE, p_magic, TRUE);
-               sub_nsubs++;
-@@ -5057,10 +5080,11 @@ skip:
-               line_breakcheck();
+           for (li = l->lv_first; li != NULL; li = nli)
+           {
+               if (tv_check_lock(li->li_tv.v_lock, ermsg))
+                   break;
+               nli = li->li_next;
++              vimvars[VV_KEY].vv_nr = index;
+               if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL
+                                                                 || did_emsg)
+                   break;
+               if (!map && rem)
+                   listitem_remove(l, li);
++              ++index;
            }
-           if (did_sub)
-               ++sub_nlines;
-+          vim_free(new_start);        /* for when substitute was cancelled */
-           vim_free(sub_firstline);    /* free the copy of the original line */
-           sub_firstline = NULL;
        }
  
-       line_breakcheck();
-@@ -5608,11 +5632,17 @@ ex_help(eap)
-            * set b_p_ro flag).
-            * Set the alternate file to the previously edited file.
-            */
-           alt_fnum = curbuf->b_fnum;
-           (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL,
--                                                 ECMD_HIDE + ECMD_SET_HELP);
-+                        ECMD_HIDE + ECMD_SET_HELP,
-+#ifdef FEAT_WINDOWS
-+                        NULL  /* buffer is still open, don't store info */
-+#else
-+                        curwin
-+#endif
-+                  );
-           if (!cmdmod.keepalt)
-               curwin->w_alt_fnum = alt_fnum;
-           empty_fnum = curbuf->b_fnum;
-       }
++      restore_vimvar(VV_KEY, &save_key);
+       restore_vimvar(VV_VAL, &save_val);
+       did_emsg |= save_did_emsg;
      }
-@@ -5767,11 +5797,11 @@ find_help_tags(arg, num_matches, matches
  
-     /*
-      * Recognize a few exceptions to the rule.        Some strings that contain '*'
-      * with "star".  Otherwise '*' is recognized as a wildcard.
-      */
--    for (i = sizeof(mtable) / sizeof(char *); --i >= 0; )
-+    for (i = (int)(sizeof(mtable) / sizeof(char *)); --i >= 0; )
-       if (STRCMP(arg, mtable[i]) == 0)
-       {
-           STRCPY(d, rtable[i]);
-           break;
-       }
-@@ -6091,25 +6121,23 @@ fix_help_buffer()
+@@ -10019,12 +10116,10 @@ f_float2nr(argvars, rettv)
+       else if (f > 0x7fffffff)
+           rettv->vval.v_number = 0x7fffffff;
+       else
+           rettv->vval.v_number = (varnumber_T)f;
+     }
+-    else
+-      rettv->vval.v_number = 0;
  }
  
  /*
-  * ":exusage"
+  * "floor({float})" function
+  */
+@@ -10154,22 +10249,19 @@ f_foldlevel(argvars, rettv)
+     linenr_T  lnum;
+     lnum = get_tv_lnum(argvars);
+     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
+       rettv->vval.v_number = foldLevel(lnum);
+-    else
+ #endif
+-      rettv->vval.v_number = 0;
+ }
+ /*
+  * "foldtext()" function
   */
 -/*ARGSUSED*/
-     void
- ex_exusage(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+     static void
+ f_foldtext(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     do_cmdline_cmd((char_u *)"help ex-cmd-index");
+ #ifdef FEAT_FOLDING
+     linenr_T  lnum;
+     char_u    *s;
+@@ -10230,14 +10322,13 @@ f_foldtext(argvars, rettv)
  }
  
  /*
-  * ":viusage"
+  * "foldtextresult(lnum)" function
   */
 -/*ARGSUSED*/
-     void
- ex_viusage(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+     static void
+ f_foldtextresult(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     do_cmdline_cmd((char_u *)"help normal-index");
+ #ifdef FEAT_FOLDING
+     linenr_T  lnum;
+     char_u    *text;
+@@ -10266,17 +10357,15 @@ f_foldtextresult(argvars, rettv)
  }
  
- #if defined(FEAT_EX_EXTRA) || defined(PROTO)
-@@ -6517,26 +6545,15 @@ struct sign
- };
+ /*
+  * "foreground()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_foreground(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+-    rettv->vval.v_number = 0;
+ #ifdef FEAT_GUI
+     if (gui.in_use)
+       gui_mch_set_foreground();
+ #else
+ # ifdef WIN32
+@@ -10286,23 +10375,22 @@ f_foreground(argvars, rettv)
+ }
  
- static sign_T *first_sign = NULL;
- static int    last_sign_typenr = MAX_TYPENR;  /* is decremented */
+ /*
+  * "function()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_function(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+     char_u    *s;
  
-+static int sign_cmd_idx __ARGS((char_u *begin_cmd, char_u *end_cmd));
- static void sign_list_defined __ARGS((sign_T *sp));
-+static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev));
+-    rettv->vval.v_number = 0;
+     s = get_tv_string(&argvars[0]);
+     if (s == NULL || *s == NUL || VIM_ISDIGIT(*s))
+       EMSG2(_(e_invarg2), s);
+-    else if (!function_exists(s))
++    /* Don't check an autoload name for existence here. */
++    else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s))
+       EMSG2(_("E700: Unknown function: %s"), s);
+     else
+     {
+       rettv->vval.v_string = vim_strsave(s);
+       rettv->v_type = VAR_FUNC;
+@@ -10310,15 +10398,14 @@ f_function(argvars, rettv)
+ }
  
--/*
-- * ":sign" command
-- */
--    void
--ex_sign(eap)
--    exarg_T   *eap;
--{
--    char_u    *arg = eap->arg;
--    char_u    *p;
--    int               idx;
--    sign_T    *sp;
--    sign_T    *sp_prev;
--    buf_T     *buf;
--    static char       *cmds[] = {
-+static char *cmds[] = {
-                       "define",
- #define SIGNCMD_DEFINE        0
-                       "undefine",
- #define SIGNCMD_UNDEFINE 1
-                       "list",
-@@ -6545,26 +6562,55 @@ ex_sign(eap)
- #define SIGNCMD_PLACE 3
-                       "unplace",
- #define SIGNCMD_UNPLACE       4
-                       "jump",
- #define SIGNCMD_JUMP  5
-+                      NULL
- #define SIGNCMD_LAST  6
--    };
-+};
-+
-+/*
-+ * Find index of a ":sign" subcmd from its name.
-+ * "*end_cmd" must be writable.
-+ */
-+    static int
-+sign_cmd_idx(begin_cmd, end_cmd)
-+    char_u    *begin_cmd;     /* begin of sign subcmd */
-+    char_u    *end_cmd;       /* just after sign subcmd */
-+{
-+    int               idx;
-+    char      save = *end_cmd;
-+
-+    *end_cmd = NUL;
-+    for (idx = 0; ; ++idx)
-+      if (cmds[idx] == NULL || STRCMP(begin_cmd, cmds[idx]) == 0)
-+          break;
-+    *end_cmd = save;
-+    return idx;
-+}
-+
-+/*
-+ * ":sign" command
-+ */
-+    void
-+ex_sign(eap)
-+    exarg_T   *eap;
-+{
-+    char_u    *arg = eap->arg;
-+    char_u    *p;
-+    int               idx;
-+    sign_T    *sp;
-+    sign_T    *sp_prev;
-+    buf_T     *buf;
+ /*
+  * "garbagecollect()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_garbagecollect(argvars, rettv)
+     typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *rettv UNUSED;
+ {
+     /* This is postponed until we are back at the toplevel, because we may be
+      * using Lists and Dicts internally.  E.g.: ":echo [garbagecollect()]". */
+     want_garbage_collect = TRUE;
  
-     /* Parse the subcommand. */
-     p = skiptowhite(arg);
--    if (*p != NUL)
--      *p++ = NUL;
--    for (idx = 0; ; ++idx)
-+    idx = sign_cmd_idx(arg, p);
-+    if (idx == SIGNCMD_LAST)
+@@ -10363,13 +10450,11 @@ f_get(argvars, rettv)
+     else
+       EMSG2(_(e_listdictarg), "get()");
+     if (tv == NULL)
      {
--      if (idx == SIGNCMD_LAST)
--      {
--          EMSG2(_("E160: Unknown sign command: %s"), arg);
+-      if (argvars[2].v_type == VAR_UNKNOWN)
+-          rettv->vval.v_number = 0;
+-      else
++      if (argvars[2].v_type != VAR_UNKNOWN)
+           copy_tv(&argvars[2], rettv);
+     }
+     else
+       copy_tv(tv, rettv);
+ }
+@@ -10390,17 +10475,12 @@ get_buffer_lines(buf, start, end, retlis
+     int               retlist;
+     typval_T  *rettv;
+ {
+     char_u    *p;
+-    if (retlist)
+-    {
+-      if (rettv_list_alloc(rettv) == FAIL)
 -          return;
--      }
--      if (STRCMP(arg, cmds[idx]) == 0)
--          break;
-+      EMSG2(_("E160: Unknown sign command: %s"), arg);
+-    }
+-    else
+-      rettv->vval.v_number = 0;
++    if (retlist && rettv_list_alloc(rettv) == FAIL)
 +      return;
-     }
-     arg = skipwhite(p);
  
-     if (idx <= SIGNCMD_LIST)
-     {
-@@ -6726,28 +6772,12 @@ ex_sign(eap)
-               EMSG2(_("E155: Unknown sign: %s"), arg);
-           else if (idx == SIGNCMD_LIST)
-               /* ":sign list {name}" */
-               sign_list_defined(sp);
-           else
--          {
-               /* ":sign undefine {name}" */
--              vim_free(sp->sn_name);
--              vim_free(sp->sn_icon);
--#ifdef FEAT_SIGN_ICONS
--              if (sp->sn_image != NULL)
--              {
--                  out_flush();
--                  gui_mch_destroy_sign(sp->sn_image);
--              }
--#endif
--              vim_free(sp->sn_text);
--              if (sp_prev == NULL)
--                  first_sign = sp->sn_next;
--              else
--                  sp_prev->sn_next = sp->sn_next;
--              vim_free(sp);
--          }
-+              sign_undefine(sp, sp_prev);
+     if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0)
+       return;
+     if (!retlist)
+@@ -10600,23 +10680,23 @@ f_getchar(argvars, rettv)
+           win_T       *win;
+           linenr_T    lnum;
+ # ifdef FEAT_WINDOWS
+           win_T       *wp;
+ # endif
+-          int         n = 1;
++          int         winnr = 1;
+           if (row >= 0 && col >= 0)
+           {
+               /* Find the window at the mouse coordinates and compute the
+                * text position. */
+               win = mouse_find_win(&row, &col);
+               (void)mouse_comp_pos(win, &row, &col, &lnum);
+ # ifdef FEAT_WINDOWS
+               for (wp = firstwin; wp != win; wp = wp->w_next)
+-                  ++n;
++                  ++winnr;
+ # endif
+-              vimvars[VV_MOUSE_WIN].vv_nr = n;
++              vimvars[VV_MOUSE_WIN].vv_nr = winnr;
+               vimvars[VV_MOUSE_LNUM].vv_nr = lnum;
+               vimvars[VV_MOUSE_COL].vv_nr = col + 1;
+           }
        }
-     }
-     else
+ #endif
+@@ -10624,51 +10704,47 @@ f_getchar(argvars, rettv)
+ }
+ /*
+  * "getcharmod()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getcharmod(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = mod_mask;
+ }
+ /*
+  * "getcmdline()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getcmdline(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->v_type = VAR_STRING;
+     rettv->vval.v_string = get_cmdline_str();
+ }
+ /*
+  * "getcmdpos()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getcmdpos(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = get_cmdline_pos() + 1;
+ }
+ /*
+  * "getcmdtype()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getcmdtype(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->v_type = VAR_STRING;
+     rettv->vval.v_string = alloc(2);
+     if (rettv->vval.v_string != NULL)
+@@ -10679,14 +10755,13 @@ f_getcmdtype(argvars, rettv)
+ }
+ /*
+  * "getcwd()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getcwd(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     char_u    cwd[MAXPATHL];
+     rettv->v_type = VAR_STRING;
+@@ -10703,14 +10778,13 @@ f_getcwd(argvars, rettv)
+ }
+ /*
+  * "getfontname()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getfontname(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->v_type = VAR_STRING;
+     rettv->vval.v_string = NULL;
+ #ifdef FEAT_GUI
+@@ -10933,22 +11007,19 @@ f_getline(argvars, rettv)
+ }
+ /*
+  * "getmatches()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getmatches(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+ #ifdef FEAT_SEARCH_EXTRA
+     dict_T    *dict;
+     matchitem_T       *cur = curwin->w_match_head;
+-    rettv->vval.v_number = 0;
+-
+     if (rettv_list_alloc(rettv) == OK)
      {
-       int             id = -1;
-@@ -6992,10 +7022,35 @@ sign_list_defined(sp)
-           msg_puts(p);
-     }
+       while (cur != NULL)
+       {
+           dict = dict_alloc();
+@@ -10966,14 +11037,13 @@ f_getmatches(argvars, rettv)
  }
  
  /*
-+ * Undefine a sign and free its memory.
-+ */
-+    static void
-+sign_undefine(sp, sp_prev)
-+    sign_T    *sp;
-+    sign_T    *sp_prev;
-+{
-+    vim_free(sp->sn_name);
-+    vim_free(sp->sn_icon);
-+#ifdef FEAT_SIGN_ICONS
-+    if (sp->sn_image != NULL)
+  * "getpid()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getpid(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = mch_get_pid();
+ }
+@@ -11013,21 +11083,19 @@ f_getpos(argvars, rettv)
+ }
+ /*
+  * "getqflist()" and "getloclist()" functions
+  */
+-/*ARGSUSED*/
+     static void
+ f_getqflist(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+ #ifdef FEAT_QUICKFIX
+     win_T     *wp;
+ #endif
+-    rettv->vval.v_number = 0;
+ #ifdef FEAT_QUICKFIX
+     if (rettv_list_alloc(rettv) == OK)
+     {
+       wp = NULL;
+       if (argvars[0].v_type != VAR_UNKNOWN)   /* getloclist() */
+@@ -11133,14 +11201,13 @@ f_gettabwinvar(argvars, rettv)
+ }
+ /*
+  * "getwinposx()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getwinposx(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = -1;
+ #ifdef FEAT_GUI
+     if (gui.in_use)
+@@ -11154,14 +11221,13 @@ f_getwinposx(argvars, rettv)
+ }
+ /*
+  * "getwinposy()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_getwinposy(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->vval.v_number = -1;
+ #ifdef FEAT_GUI
+     if (gui.in_use)
+@@ -11282,35 +11348,55 @@ getwinvar(argvars, rettv, off)
+     static void
+ f_glob(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
++    int               flags = WILD_SILENT|WILD_USE_NL;
+     expand_T  xpc;
++    int               error = FALSE;
+-    ExpandInit(&xpc);
+-    xpc.xp_context = EXPAND_FILES;
++    /* When the optional second argument is non-zero, don't remove matches
++    * for 'wildignore' and don't put matches for 'suffixes' at the end. */
++    if (argvars[1].v_type != VAR_UNKNOWN
++                              && get_tv_number_chk(&argvars[1], &error))
++      flags |= WILD_KEEP_ALL;
+     rettv->v_type = VAR_STRING;
+-    rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
+-                                   NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
++    if (!error)
 +    {
-+      out_flush();
-+      gui_mch_destroy_sign(sp->sn_image);
++      ExpandInit(&xpc);
++      xpc.xp_context = EXPAND_FILES;
++      rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
++                                                     NULL, flags, WILD_ALL);
 +    }
-+#endif
-+    vim_free(sp->sn_text);
-+    if (sp_prev == NULL)
-+      first_sign = sp->sn_next;
 +    else
-+      sp_prev->sn_next = sp->sn_next;
-+    vim_free(sp);
-+}
-+
-+/*
-  * Get highlighting attribute for sign "typenr".
-  * If "line" is TRUE: line highl, if FALSE: text highl.
-  */
-     int
- sign_get_attr(typenr, line)
-@@ -7065,10 +7120,201 @@ sign_typenr2name(typenr)
-       if (sp->sn_typenr == typenr)
-           return sp->sn_name;
-     return (char_u *)_("[Deleted]");
++      rettv->vval.v_string = NULL;
  }
  
-+#if defined(EXITFREE) || defined(PROTO)
-+/*
-+ * Undefine/free all signs.
-+ */
-+    void
-+free_signs()
-+{
-+    while (first_sign != NULL)
-+      sign_undefine(first_sign, NULL);
-+}
-+#endif
-+
-+#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
-+static enum
-+{
-+    EXP_SUBCMD,               /* expand :sign sub-commands */
-+    EXP_DEFINE,               /* expand :sign define {name} args */
-+    EXP_PLACE,                /* expand :sign place {id} args */
-+    EXP_UNPLACE,      /* expand :sign unplace" */
-+    EXP_SIGN_NAMES    /* expand with name of placed signs */
-+} expand_what;
-+
-+/*
-+ * Function given to ExpandGeneric() to obtain the sign command
-+ * expansion.
-+ */
-+    char_u *
-+get_sign_name(xp, idx)
-+    expand_T  *xp UNUSED;
-+    int               idx;
-+{
-+    sign_T    *sp;
-+    int               current_idx;
-+
-+    switch (expand_what)
-+    {
-+    case EXP_SUBCMD:
-+      return (char_u *)cmds[idx];
-+    case EXP_DEFINE:
-+      {
-+          char *define_arg[] =
-+          {
-+              "icon=", "linehl=", "text=", "texthl=", NULL
-+          };
-+          return (char_u *)define_arg[idx];
-+      }
-+    case EXP_PLACE:
-+      {
-+          char *place_arg[] =
-+          {
-+              "line=", "name=", "file=", "buffer=", NULL
-+          };
-+          return (char_u *)place_arg[idx];
-+      }
-+    case EXP_UNPLACE:
-+      {
-+          char *unplace_arg[] = { "file=", "buffer=", NULL };
-+          return (char_u *)unplace_arg[idx];
-+      }
-+    case EXP_SIGN_NAMES:
-+      /* Complete with name of signs already defined */
-+      current_idx = 0;
-+      for (sp = first_sign; sp != NULL; sp = sp->sn_next)
-+          if (current_idx++ == idx)
-+              return sp->sn_name;
-+      return NULL;
-+    default:
-+      return NULL;
-+    }
-+}
-+
-+/*
-+ * Handle command line completion for :sign command.
-+ */
-+    void
-+set_context_in_sign_cmd(xp, arg)
-+    expand_T  *xp;
-+    char_u    *arg;
-+{
-+    char_u    *p;
-+    char_u    *end_subcmd;
-+    char_u    *last;
-+    int               cmd_idx;
-+    char_u    *begin_subcmd_args;
-+
-+    /* Default: expand subcommands. */
-+    xp->xp_context = EXPAND_SIGN;
-+    expand_what = EXP_SUBCMD;
-+    xp->xp_pattern = arg;
-+
-+    end_subcmd = skiptowhite(arg);
-+    if (*end_subcmd == NUL)
-+      /* expand subcmd name
-+       * :sign {subcmd}<CTRL-D>*/
-+      return;
-+
-+    cmd_idx = sign_cmd_idx(arg, end_subcmd);
-+
-+    /* :sign {subcmd} {subcmd_args}
-+     *                |
-+     *                begin_subcmd_args */
-+    begin_subcmd_args = skipwhite(end_subcmd);
-+    p = skiptowhite(begin_subcmd_args);
-+    if (*p == NUL)
-+    {
-+      /*
-+       * Expand first argument of subcmd when possible.
-+       * For ":jump {id}" and ":unplace {id}", we could
-+       * possibly expand the ids of all signs already placed.
-+       */
-+      xp->xp_pattern = begin_subcmd_args;
-+      switch (cmd_idx)
-+      {
-+          case SIGNCMD_LIST:
-+          case SIGNCMD_UNDEFINE:
-+              /* :sign list <CTRL-D>
-+               * :sign undefine <CTRL-D> */
-+              expand_what = EXP_SIGN_NAMES;
-+              break;
-+          default:
-+              xp->xp_context = EXPAND_NOTHING;
-+      }
-+      return;
-+    }
-+
-+    /* expand last argument of subcmd */
-+
-+    /* :sign define {name} {args}...
-+     *              |
-+     *              p */
-+
-+    /* Loop until reaching last argument. */
-+    do
-+    {
-+      p = skipwhite(p);
-+      last = p;
-+      p = skiptowhite(p);
-+    } while (*p != NUL);
-+
-+    p = vim_strchr(last, '=');
-+
-+    /* :sign define {name} {args}... {last}=
-+     *                               |     |
-+     *                            last     p */
-+    if (p == NUL)
-+    {
-+      /* Expand last argument name (before equal sign). */
-+      xp->xp_pattern = last;
-+      switch (cmd_idx)
-+      {
-+          case SIGNCMD_DEFINE:
-+              expand_what = EXP_DEFINE;
-+              break;
-+          case SIGNCMD_PLACE:
-+              expand_what = EXP_PLACE;
-+              break;
-+          case SIGNCMD_JUMP:
-+          case SIGNCMD_UNPLACE:
-+              expand_what = EXP_UNPLACE;
-+              break;
-+          default:
-+              xp->xp_context = EXPAND_NOTHING;
-+      }
-+    }
-+    else
-+    {
-+      /* Expand last argument value (after equal sign). */
-+      xp->xp_pattern = p + 1;
-+      switch (cmd_idx)
-+      {
-+          case SIGNCMD_DEFINE:
-+              if (STRNCMP(last, "texthl", p - last) == 0 ||
-+                  STRNCMP(last, "linehl", p - last) == 0)
-+                  xp->xp_context = EXPAND_HIGHLIGHT;
-+              else if (STRNCMP(last, "icon", p - last) == 0)
-+                  xp->xp_context = EXPAND_FILES;
-+              else
-+                  xp->xp_context = EXPAND_NOTHING;
-+              break;
-+          case SIGNCMD_PLACE:
-+              if (STRNCMP(last, "name", p - last) == 0)
-+                  expand_what = EXP_SIGN_NAMES;
-+              else
-+                  xp->xp_context = EXPAND_NOTHING;
-+              break;
-+          default:
-+              xp->xp_context = EXPAND_NOTHING;
-+      }
-+    }
-+}
-+#endif
- #endif
- #if defined(FEAT_GUI) || defined(FEAT_CLIENTSERVER) || defined(PROTO)
  /*
-  * ":drop"
---- vim72.orig/src/ex_cmds.h
-+++ vim72/src/ex_cmds.h
-@@ -276,11 +276,11 @@ EX(CMD_cpfile,           "cpfile",       ex_cnext,
- EX(CMD_cquit,         "cquit",        ex_cquit,
-                       TRLBAR|BANG),
- EX(CMD_crewind,               "crewind",      ex_cc,
-                       RANGE|NOTADR|COUNT|TRLBAR|BANG),
- EX(CMD_cscope,                "cscope",       do_cscope,
--                      EXTRA|NOTRLCOM|SBOXOK|XFILE),
-+                      EXTRA|NOTRLCOM|XFILE),
- EX(CMD_cstag,         "cstag",        do_cstag,
-                       BANG|TRLBAR|WORD1),
- EX(CMD_cunmap,                "cunmap",       ex_unmap,
-                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_cunabbrev,     "cunabbrev",    ex_abbreviate,
-@@ -504,11 +504,11 @@ EX(CMD_lcd,              "lcd",          ex_cd,
- EX(CMD_lchdir,                "lchdir",       ex_cd,
-                       BANG|FILE1|TRLBAR|CMDWIN),
- EX(CMD_lclose,                "lclose",       ex_cclose,
-                       RANGE|NOTADR|COUNT|TRLBAR),
- EX(CMD_lcscope,               "lcscope",      do_cscope,
--                      EXTRA|NOTRLCOM|SBOXOK|XFILE),
-+                      EXTRA|NOTRLCOM|XFILE),
- EX(CMD_left,          "left",         ex_align,
-                       TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
- EX(CMD_leftabove,     "leftabove",    ex_wrongmodifier,
-                       NEEDARG|EXTRA|NOTRLCOM),
- EX(CMD_let,           "let",          ex_let,
-@@ -633,10 +633,12 @@ EX(CMD_nnoremap, "nnoremap",     ex_map,
-                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_nnoremenu,     "nnoremenu",    ex_menu,
-                       RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_noremap,               "noremap",      ex_map,
-                       BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
-+EX(CMD_noautocmd,     "noautocmd",    ex_wrongmodifier,
-+                      NEEDARG|EXTRA|NOTRLCOM),
- EX(CMD_nohlsearch,    "nohlsearch",   ex_nohlsearch,
-                       TRLBAR|SBOXOK|CMDWIN),
- EX(CMD_noreabbrev,    "noreabbrev",   ex_abbreviate,
-                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_noremenu,      "noremenu",     ex_menu,
-@@ -649,10 +651,12 @@ EX(CMD_nunmap,           "nunmap",       ex_unmap,
-                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_nunmenu,               "nunmenu",      ex_menu,
-                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_open,          "open",         ex_open,
-                       RANGE|EXTRA),
-+EX(CMD_oldfiles,      "oldfiles",     ex_oldfiles,
-+                      BANG|TRLBAR|SBOXOK|CMDWIN),
- EX(CMD_omap,          "omap",         ex_map,
-                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_omapclear,     "omapclear",    ex_mapclear,
-                       EXTRA|TRLBAR|CMDWIN),
- EX(CMD_omenu,         "omenu",        ex_menu,
-@@ -800,11 +804,11 @@ EX(CMD_sbrewind, "sbrewind",     ex_brewind,
- EX(CMD_scriptnames,   "scriptnames",  ex_scriptnames,
-                       TRLBAR|CMDWIN),
- EX(CMD_scriptencoding,        "scriptencoding", ex_scriptencoding,
-                       WORD1|TRLBAR|CMDWIN),
- EX(CMD_scscope,               "scscope",      do_scscope,
--                      EXTRA|NOTRLCOM|SBOXOK),
-+                      EXTRA|NOTRLCOM),
- EX(CMD_set,           "set",          ex_set,
-                       TRLBAR|EXTRA|CMDWIN|SBOXOK),
- EX(CMD_setfiletype,   "setfiletype",  ex_setfiletype,
-                       TRLBAR|EXTRA|NEEDARG|CMDWIN),
- EX(CMD_setglobal,     "setglobal",    ex_set,
-@@ -985,10 +989,12 @@ EX(CMD_unlockvar,        "unlockvar",    ex_lockva
-                       BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN),
- EX(CMD_unmap,         "unmap",        ex_unmap,
-                       BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
- EX(CMD_unmenu,                "unmenu",       ex_menu,
-                       BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
-+EX(CMD_unsilent,      "unsilent",     ex_wrongmodifier,
-+                      NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
- EX(CMD_update,                "update",       ex_update,
-                       RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR),
- EX(CMD_vglobal,               "vglobal",      ex_global,
-                       RANGE|WHOLEFOLD|EXTRA|DFLALL|CMDWIN),
- EX(CMD_version,               "version",      ex_version,
---- vim72.orig/src/ex_docmd.c
-+++ vim72/src/ex_docmd.c
-@@ -24,14 +24,16 @@ typedef struct ucmd
+  * "globpath()" function
+  */
+     static void
+ f_globpath(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
  {
-     char_u    *uc_name;       /* The command name */
-     long_u    uc_argt;        /* The argument type */
-     char_u    *uc_rep;        /* The command's replacement string */
-     long      uc_def;         /* The default value for a range/count */
--    scid_T    uc_scriptID;    /* SID where the command was defined */
-     int               uc_compl;       /* completion type */
--# if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
-+# ifdef FEAT_EVAL
-+    scid_T    uc_scriptID;    /* SID where the command was defined */
-+#  ifdef FEAT_CMDL_COMPL
-     char_u    *uc_compl_arg;  /* completion argument if any */
-+#  endif
- # endif
- } ucmd_T;
- #define UC_BUFFER     1       /* -buffer: local to current buffer */
++    int               flags = 0;
+     char_u    buf1[NUMBUFLEN];
+     char_u    *file = get_tv_string_buf_chk(&argvars[1], buf1);
++    int               error = FALSE;
  
-@@ -362,10 +364,11 @@ static void      ex_tag_cmd __ARGS((exarg_T *
- # define ex_lockvar           ex_ni
- # define ex_unlockvar         ex_ni
- # define ex_function          ex_ni
- # define ex_delfunction               ex_ni
- # define ex_return            ex_ni
-+# define ex_oldfiles          ex_ni
- #endif
- static char_u *arg_all __ARGS((void));
- #ifdef FEAT_SESSION
- static int    makeopens __ARGS((FILE *fd, char_u *dirnow));
- static int    put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int current_arg_idx));
-@@ -1575,15 +1578,14 @@ free_cmdlines(gap)
++    /* When the optional second argument is non-zero, don't remove matches
++    * for 'wildignore' and don't put matches for 'suffixes' at the end. */
++    if (argvars[2].v_type != VAR_UNKNOWN
++                              && get_tv_number_chk(&argvars[2], &error))
++      flags |= WILD_KEEP_ALL;
+     rettv->v_type = VAR_STRING;
+-    if (file == NULL)
++    if (file == NULL || error)
+       rettv->vval.v_string = NULL;
+     else
+-      rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file);
++      rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file,
++                                                                     flags);
+ }
  
  /*
-  * If "fgetline" is get_loop_line(), return TRUE if the getline it uses equals
-  * "func".  * Otherwise return TRUE when "fgetline" equals "func".
-  */
--/*ARGSUSED*/
-     int
- getline_equal(fgetline, cookie, func)
-     char_u    *(*fgetline) __ARGS((int, void *, int));
--    void      *cookie;                /* argument for fgetline() */
-+    void      *cookie UNUSED;         /* argument for fgetline() */
-     char_u    *(*func) __ARGS((int, void *, int));
- {
- #ifdef FEAT_EVAL
-     char_u            *(*gp) __ARGS((int, void *, int));
-     struct loop_cookie *cp;
-@@ -1607,14 +1609,13 @@ getline_equal(fgetline, cookie, func)
- #if defined(FEAT_EVAL) || defined(FEAT_MBYTE) || defined(PROTO)
- /*
-  * If "fgetline" is get_loop_line(), return the cookie used by the original
-  * getline function.  Otherwise return "cookie".
+  * "has()" function
   */
--/*ARGSUSED*/
-     void *
- getline_cookie(fgetline, cookie)
--    char_u    *(*fgetline) __ARGS((int, void *, int));
-+    char_u    *(*fgetline) __ARGS((int, void *, int)) UNUSED;
-     void      *cookie;                /* argument for fgetline() */
- {
- # ifdef FEAT_EVAL
-     char_u            *(*gp) __ARGS((int, void *, int));
-     struct loop_cookie *cp;
-@@ -1676,12 +1677,12 @@ do_one_cmd(cmdlinep, sourcing,
-     linenr_T          lnum;
-     long              n;
-     char_u            *errormsg = NULL;       /* error message */
-     exarg_T           ea;                     /* Ex command arguments */
-     long              verbose_save = -1;
--    int                       save_msg_scroll = 0;
--    int                       did_silent = 0;
-+    int                       save_msg_scroll = msg_scroll;
-+    int                       save_msg_silent = -1;
-     int                       did_esilent = 0;
- #ifdef HAVE_SANDBOX
-     int                       did_sandbox = FALSE;
+@@ -11368,11 +11454,11 @@ f_has(argvars, rettv)
+       "win32",
  #endif
-     cmdmod_T          save_cmdmod;
-@@ -1768,11 +1769,11 @@ do_one_cmd(cmdlinep, sourcing,
+ #if defined(UNIX) && (defined(__CYGWIN32__) || defined(__CYGWIN__))
+       "win32unix",
  #endif
-                           continue;
-                       }
-                       if (checkforcmd(&ea.cmd, "browse", 3))
-                       {
--#ifdef FEAT_BROWSE
-+#ifdef FEAT_BROWSE_CMD
-                           cmdmod.browse = TRUE;
+-#ifdef WIN64
++#if defined(WIN64) || defined(_WIN64)
+       "win64",
  #endif
-                           continue;
-                       }
-                       if (!checkforcmd(&ea.cmd, "botright", 2))
-@@ -1855,13 +1856,13 @@ do_one_cmd(cmdlinep, sourcing,
+ #ifdef EBCDIC
+       "ebcdic",
  #endif
-                           continue;
-                       }
-                       if (!checkforcmd(&ea.cmd, "silent", 3))
-                           break;
--                      ++did_silent;
-+                      if (save_msg_silent == -1)
-+                          save_msg_silent = msg_silent;
-                       ++msg_silent;
--                      save_msg_scroll = msg_scroll;
-                       if (*ea.cmd == '!' && !vim_iswhite(ea.cmd[-1]))
-                       {
-                           /* ":silent!", but not "silent !cmd" */
-                           ea.cmd = skipwhite(ea.cmd + 1);
-                           ++emsg_silent;
-@@ -1885,10 +1886,17 @@ do_one_cmd(cmdlinep, sourcing,
- #ifdef FEAT_WINDOWS
-                       cmdmod.split |= WSP_TOP;
+@@ -11655,10 +11741,13 @@ f_has(argvars, rettv)
+       "smartindent",
  #endif
-                       continue;
-+          case 'u':   if (!checkforcmd(&ea.cmd, "unsilent", 3))
-+                          break;
-+                      if (save_msg_silent == -1)
-+                          save_msg_silent = msg_silent;
-+                      msg_silent = 0;
-+                      continue;
-+
-           case 'v':   if (checkforcmd(&ea.cmd, "vertical", 4))
-                       {
- #ifdef FEAT_VERTSPLIT
-                           cmdmod.split |= WSP_VERT;
+ #ifdef FEAT_SNIFF
+       "sniff",
  #endif
-@@ -2683,23 +2691,27 @@ doend:
-     }
++#ifdef STARTUPTIME
++      "startuptime",
++#endif
+ #ifdef FEAT_STL_OPT
+       "statusline",
  #endif
-     cmdmod = save_cmdmod;
--    if (did_silent > 0)
-+    if (save_msg_silent != -1)
+ #ifdef FEAT_SUN_WORKSHOP
+       "sun_workshop",
+@@ -11780,10 +11869,14 @@ f_has(argvars, rettv)
      {
-       /* messages could be enabled for a serious error, need to check if the
-        * counters don't become negative */
--      msg_silent -= did_silent;
--      if (msg_silent < 0)
--          msg_silent = 0;
-+      if (!did_emsg || msg_silent > save_msg_silent)
-+          msg_silent = save_msg_silent;
-       emsg_silent -= did_esilent;
-       if (emsg_silent < 0)
-           emsg_silent = 0;
-       /* Restore msg_scroll, it's set by file I/O commands, even when no
-        * message is actually displayed. */
-       msg_scroll = save_msg_scroll;
-+
-+      /* "silent reg" or "silent echo x" inside "redir" leaves msg_col
-+       * somewhere in the line.  Put it back in the first column. */
-+      if (redirecting())
-+          msg_col = 0;
-     }
- #ifdef HAVE_SANDBOX
-     if (did_sandbox)
-       --sandbox;
-@@ -2729,11 +2741,11 @@ checkforcmd(pp, cmd, len)
-     int               len;            /* required length */
+       if (STRNICMP(name, "patch", 5) == 0)
+           n = has_patch(atoi((char *)name + 5));
+       else if (STRICMP(name, "vim_starting") == 0)
+           n = (starting != 0);
++#ifdef FEAT_MBYTE
++      else if (STRICMP(name, "multi_byte_encoding") == 0)
++          n = has_mbyte;
++#endif
+ #if defined(FEAT_BEVAL) && defined(FEAT_GUI_W32)
+       else if (STRICMP(name, "balloon_multiline") == 0)
+           n = multiline_balloon_available();
+ #endif
+ #ifdef DYNAMIC_TCL
+@@ -11845,11 +11938,10 @@ f_has(argvars, rettv)
+     static void
+ f_has_key(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
  {
-     int               i;
-     for (i = 0; cmd[i] != NUL; ++i)
--      if (cmd[i] != (*pp)[i])
-+      if (((char_u *)cmd)[i] != (*pp)[i])
-           break;
-     if (i >= len && !isalpha((*pp)[i]))
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type != VAR_DICT)
      {
-       *pp = skipwhite(*pp + i);
-       return TRUE;
-@@ -2746,15 +2758,14 @@ checkforcmd(pp, cmd, len)
-  * Start of the name can be found at eap->cmd.
-  * Returns pointer to char after the command name.
-  * "full" is set to TRUE if the whole command name matched.
-  * Returns NULL for an ambiguous user command.
+       EMSG(_(e_dictreq));
+       return;
+     }
+@@ -11861,14 +11953,13 @@ f_has_key(argvars, rettv)
+ }
+ /*
+  * "haslocaldir()" function
   */
 -/*ARGSUSED*/
-     static char_u *
- find_command(eap, full)
-     exarg_T   *eap;
--    int               *full;
-+    int               *full UNUSED;
- {
-     int               len;
-     char_u    *p;
-     int               i;
-@@ -2795,11 +2806,11 @@ find_command(eap, full)
-       if (*eap->cmd == 'd' && (p[-1] == 'l' || p[-1] == 'p'))
-       {
-           /* Check for ":dl", ":dell", etc. to ":deletel": that's
-            * :delete with the 'l' flag.  Same for 'p'. */
-           for (i = 0; i < len; ++i)
--              if (eap->cmd[i] != "delete"[i])
-+              if (eap->cmd[i] != ((char_u *)"delete")[i])
-                   break;
-           if (i == len - 1)
-           {
-               --len;
-               if (p[-1] == 'l')
-@@ -2976,15 +2987,17 @@ static struct cmdmod
-     {"keepalt", 5, FALSE},
-     {"keepjumps", 5, FALSE},
-     {"keepmarks", 3, FALSE},
-     {"leftabove", 5, FALSE},
-     {"lockmarks", 3, FALSE},
-+    {"noautocmd", 3, FALSE},
-     {"rightbelow", 6, FALSE},
-     {"sandbox", 3, FALSE},
-     {"silent", 3, FALSE},
-     {"tab", 3, TRUE},
-     {"topleft", 2, FALSE},
-+    {"unsilent", 3, FALSE},
-     {"verbose", 4, TRUE},
-     {"vertical", 4, FALSE},
- };
- /*
-@@ -2998,11 +3011,11 @@ modifier_len(cmd)
-     int               i, j;
-     char_u    *p = cmd;
-     if (VIM_ISDIGIT(*cmd))
-       p = skipwhite(skipdigits(cmd));
--    for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i)
-+    for (i = 0; i < (int)(sizeof(cmdmods) / sizeof(struct cmdmod)); ++i)
-     {
-       for (j = 0; p[j] != NUL; ++j)
-           if (p[j] != cmdmods[i].name[j])
-               break;
-       if (!isalpha(p[j]) && j >= cmdmods[i].minlen
-@@ -3026,11 +3039,11 @@ cmd_exists(name)
-     int               i;
-     int               j;
-     char_u    *p;
-     /* Check command modifiers. */
--    for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i)
-+    for (i = 0; i < (int)(sizeof(cmdmods) / sizeof(struct cmdmod)); ++i)
-     {
-       for (j = 0; name[j] != NUL; ++j)
-           if (name[j] != cmdmods[i].name[j])
-               break;
-       if (name[j] == NUL && j >= cmdmods[i].minlen)
-@@ -3143,21 +3156,19 @@ set_one_cmd_context(xp, buff)
-       {
-           xp->xp_context = EXPAND_UNSUCCESSFUL;
-           return NULL;
-       }
-       for (ea.cmdidx = (cmdidx_T)0; (int)ea.cmdidx < (int)CMD_SIZE;
--                                       ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1))
--          if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd, (size_t)len) == 0)
-+                                 ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1))
-+          if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd,
-+                                                          (size_t)len) == 0)
-               break;
- #ifdef FEAT_USR_CMDS
-       if (cmd[0] >= 'A' && cmd[0] <= 'Z')
--      {
-           while (ASCII_ISALNUM(*p) || *p == '*')      /* Allow * wild card */
-               ++p;
--          len = (int)(p - cmd);
--      }
- #endif
-     }
-     /*
-      * If the cursor is touching the command, and it ends in an alpha-numeric
-@@ -3606,10 +3617,11 @@ set_one_cmd_context(xp, buff)
- #ifdef FEAT_AUTOCMD
-       case CMD_autocmd:
-           return set_context_in_autocmd(xp, arg, FALSE);
-       case CMD_doautocmd:
-+      case CMD_doautoall:
-           return set_context_in_autocmd(xp, arg, TRUE);
- #endif
-       case CMD_set:
-           set_context_in_set_cmd(xp, arg, 0);
-           break;
-@@ -3678,10 +3690,22 @@ set_one_cmd_context(xp, buff)
-           break;
- #endif
-       case CMD_highlight:
-           set_context_in_highlight_cmd(xp, arg);
-           break;
-+#ifdef FEAT_CSCOPE
-+      case CMD_cscope:
-+      case CMD_lcscope:
-+      case CMD_scscope:
-+          set_context_in_cscope_cmd(xp, arg, ea.cmdidx);
-+          break;
-+#endif
-+#ifdef FEAT_SIGNS
-+      case CMD_sign:
-+          set_context_in_sign_cmd(xp, arg);
-+          break;
-+#endif
- #ifdef FEAT_LISTCMDS
-       case CMD_bdelete:
-       case CMD_bwipeout:
-       case CMD_bunload:
-           while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL)
-@@ -3778,10 +3802,18 @@ set_one_cmd_context(xp, buff)
-           }
-           else
-               xp->xp_context = EXPAND_NOTHING;
-           break;
- #endif
-+#if defined(FEAT_PROFILE)
-+      case CMD_profile:
-+          set_context_in_profile_cmd(xp, arg);
-+          break;
-+#endif
-+      case CMD_behave:
-+          xp->xp_context = EXPAND_BEHAVE;
-+          break;
- #endif /* FEAT_CMDL_COMPL */
-       default:
-           break;
-@@ -3801,11 +3833,11 @@ set_one_cmd_context(xp, buff)
-     char_u *
- skip_range(cmd, ctx)
-     char_u    *cmd;
-     int               *ctx;   /* pointer to xp_context or NULL */
+     static void
+ f_haslocaldir(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
--    int               delim;
-+    unsigned  delim;
+     rettv->vval.v_number = (curwin->w_localdir != NULL);
+ }
  
-     while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;", *cmd) != NULL)
-     {
-       if (*cmd == '\'')
-       {
-@@ -5031,14 +5063,13 @@ check_more(message, forceit)
+@@ -11902,14 +11993,13 @@ f_hasmapto(argvars, rettv)
+ }
  
- #ifdef FEAT_CMDL_COMPL
  /*
-  * Function given to ExpandGeneric() to obtain the list of command names.
+  * "histadd()" function
   */
 -/*ARGSUSED*/
-     char_u *
get_command_name(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
+     static void
f_histadd(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     if (idx >= (int)CMD_SIZE)
- # ifdef FEAT_USR_CMDS
-       return get_user_command_name(idx);
-@@ -5119,11 +5150,15 @@ uc_add_command(name, name_len, rep, argt
-               EMSG(_("E174: Command already exists: add ! to replace it"));
-               goto fail;
-           }
-           vim_free(cmd->uc_rep);
--          cmd->uc_rep = 0;
-+          cmd->uc_rep = NULL;
-+#if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
-+          vim_free(cmd->uc_compl_arg);
-+          cmd->uc_compl_arg = NULL;
-+#endif
-           break;
+ #ifdef FEAT_CMDHIST
+     int               histype;
+     char_u    *str;
+@@ -11925,10 +12015,11 @@ f_histadd(argvars, rettv)
+     if (histype >= 0)
+     {
+       str = get_tv_string_buf(&argvars[1], buf);
+       if (*str != NUL)
+       {
++          init_history();
+           add_to_history(histype, str, FALSE, NUL);
+           rettv->vval.v_number = TRUE;
+           return;
        }
-       /* Stop as soon as we pass the name to add */
-       if (cmp < 0)
-@@ -5178,10 +5213,13 @@ static struct
- } command_complete[] =
- {
-     {EXPAND_AUGROUP, "augroup"},
-     {EXPAND_BUFFERS, "buffer"},
-     {EXPAND_COMMANDS, "command"},
-+#if defined(FEAT_CSCOPE)
-+    {EXPAND_CSCOPE, "cscope"},
-+#endif
- #if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
-     {EXPAND_USER_DEFINED, "custom"},
-     {EXPAND_USER_LIST, "customlist"},
- #endif
-     {EXPAND_DIRECTORIES, "dir"},
-@@ -5194,10 +5232,13 @@ static struct
-     {EXPAND_HIGHLIGHT, "highlight"},
-     {EXPAND_MAPPINGS, "mapping"},
-     {EXPAND_MENUS, "menu"},
-     {EXPAND_SETTINGS, "option"},
-     {EXPAND_SHELLCMD, "shellcmd"},
-+#if defined(FEAT_SIGNS)
-+    {EXPAND_SIGN, "sign"},
-+#endif
-     {EXPAND_TAGS, "tag"},
-     {EXPAND_TAGS_LISTFILES, "tag_listfiles"},
-     {EXPAND_USER_VARS, "var"},
-     {0, NULL}
- };
-@@ -5477,10 +5518,13 @@ invalid_count:
      }
-     return OK;
+@@ -11936,15 +12027,14 @@ f_histadd(argvars, rettv)
  }
  
-+/*
-+ * ":command ..."
-+ */
-     static void
- ex_command(eap)
-     exarg_T   *eap;
- {
-     char_u  *name;
-@@ -5538,14 +5582,13 @@ ex_command(eap)
  /*
-  * ":comclear"
-  * Clear all user commands, global and for current buffer.
+  * "histdel()" function
   */
 -/*ARGSUSED*/
-     void
- ex_comclear(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+     static void
+ f_histdel(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
  {
-     uc_clear(&ucmds);
-     uc_clear(&curbuf->b_ucmds);
- }
-@@ -5908,11 +5951,12 @@ do_ucmd(eap)
-     char_u    *buf;
-     char_u    *p;
-     char_u    *q;
-     char_u    *start;
--    char_u    *end;
-+    char_u    *end = NULL;
-+    char_u    *ksp;
-     size_t    len, totlen;
-     size_t    split_len = 0;
-     char_u    *split_buf = NULL;
-     ucmd_T    *cmd;
-@@ -5925,20 +5969,55 @@ do_ucmd(eap)
+ #ifdef FEAT_CMDHIST
+     int               n;
+     char_u    buf[NUMBUFLEN];
+     char_u    *str;
+@@ -11962,22 +12052,19 @@ f_histdel(argvars, rettv)
      else
-       cmd = USER_CMD_GA(&curbuf->b_ucmds, eap->useridx);
-     /*
-      * Replace <> in the command by the arguments.
-+     * First round: "buf" is NULL, compute length, allocate "buf".
-+     * Second round: copy result into "buf".
-      */
-     buf = NULL;
-     for (;;)
-     {
--      p = cmd->uc_rep;
--      q = buf;
-+      p = cmd->uc_rep;    /* source */
-+      q = buf;            /* destination */
-       totlen = 0;
--      while ((start = vim_strchr(p, '<')) != NULL
--             && (end = vim_strchr(start + 1, '>')) != NULL)
-+
-+      for (;;)
-       {
-+          start = vim_strchr(p, '<');
-+          if (start != NULL)
-+              end = vim_strchr(start + 1, '>');
-+          if (buf != NULL)
-+          {
-+              ksp = vim_strchr(p, K_SPECIAL);
-+              if (ksp != NULL && (start == NULL || ksp < start || end == NULL)
-+                      && ((ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER)
-+# ifdef FEAT_GUI
-+                          || (ksp[1] == KS_EXTRA && ksp[2] == (int)KE_CSI)
-+# endif
-+                          ))
-+              {
-+                  /* K_SPECIAL han been put in the buffer as K_SPECIAL
-+                   * KS_SPECIAL KE_FILLER, like for mappings, but
-+                   * do_cmdline() doesn't handle that, so convert it back.
-+                   * Also change K_SPECIAL KS_EXTRA KE_CSI into CSI. */
-+                  len = ksp - p;
-+                  if (len > 0)
-+                  {
-+                      mch_memmove(q, p, len);
-+                      q += len;
-+                  }
-+                  *q++ = ksp[1] == KS_SPECIAL ? K_SPECIAL : CSI;
-+                  p = ksp + 3;
-+                  continue;
-+              }
-+          }
-+
-+          /* break if there no <item> is found */
-+          if (start == NULL || end == NULL)
-+              break;
-+
-           /* Include the '>' */
-           ++end;
-           /* Take everything up to the '<' */
-           len = start - p;
-@@ -6001,14 +6080,13 @@ get_user_command_name(idx)
+       /* string given: remove all matching entries */
+       n = del_history_entry(get_histtype(str),
+                                     get_tv_string_buf(&argvars[1], buf));
+     rettv->vval.v_number = n;
+-#else
+-    rettv->vval.v_number = 0;
+ #endif
  }
  
  /*
-  * Function given to ExpandGeneric() to obtain the list of user command names.
+  * "histget()" function
   */
 -/*ARGSUSED*/
-     char_u *
get_user_commands(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
+     static void
f_histget(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     if (idx < curbuf->b_ucmds.ga_len)
-       return USER_CMD_GA(&curbuf->b_ucmds, idx)->uc_name;
-     idx -= curbuf->b_ucmds.ga_len;
-@@ -6019,48 +6097,45 @@ get_user_commands(xp, idx)
- /*
-  * Function given to ExpandGeneric() to obtain the list of user command
-  * attributes.
-  */
--/*ARGSUSED*/
-     char_u *
- get_user_cmd_flags(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
+ #ifdef FEAT_CMDHIST
+     int               type;
      int               idx;
- {
-     static char *user_cmd_flags[] =
-       {"bang", "bar", "buffer", "complete", "count",
-           "nargs", "range", "register"};
--    if (idx >= sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0]))
-+    if (idx >= (int)(sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0])))
-       return NULL;
-     return (char_u *)user_cmd_flags[idx];
+@@ -12003,14 +12090,13 @@ f_histget(argvars, rettv)
  }
  
  /*
-  * Function given to ExpandGeneric() to obtain the list of values for -nargs.
+  * "histnr()" function
   */
 -/*ARGSUSED*/
-     char_u *
get_user_cmd_nargs(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
+     static void
f_histnr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     static char *user_cmd_nargs[] = {"0", "1", "*", "?", "+"};
+     int               i;
  
--    if (idx >= sizeof(user_cmd_nargs) / sizeof(user_cmd_nargs[0]))
-+    if (idx >= (int)(sizeof(user_cmd_nargs) / sizeof(user_cmd_nargs[0])))
-       return NULL;
-     return (char_u *)user_cmd_nargs[idx];
+ #ifdef FEAT_CMDHIST
+@@ -12048,14 +12134,13 @@ f_hlexists(argvars, rettv)
  }
  
  /*
-  * Function given to ExpandGeneric() to obtain the list of values for -complete.
+  * "hostname()" function
   */
 -/*ARGSUSED*/
-     char_u *
get_user_cmd_complete(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
+     static void
f_hostname(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     return (char_u *)command_complete[idx].name;
- }
- # endif /* FEAT_CMDL_COMPL */
-@@ -6234,14 +6309,13 @@ ex_quit(eap)
+     char_u hostname[256];
+     mch_get_host_name(hostname, 256);
+@@ -12064,14 +12149,13 @@ f_hostname(argvars, rettv)
  }
  
  /*
-  * ":cquit".
+  * iconv() function
   */
 -/*ARGSUSED*/
      static void
- ex_cquit(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_iconv(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     getout(1);        /* this does not always pass on the exit code to the Manx
-                  compiler. why? */
- }
+ #ifdef FEAT_MBYTE
+     char_u    buf1[NUMBUFLEN];
+     char_u    buf2[NUMBUFLEN];
+@@ -12325,11 +12409,10 @@ f_inputlist(argvars, rettv)
+ {
+     listitem_T        *li;
+     int               selected;
+     int               mouse_used;
  
-@@ -6679,14 +6753,13 @@ ex_goto(eap)
+-    rettv->vval.v_number = 0;
+ #ifdef NO_CONSOLE_INPUT
+     /* While starting up, there is no place to enter text. */
+     if (no_console_input())
+       return;
  #endif
+@@ -12363,22 +12446,21 @@ f_inputlist(argvars, rettv)
+ static garray_T           ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL};
  
  /*
-  * ":shell".
+  * "inputrestore()" function
   */
 -/*ARGSUSED*/
      static void
- ex_shell(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_inputrestore(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     do_shell(NULL, 0);
+     if (ga_userinput.ga_len > 0)
+     {
+       --ga_userinput.ga_len;
+       restore_typeahead((tasave_T *)(ga_userinput.ga_data)
+                                                      + ga_userinput.ga_len);
+-      rettv->vval.v_number = 0; /* OK */
++      /* default return is zero == OK */
+     }
+     else if (p_verbose > 1)
+     {
+       verb_msg((char_u *)_("called inputrestore() more often than inputsave()"));
+       rettv->vval.v_number = 1; /* Failed */
+@@ -12386,23 +12468,22 @@ f_inputrestore(argvars, rettv)
  }
  
- #if (defined(FEAT_WINDOWS) && defined(HAVE_DROP_FILE)) \
-@@ -6986,14 +7059,13 @@ alist_slash_adjust()
- #endif
  /*
-  * ":preserve".
+  * "inputsave()" function
   */
 -/*ARGSUSED*/
      static void
- ex_preserve(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_inputsave(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     curbuf->b_flags |= BF_PRESERVED;
-     ml_preserve(curbuf, TRUE);
+     /* Add an entry to the stack of typeahead storage. */
+     if (ga_grow(&ga_userinput, 1) == OK)
+     {
+       save_typeahead((tasave_T *)(ga_userinput.ga_data)
+                                                      + ga_userinput.ga_len);
+       ++ga_userinput.ga_len;
+-      rettv->vval.v_number = 0; /* OK */
++      /* default return is zero == OK */
+     }
+     else
+       rettv->vval.v_number = 1; /* Failed */
  }
  
-@@ -7221,14 +7293,13 @@ ex_tabmove(eap)
- }
+@@ -12432,11 +12513,10 @@ f_insert(argvars, rettv)
+     long      before = 0;
+     listitem_T        *item;
+     list_T    *l;
+     int               error = FALSE;
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type != VAR_LIST)
+       EMSG2(_(e_listarg), "insert()");
+     else if ((l = argvars[0].vval.v_list) != NULL
+           && !tv_check_lock(l->lv_lock, (char_u *)"insert()"))
+     {
+@@ -12551,11 +12631,10 @@ dict_list(argvars, rettv, what)
+     listitem_T        *li;
+     listitem_T        *li2;
+     dict_T    *d;
+     int               todo;
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type != VAR_DICT)
+     {
+       EMSG(_(e_dictreq));
+       return;
+     }
+@@ -12639,11 +12718,10 @@ f_join(argvars, rettv)
+     typval_T  *rettv;
+ {
+     garray_T  ga;
+     char_u    *sep;
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type != VAR_LIST)
+     {
+       EMSG(_(e_listreq));
+       return;
+     }
+@@ -12679,14 +12757,13 @@ f_keys(argvars, rettv)
+ }
  
  /*
-  * :tabs command: List tabs and their contents.
+  * "last_buffer_nr()" function.
   */
 -/*ARGSUSED*/
      static void
- ex_tabs(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_last_buffer_nr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     tabpage_T *tp;
-     win_T     *wp;
-     int               tabcount = 1;
+     int               n = 0;
+     buf_T     *buf;
  
-@@ -7411,11 +7482,10 @@ ex_edit(eap)
+@@ -12737,13 +12814,11 @@ libcall_common(argvars, rettv, type)
+     char_u            **string_result;
+     int                       nr_result;
+ #endif
+     rettv->v_type = type;
+-    if (type == VAR_NUMBER)
+-      rettv->vval.v_number = 0;
+-    else
++    if (type != VAR_NUMBER)
+       rettv->vval.v_string = NULL;
+     if (check_restricted() || check_secure())
+       return;
+@@ -12811,14 +12886,13 @@ f_line(argvars, rettv)
  }
  
  /*
-  * ":edit <file>" command and alikes.
+  * "line2byte(lnum)" function
   */
 -/*ARGSUSED*/
-     void
- do_exedit(eap, old_curwin)
-     exarg_T   *eap;
-     win_T     *old_curwin;        /* curwin before doing a split or NULL */
- {
-@@ -7483,11 +7553,12 @@ do_exedit(eap, old_curwin)
-               ) && *eap->arg == NUL)
-     {
-       /* ":new" or ":tabnew" without argument: edit an new empty buffer */
-       setpcmark();
-       (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE,
--                             ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0));
-+                    ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0),
-+                    old_curwin == NULL ? curwin : NULL);
-     }
-     else if ((eap->cmdidx != CMD_split
- #ifdef FEAT_VERTSPLIT
-               && eap->cmdidx != CMD_vsplit
- #endif
-@@ -7520,11 +7591,11 @@ do_exedit(eap, old_curwin)
-                   (P_HID(curbuf) ? ECMD_HIDE : 0)
-                   + (eap->forceit ? ECMD_FORCEIT : 0)
- #ifdef FEAT_LISTCMDS
-                   + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 )
- #endif
--                  ) == FAIL)
-+                  , old_curwin == NULL ? curwin : NULL) == FAIL)
-       {
-           /* Editing the file failed.  If the window was split, close it. */
- #ifdef FEAT_WINDOWS
-           if (old_curwin != NULL)
-           {
-@@ -7622,14 +7693,13 @@ ex_popup(eap)
+     static void
+ f_line2byte(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     gui_make_popup(eap->arg, eap->forceit);
+ #ifndef FEAT_BYTEOFF
+     rettv->vval.v_number = -1;
+ #else
+@@ -12860,14 +12934,13 @@ f_lispindent(argvars, rettv)
  }
- #endif
  
+ /*
+  * "localtime()" function
+  */
 -/*ARGSUSED*/
      static void
- ex_swapname(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_localtime(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     if (curbuf->b_ml.ml_mfp == NULL || curbuf->b_ml.ml_mfp->mf_fname == NULL)
-       MSG(_("No swap file"));
-     else
-       msg(curbuf->b_ml.ml_mfp->mf_fname);
-@@ -7638,14 +7708,13 @@ ex_swapname(eap)
+     rettv->vval.v_number = (varnumber_T)time(NULL);
+ }
+@@ -13445,11 +13518,10 @@ f_mkdir(argvars, rettv)
+ #endif
  /*
-  * ":syncbind" forces all 'scrollbind' windows to have the same relative
-  * offset.
-  * (1998-11-02 16:21:01  R. Edward Ralston <eralston@computer.org>)
+  * "mode()" function
   */
 -/*ARGSUSED*/
      static void
- ex_syncbind(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
- #ifdef FEAT_SCROLLBIND
-     win_T     *wp;
-     long      topline;
-     long      y;
-@@ -7782,14 +7851,14 @@ ex_read(eap)
-               else
-                   lnum = 1;
-               if (*ml_get(lnum) == NUL && u_savedel(lnum, 1L) == OK)
-               {
-                   ml_delete(lnum, FALSE);
--                  deleted_lines_mark(lnum, 1L);
-                   if (curwin->w_cursor.lnum > 1
-                                            && curwin->w_cursor.lnum >= lnum)
-                       --curwin->w_cursor.lnum;
-+                  deleted_lines_mark(lnum, 1L);
-               }
-           }
-           redraw_curbuf_later(VALID);
-       }
-     }
-@@ -7801,10 +7870,13 @@ static char_u  *prev_dir = NULL;
-     void
- free_cd_dir()
+ f_mode(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
  {
-     vim_free(prev_dir);
-     prev_dir = NULL;
-+
-+    vim_free(globaldir);
-+    globaldir = NULL;
+@@ -13519,10 +13591,27 @@ f_mode(argvars, rettv)
+     rettv->vval.v_string = vim_strsave(buf);
+     rettv->v_type = VAR_STRING;
  }
- #endif
  
++#ifdef FEAT_MZSCHEME
++/*
++ * "mzeval()" function
++ */
++    static void
++f_mzeval(argvars, rettv)
++    typval_T  *argvars;
++    typval_T  *rettv;
++{
++    char_u    *str;
++    char_u    buf[NUMBUFLEN];
++
++    str = get_tv_string_buf(&argvars[0], buf);
++    do_mzeval(str, rettv);
++}
++#endif
++
+ /*
+  * "nextnonblank()" function
+  */
+     static void
+ f_nextnonblank(argvars, rettv)
+@@ -13674,17 +13763,15 @@ f_printf(argvars, rettv)
+ }
  
  /*
-@@ -7823,10 +7895,14 @@ ex_cd(eap)
-     if (*new_dir == NUL)
-       ex_pwd(NULL);
-     else
+  * "pumvisible()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_pumvisible(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+-    rettv->vval.v_number = 0;
+ #ifdef FEAT_INS_EXPAND
+     if (pum_visible())
+       rettv->vval.v_number = 1;
  #endif
-     {
-+#ifdef FEAT_AUTOCMD
-+      if (allbuf_locked())
-+          return;
-+#endif
-       if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged()
-                                                            && !eap->forceit)
-       {
-           EMSG(_("E747: Cannot change directory, buffer is modified (add ! to override)"));
-           return;
-@@ -7894,24 +7970,23 @@ ex_cd(eap)
-           }
+ }
+@@ -13714,11 +13801,10 @@ f_range(argvars, rettv)
+       end = get_tv_number_chk(&argvars[1], &error);
+       if (argvars[2].v_type != VAR_UNKNOWN)
+           stride = get_tv_number_chk(&argvars[2], &error);
+     }
  
-           shorten_fnames(TRUE);
+-    rettv->vval.v_number = 0;
+     if (error)
+       return;         /* type error; errmsg already given */
+     if (stride == 0)
+       EMSG(_("E726: Stride is zero"));
+     else if (stride > 0 ? end + 1 < start : end - 1 > start)
+@@ -14081,14 +14167,13 @@ remote_common(argvars, rettv, expr)
+ #endif
  
-           /* Echo the new current directory if the command was typed. */
--          if (KeyTyped)
-+          if (KeyTyped || p_verbose >= 5)
-               ex_pwd(eap);
-       }
-       vim_free(tofree);
-     }
+ /*
+  * "remote_expr()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_remote_expr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     rettv->v_type = VAR_STRING;
+     rettv->vval.v_string = NULL;
+ #ifdef FEAT_CLIENTSERVER
+@@ -14097,17 +14182,15 @@ f_remote_expr(argvars, rettv)
  }
  
  /*
-  * ":pwd".
+  * "remote_foreground()" function
   */
 -/*ARGSUSED*/
      static void
- ex_pwd(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_remote_foreground(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
  {
-     if (mch_dirname(NameBuff, MAXPATHL) == OK)
+-    rettv->vval.v_number = 0;
+ #ifdef FEAT_CLIENTSERVER
+ # ifdef WIN32
+     /* On Win32 it's done in this application. */
      {
- #ifdef BACKSLASH_IN_FILENAME
-       slash_adjust(NameBuff);
-@@ -8289,10 +8364,11 @@ ex_join(eap)
-     static void
- ex_at(eap)
-     exarg_T   *eap;
- {
-     int               c;
-+    int               prev_len = typebuf.tb_len;
-     curwin->w_cursor.lnum = eap->line2;
- #ifdef USE_ON_FLY_SCROLL
-     dont_scroll = TRUE;               /* disallow scrolling here */
-@@ -8314,15 +8390,14 @@ ex_at(eap)
-       exec_from_reg = TRUE;
-       /*
-        * Execute from the typeahead buffer.
--       * Originally this didn't check for the typeahead buffer to be empty,
--       * thus could read more Ex commands from stdin.  It's not clear why,
--       * it is certainly unexpected.
-+       * Continue until the stuff buffer is empty and all added characters
-+       * have been consumed.
-        */
--      while ((!stuff_empty() || typebuf.tb_len > 0) && vpeekc() == ':')
-+      while (!stuff_empty() || typebuf.tb_len > prev_len)
-           (void)do_cmdline(NULL, getexline, NULL, DOCMD_NOWAIT|DOCMD_VERBOSE);
-       exec_from_reg = save_efr;
-     }
- }
-@@ -8338,36 +8413,33 @@ ex_bang(eap)
+       char_u  *server_name = get_tv_string_chk(&argvars[0]);
+@@ -14124,14 +14207,13 @@ f_remote_foreground(argvars, rettv)
+     vim_free(argvars[1].vval.v_string);
+ # endif
+ #endif
  }
  
- /*
-  * ":undo".
-  */
 -/*ARGSUSED*/
      static void
- ex_undo(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_remote_peek(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     if (eap->addr_count == 1)     /* :undo 123 */
-       undo_time(eap->line2, FALSE, TRUE);
-     else
-       u_undo(1);
+ #ifdef FEAT_CLIENTSERVER
+     dictitem_T        v;
+     char_u    *s = NULL;
+@@ -14159,11 +14241,10 @@ f_remote_peek(argvars, rettv)
+     {
+       s = serverGetReply((HWND)n, FALSE, FALSE, FALSE);
+       rettv->vval.v_number = (s != NULL);
+     }
+ # else
+-    rettv->vval.v_number = 0;
+     if (check_connection() == FAIL)
+       return;
+     rettv->vval.v_number = serverPeekReply(X_DISPLAY,
+                                               serverStrToWin(serverid), &s);
+@@ -14183,14 +14264,13 @@ f_remote_peek(argvars, rettv)
+ #else
+     rettv->vval.v_number = -1;
+ #endif
  }
  
- /*
-  * ":redo".
-  */
 -/*ARGSUSED*/
      static void
- ex_redo(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_remote_read(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     u_redo(1);
+     char_u    *r = NULL;
+ #ifdef FEAT_CLIENTSERVER
+@@ -14218,14 +14298,13 @@ f_remote_read(argvars, rettv)
  }
  
  /*
-  * ":earlier" and ":later".
+  * "remote_send()" function
   */
 -/*ARGSUSED*/
      static void
- ex_later(eap)
-     exarg_T   *eap;
+ f_remote_send(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     long      count = 0;
-@@ -8548,14 +8620,13 @@ ex_redraw(eap)
+     rettv->v_type = VAR_STRING;
+     rettv->vval.v_string = NULL;
+ #ifdef FEAT_CLIENTSERVER
+@@ -14248,11 +14327,10 @@ f_remove(argvars, rettv)
+     long      end;
+     char_u    *key;
+     dict_T    *d;
+     dictitem_T        *di;
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type == VAR_DICT)
+     {
+       if (argvars[2].v_type != VAR_UNKNOWN)
+           EMSG2(_(e_toomanyarg), "remove()");
+       else if ((d = argvars[0].vval.v_dict) != NULL
+@@ -14351,11 +14429,10 @@ f_rename(argvars, rettv)
  }
  
  /*
-  * ":redrawstatus": force redraw of status line(s)
+  * "repeat()" function
   */
 -/*ARGSUSED*/
      static void
ex_redrawstatus(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
f_repeat(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
  {
- #if defined(FEAT_WINDOWS)
-     int               r = RedrawingDisabled;
-     int               p = p_lz;
+@@ -14606,11 +14683,10 @@ f_reverse(argvars, rettv)
+     typval_T  *rettv;
+ {
+     list_T    *l;
+     listitem_T        *li, *ni;
  
-@@ -8628,10 +8699,12 @@ ex_mkrc(eap)
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type != VAR_LIST)
+       EMSG2(_(e_listarg), "reverse()");
+     else if ((l = argvars[0].vval.v_list) != NULL
+           && !tv_check_lock(l->lv_lock, (char_u *)"reverse()"))
+     {
+@@ -14958,12 +15034,10 @@ f_searchpairpos(argvars, rettv)
+ {
+     pos_T     match_pos;
+     int               lnum = 0;
+     int               col = 0;
+-    rettv->vval.v_number = 0;
+-
+     if (rettv_list_alloc(rettv) == FAIL)
        return;
- #endif
-     }
  
- #ifdef FEAT_SESSION
-+    /* Use the short file name until ":lcd" is used.  We also don't use the
-+     * short file name when 'acd' is set, that is checked later. */
-     did_lcd = FALSE;
+     if (searchpair_cmn(argvars, &match_pos) > 0)
+     {
+@@ -15146,12 +15220,10 @@ f_searchpos(argvars, rettv)
+     int               lnum = 0;
+     int               col = 0;
+     int               n;
+     int               flags = 0;
  
-     /* ":mkview" or ":mkview 9": generate file name with 'viewdir' */
-     if (eap->cmdidx == CMD_mkview
-           && (*eap->arg == NUL
-@@ -8747,12 +8820,12 @@ ex_mkrc(eap)
-                       shorten_fnames(TRUE);
-               }
-               else if (*dirnow != NUL
-                       && (ssop_flags & SSOP_CURDIR) && globaldir != NULL)
-               {
--                  (void)mch_chdir((char *)globaldir);
--                  shorten_fnames(TRUE);
-+                  if (mch_chdir((char *)globaldir) == 0)
-+                      shorten_fnames(TRUE);
-               }
+-    rettv->vval.v_number = 0;
+-
+     if (rettv_list_alloc(rettv) == FAIL)
+       return;
  
-               failed |= (makeopens(fd, dirnow) == FAIL);
+     n = search_cmn(argvars, &match_pos, &flags);
+     if (n > 0)
+@@ -15165,14 +15237,13 @@ f_searchpos(argvars, rettv)
+     if (flags & SP_SUBPAT)
+       list_append_number(rettv->vval.v_list, (varnumber_T)n);
+ }
  
-               /* restore original dir */
-@@ -8812,15 +8885,14 @@ theend:
+-/*ARGSUSED*/
+     static void
+ f_server2client(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+ #ifdef FEAT_CLIENTSERVER
+     char_u    buf[NUMBUFLEN];
+     char_u    *server = get_tv_string_chk(&argvars[0]);
+@@ -15197,14 +15268,13 @@ f_server2client(argvars, rettv)
+ #else
+     rettv->vval.v_number = -1;
  #endif
  }
  
- #if ((defined(FEAT_SESSION) || defined(FEAT_EVAL)) && defined(vim_mkdir)) \
-       || defined(PROTO)
 -/*ARGSUSED*/
-     int
vim_mkdir_emsg(name, prot)
-     char_u    *name;
--    int               prot;
-+    int               prot UNUSED;
+     static void
f_serverlist(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     if (vim_mkdir(name, prot) != 0)
-     {
-       EMSG2(_("E739: Cannot create directory: %s"), name);
-       return FAIL;
-@@ -9087,14 +9159,13 @@ ex_startinsert(eap)
+     char_u    *r = NULL;
+ #ifdef FEAT_CLIENTSERVER
+@@ -15221,24 +15291,21 @@ f_serverlist(argvars, rettv)
  }
  
  /*
-  * ":stopinsert"
+  * "setbufvar()" function
   */
 -/*ARGSUSED*/
      static void
- ex_stopinsert(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     restart_edit = 0;
-     stop_insert_mode = TRUE;
- }
- #endif
-@@ -9364,13 +9435,12 @@ find_cmdline_var(src, usedlen)
- #ifdef FEAT_CLIENTSERVER
-                   "<client>"
- # define SPEC_CLIENT 9
- #endif
-     };
--#define SPEC_COUNT  (sizeof(spec_str) / sizeof(char *))
+ f_setbufvar(argvars, rettv)
+     typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *rettv UNUSED;
+ {
+     buf_T     *buf;
+     aco_save_T        aco;
+     char_u    *varname, *bufvarname;
+     typval_T  *varp;
+     char_u    nbuf[NUMBUFLEN];
  
--    for (i = 0; i < SPEC_COUNT; ++i)
-+    for (i = 0; i < (int)(sizeof(spec_str) / sizeof(char *)); ++i)
+-    rettv->vval.v_number = 0;
+-
+     if (check_restricted() || check_secure())
+       return;
+     (void)get_tv_number(&argvars[0]);     /* issue errmsg if type error */
+     varname = get_tv_string_chk(&argvars[1]);
+     buf = get_buf_tv(&argvars[0]);
+@@ -15314,11 +15381,11 @@ f_setline(argvars, rettv)
+       li = l->lv_first;
+     }
+     else
+       line = get_tv_string_chk(&argvars[1]);
+-    rettv->vval.v_number = 0;         /* OK */
++    /* default result is zero == OK */
+     for (;;)
      {
-       len = (int)STRLEN(spec_str[i]);
-       if (STRNCMP(src, spec_str[i], len) == 0)
+       if (l != NULL)
        {
-           *usedlen = len;
-@@ -9504,28 +9574,54 @@ eval_vars(src, srcstart, usedlen, lnump,
-                   skip_mod = TRUE;
- #endif
-                   break;
-               }
-               s = src + 1;
-+              if (*s == '<')          /* "#<99" uses v:oldfiles */
-+                  ++s;
-               i = (int)getdigits(&s);
-               *usedlen = (int)(s - src); /* length of what we expand */
+           /* list argument, get next string */
+@@ -15362,16 +15429,15 @@ f_setline(argvars, rettv)
+ static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv));
  
--              buf = buflist_findnr(i);
--              if (buf == NULL)
-+              if (src[1] == '<')
-               {
--                  *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
-+                  if (*usedlen < 2)
-+                  {
-+                      /* Should we give an error message for #<text? */
-+                      *usedlen = 1;
-+                      return NULL;
-+                  }
-+#ifdef FEAT_EVAL
-+                  result = list_find_str(get_vim_var_list(VV_OLDFILES),
-+                                                                   (long)i);
-+                  if (result == NULL)
-+                  {
-+                      *errormsg = (char_u *)"";
-+                      return NULL;
-+                  }
-+#else
-+                  *errormsg = (char_u *)_("E809: #< is not available without the +eval feature");
-                   return NULL;
-+#endif
-               }
--              if (lnump != NULL)
--                  *lnump = ECMD_LAST;
--              if (buf->b_fname == NULL)
-+              else
-               {
--                  result = (char_u *)"";
--                  valid = 0;      /* Must have ":p:h" to be valid */
-+                  buf = buflist_findnr(i);
-+                  if (buf == NULL)
-+                  {
-+                      *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
-+                      return NULL;
-+                  }
-+                  if (lnump != NULL)
-+                      *lnump = ECMD_LAST;
-+                  if (buf->b_fname == NULL)
-+                  {
-+                      result = (char_u *)"";
-+                      valid = 0;          /* Must have ":p:h" to be valid */
-+                  }
-+                  else
-+                      result = buf->b_fname;
-               }
--              else
--                  result = buf->b_fname;
-               break;
+ /*
+  * Used by "setqflist()" and "setloclist()" functions
+  */
+-/*ARGSUSED*/
+     static void
+ set_qf_ll_list(wp, list_arg, action_arg, rettv)
+-    win_T     *wp;
+-    typval_T  *list_arg;
+-    typval_T  *action_arg;
++    win_T     *wp UNUSED;
++    typval_T  *list_arg UNUSED;
++    typval_T  *action_arg UNUSED;
+     typval_T  *rettv;
+ {
+ #ifdef FEAT_QUICKFIX
+     char_u    *act;
+     int               action = ' ';
+@@ -15402,11 +15468,10 @@ set_qf_ll_list(wp, list_arg, action_arg,
+ }
  
- #ifdef FEAT_SEARCHPATH
-       case SPEC_CFILE:        /* file name under cursor */
-               result = file_name_at_cursor(FNAME_MESS|FNAME_HYP, 1L, NULL);
-@@ -9539,10 +9635,19 @@ eval_vars(src, srcstart, usedlen, lnump,
- #endif
+ /*
+  * "setloclist()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_setloclist(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+@@ -15480,11 +15545,10 @@ f_setmatches(argvars, rettv)
+ }
  
- #ifdef FEAT_AUTOCMD
-       case SPEC_AFILE:        /* file name for autocommand */
-               result = autocmd_fname;
-+              if (result != NULL && !autocmd_fname_full)
-+              {
-+                  /* Still need to turn the fname into a full path.  It is
-+                   * postponed to avoid a delay when <afile> is not used. */
-+                  autocmd_fname_full = TRUE;
-+                  result = FullName_save(autocmd_fname, FALSE);
-+                  vim_free(autocmd_fname);
-+                  autocmd_fname = result;
-+              }
-               if (result == NULL)
+ /*
+  * "setpos()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_setpos(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+@@ -15496,11 +15560,12 @@ f_setpos(argvars, rettv)
+     name = get_tv_string_chk(argvars);
+     if (name != NULL)
+     {
+       if (list2fpos(&argvars[1], &pos, &fnum) == OK)
+       {
+-          --pos.col;
++          if (--pos.col < 0)
++              pos.col = 0;
+           if (name[0] == '.' && name[1] == NUL)
+           {
+               /* set cursor */
+               if (fnum == curbuf->b_fnum)
                {
-                   *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"<afile>\"");
-                   return NULL;
-               }
-@@ -9682,11 +9787,11 @@ arg_all()
-           retval[len] = NUL;
-           break;
-       }
+@@ -15524,11 +15589,10 @@ f_setpos(argvars, rettv)
+ }
  
-       /* allocate memory */
--      retval = alloc(len + 1);
-+      retval = alloc((unsigned)len + 1);
-       if (retval == NULL)
-           break;
-     }
+ /*
+  * "setqflist()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_setqflist(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+@@ -15630,11 +15694,11 @@ f_setwinvar(argvars, rettv)
+  * "setwinvar()" and "settabwinvar()" functions
+  */
+     static void
+ setwinvar(argvars, rettv, off)
+     typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *rettv UNUSED;
+     int               off;
+ {
+     win_T     *win;
+ #ifdef FEAT_WINDOWS
+     win_T     *save_curwin;
+@@ -15643,12 +15707,10 @@ setwinvar(argvars, rettv, off)
+     char_u    *varname, *winvarname;
+     typval_T  *varp;
+     char_u    nbuf[NUMBUFLEN];
+     tabpage_T *tp;
  
-     return retval;
-@@ -10065,11 +10170,11 @@ makeopens(fd, dirnow)
-     /*
-      * Lastly, execute the x.vim file if it exists.
-      */
-     if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL
-           || put_line(fd, "if file_readable(s:sx)") == FAIL
--          || put_line(fd, "  exe \"source \" . s:sx") == FAIL
-+          || put_line(fd, "  exe \"source \" . fnameescape(s:sx)") == FAIL
-           || put_line(fd, "endif") == FAIL)
-       return FAIL;
+-    rettv->vval.v_number = 0;
+-
+     if (check_restricted() || check_secure())
+       return;
  
-     return OK;
+ #ifdef FEAT_WINDOWS
+     if (off == 1)
+@@ -15836,14 +15898,13 @@ item_compare2(s1, s2)
+     clear_tv(&argv[1]);
+     if (res == FAIL)
+       res = ITEM_COMPARE_FAIL;
+     else
+-      /* return value has wrong type */
+       res = get_tv_number_chk(&rettv, &item_compare_func_err);
+     if (item_compare_func_err)
+-      res = ITEM_COMPARE_FAIL;
++      res = ITEM_COMPARE_FAIL;  /* return value has wrong type */
+     clear_tv(&rettv);
+     return res;
  }
-@@ -10483,10 +10588,13 @@ ses_fname(fd, buf, flagp)
-      * Don't do this after ":lcd", we don't keep track of what the current
-      * directory is. */
-     if (buf->b_sfname != NULL
-           && flagp == &ssop_flags
-           && (ssop_flags & (SSOP_CURDIR | SSOP_SESDIR))
-+#ifdef FEAT_AUTOCHDIR
-+          && !p_acd
-+#endif
-           && !did_lcd)
-       name = buf->b_sfname;
+ /*
+@@ -15858,11 +15919,10 @@ f_sort(argvars, rettv)
+     listitem_T        *li;
+     listitem_T        **ptrs;
+     long      len;
+     long      i;
+-    rettv->vval.v_number = 0;
+     if (argvars[0].v_type != VAR_LIST)
+       EMSG2(_(e_listarg), "sort()");
      else
-       name = buf->b_ffname;
-     if (ses_put_fname(fd, name, flagp) == FAIL || put_eol(fd) == FAIL)
-@@ -10687,11 +10795,12 @@ ex_viminfo(eap)
-     save_viminfo = p_viminfo;
-     if (*p_viminfo == NUL)
-       p_viminfo = (char_u *)"'100";
-     if (eap->cmdidx == CMD_rviminfo)
      {
--      if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL)
-+      if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS
-+                                | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL)
-           EMSG(_("E195: Cannot open viminfo file for reading"));
-     }
-     else
-       write_viminfo(eap->arg, eap->forceit);
-     p_viminfo = save_viminfo;
-@@ -10739,10 +10848,28 @@ ex_behave(eap)
-     }
-     else
-       EMSG2(_(e_invarg2), eap->arg);
+       l = argvars[0].vval.v_list;
+@@ -15950,14 +16010,13 @@ f_soundfold(argvars, rettv)
  }
  
-+#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
-+/*
-+ * Function given to ExpandGeneric() to obtain the possible arguments of the
-+ * ":behave {mswin,xterm}" command.
-+ */
-+    char_u *
-+get_behave_arg(xp, idx)
-+    expand_T  *xp UNUSED;
-+    int               idx;
-+{
-+    if (idx == 0)
-+      return (char_u *)"mswin";
-+    if (idx == 1)
-+      return (char_u *)"xterm";
-+    return NULL;
-+}
-+#endif
-+
- #ifdef FEAT_AUTOCMD
- static int filetype_detect = FALSE;
- static int filetype_plugin = FALSE;
- static int filetype_indent = FALSE;
-@@ -10848,14 +10975,13 @@ ex_setfiletype(eap)
-     if (!did_filetype)
-       set_option_value((char_u *)"filetype", 0L, eap->arg, OPT_LOCAL);
+ /*
+  * "spellbadword()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_spellbadword(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     char_u    *word = (char_u *)"";
+     hlf_T     attr = HLF_COUNT;
+     int               len = 0;
+@@ -16005,14 +16064,13 @@ f_spellbadword(argvars, rettv)
  }
- #endif
  
+ /*
+  * "spellsuggest()" function
+  */
 -/*ARGSUSED*/
      static void
- ex_digraphs(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_spellsuggest(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
- #ifdef FEAT_DIGRAPHS
-     if (*eap->arg != NUL)
-       putdigraph(eap->arg);
-     else
-@@ -10885,14 +11011,13 @@ ex_set(eap)
+ #ifdef FEAT_SPELL
+     char_u    *str;
+     int               typeerr = FALSE;
+@@ -16491,14 +16549,13 @@ f_substitute(argvars, rettv)
+ }
  
- #ifdef FEAT_SEARCH_EXTRA
  /*
-  * ":nohlsearch"
+  * "synID(lnum, col, trans)" function
   */
 -/*ARGSUSED*/
      static void
- ex_nohlsearch(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_synID(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     no_hlsearch = TRUE;
-     redraw_all_later(SOME_VALID);
+     int               id = 0;
+ #ifdef FEAT_SYN_HL
+     long      lnum;
+@@ -16519,14 +16576,13 @@ f_synID(argvars, rettv)
  }
  
-@@ -10967,14 +11092,13 @@ ex_match(eap)
- #ifdef FEAT_CRYPT
  /*
-  * ":X": Get crypt key
+  * "synIDattr(id, what [, mode])" function
   */
 -/*ARGSUSED*/
      static void
- ex_X(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+ f_synIDattr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     (void)get_crypt_key(TRUE, TRUE);
- }
- #endif
+     char_u    *p = NULL;
+ #ifdef FEAT_SYN_HL
+     int               id;
+@@ -16569,11 +16625,11 @@ f_synIDattr(argvars, rettv)
+                   p = highlight_color(id, what, modec);
+               else                                    /* bold */
+                   p = highlight_has_attr(id, HL_BOLD, modec);
+               break;
  
---- vim72.orig/src/main.c
-+++ vim72/src/main.c
-@@ -128,14 +128,10 @@ static void prepare_server __ARGS((mparm
- static void cmdsrv_main __ARGS((int *argc, char **argv, char_u *serverName_arg, char_u **serverStr));
- static char_u *serverMakeName __ARGS((char_u *arg, char *cmd));
- #endif
+-      case 'f':                                       /* fg[#] */
++      case 'f':                                       /* fg[#] or font */
+               p = highlight_color(id, what, modec);
+               break;
  
+       case 'i':
+               if (TOLOWER_ASC(what[1]) == 'n')        /* inverse */
+@@ -16588,12 +16644,15 @@ f_synIDattr(argvars, rettv)
+       case 'r':                                       /* reverse */
+               p = highlight_has_attr(id, HL_INVERSE, modec);
+               break;
+-      case 's':                                       /* standout */
+-              p = highlight_has_attr(id, HL_STANDOUT, modec);
++      case 's':
++              if (TOLOWER_ASC(what[1]) == 'p')        /* sp[#] */
++                  p = highlight_color(id, what, modec);
++              else                                    /* standout */
++                  p = highlight_has_attr(id, HL_STANDOUT, modec);
+               break;
+       case 'u':
+               if (STRLEN(what) <= 5 || TOLOWER_ASC(what[5]) != 'c')
+                                                       /* underline */
+@@ -16612,14 +16671,13 @@ f_synIDattr(argvars, rettv)
+ }
  
--#ifdef STARTUPTIME
--static FILE *time_fd = NULL;
--#endif
--
  /*
-  * Different types of error messages.
+  * "synIDtrans(id)" function
   */
- static char *(main_errors[]) =
- {
-@@ -171,10 +167,13 @@ main
-     char      **argv;
+-/*ARGSUSED*/
+     static void
+ f_synIDtrans(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
-     char_u    *fname = NULL;          /* file name from command line */
-     mparm_T   params;                 /* various parameters passed between
-                                        * main() and other functions. */
-+#ifdef STARTUPTIME
-+    int               i;
-+#endif
+     int               id;
  
-     /*
-      * Do any system-specific initialisations.  These can NOT use IObuff or
-      * NameBuff.  Thus emsg2() cannot be called!
-      */
-@@ -201,12 +200,19 @@ main
- #ifdef MEM_PROFILE
-     atexit(vim_mem_profile_dump);
- #endif
+ #ifdef FEAT_SYN_HL
+@@ -16635,14 +16693,13 @@ f_synIDtrans(argvars, rettv)
+ }
  
- #ifdef STARTUPTIME
--    time_fd = mch_fopen(STARTUPTIME, "a");
--    TIME_MSG("--- VIM STARTING ---");
-+    for (i = 1; i < argc; ++i)
-+    {
-+      if (STRICMP(argv[i], "--startuptime") == 0 && i + 1 < argc)
-+      {
-+          time_fd = mch_fopen(argv[i + 1], "a");
-+          TIME_MSG("--- VIM STARTING ---");
-+          break;
-+      }
-+    }
- #endif
-     starttime = time(NULL);
+ /*
+  * "synstack(lnum, col)" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_synstack(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+ #ifdef FEAT_SYN_HL
+     long      lnum;
+     long      col;
+@@ -16656,11 +16713,11 @@ f_synstack(argvars, rettv)
+ #ifdef FEAT_SYN_HL
+     lnum = get_tv_lnum(argvars);              /* -1 on type error */
+     col = get_tv_number(&argvars[1]) - 1;     /* -1 on type error */
  
- #ifdef __EMX__
-     _wildcard(&params.argc, &params.argv);
-@@ -358,18 +364,25 @@ main
- # if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
-     /*
-      * Check if the GUI can be started.  Reset gui.starting if not.
-      * Don't know about other systems, stay on the safe side and don't check.
-      */
--    if (gui.starting && gui_init_check() == FAIL)
-+    if (gui.starting)
+     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
+-          && col >= 0 && col < (long)STRLEN(ml_get(lnum))
++          && col >= 0 && (col == 0 || col < (long)STRLEN(ml_get(lnum)))
+           && rettv_list_alloc(rettv) != FAIL)
      {
--      gui.starting = FALSE;
-+      if (gui_init_check() == FAIL)
-+      {
-+          gui.starting = FALSE;
+       (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE);
+       for (i = 0; ; ++i)
+       {
+@@ -16772,19 +16829,16 @@ done:
+ }
  
--      /* When running "evim" or "gvim -y" we need the menus, exit if we
--       * don't have them. */
--      if (params.evim_mode)
--          mch_exit(1);
-+          /* When running "evim" or "gvim -y" we need the menus, exit if we
-+           * don't have them. */
-+          if (params.evim_mode)
-+              mch_exit(1);
-+      }
-+#  if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
-+      /* Re-initialize locale, it may have been altered by gui_init_check() */
-+      init_locale();
-+#  endif
-     }
- # endif
- #endif
-     if (GARGCOUNT > 0)
-@@ -643,15 +656,16 @@ main
-     init_SPAWNO("", SWAP_ANY);
- #endif
+ /*
+  * "tabpagebuflist()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_tabpagebuflist(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+-#ifndef FEAT_WINDOWS
+-    rettv->vval.v_number = 0;
+-#else
++#ifdef FEAT_WINDOWS
+     tabpage_T *tp;
+     win_T     *wp = NULL;
  
- #ifdef FEAT_VIMINFO
-     /*
--     * Read in registers, history etc, but not marks, from the viminfo file
-+     * Read in registers, history etc, but not marks, from the viminfo file.
-+     * This is where v:oldfiles gets filled.
-      */
-     if (*p_viminfo != NUL)
+     if (argvars[0].v_type == VAR_UNKNOWN)
+       wp = firstwin;
+@@ -16792,35 +16846,27 @@ f_tabpagebuflist(argvars, rettv)
      {
--      read_viminfo(NULL, TRUE, FALSE, FALSE);
-+      read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES);
-       TIME_MSG("reading viminfo");
+       tp = find_tabpage((int)get_tv_number(&argvars[0]));
+       if (tp != NULL)
+           wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
+     }
+-    if (wp == NULL)
+-      rettv->vval.v_number = 0;
+-    else
++    if (wp != NULL && rettv_list_alloc(rettv) != FAIL)
+     {
+-      if (rettv_list_alloc(rettv) == FAIL)
+-          rettv->vval.v_number = 0;
+-      else
+-      {
+-          for (; wp != NULL; wp = wp->w_next)
+-              if (list_append_number(rettv->vval.v_list,
++      for (; wp != NULL; wp = wp->w_next)
++          if (list_append_number(rettv->vval.v_list,
+                                               wp->w_buffer->b_fnum) == FAIL)
+-                  break;
+-      }
++              break;
      }
  #endif
+ }
  
- #ifdef FEAT_QUICKFIX
-@@ -932,12 +946,18 @@ main
  
-     TIME_MSG("before starting main loop");
+ /*
+  * "tabpagenr()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_tabpagenr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     int               nr = 1;
+ #ifdef FEAT_WINDOWS
+     char_u    *arg;
+@@ -16898,14 +16944,13 @@ get_winnr(tp, argvar)
+ #endif
  
-     /*
-      * Call the main command loop.  This never returns.
-+     * For embedded MzScheme the main_loop will be called by Scheme
-+     * for proper stack tracking
-      */
-+#ifndef FEAT_MZSCHEME
-     main_loop(FALSE, FALSE);
-+#else
-+    mzscheme_main();
-+#endif
+ /*
+  * "tabpagewinnr()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_tabpagewinnr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     int               nr = 1;
+ #ifdef FEAT_WINDOWS
+     tabpage_T *tp;
+@@ -16921,25 +16966,21 @@ f_tabpagewinnr(argvars, rettv)
  
-     return 0;
- }
- #endif /* PROTO */
  
-@@ -1141,10 +1161,22 @@ main_loop(cmdwin, noexmode)
+ /*
+  * "tagfiles()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_tagfiles(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     char_u    fname[MAXPATHL + 1];
+     tagname_T tn;
+     int               first;
  
-           setcursor();
-           cursor_on();
+     if (rettv_list_alloc(rettv) == FAIL)
+-    {
+-      rettv->vval.v_number = 0;
+       return;
+-    }
  
-           do_redraw = FALSE;
-+
-+#ifdef STARTUPTIME
-+          /* Now that we have drawn the first screen all the startup stuff
-+           * has been done, close any file for startup messages. */
-+          if (time_fd != NULL)
-+          {
-+              TIME_MSG("first screen update");
-+              TIME_MSG("--- VIM STARTED ---");
-+              fclose(time_fd);
-+              time_fd = NULL;
-+          }
-+#endif
-       }
- #ifdef FEAT_GUI
-       if (need_mouse_correct)
-           gui_mouse_correct();
- #endif
-@@ -1455,11 +1487,12 @@ parse_command_name(parmp)
- #endif
-       parmp->evim_mode = TRUE;
-       ++initstr;
-     }
+     for (first = TRUE; ; first = FALSE)
+       if (get_tagfname(&tn, first, fname) == FAIL
+               || list_append_string(rettv->vval.v_list, fname, -1) == FAIL)
+           break;
+@@ -16967,14 +17008,13 @@ f_taglist(argvars, rettv)
+ }
  
--    if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k')
-+    /* "gvim" starts the GUI.  Also accept "Gvim" for MS-Windows. */
-+    if (TOLOWER_ASC(initstr[0]) == 'g')
-     {
-       main_start_gui();
- #ifdef FEAT_GUI
-       ++initstr;
- #endif
-@@ -1501,16 +1534,16 @@ parse_command_name(parmp)
-  * Get the name of the display, before gui_prepare() removes it from
-  * argv[].  Used for the xterm-clipboard display.
-  *
-  * Also find the --server... arguments and --socketid and --windowid
+ /*
+  * "tempname()" function
   */
 -/*ARGSUSED*/
      static void
- early_arg_scan(parmp)
--    mparm_T   *parmp;
-+    mparm_T   *parmp UNUSED;
+ f_tempname(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
--#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER)
-+#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) \
-+      || !defined(FEAT_NETBEANS_INTG)
-     int               argc = parmp->argc;
-     char      **argv = parmp->argv;
-     int               i;
+     static int        x = 'A';
  
-     for (i = 1; i < argc; i++)
-@@ -1578,10 +1611,18 @@ early_arg_scan(parmp)
- # endif
- # ifdef FEAT_GUI_GTK
-       else if (STRICMP(argv[i], "--echo-wid") == 0)
-           echo_wid_arg = TRUE;
- # endif
-+# ifndef FEAT_NETBEANS_INTG
-+      else if (strncmp(argv[i], "-nb", (size_t)3) == 0)
-+        {
-+            mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n"));
-+            mch_exit(2);
-+        }
-+# endif
-+
-     }
- #endif
+     rettv->v_type = VAR_STRING;
+@@ -17003,15 +17043,14 @@ f_tempname(argvars, rettv)
  }
  
  /*
-@@ -1690,10 +1731,15 @@ command_line_scan(parmp)
-               else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0)
-               {
-                   want_argument = TRUE;
-                   argv_idx += 3;
-               }
-+              else if (STRNICMP(argv[0] + argv_idx, "startuptime", 11) == 0)
-+              {
-+                  want_argument = TRUE;
-+                  argv_idx += 11;
-+              }
- #ifdef FEAT_CLIENTSERVER
-               else if (STRNICMP(argv[0] + argv_idx, "serverlist", 10) == 0)
-                   ; /* already processed -- no arg */
-               else if (STRNICMP(argv[0] + argv_idx, "servername", 10) == 0
-                      || STRNICMP(argv[0] + argv_idx, "serversend", 10) == 0)
-@@ -2021,11 +2067,11 @@ command_line_scan(parmp)
-                */
-               if (argv[0][argv_idx] != NUL)
-                   mainerr(ME_GARBAGE, (char_u *)argv[0]);
-               --argc;
--              if (argc < 1 && c != 'S')
-+              if (argc < 1 && c != 'S')  /* -S has an optional argument */
-                   mainerr_arg_missing((char_u *)argv[0]);
-               ++argv;
-               argv_idx = -1;
-               switch (c)
-@@ -2062,15 +2108,20 @@ command_line_scan(parmp)
-                   else
-                       parmp->commands[parmp->n_commands++] =
-                                                           (char_u *)argv[0];
-                   break;
+  * "test(list)" function: Just checking the walls...
+  */
+-/*ARGSUSED*/
+     static void
+ f_test(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+     /* Used for unit testing.  Change the code below to your liking. */
+ #if 0
+     listitem_T        *li;
+     list_T    *l;
+@@ -17292,15 +17331,14 @@ f_virtcol(argvars, rettv)
+ }
  
--              case '-':       /* "--cmd {command}" execute command */
--                  if (parmp->n_pre_commands >= MAX_ARG_CMDS)
--                      mainerr(ME_EXTRA_CMD, NULL);
--                  parmp->pre_commands[parmp->n_pre_commands++] =
-+              case '-':
-+                  if (argv[-1][2] == 'c')
-+                  {
-+                      /* "--cmd {command}" execute command */
-+                      if (parmp->n_pre_commands >= MAX_ARG_CMDS)
-+                          mainerr(ME_EXTRA_CMD, NULL);
-+                      parmp->pre_commands[parmp->n_pre_commands++] =
-                                                           (char_u *)argv[0];
-+                  }
-+                  /* "--startuptime <file>" already handled */
-                   break;
+ /*
+  * "visualmode()" function
+  */
+-/*ARGSUSED*/
+     static void
+ f_visualmode(argvars, rettv)
+-    typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *argvars UNUSED;
++    typval_T  *rettv UNUSED;
+ {
+ #ifdef FEAT_VISUAL
+     char_u    str[2];
  
-           /*  case 'd':   -d {device} is handled in mch_check_win() for the
-            *              Amiga */
+     rettv->v_type = VAR_STRING;
+@@ -17309,12 +17347,10 @@ f_visualmode(argvars, rettv)
+     rettv->vval.v_string = vim_strsave(str);
  
-@@ -2359,22 +2410,21 @@ read_stdin()
-      * Close stdin and dup it from stderr.  Required for GPM to work
-      * properly, and for running external commands.
-      * Is there any other system that cannot do this?
-      */
-     close(0);
--    dup(2);
-+    ignored = dup(2);
+     /* A non-zero number or non-empty string argument: reset mode. */
+     if (non_zero_arg(&argvars[0]))
+       curbuf->b_visual_mode_eval = NUL;
+-#else
+-    rettv->vval.v_number = 0; /* return anything, it won't work anyway */
  #endif
  }
  
  /*
-  * Create the requested number of windows and edit buffers in them.
-  * Also does recovery if "recoverymode" set.
+  * "winbufnr(nr)" function
+@@ -17334,14 +17370,13 @@ f_winbufnr(argvars, rettv)
+ }
+ /*
+  * "wincol()" function
   */
 -/*ARGSUSED*/
      static void
- create_windows(parmp)
--    mparm_T   *parmp;
-+    mparm_T   *parmp UNUSED;
+ f_wincol(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
  {
- #ifdef FEAT_WINDOWS
-     int               dorewind;
-     int               done = 0;
-@@ -2584,11 +2634,11 @@ edit_buffers(parmp)
- # ifdef HAS_SWAP_EXISTS_ACTION
-           swap_exists_did_quit = FALSE;
- # endif
-           (void)do_ecmd(0, arg_idx < GARGCOUNT
-                         ? alist_name(&GARGLIST[arg_idx]) : NULL,
--                        NULL, NULL, ECMD_LASTL, ECMD_HIDE);
-+                        NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin);
- # ifdef HAS_SWAP_EXISTS_ACTION
-           if (swap_exists_did_quit)
-           {
-               /* abort or quit selected */
-               if (got_int || only_one_window())
-@@ -3105,10 +3155,13 @@ usage()
-     main_msg(_("--remote-send <keys>\tSend <keys> to a Vim server and exit"));
-     main_msg(_("--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"));
-     main_msg(_("--serverlist\t\tList available Vim server names and exit"));
-     main_msg(_("--servername <name>\tSend to/become the Vim server <name>"));
- #endif
-+#ifdef STARTUPTIME
-+    main_msg(_("--startuptime <file>\tWrite startup timing messages to <file>"));
-+#endif
- #ifdef FEAT_VIMINFO
-     main_msg(_("-i <viminfo>\t\tUse <viminfo> instead of .viminfo"));
- #endif
-     main_msg(_("-h  or  --help\tPrint Help (this message) and exit"));
-     main_msg(_("--version\t\tPrint version information and exit"));
-@@ -3194,10 +3247,24 @@ check_swap_exists_action()
- #if defined(STARTUPTIME) || defined(PROTO)
- static void time_diff __ARGS((struct timeval *then, struct timeval *now));
- static struct timeval prev_timeval;
+     validate_cursor();
+     rettv->vval.v_number = curwin->w_wcol + 1;
+ }
+@@ -17364,27 +17399,25 @@ f_winheight(argvars, rettv)
+ }
  
-+# ifdef WIN3264
-+/*
-+ * Windows doesn't have gettimeofday(), although it does have struct timeval.
-+ */
-+    static int
-+gettimeofday(struct timeval *tv, char *dummy)
-+{
-+    long t = clock();
-+    tv->tv_sec = t / CLOCKS_PER_SEC;
-+    tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC;
-+    return 0;
-+}
-+# endif
-+
  /*
-  * Save the previous time before doing something that could nest.
-  * set "*tv_rel" to the time elapsed so far.
+  * "winline()" function
   */
-     void
-@@ -3282,24 +3349,10 @@ time_msg(msg, tv_start)
-       prev_timeval = now;
-       fprintf(time_fd, ": %s\n", msg);
-     }
+-/*ARGSUSED*/
+     static void
+ f_winline(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     validate_cursor();
+     rettv->vval.v_number = curwin->w_wrow + 1;
  }
  
--# ifdef WIN3264
--/*
-- * Windows doesn't have gettimeofday(), although it does have struct timeval.
-- */
--    int
--gettimeofday(struct timeval *tv, char *dummy)
--{
--    long t = clock();
--    tv->tv_sec = t / CLOCKS_PER_SEC;
--    tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC;
--    return 0;
--}
--# endif
--
- #endif
+ /*
+  * "winnr()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_winnr(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     int               nr = 1;
  
- #if defined(FEAT_CLIENTSERVER) || defined(PROTO)
+ #ifdef FEAT_WINDOWS
+@@ -17394,14 +17427,13 @@ f_winnr(argvars, rettv)
+ }
  
  /*
-@@ -3637,11 +3690,11 @@ cmdsrv_main(argc, argv, serverName_arg,
-           if (called_emsg)
-               mch_errmsg("\n");
-       }
-       else if (STRICMP(argv[i], "--servername") == 0)
-       {
--          /* Alredy processed. Take it out of the command line */
-+          /* Already processed. Take it out of the command line */
-           i++;
-           continue;
-       }
-       else
-       {
-@@ -3838,14 +3891,13 @@ eval_client_expr_to_string(expr)
+  * "winrestcmd()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_winrestcmd(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+ #ifdef FEAT_WINDOWS
+     win_T     *wp;
+     int               winnr = 1;
+@@ -17429,15 +17461,14 @@ f_winrestcmd(argvars, rettv)
+ }
  /*
-  * If conversion is needed, convert "data" from "client_enc" to 'encoding' and
-  * return an allocated string.  Otherwise return "data".
-  * "*tofree" is set to the result when it needs to be freed later.
+  * "winrestview()" function
   */
--/*ARGSUSED*/
-     char_u *
- serverConvert(client_enc, data, tofree)
--    char_u *client_enc;
-+    char_u *client_enc UNUSED;
-     char_u *data;
-     char_u **tofree;
+-/* ARGSUSED */
+     static void
+ f_winrestview(argvars, rettv)
+     typval_T  *argvars;
+-    typval_T  *rettv;
++    typval_T  *rettv UNUSED;
  {
-     char_u    *res = data;
+     dict_T    *dict;
  
---- vim72.orig/src/fileio.c
-+++ vim72/src/fileio.c
-@@ -19,11 +19,11 @@
- # include "vimio.h"   /* for mktemp(), CJW 1997-12-03 */
- #endif
+     if (argvars[0].v_type != VAR_DICT
+           || (dict = argvars[0].vval.v_dict) == NULL)
+@@ -17475,14 +17506,13 @@ f_winrestview(argvars, rettv)
+ }
  
- #include "vim.h"
+ /*
+  * "winsaveview()" function
+  */
+-/* ARGSUSED */
+     static void
+ f_winsaveview(argvars, rettv)
+-    typval_T  *argvars;
++    typval_T  *argvars UNUSED;
+     typval_T  *rettv;
+ {
+     dict_T    *dict;
  
--#ifdef __TANDEM
-+#if defined(__TANDEM) || defined(__MINT__)
- # include <limits.h>          /* for SSIZE_MAX */
- #endif
+     dict = dict_alloc();
+@@ -18095,18 +18125,57 @@ get_vim_var_str(idx)
+ {
+     return get_tv_string(&vimvars[idx].vv_tv);
+ }
  
- #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
- # include <utime.h>           /* for struct utimbuf */
-@@ -67,11 +67,11 @@ static int time_differs __ARGS((long t1,
- #ifdef FEAT_AUTOCMD
- static int apply_autocmds_exarg __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap));
- static int au_find_group __ARGS((char_u *name));
- # define AUGROUP_DEFAULT    -1            /* default autocmd group */
--# define AUGROUP_ERROR            -2      /* errornouse autocmd group */
-+# define AUGROUP_ERROR            -2      /* erroneous autocmd group */
- # define AUGROUP_ALL      -3      /* all autocmd groups */
- #endif
- #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
- # define HAS_BW_FLAGS
-@@ -119,10 +119,12 @@ struct bw_info
-     int               bw_restlen;     /* nr of bytes in bw_rest[] */
-     int               bw_first;       /* first write call */
-     char_u    *bw_conv_buf;   /* buffer for writing converted chars */
-     int               bw_conv_buflen; /* size of bw_conv_buf */
-     int               bw_conv_error;  /* set for conversion error */
-+    linenr_T  bw_conv_error_lnum;  /* first line with error or zero */
-+    linenr_T  bw_start_lnum;  /* line number at start of buffer */
- # ifdef USE_ICONV
-     iconv_t   bw_iconv_fd;    /* descriptor for iconv() or -1 */
- # endif
- #endif
- };
-@@ -130,11 +132,11 @@ struct bw_info
- static int  buf_write_bytes __ARGS((struct bw_info *ip));
- #ifdef FEAT_MBYTE
- static linenr_T readfile_linenr __ARGS((linenr_T linecnt, char_u *p, char_u *endp));
- static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags));
--static int same_encoding __ARGS((char_u *a, char_u *b));
-+static int need_conversion __ARGS((char_u *fenc));
- static int get_fio_flags __ARGS((char_u *ptr));
- static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags));
- static int make_bom __ARGS((char_u *buf, char_u *name));
- # ifdef WIN3264
- static int get_win_fio_flags __ARGS((char_u *ptr));
-@@ -142,11 +144,16 @@ static int get_win_fio_flags __ARGS((cha
- # ifdef MACOS_X
- static int get_mac_fio_flags __ARGS((char_u *ptr));
- # endif
- #endif
- static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
--
-+#ifdef TEMPDIRNAMES
-+static void vim_settempdir __ARGS((char_u *tempdir));
+ /*
+- * Set v:count, v:count1 and v:prevcount.
++ * Get List v: variable value.  Caller must take care of reference count when
++ * needed.
++ */
++    list_T *
++get_vim_var_list(idx)
++    int               idx;
++{
++    return vimvars[idx].vv_list;
++}
++
++/*
++ * Set v:char to character "c".
+  */
+     void
+-set_vcount(count, count1)
++set_vim_var_char(c)
++    int c;
++{
++#ifdef FEAT_MBYTE
++    char_u    buf[MB_MAXBYTES];
++#else
++    char_u    buf[2];
 +#endif
-+#ifdef FEAT_AUTOCMD
-+static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
++
++#ifdef FEAT_MBYTE
++    if (has_mbyte)
++      buf[(*mb_char2bytes)(c, buf)] = NUL;
++    else
 +#endif
++    {
++      buf[0] = c;
++      buf[1] = NUL;
++    }
++    set_vim_var_string(VV_CHAR, buf, -1);
++}
++
++/*
++ * Set v:count to "count" and v:count1 to "count1".
++ * When "set_prevcount" is TRUE first set v:prevcount from v:count.
++ */
++    void
++set_vcount(count, count1, set_prevcount)
+     long      count;
+     long      count1;
++    int               set_prevcount;
+ {
+-    vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
++    if (set_prevcount)
++      vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
+     vimvars[VV_COUNT].vv_nr = count;
+     vimvars[VV_COUNT1].vv_nr = count1;
+ }
+ /*
+@@ -18130,10 +18199,24 @@ set_vim_var_string(idx, val, len)
+     else
+       vimvars[idx].vv_str = vim_strnsave(val, len);
+ }
  
+ /*
++ * Set List v: variable to "val".
++ */
++    void
++set_vim_var_list(idx, val)
++    int               idx;
++    list_T    *val;
++{
++    list_unref(vimvars[idx].vv_list);
++    vimvars[idx].vv_list = val;
++    if (val != NULL)
++      ++val->lv_refcount;
++}
++
++/*
+  * Set v:register if needed.
+  */
      void
- filemess(buf, name, s, attr)
-     buf_T     *buf;
-     char_u    *name;
-@@ -293,10 +300,23 @@ readfile(fname, sfname, from, lines_to_s
-                                          wasn't possible */
-     char_u    conv_rest[CONV_RESTLEN];
-     int               conv_restlen = 0;       /* nr of bytes in conv_rest[] */
- #endif
+ set_reg_var(c)
+     int               c;
+@@ -18866,11 +18949,12 @@ new_script_vars(id)
+ init_var_dict(dict, dict_var)
+     dict_T    *dict;
+     dictitem_T        *dict_var;
+ {
+     hash_init(&dict->dv_hashtab);
+-    dict->dv_refcount = 99999;
++    dict->dv_refcount = DO_NOT_FREE_CNT;
++    dict->dv_copyID = 0;
+     dict_var->di_tv.vval.v_dict = dict;
+     dict_var->di_tv.v_type = VAR_DICT;
+     dict_var->di_tv.v_lock = VAR_FIXED;
+     dict_var->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+     dict_var->di_key[0] = NUL;
+@@ -18949,11 +19033,12 @@ list_one_var(v, prefix, first)
+ {
+     char_u    *tofree;
+     char_u    *s;
+     char_u    numbuf[NUMBUFLEN];
  
-+#ifdef FEAT_AUTOCMD
-+    /* Remember the initial values of curbuf, curbuf->b_ffname and
-+     * curbuf->b_fname to detect whether they are altered as a result of
-+     * executing nasty autocommands.  Also check if "fname" and "sfname"
-+     * point to one of these values. */
-+    buf_T   *old_curbuf = curbuf;
-+    char_u  *old_b_ffname = curbuf->b_ffname;
-+    char_u  *old_b_fname = curbuf->b_fname;
-+    int     using_b_ffname = (fname == curbuf->b_ffname)
-+                                            || (sfname == curbuf->b_ffname);
-+    int     using_b_fname = (fname == curbuf->b_fname)
-+                                             || (sfname == curbuf->b_fname);
-+#endif
-     write_no_eol_lnum = 0;    /* in case it was set by the previous read */
+-    s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID);
++    current_copyID += COPYID_INC;
++    s = echo_string(&v->di_tv, &tofree, numbuf, current_copyID);
+     list_one_var_a(prefix, v->di_key, v->di_tv.v_type,
+                                        s == NULL ? (char_u *)"" : s, first);
+     vim_free(tofree);
+ }
  
-     /*
-      * If there is no file name yet, use the one for the read file.
-      * BF_NOTEDITED is set to reflect this.
-@@ -587,11 +607,25 @@ readfile(fname, sfname, from, lines_to_s
-                    * that we are editing this file.  Don't do this for a
-                    * "nofile" or "nowrite" buffer type. */
- #ifdef FEAT_QUICKFIX
-                   if (!bt_dontwrite(curbuf))
- #endif
-+                  {
-                       check_need_swap(newfile);
-+#ifdef FEAT_AUTOCMD
-+                      /* SwapExists autocommand may mess things up */
-+                      if (curbuf != old_curbuf
-+                              || (using_b_ffname
-+                                      && (old_b_ffname != curbuf->b_ffname))
-+                              || (using_b_fname
-+                                       && (old_b_fname != curbuf->b_fname)))
-+                      {
-+                          EMSG(_(e_auchangedbuf));
-+                          return FAIL;
-+                      }
-+#endif
-+                  }
-                   if (dir_of_file_exists(fname))
-                       filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
-                   else
-                       filemess(curbuf, sfname,
-                                          (char_u *)_("[New DIRECTORY]"), 0);
-@@ -666,13 +700,25 @@ readfile(fname, sfname, from, lines_to_s
- #ifdef FEAT_QUICKFIX
-     if (!bt_dontwrite(curbuf))
- #endif
+@@ -19016,35 +19101,38 @@ set_var(name, tv, copy)
+     dictitem_T        *v;
+     char_u    *varname;
+     hashtab_T *ht;
+     char_u    *p;
++    ht = find_var_ht(name, &varname);
++    if (ht == NULL || *varname == NUL)
++    {
++      EMSG2(_(e_illvar), name);
++      return;
++    }
++    v = find_var_in_ht(ht, varname, TRUE);
++
+     if (tv->v_type == VAR_FUNC)
      {
-       check_need_swap(newfile);
-+#ifdef FEAT_AUTOCMD
-+      if (!read_stdin && (curbuf != old_curbuf
-+              || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
-+              || (using_b_fname && (old_b_fname != curbuf->b_fname))))
-+      {
-+          EMSG(_(e_auchangedbuf));
-+          if (!read_buffer)
-+              close(fd);
-+          return FAIL;
-+      }
-+#endif
- #ifdef UNIX
-       /* Set swap file protection bits after creating it. */
--      if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
-+      if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
-+                        && curbuf->b_ml.ml_mfp->mf_fname != NULL)
-           (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
- #endif
+       if (!(vim_strchr((char_u *)"wbs", name[0]) != NULL && name[1] == ':')
+               && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':')
+                                                        ? name[2] : name[0]))
+       {
+           EMSG2(_("E704: Funcref variable name must start with a capital: %s"), name);
+           return;
+       }
+-      if (function_exists(name))
++      /* Don't allow hiding a function.  When "v" is not NULL we migth be
++       * assigning another function to the same var, the type is checked
++       * below. */
++      if (v == NULL && function_exists(name))
+       {
+           EMSG2(_("E705: Variable name conflicts with existing function: %s"),
+                                                                       name);
+           return;
+       }
      }
  
- #if defined(HAS_SWAP_EXISTS_ACTION)
-@@ -696,11 +742,10 @@ readfile(fname, sfname, from, lines_to_s
- #ifdef FEAT_AUTOCMD
-     if (!read_buffer)
+-    ht = find_var_ht(name, &varname);
+-    if (ht == NULL || *varname == NUL)
+-    {
+-      EMSG2(_(e_illvar), name);
+-      return;
+-    }
+-
+-    v = find_var_in_ht(ht, varname, TRUE);
+     if (v != NULL)
      {
-       int     m = msg_scroll;
-       int     n = msg_scrolled;
--      buf_T   *old_curbuf = curbuf;
+       /* existing variable, need to clear the value */
+       if (var_check_ro(v->di_flags, name)
+                                     || tv_check_lock(v->di_tv.v_lock, name))
+@@ -19203,12 +19291,14 @@ tv_check_lock(lock, name)
  
-       /*
-        * The file must be closed again, the autocommands may want to change
-        * the file before reading it.
-        */
-@@ -738,12 +783,17 @@ readfile(fname, sfname, from, lines_to_s
+ /*
+  * Copy the values from typval_T "from" to typval_T "to".
+  * When needed allocates string or increases reference count.
+  * Does not make a copy of a list or dict but copies the reference!
++ * It is OK for "from" and "to" to point to the same item.  This is used to
++ * make a copy later.
+  */
+-    static void
++    void
+ copy_tv(from, to)
+     typval_T *from;
+     typval_T *to;
+ {
+     to->v_type = from->v_type;
+@@ -19382,11 +19472,12 @@ ex_echo(eap)
+               if (eap->cmdidx == CMD_echo)
+                   msg_start();
+           }
+           else if (eap->cmdidx == CMD_echo)
+               msg_puts_attr((char_u *)" ", echo_attr);
+-          p = echo_string(&rettv, &tofree, numbuf, ++current_copyID);
++          current_copyID += COPYID_INC;
++          p = echo_string(&rettv, &tofree, numbuf, current_copyID);
+           if (p != NULL)
+               for ( ; *p != NUL && !got_int; ++p)
+               {
+                   if (*p == '\n' || *p == '\r' || *p == TAB)
+                   {
+@@ -19658,10 +19749,11 @@ ex_function(eap)
+                       if (!isdigit(*fp->uf_name)
+                                   && vim_regexec(&regmatch, fp->uf_name, 0))
+                           list_func_head(fp, FALSE);
+                   }
+               }
++              vim_free(regmatch.regprog);
+           }
        }
- #endif
-       /*
-        * Don't allow the autocommands to change the current buffer.
-        * Try to re-open the file.
-+       *
-+       * Don't allow the autocommands to change the buffer name either
-+       * (cd for example) if it invalidates fname or sfname.
-        */
-       if (!read_stdin && (curbuf != old_curbuf
-+              || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
-+              || (using_b_fname && (old_b_fname != curbuf->b_fname))
-               || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
-       {
-           --no_wait_return;
-           msg_scroll = msg_save;
-           if (fd < 0)
-@@ -930,11 +980,14 @@ retry:
-     if (keep_fileformat)
-       keep_fileformat = FALSE;
-     else
-     {
-       if (eap != NULL && eap->force_ff != 0)
-+      {
-           fileformat = get_fileformat_force(curbuf, eap);
-+          try_unix = try_dos = try_mac = FALSE;
-+      }
-       else if (curbuf->b_p_bin)
-           fileformat = EOL_UNIX;              /* binary: use Unix format */
-       else if (*p_ffs == NUL)
-           fileformat = get_fileformat(curbuf);/* use format from buffer */
-       else
-@@ -991,17 +1044,16 @@ retry:
-           tmpname = NULL;
+       if (*p == '/')
+           ++p;
+       eap->nextcmd = check_nextcmd(p);
+@@ -19746,11 +19838,11 @@ ex_function(eap)
+                   msg_putchar('\n');
+                   msg_puts((char_u *)"   endfunction");
+               }
+           }
+           else
+-              emsg_funcname("E123: Undefined function: %s", name);
++              emsg_funcname(N_("E123: Undefined function: %s"), name);
        }
+       goto ret_free;
      }
  
      /*
--     * Conversion is required when the encoding of the file is different
--     * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4 (requires
--     * conversion to UTF-8).
-+     * Conversion may be required when the encoding of the file is different
-+     * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4.
-      */
-     fio_flags = 0;
--    converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
--    if (converted || enc_unicode != 0)
-+    converted = need_conversion(fenc);
-+    if (converted)
+@@ -19790,11 +19882,11 @@ ex_function(eap)
+               j = 0;
+           while (arg[j] != NUL && (j == 0 ? eval_isnamec1(arg[j])
+                                                     : eval_isnamec(arg[j])))
+               ++j;
+           if (arg[j] != NUL)
+-              emsg_funcname(_(e_invarg2), arg);
++              emsg_funcname((char *)e_invarg2, arg);
+       }
+     }
+     /*
+      * Isolate the arguments: "arg1, arg2, ...)"
+@@ -20062,11 +20154,11 @@ ex_function(eap)
+     if (fudi.fd_dict == NULL)
      {
+       v = find_var(name, &ht);
+       if (v != NULL && v->di_tv.v_type == VAR_FUNC)
+       {
+-          emsg_funcname("E707: Function name conflicts with variable: %s",
++          emsg_funcname(N_("E707: Function name conflicts with variable: %s"),
+                                                                       name);
+           goto erret;
+       }
  
-       /* "ucs-bom" means we need to check the first bytes of the file
-        * for a BOM. */
-       if (STRCMP(fenc, ENC_UCSBOM) == 0)
-@@ -2202,18 +2254,26 @@ failed:
- # endif
- #endif
+       fp = find_func(name);
+@@ -20077,11 +20169,11 @@ ex_function(eap)
+               emsg_funcname(e_funcexts, name);
+               goto erret;
+           }
+           if (fp->uf_calls > 0)
+           {
+-              emsg_funcname("E127: Cannot redefine function %s: It is in use",
++              emsg_funcname(N_("E127: Cannot redefine function %s: It is in use"),
+                                                                       name);
+               goto erret;
+           }
+           /* redefine existing function */
+           ga_clear_strings(&(fp->uf_args));
+@@ -20588,10 +20680,13 @@ func_dump_profile(fd)
+     int               i;
+     ufunc_T   **sorttab;
+     int               st_len = 0;
  
-     if (!read_buffer && !read_stdin)
-       close(fd);                              /* errors are ignored */
-+#ifdef HAVE_FD_CLOEXEC
-+    else
-+    {
-+      int fdflags = fcntl(fd, F_GETFD);
-+      if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
-+          fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
-+    }
-+#endif
-     vim_free(buffer);
+     todo = (int)func_hashtab.ht_used;
++    if (todo == 0)
++      return;     /* nothing to dump */
++
+     sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo));
  
- #ifdef HAVE_DUP
-     if (read_stdin)
+     for (hi = func_hashtab.ht_array; todo > 0; ++hi)
      {
-       /* Use stderr for stdin, makes shell commands work. */
-       close(0);
--      dup(2);
-+      ignored = dup(2);
+       if (!HASHITEM_EMPTY(hi))
+@@ -20636,10 +20731,12 @@ func_dump_profile(fd)
+       prof_sort_list(fd, sorttab, st_len, "TOTAL", FALSE);
+       qsort((void *)sorttab, (size_t)st_len, sizeof(ufunc_T *),
+                                                             prof_self_cmp);
+       prof_sort_list(fd, sorttab, st_len, "SELF", TRUE);
      }
- #endif
++
++    vim_free(sorttab);
+ }
  
- #ifdef FEAT_MBYTE
-     if (tmpname != NULL)
-@@ -2339,15 +2399,10 @@ failed:
-           if (ff_error == EOL_DOS)
-           {
-               STRCAT(IObuff, _("[CR missing]"));
-               c = TRUE;
-           }
--          if (ff_error == EOL_MAC)
--          {
--              STRCAT(IObuff, _("[NL found]"));
--              c = TRUE;
--          }
-           if (split)
-           {
-               STRCAT(IObuff, _("[long lines split]"));
-               c = TRUE;
-           }
-@@ -2709,11 +2764,11 @@ readfile_charconvert(fname, fenc, fdp)
      static void
- check_marks_read()
+ prof_sort_list(fd, sorttab, st_len, title, prefer_self)
+     FILE      *fd;
+@@ -21010,11 +21107,11 @@ call_user_func(fp, argcount, argvars, re
+     dict_T    *selfdict;      /* Dictionary for "self" */
  {
-     if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
-                                                 && curbuf->b_ffname != NULL)
--      read_viminfo(NULL, FALSE, TRUE, FALSE);
-+      read_viminfo(NULL, VIF_WANT_MARKS);
+     char_u    *save_sourcing_name;
+     linenr_T  save_sourcing_lnum;
+     scid_T    save_current_SID;
+-    funccall_T        fc;
++    funccall_T        *fc;
+     int               save_did_emsg;
+     static int        depth = 0;
+     dictitem_T        *v;
+     int               fixvar_idx = 0; /* index in fixvar[] */
+     int               i;
+@@ -21036,40 +21133,41 @@ call_user_func(fp, argcount, argvars, re
+     }
+     ++depth;
  
-     /* Always set b_marks_read; needed when 'viminfo' is changed to include
-      * the ' parameter after opening a buffer. */
-     curbuf->b_marks_read = TRUE;
- }
-@@ -2879,10 +2934,11 @@ buf_write(buf, fname, sfname, start, end
-     char_u        c;
-     int                   len;
-     linenr_T      lnum;
-     long          nchars;
-     char_u        *errmsg = NULL;
-+    int                   errmsg_allocated = FALSE;
-     char_u        *errnum = NULL;
-     char_u        *buffer;
-     char_u        smallbuf[SMBUFSIZE];
-     char_u        *backup_ext;
-     int                   bufsize;
-@@ -2923,10 +2979,17 @@ buf_write(buf, fname, sfname, start, end
-                                          backup or new file */
- #endif
+     line_breakcheck();                /* check for CTRL-C hit */
  
-     if (fname == NULL || *fname == NUL)       /* safety check */
-       return FAIL;
-+    if (buf->b_ml.ml_mfp == NULL)
-+    {
-+      /* This can happen during startup when there is a stray "w" in the
-+       * vimrc file. */
-+      EMSG(_(e_emptybuf));
-+      return FAIL;
-+    }
+-    fc.caller = current_funccal;
+-    current_funccal = &fc;
+-    fc.func = fp;
+-    fc.rettv = rettv;
++    fc = (funccall_T *)alloc(sizeof(funccall_T));
++    fc->caller = current_funccal;
++    current_funccal = fc;
++    fc->func = fp;
++    fc->rettv = rettv;
+     rettv->vval.v_number = 0;
+-    fc.linenr = 0;
+-    fc.returned = FALSE;
+-    fc.level = ex_nesting_level;
++    fc->linenr = 0;
++    fc->returned = FALSE;
++    fc->level = ex_nesting_level;
+     /* Check if this function has a breakpoint. */
+-    fc.breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
+-    fc.dbg_tick = debug_tick;
++    fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
++    fc->dbg_tick = debug_tick;
  
      /*
-      * Disallow writing from .exrc and .vimrc in current directory for
-      * security reasons.
+-     * Note about using fc.fixvar[]: This is an array of FIXVAR_CNT variables
++     * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables
+      * with names up to VAR_SHORT_LEN long.  This avoids having to alloc/free
+      * each argument variable and saves a lot of time.
       */
-@@ -2942,10 +3005,11 @@ buf_write(buf, fname, sfname, start, end
- #ifdef FEAT_MBYTE
-     /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */
-     write_info.bw_conv_buf = NULL;
-     write_info.bw_conv_error = FALSE;
-+    write_info.bw_conv_error_lnum = 0;
-     write_info.bw_restlen = 0;
- # ifdef USE_ICONV
-     write_info.bw_iconv_fd = (iconv_t)-1;
- # endif
- #endif
-@@ -3449,16 +3513,16 @@ buf_write(buf, fname, sfname, start, end
-                   backup_copy = TRUE;
-               else
-               {
- # ifdef UNIX
- #  ifdef HAVE_FCHOWN
--                  fchown(fd, st_old.st_uid, st_old.st_gid);
-+                  ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
- #  endif
-                   if (mch_stat((char *)IObuff, &st) < 0
-                           || st.st_uid != st_old.st_uid
-                           || st.st_gid != st_old.st_gid
--                          || st.st_mode != perm)
-+                          || (long)st.st_mode != perm)
-                       backup_copy = TRUE;
- # endif
-                   /* Close the file before removing it, on MS-Windows we
-                    * can't delete an open file. */
-                   close(fd);
-@@ -3920,14 +3984,13 @@ buf_write(buf, fname, sfname, start, end
+     /*
+      * Init l: variables.
+      */
+-    init_var_dict(&fc.l_vars, &fc.l_vars_var);
++    init_var_dict(&fc->l_vars, &fc->l_vars_var);
+     if (selfdict != NULL)
+     {
+       /* Set l:self to "selfdict".  Use "name" to avoid a warning from
+        * some compiler that checks the destination size. */
+-      v = &fc.fixvar[fixvar_idx++].var;
++      v = &fc->fixvar[fixvar_idx++].var;
+       name = v->di_key;
+       STRCPY(name, "self");
+       v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX;
+-      hash_add(&fc.l_vars.dv_hashtab, DI2HIKEY(v));
++      hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v));
+       v->di_tv.v_type = VAR_DICT;
+       v->di_tv.v_lock = 0;
+       v->di_tv.vval.v_dict = selfdict;
+       ++selfdict->dv_refcount;
      }
-     else
-       fenc = buf->b_p_fenc;
+@@ -21077,32 +21175,35 @@ call_user_func(fp, argcount, argvars, re
      /*
--     * The file needs to be converted when 'fileencoding' is set and
--     * 'fileencoding' differs from 'encoding'.
-+     * Check if the file needs to be converted.
+      * Init a: variables.
+      * Set a:0 to "argcount".
+      * Set a:000 to a list with room for the "..." arguments.
       */
--    converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
-+    converted = need_conversion(fenc);
+-    init_var_dict(&fc.l_avars, &fc.l_avars_var);
+-    add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0",
++    init_var_dict(&fc->l_avars, &fc->l_avars_var);
++    add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0",
+                               (varnumber_T)(argcount - fp->uf_args.ga_len));
+-    v = &fc.fixvar[fixvar_idx++].var;
+-    STRCPY(v->di_key, "000");
++    /* Use "name" to avoid a warning from some compiler that checks the
++     * destination size. */
++    v = &fc->fixvar[fixvar_idx++].var;
++    name = v->di_key;
++    STRCPY(name, "000");
+     v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+-    hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
++    hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
+     v->di_tv.v_type = VAR_LIST;
+     v->di_tv.v_lock = VAR_FIXED;
+-    v->di_tv.vval.v_list = &fc.l_varlist;
+-    vim_memset(&fc.l_varlist, 0, sizeof(list_T));
+-    fc.l_varlist.lv_refcount = 99999;
+-    fc.l_varlist.lv_lock = VAR_FIXED;
++    v->di_tv.vval.v_list = &fc->l_varlist;
++    vim_memset(&fc->l_varlist, 0, sizeof(list_T));
++    fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT;
++    fc->l_varlist.lv_lock = VAR_FIXED;
  
      /*
-      * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done.  Or
-      * Latin1 to Unicode conversion.  This is handled in buf_write_bytes().
-      * Prepare the flags for it and allocate bw_conv_buf when needed.
-@@ -4198,10 +4261,11 @@ restore_backup:
-               end = 0;
-           else
-               nchars += write_info.bw_len;
+      * Set a:firstline to "firstline" and a:lastline to "lastline".
+      * Set a:name to named arguments.
+      * Set a:N to the "..." arguments.
+      */
+-    add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "firstline",
++    add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline",
+                                                     (varnumber_T)firstline);
+-    add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "lastline",
++    add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline",
+                                                      (varnumber_T)lastline);
+     for (i = 0; i < argcount; ++i)
+     {
+       ai = i - fp->uf_args.ga_len;
+       if (ai < 0)
+@@ -21114,11 +21215,11 @@ call_user_func(fp, argcount, argvars, re
+           sprintf((char *)numbuf, "%d", ai + 1);
+           name = numbuf;
        }
-     }
-+    write_info.bw_start_lnum = start;
- #endif
-     write_info.bw_len = bufsize;
- #ifdef HAS_BW_FLAGS
-     write_info.bw_flags = wb_flags;
-@@ -4233,10 +4297,13 @@ restore_backup:
+       if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN)
+       {
+-          v = &fc.fixvar[fixvar_idx++].var;
++          v = &fc->fixvar[fixvar_idx++].var;
+           v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+       }
+       else
+       {
+           v = (dictitem_T *)alloc((unsigned)(sizeof(dictitem_T)
+@@ -21126,22 +21227,22 @@ call_user_func(fp, argcount, argvars, re
+           if (v == NULL)
                break;
-           }
-           nchars += bufsize;
-           s = buffer;
-           len = 0;
-+#ifdef FEAT_MBYTE
-+          write_info.bw_start_lnum = lnum;
-+#endif
+           v->di_flags = DI_FLAGS_RO;
        }
-       /* write failed or last line has no EOL: stop here */
-       if (end == 0
-               || (lnum == end
-                   && write_bin
-@@ -4365,18 +4432,18 @@ restore_backup:
-        * permission or ACL stuff */
-       if (mch_stat((char *)wfname, &st) < 0
-               || st.st_uid != st_old.st_uid
-               || st.st_gid != st_old.st_gid)
+       STRCPY(v->di_key, name);
+-      hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
++      hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
+       /* Note: the values are copied directly to avoid alloc/free.
+        * "argvars" must have VAR_FIXED for v_lock. */
+       v->di_tv = argvars[i];
+       v->di_tv.v_lock = VAR_FIXED;
+       if (ai >= 0 && ai < MAX_FUNC_ARGS)
        {
--          fchown(fd, st_old.st_uid, st_old.st_gid);
-+          ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
-           if (perm >= 0)      /* set permission again, may have changed */
-               (void)mch_setperm(wfname, perm);
+-          list_append(&fc.l_varlist, &fc.l_listitems[ai]);
+-          fc.l_listitems[ai].li_tv = argvars[i];
+-          fc.l_listitems[ai].li_tv.v_lock = VAR_FIXED;
++          list_append(&fc->l_varlist, &fc->l_listitems[ai]);
++          fc->l_listitems[ai].li_tv = argvars[i];
++          fc->l_listitems[ai].li_tv.v_lock = VAR_FIXED;
        }
- # endif
-       buf_setino(buf);
      }
--    else if (buf->b_dev < 0)
-+    else if (!buf->b_dev_valid)
-       /* Set the inode when creating a new file. */
-       buf_setino(buf);
- #endif
  
-     if (close(fd) != 0)
-@@ -4429,11 +4496,21 @@ restore_backup:
+     /* Don't redraw while executing the function. */
+     ++RedrawingDisabled;
+@@ -21202,11 +21303,11 @@ call_user_func(fp, argcount, argvars, re
+     if (do_profiling == PROF_YES)
      {
-       if (errmsg == NULL)
-       {
- #ifdef FEAT_MBYTE
-           if (write_info.bw_conv_error)
--              errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)");
-+          {
-+              if (write_info.bw_conv_error_lnum == 0)
-+                  errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)");
-+              else
-+              {
-+                  errmsg_allocated = TRUE;
-+                  errmsg = alloc(300);
-+                  vim_snprintf((char *)errmsg, 300, _("E513: write error, conversion failed in line %ld (make 'fenc' empty to override)"),
-+                                       (long)write_info.bw_conv_error_lnum);
-+              }
-+          }
-           else
- #endif
-               if (got_int)
-                   errmsg = (char_u *)_(e_interr);
-               else
-@@ -4505,10 +4582,16 @@ restore_backup:
- #ifdef FEAT_MBYTE
-       if (write_info.bw_conv_error)
-       {
-           STRCAT(IObuff, _(" CONVERSION ERROR"));
-           c = TRUE;
-+          if (write_info.bw_conv_error_lnum != 0)
-+          {
-+              size_t l = STRLEN(IObuff);
-+              vim_snprintf((char *)IObuff + l, IOSIZE - l, _(" in line %ld;"),
-+                      (long)write_info.bw_conv_error_lnum);
-+          }
-       }
-       else if (notconverted)
+       if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
+           func_do_profile(fp);
+       if (fp->uf_profiling
+-                     || (fc.caller != NULL && &fc.caller->func->uf_profiling))
++                  || (fc->caller != NULL && fc->caller->func->uf_profiling))
        {
-           STRCAT(IObuff, _("[NOT converted]"));
-           c = TRUE;
-@@ -4701,10 +4784,12 @@ nofail:
-           STRMOVE(IObuff + numlen, IObuff);
-           mch_memmove(IObuff, errnum, (size_t)numlen);
+           ++fp->uf_tm_count;
+           profile_start(&call_start);
+           profile_zero(&fp->uf_tm_children);
        }
-       STRCAT(IObuff, errmsg);
-       emsg(IObuff);
-+      if (errmsg_allocated)
-+          vim_free(errmsg);
+@@ -21218,11 +21319,11 @@ call_user_func(fp, argcount, argvars, re
+     current_SID = fp->uf_script_ID;
+     save_did_emsg = did_emsg;
+     did_emsg = FALSE;
  
-       retval = FAIL;
-       if (end == 0)
+     /* call do_cmdline() to execute the lines */
+-    do_cmdline(NULL, get_func_line, (void *)&fc,
++    do_cmdline(NULL, get_func_line, (void *)fc,
+                                    DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
+     --RedrawingDisabled;
+     /* when the function was aborted because of an error, return -1 */
+@@ -21233,20 +21334,20 @@ call_user_func(fp, argcount, argvars, re
+       rettv->vval.v_number = -1;
+     }
+ #ifdef FEAT_PROFILE
+     if (do_profiling == PROF_YES && (fp->uf_profiling
+-                  || (fc.caller != NULL && &fc.caller->func->uf_profiling)))
++                  || (fc->caller != NULL && fc->caller->func->uf_profiling)))
+     {
+       profile_end(&call_start);
+       profile_sub_wait(&wait_start, &call_start);
+       profile_add(&fp->uf_tm_total, &call_start);
+       profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children);
+-      if (fc.caller != NULL && &fc.caller->func->uf_profiling)
++      if (fc->caller != NULL && fc->caller->func->uf_profiling)
        {
-           MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"),
-@@ -4780,18 +4865,26 @@ nofail:
- set_rw_fname(fname, sfname)
-     char_u    *fname;
-     char_u    *sfname;
- {
- #ifdef FEAT_AUTOCMD
-+    buf_T     *buf = curbuf;
-+
-     /* It's like the unnamed buffer is deleted.... */
-     if (curbuf->b_p_bl)
-       apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
-     apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
- # ifdef FEAT_EVAL
-     if (aborting())       /* autocmds may abort script processing */
-       return FAIL;
- # endif
-+    if (curbuf != buf)
-+    {
-+      /* We are in another buffer now, don't do the renaming. */
-+      EMSG(_(e_auchangedbuf));
-+      return FAIL;
-+    }
+-          profile_add(&fc.caller->func->uf_tm_children, &call_start);
+-          profile_add(&fc.caller->func->uf_tml_children, &call_start);
++          profile_add(&fc->caller->func->uf_tm_children, &call_start);
++          profile_add(&fc->caller->func->uf_tml_children, &call_start);
+       }
+     }
  #endif
  
-     if (setfname(curbuf, fname, sfname, FALSE) == OK)
-       curbuf->b_flags |= BF_NOTEDITED;
+     /* when being verbose, mention the return value */
+@@ -21255,24 +21356,24 @@ call_user_func(fp, argcount, argvars, re
+       ++no_wait_return;
+       verbose_enter_scroll();
  
-@@ -5052,11 +5145,17 @@ buf_write_bytes(ip)
-                       c = utf_ptr2char(buf + wlen);
-                   else
-                       c = buf[wlen];
-               }
+       if (aborting())
+           smsg((char_u *)_("%s aborted"), sourcing_name);
+-      else if (fc.rettv->v_type == VAR_NUMBER)
++      else if (fc->rettv->v_type == VAR_NUMBER)
+           smsg((char_u *)_("%s returning #%ld"), sourcing_name,
+-                                             (long)fc.rettv->vval.v_number);
++                                             (long)fc->rettv->vval.v_number);
+       else
+       {
+           char_u      buf[MSG_BUF_LEN];
+           char_u      numbuf2[NUMBUFLEN];
+           char_u      *tofree;
+           char_u      *s;
  
--              ip->bw_conv_error |= ucs2bytes(c, &p, flags);
-+              if (ucs2bytes(c, &p, flags) && !ip->bw_conv_error)
-+              {
-+                  ip->bw_conv_error = TRUE;
-+                  ip->bw_conv_error_lnum = ip->bw_start_lnum;
-+              }
-+              if (c == NL)
-+                  ++ip->bw_start_lnum;
-           }
-           if (flags & FIO_LATIN1)
-               len = (int)(p - buf);
-           else
+           /* The value may be very long.  Skip the middle part, so that we
+            * have some idea how it starts and ends. smsg() would always
+            * truncate it at the end. */
+-          s = tv2string(fc.rettv, &tofree, numbuf2, 0);
++          s = tv2string(fc->rettv, &tofree, numbuf2, 0);
+           if (s != NULL)
            {
-@@ -5244,17 +5343,20 @@ buf_write_bytes(ip)
-           size_t      tolen;
+               trunc_string(s, buf, MSG_BUF_CLEN);
+               smsg((char_u *)_("%s returning %s"), sourcing_name, buf);
+               vim_free(tofree);
+@@ -21304,18 +21405,88 @@ call_user_func(fp, argcount, argvars, re
+       verbose_leave_scroll();
+       --no_wait_return;
+     }
  
-           /* Convert with iconv(). */
-           if (ip->bw_restlen > 0)
-           {
-+              char *fp;
+     did_emsg |= save_did_emsg;
+-    current_funccal = fc.caller;
++    current_funccal = fc->caller;
++    --depth;
+-    /* The a: variables typevals were not allocated, only free the allocated
+-     * variables. */
+-    vars_clear_ext(&fc.l_avars.dv_hashtab, FALSE);
++    /* If the a:000 list and the l: and a: dicts are not referenced we can
++     * free the funccall_T and what's in it. */
++    if (fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT
++          && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT
++          && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT)
++    {
++      free_funccal(fc, FALSE);
++    }
++    else
++    {
++      hashitem_T      *hi;
++      listitem_T      *li;
++      int             todo;
+-    vars_clear(&fc.l_vars.dv_hashtab);                /* free all l: variables */
+-    --depth;
++      /* "fc" is still in use.  This can happen when returning "a:000" or
++       * assigning "l:" to a global variable.
++       * Link "fc" in the list for garbage collection later. */
++      fc->caller = previous_funccal;
++      previous_funccal = fc;
 +
-               /* Need to concatenate the remainder of the previous call and
-                * the bytes of the current call.  Use the end of the
-                * conversion buffer for this. */
-               fromlen = len + ip->bw_restlen;
--              from = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
--              mch_memmove((void *)from, ip->bw_rest, (size_t)ip->bw_restlen);
--              mch_memmove((void *)(from + ip->bw_restlen), buf, (size_t)len);
-+              fp = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
-+              mch_memmove(fp, ip->bw_rest, (size_t)ip->bw_restlen);
-+              mch_memmove(fp + ip->bw_restlen, buf, (size_t)len);
-+              from = fp;
-               tolen = ip->bw_conv_buflen - fromlen;
-           }
-           else
-           {
-               from = (const char *)buf;
-@@ -5330,10 +5432,11 @@ buf_write_bytes(ip)
++      /* Make a copy of the a: variables, since we didn't do that above. */
++      todo = (int)fc->l_avars.dv_hashtab.ht_used;
++      for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi)
++      {
++          if (!HASHITEM_EMPTY(hi))
++          {
++              --todo;
++              v = HI2DI(hi);
++              copy_tv(&v->di_tv, &v->di_tv);
++          }
++      }
++
++      /* Make a copy of the a:000 items, since we didn't do that above. */
++      for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
++          copy_tv(&li->li_tv, &li->li_tv);
++    }
++}
++
++/*
++ * Return TRUE if items in "fc" do not have "copyID".  That means they are not
++ * referenced from anywhere that is in use.
++ */
++    static int
++can_free_funccal(fc, copyID)
++    funccall_T        *fc;
++    int               copyID;
++{
++    return (fc->l_varlist.lv_copyID != copyID
++          && fc->l_vars.dv_copyID != copyID
++          && fc->l_avars.dv_copyID != copyID);
++}
++
++/*
++ * Free "fc" and what it contains.
++ */
++   static void
++free_funccal(fc, free_val)
++    funccall_T        *fc;
++    int               free_val;  /* a: vars were allocated */
++{
++    listitem_T        *li;
++
++    /* The a: variables typevals may not have been allocated, only free the
++     * allocated variables. */
++    vars_clear_ext(&fc->l_avars.dv_hashtab, free_val);
++
++    /* free all l: variables */
++    vars_clear(&fc->l_vars.dv_hashtab);
++
++    /* Free the a:000 variables if they were allocated. */
++    if (free_val)
++      for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
++          clear_tv(&li->li_tv);
++
++    vim_free(fc);
  }
  
- #ifdef FEAT_MBYTE
  /*
-  * Convert a Unicode character to bytes.
-+ * Return TRUE for an error, FALSE when it's OK.
+  * Add a number variable "name" to dict "dp" with value "nr".
   */
-     static int
- ucs2bytes(c, pp, flags)
-     unsigned  c;              /* in: character */
-     char_u    **pp;           /* in/out: pointer to result */
-@@ -5413,24 +5516,41 @@ ucs2bytes(c, pp, flags)
-     *pp = p;
-     return error;
- }
+@@ -21510,16 +21681,15 @@ get_return_cmd(rettv)
  /*
-- * Return TRUE if "a" and "b" are the same 'encoding'.
-- * Ignores difference between "ansi" and "latin1", "ucs-4" and "ucs-4be", etc.
-+ * Return TRUE if file encoding "fenc" requires conversion from or to
-+ * 'encoding'.
+  * Get next function line.
+  * Called by do_cmdline() to get the next line.
+  * Returns allocated string, or NULL for end of function.
   */
-     static int
--same_encoding(a, b)
--    char_u    *a;
--    char_u    *b;
-+need_conversion(fenc)
-+    char_u    *fenc;
+-/* ARGSUSED */
+     char_u *
+ get_func_line(c, cookie, indent)
+-    int           c;              /* not used */
++    int           c UNUSED;
+     void    *cookie;
+-    int           indent;         /* not used */
++    int           indent UNUSED;
  {
--    int               f;
-+    int               same_encoding;
-+    int               enc_flags;
-+    int               fenc_flags;
+     funccall_T        *fcp = (funccall_T *)cookie;
+     ufunc_T   *fp = fcp->func;
+     char_u    *retval;
+     garray_T  *gap;  /* growarray with function lines */
+@@ -21884,10 +22054,65 @@ last_set_msg(scriptID)
+           verbose_leave();
+       }
+     }
+ }
  
--    if (STRCMP(a, b) == 0)
--      return TRUE;
--    f = get_fio_flags(a);
--    return (f != 0 && get_fio_flags(b) == f);
-+    if (*fenc == NUL || STRCMP(p_enc, fenc) == 0)
-+      same_encoding = TRUE;
++/*
++ * List v:oldfiles in a nice way.
++ */
++    void
++ex_oldfiles(eap)
++    exarg_T   *eap UNUSED;
++{
++    list_T    *l = vimvars[VV_OLDFILES].vv_list;
++    listitem_T        *li;
++    int               nr = 0;
++
++    if (l == NULL)
++      msg((char_u *)_("No old files"));
 +    else
 +    {
-+      /* Ignore difference between "ansi" and "latin1", "ucs-4" and
-+       * "ucs-4be", etc. */
-+      enc_flags = get_fio_flags(p_enc);
-+      fenc_flags = get_fio_flags(fenc);
-+      same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
-+    }
-+    if (same_encoding)
-+    {
-+      /* Specified encoding matches with 'encoding'.  This requires
-+       * conversion when 'encoding' is Unicode but not UTF-8. */
-+      return enc_unicode != 0;
-+    }
-+
-+    /* Encodings differ.  However, conversion is not needed when 'enc' is any
-+     * Unicode encoding and the file is UTF-8. */
-+    return !(enc_utf8 && fenc_flags == FIO_UTF8);
- }
- /*
-  * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the
-  * internal conversion.
-@@ -5548,13 +5668,14 @@ check_for_bom(p, size, lenp, flags)
-           && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L)))
-       {
-           name = "ucs-4le";   /* FF FE 00 00 */
-           len = 4;
-       }
--      else if (flags == FIO_ALL || flags == (FIO_UCS2 | FIO_ENDIAN_L))
-+      else if (flags == (FIO_UCS2 | FIO_ENDIAN_L))
-           name = "ucs-2le";   /* FF FE */
--      else if (flags == (FIO_UTF16 | FIO_ENDIAN_L))
-+      else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L))
-+          /* utf-16le is preferred, it also works for ucs-2le text */
-           name = "utf-16le";  /* FF FE */
-     }
-     else if (p[0] == 0xfe && p[1] == 0xff
-           && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16))
-     {
-@@ -5915,11 +6036,11 @@ buf_modname(shortname, fname, ext, prepe
-       else if (*ext == '/' || *ext == '_')
- #else
-       else if (*ext == '.')
- #endif
-       {
--          if (s - ptr > (size_t)8)
-+          if ((size_t)(s - ptr) > (size_t)8)
-           {
-               s = ptr + 8;
-               *s = '\0';
-           }
-       }
-@@ -6029,13 +6150,13 @@ vim_fgets(buf, size, fp)
-       /* Now throw away the rest of the line: */
-       do
-       {
-           tbuf[FGETS_SIZE - 2] = NUL;
- #ifdef USE_CR
--          fgets_cr((char *)tbuf, FGETS_SIZE, fp);
-+          ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp);
- #else
--          fgets((char *)tbuf, FGETS_SIZE, fp);
-+          ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
- #endif
-       } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
-     }
-     return (eof == NULL);
- }
-@@ -6105,23 +6226,84 @@ vim_rename(from, to)
-     struct stat       st;
-     long      perm;
- #ifdef HAVE_ACL
-     vim_acl_T acl;            /* ACL from original file */
- #endif
-+#if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
-+    int               use_tmp_file = FALSE;
-+#endif
-     /*
--     * When the names are identical, there is nothing to do.
-+     * When the names are identical, there is nothing to do.  When they refer
-+     * to the same file (ignoring case and slash/backslash differences) but
-+     * the file name differs we need to go through a temp file.
-      */
-     if (fnamecmp(from, to) == 0)
--      return 0;
-+    {
-+#ifdef CASE_INSENSITIVE_FILENAME
-+      if (STRCMP(gettail(from), gettail(to)) != 0)
-+          use_tmp_file = TRUE;
-+      else
-+#endif
-+          return 0;
-+    }
-     /*
-      * Fail if the "from" file doesn't exist.  Avoids that "to" is deleted.
-      */
-     if (mch_stat((char *)from, &st) < 0)
-       return -1;
-+#ifdef UNIX
-+    {
-+      struct stat     st_to;
-+
-+      /* It's possible for the source and destination to be the same file.
-+       * This happens when "from" and "to" differ in case and are on a FAT32
-+       * filesystem.  In that case go through a temp file name. */
-+      if (mch_stat((char *)to, &st_to) >= 0
-+              && st.st_dev == st_to.st_dev
-+              && st.st_ino == st_to.st_ino)
-+          use_tmp_file = TRUE;
-+    }
-+#endif
-+
-+#if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
-+    if (use_tmp_file)
-+    {
-+      char    tempname[MAXPATHL + 1];
++      msg_start();
++      msg_scroll = TRUE;
++      for (li = l->lv_first; li != NULL && !got_int; li = li->li_next)
++      {
++          msg_outnum((long)++nr);
++          MSG_PUTS(": ");
++          msg_outtrans(get_tv_string(&li->li_tv));
++          msg_putchar('\n');
++          out_flush();            /* output one line at a time */
++          ui_breakcheck();
++      }
++      /* Assume "got_int" was set to truncate the listing. */
++      got_int = FALSE;
 +
-+      /*
-+       * Find a name that doesn't exist and is in the same directory.
-+       * Rename "from" to "tempname" and then rename "tempname" to "to".
-+       */
-+      if (STRLEN(from) >= MAXPATHL - 5)
-+          return -1;
-+      STRCPY(tempname, from);
-+      for (n = 123; n < 99999; ++n)
++#ifdef FEAT_BROWSE_CMD
++      if (cmdmod.browse)
 +      {
-+          sprintf((char *)gettail((char_u *)tempname), "%d", n);
-+          if (mch_stat(tempname, &st) < 0)
++          quit_more = FALSE;
++          nr = prompt_for_number(FALSE);
++          msg_starthere();
++          if (nr > 0)
 +          {
-+              if (mch_rename((char *)from, tempname) == 0)
++              char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES),
++                                                                  (long)nr);
++
++              if (p != NULL)
 +              {
-+                  if (mch_rename(tempname, (char *)to) == 0)
-+                      return 0;
-+                  /* Strange, the second step failed.  Try moving the
-+                   * file back and return failure. */
-+                  mch_rename(tempname, (char *)from);
-+                  return -1;
++                  p = expand_env_save(p);
++                  eap->arg = p;
++                  eap->cmdidx = CMD_edit;
++                  cmdmod.browse = FALSE;
++                  do_exedit(eap, NULL);
++                  vim_free(p);
 +              }
-+              /* If it fails for one temp name it will most likely fail
-+               * for any temp name, give up. */
-+              return -1;
 +          }
 +      }
-+      return -1;
-+    }
 +#endif
++    }
++}
 +
-     /*
-      * Delete the "to" file, this is required on some systems to make the
-      * mch_rename() work, on other systems it makes sure that we don't have
-      * two files when the mch_rename() fails.
-      */
-@@ -6258,11 +6440,11 @@ check_timestamps(focus)
-       return FALSE;
-     }
+ #endif /* FEAT_EVAL */
  
-     if (!stuff_empty() || global_busy || !typebuf_typed()
- #ifdef FEAT_AUTOCMD
--                      || autocmd_busy || curbuf_lock > 0
-+                      || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
+ #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO)
+--- vim72.orig/src/ex_cmds.c
++++ vim72/src/ex_cmds.c
+@@ -22,11 +22,11 @@
+ static int linelen __ARGS((int *has_tab));
  #endif
-                                       )
-       need_check_timestamps = TRUE;           /* check later */
-     else
-     {
-@@ -6351,15 +6533,14 @@ move_lines(frombuf, tobuf)
-  * Also check if the file for a new buffer unexpectedly appeared.
-  * return 1 if a changed buffer was found.
-  * return 2 if a message has been displayed.
-  * return 0 otherwise.
+ static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out));
+ #ifdef FEAT_VIMINFO
+ static char_u *viminfo_filename __ARGS((char_u        *));
+-static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read));
++static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags));
+ static int viminfo_encoding __ARGS((vir_T *virp));
+ static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing));
+ #endif
+ static int check_overwrite __ARGS((exarg_T *eap, buf_T *buf, char_u *fname, char_u *ffname, int other));
+@@ -41,16 +41,16 @@ static int
+       help_compare __ARGS((const void *s1, const void *s2));
+ /*
+  * ":ascii" and "ga".
   */
 -/*ARGSUSED*/
-     int
- buf_check_timestamp(buf, focus)
-     buf_T     *buf;
--    int               focus;          /* called for GUI focus event */
-+    int               focus UNUSED;   /* called for GUI focus event */
+     void
+ do_ascii(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
-     struct stat       st;
-     int               stat_res;
-     int               retval = 0;
-     char_u    *path;
-@@ -6460,12 +6641,14 @@ buf_check_timestamp(buf, focus)
-           busy = TRUE;
- # ifdef FEAT_EVAL
-           set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
-           set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
- # endif
-+          ++allbuf_lock;
-           n = apply_autocmds(EVENT_FILECHANGEDSHELL,
-                                     buf->b_fname, buf->b_fname, FALSE, buf);
-+          --allbuf_lock;
-           busy = FALSE;
-           if (n)
-           {
-               if (!buf_valid(buf))
-                   EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
-@@ -6509,11 +6692,14 @@ buf_check_timestamp(buf, focus)
-                   else if (*reason == 'm')
-                   {
-                       mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
-                       mesg2 = _("See \":help W16\" for more info.");
-                   }
--                  /* Else: only timestamp changed, ignored */
-+                  else
-+                      /* Only timestamp changed, store it to avoid a warning
-+                       * in check_mtime() later. */
-+                      buf->b_mtime_read = buf->b_mtime;
-               }
-           }
+     int               c;
++    int               cval;
+     char      buf1[20];
+     char      buf2[20];
+     char_u    buf3[7];
+ #ifdef FEAT_MBYTE
+     int               cc[MAX_MCO];
+@@ -73,30 +73,35 @@ do_ascii(eap)
+     if (!has_mbyte || (enc_dbcs != 0 && c < 0x100) || c < 0x80)
+ #endif
+     {
+       if (c == NL)        /* NUL is stored as NL */
+           c = NUL;
++      if (c == CAR && get_fileformat(curbuf) == EOL_MAC)
++          cval = NL;      /* NL is stored as CR */
++      else
++          cval = c;
+       if (vim_isprintc_strict(c) && (c < ' '
+ #ifndef EBCDIC
+                   || c > '~'
+ #endif
+                              ))
+       {
+           transchar_nonprint(buf3, c);
+-          sprintf(buf1, "  <%s>", (char *)buf3);
++          vim_snprintf(buf1, sizeof(buf1), "  <%s>", (char *)buf3);
        }
-     }
-@@ -6536,10 +6722,15 @@ buf_check_timestamp(buf, focus)
-           if (!helpmesg)
-               mesg2 = "";
-           tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg)
-                                                       + STRLEN(mesg2) + 2));
-           sprintf((char *)tbuf, mesg, path);
-+#ifdef FEAT_EVAL
-+          /* Set warningmsg here, before the unimportant and output-specific
-+           * mesg2 has been appended. */
-+          set_vim_var_string(VV_WARNINGMSG, tbuf, -1);
-+#endif
- #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
-           if (can_reload)
-           {
-               if (*mesg2 != NUL)
-               {
-@@ -6730,14 +6921,15 @@ buf_reload(buf, orig_mode)
- #ifdef FEAT_AUTOCMD
-       keep_filetype = FALSE;
+       else
+           buf1[0] = NUL;
+ #ifndef EBCDIC
+       if (c >= 0x80)
+-          sprintf(buf2, "  <M-%s>", transchar(c & 0x7f));
++          vim_snprintf(buf2, sizeof(buf2), "  <M-%s>",
++                                               (char *)transchar(c & 0x7f));
+       else
  #endif
- #ifdef FEAT_FOLDING
+           buf2[0] = NUL;
+       vim_snprintf((char *)IObuff, IOSIZE,
+               _("<%s>%s%s  %d,  Hex %02x,  Octal %03o"),
+-                                         transchar(c), buf1, buf2, c, c, c);
++                                transchar(c), buf1, buf2, cval, cval, cval);
+ #ifdef FEAT_MBYTE
+       if (enc_utf8)
+           c = cc[ci++];
+       else
+           c = 0;
+@@ -351,11 +356,11 @@ ex_sort(eap)
+     regmatch_T        regmatch;
+     int               len;
+     linenr_T  lnum;
+     long      maxlen = 0;
+     sorti_T   *nrs;
+-    size_t    count = eap->line2 - eap->line1 + 1;
++    size_t    count = (size_t)(eap->line2 - eap->line1 + 1);
+     size_t    i;
+     char_u    *p;
+     char_u    *s;
+     char_u    *s2;
+     char_u    c;                      /* temporary character storage */
+@@ -950,11 +955,11 @@ do_bang(addr_count, eap, forceit, do_in,
+               vim_free(newcmd);
+               return;
+           }
+           len += (int)STRLEN(prevcmd);
+       }
+-      if ((t = alloc(len)) == NULL)
++      if ((t = alloc((unsigned)len)) == NULL)
        {
--          win_T *wp;
-+          win_T       *wp;
-+          tabpage_T   *tp;
-           /* Update folds unless they are defined manually. */
--          FOR_ALL_WINDOWS(wp)
-+          FOR_ALL_TAB_WINDOWS(tp, wp)
-               if (wp->w_buffer == curwin->w_buffer
-                       && !foldmethodIsManual(wp))
-                   foldUpdateAll(wp);
+           vim_free(newcmd);
+           return;
+       }
+       *t = NUL;
+@@ -1541,11 +1546,11 @@ make_filter_cmd(cmd, itmp, otmp)
+     /*
+      * Put braces around the command (for concatenated commands) when
+      * redirecting input and/or output.
+      */
+     if (itmp != NULL || otmp != NULL)
+-      sprintf((char *)buf, "(%s)", (char *)cmd);
++      vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
+     else
+       STRCPY(buf, cmd);
+     if (itmp != NULL)
+     {
+       STRCAT(buf, " < ");
+@@ -1590,41 +1595,45 @@ make_filter_cmd(cmd, itmp, otmp)
+           }
        }
+     }
  #endif
-@@ -6751,16 +6943,15 @@ buf_reload(buf, orig_mode)
-     /* restore curwin/curbuf and a few other things */
-     aucmd_restbuf(&aco);
-     /* Careful: autocommands may have made "buf" invalid! */
+     if (otmp != NULL)
+-      append_redir(buf, p_srr, otmp);
++      append_redir(buf, (int)len, p_srr, otmp);
+     return buf;
  }
  
--/*ARGSUSED*/
+ /*
+- * Append output redirection for file "fname" to the end of string buffer "buf"
++ * Append output redirection for file "fname" to the end of string buffer
++ * "buf[buflen]"
+  * Works with the 'shellredir' and 'shellpipe' options.
+  * The caller should make sure that there is enough room:
+  *    STRLEN(opt) + STRLEN(fname) + 3
+  */
      void
- buf_store_time(buf, st, fname)
-     buf_T     *buf;
-     struct stat       *st;
--    char_u    *fname;
-+    char_u    *fname UNUSED;
+-append_redir(buf, opt, fname)
++append_redir(buf, buflen, opt, fname)
+     char_u    *buf;
++    int               buflen;
+     char_u    *opt;
+     char_u    *fname;
  {
-     buf->b_mtime = (long)st->st_mtime;
-     buf->b_orig_size = (size_t)st->st_size;
- #ifdef HAVE_ST_MODE
-     buf->b_orig_mode = (int)st->st_mode;
-@@ -6811,34 +7002,60 @@ vim_deltempdir()
-       vim_tempdir = NULL;
+     char_u    *p;
++    char_u    *end;
+-    buf += STRLEN(buf);
++    end = buf + STRLEN(buf);
+     /* find "%s", skipping "%%" */
+     for (p = opt; (p = vim_strchr(p, '%')) != NULL; ++p)
+       if (p[1] == 's')
+           break;
+     if (p != NULL)
+     {
+-      *buf = ' '; /* not really needed? Not with sh, ksh or bash */
+-      sprintf((char *)buf + 1, (char *)opt, (char *)fname);
++      *end = ' '; /* not really needed? Not with sh, ksh or bash */
++      vim_snprintf((char *)end + 1, (size_t)(buflen - (end + 1 - buf)),
++                                                (char *)opt, (char *)fname);
      }
+     else
+-      sprintf((char *)buf,
++      vim_snprintf((char *)end, (size_t)(buflen - (end - buf)),
+ #ifdef FEAT_QUICKFIX
+ # ifndef RISCOS
+               opt != p_sp ? " %s%s" :
+ # endif
+               " %s %s",
+@@ -1674,50 +1683,48 @@ viminfo_error(errnum, message, line)
+     return FALSE;
  }
- #endif
  
-+#ifdef TEMPDIRNAMES
-+/*
-+ * Directory "tempdir" was created.  Expand this name to a full path and put
-+ * it in "vim_tempdir".  This avoids that using ":cd" would confuse us.
-+ * "tempdir" must be no longer than MAXPATHL.
-+ */
-+    static void
-+vim_settempdir(tempdir)
-+    char_u    *tempdir;
-+{
-+    char_u    *buf;
-+
-+    buf = alloc((unsigned)MAXPATHL + 2);
-+    if (buf != NULL)
-+    {
-+      if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL)
-+          STRCPY(buf, tempdir);
-+# ifdef __EMX__
-+      if (vim_strchr(buf, '/') != NULL)
-+          STRCAT(buf, "/");
-+      else
-+# endif
-+          add_pathsep(buf);
-+      vim_tempdir = vim_strsave(buf);
-+      vim_free(buf);
-+    }
-+}
-+#endif
-+
  /*
-  * vim_tempname(): Return a unique name that can be used for a temp file.
-  *
-  * The temp file is NOT created.
-  *
-  * The returned pointer is to allocated memory.
-  * The returned pointer is NULL if no valid name was found.
+  * read_viminfo() -- Read the viminfo file.  Registers etc. which are already
+- * set are not over-written unless force is TRUE. -- webb
++ * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb
   */
--/*ARGSUSED*/
-     char_u  *
- vim_tempname(extra_char)
--    int           extra_char;     /* character to use in the name instead of '?' */
-+    int           extra_char UNUSED;  /* char to use in the name instead of '?' */
+     int
+-read_viminfo(file, want_info, want_marks, forceit)
+-    char_u    *file;
+-    int               want_info;
+-    int               want_marks;
+-    int               forceit;
++read_viminfo(file, flags)
++    char_u    *file;      /* file name or NULL to use default name */
++    int               flags;      /* VIF_WANT_INFO et al. */
  {
- #ifdef USE_TMPNAM
-     char_u    itmp[L_tmpnam]; /* use tmpnam() */
- #else
-     char_u    itmp[TEMPNAMELEN];
- #endif
+     FILE      *fp;
+     char_u    *fname;
  
- #ifdef TEMPDIRNAMES
-     static char       *(tempdirs[]) = {TEMPDIRNAMES};
-     int               i;
--    long      nr;
--    long      off;
- # ifndef EEXIST
-     struct stat       st;
- # endif
+     if (no_viminfo())
+       return FAIL;
  
-     /*
-@@ -6851,12 +7068,18 @@ vim_tempname(extra_char)
-     if (vim_tempdir == NULL)
+-    fname = viminfo_filename(file);       /* may set to default if NULL */
++    fname = viminfo_filename(file);   /* get file name in allocated buffer */
+     if (fname == NULL)
+       return FAIL;
+     fp = mch_fopen((char *)fname, READBIN);
+     if (p_verbose > 0)
      {
-       /*
-        * Try the entries in TEMPDIRNAMES to create the temp directory.
-        */
--      for (i = 0; i < sizeof(tempdirs) / sizeof(char *); ++i)
-+      for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i)
-       {
-+# ifndef HAVE_MKDTEMP
-+          size_t      itmplen;
-+          long        nr;
-+          long        off;
-+# endif
-+
-           /* expand $TMP, leave room for "/v1100000/999999999" */
-           expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20);
-           if (mch_isdir(itmp))                /* directory exists */
-           {
- # ifdef __EMX__
-@@ -6867,74 +7090,63 @@ vim_tempname(extra_char)
-                   STRCAT(itmp, "/");
-               else
- # endif
-                   add_pathsep(itmp);
+       verbose_enter();
+       smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
+               fname,
+-              want_info ? _(" info") : "",
+-              want_marks ? _(" marks") : "",
++              (flags & VIF_WANT_INFO) ? _(" info") : "",
++              (flags & VIF_WANT_MARKS) ? _(" marks") : "",
++              (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "",
+               fp == NULL ? _(" FAILED") : "");
+       verbose_leave();
+     }
  
-+# ifdef HAVE_MKDTEMP
-+              /* Leave room for filename */
-+              STRCAT(itmp, "vXXXXXX");
-+              if (mkdtemp((char *)itmp) != NULL)
-+                  vim_settempdir(itmp);
-+# else
-               /* Get an arbitrary number of up to 6 digits.  When it's
-                * unlikely that it already exists it will be faster,
-                * otherwise it doesn't matter.  The use of mkdir() avoids any
-                * security problems because of the predictable number. */
-               nr = (mch_get_pid() + (long)time(NULL)) % 1000000L;
-+              itmplen = STRLEN(itmp);
+     vim_free(fname);
+     if (fp == NULL)
+       return FAIL;
  
-               /* Try up to 10000 different values until we find a name that
-                * doesn't exist. */
-               for (off = 0; off < 10000L; ++off)
-               {
-                   int         r;
--#if defined(UNIX) || defined(VMS)
-+#  if defined(UNIX) || defined(VMS)
-                   mode_t      umask_save;
--#endif
-+#  endif
+     viminfo_errcnt = 0;
+-    do_viminfo(fp, NULL, want_info, want_marks, forceit);
++    do_viminfo(fp, NULL, flags);
  
--                  sprintf((char *)itmp + STRLEN(itmp), "v%ld", nr + off);
--# ifndef EEXIST
-+                  sprintf((char *)itmp + itmplen, "v%ld", nr + off);
-+#  ifndef EEXIST
-                   /* If mkdir() does not set errno to EEXIST, check for
-                    * existing file here.  There is a race condition then,
-                    * although it's fail-safe. */
-                   if (mch_stat((char *)itmp, &st) >= 0)
-                       continue;
--# endif
--#if defined(UNIX) || defined(VMS)
-+#  endif
-+#  if defined(UNIX) || defined(VMS)
-                   /* Make sure the umask doesn't remove the executable bit.
-                    * "repl" has been reported to use "177". */
-                   umask_save = umask(077);
--#endif
-+#  endif
-                   r = vim_mkdir(itmp, 0700);
--#if defined(UNIX) || defined(VMS)
-+#  if defined(UNIX) || defined(VMS)
-                   (void)umask(umask_save);
--#endif
-+#  endif
-                   if (r == 0)
-                   {
--                      char_u  *buf;
+     fclose(fp);
 -
--                      /* Directory was created, use this name.
--                       * Expand to full path; When using the current
--                       * directory a ":cd" would confuse us. */
--                      buf = alloc((unsigned)MAXPATHL + 1);
--                      if (buf != NULL)
--                      {
--                          if (vim_FullName(itmp, buf, MAXPATHL, FALSE)
--                                                                    == FAIL)
--                              STRCPY(buf, itmp);
--# ifdef __EMX__
--                          if (vim_strchr(buf, '/') != NULL)
--                              STRCAT(buf, "/");
--                          else
--# endif
--                              add_pathsep(buf);
--                          vim_tempdir = vim_strsave(buf);
--                          vim_free(buf);
--                      }
-+                      vim_settempdir(itmp);
-                       break;
-                   }
--# ifdef EEXIST
-+#  ifdef EEXIST
-                   /* If the mkdir() didn't fail because the file/dir exists,
-                    * we probably can't create any dir here, try another
-                    * place. */
-                   if (errno != EEXIST)
--# endif
-+#  endif
-                       break;
-               }
-+# endif /* HAVE_MKDTEMP */
-               if (vim_tempdir != NULL)
-                   break;
-           }
-       }
-     }
-@@ -7711,11 +7923,14 @@ au_event_disable(what)
-     if (save_ei != NULL)
-     {
-       new_ei = vim_strnsave(p_ei, (int)(STRLEN(p_ei) + STRLEN(what)));
-       if (new_ei != NULL)
-       {
--          STRCAT(new_ei, what);
-+          if (*what == ',' && *p_ei == NUL)
-+              STRCPY(new_ei, what + 1);
-+          else
-+              STRCAT(new_ei, what);
-           set_string_option_direct((char_u *)"ei", -1, new_ei,
-                                                         OPT_FREE, SID_NONE);
-           vim_free(new_ei);
+     return OK;
+ }
+ /*
+  * write_viminfo() -- Write the viminfo file.  The old one is read in first so
+@@ -1784,11 +1791,11 @@ write_viminfo(file, forceit)
+       /*
+        * For Unix we check the owner of the file.  It's not very nice to
+        * overwrite a user's viminfo file after a "su root", with a
+        * viminfo file that the user can't read.
+        */
+-      st_old.st_dev = 0;
++      st_old.st_dev = (dev_t)0;
+       st_old.st_ino = 0;
+       st_old.st_mode = 0600;
+       if (mch_stat((char *)fname, &st_old) == 0
+               && getuid() != ROOT_UID
+               && !(st_old.st_uid == getuid()
+@@ -1941,11 +1948,11 @@ write_viminfo(file, forceit)
+           /*
+            * Make sure the owner can read/write it.  This only works for
+            * root.
+            */
+           if (fp_out != NULL)
+-              (void)fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
++              ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
+ #endif
        }
      }
-@@ -8243,11 +8458,11 @@ ex_doautoall(eap)
-           /* execute the autocommands for this buffer */
-           retval = do_doautocmd(eap->arg, FALSE);
  
-           /* Execute the modeline settings, but don't set window-local
-            * options if we are using the current window for another buffer. */
--          do_modelines(aco.save_curwin == NULL ? OPT_NOWIN : 0);
-+          do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
+     /*
+@@ -1966,11 +1973,11 @@ write_viminfo(file, forceit)
+       smsg((char_u *)_("Writing viminfo file \"%s\""), fname);
+       verbose_leave();
+     }
  
-           /* restore the current window */
-           aucmd_restbuf(&aco);
+     viminfo_errcnt = 0;
+-    do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);
++    do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS));
  
-           /* stop if there is some error or buffer was deleted */
-@@ -8259,23 +8474,24 @@ ex_doautoall(eap)
-     check_cursor();       /* just in case lines got deleted */
- }
+     fclose(fp_out);       /* errors are ignored !? */
+     if (fp_in != NULL)
+     {
+       fclose(fp_in);
+@@ -2039,16 +2046,14 @@ viminfo_filename(file)
  
  /*
-  * Prepare for executing autocommands for (hidden) buffer "buf".
-- * Search a window for the current buffer.  Save the cursor position and
-- * screen offset.
-+ * Search for a visible window containing the current buffer.  If there isn't
-+ * one then use "aucmd_win".
-  * Set "curbuf" and "curwin" to match "buf".
-  * When FEAT_AUTOCMD is not defined another version is used, see below.
+  * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
   */
-     void
- aucmd_prepbuf(aco, buf)
-     aco_save_T        *aco;           /* structure to save values in */
-     buf_T     *buf;           /* new curbuf */
+     static void
+-do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)
++do_viminfo(fp_in, fp_out, flags)
+     FILE      *fp_in;
+     FILE      *fp_out;
+-    int               want_info;
+-    int               want_marks;
+-    int               force_read;
++    int               flags;
  {
-     win_T     *win;
--
--    aco->new_curbuf = buf;
-+#ifdef FEAT_WINDOWS
-+    int               save_ea;
-+#endif
+     int               count = 0;
+     int               eof = FALSE;
+     vir_T     vir;
  
-     /* Find a window that is for the new buffer */
-     if (buf == curbuf)                /* be quick when buf is curbuf */
-       win = curwin;
-     else
-@@ -8285,46 +8501,71 @@ aucmd_prepbuf(aco, buf)
-               break;
- #else
-       win = NULL;
+@@ -2059,12 +2064,13 @@ do_viminfo(fp_in, fp_out, want_info, wan
+     vir.vir_conv.vc_type = CONV_NONE;
  #endif
  
--    /*
--     * Prefer to use an existing window for the buffer, it has the least side
--     * effects (esp. if "buf" is curbuf).
--     * Otherwise, use curwin for "buf".  It might make some items in the
--     * window invalid.  At least save the cursor and topline.
--     */
-+    /* Allocate "aucmd_win" when needed.  If this fails (out of memory) fall
-+     * back to using the current window. */
-+    if (win == NULL && aucmd_win == NULL)
-+    {
-+      win_alloc_aucmd_win();
-+      if (aucmd_win == NULL)
-+          win = curwin;
-+    }
-+    if (win == NULL && aucmd_win_used)
-+      /* Strange recursive autocommand, fall back to using the current
-+       * window.  Expect a few side effects... */
-+      win = curwin;
-+
-+    aco->save_curwin = curwin;
-+    aco->save_curbuf = curbuf;
-     if (win != NULL)
+     if (fp_in != NULL)
      {
--      /* there is a window for "buf", make it the curwin */
--      aco->save_curwin = curwin;
-+      /* There is a window for "buf" in the current tab page, make it the
-+       * curwin.  This is preferred, it has the least side effects (esp. if
-+       * "buf" is curbuf). */
-+      aco->use_aucmd_win = FALSE;
-       curwin = win;
--      aco->save_buf = win->w_buffer;
--      aco->new_curwin = win;
+-      if (want_info)
+-          eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL);
++      if (flags & VIF_WANT_INFO)
++          eof = read_viminfo_up_to_marks(&vir,
++                                       flags & VIF_FORCEIT, fp_out != NULL);
+       else
+           /* Skip info, find start of marks */
+           while (!(eof = viminfo_readline(&vir))
+                   && vir.vir_line[0] != '>')
+               ;
+@@ -2090,12 +2096,13 @@ do_viminfo(fp_in, fp_out, want_info, wan
+ #endif
+       write_viminfo_filemarks(fp_out);
+       write_viminfo_bufferlist(fp_out);
+       count = write_viminfo_marks(fp_out);
      }
-     else
+-    if (fp_in != NULL && want_marks)
+-      copy_viminfo_marks(&vir, fp_out, count, eof);
++    if (fp_in != NULL
++          && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT)))
++      copy_viminfo_marks(&vir, fp_out, count, eof, flags);
+     vim_free(vir.vir_line);
+ #ifdef FEAT_MBYTE
+     if (vir.vir_conv.vc_type != CONV_NONE)
+       convert_setup(&vir.vir_conv, NULL, NULL);
+@@ -2246,16 +2253,15 @@ viminfo_readline(virp)
+  *
+  * Check for a long line as written by viminfo_writestring().
+  *
+  * Return the string in allocated memory (NULL when out of memory).
+  */
+-/*ARGSUSED*/
+     char_u *
+ viminfo_readstring(virp, off, convert)
+     vir_T     *virp;
+     int               off;                /* offset for virp->vir_line */
+-    int               convert;            /* convert the string */
++    int               convert UNUSED;     /* convert the string */
+ {
+     char_u    *retval;
+     char_u    *s, *d;
+     long      len;
+@@ -2363,14 +2369,13 @@ viminfo_writestring(fd, p)
+  * Implementation of ":fixdel", also used by get_stty().
+  *  <BS>    resulting <Del>
+  *   ^?               ^H
+  * not ^?     ^?
+  */
+-/*ARGSUSED*/
+     void
+ do_fixdel(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     char_u  *p;
+     p = find_termcode((char_u *)"kb");
+     add_termcode((char_u *)"kD", p != NULL
+@@ -2385,11 +2390,12 @@ print_line_no_prefix(lnum, use_number, l
+ {
+     char_u    numbuf[30];
+     if (curwin->w_p_nu || use_number)
      {
--      /* there is no window for "buf", use curwin */
--      aco->save_curwin = NULL;
--      aco->save_buf = curbuf;
--      --curbuf->b_nwindows;
--      curwin->w_buffer = buf;
-+      /* There is no window for "buf", use "aucmd_win".  To minimize the side
-+       * effects, insert it in a the current tab page.
-+       * Anything related to a window (e.g., setting folds) may have
-+       * unexpected results. */
-+      aco->use_aucmd_win = TRUE;
-+      aucmd_win_used = TRUE;
-+      aucmd_win->w_buffer = buf;
-       ++buf->b_nwindows;
-+      win_init_empty(aucmd_win); /* set cursor and topline to safe values */
-+      vim_free(aucmd_win->w_localdir);
-+      aucmd_win->w_localdir = NULL;
-+
-+      /* Make sure w_localdir and globaldir are NULL to avoid a chdir() in
-+       * win_enter_ext(). */
-+      aucmd_win->w_localdir = NULL;
-+      aco->globaldir = globaldir;
-+      globaldir = NULL;
+-      sprintf((char *)numbuf, "%*ld ", number_width(curwin), (long)lnum);
++      vim_snprintf((char *)numbuf, sizeof(numbuf),
++                                 "%*ld ", number_width(curwin), (long)lnum);
+       msg_puts_attr(numbuf, hl_attr(HLF_N));  /* Highlight line nrs */
+     }
+     msg_prt_line(ml_get(lnum), list);
+ }
  
--      /* save cursor and topline, set them to safe values */
--      aco->save_cursor = curwin->w_cursor;
--      curwin->w_cursor.lnum = 1;
--      curwin->w_cursor.col = 0;
--      aco->save_topline = curwin->w_topline;
--      curwin->w_topline = 1;
--#ifdef FEAT_DIFF
--      aco->save_topfill = curwin->w_topfill;
--      curwin->w_topfill = 0;
-+
-+#ifdef FEAT_WINDOWS
-+      /* Split the current window, put the aucmd_win in the upper half.
-+       * We don't want the BufEnter or WinEnter autocommands. */
-+      block_autocmds();
-+      make_snapshot(SNAP_AUCMD_IDX);
-+      save_ea = p_ea;
-+      p_ea = FALSE;
-+      (void)win_split_ins(0, WSP_TOP, aucmd_win, 0);
-+      (void)win_comp_pos();   /* recompute window positions */
-+      p_ea = save_ea;
-+      unblock_autocmds();
- #endif
-+      curwin = aucmd_win;
+@@ -2412,12 +2418,12 @@ print_line(lnum, use_number, list)
+     {
+       msg_putchar('\n');
+       cursor_on();            /* msg_start() switches it off */
+       out_flush();
+       silent_mode = save_silent;
+-      info_message = FALSE;
      }
--
-     curbuf = buf;
-+    aco->new_curwin = curwin;
-+    aco->new_curbuf = curbuf;
++    info_message = FALSE;
  }
  
  /*
-  * Cleanup after executing autocommands for a (hidden) buffer.
-  * Restore the window as it was (if possible).
-@@ -8332,61 +8573,105 @@ aucmd_prepbuf(aco, buf)
+  * ":file[!] [fname]".
   */
-     void
- aucmd_restbuf(aco)
-     aco_save_T        *aco;           /* structure holding saved values */
- {
--    if (aco->save_curwin != NULL)
+@@ -2702,11 +2708,16 @@ do_write(eap)
+       /* After ":saveas fname" reset 'readonly'. */
+       if (eap->cmdidx == CMD_saveas)
+       {
+           if (retval == OK)
++          {
+               curbuf->b_p_ro = FALSE;
 +#ifdef FEAT_WINDOWS
-+    int dummy;
++              redraw_tabline = TRUE;
 +#endif
-+
-+    if (aco->use_aucmd_win)
-+    {
-+      --curbuf->b_nwindows;
-+#ifdef FEAT_WINDOWS
-+      /* Find "aucmd_win", it can't be closed, but it may be in another tab
-+       * page. Do not trigger autocommands here. */
-+      block_autocmds();
-+      if (curwin != aucmd_win)
-+      {
-+          tabpage_T   *tp;
-+          win_T       *wp;
-+
-+          FOR_ALL_TAB_WINDOWS(tp, wp)
-+          {
-+              if (wp == aucmd_win)
-+              {
-+                  if (tp != curtab)
-+                      goto_tabpage_tp(tp);
-+                  win_goto(aucmd_win);
-+                  break;
-+              }
 +          }
-+      }
-+
-+      /* Remove the window and frame from the tree of frames. */
-+      (void)winframe_remove(curwin, &dummy, NULL);
-+      win_remove(curwin, NULL);
-+      aucmd_win_used = FALSE;
-+      last_status(FALSE);         /* may need to remove last status line */
-+      restore_snapshot(SNAP_AUCMD_IDX, FALSE);
-+      (void)win_comp_pos();   /* recompute window positions */
-+      unblock_autocmds();
-+
-+      if (win_valid(aco->save_curwin))
-+          curwin = aco->save_curwin;
-+      else
-+          /* Hmm, original window disappeared.  Just use the first one. */
-+          curwin = firstwin;
-+# ifdef FEAT_EVAL
-+      vars_clear(&aucmd_win->w_vars.dv_hashtab);  /* free all w: variables */
-+      hash_init(&aucmd_win->w_vars.dv_hashtab);   /* re-use the hashtab */
-+# endif
-+#else
-+      curwin = aco->save_curwin;
-+#endif
-+      curbuf = curwin->w_buffer;
-+
-+      vim_free(globaldir);
-+      globaldir = aco->globaldir;
-+
-+      /* the buffer contents may have changed */
-+      check_cursor();
-+      if (curwin->w_topline > curbuf->b_ml.ml_line_count)
-+      {
-+          curwin->w_topline = curbuf->b_ml.ml_line_count;
-+#ifdef FEAT_DIFF
-+          curwin->w_topfill = 0;
-+#endif
-+      }
-+#if defined(FEAT_GUI)
-+      /* Hide the scrollbars from the aucmd_win and update. */
-+      gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE);
-+      gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE);
-+      gui_may_update_scrollbars();
-+#endif
-+    }
-+    else
-     {
-       /* restore curwin */
- #ifdef FEAT_WINDOWS
-       if (win_valid(aco->save_curwin))
- #endif
-       {
--          /* restore the buffer which was previously edited by curwin, if
--           * it's still the same window and it's valid */
-+          /* Restore the buffer which was previously edited by curwin, if
-+           * it was changed, we are still the same window and the buffer is
-+           * valid. */
-           if (curwin == aco->new_curwin
--                  && buf_valid(aco->save_buf)
--                  && aco->save_buf->b_ml.ml_mfp != NULL)
-+                  && curbuf != aco->new_curbuf
-+                  && buf_valid(aco->new_curbuf)
-+                  && aco->new_curbuf->b_ml.ml_mfp != NULL)
-           {
-               --curbuf->b_nwindows;
--              curbuf = aco->save_buf;
-+              curbuf = aco->new_curbuf;
-               curwin->w_buffer = curbuf;
-               ++curbuf->b_nwindows;
-           }
-           curwin = aco->save_curwin;
-           curbuf = curwin->w_buffer;
+           /* Change directories when the 'acd' option is set. */
+           DO_AUTOCHDIR
        }
      }
--    else
--    {
--      /* restore buffer for curwin if it still exists and is loaded */
--      if (buf_valid(aco->save_buf) && aco->save_buf->b_ml.ml_mfp != NULL)
--      {
--          --curbuf->b_nwindows;
--          curbuf = aco->save_buf;
--          curwin->w_buffer = curbuf;
--          ++curbuf->b_nwindows;
--          curwin->w_cursor = aco->save_cursor;
--          check_cursor();
--          /* check topline < line_count, in case lines got deleted */
--          if (aco->save_topline <= curbuf->b_ml.ml_line_count)
--          {
--              curwin->w_topline = aco->save_topline;
--#ifdef FEAT_DIFF
--              curwin->w_topfill = aco->save_topfill;
--#endif
--          }
--          else
--          {
--              curwin->w_topline = curbuf->b_ml.ml_line_count;
--#ifdef FEAT_DIFF
--              curwin->w_topfill = 0;
--#endif
--          }
--      }
--    }
- }
  
- static int    autocmd_nested = FALSE;
+@@ -2722,11 +2733,10 @@ theend:
+  * Check if it is allowed to overwrite a file.  If b_flags has BF_NOTEDITED,
+  * BF_NEW or BF_READERR, check for overwriting current file.
+  * May set eap->forceit if a dialog says it's OK to overwrite.
+  * Return OK if it's OK, FAIL if it is not.
+  */
+-/*ARGSUSED*/
+     static int
+ check_overwrite(eap, buf, fname, ffname, other)
+     exarg_T   *eap;
+     buf_T     *buf;
+     char_u    *fname;     /* file name to be used (can differ from
+@@ -3052,11 +3062,12 @@ getfile(fnum, ffname, sfname, setpm, lnu
+       check_cursor_lnum();
+       beginline(BL_SOL | BL_FIX);
+       retval = 0;     /* it's in the same file */
+     }
+     else if (do_ecmd(fnum, ffname, sfname, NULL, lnum,
+-              (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0)) == OK)
++              (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0),
++              curwin) == OK)
+       retval = -1;    /* opened another file */
+     else
+       retval = 1;     /* error encountered */
  
- /*
-@@ -8521,10 +8806,11 @@ apply_autocmds_group(event, fname, fname
-     buf_T     *old_curbuf;
-     int               retval = FALSE;
-     char_u    *save_sourcing_name;
-     linenr_T  save_sourcing_lnum;
-     char_u    *save_autocmd_fname;
-+    int               save_autocmd_fname_full;
-     int               save_autocmd_bufnr;
-     char_u    *save_autocmd_match;
-     int               save_autocmd_busy;
-     int               save_autocmd_nested;
-     static int        nesting = 0;
-@@ -8599,10 +8885,11 @@ apply_autocmds_group(event, fname, fname
+ theend:
+@@ -3085,21 +3096,25 @@ theend:
+  *       ECMD_HIDE: if TRUE don't free the current buffer
+  *     ECMD_SET_HELP: set b_help flag of (new) buffer before opening file
+  *     ECMD_OLDBUF: use existing buffer if it exists
+  *    ECMD_FORCEIT: ! used for Ex command
+  *     ECMD_ADDBUF: don't edit, just add to buffer list
++ *   oldwin: Should be "curwin" when editing a new buffer in the current
++ *           window, NULL when splitting the window first.  When not NULL info
++ *           of the previous buffer for "oldwin" is stored.
+  *
+  * return FAIL for failure, OK otherwise
+  */
+     int
+-do_ecmd(fnum, ffname, sfname, eap, newlnum, flags)
++do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin)
+     int               fnum;
+     char_u    *ffname;
+     char_u    *sfname;
+     exarg_T   *eap;                   /* can be NULL! */
+     linenr_T  newlnum;
+     int               flags;
++    win_T     *oldwin;
+ {
+     int               other_file;             /* TRUE if editing another file */
+     int               oldbuf;                 /* TRUE if using existing buffer */
+ #ifdef FEAT_AUTOCMD
+     int               auto_buf = FALSE;       /* TRUE if autocommands brought us
+@@ -3267,11 +3282,12 @@ do_ecmd(fnum, ffname, sfname, eap, newln
+       if (!(flags & ECMD_ADDBUF))
+ #endif
+       {
+           if (!cmdmod.keepalt)
+               curwin->w_alt_fnum = curbuf->b_fnum;
+-          buflist_altfpos();
++          if (oldwin != NULL)
++              buflist_altfpos(oldwin);
+       }
  
-     /*
-      * Save the autocmd_* variables and info about the current buffer.
-      */
-     save_autocmd_fname = autocmd_fname;
-+    save_autocmd_fname_full = autocmd_fname_full;
-     save_autocmd_bufnr = autocmd_bufnr;
-     save_autocmd_match = autocmd_match;
-     save_autocmd_busy = autocmd_busy;
-     save_autocmd_nested = autocmd_nested;
-     save_changed = curbuf->b_changed;
-@@ -8616,18 +8903,19 @@ apply_autocmds_group(event, fname, fname
-     if (fname_io == NULL)
-     {
-       if (fname != NULL && *fname != NUL)
-           autocmd_fname = fname;
-       else if (buf != NULL)
--          autocmd_fname = buf->b_fname;
-+          autocmd_fname = buf->b_ffname;
+       if (fnum)
+           buf = buflist_findnr(fnum);
        else
-           autocmd_fname = NULL;
+@@ -3371,11 +3387,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln
+ #endif
+                   buf_copy_options(buf, BCO_ENTER);
+               /* close the link to the current buffer */
+               u_sync(FALSE);
+-              close_buffer(curwin, curbuf,
++              close_buffer(oldwin, curbuf,
+                                     (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD);
+ #ifdef FEAT_AUTOCMD
+ # ifdef FEAT_EVAL
+               if (aborting())     /* autocmds may abort script processing */
+@@ -3699,11 +3715,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln
+ #ifdef FEAT_SPELL
+     /* If the window options were changed may need to set the spell language.
+      * Can only do this after the buffer has been properly setup. */
+     if (did_get_winopts && curwin->w_p_spell && *curbuf->b_p_spl != NUL)
+-      did_set_spelllang(curbuf);
++      (void)did_set_spelllang(curbuf);
+ #endif
+     if (command == NULL)
+     {
+       if (newcol >= 0)        /* position set by autocommands */
+@@ -3772,11 +3788,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln
+     if (command != NULL)
+       do_cmdline(command, NULL, NULL, DOCMD_VERBOSE);
+ #ifdef FEAT_KEYMAP
+     if (curbuf->b_kmap_state & KEYMAP_INIT)
+-      keymap_init();
++      (void)keymap_init();
+ #endif
+     --RedrawingDisabled;
+     if (!skip_redraw)
+     {
+@@ -3995,10 +4011,13 @@ ex_change(eap)
+     {
+       if (curbuf->b_ml.ml_flags & ML_EMPTY)       /* nothing to delete */
+           break;
+       ml_delete(eap->line1, FALSE);
      }
++
++    /* make sure the cursor is not beyond the end of the file now */
++    check_cursor_lnum();
+     deleted_lines_mark(eap->line1, (long)(eap->line2 - lnum));
+     /* ":append" on the line above the deleted lines. */
+     eap->line2 = eap->line1;
+     ex_append(eap);
+@@ -4020,12 +4039,14 @@ ex_z(eap)
+      * 'scroll' */
+     if (eap->forceit)
+       bigness = curwin->w_height;
+     else if (firstwin == lastwin)
+       bigness = curwin->w_p_scr * 2;
++#ifdef FEAT_WINDOWS
      else
-       autocmd_fname = fname_io;
-     if (autocmd_fname != NULL)
--      autocmd_fname = FullName_save(autocmd_fname, FALSE);
-+      autocmd_fname = vim_strsave(autocmd_fname);
-+    autocmd_fname_full = FALSE; /* call FullName_save() later */
+       bigness = curwin->w_height - 3;
++#endif
+     if (bigness < 1)
+       bigness = 1;
  
-     /*
-      * Set the buffer number to be used for <abuf>.
-      */
-     if (buf == NULL)
-@@ -8665,13 +8953,15 @@ apply_autocmds_group(event, fname, fname
-       fname = vim_strsave(fname);     /* make a copy, so we can change it */
+     x = eap->arg;
+     kind = x;
+@@ -4215,17 +4236,19 @@ do_sub(eap)
+     linenr_T  line2;
+     long      nmatch;                 /* number of lines in match */
+     char_u    *sub_firstline;         /* allocated copy of first sub line */
+     int               endcolumn = FALSE;      /* cursor in last column when done */
+     pos_T     old_cursor = curwin->w_cursor;
++    int               start_nsubs;
+     cmd = eap->arg;
+     if (!global_busy)
+     {
+       sub_nsubs = 0;
+       sub_nlines = 0;
      }
++    start_nsubs = sub_nsubs;
+     if (eap->cmdidx == CMD_tilde)
+       which_pat = RE_LAST;    /* use last used regexp */
      else
+       which_pat = RE_SUBST;   /* use last substitute regexp */
+@@ -4470,11 +4493,11 @@ do_sub(eap)
+           char_u      *new_end, *new_start = NULL;
+           unsigned    new_start_len = 0;
+           char_u      *p1;
+           int         did_sub = FALSE;
+           int         lastone;
+-          unsigned    len, needed_len;
++          int         len, copy_len, needed_len;
+           long        nmatch_tl = 0;  /* nr of lines matched below lnum */
+           int         do_again;       /* do it again after joining lines */
+           int         skip_match = FALSE;
+           linenr_T    sub_firstlnum;  /* nr of first sub line */
+@@ -4615,10 +4638,12 @@ do_sub(eap)
+                   goto skip;
+               }
+               if (do_ask)
+               {
++                  int typed = 0;
++
+                   /* change State to CONFIRM, so that the mouse works
+                    * properly */
+                   save_State = State;
+                   State = CONFIRM;
+ #ifdef FEAT_MOUSE
+@@ -4653,11 +4678,11 @@ do_sub(eap)
+                               msg_putchar('^');
+                           resp = getexmodeline('?', NULL, 0);
+                           if (resp != NULL)
+                           {
+-                              i = *resp;
++                              typed = *resp;
+                               vim_free(resp);
+                           }
+                       }
+                       else
+                       {
+@@ -4705,61 +4730,61 @@ do_sub(eap)
+ #ifdef USE_ON_FLY_SCROLL
+                           dont_scroll = FALSE; /* allow scrolling here */
+ #endif
+                           ++no_mapping;       /* don't map this key */
+                           ++allow_keys;       /* allow special keys */
+-                          i = plain_vgetc();
++                          typed = plain_vgetc();
+                           --allow_keys;
+                           --no_mapping;
+                           /* clear the question */
+                           msg_didout = FALSE; /* don't scroll up */
+                           msg_col = 0;
+                           gotocmdline(TRUE);
+                       }
+                       need_wait_return = FALSE; /* no hit-return prompt */
+-                      if (i == 'q' || i == ESC || i == Ctrl_C
++                      if (typed == 'q' || typed == ESC || typed == Ctrl_C
+ #ifdef UNIX
+-                              || i == intr_char
++                              || typed == intr_char
+ #endif
+                               )
+                       {
+                           got_quit = TRUE;
+                           break;
+                       }
+-                      if (i == 'n')
++                      if (typed == 'n')
+                           break;
+-                      if (i == 'y')
++                      if (typed == 'y')
+                           break;
+-                      if (i == 'l')
++                      if (typed == 'l')
+                       {
+                           /* last: replace and then stop */
+                           do_all = FALSE;
+                           line2 = lnum;
+                           break;
+                       }
+-                      if (i == 'a')
++                      if (typed == 'a')
+                       {
+                           do_ask = FALSE;
+                           break;
+                       }
+ #ifdef FEAT_INS_EXPAND
+-                      if (i == Ctrl_E)
++                      if (typed == Ctrl_E)
+                           scrollup_clamp();
+-                      else if (i == Ctrl_Y)
++                      else if (typed == Ctrl_Y)
+                           scrolldown_clamp();
+ #endif
+                   }
+                   State = save_State;
+ #ifdef FEAT_MOUSE
+                   setmouse();
+ #endif
+                   if (vim_strchr(p_cpo, CPO_UNDO) != NULL)
+                       --no_u_sync;
+-                  if (i == 'n')
++                  if (typed == 'n')
+                   {
+                       /* For a multi-line match, put matchcol at the NUL at
+                        * the end of the line and set nmatch to one, so that
+                        * we continue looking for a match on the next line.
+                        * Avoids that ":%s/\nB\@=//gc" and ":%s/\n/,\r/gc"
+@@ -4806,13 +4831,13 @@ do_sub(eap)
+               else
+               {
+                   p1 = ml_get(sub_firstlnum + nmatch - 1);
+                   nmatch_tl += nmatch - 1;
+               }
+-              i = regmatch.startpos[0].col - copycol;
+-              needed_len = i + ((unsigned)STRLEN(p1) - regmatch.endpos[0].col)
+-                                                               + sublen + 1;
++              copy_len = regmatch.startpos[0].col - copycol;
++              needed_len = copy_len + ((unsigned)STRLEN(p1)
++                                     - regmatch.endpos[0].col) + sublen + 1;
+               if (new_start == NULL)
+               {
+                   /*
+                    * Get some space for a temporary buffer to do the
+                    * substitution into (and some extra space to avoid
+@@ -4831,11 +4856,11 @@ do_sub(eap)
+                    * substitution into.  If not, make it larger (with a bit
+                    * extra to avoid too many calls to alloc()/free()).
+                    */
+                   len = (unsigned)STRLEN(new_start);
+                   needed_len += len;
+-                  if (needed_len > new_start_len)
++                  if (needed_len > (int)new_start_len)
+                   {
+                       new_start_len = needed_len + 50;
+                       if ((p1 = alloc_check(new_start_len)) == NULL)
+                       {
+                           vim_free(new_start);
+@@ -4849,12 +4874,12 @@ do_sub(eap)
+               }
+               /*
+                * copy the text up to the part that matched
+                */
+-              mch_memmove(new_end, sub_firstline + copycol, (size_t)i);
+-              new_end += i;
++              mch_memmove(new_end, sub_firstline + copycol, (size_t)copy_len);
++              new_end += copy_len;
+               (void)vim_regsub_multi(&regmatch,
+                                   sub_firstlnum - regmatch.startpos[0].lnum,
+                                          sub, new_end, TRUE, p_magic, TRUE);
+               sub_nsubs++;
+@@ -5057,10 +5082,11 @@ skip:
+               line_breakcheck();
+           }
+           if (did_sub)
+               ++sub_nlines;
++          vim_free(new_start);        /* for when substitute was cancelled */
+           vim_free(sub_firstline);    /* free the copy of the original line */
+           sub_firstline = NULL;
+       }
+       line_breakcheck();
+@@ -5080,11 +5106,11 @@ outofmem:
+     /* ":s/pat//n" doesn't move the cursor */
+     if (do_count)
+       curwin->w_cursor = old_cursor;
+-    if (sub_nsubs)
++    if (sub_nsubs > start_nsubs)
      {
-       sfname = vim_strsave(fname);
--      /* Don't try expanding FileType, Syntax, WindowID or QuickFixCmd* */
-+      /* Don't try expanding FileType, Syntax, FuncUndefined, WindowID or
-+       * QuickFixCmd* */
-       if (event == EVENT_FILETYPE
-               || event == EVENT_SYNTAX
-+              || event == EVENT_FUNCUNDEFINED
-               || event == EVENT_REMOTEREPLY
-               || event == EVENT_SPELLFILEMISSING
-               || event == EVENT_QUICKFIXCMDPRE
-               || event == EVENT_QUICKFIXCMDPOST)
-           fname = vim_strsave(fname);
-@@ -8808,10 +9098,11 @@ apply_autocmds_group(event, fname, fname
-     vim_free(sourcing_name);
-     sourcing_name = save_sourcing_name;
-     sourcing_lnum = save_sourcing_lnum;
-     vim_free(autocmd_fname);
-     autocmd_fname = save_autocmd_fname;
-+    autocmd_fname_full = save_autocmd_fname_full;
-     autocmd_bufnr = save_autocmd_bufnr;
-     autocmd_match = save_autocmd_match;
- #ifdef FEAT_EVAL
-     current_SID = save_current_SID;
-     restore_funccal(save_funccalp);
-@@ -8916,11 +9207,11 @@ auto_next_pat(apc, stop_at_last)
+       /* Set the '[ and '] marks. */
+       curbuf->b_op_start.lnum = eap->line1;
+       curbuf->b_op_end.lnum = line2;
+       curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
+@@ -5210,12 +5236,10 @@ ex_global(eap)
+       type = 'v';
+     else
+       type = *eap->cmd;
+     cmd = eap->arg;
+     which_pat = RE_LAST;          /* default: use last used regexp */
+-    sub_nsubs = 0;
+-    sub_nlines = 0;
  
-     for (ap = apc->curpat; ap != NULL && !got_int; ap = ap->next)
+     /*
+      * undocumented vi feature:
+      *        "\/" and "\?": use previous search pattern.
+      *                 "\&": use previous substitute pattern.
+@@ -5315,10 +5339,12 @@ global_exe(cmd)
+     setpcmark();
+     /* When the command writes a message, don't overwrite the command. */
+     msg_didout = TRUE;
++    sub_nsubs = 0;
++    sub_nlines = 0;
+     global_need_beginline = FALSE;
+     global_busy = 1;
+     old_lcount = curbuf->b_ml.ml_line_count;
+     while (!got_int && (lnum = ml_firstmarked()) != 0 && global_busy == 1)
      {
-       apc->curpat = NULL;
+@@ -5608,11 +5634,17 @@ ex_help(eap)
+            * set b_p_ro flag).
+            * Set the alternate file to the previously edited file.
+            */
+           alt_fnum = curbuf->b_fnum;
+           (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL,
+-                                                 ECMD_HIDE + ECMD_SET_HELP);
++                        ECMD_HIDE + ECMD_SET_HELP,
++#ifdef FEAT_WINDOWS
++                        NULL  /* buffer is still open, don't store info */
++#else
++                        curwin
++#endif
++                  );
+           if (!cmdmod.keepalt)
+               curwin->w_alt_fnum = alt_fnum;
+           empty_fnum = curbuf->b_fnum;
+       }
+     }
+@@ -5767,11 +5799,11 @@ find_help_tags(arg, num_matches, matches
  
--      /* only use a pattern when it has not been removed, has commands and
-+      /* Only use a pattern when it has not been removed, has commands and
-        * the group matches. For buffer-local autocommands only check the
-        * buffer number. */
-       if (ap->pat != NULL && ap->cmds != NULL
-               && (apc->group == AUGROUP_ALL || apc->group == ap->group))
+     /*
+      * Recognize a few exceptions to the rule.        Some strings that contain '*'
+      * with "star".  Otherwise '*' is recognized as a wildcard.
+      */
+-    for (i = sizeof(mtable) / sizeof(char *); --i >= 0; )
++    for (i = (int)(sizeof(mtable) / sizeof(char *)); --i >= 0; )
+       if (STRCMP(arg, mtable[i]) == 0)
        {
-@@ -8965,16 +9256,15 @@ auto_next_pat(apc, stop_at_last)
- /*
-  * Get next autocommand command.
-  * Called by do_cmdline() to get the next line for ":if".
-  * Returns allocated string, or NULL for end of autocommands.
-  */
--/* ARGSUSED */
-     static char_u *
- getnextac(c, cookie, indent)
--    int           c;              /* not used */
-+    int           c UNUSED;
-     void    *cookie;
--    int           indent;         /* not used */
-+    int           indent UNUSED;
- {
-     AutoPatCmd            *acp = (AutoPatCmd *)cookie;
-     char_u        *retval;
-     AutoCmd       *ac;
+           STRCPY(d, rtable[i]);
+           break;
+       }
+@@ -6091,25 +6123,23 @@ fix_help_buffer()
+ }
  
-@@ -9081,14 +9371,13 @@ has_autocmd(event, sfname, buf)
- #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
  /*
-  * Function given to ExpandGeneric() to obtain the list of autocommand group
-  * names.
+  * ":exusage"
   */
 -/*ARGSUSED*/
-     char_u *
- get_augroup_name(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
- {
-     if (idx == augroups.ga_len)               /* add "END" add the end */
-       return (char_u *)"END";
-     if (idx >= augroups.ga_len)               /* end of list */
-@@ -9102,11 +9391,11 @@ static int include_groups = FALSE;
-     char_u  *
- set_context_in_autocmd(xp, arg, doautocmd)
-     expand_T  *xp;
-     char_u    *arg;
--    int               doautocmd;      /* TRUE for :doautocmd, FALSE for :autocmd */
-+    int               doautocmd;      /* TRUE for :doauto*, FALSE for :autocmd */
+     void
+ ex_exusage(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
-     char_u    *p;
-     int               group;
-     /* check for a group name, skip it if present */
-@@ -9150,14 +9439,13 @@ set_context_in_autocmd(xp, arg, doautocm
+     do_cmdline_cmd((char_u *)"help ex-cmd-index");
  }
  
  /*
-  * Function given to ExpandGeneric() to obtain the list of event names.
+  * ":viusage"
   */
 -/*ARGSUSED*/
-     char_u *
- get_event_name(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
+     void
+ ex_viusage(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
-     if (idx < augroups.ga_len)                /* First list group names, if wanted */
-     {
-       if (!include_groups || AUGROUP_NAME(idx) == NULL)
-@@ -9252,30 +9540,26 @@ au_exists(arg)
-      * If there isn't any, return FALSE;
-      * If there is one and no pattern given, return TRUE; */
-     ap = first_autopat[(int)event];
-     if (ap == NULL)
-       goto theend;
--    if (pattern == NULL)
--    {
--      retval = TRUE;
--      goto theend;
--    }
+     do_cmdline_cmd((char_u *)"help normal-index");
+ }
  
-     /* if pattern is "<buffer>", special handling is needed which uses curbuf */
-     /* for pattern "<buffer=N>, fnamecmp() will work fine */
--    if (STRICMP(pattern, "<buffer>") == 0)
-+    if (pattern != NULL && STRICMP(pattern, "<buffer>") == 0)
-       buflocal_buf = curbuf;
+ #if defined(FEAT_EX_EXTRA) || defined(PROTO)
+@@ -6517,26 +6547,15 @@ struct sign
+ };
  
-     /* Check if there is an autocommand with the given pattern. */
-     for ( ; ap != NULL; ap = ap->next)
-       /* only use a pattern when it has not been removed and has commands. */
-       /* For buffer-local autocommands, fnamecmp() works fine. */
-       if (ap->pat != NULL && ap->cmds != NULL
-           && (group == AUGROUP_ALL || ap->group == group)
--          && (buflocal_buf == NULL
--               ? fnamecmp(ap->pat, pattern) == 0
--               : ap->buflocal_nr == buflocal_buf->b_fnum))
-+          && (pattern == NULL
-+              || (buflocal_buf == NULL
-+                  ? fnamecmp(ap->pat, pattern) == 0
-+                  : ap->buflocal_nr == buflocal_buf->b_fnum)))
-       {
-           retval = TRUE;
-           break;
-       }
-@@ -9294,25 +9578,29 @@ theend:
-     void
- aucmd_prepbuf(aco, buf)
-     aco_save_T        *aco;           /* structure to save values in */
-     buf_T     *buf;           /* new curbuf */
- {
--    aco->save_buf = curbuf;
-+    aco->save_curbuf = curbuf;
-+    --curbuf->b_nwindows;
-     curbuf = buf;
-     curwin->w_buffer = buf;
-+    ++curbuf->b_nwindows;
- }
- /*
-  * Restore after executing commands for a (hidden) buffer.
-  * This is the non-autocommand version.
-  */
-     void
- aucmd_restbuf(aco)
-     aco_save_T        *aco;           /* structure holding saved values */
- {
--    curbuf = aco->save_buf;
-+    --curbuf->b_nwindows;
-+    curbuf = aco->save_curbuf;
-     curwin->w_buffer = curbuf;
-+    ++curbuf->b_nwindows;
- }
- #endif        /* FEAT_AUTOCMD */
-@@ -9465,17 +9753,16 @@ match_file_list(list, sfname, ffname)
-  * If FEAT_OSFILETYPE defined then pass initial <type> through unchanged. Eg:
-  * '<html>myfile' becomes '<html>^myfile$' -- leonard.
-  *
-  * Returns NULL when out of memory.
-  */
--/*ARGSUSED*/
-     char_u *
- file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash)
-     char_u    *pat;
-     char_u    *pat_end;       /* first char after pattern or NULL */
-     char      *allow_dirs;    /* Result passed back out in here */
--    int               no_bslash;      /* Don't use a backward slash as pathsep */
-+    int               no_bslash UNUSED; /* Don't use a backward slash as pathsep */
- {
-     int               size;
-     char_u    *endp;
-     char_u    *reg_pat;
-     char_u    *p;
---- vim72.orig/src/globals.h
-+++ vim72/src/globals.h
-@@ -480,12 +480,14 @@ EXTERN char      *foreground_argument INIT(=
- # endif
- /*
-  * While executing external commands or in Ex mode, should not insert GUI
-  * events in the input buffer: Set hold_gui_events to non-zero.
-+ *
-+ * volatile because it is used in signal handler sig_sysmouse().
-  */
--EXTERN int    hold_gui_events INIT(= 0);
-+EXTERN volatile int hold_gui_events INIT(= 0);
- /*
-  * When resizing the shell is postponed, remember the new size, and call
-  * gui_resize_shell() later.
-  */
-@@ -505,10 +507,11 @@ EXTERN VimClipboard clip_plus;   /* CLIPBO
- #  define clip_plus clip_star /* there is only one clipboard */
- # endif
- EXTERN int    clip_unnamed INIT(= FALSE);
- EXTERN int    clip_autoselect INIT(= FALSE);
- EXTERN int    clip_autoselectml INIT(= FALSE);
-+EXTERN int    clip_html INIT(= FALSE);
- EXTERN regprog_T *clip_exclude_prog INIT(= NULL);
- #endif
- /*
-  * All windows are linked in a list. firstwin points to the first entry,
-@@ -520,11 +523,11 @@ EXTERN regprog_T *clip_exclude_prog INIT
- EXTERN win_T  *firstwin;              /* first window */
- EXTERN win_T  *lastwin;               /* last window */
- EXTERN win_T  *prevwin INIT(= NULL);  /* previous window */
- # define W_NEXT(wp) ((wp)->w_next)
- # define FOR_ALL_WINDOWS(wp) for (wp = firstwin; wp != NULL; wp = wp->w_next)
--#define FOR_ALL_TAB_WINDOWS(tp, wp) \
-+# define FOR_ALL_TAB_WINDOWS(tp, wp) \
-     for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next) \
-       for ((wp) = ((tp) == curtab) \
-               ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
- #else
- # define firstwin curwin
-@@ -534,10 +537,15 @@ EXTERN win_T     *prevwin INIT(= NULL);  /* p
- # define FOR_ALL_TAB_WINDOWS(tp, wp) wp = curwin;
- #endif
+ static sign_T *first_sign = NULL;
+ static int    last_sign_typenr = MAX_TYPENR;  /* is decremented */
  
- EXTERN win_T  *curwin;        /* currently active window */
++static int sign_cmd_idx __ARGS((char_u *begin_cmd, char_u *end_cmd));
+ static void sign_list_defined __ARGS((sign_T *sp));
++static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev));
  
-+#ifdef FEAT_AUTOCMD
-+EXTERN win_T  *aucmd_win;     /* window used in aucmd_prepbuf() */
-+EXTERN int    aucmd_win_used INIT(= FALSE);   /* aucmd_win is being used */
-+#endif
+-/*
+- * ":sign" command
+- */
+-    void
+-ex_sign(eap)
+-    exarg_T   *eap;
+-{
+-    char_u    *arg = eap->arg;
+-    char_u    *p;
+-    int               idx;
+-    sign_T    *sp;
+-    sign_T    *sp_prev;
+-    buf_T     *buf;
+-    static char       *cmds[] = {
++static char *cmds[] = {
+                       "define",
+ #define SIGNCMD_DEFINE        0
+                       "undefine",
+ #define SIGNCMD_UNDEFINE 1
+                       "list",
+@@ -6545,26 +6564,55 @@ ex_sign(eap)
+ #define SIGNCMD_PLACE 3
+                       "unplace",
+ #define SIGNCMD_UNPLACE       4
+                       "jump",
+ #define SIGNCMD_JUMP  5
++                      NULL
+ #define SIGNCMD_LAST  6
+-    };
++};
 +
- /*
-  * The window layout is kept in a tree of frames.  topframe points to the top
-  * of the tree.
-  */
- EXTERN frame_T        *topframe;      /* top of the window frame tree */
-@@ -595,11 +603,12 @@ EXTERN int       exiting INIT(= FALSE);
-                                * still keep on running if there is a changed
-                                * buffer. */
- EXTERN int    really_exiting INIT(= FALSE);
-                               /* TRUE when we are sure to exit, e.g., after
-                                * a deadly signal */
--EXTERN int    full_screen INIT(= FALSE);
-+/* volatile because it is used in signal handler deathtrap(). */
-+EXTERN volatile int full_screen INIT(= FALSE);
-                               /* TRUE when doing full-screen output
-                                * otherwise only writing some messages */
- EXTERN int    restricted INIT(= FALSE);
-                               /* TRUE when started as "rvim" */
-@@ -614,10 +623,15 @@ EXTERN int       textlock INIT(= 0);
- #ifdef FEAT_AUTOCMD
- EXTERN int    curbuf_lock INIT(= 0);
-                               /* non-zero when the current buffer can't be
-                                * changed.  Used for FileChangedRO. */
-+EXTERN int    allbuf_lock INIT(= 0);
-+                              /* non-zero when no buffer name can be
-+                               * changed, no buffer can be deleted and
-+                               * current directory can't be changed.
-+                               * Used for SwapExists et al. */
- #endif
- #ifdef FEAT_EVAL
- # define HAVE_SANDBOX
- EXTERN int    sandbox INIT(= 0);
-                               /* Non-zero when evaluating an expression in a
-@@ -708,11 +722,11 @@ EXTERN int       can_si INIT(= FALSE);
- EXTERN int    can_si_back INIT(= FALSE);
- #endif
++/*
++ * Find index of a ":sign" subcmd from its name.
++ * "*end_cmd" must be writable.
++ */
++    static int
++sign_cmd_idx(begin_cmd, end_cmd)
++    char_u    *begin_cmd;     /* begin of sign subcmd */
++    char_u    *end_cmd;       /* just after sign subcmd */
++{
++    int               idx;
++    char      save = *end_cmd;
++
++    *end_cmd = NUL;
++    for (idx = 0; ; ++idx)
++      if (cmds[idx] == NULL || STRCMP(begin_cmd, cmds[idx]) == 0)
++          break;
++    *end_cmd = save;
++    return idx;
++}
++
++/*
++ * ":sign" command
++ */
++    void
++ex_sign(eap)
++    exarg_T   *eap;
++{
++    char_u    *arg = eap->arg;
++    char_u    *p;
++    int               idx;
++    sign_T    *sp;
++    sign_T    *sp_prev;
++    buf_T     *buf;
  
- EXTERN pos_T  saved_cursor            /* w_cursor before formatting text. */
- # ifdef DO_INIT
--      = INIT_POS_T
-+      = INIT_POS_T(0, 0, 0)
- # endif
-       ;
+     /* Parse the subcommand. */
+     p = skiptowhite(arg);
+-    if (*p != NUL)
+-      *p++ = NUL;
+-    for (idx = 0; ; ++idx)
++    idx = sign_cmd_idx(arg, p);
++    if (idx == SIGNCMD_LAST)
+     {
+-      if (idx == SIGNCMD_LAST)
+-      {
+-          EMSG2(_("E160: Unknown sign command: %s"), arg);
+-          return;
+-      }
+-      if (STRCMP(arg, cmds[idx]) == 0)
+-          break;
++      EMSG2(_("E160: Unknown sign command: %s"), arg);
++      return;
+     }
+     arg = skipwhite(p);
  
- /*
-  * Stuff for insert mode.
-@@ -737,14 +751,16 @@ EXTERN JMP_BUF x_jump_env;
-  * Stuff for setjmp() and longjmp().
-  * Used to protect areas where we could crash.
-  */
- EXTERN JMP_BUF lc_jump_env;   /* argument to SETJMP() */
- # ifdef SIGHASARG
--EXTERN int lc_signal;         /* catched signal number, 0 when no was signal
--                                 catched; used for mch_libcall() */
-+/* volatile because it is used in signal handlers. */
-+EXTERN volatile int lc_signal;        /* caught signal number, 0 when no was signal
-+                                 caught; used for mch_libcall() */
- # endif
--EXTERN int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */
-+/* volatile because it is used in signal handler deathtrap(). */
-+EXTERN volatile int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */
- #endif
+     if (idx <= SIGNCMD_LIST)
+     {
+@@ -6726,28 +6774,12 @@ ex_sign(eap)
+               EMSG2(_("E155: Unknown sign: %s"), arg);
+           else if (idx == SIGNCMD_LIST)
+               /* ":sign list {name}" */
+               sign_list_defined(sp);
+           else
+-          {
+               /* ":sign undefine {name}" */
+-              vim_free(sp->sn_name);
+-              vim_free(sp->sn_icon);
+-#ifdef FEAT_SIGN_ICONS
+-              if (sp->sn_image != NULL)
+-              {
+-                  out_flush();
+-                  gui_mch_destroy_sign(sp->sn_image);
+-              }
+-#endif
+-              vim_free(sp->sn_text);
+-              if (sp_prev == NULL)
+-                  first_sign = sp->sn_next;
+-              else
+-                  sp_prev->sn_next = sp->sn_next;
+-              vim_free(sp);
+-          }
++              sign_undefine(sp, sp_prev);
+       }
+     }
+     else
+     {
+       int             id = -1;
+@@ -6992,10 +7024,35 @@ sign_list_defined(sp)
+           msg_puts(p);
+     }
+ }
  
- #if defined(FEAT_MBYTE) || defined(FEAT_POSTSCRIPT)
  /*
-  * These flags are set based upon 'fileencoding'.
-@@ -798,15 +814,18 @@ EXTERN vimconv_T output_conv;                    /* type
-  * (DBCS).
-  * The value is set in mb_init();
-  */
- /* length of char in bytes, including following composing chars */
- EXTERN int (*mb_ptr2len) __ARGS((char_u *p)) INIT(= latin_ptr2len);
-+/* idem, with limit on string length */
-+EXTERN int (*mb_ptr2len_len) __ARGS((char_u *p, int size)) INIT(= latin_ptr2len_len);
- /* byte length of char */
- EXTERN int (*mb_char2len) __ARGS((int c)) INIT(= latin_char2len);
- /* convert char to bytes, return the length */
- EXTERN int (*mb_char2bytes) __ARGS((int c, char_u *buf)) INIT(= latin_char2bytes);
- EXTERN int (*mb_ptr2cells) __ARGS((char_u *p)) INIT(= latin_ptr2cells);
-+EXTERN int (*mb_ptr2cells_len) __ARGS((char_u *p, int size)) INIT(= latin_ptr2cells_len);
- EXTERN int (*mb_char2cells) __ARGS((int c)) INIT(= latin_char2cells);
- EXTERN int (*mb_off2cells) __ARGS((unsigned off, unsigned max_off)) INIT(= latin_off2cells);
- EXTERN int (*mb_ptr2char) __ARGS((char_u *p)) INIT(= latin_ptr2char);
- EXTERN int (*mb_head_off) __ARGS((char_u *base, char_u *p)) INIT(= latin_head_off);
-@@ -948,11 +967,11 @@ EXTERN struct buffheader stuffbuff       /* st
-                   = {{NULL, {NUL}}, NULL, 0, 0}
- #endif
-                   ;
- EXTERN typebuf_T typebuf              /* typeahead buffer */
- #ifdef DO_INIT
--                  = {NULL, NULL}
-+                  = {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}
- #endif
-                   ;
- #ifdef FEAT_EX_EXTRA
- EXTERN int    ex_normal_busy INIT(= 0); /* recursiveness of ex_normal() */
- EXTERN int    ex_normal_lock INIT(= 0); /* forbid use of ex_normal() */
-@@ -984,11 +1003,12 @@ EXTERN char_u   *use_viminfo INIT(= NULL);
- EXTERN FILE   *scriptin[NSCRIPT];         /* streams to read script from */
- EXTERN int    curscript INIT(= 0);        /* index in scriptin[] */
- EXTERN FILE   *scriptout  INIT(= NULL);   /* stream to write script to */
- EXTERN int    read_cmd_fd INIT(= 0);      /* fd to read commands from */
--EXTERN int    got_int INIT(= FALSE);      /* set to TRUE when interrupt
-+/* volatile because it is used in signal handler catch_sigint(). */
-+EXTERN volatile int got_int INIT(= FALSE);    /* set to TRUE when interrupt
-                                               signal occurred */
- #ifdef USE_TERM_CONSOLE
- EXTERN int    term_console INIT(= FALSE); /* set to TRUE when console used */
- #endif
- EXTERN int    termcap_active INIT(= FALSE);   /* set by starttermcap() */
-@@ -1020,16 +1040,17 @@ EXTERN char_u  *repeat_cmdline INIT(= NUL
- #ifdef FEAT_CMDHIST
- EXTERN char_u *new_last_cmdline INIT(= NULL); /* new value for last_cmdline */
- #endif
- #ifdef FEAT_AUTOCMD
- EXTERN char_u *autocmd_fname INIT(= NULL); /* fname for <afile> on cmdline */
-+EXTERN int    autocmd_fname_full;          /* autocmd_fname is full path */
- EXTERN int    autocmd_bufnr INIT(= 0);     /* fnum for <abuf> on cmdline */
- EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */
- EXTERN int    did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */
- EXTERN pos_T  last_cursormoved            /* for CursorMoved event */
- # ifdef DO_INIT
--                      = INIT_POS_T
-+                      = INIT_POS_T(0, 0, 0)
- # endif
-                       ;
- #endif
- EXTERN linenr_T       write_no_eol_lnum INIT(= 0); /* non-zero lnum when last line
-@@ -1337,11 +1358,10 @@ EXTERN garray_T error_ga
-       ;
- #endif
- #ifdef FEAT_NETBEANS_INTG
- EXTERN char *netbeansArg INIT(= NULL);        /* the -nb[:host:port:passwd] arg */
--EXTERN int netbeansCloseFile INIT(= 0);       /* send killed if != 0 */
- EXTERN int netbeansFireChanges INIT(= 1); /* send buffer changes if != 0 */
- EXTERN int netbeansForcedQuit INIT(= 0);/* don't write modified files */
- EXTERN int netbeansReadFile INIT(= 1);        /* OK to read from disk if != 0 */
- EXTERN int netbeansSuppressNoLines INIT(= 0); /* skip "No lines in buffer" */
- EXTERN int usingNetbeans INIT(= 0);   /* set if -nb flag is used */
-@@ -1545,10 +1565,22 @@ EXTERN int xsmp_icefd INIT(= -1);   /* T
- #endif
- /* For undo we need to know the lowest time possible. */
- EXTERN time_t starttime;
-+#ifdef STARTUPTIME
-+EXTERN FILE *time_fd INIT(= NULL);  /* where to write startup timing */
++ * Undefine a sign and free its memory.
++ */
++    static void
++sign_undefine(sp, sp_prev)
++    sign_T    *sp;
++    sign_T    *sp_prev;
++{
++    vim_free(sp->sn_name);
++    vim_free(sp->sn_icon);
++#ifdef FEAT_SIGN_ICONS
++    if (sp->sn_image != NULL)
++    {
++      out_flush();
++      gui_mch_destroy_sign(sp->sn_image);
++    }
 +#endif
++    vim_free(sp->sn_text);
++    if (sp_prev == NULL)
++      first_sign = sp->sn_next;
++    else
++      sp_prev->sn_next = sp->sn_next;
++    vim_free(sp);
++}
 +
 +/*
-+ * Some compilers warn for not using a return value, but in some situations we
-+ * can't do anything useful with the value.  Assign to this variable to avoid
-+ * the warning.
-+ */
-+EXTERN int ignored;
-+EXTERN char *ignoredp;
-+
- /*
-  * Optional Farsi support.  Include it here, so EXTERN and INIT are defined.
+  * Get highlighting attribute for sign "typenr".
+  * If "line" is TRUE: line highl, if FALSE: text highl.
   */
- #ifdef FEAT_FKMAP
- # include "farsi.h"
---- vim72.orig/Filelist
-+++ vim72/Filelist
-@@ -283,10 +283,11 @@ SRC_DOS =        \
-               src/proto/os_msdos.pro \
-               src/proto/os_win16.pro \
-               src/proto/os_win32.pro \
-               src/proto/os_mswin.pro \
-               src/testdir/Make_dos.mak \
-+              src/testdir/Make_ming.mak \
-               src/testdir/dos.vim \
-               src/uninstal.c \
-               src/vim.def \
-               src/vim.rc \
-               src/vimio.h \
-@@ -680,13 +681,11 @@ LANG_GEN = \
-               runtime/spell/README.txt \
-               runtime/spell/??/*.diff \
-               runtime/spell/??/main.aap \
-               runtime/spell/yi/README.txt \
-               runtime/spell/main.aap \
--              runtime/spell/cleanadd.vim \
-               runtime/spell/*.vim \
--              runtime/spell/fixdup \
+     int
+ sign_get_attr(typenr, line)
+@@ -7065,10 +7122,201 @@ sign_typenr2name(typenr)
+       if (sp->sn_typenr == typenr)
+           return sp->sn_name;
+     return (char_u *)_("[Deleted]");
+ }
  
- # generic language files, binary
- LANG_GEN_BIN = \
-               runtime/spell/README_en.txt \
-               runtime/spell/en.ascii.spl \
---- /dev/null
-+++ vim72/src/testdir/Make_ming.mak
-@@ -0,0 +1,93 @@
-+# Makefile to run tests for Vim, on Dos-like machines
-+# with sh.exe or zsh.exe in the path or not.
-+#
-+# Author: Bill McCarthy
-+#
-+# Note that test54 has been removed until it is fixed.
-+#
-+# Requires a set of Unix tools: echo, diff, etc.
++#if defined(EXITFREE) || defined(PROTO)
++/*
++ * Undefine/free all signs.
++ */
++    void
++free_signs()
++{
++    while (first_sign != NULL)
++      sign_undefine(first_sign, NULL);
++}
++#endif
 +
-+ifneq (sh.exe, $(SHELL))
-+DEL = rm -f
-+MV = mv
-+CP = cp
-+DIRSLASH = /
-+else
-+DEL = del
-+MV = rename
-+CP = copy
-+DIRSLASH = \\
-+endif
++#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
++static enum
++{
++    EXP_SUBCMD,               /* expand :sign sub-commands */
++    EXP_DEFINE,               /* expand :sign define {name} args */
++    EXP_PLACE,                /* expand :sign place {id} args */
++    EXP_UNPLACE,      /* expand :sign unplace" */
++    EXP_SIGN_NAMES    /* expand with name of placed signs */
++} expand_what;
 +
-+VIMPROG = ..$(DIRSLASH)vim
++/*
++ * Function given to ExpandGeneric() to obtain the sign command
++ * expansion.
++ */
++    char_u *
++get_sign_name(xp, idx)
++    expand_T  *xp UNUSED;
++    int               idx;
++{
++    sign_T    *sp;
++    int               current_idx;
 +
-+# Omitted:
-+# test2               "\\tmp" doesn't work.
-+# test10      'errorformat' is different
-+# test12      can't unlink a swap file
-+# test25      uses symbolic link
-+# test27      can't edit file with "*" in file name
-+# test31      16 bit version runs out of memory...
-+
-+SCRIPTS16 =   test1.out test19.out test20.out test22.out \
-+              test23.out test24.out test28.out test29.out \
-+              test35.out test36.out test43.out \
-+              test44.out test45.out test46.out test47.out \
-+              test48.out test51.out test53.out            \
-+              test55.out test56.out test57.out test58.out test59.out \
-+              test60.out test61.out test62.out test63.out test64.out
-+
-+# Had to remove test54 which doesn't work yet.
-+#                                              test54.out
-+
-+SCRIPTS =     test3.out test4.out test5.out test6.out test7.out \
-+              test8.out test9.out test11.out test13.out test14.out \
-+              test15.out test17.out test18.out test21.out test26.out \
-+              test30.out test31.out test32.out test33.out test34.out \
-+              test37.out test38.out test39.out test40.out test41.out \
-+              test42.out test52.out test65.out test66.out test67.out \
-+              test68.out test69.out
-+
-+SCRIPTS32 =   test50.out test70.out
++    switch (expand_what)
++    {
++    case EXP_SUBCMD:
++      return (char_u *)cmds[idx];
++    case EXP_DEFINE:
++      {
++          char *define_arg[] =
++          {
++              "icon=", "linehl=", "text=", "texthl=", NULL
++          };
++          return (char_u *)define_arg[idx];
++      }
++    case EXP_PLACE:
++      {
++          char *place_arg[] =
++          {
++              "line=", "name=", "file=", "buffer=", NULL
++          };
++          return (char_u *)place_arg[idx];
++      }
++    case EXP_UNPLACE:
++      {
++          char *unplace_arg[] = { "file=", "buffer=", NULL };
++          return (char_u *)unplace_arg[idx];
++      }
++    case EXP_SIGN_NAMES:
++      /* Complete with name of signs already defined */
++      current_idx = 0;
++      for (sp = first_sign; sp != NULL; sp = sp->sn_next)
++          if (current_idx++ == idx)
++              return sp->sn_name;
++      return NULL;
++    default:
++      return NULL;
++    }
++}
 +
-+SCRIPTS_GUI = test16.out
++/*
++ * Handle command line completion for :sign command.
++ */
++    void
++set_context_in_sign_cmd(xp, arg)
++    expand_T  *xp;
++    char_u    *arg;
++{
++    char_u    *p;
++    char_u    *end_subcmd;
++    char_u    *last;
++    int               cmd_idx;
++    char_u    *begin_subcmd_args;
 +
-+.SUFFIXES: .in .out
++    /* Default: expand subcommands. */
++    xp->xp_context = EXPAND_SIGN;
++    expand_what = EXP_SUBCMD;
++    xp->xp_pattern = arg;
 +
-+vimall:       fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32)
-+      echo ALL DONE
++    end_subcmd = skiptowhite(arg);
++    if (*end_subcmd == NUL)
++      /* expand subcmd name
++       * :sign {subcmd}<CTRL-D>*/
++      return;
 +
-+nongui:       fixff $(SCRIPTS16) $(SCRIPTS)
-+      echo ALL DONE
++    cmd_idx = sign_cmd_idx(arg, end_subcmd);
 +
-+small:
-+      echo ALL DONE
++    /* :sign {subcmd} {subcmd_args}
++     *                |
++     *                begin_subcmd_args */
++    begin_subcmd_args = skipwhite(end_subcmd);
++    p = skiptowhite(begin_subcmd_args);
++    if (*p == NUL)
++    {
++      /*
++       * Expand first argument of subcmd when possible.
++       * For ":jump {id}" and ":unplace {id}", we could
++       * possibly expand the ids of all signs already placed.
++       */
++      xp->xp_pattern = begin_subcmd_args;
++      switch (cmd_idx)
++      {
++          case SIGNCMD_LIST:
++          case SIGNCMD_UNDEFINE:
++              /* :sign list <CTRL-D>
++               * :sign undefine <CTRL-D> */
++              expand_what = EXP_SIGN_NAMES;
++              break;
++          default:
++              xp->xp_context = EXPAND_NOTHING;
++      }
++      return;
++    }
 +
-+gui:  fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI)
-+      echo ALL DONE
++    /* expand last argument of subcmd */
 +
-+win32:        fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS32)
-+      echo ALL DONE
++    /* :sign define {name} {args}...
++     *              |
++     *              p */
 +
-+fixff:
-+      -$(VIMPROG) -u dos.vim --noplugin "+argdo set ff=dos|upd" +q *.in *.ok
++    /* Loop until reaching last argument. */
++    do
++    {
++      p = skipwhite(p);
++      last = p;
++      p = skiptowhite(p);
++    } while (*p != NUL);
 +
-+clean:
-+      -$(DEL) *.out
-+      -$(DEL) test.ok
-+      -$(DEL) small.vim
-+      -$(DEL) tiny.vim
-+      -$(DEL) mbyte.vim
-+      -$(DEL) mzscheme.vim
-+      -$(DEL) X*
-+      -$(DEL) viminfo
++    p = vim_strchr(last, '=');
 +
-+.in.out:
-+      $(CP) $*.ok test.ok
-+      $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in
-+      diff test.out $*.ok
-+      -$(DEL) $*.out
-+      $(MV) test.out $*.out
-+      -$(DEL) X*
-+      -$(DEL) test.ok
-+      -$(DEL) viminfo
---- vim72.orig/src/screen.c
-+++ vim72/src/screen.c
-@@ -130,11 +130,11 @@ static void screen_line __ARGS((int row,
- #endif
- #ifdef FEAT_VERTSPLIT
- static void draw_vsep_win __ARGS((win_T *wp, int row));
- #endif
- #ifdef FEAT_STL_OPT
--static void redraw_custum_statusline __ARGS((win_T *wp));
-+static void redraw_custom_statusline __ARGS((win_T *wp));
++    /* :sign define {name} {args}... {last}=
++     *                               |     |
++     *                            last     p */
++    if (p == NUL)
++    {
++      /* Expand last argument name (before equal sign). */
++      xp->xp_pattern = last;
++      switch (cmd_idx)
++      {
++          case SIGNCMD_DEFINE:
++              expand_what = EXP_DEFINE;
++              break;
++          case SIGNCMD_PLACE:
++              expand_what = EXP_PLACE;
++              break;
++          case SIGNCMD_JUMP:
++          case SIGNCMD_UNPLACE:
++              expand_what = EXP_UNPLACE;
++              break;
++          default:
++              xp->xp_context = EXPAND_NOTHING;
++      }
++    }
++    else
++    {
++      /* Expand last argument value (after equal sign). */
++      xp->xp_pattern = p + 1;
++      switch (cmd_idx)
++      {
++          case SIGNCMD_DEFINE:
++              if (STRNCMP(last, "texthl", p - last) == 0 ||
++                  STRNCMP(last, "linehl", p - last) == 0)
++                  xp->xp_context = EXPAND_HIGHLIGHT;
++              else if (STRNCMP(last, "icon", p - last) == 0)
++                  xp->xp_context = EXPAND_FILES;
++              else
++                  xp->xp_context = EXPAND_NOTHING;
++              break;
++          case SIGNCMD_PLACE:
++              if (STRNCMP(last, "name", p - last) == 0)
++                  expand_what = EXP_SIGN_NAMES;
++              else
++                  xp->xp_context = EXPAND_NOTHING;
++              break;
++          default:
++              xp->xp_context = EXPAND_NOTHING;
++      }
++    }
++}
++#endif
  #endif
- #ifdef FEAT_SEARCH_EXTRA
- #define SEARCH_HL_PRIORITY 0
- static void start_search_hl __ARGS((void));
- static void end_search_hl __ARGS((void));
-@@ -268,15 +268,14 @@ redraw_buf_later(buf, type)
-  * Used when entering/leaving Insert mode with the cursor on a folded line.
-  * Used to remove the "$" from a change command.
-  * Note that when also inserting/deleting lines w_redraw_top and w_redraw_bot
-  * may become invalid and the whole window will have to be redrawn.
+ #if defined(FEAT_GUI) || defined(FEAT_CLIENTSERVER) || defined(PROTO)
+ /*
+  * ":drop"
+--- vim72.orig/src/ex_cmds.h
++++ vim72/src/ex_cmds.h
+@@ -276,11 +276,11 @@ EX(CMD_cpfile,           "cpfile",       ex_cnext,
+ EX(CMD_cquit,         "cquit",        ex_cquit,
+                       TRLBAR|BANG),
+ EX(CMD_crewind,               "crewind",      ex_cc,
+                       RANGE|NOTADR|COUNT|TRLBAR|BANG),
+ EX(CMD_cscope,                "cscope",       do_cscope,
+-                      EXTRA|NOTRLCOM|SBOXOK|XFILE),
++                      EXTRA|NOTRLCOM|XFILE),
+ EX(CMD_cstag,         "cstag",        do_cstag,
+                       BANG|TRLBAR|WORD1),
+ EX(CMD_cunmap,                "cunmap",       ex_unmap,
+                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_cunabbrev,     "cunabbrev",    ex_abbreviate,
+@@ -504,11 +504,11 @@ EX(CMD_lcd,              "lcd",          ex_cd,
+ EX(CMD_lchdir,                "lchdir",       ex_cd,
+                       BANG|FILE1|TRLBAR|CMDWIN),
+ EX(CMD_lclose,                "lclose",       ex_cclose,
+                       RANGE|NOTADR|COUNT|TRLBAR),
+ EX(CMD_lcscope,               "lcscope",      do_cscope,
+-                      EXTRA|NOTRLCOM|SBOXOK|XFILE),
++                      EXTRA|NOTRLCOM|XFILE),
+ EX(CMD_left,          "left",         ex_align,
+                       TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
+ EX(CMD_leftabove,     "leftabove",    ex_wrongmodifier,
+                       NEEDARG|EXTRA|NOTRLCOM),
+ EX(CMD_let,           "let",          ex_let,
+@@ -633,10 +633,12 @@ EX(CMD_nnoremap, "nnoremap",     ex_map,
+                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_nnoremenu,     "nnoremenu",    ex_menu,
+                       RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_noremap,               "noremap",      ex_map,
+                       BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
++EX(CMD_noautocmd,     "noautocmd",    ex_wrongmodifier,
++                      NEEDARG|EXTRA|NOTRLCOM),
+ EX(CMD_nohlsearch,    "nohlsearch",   ex_nohlsearch,
+                       TRLBAR|SBOXOK|CMDWIN),
+ EX(CMD_noreabbrev,    "noreabbrev",   ex_abbreviate,
+                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_noremenu,      "noremenu",     ex_menu,
+@@ -649,10 +651,12 @@ EX(CMD_nunmap,           "nunmap",       ex_unmap,
+                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_nunmenu,               "nunmenu",      ex_menu,
+                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_open,          "open",         ex_open,
+                       RANGE|EXTRA),
++EX(CMD_oldfiles,      "oldfiles",     ex_oldfiles,
++                      BANG|TRLBAR|SBOXOK|CMDWIN),
+ EX(CMD_omap,          "omap",         ex_map,
+                       EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_omapclear,     "omapclear",    ex_mapclear,
+                       EXTRA|TRLBAR|CMDWIN),
+ EX(CMD_omenu,         "omenu",        ex_menu,
+@@ -800,11 +804,11 @@ EX(CMD_sbrewind, "sbrewind",     ex_brewind,
+ EX(CMD_scriptnames,   "scriptnames",  ex_scriptnames,
+                       TRLBAR|CMDWIN),
+ EX(CMD_scriptencoding,        "scriptencoding", ex_scriptencoding,
+                       WORD1|TRLBAR|CMDWIN),
+ EX(CMD_scscope,               "scscope",      do_scscope,
+-                      EXTRA|NOTRLCOM|SBOXOK),
++                      EXTRA|NOTRLCOM),
+ EX(CMD_set,           "set",          ex_set,
+                       TRLBAR|EXTRA|CMDWIN|SBOXOK),
+ EX(CMD_setfiletype,   "setfiletype",  ex_setfiletype,
+                       TRLBAR|EXTRA|NEEDARG|CMDWIN),
+ EX(CMD_setglobal,     "setglobal",    ex_set,
+@@ -985,10 +989,12 @@ EX(CMD_unlockvar,        "unlockvar",    ex_lockva
+                       BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN),
+ EX(CMD_unmap,         "unmap",        ex_unmap,
+                       BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_unmenu,                "unmenu",       ex_menu,
+                       BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
++EX(CMD_unsilent,      "unsilent",     ex_wrongmodifier,
++                      NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+ EX(CMD_update,                "update",       ex_update,
+                       RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR),
+ EX(CMD_vglobal,               "vglobal",      ex_global,
+                       RANGE|WHOLEFOLD|EXTRA|DFLALL|CMDWIN),
+ EX(CMD_version,               "version",      ex_version,
+--- vim72.orig/src/ex_cmds2.c
++++ vim72/src/ex_cmds2.c
+@@ -26,11 +26,12 @@ static void        cmd_source __ARGS((char_u *f
+  * script when going through the list. */
+ typedef struct scriptitem_S
+ {
+     char_u    *sn_name;
+ # ifdef UNIX
+-    int               sn_dev;
++    int               sn_dev_valid;
++    dev_t     sn_dev;
+     ino_t     sn_ino;
+ # endif
+ # ifdef FEAT_PROFILE
+     int               sn_prof_on;     /* TRUE when script is/was profiled */
+     int               sn_pr_force;    /* forceit: profile functions in this script */
+@@ -678,14 +679,13 @@ ex_breakdel(eap)
+ }
+ /*
+  * ":breaklist".
   */
 -/*ARGSUSED*/
      void
- redrawWinline(lnum, invalid)
-     linenr_T  lnum;
--    int               invalid;        /* window line height is invalid now */
-+    int               invalid UNUSED; /* window line height is invalid now */
+ ex_breaklist(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
- #ifdef FEAT_FOLDING
+     struct debuggy *bp;
      int               i;
- #endif
-@@ -322,10 +321,11 @@ update_screen(type)
-     static int        did_intro = FALSE;
- #if defined(FEAT_SEARCH_EXTRA) || defined(FEAT_CLIPBOARD)
-     int               did_one;
- #endif
-+    /* Don't do anything if the screen structures are (not yet) valid. */
-     if (!screen_valid(TRUE))
-       return;
  
-     if (must_redraw)
+     if (dbg_breakp.ga_len == 0)
+@@ -1090,11 +1090,11 @@ ex_profile(eap)
+       do_profiling = PROF_YES;
+       profile_zero(&prof_wait_time);
+       set_vim_var_nr(VV_PROFILING, 1L);
+     }
+     else if (do_profiling == PROF_NONE)
+-      EMSG(_("E750: First use :profile start <fname>"));
++      EMSG(_("E750: First use \":profile start {fname}\""));
+     else if (STRCMP(eap->arg, "pause") == 0)
      {
-@@ -341,11 +341,13 @@ update_screen(type)
-     /* Need to update w_lines[]. */
-     if (curwin->w_lines_valid == 0 && type < NOT_VALID)
-       type = NOT_VALID;
+       if (do_profiling == PROF_YES)
+           profile_start(&pause_time);
+       do_profiling = PROF_PAUSED;
+@@ -1113,10 +1113,81 @@ ex_profile(eap)
+       /* The rest is similar to ":breakadd". */
+       ex_breakadd(eap);
+     }
+ }
  
--    if (!redrawing())
-+    /* Postpone the redrawing when it's not needed and when being called
-+     * recursively. */
-+    if (!redrawing() || updating_screen)
-     {
-       redraw_later(type);             /* remember type for next time */
-       must_redraw = type;
-       if (type > INVERTED_ALL)
-           curwin->w_lines_valid = 0;  /* don't use w_lines[].wl_size now */
-@@ -581,10 +583,11 @@ update_screen(type)
- static void update_prepare __ARGS((void));
- static void update_finish __ARGS((void));
++/* Command line expansion for :profile. */
++static enum
++{
++    PEXP_SUBCMD,      /* expand :profile sub-commands */
++    PEXP_FUNC,                /* expand :profile func {funcname} */
++} pexpand_what;
++
++static char *pexpand_cmds[] = {
++                      "start",
++#define PROFCMD_START 0
++                      "pause",
++#define PROFCMD_PAUSE 1
++                      "continue",
++#define PROFCMD_CONTINUE 2
++                      "func",
++#define PROFCMD_FUNC  3
++                      "file",
++#define PROFCMD_FILE  4
++                      NULL
++#define PROFCMD_LAST  5
++};
++
++/*
++ * Function given to ExpandGeneric() to obtain the profile command
++ * specific expansion.
++ */
++    char_u *
++get_profile_name(xp, idx)
++    expand_T  *xp UNUSED;
++    int               idx;
++{
++    switch (pexpand_what)
++    {
++    case PEXP_SUBCMD:
++      return (char_u *)pexpand_cmds[idx];
++    /* case PEXP_FUNC: TODO */
++    default:
++      return NULL;
++    }
++}
++
++/*
++ * Handle command line completion for :profile command.
++ */
++    void
++set_context_in_profile_cmd(xp, arg)
++    expand_T  *xp;
++    char_u    *arg;
++{
++    char_u    *end_subcmd;
++
++    /* Default: expand subcommands. */
++    xp->xp_context = EXPAND_PROFILE;
++    pexpand_what = PEXP_SUBCMD;
++    xp->xp_pattern = arg;
++
++    end_subcmd = skiptowhite(arg);
++    if (*end_subcmd == NUL)
++      return;
++
++    if (end_subcmd - arg == 5 && STRNCMP(arg, "start", 5) == 0)
++    {
++      xp->xp_context = EXPAND_FILES;
++      xp->xp_pattern = skipwhite(end_subcmd);
++      return;
++    }
++
++    /* TODO: expand function names after "func" */
++    xp->xp_context = EXPAND_NOTHING;
++}
++
+ /*
+  * Dump the profiling info.
+  */
+     void
+ profile_dump()
+@@ -1340,18 +1411,17 @@ autowrite_all()
+ }
  
  /*
-  * Prepare for updating one or more windows.
-+ * Caller must check for "updating_screen" already set to avoid recursiveness.
+  * return TRUE if buffer was changed and cannot be abandoned.
   */
-     static void
- update_prepare()
+-/*ARGSUSED*/
+     int
+ check_changed(buf, checkaw, mult_win, forceit, allbuf)
+     buf_T     *buf;
+     int               checkaw;        /* do autowrite if buffer was changed */
+     int               mult_win;       /* check also when several wins for the buf */
+     int               forceit;
+-    int               allbuf;         /* may write all buffers */
++    int               allbuf UNUSED;  /* may write all buffers */
  {
-     cursor_off();
-@@ -662,11 +665,13 @@ update_debug_sign(buf, lnum)
-           redraw_win_later(wp, VALID);
-       if (wp->w_redr_type != 0)
-           doit = TRUE;
-     }
--    if (!doit)
-+    /* Return when there is nothing to do or screen updating already
-+     * happening. */
-+    if (!doit || updating_screen)
-       return;
-     /* update all windows that need updating */
-     update_prepare();
-@@ -695,10 +700,14 @@ update_debug_sign(buf, lnum)
+     if (       !forceit
+           && bufIsChanged(buf)
+           && (mult_win || buf->b_nwindows <= 1)
+           && (!checkaw || autowrite(buf, forceit) == FAIL))
+@@ -1757,16 +1827,15 @@ set_arglist(str)
+  * "what" == AL_ADD: add files in 'str' to the argument list after "after".
+  * "what" == AL_DEL: remove files in 'str' from the argument list.
+  *
+  * Return FAIL for failure, OK otherwise.
   */
-     void
- updateWindow(wp)
-     win_T     *wp;
+-/*ARGSUSED*/
+     static int
+ do_arglist(str, what, after)
+     char_u    *str;
+-    int               what;
+-    int               after;          /* 0 means before first one */
++    int               what UNUSED;
++    int               after UNUSED;           /* 0 means before first one */
  {
-+    /* return if already busy updating */
-+    if (updating_screen)
-+      return;
-+
-     update_prepare();
- #ifdef FEAT_CLIPBOARD
-     /* When Visual area changed, may have to update selection. */
-     if (clip_star.available && clip_isautosel())
-@@ -2324,17 +2333,16 @@ fold_line(wp, fold_count, foldinfo, lnum
-                   }
-               }
-               if (cells > 1)
-                   ScreenLines[idx + 1] = 0;
-           }
--          else if (cells > 1)     /* double-byte character */
--          {
--              if (enc_dbcs == DBCS_JPNU && *p == 0x8e)
--                  ScreenLines2[idx] = p[1];
--              else
--                  ScreenLines[idx + 1] = p[1];
--          }
-+          else if (enc_dbcs == DBCS_JPNU && *p == 0x8e)
-+              /* double-byte single width character */
-+              ScreenLines2[idx] = p[1];
-+          else if (cells > 1)
-+              /* double-width character */
-+              ScreenLines[idx + 1] = p[1];
-           col += cells;
-           idx += cells;
-           p += c_len;
-       }
+     garray_T  new_ga;
+     int               exp_count;
+     char_u    **exp_files;
+     int               i;
+@@ -2130,12 +2199,12 @@ do_argfile(eap, argn)
+       /* Edit the file; always use the last known line number.
+        * When it fails (e.g. Abort for already edited file) restore the
+        * argument index. */
+       if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL,
+                     eap, ECMD_LAST,
+-                    (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) +
+-                                 (eap->forceit ? ECMD_FORCEIT : 0)) == FAIL)
++                    (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0)
++                       + (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL)
+           curwin->w_arg_idx = old_arg_idx;
+       /* like Vi: set the mark where the cursor is in the file. */
+       else if (eap->cmdidx != CMD_argdo)
+           setmark('\'');
      }
-@@ -2411,11 +2419,11 @@ fold_line(wp, fold_count, foldinfo, lnum
-                           || (lnum == top->lnum
-                               && top->col == 0))
-                       && (lnume < bot->lnum
-                           || (lnume == bot->lnum
-                               && (bot->col - (*p_sel == 'e'))
--              >= STRLEN(ml_get_buf(wp->w_buffer, lnume, FALSE)))))))
-+              >= (colnr_T)STRLEN(ml_get_buf(wp->w_buffer, lnume, FALSE)))))))
-       {
-           if (VIsual_mode == Ctrl_V)
+@@ -2496,43 +2565,44 @@ ex_compiler(eap)
            {
-               /* Visual block mode: highlight the chars part of the block */
-               if (wp->w_old_cursor_fcol + txtcol < (colnr_T)W_WIDTH(wp))
-@@ -2437,13 +2445,21 @@ fold_line(wp, fold_count, foldinfo, lnum
-     }
- #endif
+               /* ":compiler! {name}" sets local options.
+                * To remain backwards compatible "current_compiler" is always
+                * used.  A user's compiler plugin may set it, the distributed
+                * plugin will then skip the settings.  Afterwards set
+-               * "b:current_compiler" and restore "current_compiler". */
+-              old_cur_comp = get_var_value((char_u *)"current_compiler");
++               * "b:current_compiler" and restore "current_compiler".
++               * Explicitly prepend "g:" to make it work in a function. */
++              old_cur_comp = get_var_value((char_u *)"g:current_compiler");
+               if (old_cur_comp != NULL)
+                   old_cur_comp = vim_strsave(old_cur_comp);
+               do_cmdline_cmd((char_u *)
+                             "command -nargs=* CompilerSet setlocal <args>");
+           }
+-          do_unlet((char_u *)"current_compiler", TRUE);
++          do_unlet((char_u *)"g:current_compiler", TRUE);
+           do_unlet((char_u *)"b:current_compiler", TRUE);
  
- #ifdef FEAT_SYN_HL
-     /* Show 'cursorcolumn' in the fold line. */
--    if (wp->w_p_cuc && (int)wp->w_virtcol + txtcol < W_WIDTH(wp))
--      ScreenAttrs[off + wp->w_virtcol + txtcol] = hl_combine_attr(
--               ScreenAttrs[off + wp->w_virtcol + txtcol], hl_attr(HLF_CUC));
-+    if (wp->w_p_cuc)
-+    {
-+      txtcol += wp->w_virtcol;
-+      if (wp->w_p_wrap)
-+          txtcol -= wp->w_skipcol;
-+      else
-+          txtcol -= wp->w_leftcol;
-+      if (txtcol >= 0 && txtcol < W_WIDTH(wp))
-+          ScreenAttrs[off + txtcol] = hl_combine_attr(
-+                               ScreenAttrs[off + txtcol], hl_attr(HLF_CUC));
-+    }
- #endif
+           sprintf((char *)buf, "compiler/%s.vim", eap->arg);
+           if (source_runtime(buf, TRUE) == FAIL)
+               EMSG2(_("E666: compiler not supported: %s"), eap->arg);
+           vim_free(buf);
  
-     SCREEN_LINE(row + W_WINROW(wp), W_WINCOL(wp), (int)W_WIDTH(wp),
-                                                    (int)W_WIDTH(wp), FALSE);
+           do_cmdline_cmd((char_u *)":delcommand CompilerSet");
  
-@@ -2539,18 +2555,17 @@ fill_foldcolumn(p, wp, closed, lnum)
-  * Start at row "startrow", stop when "endrow" is reached.
-  * wp->w_virtcol needs to be valid.
-  *
-  * Return the number of last row the line occupies.
-  */
--/* ARGSUSED */
-     static int
- win_line(wp, lnum, startrow, endrow, nochange)
-     win_T     *wp;
-     linenr_T  lnum;
-     int               startrow;
-     int               endrow;
--    int               nochange;               /* not updating for changed text */
-+    int               nochange UNUSED;        /* not updating for changed text */
- {
-     int               col;                    /* visual column on screen */
-     unsigned  off;                    /* offset in ScreenLines/ScreenAttrs */
-     int               c = 0;                  /* init for GCC */
-     long      vcol = 0;               /* virtual column (for tabs) */
-@@ -2586,10 +2601,11 @@ win_line(wp, lnum, startrow, endrow, noc
-     int               fromcol, tocol;         /* start/end of inverting */
-     int               fromcol_prev = -2;      /* start of inverting after cursor */
-     int               noinvcur = FALSE;       /* don't invert the cursor */
- #ifdef FEAT_VISUAL
-     pos_T     *top, *bot;
-+    int               lnum_in_visual_area = FALSE;
- #endif
-     pos_T     pos;
-     long      v;
+           /* Set "b:current_compiler" from "current_compiler". */
+-          p = get_var_value((char_u *)"current_compiler");
++          p = get_var_value((char_u *)"g:current_compiler");
+           if (p != NULL)
+               set_internal_string_var((char_u *)"b:current_compiler", p);
  
-     int               char_attr = 0;          /* attributes for next character */
-@@ -2782,13 +2798,14 @@ win_line(wp, lnum, startrow, endrow, noc
-       else                            /* Visual is before curwin->w_cursor */
-       {
-           top = &VIsual;
-           bot = &curwin->w_cursor;
-       }
-+      lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum);
-       if (VIsual_mode == Ctrl_V)      /* block mode */
-       {
--          if (lnum >= top->lnum && lnum <= bot->lnum)
-+          if (lnum_in_visual_area)
+           /* Restore "current_compiler" for ":compiler {name}". */
+           if (!eap->forceit)
            {
-               fromcol = wp->w_old_cursor_fcol;
-               tocol = wp->w_old_cursor_lcol;
+               if (old_cur_comp != NULL)
+               {
+-                  set_internal_string_var((char_u *)"current_compiler",
++                  set_internal_string_var((char_u *)"g:current_compiler",
+                                                               old_cur_comp);
+                   vim_free(old_cur_comp);
+               }
+               else
+-                  do_unlet((char_u *)"current_compiler", TRUE);
++                  do_unlet((char_u *)"g:current_compiler", TRUE);
            }
        }
-@@ -2877,12 +2894,13 @@ win_line(wp, lnum, startrow, endrow, noc
-           pos.col = search_match_endcol;
-           getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL);
-       }
-       else
-           tocol = MAXCOL;
--      if (fromcol == tocol)           /* do at least one character */
--          tocol = fromcol + 1;        /* happens when past end of line */
-+      /* do at least one character; happens when past end of line */
-+      if (fromcol == tocol)
-+          tocol = fromcol + 1;
-       area_highlighting = TRUE;
-       attr = hl_attr(HLF_I);
      }
- #ifdef FEAT_DIFF
-@@ -2997,15 +3015,37 @@ win_line(wp, lnum, startrow, endrow, noc
-           prev_ptr = ptr;
+ }
  #endif
-           mb_ptr_adv(ptr);
-       }
+@@ -2547,15 +2617,14 @@ ex_runtime(eap)
+     source_runtime(eap->arg, eap->forceit);
+ }
  
--#ifdef FEAT_VIRTUALEDIT
--      /* When 'virtualedit' is set the end of the line may be before the
--       * start of the displayed part. */
--      if (vcol < v && *ptr == NUL && virtual_active())
-+#if defined(FEAT_SYN_HL) || defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
-+      /* When:
-+       * - 'cuc' is set, or
-+       * - 'virtualedit' is set, or
-+       * - the visual mode is active,
-+       * the end of the line may be before the start of the displayed part.
-+       */
-+      if (vcol < v && (
-+# ifdef FEAT_SYN_HL
-+           wp->w_p_cuc
-+#  if defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
-+           ||
-+#  endif
-+# endif
-+# ifdef FEAT_VIRTUALEDIT
-+           virtual_active()
-+#  ifdef FEAT_VISUAL
-+           ||
-+#  endif
-+# endif
-+# ifdef FEAT_VISUAL
-+           (VIsual_active && wp->w_buffer == curwin->w_buffer)
-+# endif
-+           ))
-+      {
-           vcol = v;
-+      }
- #endif
+ static void source_callback __ARGS((char_u *fname, void *cookie));
  
-       /* Handle a character that's not completely on the screen: Put ptr at
-        * that character but skip the first few screen characters. */
-       if (vcol > v)
-@@ -3410,10 +3450,11 @@ win_line(wp, lnum, startrow, endrow, noc
- #ifdef FEAT_MBYTE
-                   || (has_mbyte && vcol + 1 == fromcol && n_extra == 0
-                       && (*mb_ptr2cells)(ptr) > 1)
- #endif
-                   || ((int)vcol_prev == fromcol_prev
-+                      && vcol_prev < vcol     /* not at margin */
-                       && vcol < tocol))
-               area_attr = attr;               /* start highlighting */
-           else if (area_attr != 0
-                   && (vcol == tocol
-                       || (noinvcur && (colnr_T)vcol == wp->w_virtcol)))
-@@ -3542,11 +3583,12 @@ win_line(wp, lnum, startrow, endrow, noc
-               char_attr = search_attr;
- #ifdef LINE_ATTR
-               /* Use line_attr when not in the Visual or 'incsearch' area
-                * (area_attr may be 0 when "noinvcur" is set). */
-           else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL)
--                                      || (vcol < fromcol || vcol >= tocol)))
-+                              || vcol < fromcol || vcol_prev < fromcol_prev
-+                              || vcol >= tocol))
-               char_attr = line_attr;
- #endif
-           else
-           {
-               attr_pri = FALSE;
-@@ -4104,10 +4146,11 @@ win_line(wp, lnum, startrow, endrow, noc
- # ifdef FEAT_RIGHTLEFT
-                                   wp->w_p_rl ? (col >= 0) :
- # endif
-                                   (col < W_WIDTH(wp)))
-                               && !(noinvcur
-+                                  && lnum == wp->w_cursor.lnum
-                                   && (colnr_T)vcol == wp->w_virtcol)))
-                       && lcs_eol_one >= 0)
-               {
-                   /* Display a '$' after the line or highlight an extra
-                    * character if the line break is included. */
-@@ -4245,20 +4288,20 @@ win_line(wp, lnum, startrow, endrow, noc
- #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
-       /* XIM don't send preedit_start and preedit_end, but they send
-        * preedit_changed and commit.  Thus Vim can't set "im_is_active", use
-        * im_is_preediting() here. */
-       if (xic != NULL
--              && lnum == curwin->w_cursor.lnum
-+              && lnum == wp->w_cursor.lnum
-               && (State & INSERT)
-               && !p_imdisable
-               && im_is_preediting()
-               && draw_state == WL_LINE)
-       {
-           colnr_T tcol;
+-/*ARGSUSED*/
+     static void
+ source_callback(fname, cookie)
+     char_u    *fname;
+-    void      *cookie;
++    void      *cookie UNUSED;
+ {
+     (void)do_source(fname, FALSE, DOSO_NONE);
+ }
  
-           if (preedit_end_col == MAXCOL)
--              getvcol(curwin, &(curwin->w_cursor), &tcol, NULL, NULL);
-+              getvcol(curwin, &(wp->w_cursor), &tcol, NULL, NULL);
-           else
-               tcol = preedit_end_col;
-           if ((long)preedit_start_col <= vcol && vcol < (long)tcol)
-           {
-               if (feedback_old_attr < 0)
-@@ -4351,11 +4394,17 @@ win_line(wp, lnum, startrow, endrow, noc
-                   cur = cur->next;
-               }
-           }
- #endif
-           if (lcs_eol == lcs_eol_one
--                  && ((area_attr != 0 && vcol == fromcol && c == NUL)
-+                  && ((area_attr != 0 && vcol == fromcol
-+#ifdef FEAT_VISUAL
-+                          && (VIsual_mode != Ctrl_V
-+                              || lnum == VIsual.lnum
-+                              || lnum == curwin->w_cursor.lnum)
-+#endif
-+                          && c == NUL)
- #ifdef FEAT_SEARCH_EXTRA
-                       /* highlight 'hlsearch' match at end of line */
-                       || (prevcol_hl_flag == TRUE
- # if defined(LINE_ATTR)
-                           && did_line_attr <= 1
-@@ -4445,11 +4494,12 @@ win_line(wp, lnum, startrow, endrow, noc
-        * At end of the text line.
-        */
-       if (c == NUL)
-       {
- #ifdef FEAT_SYN_HL
--          if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol)
-+          if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol
-+                  && lnum == wp->w_cursor.lnum)
-           {
-               /* highlight last char after line */
-               --col;
-               --off;
-               --vcol;
-@@ -4547,11 +4597,12 @@ win_line(wp, lnum, startrow, endrow, noc
- #ifdef FEAT_SYN_HL
-       /* Highlight the cursor column if 'cursorcolumn' is set.  But don't
-        * highlight the cursor position itself. */
-       if (wp->w_p_cuc && vcol == (long)wp->w_virtcol
-               && lnum != wp->w_cursor.lnum
--              && draw_state == WL_LINE)
-+              && draw_state == WL_LINE
-+              && !lnum_in_visual_area)
-       {
-           vcol_save_attr = char_attr;
-           char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC));
-       }
-       else
-@@ -4577,11 +4628,15 @@ win_line(wp, lnum, startrow, endrow, noc
-           }
- #endif
-           ScreenLines[off] = c;
- #ifdef FEAT_MBYTE
-           if (enc_dbcs == DBCS_JPNU)
-+          {
-+              if ((mb_c & 0xff00) == 0x8e00)
-+                  ScreenLines[off] = 0x8e;
-               ScreenLines2[off] = mb_c & 0xff;
-+          }
-           else if (enc_utf8)
-           {
-               if (mb_utf8)
-               {
-                   int i;
-@@ -4650,11 +4705,11 @@ win_line(wp, lnum, startrow, endrow, noc
-       }
-       else
-           --n_skip;
+ /*
+@@ -2678,14 +2747,13 @@ do_in_runtimepath(name, all, callback, c
  
-       /* Only advance the "vcol" when after the 'number' column. */
--      if (draw_state >= WL_SBR
-+      if (draw_state > WL_NR
- #ifdef FEAT_DIFF
-               && filler_todo <= 0
+ #if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
+ /*
+  * ":options"
+  */
+-/*ARGSUSED*/
+     void
+ ex_options(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
+ }
  #endif
-               )
-           ++vcol;
-@@ -5117,12 +5172,12 @@ screen_line(row, coloff, endcol, clear_w
-           if (char_cells == 2)
-               ScreenLines[off_to + 1] = ScreenLines[off_from + 1];
+@@ -2803,24 +2871,39 @@ source_level(cookie)
+ }
  #endif
  
- #if defined(FEAT_GUI) || defined(UNIX)
--          /* The bold trick makes a single row of pixels appear in the next
--           * character.  When a bold character is removed, the next
-+          /* The bold trick makes a single column of pixels appear in the
-+           * next character.  When a bold character is removed, the next
-            * character should be redrawn too.  This happens for our own GUI
-            * and for some xterms. */
-           if (
- # ifdef FEAT_GUI
-                   gui.in_use
-@@ -5721,10 +5776,17 @@ win_redr_status(wp)
-     char_u    *p;
-     int               len;
-     int               fillchar;
-     int               attr;
-     int               this_ru_col;
-+    static int  busy = FALSE;
-+
-+    /* It's possible to get here recursively when 'statusline' (indirectly)
-+     * invokes ":redrawstatus".  Simply ignore the call then. */
-+    if (busy)
-+      return;
-+    busy = TRUE;
+ static char_u *get_one_sourceline __ARGS((struct source_cookie *sp));
  
-     wp->w_redr_status = FALSE;
-     if (wp->w_status_height == 0)
-     {
-       /* no status line, can only be last window */
-@@ -5743,11 +5805,11 @@ win_redr_status(wp)
-     }
- #ifdef FEAT_STL_OPT
-     else if (*p_stl != NUL || *wp->w_p_stl != NUL)
-     {
-       /* redraw custom status line */
--      redraw_custum_statusline(wp);
-+      redraw_custom_statusline(wp);
-     }
- #endif
-     else
-     {
-       fillchar = fillchar_status(&attr, wp == curwin);
-@@ -5859,30 +5921,44 @@ win_redr_status(wp)
-           fillchar = fillchar_vsep(&attr);
-       screen_putchar(fillchar, W_WINROW(wp) + wp->w_height, W_ENDCOL(wp),
-                                                                       attr);
-     }
- #endif
-+    busy = FALSE;
- }
+-#if defined(WIN32) && defined(FEAT_CSCOPE)
++#if (defined(WIN32) && defined(FEAT_CSCOPE)) || defined(HAVE_FD_CLOEXEC)
++# define USE_FOPEN_NOINH
+ static FILE *fopen_noinh_readbin __ARGS((char *filename));
  
- #ifdef FEAT_STL_OPT
  /*
-  * Redraw the status line according to 'statusline' and take care of any
-  * errors encountered.
+  * Special function to open a file without handle inheritance.
++ * When possible the handle is closed on exec().
   */
-     static void
--redraw_custum_statusline(wp)
-+redraw_custom_statusline(wp)
-     win_T         *wp;
+     static FILE *
+ fopen_noinh_readbin(filename)
+     char    *filename;
  {
--    int       save_called_emsg = called_emsg;
-+    static int            entered = FALSE;
-+    int                   save_called_emsg = called_emsg;
-+
-+    /* When called recursively return.  This can happen when the statusline
-+     * contains an expression that triggers a redraw. */
-+    if (entered)
-+      return;
-+    entered = TRUE;
++# ifdef WIN32
+     int       fd_tmp = mch_open(filename, O_RDONLY | O_BINARY | O_NOINHERIT, 0);
++# else
++    int       fd_tmp = mch_open(filename, O_RDONLY, 0);
++# endif
  
-     called_emsg = FALSE;
-     win_redr_custom(wp, FALSE);
-     if (called_emsg)
+     if (fd_tmp == -1)
+       return NULL;
++
++# ifdef HAVE_FD_CLOEXEC
 +    {
-+      /* When there is an error disable the statusline, otherwise the
-+       * display is messed up with errors and a redraw triggers the problem
-+       * again and again. */
-       set_string_option_direct((char_u *)"statusline", -1,
-               (char_u *)"", OPT_FREE | (*wp->w_p_stl != NUL
-                                       ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR);
++      int fdflags = fcntl(fd_tmp, F_GETFD);
++      if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
++          fcntl(fd_tmp, F_SETFD, fdflags | FD_CLOEXEC);
 +    }
-     called_emsg |= save_called_emsg;
-+    entered = FALSE;
++# endif
++
+     return fdopen(fd_tmp, READBIN);
  }
  #endif
  
- # ifdef FEAT_VERTSPLIT
- /*
-@@ -5986,20 +6062,21 @@ win_redr_custom(wp, draw_ruler)
-     int               width;
-     int               n;
-     int               len;
-     int               fillchar;
-     char_u    buf[MAXPATHL];
-+    char_u    *stl;
-     char_u    *p;
-     struct    stl_hlrec hltab[STL_MAX_ITEM];
-     struct    stl_hlrec tabtab[STL_MAX_ITEM];
-     int               use_sandbox = FALSE;
  
-     /* setup environment for the task at hand */
-     if (wp == NULL)
-     {
-       /* Use 'tabline'.  Always at the first line of the screen. */
--      p = p_tal;
-+      stl = p_tal;
-       row = 0;
-       fillchar = ' ';
-       attr = hl_attr(HLF_TPF);
-       maxwidth = Columns;
- # ifdef FEAT_EVAL
-@@ -6012,21 +6089,21 @@ win_redr_custom(wp, draw_ruler)
-       fillchar = fillchar_status(&attr, wp == curwin);
-       maxwidth = W_WIDTH(wp);
+@@ -2840,10 +2923,11 @@ do_source(fname, check_other, is_vimrc)
+     struct source_cookie    cookie;
+     char_u                *save_sourcing_name;
+     linenr_T              save_sourcing_lnum;
+     char_u                *p;
+     char_u                *fname_exp;
++    char_u                *firstline = NULL;
+     int                           retval = FAIL;
+ #ifdef FEAT_EVAL
+     scid_T                save_current_SID;
+     static scid_T         last_current_SID = 0;
+     void                  *save_funccalp;
+@@ -2895,11 +2979,11 @@ do_source(fname, check_other, is_vimrc)
  
-       if (draw_ruler)
-       {
--          p = p_ruf;
-+          stl = p_ruf;
-           /* advance past any leading group spec - implicit in ru_col */
--          if (*p == '%')
-+          if (*stl == '%')
-           {
--              if (*++p == '-')
--                  p++;
--              if (atoi((char *) p))
--                  while (VIM_ISDIGIT(*p))
--                      p++;
--              if (*p++ != '(')
--                  p = p_ruf;
-+              if (*++stl == '-')
-+                  stl++;
-+              if (atoi((char *)stl))
-+                  while (VIM_ISDIGIT(*stl))
-+                      stl++;
-+              if (*stl++ != '(')
-+                  stl = p_ruf;
-           }
- #ifdef FEAT_VERTSPLIT
-           col = ru_col - (Columns - W_WIDTH(wp));
-           if (col < (W_WIDTH(wp) + 1) / 2)
-               col = (W_WIDTH(wp) + 1) / 2;
-@@ -6051,13 +6128,13 @@ win_redr_custom(wp, draw_ruler)
- # endif
-       }
-       else
+     /* Apply SourcePre autocommands, they may get the file. */
+     apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
+ #endif
+-#if defined(WIN32) && defined(FEAT_CSCOPE)
++#ifdef USE_FOPEN_NOINH
+     cookie.fp = fopen_noinh_readbin((char *)fname_exp);
+ #else
+     cookie.fp = mch_fopen((char *)fname_exp, READBIN);
+ #endif
+     if (cookie.fp == NULL && check_other)
+@@ -2916,11 +3000,11 @@ do_source(fname, check_other, is_vimrc)
        {
-           if (*wp->w_p_stl != NUL)
--              p = wp->w_p_stl;
-+              stl = wp->w_p_stl;
+           if (*p == '_')
+               *p = '.';
            else
--              p = p_stl;
-+              stl = p_stl;
- # ifdef FEAT_EVAL
-           use_sandbox = was_set_insecurely((char_u *)"statusline",
-                                        *wp->w_p_stl == NUL ? 0 : OPT_LOCAL);
- # endif
+               *p = '_';
+-#if defined(WIN32) && defined(FEAT_CSCOPE)
++#ifdef USE_FOPEN_NOINH
+           cookie.fp = fopen_noinh_readbin((char *)fname_exp);
+ #else
+           cookie.fp = mch_fopen((char *)fname_exp, READBIN);
+ #endif
        }
-@@ -6068,17 +6145,21 @@ win_redr_custom(wp, draw_ruler)
-     }
-     if (maxwidth <= 0)
-       return;
-+    /* Make a copy, because the statusline may include a function call that
-+     * might change the option value and free the memory. */
-+    stl = vim_strsave(stl);
-     width = build_stl_str_hl(wp == NULL ? curwin : wp,
-                               buf, sizeof(buf),
--                              p, use_sandbox,
-+                              stl, use_sandbox,
-                               fillchar, maxwidth, hltab, tabtab);
-+    vim_free(stl);
-     len = (int)STRLEN(buf);
+@@ -2990,38 +3074,43 @@ do_source(fname, check_other, is_vimrc)
+     cookie.fname = fname_exp;
+     cookie.dbg_tick = debug_tick;
  
--    while (width < maxwidth && len < sizeof(buf) - 1)
-+    while (width < maxwidth && len < (int)sizeof(buf) - 1)
-     {
- #ifdef FEAT_MBYTE
-       len += (*mb_char2bytes)(fillchar, buf + len);
- #else
-       buf[len++] = fillchar;
-@@ -6261,26 +6342,43 @@ screen_puts_len(text, len, row, col, att
-     int               prev_c = 0;             /* previous Arabic character */
-     int               pc, nc, nc1;
-     int               pcc[MAX_MCO];
- # endif
+     cookie.level = ex_nesting_level;
  #endif
-+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
-+    int               force_redraw_this;
-+    int               force_redraw_next = FALSE;
-+#endif
-+    int               need_redraw;
+-#ifdef FEAT_MBYTE
+-    cookie.conv.vc_type = CONV_NONE;          /* no conversion */
+-
+-    /* Try reading the first few bytes to check for a UTF-8 BOM. */
+-    {
+-      char_u      buf[3];
+-
+-      if (fread((char *)buf, sizeof(char_u), (size_t)3, cookie.fp)
+-                                                                == (size_t)3
+-              && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)
+-          /* Found BOM, setup conversion and skip over it. */
+-          convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
+-      else
+-          /* No BOM found, rewind. */
+-          fseek(cookie.fp, 0L, SEEK_SET);
+-    }
+-#endif
  
-     if (ScreenLines == NULL || row >= screen_Rows)    /* safety check */
-       return;
-+    off = LineOffset[row] + col;
+     /*
+      * Keep the sourcing name/lnum, for recursive calls.
+      */
+     save_sourcing_name = sourcing_name;
+     sourcing_name = fname_exp;
+     save_sourcing_lnum = sourcing_lnum;
+     sourcing_lnum = 0;
  
- #ifdef FEAT_MBYTE
-     /* When drawing over the right halve of a double-wide char clear out the
-      * left halve.  Only needed in a terminal. */
-     if (has_mbyte && col > 0 && col < screen_Columns
- # ifdef FEAT_GUI
-           && !gui.in_use
- # endif
-           && mb_fix_col(col, row) != col)
--      screen_puts_len((char_u *)" ", 1, row, col - 1, 0);
++#ifdef FEAT_MBYTE
++    cookie.conv.vc_type = CONV_NONE;          /* no conversion */
++
++    /* Read the first line so we can check for a UTF-8 BOM. */
++    firstline = getsourceline(0, (void *)&cookie, 0);
++    if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
++                            && firstline[1] == 0xbb && firstline[2] == 0xbf)
 +    {
-+      ScreenLines[off - 1] = ' ';
-+      ScreenAttrs[off - 1] = 0;
-+      if (enc_utf8)
++      /* Found BOM; setup conversion, skip over BOM and recode the line. */
++      convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
++      p = string_convert(&cookie.conv, firstline + 3, NULL);
++      if (p == NULL)
++          p = vim_strsave(firstline + 3);
++      if (p != NULL)
 +      {
-+          ScreenLinesUC[off - 1] = 0;
-+          ScreenLinesC[0][off - 1] = 0;
++          vim_free(firstline);
++          firstline = p;
 +      }
-+      /* redraw the previous cell, make it empty */
-+      screen_char(off - 1, row, col - 1);
-+      /* force the cell at "col" to be redrawn */
-+      force_redraw_next = TRUE;
 +    }
- #endif
--    off = LineOffset[row] + col;
- #ifdef FEAT_MBYTE
-     max_off = LineOffset[row] + screen_Columns;
- #endif
-     while (col < screen_Columns
-           && (len < 0 || (int)(ptr - text) < len)
-@@ -6326,76 +6424,80 @@ screen_puts_len(text, len, row, col, att
-                       nc = NUL;
-                       nc1 = NUL;
-                   }
-                   else
-                   {
--                      nc = utfc_ptr2char(ptr + mbyte_blen, pcc);
-+                      nc = utfc_ptr2char_len(ptr + mbyte_blen, pcc,
-+                                    (int)((text + len) - ptr - mbyte_blen));
-                       nc1 = pcc[0];
-                   }
-                   pc = prev_c;
-                   prev_c = u8c;
-                   u8c = arabic_shape(u8c, &c, &u8cc[0], nc, nc1, pc);
-               }
-               else
-                   prev_c = u8c;
- # endif
-+              if (col + mbyte_cells > screen_Columns)
-+              {
-+                  /* Only 1 cell left, but character requires 2 cells:
-+                   * display a '>' in the last column to avoid wrapping. */
-+                  c = '>';
-+                  mbyte_cells = 1;
-+              }
-           }
-       }
- #endif
--      if (ScreenLines[off] != c
-+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
-+      force_redraw_this = force_redraw_next;
-+      force_redraw_next = FALSE;
 +#endif
 +
-+      need_redraw = ScreenLines[off] != c
- #ifdef FEAT_MBYTE
-               || (mbyte_cells == 2
-                   && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0))
-               || (enc_dbcs == DBCS_JPNU
-                   && c == 0x8e
-                   && ScreenLines2[off] != ptr[1])
-               || (enc_utf8
--                  && (ScreenLinesUC[off] != (u8char_T)u8c
-+                  && (ScreenLinesUC[off] != (u8char_T)(c >= 0x80 ? u8c : 0)
-                       || screen_comp_differs(off, u8cc)))
+ #ifdef STARTUPTIME
+-    time_push(&tv_rel, &tv_start);
++    if (time_fd != NULL)
++      time_push(&tv_rel, &tv_start);
  #endif
-               || ScreenAttrs[off] != attr
--              || exmode_active
-+              || exmode_active;
-+
-+      if (need_redraw
-+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
-+              || force_redraw_this
-+#endif
-               )
-       {
- #if defined(FEAT_GUI) || defined(UNIX)
-           /* The bold trick makes a single row of pixels appear in the next
-            * character.  When a bold character is removed, the next
-            * character should be redrawn too.  This happens for our own GUI
--           * and for some xterms.
--           * Force the redraw by setting the attribute to a different value
--           * than "attr", the contents of ScreenLines[] may be needed by
--           * mb_off2cells() further on.
--           * Don't do this for the last drawn character, because the next
--           * character may not be redrawn. */
--          if (
-+           * and for some xterms. */
-+          if (need_redraw && ScreenLines[off] != ' ' && (
- # ifdef FEAT_GUI
-                   gui.in_use
- # endif
- # if defined(FEAT_GUI) && defined(UNIX)
-                   ||
+ #ifdef FEAT_EVAL
+ # ifdef FEAT_PROFILE
+     if (do_profiling == PROF_YES)
+@@ -3047,11 +3136,11 @@ do_source(fname, check_other, is_vimrc)
+               && (
+ # ifdef UNIX
+                   /* Compare dev/ino when possible, it catches symbolic
+                    * links.  Also compare file names, the inode may change
+                    * when the file was edited. */
+-                  ((stat_ok && si->sn_dev != -1)
++                  ((stat_ok && si->sn_dev_valid)
+                       && (si->sn_dev == st.st_dev
+                           && si->sn_ino == st.st_ino)) ||
  # endif
+               fnamecmp(si->sn_name, fname_exp) == 0))
+           break;
+@@ -3074,15 +3163,16 @@ do_source(fname, check_other, is_vimrc)
+       si->sn_name = fname_exp;
+       fname_exp = NULL;
  # ifdef UNIX
-                   term_is_xterm
+       if (stat_ok)
+       {
++          si->sn_dev_valid = TRUE;
+           si->sn_dev = st.st_dev;
+           si->sn_ino = st.st_ino;
+       }
+       else
+-          si->sn_dev = -1;
++          si->sn_dev_valid = FALSE;
  # endif
--             )
-+                  ))
-           {
--              int             n;
-+              int     n = ScreenAttrs[off];
  
--              n = ScreenAttrs[off];
--# ifdef FEAT_MBYTE
--              if (col + mbyte_cells < screen_Columns
--                      && (n > HL_ALL || (n & HL_BOLD))
--                      && (len < 0 ? ptr[mbyte_blen] != NUL
--                                           : ptr + mbyte_blen < text + len))
--                  ScreenAttrs[off + mbyte_cells] = attr + 1;
--# else
--              if (col + 1 < screen_Columns
--                      && (n > HL_ALL || (n & HL_BOLD))
--                      && (len < 0 ? ptr[1] != NUL : ptr + 1 < text + len))
--                  ScreenLines[off + 1] = 0;
--# endif
-+              if (n > HL_ALL)
-+                  n = syn_attr2attr(n);
-+              if (n & HL_BOLD)
-+                  force_redraw_next = TRUE;
-           }
- #endif
- #ifdef FEAT_MBYTE
-           /* When at the end of the text and overwriting a two-cell
-            * character with a one-cell character, need to clear the next
-@@ -6478,10 +6580,24 @@ screen_puts_len(text, len, row, col, att
-           ++off;
-           ++col;
-           ++ptr;
-       }
+       /* Allocate the local script variables to use for this script. */
+       new_script_vars(current_SID);
      }
-+
-+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
-+    /* If we detected the next character needs to be redrawn, but the text
-+     * doesn't extend up to there, update the character here. */
-+    if (force_redraw_next && col < screen_Columns)
-+    {
-+# ifdef FEAT_MBYTE
-+      if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1)
-+          screen_char_2(off, row, col);
-+      else
-+# endif
-+          screen_char(off, row, col);
-+    }
-+#endif
- }
- #ifdef FEAT_SEARCH_EXTRA
- /*
-  * Prepare for 'hlsearch' highlighting.
-@@ -7354,11 +7470,15 @@ screenalloc(clear)
-     short         *new_TabPageIdxs;
-     tabpage_T     *tp;
+@@ -3109,13 +3199,12 @@ do_source(fname, check_other, is_vimrc)
  #endif
-     static int            entered = FALSE;            /* avoid recursiveness */
-     static int            done_outofmem_msg = FALSE;  /* did outofmem message */
-+#ifdef FEAT_AUTOCMD
-+    int                   retry_count = 0;
  
-+retry:
-+#endif
      /*
-      * Allocation of the screen buffers is done only when the size changes and
-      * when Rows and Columns have been set and we have started doing full
-      * screen stuff.
-      */
-@@ -7406,10 +7526,14 @@ screenalloc(clear)
-      * Continuing with the old ScreenLines may result in a crash, because the
-      * size is wrong.
+      * Call do_cmdline, which will call getsourceline() to get the lines.
       */
-     FOR_ALL_TAB_WINDOWS(tp, wp)
-       win_free_lsize(wp);
-+#ifdef FEAT_AUTOCMD
-+    if (aucmd_win != NULL)
-+      win_free_lsize(aucmd_win);
-+#endif
+-    do_cmdline(NULL, getsourceline, (void *)&cookie,
++    do_cmdline(firstline, getsourceline, (void *)&cookie,
+                                    DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
+-
+     retval = OK;
  
-     new_ScreenLines = (schar_T *)lalloc((long_u)(
-                             (Rows + 1) * Columns * sizeof(schar_T)), FALSE);
- #ifdef FEAT_MBYTE
-     vim_memset(new_ScreenLinesC, 0, sizeof(u8char_T) * MAX_MCO);
-@@ -7438,14 +7562,22 @@ screenalloc(clear)
+ #ifdef FEAT_PROFILE
+     if (do_profiling == PROF_YES)
      {
-       if (win_alloc_lines(wp) == FAIL)
-       {
-           outofmem = TRUE;
- #ifdef FEAT_WINDOWS
--          break;
-+          goto give_up;
- #endif
-       }
+@@ -3143,13 +3232,16 @@ do_source(fname, check_other, is_vimrc)
+       if (sourcing_name != NULL)
+           smsg((char_u *)_("continuing in %s"), sourcing_name);
+       verbose_leave();
      }
-+#ifdef FEAT_AUTOCMD
-+    if (aucmd_win != NULL && aucmd_win->w_lines == NULL
-+                                      && win_alloc_lines(aucmd_win) == FAIL)
-+      outofmem = TRUE;
-+#endif
-+#ifdef FEAT_WINDOWS
-+give_up:
-+#endif
- #ifdef FEAT_MBYTE
-     for (i = 0; i < p_mco; ++i)
-       if (new_ScreenLinesC[i] == NULL)
-           break;
-@@ -7626,12 +7758,21 @@ screenalloc(clear)
-     entered = FALSE;
-     --RedrawingDisabled;
- #ifdef FEAT_AUTOCMD
--    if (starting == 0)
-+    /*
-+     * Do not apply autocommands more than 3 times to avoid an endless loop
-+     * in case applying autocommands always changes Rows or Columns.
-+     */
-+    if (starting == 0 && ++retry_count <= 3)
+ #ifdef STARTUPTIME
+-    vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname);
+-    time_msg(IObuff, &tv_start);
+-    time_pop(&tv_rel);
++    if (time_fd != NULL)
 +    {
-       apply_autocmds(EVENT_VIMRESIZED, NULL, NULL, FALSE, curbuf);
-+      /* In rare cases, autocommands may have altered Rows or Columns,
-+       * jump back to check if we need to allocate the screen again. */
-+      goto retry;
++      vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
++      time_msg((char *)IObuff, &tv_start);
++      time_pop(&tv_rel);
 +    }
  #endif
- }
  
-     void
- free_screenlines()
-@@ -8588,19 +8729,18 @@ screen_ins_lines(off, row, line_count, e
-  * When scrolling region used 'off' is the offset from the top for the region.
-  * 'row' and 'end' are relative to the start of the region.
-  *
-  * Return OK for success, FAIL if the lines are not deleted.
-  */
--/*ARGSUSED*/
-     int
- screen_del_lines(off, row, line_count, end, force, wp)
-     int               off;
-     int               row;
-     int               line_count;
-     int               end;
-     int               force;          /* even when line_count > p_ttyscroll */
--    win_T     *wp;            /* NULL or window to use width from */
-+    win_T     *wp UNUSED;     /* NULL or window to use width from */
- {
-     int               j;
-     int               i;
-     unsigned  temp;
-     int               cursor_row;
-@@ -9078,11 +9218,11 @@ msg_pos_mode()
-     void
- unshowmode(force)
-     int           force;
- {
+ #ifdef FEAT_EVAL
      /*
--     * Don't delete it right now, when not redrawing or insided a mapping.
-+     * Don't delete it right now, when not redrawing or inside a mapping.
-      */
-     if (!redrawing() || (!force && char_avail() && !KeyTyped))
-       redraw_cmdline = TRUE;          /* delete mode later */
-     else
-     {
-@@ -9384,11 +9524,11 @@ showruler(always)
-     }
+      * After a "finish" in debug mode, need to break at first command of next
+@@ -3169,10 +3261,11 @@ almosttheend:
+       prof_child_exit(&wait_start);           /* leaving a child now */
+ # endif
  #endif
- #if defined(FEAT_STL_OPT) && defined(FEAT_WINDOWS)
-     if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height)
-     {
--      redraw_custum_statusline(curwin);
-+      redraw_custom_statusline(curwin);
-     }
-     else
+     fclose(cookie.fp);
+     vim_free(cookie.nextline);
++    vim_free(firstline);
+ #ifdef FEAT_MBYTE
+     convert_setup(&cookie.conv, NULL, NULL);
  #endif
- #ifdef FEAT_CMDL_INFO
-       win_redr_ruler(curwin, always);
-@@ -9414,17 +9554,19 @@ showruler(always)
-     static void
- win_redr_ruler(wp, always)
-     win_T     *wp;
-     int               always;
+ theend:
+@@ -3183,14 +3276,13 @@ theend:
+ #if defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * ":scriptnames"
+  */
+-/*ARGSUSED*/
+     void
+ ex_scriptnames(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
--    char_u    buffer[70];
-+#define RULER_BUF_LEN 70
-+    char_u    buffer[RULER_BUF_LEN];
-     int               row;
-     int               fillchar;
-     int               attr;
-     int               empty_line = FALSE;
-     colnr_T   virtcol;
-     int               i;
-+    size_t    len;
-     int               o;
- #ifdef FEAT_VERTSPLIT
-     int               this_ru_col;
-     int               off = 0;
-     int               width = Columns;
-@@ -9535,25 +9677,26 @@ win_redr_ruler(wp, always)
+     int i;
  
-       /*
-        * Some sprintfs return the length, some return a pointer.
-        * To avoid portability problems we use strlen() here.
-        */
--      sprintf((char *)buffer, "%ld,",
-+      vim_snprintf((char *)buffer, RULER_BUF_LEN, "%ld,",
-               (wp->w_buffer->b_ml.ml_flags & ML_EMPTY)
-                   ? 0L
-                   : (long)(wp->w_cursor.lnum));
--      col_print(buffer + STRLEN(buffer),
-+      len = STRLEN(buffer);
-+      col_print(buffer + len, RULER_BUF_LEN - len,
-                       empty_line ? 0 : (int)wp->w_cursor.col + 1,
-                       (int)virtcol + 1);
+     for (i = 1; i <= script_items.ga_len && !got_int; ++i)
+       if (SCRIPT_ITEM(i).sn_name != NULL)
+@@ -3310,16 +3402,15 @@ fgets_cr(s, n, stream)
+  * Called by do_cmdline() when it's called from do_source().
+  *
+  * Return a pointer to the line in allocated memory.
+  * Return NULL for end-of-file or some error.
+  */
+-/* ARGSUSED */
+     char_u *
+ getsourceline(c, cookie, indent)
+-    int               c;              /* not used */
++    int               c UNUSED;
+     void      *cookie;
+-    int               indent;         /* not used */
++    int               indent UNUSED;
+ {
+     struct source_cookie *sp = (struct source_cookie *)cookie;
+     char_u            *line;
+     char_u            *p, *s;
  
-       /*
-        * Add a "50%" if there is room for it.
-        * On the last line, don't print in the last column (scrolls the
-        * screen up on some terminals).
-        */
-       i = (int)STRLEN(buffer);
--      get_rel_pos(wp, buffer + i + 1);
-+      get_rel_pos(wp, buffer + i + 1, RULER_BUF_LEN - i - 1);
-       o = i + vim_strsize(buffer + i + 1);
- #ifdef FEAT_WINDOWS
-       if (wp->w_status_height == 0)   /* can't use last char of screen */
- #endif
-           ++o;
-@@ -9576,11 +9719,11 @@ win_redr_ruler(wp, always)
-               else
- #endif
-                   buffer[i++] = fillchar;
-               ++o;
-           }
--          get_rel_pos(wp, buffer + i);
-+          get_rel_pos(wp, buffer + i, RULER_BUF_LEN - i);
-       }
-       /* Truncate at window boundary. */
+@@ -3366,11 +3457,11 @@ getsourceline(c, cookie, indent)
+           if (sp->nextline == NULL)
+               break;
+           p = skipwhite(sp->nextline);
+           if (*p != '\\')
+               break;
+-          s = alloc((int)(STRLEN(line) + STRLEN(p)));
++          s = alloc((unsigned)(STRLEN(line) + STRLEN(p)));
+           if (s == NULL)      /* out of memory */
+               break;
+           STRCPY(s, line);
+           STRCAT(s, p + 1);
+           vim_free(line);
+@@ -3642,14 +3733,13 @@ script_line_end()
+ /*
+  * ":scriptencoding": Set encoding conversion for a sourced script.
+  * Without the multi-byte feature it's simply ignored.
+  */
+-/*ARGSUSED*/
+     void
+ ex_scriptencoding(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
  #ifdef FEAT_MBYTE
-       if (has_mbyte)
-       {
---- vim72.orig/src/option.c
-+++ vim72/src/option.c
-@@ -385,10 +385,13 @@ struct vimoption
-     idopt_T   indir;          /* global option: PV_NONE;
-                                * local option: indirect option index */
-     char_u    *def_val[2];    /* default values for variable (vi and vim) */
- #ifdef FEAT_EVAL
-     scid_T    scriptID;       /* script in which the option was last set */
-+# define SCRIPTID_INIT , 0
-+#else
-+# define SCRIPTID_INIT
+     struct source_cookie      *sp;
+     char_u                    *name;
+@@ -4094,14 +4184,13 @@ ex_language(eap)
+ # if defined(FEAT_CMDL_COMPL) || defined(PROTO)
+ /*
+  * Function given to ExpandGeneric() to obtain the possible arguments of the
+  * ":language" command.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_lang_arg(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     if (idx == 0)
+       return (char_u *)"messages";
+     if (idx == 1)
+--- vim72.orig/src/ex_docmd.c
++++ vim72/src/ex_docmd.c
+@@ -24,14 +24,16 @@ typedef struct ucmd
+ {
+     char_u    *uc_name;       /* The command name */
+     long_u    uc_argt;        /* The argument type */
+     char_u    *uc_rep;        /* The command's replacement string */
+     long      uc_def;         /* The default value for a range/count */
+-    scid_T    uc_scriptID;    /* SID where the command was defined */
+     int               uc_compl;       /* completion type */
+-# if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
++# ifdef FEAT_EVAL
++    scid_T    uc_scriptID;    /* SID where the command was defined */
++#  ifdef FEAT_CMDL_COMPL
+     char_u    *uc_compl_arg;  /* completion argument if any */
++#  endif
+ # endif
+ } ucmd_T;
+ #define UC_BUFFER     1       /* -buffer: local to current buffer */
+@@ -362,10 +364,11 @@ static void      ex_tag_cmd __ARGS((exarg_T *
+ # define ex_lockvar           ex_ni
+ # define ex_unlockvar         ex_ni
+ # define ex_function          ex_ni
+ # define ex_delfunction               ex_ni
+ # define ex_return            ex_ni
++# define ex_oldfiles          ex_ni
  #endif
- };
+ static char_u *arg_all __ARGS((void));
+ #ifdef FEAT_SESSION
+ static int    makeopens __ARGS((FILE *fd, char_u *dirnow));
+ static int    put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int current_arg_idx));
+@@ -1575,15 +1578,14 @@ free_cmdlines(gap)
  
- #define VI_DEFAULT  0     /* def_val[VI_DEFAULT] is Vi default value */
- #define VIM_DEFAULT 1     /* def_val[VIM_DEFAULT] is Vim default value */
-@@ -398,12 +401,13 @@ struct vimoption
+ /*
+  * If "fgetline" is get_loop_line(), return TRUE if the getline it uses equals
+  * "func".  * Otherwise return TRUE when "fgetline" equals "func".
   */
- #define P_BOOL                0x01    /* the option is boolean */
- #define P_NUM         0x02    /* the option is numeric */
- #define P_STRING      0x04    /* the option is a string */
- #define P_ALLOCED     0x08    /* the string option is in allocated memory,
--                                  must use vim_free() when assigning new
--                                  value. Not set if default is the same. */
-+                                 must use free_string_option() when
-+                                 assigning new value. Not set if default is
-+                                 the same. */
- #define P_EXPAND      0x10    /* environment expansion.  NOTE: P_EXPAND can
-                                  never be used for local or hidden options! */
- #define P_NODEFAULT   0x40    /* don't set to default value */
- #define P_DEF_ALLOCED 0x80    /* default value is in allocated memory, must
-                                   use vim_free() when assigning new value */
-@@ -475,263 +479,263 @@ static struct vimoption
- #if (defined(MSDOS) || defined(WIN3264) || defined(OS2)) && !defined(FEAT_GUI_W32)
-                           (char_u *)128L,
- #else
-                           (char_u *)224L,
+-/*ARGSUSED*/
+     int
+ getline_equal(fgetline, cookie, func)
+     char_u    *(*fgetline) __ARGS((int, void *, int));
+-    void      *cookie;                /* argument for fgetline() */
++    void      *cookie UNUSED;         /* argument for fgetline() */
+     char_u    *(*func) __ARGS((int, void *, int));
+ {
+ #ifdef FEAT_EVAL
+     char_u            *(*gp) __ARGS((int, void *, int));
+     struct loop_cookie *cp;
+@@ -1607,14 +1609,13 @@ getline_equal(fgetline, cookie, func)
+ #if defined(FEAT_EVAL) || defined(FEAT_MBYTE) || defined(PROTO)
+ /*
+  * If "fgetline" is get_loop_line(), return the cookie used by the original
+  * getline function.  Otherwise return "cookie".
+  */
+-/*ARGSUSED*/
+     void *
+ getline_cookie(fgetline, cookie)
+-    char_u    *(*fgetline) __ARGS((int, void *, int));
++    char_u    *(*fgetline) __ARGS((int, void *, int)) UNUSED;
+     void      *cookie;                /* argument for fgetline() */
+ {
+ # ifdef FEAT_EVAL
+     char_u            *(*gp) __ARGS((int, void *, int));
+     struct loop_cookie *cp;
+@@ -1676,12 +1677,12 @@ do_one_cmd(cmdlinep, sourcing,
+     linenr_T          lnum;
+     long              n;
+     char_u            *errormsg = NULL;       /* error message */
+     exarg_T           ea;                     /* Ex command arguments */
+     long              verbose_save = -1;
+-    int                       save_msg_scroll = 0;
+-    int                       did_silent = 0;
++    int                       save_msg_scroll = msg_scroll;
++    int                       save_msg_silent = -1;
+     int                       did_esilent = 0;
+ #ifdef HAVE_SANDBOX
+     int                       did_sandbox = FALSE;
  #endif
--                                          (char_u *)0L}},
-+                                          (char_u *)0L} SCRIPTID_INIT},
-     {"antialias",   "anti", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
- #if defined(FEAT_GUI) && defined(MACOS_X)
-                           (char_u *)&p_antialias, PV_NONE,
-                           {(char_u *)FALSE, (char_u *)FALSE}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)FALSE, (char_u *)FALSE}
+     cmdmod_T          save_cmdmod;
+@@ -1768,11 +1769,11 @@ do_one_cmd(cmdlinep, sourcing,
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"arabic",            "arab", P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_ARABIC
-                           (char_u *)VAR_WIN, PV_ARAB,
- #else
-                           (char_u *)NULL, PV_NONE,
+                           continue;
+                       }
+                       if (checkforcmd(&ea.cmd, "browse", 3))
+                       {
+-#ifdef FEAT_BROWSE
++#ifdef FEAT_BROWSE_CMD
+                           cmdmod.browse = TRUE;
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"arabicshape", "arshape", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
- #ifdef FEAT_ARABIC
-                           (char_u *)&p_arshape, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+                           continue;
+                       }
+                       if (!checkforcmd(&ea.cmd, "botright", 2))
+@@ -1855,13 +1856,13 @@ do_one_cmd(cmdlinep, sourcing,
  #endif
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"allowrevins", "ari",  P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_RIGHTLEFT
-                           (char_u *)&p_ari, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+                           continue;
+                       }
+                       if (!checkforcmd(&ea.cmd, "silent", 3))
+                           break;
+-                      ++did_silent;
++                      if (save_msg_silent == -1)
++                          save_msg_silent = msg_silent;
+                       ++msg_silent;
+-                      save_msg_scroll = msg_scroll;
+                       if (*ea.cmd == '!' && !vim_iswhite(ea.cmd[-1]))
+                       {
+                           /* ":silent!", but not "silent !cmd" */
+                           ea.cmd = skipwhite(ea.cmd + 1);
+                           ++emsg_silent;
+@@ -1885,10 +1886,17 @@ do_one_cmd(cmdlinep, sourcing,
+ #ifdef FEAT_WINDOWS
+                       cmdmod.split |= WSP_TOP;
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"altkeymap",   "akm",  P_BOOL|P_VI_DEF,
- #ifdef FEAT_FKMAP
-                           (char_u *)&p_altkeymap, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+                       continue;
++          case 'u':   if (!checkforcmd(&ea.cmd, "unsilent", 3))
++                          break;
++                      if (save_msg_silent == -1)
++                          save_msg_silent = msg_silent;
++                      msg_silent = 0;
++                      continue;
++
+           case 'v':   if (checkforcmd(&ea.cmd, "vertical", 4))
+                       {
+ #ifdef FEAT_VERTSPLIT
+                           cmdmod.split |= WSP_VERT;
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"ambiwidth",  "ambw",  P_STRING|P_VI_DEF|P_RCLR,
- #if defined(FEAT_MBYTE)
-                           (char_u *)&p_ambw, PV_NONE,
-                           {(char_u *)"single", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+@@ -2683,23 +2691,27 @@ doend:
+     }
  #endif
--                          },
-+                          SCRIPTID_INIT},
- #ifdef FEAT_AUTOCHDIR
-     {"autochdir",  "acd",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_acd, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     cmdmod = save_cmdmod;
+-    if (did_silent > 0)
++    if (save_msg_silent != -1)
+     {
+       /* messages could be enabled for a serious error, need to check if the
+        * counters don't become negative */
+-      msg_silent -= did_silent;
+-      if (msg_silent < 0)
+-          msg_silent = 0;
++      if (!did_emsg || msg_silent > save_msg_silent)
++          msg_silent = save_msg_silent;
+       emsg_silent -= did_esilent;
+       if (emsg_silent < 0)
+           emsg_silent = 0;
+       /* Restore msg_scroll, it's set by file I/O commands, even when no
+        * message is actually displayed. */
+       msg_scroll = save_msg_scroll;
++
++      /* "silent reg" or "silent echo x" inside "redir" leaves msg_col
++       * somewhere in the line.  Put it back in the first column. */
++      if (redirecting())
++          msg_col = 0;
+     }
+ #ifdef HAVE_SANDBOX
+     if (did_sandbox)
+       --sandbox;
+@@ -2729,11 +2741,11 @@ checkforcmd(pp, cmd, len)
+     int               len;            /* required length */
+ {
+     int               i;
+     for (i = 0; cmd[i] != NUL; ++i)
+-      if (cmd[i] != (*pp)[i])
++      if (((char_u *)cmd)[i] != (*pp)[i])
+           break;
+     if (i >= len && !isalpha((*pp)[i]))
+     {
+       *pp = skipwhite(*pp + i);
+       return TRUE;
+@@ -2746,15 +2758,14 @@ checkforcmd(pp, cmd, len)
+  * Start of the name can be found at eap->cmd.
+  * Returns pointer to char after the command name.
+  * "full" is set to TRUE if the whole command name matched.
+  * Returns NULL for an ambiguous user command.
+  */
+-/*ARGSUSED*/
+     static char_u *
+ find_command(eap, full)
+     exarg_T   *eap;
+-    int               *full;
++    int               *full UNUSED;
+ {
+     int               len;
+     char_u    *p;
+     int               i;
+@@ -2795,11 +2806,11 @@ find_command(eap, full)
+       if (*eap->cmd == 'd' && (p[-1] == 'l' || p[-1] == 'p'))
+       {
+           /* Check for ":dl", ":dell", etc. to ":deletel": that's
+            * :delete with the 'l' flag.  Same for 'p'. */
+           for (i = 0; i < len; ++i)
+-              if (eap->cmd[i] != "delete"[i])
++              if (eap->cmd[i] != ((char_u *)"delete")[i])
+                   break;
+           if (i == len - 1)
+           {
+               --len;
+               if (p[-1] == 'l')
+@@ -2976,15 +2987,17 @@ static struct cmdmod
+     {"keepalt", 5, FALSE},
+     {"keepjumps", 5, FALSE},
+     {"keepmarks", 3, FALSE},
+     {"leftabove", 5, FALSE},
+     {"lockmarks", 3, FALSE},
++    {"noautocmd", 3, FALSE},
+     {"rightbelow", 6, FALSE},
+     {"sandbox", 3, FALSE},
+     {"silent", 3, FALSE},
+     {"tab", 3, TRUE},
+     {"topleft", 2, FALSE},
++    {"unsilent", 3, FALSE},
+     {"verbose", 4, TRUE},
+     {"vertical", 4, FALSE},
+ };
+ /*
+@@ -2998,11 +3011,11 @@ modifier_len(cmd)
+     int               i, j;
+     char_u    *p = cmd;
+     if (VIM_ISDIGIT(*cmd))
+       p = skipwhite(skipdigits(cmd));
+-    for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i)
++    for (i = 0; i < (int)(sizeof(cmdmods) / sizeof(struct cmdmod)); ++i)
+     {
+       for (j = 0; p[j] != NUL; ++j)
+           if (p[j] != cmdmods[i].name[j])
+               break;
+       if (!isalpha(p[j]) && j >= cmdmods[i].minlen
+@@ -3026,11 +3039,11 @@ cmd_exists(name)
+     int               i;
+     int               j;
+     char_u    *p;
+     /* Check command modifiers. */
+-    for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i)
++    for (i = 0; i < (int)(sizeof(cmdmods) / sizeof(struct cmdmod)); ++i)
+     {
+       for (j = 0; name[j] != NUL; ++j)
+           if (name[j] != cmdmods[i].name[j])
+               break;
+       if (name[j] == NUL && j >= cmdmods[i].minlen)
+@@ -3143,21 +3156,19 @@ set_one_cmd_context(xp, buff)
+       {
+           xp->xp_context = EXPAND_UNSUCCESSFUL;
+           return NULL;
+       }
+       for (ea.cmdidx = (cmdidx_T)0; (int)ea.cmdidx < (int)CMD_SIZE;
+-                                       ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1))
+-          if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd, (size_t)len) == 0)
++                                 ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1))
++          if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd,
++                                                          (size_t)len) == 0)
+               break;
+ #ifdef FEAT_USR_CMDS
+       if (cmd[0] >= 'A' && cmd[0] <= 'Z')
+-      {
+           while (ASCII_ISALNUM(*p) || *p == '*')      /* Allow * wild card */
+               ++p;
+-          len = (int)(p - cmd);
+-      }
  #endif
-     {"autoindent",  "ai",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_ai, PV_AI,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"autoprint",   "ap",   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"autoread",    "ar",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_ar, PV_AR,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"autowrite",   "aw",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_aw, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"autowriteall","awa",  P_BOOL|P_VI_DEF,
-                           (char_u *)&p_awa, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"background",  "bg",   P_STRING|P_VI_DEF|P_RCLR,
-                           (char_u *)&p_bg, PV_NONE,
-                           {
- #if (defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI)
-                           (char_u *)"dark",
- #else
-                           (char_u *)"light",
+     }
+     /*
+      * If the cursor is touching the command, and it ends in an alpha-numeric
+@@ -3606,10 +3617,11 @@ set_one_cmd_context(xp, buff)
+ #ifdef FEAT_AUTOCMD
+       case CMD_autocmd:
+           return set_context_in_autocmd(xp, arg, FALSE);
+       case CMD_doautocmd:
++      case CMD_doautoall:
+           return set_context_in_autocmd(xp, arg, TRUE);
  #endif
--                                          (char_u *)0L}},
-+                                          (char_u *)0L} SCRIPTID_INIT},
-     {"backspace",   "bs",   P_STRING|P_VI_DEF|P_VIM|P_COMMA|P_NODUP,
-                           (char_u *)&p_bs, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"backup",            "bk",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_bk, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"backupcopy",  "bkc",  P_STRING|P_VIM|P_COMMA|P_NODUP,
-                           (char_u *)&p_bkc, PV_NONE,
- #ifdef UNIX
-                           {(char_u *)"yes", (char_u *)"auto"}
- #else
-                           {(char_u *)"auto", (char_u *)"auto"}
+       case CMD_set:
+           set_context_in_set_cmd(xp, arg, 0);
+           break;
+@@ -3678,10 +3690,22 @@ set_one_cmd_context(xp, buff)
+           break;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"backupdir",   "bdir", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP|P_SECURE,
-                           (char_u *)&p_bdir, PV_NONE,
--                          {(char_u *)DFLT_BDIR, (char_u *)0L}},
-+                          {(char_u *)DFLT_BDIR, (char_u *)0L} SCRIPTID_INIT},
-     {"backupext",   "bex",  P_STRING|P_VI_DEF|P_NFNAME,
-                           (char_u *)&p_bex, PV_NONE,
-                           {
- #ifdef VMS
-                           (char_u *)"_",
- #else
-                           (char_u *)"~",
+       case CMD_highlight:
+           set_context_in_highlight_cmd(xp, arg);
+           break;
++#ifdef FEAT_CSCOPE
++      case CMD_cscope:
++      case CMD_lcscope:
++      case CMD_scscope:
++          set_context_in_cscope_cmd(xp, arg, ea.cmdidx);
++          break;
++#endif
++#ifdef FEAT_SIGNS
++      case CMD_sign:
++          set_context_in_sign_cmd(xp, arg);
++          break;
++#endif
+ #ifdef FEAT_LISTCMDS
+       case CMD_bdelete:
+       case CMD_bwipeout:
+       case CMD_bunload:
+           while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL)
+@@ -3778,10 +3802,18 @@ set_one_cmd_context(xp, buff)
+           }
+           else
+               xp->xp_context = EXPAND_NOTHING;
+           break;
  #endif
--                                          (char_u *)0L}},
-+                                          (char_u *)0L} SCRIPTID_INIT},
-     {"backupskip",  "bsk",  P_STRING|P_VI_DEF|P_COMMA,
- #ifdef FEAT_WILDIGN
-                           (char_u *)&p_bsk, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
++#if defined(FEAT_PROFILE)
++      case CMD_profile:
++          set_context_in_profile_cmd(xp, arg);
++          break;
++#endif
++      case CMD_behave:
++          xp->xp_context = EXPAND_BEHAVE;
++          break;
+ #endif /* FEAT_CMDL_COMPL */
+       default:
+           break;
+@@ -3801,11 +3833,11 @@ set_one_cmd_context(xp, buff)
+     char_u *
+ skip_range(cmd, ctx)
+     char_u    *cmd;
+     int               *ctx;   /* pointer to xp_context or NULL */
+ {
+-    int               delim;
++    unsigned  delim;
+     while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;", *cmd) != NULL)
+     {
+       if (*cmd == '\'')
+       {
+@@ -5031,14 +5063,13 @@ check_more(message, forceit)
+ #ifdef FEAT_CMDL_COMPL
+ /*
+  * Function given to ExpandGeneric() to obtain the list of command names.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_command_name(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     if (idx >= (int)CMD_SIZE)
+ # ifdef FEAT_USR_CMDS
+       return get_user_command_name(idx);
+@@ -5119,11 +5150,15 @@ uc_add_command(name, name_len, rep, argt
+               EMSG(_("E174: Command already exists: add ! to replace it"));
+               goto fail;
+           }
+           vim_free(cmd->uc_rep);
+-          cmd->uc_rep = 0;
++          cmd->uc_rep = NULL;
++#if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
++          vim_free(cmd->uc_compl_arg);
++          cmd->uc_compl_arg = NULL;
++#endif
+           break;
+       }
+       /* Stop as soon as we pass the name to add */
+       if (cmp < 0)
+@@ -5178,10 +5213,13 @@ static struct
+ } command_complete[] =
+ {
+     {EXPAND_AUGROUP, "augroup"},
+     {EXPAND_BUFFERS, "buffer"},
+     {EXPAND_COMMANDS, "command"},
++#if defined(FEAT_CSCOPE)
++    {EXPAND_CSCOPE, "cscope"},
++#endif
+ #if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
+     {EXPAND_USER_DEFINED, "custom"},
+     {EXPAND_USER_LIST, "customlist"},
  #endif
--                          },
-+                          SCRIPTID_INIT},
- #ifdef FEAT_BEVAL
-     {"balloondelay","bdlay",P_NUM|P_VI_DEF,
-                           (char_u *)&p_bdlay, PV_NONE,
--                          {(char_u *)600L, (char_u *)0L}},
-+                          {(char_u *)600L, (char_u *)0L} SCRIPTID_INIT},
-     {"ballooneval", "beval",P_BOOL|P_VI_DEF|P_NO_MKRC,
-                           (char_u *)&p_beval, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
- # ifdef FEAT_EVAL
-     {"balloonexpr", "bexpr", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
-                           (char_u *)&p_bexpr, PV_BEXPR,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
- # endif
+     {EXPAND_DIRECTORIES, "dir"},
+@@ -5194,10 +5232,13 @@ static struct
+     {EXPAND_HIGHLIGHT, "highlight"},
+     {EXPAND_MAPPINGS, "mapping"},
+     {EXPAND_MENUS, "menu"},
+     {EXPAND_SETTINGS, "option"},
+     {EXPAND_SHELLCMD, "shellcmd"},
++#if defined(FEAT_SIGNS)
++    {EXPAND_SIGN, "sign"},
++#endif
+     {EXPAND_TAGS, "tag"},
+     {EXPAND_TAGS_LISTFILES, "tag_listfiles"},
+     {EXPAND_USER_VARS, "var"},
+     {0, NULL}
+ };
+@@ -5477,10 +5518,13 @@ invalid_count:
+     }
+     return OK;
+ }
++/*
++ * ":command ..."
++ */
+     static void
+ ex_command(eap)
+     exarg_T   *eap;
+ {
+     char_u  *name;
+@@ -5538,14 +5582,13 @@ ex_command(eap)
+ /*
+  * ":comclear"
+  * Clear all user commands, global and for current buffer.
+  */
+-/*ARGSUSED*/
+     void
+ ex_comclear(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     uc_clear(&ucmds);
+     uc_clear(&curbuf->b_ucmds);
+ }
+@@ -5908,11 +5951,12 @@ do_ucmd(eap)
+     char_u    *buf;
+     char_u    *p;
+     char_u    *q;
+     char_u    *start;
+-    char_u    *end;
++    char_u    *end = NULL;
++    char_u    *ksp;
+     size_t    len, totlen;
+     size_t    split_len = 0;
+     char_u    *split_buf = NULL;
+     ucmd_T    *cmd;
+@@ -5925,20 +5969,55 @@ do_ucmd(eap)
+     else
+       cmd = USER_CMD_GA(&curbuf->b_ucmds, eap->useridx);
+     /*
+      * Replace <> in the command by the arguments.
++     * First round: "buf" is NULL, compute length, allocate "buf".
++     * Second round: copy result into "buf".
+      */
+     buf = NULL;
+     for (;;)
+     {
+-      p = cmd->uc_rep;
+-      q = buf;
++      p = cmd->uc_rep;    /* source */
++      q = buf;            /* destination */
+       totlen = 0;
+-      while ((start = vim_strchr(p, '<')) != NULL
+-             && (end = vim_strchr(start + 1, '>')) != NULL)
++
++      for (;;)
+       {
++          start = vim_strchr(p, '<');
++          if (start != NULL)
++              end = vim_strchr(start + 1, '>');
++          if (buf != NULL)
++          {
++              ksp = vim_strchr(p, K_SPECIAL);
++              if (ksp != NULL && (start == NULL || ksp < start || end == NULL)
++                      && ((ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER)
++# ifdef FEAT_GUI
++                          || (ksp[1] == KS_EXTRA && ksp[2] == (int)KE_CSI)
++# endif
++                          ))
++              {
++                  /* K_SPECIAL han been put in the buffer as K_SPECIAL
++                   * KS_SPECIAL KE_FILLER, like for mappings, but
++                   * do_cmdline() doesn't handle that, so convert it back.
++                   * Also change K_SPECIAL KS_EXTRA KE_CSI into CSI. */
++                  len = ksp - p;
++                  if (len > 0)
++                  {
++                      mch_memmove(q, p, len);
++                      q += len;
++                  }
++                  *q++ = ksp[1] == KS_SPECIAL ? K_SPECIAL : CSI;
++                  p = ksp + 3;
++                  continue;
++              }
++          }
++
++          /* break if there no <item> is found */
++          if (start == NULL || end == NULL)
++              break;
++
+           /* Include the '>' */
+           ++end;
+           /* Take everything up to the '<' */
+           len = start - p;
+@@ -6001,14 +6080,13 @@ get_user_command_name(idx)
+ }
+ /*
+  * Function given to ExpandGeneric() to obtain the list of user command names.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_user_commands(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     if (idx < curbuf->b_ucmds.ga_len)
+       return USER_CMD_GA(&curbuf->b_ucmds, idx)->uc_name;
+     idx -= curbuf->b_ucmds.ga_len;
+@@ -6019,48 +6097,45 @@ get_user_commands(xp, idx)
+ /*
+  * Function given to ExpandGeneric() to obtain the list of user command
+  * attributes.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_user_cmd_flags(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     static char *user_cmd_flags[] =
+       {"bang", "bar", "buffer", "complete", "count",
+           "nargs", "range", "register"};
+-    if (idx >= sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0]))
++    if (idx >= (int)(sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0])))
+       return NULL;
+     return (char_u *)user_cmd_flags[idx];
+ }
+ /*
+  * Function given to ExpandGeneric() to obtain the list of values for -nargs.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_user_cmd_nargs(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     static char *user_cmd_nargs[] = {"0", "1", "*", "?", "+"};
+-    if (idx >= sizeof(user_cmd_nargs) / sizeof(user_cmd_nargs[0]))
++    if (idx >= (int)(sizeof(user_cmd_nargs) / sizeof(user_cmd_nargs[0])))
+       return NULL;
+     return (char_u *)user_cmd_nargs[idx];
+ }
+ /*
+  * Function given to ExpandGeneric() to obtain the list of values for -complete.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_user_cmd_complete(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     return (char_u *)command_complete[idx].name;
+ }
+ # endif /* FEAT_CMDL_COMPL */
+@@ -6234,14 +6309,13 @@ ex_quit(eap)
+ }
+ /*
+  * ":cquit".
+  */
+-/*ARGSUSED*/
+     static void
+ ex_cquit(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     getout(1);        /* this does not always pass on the exit code to the Manx
+                  compiler. why? */
+ }
+@@ -6679,14 +6753,13 @@ ex_goto(eap)
  #endif
-     {"beautify",    "bf",   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"binary",            "bin",  P_BOOL|P_VI_DEF|P_RSTAT,
-                           (char_u *)&p_bin, PV_BIN,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"bioskey",           "biosk",P_BOOL|P_VI_DEF,
- #ifdef MSDOS
-                           (char_u *)&p_biosk, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+ /*
+  * ":shell".
+  */
+-/*ARGSUSED*/
+     static void
+ ex_shell(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     do_shell(NULL, 0);
+ }
+ #if (defined(FEAT_WINDOWS) && defined(HAVE_DROP_FILE)) \
+@@ -6986,14 +7059,13 @@ alist_slash_adjust()
  #endif
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"bomb",      NULL,   P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
- #ifdef FEAT_MBYTE
-                           (char_u *)&p_bomb, PV_BOMB,
- #else
-                           (char_u *)NULL, PV_NONE,
+ /*
+  * ":preserve".
+  */
+-/*ARGSUSED*/
+     static void
+ ex_preserve(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     curbuf->b_flags |= BF_PRESERVED;
+     ml_preserve(curbuf, TRUE);
+ }
+@@ -7221,14 +7293,13 @@ ex_tabmove(eap)
+ }
+ /*
+  * :tabs command: List tabs and their contents.
+  */
+-/*ARGSUSED*/
+     static void
+ ex_tabs(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     tabpage_T *tp;
+     win_T     *wp;
+     int               tabcount = 1;
+@@ -7411,11 +7482,10 @@ ex_edit(eap)
+ }
+ /*
+  * ":edit <file>" command and alikes.
+  */
+-/*ARGSUSED*/
+     void
+ do_exedit(eap, old_curwin)
+     exarg_T   *eap;
+     win_T     *old_curwin;        /* curwin before doing a split or NULL */
+ {
+@@ -7483,11 +7553,12 @@ do_exedit(eap, old_curwin)
+               ) && *eap->arg == NUL)
+     {
+       /* ":new" or ":tabnew" without argument: edit an new empty buffer */
+       setpcmark();
+       (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE,
+-                             ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0));
++                    ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0),
++                    old_curwin == NULL ? curwin : NULL);
+     }
+     else if ((eap->cmdidx != CMD_split
+ #ifdef FEAT_VERTSPLIT
+               && eap->cmdidx != CMD_vsplit
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"breakat",           "brk",  P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST,
- #ifdef FEAT_LINEBREAK
-                           (char_u *)&p_breakat, PV_NONE,
-                           {(char_u *)" \t!@*-+;:,./?", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+@@ -7520,11 +7591,11 @@ do_exedit(eap, old_curwin)
+                   (P_HID(curbuf) ? ECMD_HIDE : 0)
+                   + (eap->forceit ? ECMD_FORCEIT : 0)
+ #ifdef FEAT_LISTCMDS
+                   + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 )
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"browsedir",   "bsdir",P_STRING|P_VI_DEF,
- #ifdef FEAT_BROWSE
-                           (char_u *)&p_bsdir, PV_NONE,
-                           {(char_u *)"last", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+-                  ) == FAIL)
++                  , old_curwin == NULL ? curwin : NULL) == FAIL)
+       {
+           /* Editing the file failed.  If the window was split, close it. */
+ #ifdef FEAT_WINDOWS
+           if (old_curwin != NULL)
+           {
+@@ -7622,14 +7693,13 @@ ex_popup(eap)
+ {
+     gui_make_popup(eap->arg, eap->forceit);
+ }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"bufhidden",   "bh",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB,
- #if defined(FEAT_QUICKFIX)
-                           (char_u *)&p_bh, PV_BH,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+-/*ARGSUSED*/
+     static void
+ ex_swapname(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     if (curbuf->b_ml.ml_mfp == NULL || curbuf->b_ml.ml_mfp->mf_fname == NULL)
+       MSG(_("No swap file"));
+     else
+       msg(curbuf->b_ml.ml_mfp->mf_fname);
+@@ -7638,14 +7708,13 @@ ex_swapname(eap)
+ /*
+  * ":syncbind" forces all 'scrollbind' windows to have the same relative
+  * offset.
+  * (1998-11-02 16:21:01  R. Edward Ralston <eralston@computer.org>)
+  */
+-/*ARGSUSED*/
+     static void
+ ex_syncbind(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+ #ifdef FEAT_SCROLLBIND
+     win_T     *wp;
+     long      topline;
+     long      y;
+@@ -7782,14 +7851,14 @@ ex_read(eap)
+               else
+                   lnum = 1;
+               if (*ml_get(lnum) == NUL && u_savedel(lnum, 1L) == OK)
+               {
+                   ml_delete(lnum, FALSE);
+-                  deleted_lines_mark(lnum, 1L);
+                   if (curwin->w_cursor.lnum > 1
+                                            && curwin->w_cursor.lnum >= lnum)
+                       --curwin->w_cursor.lnum;
++                  deleted_lines_mark(lnum, 1L);
+               }
+           }
+           redraw_curbuf_later(VALID);
+       }
+     }
+@@ -7801,10 +7870,13 @@ static char_u  *prev_dir = NULL;
+     void
+ free_cd_dir()
+ {
+     vim_free(prev_dir);
+     prev_dir = NULL;
++
++    vim_free(globaldir);
++    globaldir = NULL;
+ }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"buflisted",   "bl",   P_BOOL|P_VI_DEF|P_NOGLOB,
-                           (char_u *)&p_bl, PV_BL,
-                           {(char_u *)1L, (char_u *)0L}
--                          },
-+                          SCRIPTID_INIT},
-     {"buftype",           "bt",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB,
- #if defined(FEAT_QUICKFIX)
-                           (char_u *)&p_bt, PV_BT,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ /*
+@@ -7823,10 +7895,14 @@ ex_cd(eap)
+     if (*new_dir == NUL)
+       ex_pwd(NULL);
+     else
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"casemap",           "cmp",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_MBYTE
-                           (char_u *)&p_cmp, PV_NONE,
-                           {(char_u *)"internal,keepascii", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"cdpath",            "cd",   P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_SEARCHPATH
-                           (char_u *)&p_cdpath, PV_NONE,
-                           {(char_u *)",,", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     {
++#ifdef FEAT_AUTOCMD
++      if (allbuf_locked())
++          return;
++#endif
+       if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged()
+                                                            && !eap->forceit)
+       {
+           EMSG(_("E747: Cannot change directory, buffer is modified (add ! to override)"));
+           return;
+@@ -7894,24 +7970,23 @@ ex_cd(eap)
+           }
+           shorten_fnames(TRUE);
+           /* Echo the new current directory if the command was typed. */
+-          if (KeyTyped)
++          if (KeyTyped || p_verbose >= 5)
+               ex_pwd(eap);
+       }
+       vim_free(tofree);
+     }
+ }
+ /*
+  * ":pwd".
+  */
+-/*ARGSUSED*/
+     static void
+ ex_pwd(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     if (mch_dirname(NameBuff, MAXPATHL) == OK)
+     {
+ #ifdef BACKSLASH_IN_FILENAME
+       slash_adjust(NameBuff);
+@@ -8289,10 +8364,11 @@ ex_join(eap)
+     static void
+ ex_at(eap)
+     exarg_T   *eap;
+ {
+     int               c;
++    int               prev_len = typebuf.tb_len;
+     curwin->w_cursor.lnum = eap->line2;
+ #ifdef USE_ON_FLY_SCROLL
+     dont_scroll = TRUE;               /* disallow scrolling here */
+@@ -8314,15 +8390,14 @@ ex_at(eap)
+       exec_from_reg = TRUE;
+       /*
+        * Execute from the typeahead buffer.
+-       * Originally this didn't check for the typeahead buffer to be empty,
+-       * thus could read more Ex commands from stdin.  It's not clear why,
+-       * it is certainly unexpected.
++       * Continue until the stuff buffer is empty and all added characters
++       * have been consumed.
+        */
+-      while ((!stuff_empty() || typebuf.tb_len > 0) && vpeekc() == ':')
++      while (!stuff_empty() || typebuf.tb_len > prev_len)
+           (void)do_cmdline(NULL, getexline, NULL, DOCMD_NOWAIT|DOCMD_VERBOSE);
+       exec_from_reg = save_efr;
+     }
+ }
+@@ -8338,36 +8413,33 @@ ex_bang(eap)
+ }
+ /*
+  * ":undo".
+  */
+-/*ARGSUSED*/
+     static void
+ ex_undo(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     if (eap->addr_count == 1)     /* :undo 123 */
+       undo_time(eap->line2, FALSE, TRUE);
+     else
+       u_undo(1);
+ }
+ /*
+  * ":redo".
+  */
+-/*ARGSUSED*/
+     static void
+ ex_redo(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     u_redo(1);
+ }
+ /*
+  * ":earlier" and ":later".
+  */
+-/*ARGSUSED*/
+     static void
+ ex_later(eap)
+     exarg_T   *eap;
+ {
+     long      count = 0;
+@@ -8548,14 +8620,13 @@ ex_redraw(eap)
+ }
+ /*
+  * ":redrawstatus": force redraw of status line(s)
+  */
+-/*ARGSUSED*/
+     static void
+ ex_redrawstatus(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+ #if defined(FEAT_WINDOWS)
+     int               r = RedrawingDisabled;
+     int               p = p_lz;
+@@ -8628,10 +8699,12 @@ ex_mkrc(eap)
+       return;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"cedit",     NULL,   P_STRING,
- #ifdef FEAT_CMDWIN
-                           (char_u *)&p_cedit, PV_NONE,
-                           {(char_u *)"", (char_u *)CTRL_F_STR}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     }
+ #ifdef FEAT_SESSION
++    /* Use the short file name until ":lcd" is used.  We also don't use the
++     * short file name when 'acd' is set, that is checked later. */
+     did_lcd = FALSE;
+     /* ":mkview" or ":mkview 9": generate file name with 'viewdir' */
+     if (eap->cmdidx == CMD_mkview
+           && (*eap->arg == NUL
+@@ -8747,12 +8820,12 @@ ex_mkrc(eap)
+                       shorten_fnames(TRUE);
+               }
+               else if (*dirnow != NUL
+                       && (ssop_flags & SSOP_CURDIR) && globaldir != NULL)
+               {
+-                  (void)mch_chdir((char *)globaldir);
+-                  shorten_fnames(TRUE);
++                  if (mch_chdir((char *)globaldir) == 0)
++                      shorten_fnames(TRUE);
+               }
+               failed |= (makeopens(fd, dirnow) == FAIL);
+               /* restore original dir */
+@@ -8812,15 +8885,14 @@ theend:
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"charconvert",  "ccv", P_STRING|P_VI_DEF|P_SECURE,
- #if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
-                           (char_u *)&p_ccv, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ }
+ #if ((defined(FEAT_SESSION) || defined(FEAT_EVAL)) && defined(vim_mkdir)) \
+       || defined(PROTO)
+-/*ARGSUSED*/
+     int
+ vim_mkdir_emsg(name, prot)
+     char_u    *name;
+-    int               prot;
++    int               prot UNUSED;
+ {
+     if (vim_mkdir(name, prot) != 0)
+     {
+       EMSG2(_("E739: Cannot create directory: %s"), name);
+       return FAIL;
+@@ -9087,14 +9159,13 @@ ex_startinsert(eap)
+ }
+ /*
+  * ":stopinsert"
+  */
+-/*ARGSUSED*/
+     static void
+ ex_stopinsert(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     restart_edit = 0;
+     stop_insert_mode = TRUE;
+ }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"cindent",           "cin",  P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_CINDENT
-                           (char_u *)&p_cin, PV_CIN,
- #else
-                           (char_u *)NULL, PV_NONE,
+@@ -9364,13 +9435,12 @@ find_cmdline_var(src, usedlen)
+ #ifdef FEAT_CLIENTSERVER
+                   "<client>"
+ # define SPEC_CLIENT 9
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"cinkeys",           "cink", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_CINDENT
-                           (char_u *)&p_cink, PV_CINK,
-                           {(char_u *)"0{,0},0),:,0#,!^F,o,O,e", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     };
+-#define SPEC_COUNT  (sizeof(spec_str) / sizeof(char *))
+-    for (i = 0; i < SPEC_COUNT; ++i)
++    for (i = 0; i < (int)(sizeof(spec_str) / sizeof(char *)); ++i)
+     {
+       len = (int)STRLEN(spec_str[i]);
+       if (STRNCMP(src, spec_str[i], len) == 0)
+       {
+           *usedlen = len;
+@@ -9504,28 +9574,54 @@ eval_vars(src, srcstart, usedlen, lnump,
+                   skip_mod = TRUE;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"cinoptions",  "cino", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_CINDENT
-                           (char_u *)&p_cino, PV_CINO,
- #else
-                           (char_u *)NULL, PV_NONE,
+                   break;
+               }
+               s = src + 1;
++              if (*s == '<')          /* "#<99" uses v:oldfiles */
++                  ++s;
+               i = (int)getdigits(&s);
+               *usedlen = (int)(s - src); /* length of what we expand */
+-              buf = buflist_findnr(i);
+-              if (buf == NULL)
++              if (src[1] == '<')
+               {
+-                  *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
++                  if (*usedlen < 2)
++                  {
++                      /* Should we give an error message for #<text? */
++                      *usedlen = 1;
++                      return NULL;
++                  }
++#ifdef FEAT_EVAL
++                  result = list_find_str(get_vim_var_list(VV_OLDFILES),
++                                                                   (long)i);
++                  if (result == NULL)
++                  {
++                      *errormsg = (char_u *)"";
++                      return NULL;
++                  }
++#else
++                  *errormsg = (char_u *)_("E809: #< is not available without the +eval feature");
+                   return NULL;
++#endif
+               }
+-              if (lnump != NULL)
+-                  *lnump = ECMD_LAST;
+-              if (buf->b_fname == NULL)
++              else
+               {
+-                  result = (char_u *)"";
+-                  valid = 0;      /* Must have ":p:h" to be valid */
++                  buf = buflist_findnr(i);
++                  if (buf == NULL)
++                  {
++                      *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
++                      return NULL;
++                  }
++                  if (lnump != NULL)
++                      *lnump = ECMD_LAST;
++                  if (buf->b_fname == NULL)
++                  {
++                      result = (char_u *)"";
++                      valid = 0;          /* Must have ":p:h" to be valid */
++                  }
++                  else
++                      result = buf->b_fname;
+               }
+-              else
+-                  result = buf->b_fname;
+               break;
+ #ifdef FEAT_SEARCHPATH
+       case SPEC_CFILE:        /* file name under cursor */
+               result = file_name_at_cursor(FNAME_MESS|FNAME_HYP, 1L, NULL);
+@@ -9539,10 +9635,19 @@ eval_vars(src, srcstart, usedlen, lnump,
  #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"cinwords",    "cinw", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
- #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
-                           (char_u *)&p_cinw, PV_CINW,
-                           {(char_u *)"if,else,while,do,for,switch",
-                               (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ #ifdef FEAT_AUTOCMD
+       case SPEC_AFILE:        /* file name for autocommand */
+               result = autocmd_fname;
++              if (result != NULL && !autocmd_fname_full)
++              {
++                  /* Still need to turn the fname into a full path.  It is
++                   * postponed to avoid a delay when <afile> is not used. */
++                  autocmd_fname_full = TRUE;
++                  result = FullName_save(autocmd_fname, FALSE);
++                  vim_free(autocmd_fname);
++                  autocmd_fname = result;
++              }
+               if (result == NULL)
+               {
+                   *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"<afile>\"");
+                   return NULL;
+               }
+@@ -9682,11 +9787,11 @@ arg_all()
+           retval[len] = NUL;
+           break;
+       }
+       /* allocate memory */
+-      retval = alloc(len + 1);
++      retval = alloc((unsigned)len + 1);
+       if (retval == NULL)
+           break;
+     }
+     return retval;
+@@ -10065,11 +10170,11 @@ makeopens(fd, dirnow)
+     /*
+      * Lastly, execute the x.vim file if it exists.
+      */
+     if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL
+           || put_line(fd, "if file_readable(s:sx)") == FAIL
+-          || put_line(fd, "  exe \"source \" . s:sx") == FAIL
++          || put_line(fd, "  exe \"source \" . fnameescape(s:sx)") == FAIL
+           || put_line(fd, "endif") == FAIL)
+       return FAIL;
+     return OK;
+ }
+@@ -10483,10 +10588,13 @@ ses_fname(fd, buf, flagp)
+      * Don't do this after ":lcd", we don't keep track of what the current
+      * directory is. */
+     if (buf->b_sfname != NULL
+           && flagp == &ssop_flags
+           && (ssop_flags & (SSOP_CURDIR | SSOP_SESDIR))
++#ifdef FEAT_AUTOCHDIR
++          && !p_acd
++#endif
+           && !did_lcd)
+       name = buf->b_sfname;
+     else
+       name = buf->b_ffname;
+     if (ses_put_fname(fd, name, flagp) == FAIL || put_eol(fd) == FAIL)
+@@ -10687,11 +10795,12 @@ ex_viminfo(eap)
+     save_viminfo = p_viminfo;
+     if (*p_viminfo == NUL)
+       p_viminfo = (char_u *)"'100";
+     if (eap->cmdidx == CMD_rviminfo)
+     {
+-      if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL)
++      if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS
++                                | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL)
+           EMSG(_("E195: Cannot open viminfo file for reading"));
+     }
+     else
+       write_viminfo(eap->arg, eap->forceit);
+     p_viminfo = save_viminfo;
+@@ -10739,10 +10848,28 @@ ex_behave(eap)
+     }
+     else
+       EMSG2(_(e_invarg2), eap->arg);
+ }
++#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
++/*
++ * Function given to ExpandGeneric() to obtain the possible arguments of the
++ * ":behave {mswin,xterm}" command.
++ */
++    char_u *
++get_behave_arg(xp, idx)
++    expand_T  *xp UNUSED;
++    int               idx;
++{
++    if (idx == 0)
++      return (char_u *)"mswin";
++    if (idx == 1)
++      return (char_u *)"xterm";
++    return NULL;
++}
++#endif
++
+ #ifdef FEAT_AUTOCMD
+ static int filetype_detect = FALSE;
+ static int filetype_plugin = FALSE;
+ static int filetype_indent = FALSE;
+@@ -10848,14 +10975,13 @@ ex_setfiletype(eap)
+     if (!did_filetype)
+       set_option_value((char_u *)"filetype", 0L, eap->arg, OPT_LOCAL);
+ }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"clipboard",   "cb",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_CLIPBOARD
-                           (char_u *)&p_cb, PV_NONE,
- # ifdef FEAT_XCLIPBOARD
-                           {(char_u *)"autoselect,exclude:cons\\|linux",
-@@ -741,435 +745,440 @@ static struct vimoption
- # endif
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
+-/*ARGSUSED*/
+     static void
+ ex_digraphs(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+ #ifdef FEAT_DIGRAPHS
+     if (*eap->arg != NUL)
+       putdigraph(eap->arg);
+     else
+@@ -10885,14 +11011,13 @@ ex_set(eap)
+ #ifdef FEAT_SEARCH_EXTRA
+ /*
+  * ":nohlsearch"
+  */
+-/*ARGSUSED*/
+     static void
+ ex_nohlsearch(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     no_hlsearch = TRUE;
+     redraw_all_later(SOME_VALID);
+ }
+@@ -10967,14 +11092,13 @@ ex_match(eap)
+ #ifdef FEAT_CRYPT
+ /*
+  * ":X": Get crypt key
+  */
+-/*ARGSUSED*/
+     static void
+ ex_X(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     (void)get_crypt_key(TRUE, TRUE);
+ }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"cmdheight",   "ch",   P_NUM|P_VI_DEF|P_RALL,
-                           (char_u *)&p_ch, PV_NONE,
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"cmdwinheight", "cwh", P_NUM|P_VI_DEF,
- #ifdef FEAT_CMDWIN
-                           (char_u *)&p_cwh, PV_NONE,
+--- vim72.orig/src/ex_eval.c
++++ vim72/src/ex_eval.c
+@@ -58,11 +58,13 @@ static char_u      *get_end_emsg __ARGS((stru
+ # define THROW_ON_INTERRUPT   (!eval_to_number("$VIMNOINTTHROW"))
+ # define THROW_TEST
  #else
-                           (char_u *)NULL, PV_NONE,
+ /* Values used for the Vim release. */
+ # define THROW_ON_ERROR               TRUE
++# define THROW_ON_ERROR_TRUE
+ # define THROW_ON_INTERRUPT   TRUE
++# define THROW_ON_INTERRUPT_TRUE
  #endif
--                          {(char_u *)7L, (char_u *)0L}},
-+                          {(char_u *)7L, (char_u *)0L} SCRIPTID_INIT},
-     {"columns",           "co",   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR,
-                           (char_u *)&Columns, PV_NONE,
--                          {(char_u *)80L, (char_u *)0L}},
-+                          {(char_u *)80L, (char_u *)0L} SCRIPTID_INIT},
-     {"comments",    "com",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_COMMENTS
-                           (char_u *)&p_com, PV_COM,
-                           {(char_u *)"s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-",
-                               (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"commentstring", "cms", P_STRING|P_ALLOCED|P_VI_DEF,
- #ifdef FEAT_FOLDING
-                           (char_u *)&p_cms, PV_CMS,
-                           {(char_u *)"/*%s*/", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ static void   catch_exception __ARGS((except_T *excp));
+ static void   finish_exception __ARGS((except_T *excp));
+ static void   discard_exception __ARGS((except_T *excp, int was_finished));
+@@ -1318,20 +1320,24 @@ do_throw(cstack)
+      * if a previous error or interrupt has not been converted to an exception,
+      * inactivate the try conditional, too, as if the conversion had been done,
+      * and reset the did_emsg or got_int flag, so this won't happen again at
+      * the next surrounding try conditional.
+      */
++#ifndef THROW_ON_ERROR_TRUE
+     if (did_emsg && !THROW_ON_ERROR)
+     {
+       inactivate_try = TRUE;
+       did_emsg = FALSE;
+     }
++#endif
++#ifndef THROW_ON_INTERRUPT_TRUE
+     if (got_int && !THROW_ON_INTERRUPT)
+     {
+       inactivate_try = TRUE;
+       got_int = FALSE;
+     }
++#endif
+     idx = cleanup_conditionals(cstack, 0, inactivate_try);
+     if (idx >= 0)
+     {
+       /*
+        * If this try conditional is active and we are before its first
+@@ -2252,14 +2258,13 @@ rewind_conditionals(cstack, idx, cond_ty
+ }
+ /*
+  * ":endfunction" when not after a ":function"
+  */
+-/*ARGSUSED*/
+     void
+ ex_endfunction(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     EMSG(_("E193: :endfunction not inside a function"));
+ }
+ /*
+--- vim72.orig/src/ex_getln.c
++++ vim72/src/ex_getln.c
+@@ -29,18 +29,24 @@ struct cmdline_info
+     int               cmdindent;      /* number of spaces before cmdline */
+     char_u    *cmdprompt;     /* message in front of cmdline */
+     int               cmdattr;        /* attributes for prompt */
+     int               overstrike;     /* Typing mode on the command line.  Shared by
+                                  getcmdline() and put_on_cmdline(). */
++    expand_T  *xpc;           /* struct being used for expansion, xp_pattern
++                                 may point into cmdbuff */
+     int               xp_context;     /* type of expansion */
+ # ifdef FEAT_EVAL
+     char_u    *xp_arg;        /* user-defined expansion arg */
+     int               input_fn;       /* when TRUE Invoked for input() function */
+ # endif
+ };
+-static struct cmdline_info ccline;    /* current cmdline_info */
++/* The current cmdline_info.  It is initialized in getcmdline() and after that
++ * used by other functions.  When invoking getcmdline() recursively it needs
++ * to be saved with save_cmdline() and restored with restore_cmdline().
++ * TODO: make it local to getcmdline() and pass it around. */
++static struct cmdline_info ccline;
+ static int    cmd_showtail;           /* Only show path tail in lists ? */
+ #ifdef FEAT_EVAL
+ static int    new_cmdpos;     /* position set by set_cmdline_pos() */
+@@ -132,15 +138,14 @@ static int       ex_window __ARGS((void));
+  * Careful: getcmdline() can be called recursively!
+  *
+  * Return pointer to allocated string if there is a commandline, NULL
+  * otherwise.
+  */
+-/*ARGSUSED*/
+     char_u *
+ getcmdline(firstc, count, indent)
+     int               firstc;
+-    long      count;          /* only used for incremental search */
++    long      count UNUSED;   /* only used for incremental search */
+     int               indent;         /* indent for inside conditionals */
+ {
+     int               c;
+     int               i;
+     int               j;
+@@ -236,10 +241,11 @@ getcmdline(firstc, count, indent)
+       ccline.cmdspos = indent;
+       ccline.cmdlen = indent;
+     }
+     ExpandInit(&xpc);
++    ccline.xpc = &xpc;
+ #ifdef FEAT_RIGHTLEFT
+     if (curwin->w_p_rl && *curwin->w_p_rlc == 's'
+                                         && (firstc == '/' || firstc == '?'))
+       cmdmsg_rl = TRUE;
+@@ -316,11 +322,11 @@ getcmdline(firstc, count, indent)
+     hiscnt = hislen;          /* set hiscnt to impossible history value */
+     histype = hist_char2type(firstc);
  #endif
--                          },
-+                          SCRIPTID_INIT},
-                           /* P_PRI_MKRC isn't needed here, optval_default()
-                            * always returns TRUE for 'compatible' */
-     {"compatible",  "cp",   P_BOOL|P_RALL,
-                           (char_u *)&p_cp, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)FALSE}},
-+                          {(char_u *)TRUE, (char_u *)FALSE} SCRIPTID_INIT},
-     {"complete",    "cpt",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_INS_EXPAND
-                           (char_u *)&p_cpt, PV_CPT,
-                           {(char_u *)".,w,b,u,t,i", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ #ifdef FEAT_DIGRAPHS
+-    do_digraph(-1);           /* init digraph typahead */
++    do_digraph(-1);           /* init digraph typeahead */
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"completefunc", "cfu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE,
- #ifdef FEAT_COMPL_FUNC
-                           (char_u *)&p_cfu, PV_CFU,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     /*
+      * Collect the command string, handling editing keys.
+      */
+@@ -406,13 +412,14 @@ getcmdline(firstc, count, indent)
+           lookfor = NULL;
+       }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"completeopt",   "cot",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_INS_EXPAND
-                           (char_u *)&p_cot, PV_NONE,
-                           {(char_u *)"menu,preview", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+       /*
+-       * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
++       * When there are matching completions to select <S-Tab> works like
++       * CTRL-P (unless 'wc' is <S-Tab>).
+        */
+-      if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)
++      if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0)
+           c = Ctrl_P;
+ #ifdef FEAT_WILDMENU
+       /* Special translations for 'wildmenu' */
+       if (did_wild_list && p_wmnu)
+@@ -1511,10 +1518,11 @@ getcmdline(firstc, count, indent)
+                   char_u      *p;
+                   int         len;
+                   int         old_firstc;
+                   vim_free(ccline.cmdbuff);
++                  xpc.xp_context = EXPAND_NOTHING;
+                   if (hiscnt == hislen)
+                       p = lookfor;    /* back to the old one */
+                   else
+                       p = history[histype][hiscnt].hisstr;
+@@ -1837,10 +1845,11 @@ returncmd:
+ #ifdef FEAT_FKMAP
+     cmd_fkmap = 0;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"confirm",     "cf",   P_BOOL|P_VI_DEF,
- #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
-                           (char_u *)&p_confirm, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+     ExpandCleanup(&xpc);
++    ccline.xpc = NULL;
+ #ifdef FEAT_SEARCH_EXTRA
+     if (did_incsearch)
+     {
+       curwin->w_cursor = old_cursor;
+@@ -1988,21 +1997,36 @@ text_locked_msg()
+       EMSG(_(e_secure));
+ }
+ #if defined(FEAT_AUTOCMD) || defined(PROTO)
+ /*
+- * Check if "curbuf_lock" is set and return TRUE when it is and give an error
+- * message.
++ * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
++ * and give an error message.
+  */
+     int
+ curbuf_locked()
+ {
+     if (curbuf_lock > 0)
+     {
+       EMSG(_("E788: Not allowed to edit another buffer now"));
+       return TRUE;
+     }
++    return allbuf_locked();
++}
++
++/*
++ * Check if "allbuf_lock" is set and return TRUE when it is and give an error
++ * message.
++ */
++    int
++allbuf_locked()
++{
++    if (allbuf_lock > 0)
++    {
++      EMSG(_("E811: Not allowed to change buffer information now"));
++      return TRUE;
++    }
+     return FALSE;
+ }
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"conskey",           "consk",P_BOOL|P_VI_DEF,
- #ifdef MSDOS
-                           (char_u *)&p_consk, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+     static int
+@@ -2086,15 +2110,14 @@ correct_cmdspos(idx, cells)
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"copyindent",  "ci",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_ci, PV_CI,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"cpoptions",   "cpo",  P_STRING|P_VIM|P_RALL|P_FLAGLIST,
-                           (char_u *)&p_cpo, PV_NONE,
--                          {(char_u *)CPO_VI, (char_u *)CPO_VIM}},
-+                          {(char_u *)CPO_VI, (char_u *)CPO_VIM}
-+                          SCRIPTID_INIT},
-     {"cscopepathcomp", "cspc", P_NUM|P_VI_DEF|P_VIM,
- #ifdef FEAT_CSCOPE
-                           (char_u *)&p_cspc, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+ /*
+  * Get an Ex command line for the ":" command.
+  */
+-/* ARGSUSED */
+     char_u *
+-getexline(c, dummy, indent)
++getexline(c, cookie, indent)
+     int               c;              /* normally ':', NUL for ":append" */
+-    void      *dummy;         /* cookie not used */
++    void      *cookie UNUSED;
+     int               indent;         /* indent for inside conditionals */
+ {
+     /* When executing a register, remove ':' that's in front of each line. */
+     if (exec_from_reg && vpeekc() == ':')
+       (void)vgetc();
+@@ -2105,16 +2128,15 @@ getexline(c, dummy, indent)
+  * Get an Ex command line for Ex mode.
+  * In Ex mode we only use the OS supplied line editing features and no
+  * mappings or abbreviations.
+  * Returns a string in allocated memory or NULL.
+  */
+-/* ARGSUSED */
+     char_u *
+-getexmodeline(promptc, dummy, indent)
++getexmodeline(promptc, cookie, indent)
+     int               promptc;        /* normally ':', NUL for ":append" and '?' for
+                                  :s prompt */
+-    void      *dummy;         /* cookie not used */
++    void      *cookie UNUSED;
+     int               indent;         /* indent for inside conditionals */
+ {
+     garray_T  line_ga;
+     char_u    *pend;
+     int               startcol = 0;
+@@ -2169,11 +2191,10 @@ getexmodeline(promptc, dummy, indent)
+     got_int = FALSE;
+     while (!got_int)
+     {
+       if (ga_grow(&line_ga, 40) == FAIL)
+           break;
+-      pend = (char_u *)line_ga.ga_data + line_ga.ga_len;
+       /* Get one character at a time.  Don't use inchar(), it can't handle
+        * special characters. */
+       prev_char = c1;
+       c1 = vgetc();
+@@ -2506,10 +2527,24 @@ realloc_cmdbuff(len)
+       ccline.cmdbuff = p;             /* keep the old one */
+       return FAIL;
+     }
+     mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1);
+     vim_free(p);
++
++    if (ccline.xpc != NULL
++          && ccline.xpc->xp_pattern != NULL
++          && ccline.xpc->xp_context != EXPAND_NOTHING
++          && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL)
++    {
++      int i = (int)(ccline.xpc->xp_pattern - p);
++
++      /* If xp_pattern points inside the old cmdbuff it needs to be adjusted
++       * to point into the newly allocated memory. */
++      if (i >= 0 && i <= ccline.cmdlen)
++          ccline.xpc->xp_pattern = ccline.cmdbuff + i;
++    }
++
+     return OK;
+ }
+ #if defined(FEAT_ARABIC) || defined(PROTO)
+ static char_u *arshape_buf = NULL;
+@@ -2873,10 +2908,11 @@ save_cmdline(ccp)
+     }
+     *ccp = prev_ccline;
+     prev_ccline = ccline;
+     ccline.cmdbuff = NULL;
+     ccline.cmdprompt = NULL;
++    ccline.xpc = NULL;
+ }
+ /*
+  * Restore ccline after it has been saved with save_cmdline().
+  */
+@@ -3227,11 +3263,10 @@ nextwild(xp, type, options)
+     int               options;        /* extra options for ExpandOne() */
+ {
+     int               i, j;
+     char_u    *p1;
+     char_u    *p2;
+-    int               oldlen;
+     int               difflen;
+     int               v;
+     if (xp->xp_numfiles == -1)
+     {
+@@ -3252,11 +3287,11 @@ nextwild(xp, type, options)
+     MSG_PUTS("...");      /* show that we are busy */
+     out_flush();
+     i = (int)(xp->xp_pattern - ccline.cmdbuff);
+-    oldlen = ccline.cmdpos - i;
++    xp->xp_pattern_len = ccline.cmdpos - i;
+     if (type == WILD_NEXT || type == WILD_PREV)
+     {
+       /*
+        * Get next/previous match for a previous expanded pattern.
+@@ -3266,22 +3301,24 @@ nextwild(xp, type, options)
+     else
+     {
+       /*
+        * Translate string into pattern and expand it.
+        */
+-      if ((p1 = addstar(&ccline.cmdbuff[i], oldlen, xp->xp_context)) == NULL)
++      if ((p1 = addstar(xp->xp_pattern, xp->xp_pattern_len,
++                                                   xp->xp_context)) == NULL)
+           p2 = NULL;
+       else
+       {
+-          p2 = ExpandOne(xp, p1, vim_strnsave(&ccline.cmdbuff[i], oldlen),
++          p2 = ExpandOne(xp, p1,
++                       vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len),
+                   WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT|WILD_ESCAPE
+                                                             |options, type);
+           vim_free(p1);
+-          /* longest match: make sure it is not shorter (happens with :help */
++          /* longest match: make sure it is not shorter, happens with :help */
+           if (p2 != NULL && type == WILD_LONGEST)
+           {
+-              for (j = 0; j < oldlen; ++j)
++              for (j = 0; j < xp->xp_pattern_len; ++j)
+                    if (ccline.cmdbuff[i + j] == '*'
+                            || ccline.cmdbuff[i + j] == '?')
+                        break;
+               if ((int)STRLEN(p2) < j)
+               {
+@@ -3292,11 +3329,11 @@ nextwild(xp, type, options)
+       }
+     }
+     if (p2 != NULL && !got_int)
+     {
+-      difflen = (int)STRLEN(p2) - oldlen;
++      difflen = (int)STRLEN(p2) - xp->xp_pattern_len;
+       if (ccline.cmdlen + difflen > ccline.cmdbufflen - 4)
+       {
+           v = realloc_cmdbuff(ccline.cmdlen + difflen);
+           xp->xp_pattern = ccline.cmdbuff + i;
+       }
+@@ -3580,10 +3617,12 @@ ExpandOne(xp, str, orig, options, mode)
+  */
+     void
+ ExpandInit(xp)
+     expand_T  *xp;
+ {
++    xp->xp_pattern = NULL;
++    xp->xp_pattern_len = 0;
+     xp->xp_backslash = XP_BS_NONE;
+ #ifndef BACKSLASH_IN_FILENAME
+     xp->xp_shell = FALSE;
  #endif
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"cscopeprg",   "csprg", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
- #ifdef FEAT_CSCOPE
-                           (char_u *)&p_csprg, PV_NONE,
-                           {(char_u *)"cscope", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     xp->xp_numfiles = -1;
+@@ -3789,15 +3828,14 @@ tilde_replace(orig_pat, num_files, files
+ /*
+  * Show all matches for completion on the command line.
+  * Returns EXPAND_NOTHING when the character that triggered expansion should
+  * be inserted like a normal character.
+  */
+-/*ARGSUSED*/
+     static int
+ showmatches(xp, wildmenu)
+     expand_T  *xp;
+-    int               wildmenu;
++    int               wildmenu UNUSED;
+ {
+ #define L_SHOWFILE(m) (showtail ? sm_gettail(files_found[m]) : files_found[m])
+     int               num_files;
+     char_u    **files_found;
+     int               i, j, k;
+@@ -3908,12 +3946,30 @@ showmatches(xp, wildmenu)
+                   msg_putchar(' ');
+               if (xp->xp_context == EXPAND_FILES
+                                         || xp->xp_context == EXPAND_SHELLCMD
+                                         || xp->xp_context == EXPAND_BUFFERS)
+               {
+-                          /* highlight directories */
+-                  j = (mch_isdir(files_found[k]));
++                  /* highlight directories */
++                  if (xp->xp_numfiles != -1)
++                  {
++                      char_u  *halved_slash;
++                      char_u  *exp_path;
++
++                      /* Expansion was done before and special characters
++                       * were escaped, need to halve backslashes.  Also
++                       * $HOME has been replaced with ~/. */
++                      exp_path = expand_env_save_opt(files_found[k], TRUE);
++                      halved_slash = backslash_halve_save(
++                              exp_path != NULL ? exp_path : files_found[k]);
++                      j = mch_isdir(halved_slash != NULL ? halved_slash
++                                                          : files_found[k]);
++                      vim_free(exp_path);
++                      vim_free(halved_slash);
++                  }
++                  else
++                      /* Expansion was done here, file names are literal. */
++                      j = mch_isdir(files_found[k]);
+                   if (showtail)
+                       p = L_SHOWFILE(k);
+                   else
+                   {
+                       home_replace(NULL, files_found[k], NameBuff, MAXPATHL,
+@@ -4272,12 +4328,12 @@ expand_cmdline(xp, str, col, matchcount,
+       /* Caller can use the character as a normal char instead */
+       return EXPAND_NOTHING;
+     }
+     /* add star to file name, or convert to regexp if not exp. files. */
+-    file_str = addstar(xp->xp_pattern,
+-                         (int)(str + col - xp->xp_pattern), xp->xp_context);
++    xp->xp_pattern_len = (int)(str + col - xp->xp_pattern);
++    file_str = addstar(xp->xp_pattern, xp->xp_pattern_len, xp->xp_context);
+     if (file_str == NULL)
+       return EXPAND_UNSUCCESSFUL;
+     /* find all files that match the description */
+     if (ExpandFromContext(xp, file_str, matchcount, matches,
+@@ -4381,11 +4437,12 @@ ExpandFromContext(xp, pat, num_file, fil
+       if (xp->xp_context == EXPAND_FILES)
+           flags |= EW_FILE;
+       else
+           flags = (flags | EW_DIR) & ~EW_FILE;
+-      ret = expand_wildcards(1, &pat, num_file, file, flags);
++      /* Expand wildcards, supporting %:h and the like. */
++      ret = expand_wildcards_eval(&pat, num_file, file, flags);
+       if (free_pat)
+           vim_free(pat);
+       return ret;
+     }
+@@ -4451,10 +4508,11 @@ ExpandFromContext(xp, pat, num_file, fil
+           char_u      *((*func)__ARGS((expand_T *, int)));
+           int         ic;
+       } tab[] =
+       {
+           {EXPAND_COMMANDS, get_command_name, FALSE},
++          {EXPAND_BEHAVE, get_behave_arg, TRUE},
+ #ifdef FEAT_USR_CMDS
+           {EXPAND_USER_COMMANDS, get_user_commands, FALSE},
+           {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE},
+           {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE},
+           {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE},
+@@ -4475,10 +4533,19 @@ ExpandFromContext(xp, pat, num_file, fil
+           {EXPAND_HIGHLIGHT, get_highlight_name, TRUE},
+ #ifdef FEAT_AUTOCMD
+           {EXPAND_EVENTS, get_event_name, TRUE},
+           {EXPAND_AUGROUP, get_augroup_name, TRUE},
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"cscopequickfix", "csqf", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #if defined(FEAT_CSCOPE) && defined(FEAT_QUICKFIX)
-                           (char_u *)&p_csqf, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
++#ifdef FEAT_CSCOPE
++          {EXPAND_CSCOPE, get_cscope_name, TRUE},
++#endif
++#ifdef FEAT_SIGNS
++          {EXPAND_SIGN, get_sign_name, TRUE},
++#endif
++#ifdef FEAT_PROFILE
++          {EXPAND_PROFILE, get_profile_name, TRUE},
++#endif
+ #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \
+       && (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE))
+           {EXPAND_LANGUAGE, get_lang_arg, TRUE},
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"cscopetag",   "cst",  P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_CSCOPE
-                           (char_u *)&p_cst, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+           {EXPAND_ENV_VARS, get_env_name, TRUE},
+@@ -4488,11 +4555,11 @@ ExpandFromContext(xp, pat, num_file, fil
+       /*
+        * Find a context in the table and call the ExpandGeneric() with the
+        * right function to do the expansion.
+        */
+       ret = FAIL;
+-      for (i = 0; i < sizeof(tab) / sizeof(struct expgen); ++i)
++      for (i = 0; i < (int)(sizeof(tab) / sizeof(struct expgen)); ++i)
+           if (xp->xp_context == tab[i].context)
+           {
+               if (tab[i].ic)
+                   regmatch.rm_ic = TRUE;
+               ret = ExpandGeneric(xp, &regmatch, num_file, file, tab[i].func);
+@@ -4736,11 +4803,11 @@ call_user_expand_func(user_expand_func,
+       keep = ccline.cmdbuff[ccline.cmdlen];
+       ccline.cmdbuff[ccline.cmdlen] = 0;
+       sprintf((char *)num, "%d", ccline.cmdpos);
+       args[1] = ccline.cmdbuff;
+     }
+-    args[0] = xp->xp_pattern;
++    args[0] = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len);
+     args[2] = num;
+     /* Save the cmdline, we don't know what the function may do. */
+     save_ccline = ccline;
+     ccline.cmdbuff = NULL;
+@@ -4752,10 +4819,11 @@ call_user_expand_func(user_expand_func,
+     ccline = save_ccline;
+     current_SID = save_current_SID;
+     if (ccline.cmdbuff != NULL)
+       ccline.cmdbuff[ccline.cmdlen] = keep;
++    vim_free(args[0]);
+     return ret;
+ }
+ /*
+  * Expand names with a function defined by the user.
+@@ -4829,18 +4897,18 @@ ExpandUserList(xp, num_file, file)
+     ga_init2(&ga, (int)sizeof(char *), 3);
+     /* Loop over the items in the list. */
+     for (li = retlist->lv_first; li != NULL; li = li->li_next)
+     {
+-      if (li->li_tv.v_type != VAR_STRING)
+-          continue;  /* Skip non-string items */
++      if (li->li_tv.v_type != VAR_STRING || li->li_tv.vval.v_string == NULL)
++          continue;  /* Skip non-string items and empty strings */
+       if (ga_grow(&ga, 1) == FAIL)
+           break;
+       ((char_u **)ga.ga_data)[ga.ga_len] =
+-          vim_strsave(li->li_tv.vval.v_string);
++                                       vim_strsave(li->li_tv.vval.v_string);
+       ++ga.ga_len;
+     }
+     list_unref(retlist);
+     *file = ga.ga_data;
+@@ -4869,11 +4937,11 @@ ExpandRTDir(pat, num_file, file, dirname
+     *file = NULL;
+     s = alloc((unsigned)(STRLEN(pat) + STRLEN(dirname) + 7));
+     if (s == NULL)
+       return FAIL;
+     sprintf((char *)s, "%s/%s*.vim", dirname, pat);
+-    all = globpath(p_rtp, s);
++    all = globpath(p_rtp, s, 0);
+     vim_free(s);
+     if (all == NULL)
+       return FAIL;
+     ga_init2(&ga, (int)sizeof(char *), 3);
+@@ -4910,13 +4978,14 @@ ExpandRTDir(pat, num_file, file, dirname
+  * Expand "file" for all comma-separated directories in "path".
+  * Returns an allocated string with all matches concatenated, separated by
+  * newlines.  Returns NULL for an error or no matches.
+  */
+     char_u *
+-globpath(path, file)
++globpath(path, file, expand_options)
+     char_u    *path;
+     char_u    *file;
++    int               expand_options;
+ {
+     expand_T  xpc;
+     char_u    *buf;
+     garray_T  ga;
+     int               i;
+@@ -4941,14 +5010,14 @@ globpath(path, file)
+       copy_option_part(&path, buf, MAXPATHL, ",");
+       if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL)
+       {
+           add_pathsep(buf);
+           STRCAT(buf, file);
+-          if (ExpandFromContext(&xpc, buf, &num_p, &p, WILD_SILENT) != FAIL
+-                                                               && num_p > 0)
++          if (ExpandFromContext(&xpc, buf, &num_p, &p,
++                           WILD_SILENT|expand_options) != FAIL && num_p > 0)
+           {
+-              ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT);
++              ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options);
+               for (len = 0, i = 0; i < num_p; ++i)
+                   len += (int)STRLEN(p[i]) + 1;
+               /* Concatenate new results to previous ones. */
+               if (ga_grow(&ga, len) == OK)
+@@ -5639,11 +5708,11 @@ ex_history(eap)
+       i = *end;
+       *end = NUL;
+       histype1 = get_histtype(arg);
+       if (histype1 == -1)
+       {
+-          if (STRICMP(arg, "all") == 0)
++          if (STRNICMP(arg, "all", STRLEN(arg)) == 0)
+           {
+               histype1 = 0;
+               histype2 = HIST_COUNT-1;
+           }
+           else
+@@ -6018,20 +6087,21 @@ ex_window()
+ # ifdef FEAT_AUTOCMD
+       unblock_autocmds();
+ # endif
+       return K_IGNORE;
+     }
+-    cmdwin_type = ccline.cmdfirstc;
+-    if (cmdwin_type == NUL)
+-      cmdwin_type = '-';
++    cmdwin_type = get_cmdline_type();
+     /* Create the command-line buffer empty. */
+-    (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
++    (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL);
+     (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE);
+     set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
+     set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+     curbuf->b_p_ma = TRUE;
++#ifdef FEAT_FOLDING
++    curwin->w_p_fen = FALSE;
++#endif
+ # ifdef FEAT_RIGHTLEFT
+     curwin->w_p_rl = cmdmsg_rl;
+     cmdmsg_rl = FALSE;
+ # endif
+ # ifdef FEAT_SCROLLBIND
+@@ -6044,11 +6114,11 @@ ex_window()
+ # endif
+     /* Showing the prompt may have set need_wait_return, reset it. */
+     need_wait_return = FALSE;
+-    histtype = hist_char2type(ccline.cmdfirstc);
++    histtype = hist_char2type(cmdwin_type);
+     if (histtype == HIST_CMD || histtype == HIST_DEBUG)
+     {
+       if (p_wc == TAB)
+       {
+           add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT);
+@@ -6198,11 +6268,15 @@ ex_window()
+ # endif
+       wp = curwin;
+       bp = curbuf;
+       win_goto(old_curwin);
+       win_close(wp, TRUE);
+-      close_buffer(NULL, bp, DOBUF_WIPE);
++
++      /* win_close() may have already wiped the buffer when 'bh' is
++       * set to 'wipe' */
++      if (buf_valid(bp))
++          close_buffer(NULL, bp, DOBUF_WIPE);
+       /* Restore window sizes. */
+       win_size_restore(&winsizes);
+ # ifdef FEAT_AUTOCMD
+--- vim72.orig/src/farsi.c
++++ vim72/src/farsi.c
+@@ -101,11 +101,12 @@ toF_Xor_X_(c)
+       case IE_:
+               return _IE;
+       case F_HE:
+               tempc = _HE;
+-              if (p_ri && (curwin->w_cursor.col+1 < STRLEN(ml_get_curline())))
++              if (p_ri && (curwin->w_cursor.col + 1
++                                       < (colnr_T)STRLEN(ml_get_curline())))
+               {
+                   inc_cursor();
+                   if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
+                       tempc = _HE_;
+@@ -342,11 +343,11 @@ put_curr_and_l_to_X(c)
+     int       tempc;
+     if (curwin->w_p_rl && p_ri)
+       return;
+-    if ( (curwin->w_cursor.col < STRLEN(ml_get_curline())))
++    if ((curwin->w_cursor.col < (colnr_T)STRLEN(ml_get_curline())))
+     {
+       if ((p_ri && curwin->w_cursor.col) || !p_ri)
+       {
+           if (p_ri)
+               dec_cursor();
+@@ -563,11 +564,11 @@ chg_c_to_X_or_X ()
+ {
+     int       tempc;
+     tempc = gchar_cursor();
+-    if (curwin->w_cursor.col+1 < STRLEN(ml_get_curline()))
++    if (curwin->w_cursor.col + 1 < (colnr_T)STRLEN(ml_get_curline()))
+     {
+       inc_cursor();
+       if ((tempc == F_HE) && (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)))
+       {
+@@ -592,12 +593,12 @@ chg_c_to_X_or_X ()
+     static void
+ chg_l_to_X_orX_ ()
+ {
+     int       tempc;
+-    if (!curwin->w_cursor.col &&
+-      (curwin->w_cursor.col+1 == STRLEN(ml_get_curline())))
++    if (curwin->w_cursor.col != 0 &&
++      (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
+       return;
+     if (!curwin->w_cursor.col && p_ri)
+       return;
+@@ -661,12 +662,12 @@ chg_l_to_X_orX_ ()
+     static void
+ chg_l_toXor_X ()
+ {
+     int       tempc;
+-    if (!curwin->w_cursor.col &&
+-      (curwin->w_cursor.col+1 == STRLEN(ml_get_curline())))
++    if (curwin->w_cursor.col != 0 &&
++      (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
+       return;
+     if (!curwin->w_cursor.col && p_ri)
+       return;
+--- vim72.orig/src/feature.h
++++ vim72/src/feature.h
+@@ -765,13 +765,17 @@
+ # define FEAT_GUI_TABLINE
  #endif
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"cscopetagorder", "csto", P_NUM|P_VI_DEF|P_VIM,
- #ifdef FEAT_CSCOPE
-                           (char_u *)&p_csto, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+ /*
+  * +browse            ":browse" command.
++ *                    or just the ":browse" command modifier
+  */
+-#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC))
+-# define FEAT_BROWSE
++#if defined(FEAT_NORMAL)
++# define FEAT_BROWSE_CMD
++# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
++#  define FEAT_BROWSE
++# endif
  #endif
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"cscopeverbose", "csverb", P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_CSCOPE
-                           (char_u *)&p_csverbose, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+ /*
+  * +dialog_gui                Use GUI dialog.
+  * +dialog_con                May use Console dialog.
+@@ -838,14 +842,18 @@
+  * DEBUG              Output a lot of debugging garbage.
+  */
+ /* #define DEBUG */
+ /*
+- * STARTUPTIME                Time the startup process.  Writes a "vimstartup" file
+- *                    with timestamps.
++ * STARTUPTIME                Time the startup process.  Writes a file with
++ *                    timestamps.
+  */
+-/* #define STARTUPTIME "vimstartup" */
++#if defined(FEAT_NORMAL) \
++      && ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)) \
++              || defined(WIN3264))
++# define STARTUPTIME 1
++#endif
+ /*
+  * MEM_PROFILE                Debugging of memory allocation and freeing.
+  */
+ /* #define MEM_PROFILE */
+--- vim72.orig/src/fileio.c
++++ vim72/src/fileio.c
+@@ -19,11 +19,11 @@
+ # include "vimio.h"   /* for mktemp(), CJW 1997-12-03 */
  #endif
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"cursorcolumn", "cuc", P_BOOL|P_VI_DEF|P_RWIN,
- #ifdef FEAT_SYN_HL
-                           (char_u *)VAR_WIN, PV_CUC,
- #else
-                           (char_u *)NULL, PV_NONE,
+ #include "vim.h"
+-#ifdef __TANDEM
++#if defined(__TANDEM) || defined(__MINT__)
+ # include <limits.h>          /* for SSIZE_MAX */
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"cursorline",   "cul", P_BOOL|P_VI_DEF|P_RWIN,
- #ifdef FEAT_SYN_HL
-                           (char_u *)VAR_WIN, PV_CUL,
- #else
-                           (char_u *)NULL, PV_NONE,
+ #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
+ # include <utime.h>           /* for struct utimbuf */
+@@ -67,11 +67,11 @@ static int time_differs __ARGS((long t1,
+ #ifdef FEAT_AUTOCMD
+ static int apply_autocmds_exarg __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap));
+ static int au_find_group __ARGS((char_u *name));
+ # define AUGROUP_DEFAULT    -1            /* default autocmd group */
+-# define AUGROUP_ERROR            -2      /* errornouse autocmd group */
++# define AUGROUP_ERROR            -2      /* erroneous autocmd group */
+ # define AUGROUP_ALL      -3      /* all autocmd groups */
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"debug",     NULL,   P_STRING|P_VI_DEF,
-                           (char_u *)&p_debug, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"define",            "def",  P_STRING|P_ALLOCED|P_VI_DEF,
- #ifdef FEAT_FIND_ID
-                           (char_u *)&p_def, PV_DEF,
-                           {(char_u *)"^\\s*#\\s*define", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+ #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
+ # define HAS_BW_FLAGS
+@@ -119,10 +119,12 @@ struct bw_info
+     int               bw_restlen;     /* nr of bytes in bw_rest[] */
+     int               bw_first;       /* first write call */
+     char_u    *bw_conv_buf;   /* buffer for writing converted chars */
+     int               bw_conv_buflen; /* size of bw_conv_buf */
+     int               bw_conv_error;  /* set for conversion error */
++    linenr_T  bw_conv_error_lnum;  /* first line with error or zero */
++    linenr_T  bw_start_lnum;  /* line number at start of buffer */
+ # ifdef USE_ICONV
+     iconv_t   bw_iconv_fd;    /* descriptor for iconv() or -1 */
+ # endif
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"delcombine", "deco",  P_BOOL|P_VI_DEF|P_VIM,
+ };
+@@ -130,11 +132,11 @@ struct bw_info
+ static int  buf_write_bytes __ARGS((struct bw_info *ip));
  #ifdef FEAT_MBYTE
-                           (char_u *)&p_deco, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"dictionary",  "dict", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_INS_EXPAND
-                           (char_u *)&p_dict, PV_DICT,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"diff",      NULL,   P_BOOL|P_VI_DEF|P_RWIN|P_NOGLOB,
- #ifdef FEAT_DIFF
-                           (char_u *)VAR_WIN, PV_DIFF,
- #else
-                           (char_u *)NULL, PV_NONE,
+ static linenr_T readfile_linenr __ARGS((linenr_T linecnt, char_u *p, char_u *endp));
+ static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags));
+-static int same_encoding __ARGS((char_u *a, char_u *b));
++static int need_conversion __ARGS((char_u *fenc));
+ static int get_fio_flags __ARGS((char_u *ptr));
+ static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags));
+ static int make_bom __ARGS((char_u *buf, char_u *name));
+ # ifdef WIN3264
+ static int get_win_fio_flags __ARGS((char_u *ptr));
+@@ -142,11 +144,16 @@ static int get_win_fio_flags __ARGS((cha
+ # ifdef MACOS_X
+ static int get_mac_fio_flags __ARGS((char_u *ptr));
+ # endif
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"diffexpr",    "dex",  P_STRING|P_VI_DEF|P_SECURE,
- #if defined(FEAT_DIFF) && defined(FEAT_EVAL)
-                           (char_u *)&p_dex, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
+-
++#ifdef TEMPDIRNAMES
++static void vim_settempdir __ARGS((char_u *tempdir));
++#endif
++#ifdef FEAT_AUTOCMD
++static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
++#endif
+     void
+ filemess(buf, name, s, attr)
+     buf_T     *buf;
+     char_u    *name;
+@@ -293,10 +300,23 @@ readfile(fname, sfname, from, lines_to_s
+                                          wasn't possible */
+     char_u    conv_rest[CONV_RESTLEN];
+     int               conv_restlen = 0;       /* nr of bytes in conv_rest[] */
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"diffopt",           "dip",  P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN|P_COMMA|P_NODUP,
- #ifdef FEAT_DIFF
-                           (char_u *)&p_dip, PV_NONE,
-                           {(char_u *)"filler", (char_u *)NULL}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)"", (char_u *)NULL}
++#ifdef FEAT_AUTOCMD
++    /* Remember the initial values of curbuf, curbuf->b_ffname and
++     * curbuf->b_fname to detect whether they are altered as a result of
++     * executing nasty autocommands.  Also check if "fname" and "sfname"
++     * point to one of these values. */
++    buf_T   *old_curbuf = curbuf;
++    char_u  *old_b_ffname = curbuf->b_ffname;
++    char_u  *old_b_fname = curbuf->b_fname;
++    int     using_b_ffname = (fname == curbuf->b_ffname)
++                                            || (sfname == curbuf->b_ffname);
++    int     using_b_fname = (fname == curbuf->b_fname)
++                                             || (sfname == curbuf->b_fname);
++#endif
+     write_no_eol_lnum = 0;    /* in case it was set by the previous read */
+     /*
+      * If there is no file name yet, use the one for the read file.
+      * BF_NOTEDITED is set to reflect this.
+@@ -587,11 +607,25 @@ readfile(fname, sfname, from, lines_to_s
+                    * that we are editing this file.  Don't do this for a
+                    * "nofile" or "nowrite" buffer type. */
+ #ifdef FEAT_QUICKFIX
+                   if (!bt_dontwrite(curbuf))
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"digraph",           "dg",   P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_DIGRAPHS
-                           (char_u *)&p_dg, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
++                  {
+                       check_need_swap(newfile);
++#ifdef FEAT_AUTOCMD
++                      /* SwapExists autocommand may mess things up */
++                      if (curbuf != old_curbuf
++                              || (using_b_ffname
++                                      && (old_b_ffname != curbuf->b_ffname))
++                              || (using_b_fname
++                                       && (old_b_fname != curbuf->b_fname)))
++                      {
++                          EMSG(_(e_auchangedbuf));
++                          return FAIL;
++                      }
++#endif
++                  }
+                   if (dir_of_file_exists(fname))
+                       filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
+                   else
+                       filemess(curbuf, sfname,
+                                          (char_u *)_("[New DIRECTORY]"), 0);
+@@ -666,13 +700,25 @@ readfile(fname, sfname, from, lines_to_s
+ #ifdef FEAT_QUICKFIX
+     if (!bt_dontwrite(curbuf))
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"directory",   "dir",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP|P_SECURE,
-                           (char_u *)&p_dir, PV_NONE,
--                          {(char_u *)DFLT_DIR, (char_u *)0L}},
-+                          {(char_u *)DFLT_DIR, (char_u *)0L} SCRIPTID_INIT},
-     {"display",           "dy",   P_STRING|P_VI_DEF|P_COMMA|P_RALL|P_NODUP,
-                           (char_u *)&p_dy, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"eadirection", "ead",  P_STRING|P_VI_DEF,
- #ifdef FEAT_VERTSPLIT
-                           (char_u *)&p_ead, PV_NONE,
-                           {(char_u *)"both", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"edcompatible","ed",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_ed, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"encoding",    "enc",  P_STRING|P_VI_DEF|P_RCLR,
- #ifdef FEAT_MBYTE
-                           (char_u *)&p_enc, PV_NONE,
-                           {(char_u *)ENC_DFLT, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     {
+       check_need_swap(newfile);
++#ifdef FEAT_AUTOCMD
++      if (!read_stdin && (curbuf != old_curbuf
++              || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
++              || (using_b_fname && (old_b_fname != curbuf->b_fname))))
++      {
++          EMSG(_(e_auchangedbuf));
++          if (!read_buffer)
++              close(fd);
++          return FAIL;
++      }
++#endif
+ #ifdef UNIX
+       /* Set swap file protection bits after creating it. */
+-      if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
++      if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
++                        && curbuf->b_ml.ml_mfp->mf_fname != NULL)
+           (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"endofline",   "eol",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
-                           (char_u *)&p_eol, PV_EOL,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"equalalways", "ea",   P_BOOL|P_VI_DEF|P_RALL,
-                           (char_u *)&p_ea, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"equalprg",    "ep",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_ep, PV_EP,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"errorbells",  "eb",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_eb, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"errorfile",   "ef",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
- #ifdef FEAT_QUICKFIX
-                           (char_u *)&p_ef, PV_NONE,
-                           {(char_u *)DFLT_ERRORFILE, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+     }
+ #if defined(HAS_SWAP_EXISTS_ACTION)
+@@ -696,11 +742,10 @@ readfile(fname, sfname, from, lines_to_s
+ #ifdef FEAT_AUTOCMD
+     if (!read_buffer)
+     {
+       int     m = msg_scroll;
+       int     n = msg_scrolled;
+-      buf_T   *old_curbuf = curbuf;
+       /*
+        * The file must be closed again, the autocommands may want to change
+        * the file before reading it.
+        */
+@@ -738,12 +783,17 @@ readfile(fname, sfname, from, lines_to_s
+       }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"errorformat", "efm",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_QUICKFIX
-                           (char_u *)&p_efm, PV_EFM,
--                          {(char_u *)DFLT_EFM, (char_u *)0L},
-+                          {(char_u *)DFLT_EFM, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+       /*
+        * Don't allow the autocommands to change the current buffer.
+        * Try to re-open the file.
++       *
++       * Don't allow the autocommands to change the buffer name either
++       * (cd for example) if it invalidates fname or sfname.
+        */
+       if (!read_stdin && (curbuf != old_curbuf
++              || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
++              || (using_b_fname && (old_b_fname != curbuf->b_fname))
+               || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
+       {
+           --no_wait_return;
+           msg_scroll = msg_save;
+           if (fd < 0)
+@@ -930,11 +980,14 @@ retry:
+     if (keep_fileformat)
+       keep_fileformat = FALSE;
+     else
+     {
+       if (eap != NULL && eap->force_ff != 0)
++      {
+           fileformat = get_fileformat_force(curbuf, eap);
++          try_unix = try_dos = try_mac = FALSE;
++      }
+       else if (curbuf->b_p_bin)
+           fileformat = EOL_UNIX;              /* binary: use Unix format */
+       else if (*p_ffs == NUL)
+           fileformat = get_fileformat(curbuf);/* use format from buffer */
+       else
+@@ -991,17 +1044,16 @@ retry:
+           tmpname = NULL;
+       }
+     }
+     /*
+-     * Conversion is required when the encoding of the file is different
+-     * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4 (requires
+-     * conversion to UTF-8).
++     * Conversion may be required when the encoding of the file is different
++     * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4.
+      */
+     fio_flags = 0;
+-    converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
+-    if (converted || enc_unicode != 0)
++    converted = need_conversion(fenc);
++    if (converted)
+     {
+       /* "ucs-bom" means we need to check the first bytes of the file
+        * for a BOM. */
+       if (STRCMP(fenc, ENC_UCSBOM) == 0)
+@@ -2202,18 +2254,26 @@ failed:
+ # endif
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"esckeys",           "ek",   P_BOOL|P_VIM,
-                           (char_u *)&p_ek, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)TRUE}},
-+                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
-     {"eventignore", "ei",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_AUTOCMD
-                           (char_u *)&p_ei, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+     if (!read_buffer && !read_stdin)
+       close(fd);                              /* errors are ignored */
++#ifdef HAVE_FD_CLOEXEC
++    else
++    {
++      int fdflags = fcntl(fd, F_GETFD);
++      if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
++          fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
++    }
++#endif
+     vim_free(buffer);
+ #ifdef HAVE_DUP
+     if (read_stdin)
+     {
+       /* Use stderr for stdin, makes shell commands work. */
+       close(0);
+-      dup(2);
++      ignored = dup(2);
+     }
  #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"expandtab",   "et",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_et, PV_ET,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"exrc",      "ex",   P_BOOL|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_exrc, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"fileencoding","fenc", P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_RBUF|P_NO_MKRC,
  #ifdef FEAT_MBYTE
-                           (char_u *)&p_fenc, PV_FENC,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     if (tmpname != NULL)
+@@ -2339,15 +2399,10 @@ failed:
+           if (ff_error == EOL_DOS)
+           {
+               STRCAT(IObuff, _("[CR missing]"));
+               c = TRUE;
+           }
+-          if (ff_error == EOL_MAC)
+-          {
+-              STRCAT(IObuff, _("[NL found]"));
+-              c = TRUE;
+-          }
+           if (split)
+           {
+               STRCAT(IObuff, _("[long lines split]"));
+               c = TRUE;
+           }
+@@ -2709,11 +2764,11 @@ readfile_charconvert(fname, fenc, fdp)
+     static void
+ check_marks_read()
+ {
+     if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
+                                                 && curbuf->b_ffname != NULL)
+-      read_viminfo(NULL, FALSE, TRUE, FALSE);
++      read_viminfo(NULL, VIF_WANT_MARKS);
+     /* Always set b_marks_read; needed when 'viminfo' is changed to include
+      * the ' parameter after opening a buffer. */
+     curbuf->b_marks_read = TRUE;
+ }
+@@ -2879,10 +2934,11 @@ buf_write(buf, fname, sfname, start, end
+     char_u        c;
+     int                   len;
+     linenr_T      lnum;
+     long          nchars;
+     char_u        *errmsg = NULL;
++    int                   errmsg_allocated = FALSE;
+     char_u        *errnum = NULL;
+     char_u        *buffer;
+     char_u        smallbuf[SMBUFSIZE];
+     char_u        *backup_ext;
+     int                   bufsize;
+@@ -2923,10 +2979,17 @@ buf_write(buf, fname, sfname, start, end
+                                          backup or new file */
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"fileencodings","fencs", P_STRING|P_VI_DEF|P_COMMA,
+     if (fname == NULL || *fname == NUL)       /* safety check */
+       return FAIL;
++    if (buf->b_ml.ml_mfp == NULL)
++    {
++      /* This can happen during startup when there is a stray "w" in the
++       * vimrc file. */
++      EMSG(_(e_emptybuf));
++      return FAIL;
++    }
+     /*
+      * Disallow writing from .exrc and .vimrc in current directory for
+      * security reasons.
+      */
+@@ -2942,10 +3005,11 @@ buf_write(buf, fname, sfname, start, end
  #ifdef FEAT_MBYTE
-                           (char_u *)&p_fencs, PV_NONE,
-                           {(char_u *)"ucs-bom", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */
+     write_info.bw_conv_buf = NULL;
+     write_info.bw_conv_error = FALSE;
++    write_info.bw_conv_error_lnum = 0;
+     write_info.bw_restlen = 0;
+ # ifdef USE_ICONV
+     write_info.bw_iconv_fd = (iconv_t)-1;
+ # endif
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"fileformat",  "ff",   P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_NO_MKRC,
-                           (char_u *)&p_ff, PV_FF,
--                          {(char_u *)DFLT_FF, (char_u *)0L}},
-+                          {(char_u *)DFLT_FF, (char_u *)0L} SCRIPTID_INIT},
-     {"fileformats", "ffs",  P_STRING|P_VIM|P_COMMA|P_NODUP,
-                           (char_u *)&p_ffs, PV_NONE,
--                          {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM}},
-+                          {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM}
-+                          SCRIPTID_INIT},
-     {"filetype",    "ft",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
- #ifdef FEAT_AUTOCMD
-                           (char_u *)&p_ft, PV_FT,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+@@ -3449,16 +3513,16 @@ buf_write(buf, fname, sfname, start, end
+                   backup_copy = TRUE;
+               else
+               {
+ # ifdef UNIX
+ #  ifdef HAVE_FCHOWN
+-                  fchown(fd, st_old.st_uid, st_old.st_gid);
++                  ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
+ #  endif
+                   if (mch_stat((char *)IObuff, &st) < 0
+                           || st.st_uid != st_old.st_uid
+                           || st.st_gid != st_old.st_gid
+-                          || st.st_mode != perm)
++                          || (long)st.st_mode != perm)
+                       backup_copy = TRUE;
+ # endif
+                   /* Close the file before removing it, on MS-Windows we
+                    * can't delete an open file. */
+                   close(fd);
+@@ -3920,14 +3984,13 @@ buf_write(buf, fname, sfname, start, end
+     }
+     else
+       fenc = buf->b_p_fenc;
+     /*
+-     * The file needs to be converted when 'fileencoding' is set and
+-     * 'fileencoding' differs from 'encoding'.
++     * Check if the file needs to be converted.
+      */
+-    converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
++    converted = need_conversion(fenc);
+     /*
+      * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done.  Or
+      * Latin1 to Unicode conversion.  This is handled in buf_write_bytes().
+      * Prepare the flags for it and allocate bw_conv_buf when needed.
+@@ -4198,10 +4261,11 @@ restore_backup:
+               end = 0;
+           else
+               nchars += write_info.bw_len;
+       }
+     }
++    write_info.bw_start_lnum = start;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"fillchars",   "fcs",  P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP,
- #if defined(FEAT_WINDOWS) || defined(FEAT_FOLDING)
-                           (char_u *)&p_fcs, PV_NONE,
-                           {(char_u *)"vert:|,fold:-", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
+     write_info.bw_len = bufsize;
+ #ifdef HAS_BW_FLAGS
+     write_info.bw_flags = wb_flags;
+@@ -4233,10 +4297,13 @@ restore_backup:
+               break;
+           }
+           nchars += bufsize;
+           s = buffer;
+           len = 0;
++#ifdef FEAT_MBYTE
++          write_info.bw_start_lnum = lnum;
++#endif
+       }
+       /* write failed or last line has no EOL: stop here */
+       if (end == 0
+               || (lnum == end
+                   && write_bin
+@@ -4365,18 +4432,18 @@ restore_backup:
+        * permission or ACL stuff */
+       if (mch_stat((char *)wfname, &st) < 0
+               || st.st_uid != st_old.st_uid
+               || st.st_gid != st_old.st_gid)
+       {
+-          fchown(fd, st_old.st_uid, st_old.st_gid);
++          ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
+           if (perm >= 0)      /* set permission again, may have changed */
+               (void)mch_setperm(wfname, perm);
+       }
+ # endif
+       buf_setino(buf);
+     }
+-    else if (buf->b_dev < 0)
++    else if (!buf->b_dev_valid)
+       /* Set the inode when creating a new file. */
+       buf_setino(buf);
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"fkmap",     "fk",   P_BOOL|P_VI_DEF,
- #ifdef FEAT_FKMAP
-                           (char_u *)&p_fkmap, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+     if (close(fd) != 0)
+@@ -4429,11 +4496,21 @@ restore_backup:
+     {
+       if (errmsg == NULL)
+       {
+ #ifdef FEAT_MBYTE
+           if (write_info.bw_conv_error)
+-              errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)");
++          {
++              if (write_info.bw_conv_error_lnum == 0)
++                  errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)");
++              else
++              {
++                  errmsg_allocated = TRUE;
++                  errmsg = alloc(300);
++                  vim_snprintf((char *)errmsg, 300, _("E513: write error, conversion failed in line %ld (make 'fenc' empty to override)"),
++                                       (long)write_info.bw_conv_error_lnum);
++              }
++          }
+           else
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"flash",     "fl",   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
- #ifdef FEAT_FOLDING
-     {"foldclose",   "fcl",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP|P_RWIN,
-                           (char_u *)&p_fcl, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"foldcolumn",  "fdc",  P_NUM|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_FDC,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"foldenable",  "fen",  P_BOOL|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_FEN,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"foldexpr",    "fde",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
+               if (got_int)
+                   errmsg = (char_u *)_(e_interr);
+               else
+@@ -4505,10 +4582,16 @@ restore_backup:
+ #ifdef FEAT_MBYTE
+       if (write_info.bw_conv_error)
+       {
+           STRCAT(IObuff, _(" CONVERSION ERROR"));
+           c = TRUE;
++          if (write_info.bw_conv_error_lnum != 0)
++          {
++              size_t l = STRLEN(IObuff);
++              vim_snprintf((char *)IObuff + l, IOSIZE - l, _(" in line %ld;"),
++                      (long)write_info.bw_conv_error_lnum);
++          }
+       }
+       else if (notconverted)
+       {
+           STRCAT(IObuff, _("[NOT converted]"));
+           c = TRUE;
+@@ -4701,10 +4784,12 @@ nofail:
+           STRMOVE(IObuff + numlen, IObuff);
+           mch_memmove(IObuff, errnum, (size_t)numlen);
+       }
+       STRCAT(IObuff, errmsg);
+       emsg(IObuff);
++      if (errmsg_allocated)
++          vim_free(errmsg);
+       retval = FAIL;
+       if (end == 0)
+       {
+           MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"),
+@@ -4780,18 +4865,26 @@ nofail:
+ set_rw_fname(fname, sfname)
+     char_u    *fname;
+     char_u    *sfname;
+ {
+ #ifdef FEAT_AUTOCMD
++    buf_T     *buf = curbuf;
++
+     /* It's like the unnamed buffer is deleted.... */
+     if (curbuf->b_p_bl)
+       apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
+     apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
  # ifdef FEAT_EVAL
-                           (char_u *)VAR_WIN, PV_FDE,
-                           {(char_u *)"0", (char_u *)NULL}
- # else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+     if (aborting())       /* autocmds may abort script processing */
+       return FAIL;
  # endif
--                          },
-+                          SCRIPTID_INIT},
-     {"foldignore",  "fdi",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_FDI,
--                          {(char_u *)"#", (char_u *)NULL}},
-+                          {(char_u *)"#", (char_u *)NULL} SCRIPTID_INIT},
-     {"foldlevel",   "fdl",  P_NUM|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_FDL,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"foldlevelstart","fdls", P_NUM|P_VI_DEF,
-                           (char_u *)&p_fdls, PV_NONE,
--                          {(char_u *)-1L, (char_u *)0L}},
-+                          {(char_u *)-1L, (char_u *)0L} SCRIPTID_INIT},
-     {"foldmarker",  "fmr",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|
-                                                      P_RWIN|P_COMMA|P_NODUP,
-                           (char_u *)VAR_WIN, PV_FMR,
--                          {(char_u *)"{{{,}}}", (char_u *)NULL}},
-+                          {(char_u *)"{{{,}}}", (char_u *)NULL}
-+                          SCRIPTID_INIT},
-     {"foldmethod",  "fdm",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_FDM,
--                          {(char_u *)"manual", (char_u *)NULL}},
-+                          {(char_u *)"manual", (char_u *)NULL} SCRIPTID_INIT},
-     {"foldminlines","fml",  P_NUM|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_FML,
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"foldnestmax", "fdn",  P_NUM|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_FDN,
--                          {(char_u *)20L, (char_u *)0L}},
-+                          {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT},
-     {"foldopen",    "fdo",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_fdo, PV_NONE,
-                {(char_u *)"block,hor,mark,percent,quickfix,search,tag,undo",
--                                                             (char_u *)0L}},
-+                                               (char_u *)0L} SCRIPTID_INIT},
-     {"foldtext",    "fdt",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
- # ifdef FEAT_EVAL
-                           (char_u *)VAR_WIN, PV_FDT,
-                           {(char_u *)"foldtext()", (char_u *)NULL}
- # else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- # endif
--                          },
-+                          SCRIPTID_INIT},
++    if (curbuf != buf)
++    {
++      /* We are in another buffer now, don't do the renaming. */
++      EMSG(_(e_auchangedbuf));
++      return FAIL;
++    }
  #endif
-     {"formatexpr", "fex",   P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
- #ifdef FEAT_EVAL
-                           (char_u *)&p_fex, PV_FEX,
-                           {(char_u *)"", (char_u *)0L}
+     if (setfname(curbuf, fname, sfname, FALSE) == OK)
+       curbuf->b_flags |= BF_NOTEDITED;
+@@ -5052,11 +5145,17 @@ buf_write_bytes(ip)
+                       c = utf_ptr2char(buf + wlen);
+                   else
+                       c = buf[wlen];
+               }
+-              ip->bw_conv_error |= ucs2bytes(c, &p, flags);
++              if (ucs2bytes(c, &p, flags) && !ip->bw_conv_error)
++              {
++                  ip->bw_conv_error = TRUE;
++                  ip->bw_conv_error_lnum = ip->bw_start_lnum;
++              }
++              if (c == NL)
++                  ++ip->bw_start_lnum;
+           }
+           if (flags & FIO_LATIN1)
+               len = (int)(p - buf);
+           else
+           {
+@@ -5244,17 +5343,20 @@ buf_write_bytes(ip)
+           size_t      tolen;
+           /* Convert with iconv(). */
+           if (ip->bw_restlen > 0)
+           {
++              char *fp;
++
+               /* Need to concatenate the remainder of the previous call and
+                * the bytes of the current call.  Use the end of the
+                * conversion buffer for this. */
+               fromlen = len + ip->bw_restlen;
+-              from = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
+-              mch_memmove((void *)from, ip->bw_rest, (size_t)ip->bw_restlen);
+-              mch_memmove((void *)(from + ip->bw_restlen), buf, (size_t)len);
++              fp = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
++              mch_memmove(fp, ip->bw_rest, (size_t)ip->bw_restlen);
++              mch_memmove(fp + ip->bw_restlen, buf, (size_t)len);
++              from = fp;
+               tolen = ip->bw_conv_buflen - fromlen;
+           }
+           else
+           {
+               from = (const char *)buf;
+@@ -5330,10 +5432,11 @@ buf_write_bytes(ip)
+ }
+ #ifdef FEAT_MBYTE
+ /*
+  * Convert a Unicode character to bytes.
++ * Return TRUE for an error, FALSE when it's OK.
+  */
+     static int
+ ucs2bytes(c, pp, flags)
+     unsigned  c;              /* in: character */
+     char_u    **pp;           /* in/out: pointer to result */
+@@ -5413,24 +5516,41 @@ ucs2bytes(c, pp, flags)
+     *pp = p;
+     return error;
+ }
+ /*
+- * Return TRUE if "a" and "b" are the same 'encoding'.
+- * Ignores difference between "ansi" and "latin1", "ucs-4" and "ucs-4be", etc.
++ * Return TRUE if file encoding "fenc" requires conversion from or to
++ * 'encoding'.
+  */
+     static int
+-same_encoding(a, b)
+-    char_u    *a;
+-    char_u    *b;
++need_conversion(fenc)
++    char_u    *fenc;
+ {
+-    int               f;
++    int               same_encoding;
++    int               enc_flags;
++    int               fenc_flags;
+-    if (STRCMP(a, b) == 0)
+-      return TRUE;
+-    f = get_fio_flags(a);
+-    return (f != 0 && get_fio_flags(b) == f);
++    if (*fenc == NUL || STRCMP(p_enc, fenc) == 0)
++      same_encoding = TRUE;
++    else
++    {
++      /* Ignore difference between "ansi" and "latin1", "ucs-4" and
++       * "ucs-4be", etc. */
++      enc_flags = get_fio_flags(p_enc);
++      fenc_flags = get_fio_flags(fenc);
++      same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
++    }
++    if (same_encoding)
++    {
++      /* Specified encoding matches with 'encoding'.  This requires
++       * conversion when 'encoding' is Unicode but not UTF-8. */
++      return enc_unicode != 0;
++    }
++
++    /* Encodings differ.  However, conversion is not needed when 'enc' is any
++     * Unicode encoding and the file is UTF-8. */
++    return !(enc_utf8 && fenc_flags == FIO_UTF8);
+ }
+ /*
+  * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the
+  * internal conversion.
+@@ -5548,13 +5668,14 @@ check_for_bom(p, size, lenp, flags)
+           && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L)))
+       {
+           name = "ucs-4le";   /* FF FE 00 00 */
+           len = 4;
+       }
+-      else if (flags == FIO_ALL || flags == (FIO_UCS2 | FIO_ENDIAN_L))
++      else if (flags == (FIO_UCS2 | FIO_ENDIAN_L))
+           name = "ucs-2le";   /* FF FE */
+-      else if (flags == (FIO_UTF16 | FIO_ENDIAN_L))
++      else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L))
++          /* utf-16le is preferred, it also works for ucs-2le text */
+           name = "utf-16le";  /* FF FE */
+     }
+     else if (p[0] == 0xfe && p[1] == 0xff
+           && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16))
+     {
+@@ -5915,11 +6036,11 @@ buf_modname(shortname, fname, ext, prepe
+       else if (*ext == '/' || *ext == '_')
  #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+       else if (*ext == '.')
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"formatoptions","fo",  P_STRING|P_ALLOCED|P_VIM|P_FLAGLIST,
-                           (char_u *)&p_fo, PV_FO,
--                          {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}},
-+                          {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}
-+                          SCRIPTID_INIT},
-     {"formatlistpat","flp", P_STRING|P_ALLOCED|P_VI_DEF,
-                           (char_u *)&p_flp, PV_FLP,
--                          {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*", (char_u *)0L}},
-+                          {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*",
-+                                               (char_u *)0L} SCRIPTID_INIT},
-     {"formatprg",   "fp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_fp, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"fsync",       "fs",   P_BOOL|P_SECURE|P_VI_DEF,
- #ifdef HAVE_FSYNC
-                           (char_u *)&p_fs, PV_NONE,
-                           {(char_u *)TRUE, (char_u *)0L}
+       {
+-          if (s - ptr > (size_t)8)
++          if ((size_t)(s - ptr) > (size_t)8)
+           {
+               s = ptr + 8;
+               *s = '\0';
+           }
+       }
+@@ -6029,13 +6150,13 @@ vim_fgets(buf, size, fp)
+       /* Now throw away the rest of the line: */
+       do
+       {
+           tbuf[FGETS_SIZE - 2] = NUL;
+ #ifdef USE_CR
+-          fgets_cr((char *)tbuf, FGETS_SIZE, fp);
++          ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp);
  #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)FALSE, (char_u *)0L}
+-          fgets((char *)tbuf, FGETS_SIZE, fp);
++          ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"gdefault",    "gd",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_gd, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"graphic",           "gr",   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"grepformat",  "gfm",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_QUICKFIX
-                           (char_u *)&p_gefm, PV_NONE,
--                          {(char_u *)DFLT_GREPFORMAT, (char_u *)0L},
-+                          {(char_u *)DFLT_GREPFORMAT, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+       } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
+     }
+     return (eof == NULL);
+ }
+@@ -6105,23 +6226,84 @@ vim_rename(from, to)
+     struct stat       st;
+     long      perm;
+ #ifdef HAVE_ACL
+     vim_acl_T acl;            /* ACL from original file */
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"grepprg",           "gp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
- #ifdef FEAT_QUICKFIX
-                           (char_u *)&p_gp, PV_GP,
-                           {
- # ifdef WIN3264
-@@ -1183,19 +1192,19 @@ static struct vimoption
- #  else
- #   ifdef VMS
-                           (char_u *)"SEARCH/NUMBERS ",
- #   else
-                           (char_u *)"grep -n ",
--#endif
--#endif
-+#   endif
-+#  endif
++#if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
++    int               use_tmp_file = FALSE;
++#endif
+     /*
+-     * When the names are identical, there is nothing to do.
++     * When the names are identical, there is nothing to do.  When they refer
++     * to the same file (ignoring case and slash/backslash differences) but
++     * the file name differs we need to go through a temp file.
+      */
+     if (fnamecmp(from, to) == 0)
+-      return 0;
++    {
++#ifdef CASE_INSENSITIVE_FILENAME
++      if (STRCMP(gettail(from), gettail(to)) != 0)
++          use_tmp_file = TRUE;
++      else
++#endif
++          return 0;
++    }
+     /*
+      * Fail if the "from" file doesn't exist.  Avoids that "to" is deleted.
+      */
+     if (mch_stat((char *)from, &st) < 0)
+       return -1;
++#ifdef UNIX
++    {
++      struct stat     st_to;
++
++      /* It's possible for the source and destination to be the same file.
++       * This happens when "from" and "to" differ in case and are on a FAT32
++       * filesystem.  In that case go through a temp file name. */
++      if (mch_stat((char *)to, &st_to) >= 0
++              && st.st_dev == st_to.st_dev
++              && st.st_ino == st_to.st_ino)
++          use_tmp_file = TRUE;
++    }
++#endif
++
++#if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
++    if (use_tmp_file)
++    {
++      char    tempname[MAXPATHL + 1];
++
++      /*
++       * Find a name that doesn't exist and is in the same directory.
++       * Rename "from" to "tempname" and then rename "tempname" to "to".
++       */
++      if (STRLEN(from) >= MAXPATHL - 5)
++          return -1;
++      STRCPY(tempname, from);
++      for (n = 123; n < 99999; ++n)
++      {
++          sprintf((char *)gettail((char_u *)tempname), "%d", n);
++          if (mch_stat(tempname, &st) < 0)
++          {
++              if (mch_rename((char *)from, tempname) == 0)
++              {
++                  if (mch_rename(tempname, (char *)to) == 0)
++                      return 0;
++                  /* Strange, the second step failed.  Try moving the
++                   * file back and return failure. */
++                  mch_rename(tempname, (char *)from);
++                  return -1;
++              }
++              /* If it fails for one temp name it will most likely fail
++               * for any temp name, give up. */
++              return -1;
++          }
++      }
++      return -1;
++    }
++#endif
++
+     /*
+      * Delete the "to" file, this is required on some systems to make the
+      * mch_rename() work, on other systems it makes sure that we don't have
+      * two files when the mch_rename() fails.
+      */
+@@ -6258,11 +6440,11 @@ check_timestamps(focus)
+       return FALSE;
+     }
+     if (!stuff_empty() || global_busy || !typebuf_typed()
+ #ifdef FEAT_AUTOCMD
+-                      || autocmd_busy || curbuf_lock > 0
++                      || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
+ #endif
+                                       )
+       need_check_timestamps = TRUE;           /* check later */
+     else
+     {
+@@ -6351,15 +6533,14 @@ move_lines(frombuf, tobuf)
+  * Also check if the file for a new buffer unexpectedly appeared.
+  * return 1 if a changed buffer was found.
+  * return 2 if a message has been displayed.
+  * return 0 otherwise.
+  */
+-/*ARGSUSED*/
+     int
+ buf_check_timestamp(buf, focus)
+     buf_T     *buf;
+-    int               focus;          /* called for GUI focus event */
++    int               focus UNUSED;   /* called for GUI focus event */
+ {
+     struct stat       st;
+     int               stat_res;
+     int               retval = 0;
+     char_u    *path;
+@@ -6460,12 +6641,14 @@ buf_check_timestamp(buf, focus)
+           busy = TRUE;
+ # ifdef FEAT_EVAL
+           set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
+           set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
  # endif
--                          (char_u *)0L},
-+                          (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
++          ++allbuf_lock;
+           n = apply_autocmds(EVENT_FILECHANGEDSHELL,
+                                     buf->b_fname, buf->b_fname, FALSE, buf);
++          --allbuf_lock;
+           busy = FALSE;
+           if (n)
+           {
+               if (!buf_valid(buf))
+                   EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
+@@ -6509,11 +6692,14 @@ buf_check_timestamp(buf, focus)
+                   else if (*reason == 'm')
+                   {
+                       mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
+                       mesg2 = _("See \":help W16\" for more info.");
+                   }
+-                  /* Else: only timestamp changed, ignored */
++                  else
++                      /* Only timestamp changed, store it to avoid a warning
++                       * in check_mtime() later. */
++                      buf->b_mtime_read = buf->b_mtime;
+               }
+           }
+       }
+     }
+@@ -6536,10 +6722,15 @@ buf_check_timestamp(buf, focus)
+           if (!helpmesg)
+               mesg2 = "";
+           tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg)
+                                                       + STRLEN(mesg2) + 2));
+           sprintf((char *)tbuf, mesg, path);
++#ifdef FEAT_EVAL
++          /* Set warningmsg here, before the unimportant and output-specific
++           * mesg2 has been appended. */
++          set_vim_var_string(VV_WARNINGMSG, tbuf, -1);
++#endif
+ #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
+           if (can_reload)
+           {
+               if (*mesg2 != NUL)
+               {
+@@ -6730,14 +6921,15 @@ buf_reload(buf, orig_mode)
+ #ifdef FEAT_AUTOCMD
+       keep_filetype = FALSE;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"guicursor",    "gcr",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef CURSOR_SHAPE
-                           (char_u *)&p_guicursor, PV_NONE,
-                           {
- # ifdef FEAT_GUI
-@@ -1206,45 +1215,45 @@ static struct vimoption
-                                   (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+ #ifdef FEAT_FOLDING
+       {
+-          win_T *wp;
++          win_T       *wp;
++          tabpage_T   *tp;
+           /* Update folds unless they are defined manually. */
+-          FOR_ALL_WINDOWS(wp)
++          FOR_ALL_TAB_WINDOWS(tp, wp)
+               if (wp->w_buffer == curwin->w_buffer
+                       && !foldmethodIsManual(wp))
+                   foldUpdateAll(wp);
+       }
  #endif
--                                  },
-+                          SCRIPTID_INIT},
-     {"guifont",           "gfn",  P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
- #ifdef FEAT_GUI
-                           (char_u *)&p_guifont, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
+@@ -6751,16 +6943,15 @@ buf_reload(buf, orig_mode)
+     /* restore curwin/curbuf and a few other things */
+     aucmd_restbuf(&aco);
+     /* Careful: autocommands may have made "buf" invalid! */
+ }
+-/*ARGSUSED*/
+     void
+ buf_store_time(buf, st, fname)
+     buf_T     *buf;
+     struct stat       *st;
+-    char_u    *fname;
++    char_u    *fname UNUSED;
+ {
+     buf->b_mtime = (long)st->st_mtime;
+     buf->b_orig_size = (size_t)st->st_size;
+ #ifdef HAVE_ST_MODE
+     buf->b_orig_mode = (int)st->st_mode;
+@@ -6811,34 +7002,60 @@ vim_deltempdir()
+       vim_tempdir = NULL;
+     }
+ }
+ #endif
++#ifdef TEMPDIRNAMES
++/*
++ * Directory "tempdir" was created.  Expand this name to a full path and put
++ * it in "vim_tempdir".  This avoids that using ":cd" would confuse us.
++ * "tempdir" must be no longer than MAXPATHL.
++ */
++    static void
++vim_settempdir(tempdir)
++    char_u    *tempdir;
++{
++    char_u    *buf;
++
++    buf = alloc((unsigned)MAXPATHL + 2);
++    if (buf != NULL)
++    {
++      if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL)
++          STRCPY(buf, tempdir);
++# ifdef __EMX__
++      if (vim_strchr(buf, '/') != NULL)
++          STRCAT(buf, "/");
++      else
++# endif
++          add_pathsep(buf);
++      vim_tempdir = vim_strsave(buf);
++      vim_free(buf);
++    }
++}
++#endif
++
+ /*
+  * vim_tempname(): Return a unique name that can be used for a temp file.
+  *
+  * The temp file is NOT created.
+  *
+  * The returned pointer is to allocated memory.
+  * The returned pointer is NULL if no valid name was found.
+  */
+-/*ARGSUSED*/
+     char_u  *
+ vim_tempname(extra_char)
+-    int           extra_char;     /* character to use in the name instead of '?' */
++    int           extra_char UNUSED;  /* char to use in the name instead of '?' */
+ {
+ #ifdef USE_TMPNAM
+     char_u    itmp[L_tmpnam]; /* use tmpnam() */
  #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+     char_u    itmp[TEMPNAMELEN];
  #endif
--                                  },
-+                          SCRIPTID_INIT},
-     {"guifontset",  "gfs",  P_STRING|P_VI_DEF|P_RCLR|P_COMMA,
- #if defined(FEAT_GUI) && defined(FEAT_XFONTSET)
-                           (char_u *)&p_guifontset, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                                  },
-+                          SCRIPTID_INIT},
-     {"guifontwide", "gfw",  P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
- #if defined(FEAT_GUI) && defined(FEAT_MBYTE)
-                           (char_u *)&p_guifontwide, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                                  },
-+                          SCRIPTID_INIT},
-     {"guiheadroom", "ghr",  P_NUM|P_VI_DEF,
- #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
-                           (char_u *)&p_ghr, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)50L, (char_u *)0L}},
-+                          {(char_u *)50L, (char_u *)0L} SCRIPTID_INIT},
-     {"guioptions",  "go",   P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST,
- #if defined(FEAT_GUI)
-                           (char_u *)&p_go, PV_NONE,
- # if defined(UNIX) && !defined(MACOS)
-                           {(char_u *)"aegimrLtT", (char_u *)0L}
-@@ -1253,115 +1262,117 @@ static struct vimoption
+ #ifdef TEMPDIRNAMES
+     static char       *(tempdirs[]) = {TEMPDIRNAMES};
+     int               i;
+-    long      nr;
+-    long      off;
+ # ifndef EEXIST
+     struct stat       st;
  # endif
+     /*
+@@ -6851,12 +7068,18 @@ vim_tempname(extra_char)
+     if (vim_tempdir == NULL)
+     {
+       /*
+        * Try the entries in TEMPDIRNAMES to create the temp directory.
+        */
+-      for (i = 0; i < sizeof(tempdirs) / sizeof(char *); ++i)
++      for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i)
+       {
++# ifndef HAVE_MKDTEMP
++          size_t      itmplen;
++          long        nr;
++          long        off;
++# endif
++
+           /* expand $TMP, leave room for "/v1100000/999999999" */
+           expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20);
+           if (mch_isdir(itmp))                /* directory exists */
+           {
+ # ifdef __EMX__
+@@ -6867,74 +7090,63 @@ vim_tempname(extra_char)
+                   STRCAT(itmp, "/");
+               else
+ # endif
+                   add_pathsep(itmp);
++# ifdef HAVE_MKDTEMP
++              /* Leave room for filename */
++              STRCAT(itmp, "vXXXXXX");
++              if (mkdtemp((char *)itmp) != NULL)
++                  vim_settempdir(itmp);
++# else
+               /* Get an arbitrary number of up to 6 digits.  When it's
+                * unlikely that it already exists it will be faster,
+                * otherwise it doesn't matter.  The use of mkdir() avoids any
+                * security problems because of the predictable number. */
+               nr = (mch_get_pid() + (long)time(NULL)) % 1000000L;
++              itmplen = STRLEN(itmp);
+               /* Try up to 10000 different values until we find a name that
+                * doesn't exist. */
+               for (off = 0; off < 10000L; ++off)
+               {
+                   int         r;
+-#if defined(UNIX) || defined(VMS)
++#  if defined(UNIX) || defined(VMS)
+                   mode_t      umask_save;
+-#endif
++#  endif
+-                  sprintf((char *)itmp + STRLEN(itmp), "v%ld", nr + off);
+-# ifndef EEXIST
++                  sprintf((char *)itmp + itmplen, "v%ld", nr + off);
++#  ifndef EEXIST
+                   /* If mkdir() does not set errno to EEXIST, check for
+                    * existing file here.  There is a race condition then,
+                    * although it's fail-safe. */
+                   if (mch_stat((char *)itmp, &st) >= 0)
+                       continue;
+-# endif
+-#if defined(UNIX) || defined(VMS)
++#  endif
++#  if defined(UNIX) || defined(VMS)
+                   /* Make sure the umask doesn't remove the executable bit.
+                    * "repl" has been reported to use "177". */
+                   umask_save = umask(077);
+-#endif
++#  endif
+                   r = vim_mkdir(itmp, 0700);
+-#if defined(UNIX) || defined(VMS)
++#  if defined(UNIX) || defined(VMS)
+                   (void)umask(umask_save);
+-#endif
++#  endif
+                   if (r == 0)
+                   {
+-                      char_u  *buf;
+-
+-                      /* Directory was created, use this name.
+-                       * Expand to full path; When using the current
+-                       * directory a ":cd" would confuse us. */
+-                      buf = alloc((unsigned)MAXPATHL + 1);
+-                      if (buf != NULL)
+-                      {
+-                          if (vim_FullName(itmp, buf, MAXPATHL, FALSE)
+-                                                                    == FAIL)
+-                              STRCPY(buf, itmp);
+-# ifdef __EMX__
+-                          if (vim_strchr(buf, '/') != NULL)
+-                              STRCAT(buf, "/");
+-                          else
+-# endif
+-                              add_pathsep(buf);
+-                          vim_tempdir = vim_strsave(buf);
+-                          vim_free(buf);
+-                      }
++                      vim_settempdir(itmp);
+                       break;
+                   }
+-# ifdef EEXIST
++#  ifdef EEXIST
+                   /* If the mkdir() didn't fail because the file/dir exists,
+                    * we probably can't create any dir here, try another
+                    * place. */
+                   if (errno != EEXIST)
+-# endif
++#  endif
+                       break;
+               }
++# endif /* HAVE_MKDTEMP */
+               if (vim_tempdir != NULL)
+                   break;
+           }
+       }
+     }
+@@ -7711,11 +7923,14 @@ au_event_disable(what)
+     if (save_ei != NULL)
+     {
+       new_ei = vim_strnsave(p_ei, (int)(STRLEN(p_ei) + STRLEN(what)));
+       if (new_ei != NULL)
+       {
+-          STRCAT(new_ei, what);
++          if (*what == ',' && *p_ei == NUL)
++              STRCPY(new_ei, what + 1);
++          else
++              STRCAT(new_ei, what);
+           set_string_option_direct((char_u *)"ei", -1, new_ei,
+                                                         OPT_FREE, SID_NONE);
+           vim_free(new_ei);
+       }
+     }
+@@ -8243,11 +8458,11 @@ ex_doautoall(eap)
+           /* execute the autocommands for this buffer */
+           retval = do_doautocmd(eap->arg, FALSE);
+           /* Execute the modeline settings, but don't set window-local
+            * options if we are using the current window for another buffer. */
+-          do_modelines(aco.save_curwin == NULL ? OPT_NOWIN : 0);
++          do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
+           /* restore the current window */
+           aucmd_restbuf(&aco);
+           /* stop if there is some error or buffer was deleted */
+@@ -8259,23 +8474,24 @@ ex_doautoall(eap)
+     check_cursor();       /* just in case lines got deleted */
+ }
+ /*
+  * Prepare for executing autocommands for (hidden) buffer "buf".
+- * Search a window for the current buffer.  Save the cursor position and
+- * screen offset.
++ * Search for a visible window containing the current buffer.  If there isn't
++ * one then use "aucmd_win".
+  * Set "curbuf" and "curwin" to match "buf".
+  * When FEAT_AUTOCMD is not defined another version is used, see below.
+  */
+     void
+ aucmd_prepbuf(aco, buf)
+     aco_save_T        *aco;           /* structure to save values in */
+     buf_T     *buf;           /* new curbuf */
+ {
+     win_T     *win;
+-
+-    aco->new_curbuf = buf;
++#ifdef FEAT_WINDOWS
++    int               save_ea;
++#endif
+     /* Find a window that is for the new buffer */
+     if (buf == curbuf)                /* be quick when buf is curbuf */
+       win = curwin;
+     else
+@@ -8285,46 +8501,71 @@ aucmd_prepbuf(aco, buf)
+               break;
  #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                                  },
-+                          SCRIPTID_INIT},
-     {"guipty",            NULL,   P_BOOL|P_VI_DEF,
- #if defined(FEAT_GUI)
-                           (char_u *)&p_guipty, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"guitablabel",  "gtl", P_STRING|P_VI_DEF|P_RWIN,
- #if defined(FEAT_GUI_TABLINE)
-                           (char_u *)&p_gtl, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+       win = NULL;
  #endif
--                                  },
-+                          SCRIPTID_INIT},
-     {"guitabtooltip",  "gtt", P_STRING|P_VI_DEF|P_RWIN,
- #if defined(FEAT_GUI_TABLINE)
-                           (char_u *)&p_gtt, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
+-    /*
+-     * Prefer to use an existing window for the buffer, it has the least side
+-     * effects (esp. if "buf" is curbuf).
+-     * Otherwise, use curwin for "buf".  It might make some items in the
+-     * window invalid.  At least save the cursor and topline.
+-     */
++    /* Allocate "aucmd_win" when needed.  If this fails (out of memory) fall
++     * back to using the current window. */
++    if (win == NULL && aucmd_win == NULL)
++    {
++      win_alloc_aucmd_win();
++      if (aucmd_win == NULL)
++          win = curwin;
++    }
++    if (win == NULL && aucmd_win_used)
++      /* Strange recursive autocommand, fall back to using the current
++       * window.  Expect a few side effects... */
++      win = curwin;
++
++    aco->save_curwin = curwin;
++    aco->save_curbuf = curbuf;
+     if (win != NULL)
+     {
+-      /* there is a window for "buf", make it the curwin */
+-      aco->save_curwin = curwin;
++      /* There is a window for "buf" in the current tab page, make it the
++       * curwin.  This is preferred, it has the least side effects (esp. if
++       * "buf" is curbuf). */
++      aco->use_aucmd_win = FALSE;
+       curwin = win;
+-      aco->save_buf = win->w_buffer;
+-      aco->new_curwin = win;
+     }
+     else
+     {
+-      /* there is no window for "buf", use curwin */
+-      aco->save_curwin = NULL;
+-      aco->save_buf = curbuf;
+-      --curbuf->b_nwindows;
+-      curwin->w_buffer = buf;
++      /* There is no window for "buf", use "aucmd_win".  To minimize the side
++       * effects, insert it in a the current tab page.
++       * Anything related to a window (e.g., setting folds) may have
++       * unexpected results. */
++      aco->use_aucmd_win = TRUE;
++      aucmd_win_used = TRUE;
++      aucmd_win->w_buffer = buf;
+       ++buf->b_nwindows;
++      win_init_empty(aucmd_win); /* set cursor and topline to safe values */
++      vim_free(aucmd_win->w_localdir);
++      aucmd_win->w_localdir = NULL;
++
++      /* Make sure w_localdir and globaldir are NULL to avoid a chdir() in
++       * win_enter_ext(). */
++      aucmd_win->w_localdir = NULL;
++      aco->globaldir = globaldir;
++      globaldir = NULL;
+-      /* save cursor and topline, set them to safe values */
+-      aco->save_cursor = curwin->w_cursor;
+-      curwin->w_cursor.lnum = 1;
+-      curwin->w_cursor.col = 0;
+-      aco->save_topline = curwin->w_topline;
+-      curwin->w_topline = 1;
+-#ifdef FEAT_DIFF
+-      aco->save_topfill = curwin->w_topfill;
+-      curwin->w_topfill = 0;
++
++#ifdef FEAT_WINDOWS
++      /* Split the current window, put the aucmd_win in the upper half.
++       * We don't want the BufEnter or WinEnter autocommands. */
++      block_autocmds();
++      make_snapshot(SNAP_AUCMD_IDX);
++      save_ea = p_ea;
++      p_ea = FALSE;
++      (void)win_split_ins(0, WSP_TOP, aucmd_win, 0);
++      (void)win_comp_pos();   /* recompute window positions */
++      p_ea = save_ea;
++      unblock_autocmds();
  #endif
--                                  },
-+                          SCRIPTID_INIT},
-     {"hardtabs",    "ht",   P_NUM|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"helpfile",    "hf",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_hf, PV_NONE,
--                          {(char_u *)DFLT_HELPFILE, (char_u *)0L}},
-+                          {(char_u *)DFLT_HELPFILE, (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"helpheight",  "hh",   P_NUM|P_VI_DEF,
++      curwin = aucmd_win;
+     }
+-
+     curbuf = buf;
++    aco->new_curwin = curwin;
++    aco->new_curbuf = curbuf;
+ }
+ /*
+  * Cleanup after executing autocommands for a (hidden) buffer.
+  * Restore the window as it was (if possible).
+@@ -8332,61 +8573,105 @@ aucmd_prepbuf(aco, buf)
+  */
+     void
+ aucmd_restbuf(aco)
+     aco_save_T        *aco;           /* structure holding saved values */
+ {
+-    if (aco->save_curwin != NULL)
++#ifdef FEAT_WINDOWS
++    int dummy;
++#endif
++
++    if (aco->use_aucmd_win)
++    {
++      --curbuf->b_nwindows;
++#ifdef FEAT_WINDOWS
++      /* Find "aucmd_win", it can't be closed, but it may be in another tab
++       * page. Do not trigger autocommands here. */
++      block_autocmds();
++      if (curwin != aucmd_win)
++      {
++          tabpage_T   *tp;
++          win_T       *wp;
++
++          FOR_ALL_TAB_WINDOWS(tp, wp)
++          {
++              if (wp == aucmd_win)
++              {
++                  if (tp != curtab)
++                      goto_tabpage_tp(tp);
++                  win_goto(aucmd_win);
++                  break;
++              }
++          }
++      }
++
++      /* Remove the window and frame from the tree of frames. */
++      (void)winframe_remove(curwin, &dummy, NULL);
++      win_remove(curwin, NULL);
++      aucmd_win_used = FALSE;
++      last_status(FALSE);         /* may need to remove last status line */
++      restore_snapshot(SNAP_AUCMD_IDX, FALSE);
++      (void)win_comp_pos();   /* recompute window positions */
++      unblock_autocmds();
++
++      if (win_valid(aco->save_curwin))
++          curwin = aco->save_curwin;
++      else
++          /* Hmm, original window disappeared.  Just use the first one. */
++          curwin = firstwin;
++# ifdef FEAT_EVAL
++      vars_clear(&aucmd_win->w_vars.dv_hashtab);  /* free all w: variables */
++      hash_init(&aucmd_win->w_vars.dv_hashtab);   /* re-use the hashtab */
++# endif
++#else
++      curwin = aco->save_curwin;
++#endif
++      curbuf = curwin->w_buffer;
++
++      vim_free(globaldir);
++      globaldir = aco->globaldir;
++
++      /* the buffer contents may have changed */
++      check_cursor();
++      if (curwin->w_topline > curbuf->b_ml.ml_line_count)
++      {
++          curwin->w_topline = curbuf->b_ml.ml_line_count;
++#ifdef FEAT_DIFF
++          curwin->w_topfill = 0;
++#endif
++      }
++#if defined(FEAT_GUI)
++      /* Hide the scrollbars from the aucmd_win and update. */
++      gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE);
++      gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE);
++      gui_may_update_scrollbars();
++#endif
++    }
++    else
+     {
+       /* restore curwin */
  #ifdef FEAT_WINDOWS
-                           (char_u *)&p_hh, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)20L, (char_u *)0L}},
-+                          {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT},
-     {"helplang",    "hlg",  P_STRING|P_VI_DEF|P_COMMA,
- #ifdef FEAT_MULTI_LANG
-                           (char_u *)&p_hlg, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--    },
-+                          SCRIPTID_INIT},
-     {"hidden",            "hid",  P_BOOL|P_VI_DEF,
-                           (char_u *)&p_hid, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"highlight",   "hl",   P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
-                           (char_u *)&p_hl, PV_NONE,
--                          {(char_u *)HIGHLIGHT_INIT, (char_u *)0L}},
-+                          {(char_u *)HIGHLIGHT_INIT, (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"history",           "hi",   P_NUM|P_VIM,
-                           (char_u *)&p_hi, PV_NONE,
--                          {(char_u *)0L, (char_u *)20L}},
-+                          {(char_u *)0L, (char_u *)20L} SCRIPTID_INIT},
-     {"hkmap",     "hk",   P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_RIGHTLEFT
-                           (char_u *)&p_hkmap, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"hkmapp",            "hkp",  P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_RIGHTLEFT
-                           (char_u *)&p_hkmapp, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"hlsearch",    "hls",  P_BOOL|P_VI_DEF|P_VIM|P_RALL,
-                           (char_u *)&p_hls, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"icon",      NULL,   P_BOOL|P_VI_DEF,
- #ifdef FEAT_TITLE
-                           (char_u *)&p_icon, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"iconstring",  NULL,   P_STRING|P_VI_DEF,
- #ifdef FEAT_TITLE
-                           (char_u *)&p_iconstring, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"ignorecase",  "ic",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_ic, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"imactivatekey","imak",P_STRING|P_VI_DEF,
- #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
-                           (char_u *)&p_imak, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+       if (win_valid(aco->save_curwin))
  #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"imcmdline",   "imc",  P_BOOL|P_VI_DEF,
- #ifdef USE_IM_CONTROL
-                           (char_u *)&p_imcmdline, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"imdisable",   "imd",  P_BOOL|P_VI_DEF,
- #ifdef USE_IM_CONTROL
-                           (char_u *)&p_imdisable, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
-@@ -1369,72 +1380,72 @@ static struct vimoption
- #ifdef __sgi
-                           {(char_u *)TRUE, (char_u *)0L}
- #else
-                           {(char_u *)FALSE, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"iminsert",    "imi",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_iminsert, PV_IMI,
- #ifdef B_IMODE_IM
-                           {(char_u *)B_IMODE_IM, (char_u *)0L}
- #else
-                           {(char_u *)B_IMODE_NONE, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"imsearch",    "ims",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_imsearch, PV_IMS,
- #ifdef B_IMODE_IM
-                           {(char_u *)B_IMODE_IM, (char_u *)0L}
- #else
-                           {(char_u *)B_IMODE_NONE, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"include",           "inc",  P_STRING|P_ALLOCED|P_VI_DEF,
- #ifdef FEAT_FIND_ID
-                           (char_u *)&p_inc, PV_INC,
-                           {(char_u *)"^\\s*#\\s*include", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"includeexpr", "inex", P_STRING|P_ALLOCED|P_VI_DEF,
- #if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
-                           (char_u *)&p_inex, PV_INEX,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"incsearch",   "is",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_is, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"indentexpr", "inde",  P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
- #if defined(FEAT_CINDENT) && defined(FEAT_EVAL)
-                           (char_u *)&p_inde, PV_INDE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"indentkeys", "indk",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
- #if defined(FEAT_CINDENT) && defined(FEAT_EVAL)
-                           (char_u *)&p_indk, PV_INDK,
-                           {(char_u *)"0{,0},:,0#,!^F,o,O,e", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"infercase",   "inf",  P_BOOL|P_VI_DEF,
-                           (char_u *)&p_inf, PV_INF,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"insertmode",  "im",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_im, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"isfname",           "isf",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_isf, PV_NONE,
-                           {
- #ifdef BACKSLASH_IN_FILENAME
-                               /* Excluded are: & and ^ are special in cmd.exe
-@@ -1453,11 +1464,11 @@ static struct vimoption
-                           (char_u *)"@,48-57,/,.,-,_,+,,,#,$,%,~,=",
- #   endif
- #  endif
- # endif
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"isident",           "isi",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_isi, PV_NONE,
-                           {
- #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
-                           (char_u *)"@,48-57,_,128-167,224-235",
-@@ -1470,11 +1481,11 @@ static struct vimoption
-                                   "251-254",
- # else
-                           (char_u *)"@,48-57,_,192-255",
- # endif
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"iskeyword",   "isk",  P_STRING|P_ALLOCED|P_VIM|P_COMMA|P_NODUP,
-                           (char_u *)&p_isk, PV_ISK,
-                           {
- #ifdef EBCDIC
-                            (char_u *)"@,240-249,_",
-@@ -1489,11 +1500,11 @@ static struct vimoption
-                               (char_u *)"@,48-57,_,128-167,224-235"
- # else
-                               ISK_LATIN1
- # endif
- #endif
--                              }},
-+                          } SCRIPTID_INIT},
-     {"isprint",           "isp",  P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP,
-                           (char_u *)&p_isp, PV_NONE,
-                           {
- #if defined(MSDOS) || defined(MSWIN) || defined(OS2) \
-               || (defined(MACOS) && !defined(MACOS_X)) \
-@@ -1505,39 +1516,39 @@ static struct vimoption
-                           (char_u *)"63-255",
- # else
-                           ISP_LATIN1,
- # endif
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"joinspaces",  "js",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_js, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"key",       NULL,   P_STRING|P_ALLOCED|P_VI_DEF|P_NO_MKRC,
- #ifdef FEAT_CRYPT
-                           (char_u *)&p_key, PV_KEY,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"keymap",            "kmp",  P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF|P_RSTAT|P_NFNAME|P_PRI_MKRC,
- #ifdef FEAT_KEYMAP
-                           (char_u *)&p_keymap, PV_KMAP,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #endif
--      },
-+                          SCRIPTID_INIT},
-     {"keymodel",    "km",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_VISUAL
-                           (char_u *)&p_km, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"keywordprg",  "kp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_kp, PV_KP,
-                           {
- #if defined(MSDOS) || defined(MSWIN)
-                           (char_u *)":help",
-@@ -1554,53 +1565,53 @@ static struct vimoption
-                           (char_u *)"man",
- #  endif
- # endif
- #endif
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"langmap",     "lmap", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_LANGMAP
-                           (char_u *)&p_langmap, PV_NONE,
-                           {(char_u *)"",      /* unmatched } */
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL,
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"langmenu",    "lm",   P_STRING|P_VI_DEF|P_NFNAME,
- #if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG)
-                           (char_u *)&p_lm, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"laststatus",  "ls",   P_NUM|P_VI_DEF|P_RALL,
- #ifdef FEAT_WINDOWS
-                           (char_u *)&p_ls, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"lazyredraw",  "lz",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_lz, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"linebreak",   "lbr",  P_BOOL|P_VI_DEF|P_RWIN,
- #ifdef FEAT_LINEBREAK
-                           (char_u *)VAR_WIN, PV_LBR,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"lines",     NULL,   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR,
-                           (char_u *)&Rows, PV_NONE,
-                           {
- #if defined(MSDOS) || defined(WIN3264) || defined(OS2)
-                           (char_u *)25L,
- #else
-                           (char_u *)24L,
- #endif
--                                          (char_u *)0L}},
-+                                          (char_u *)0L} SCRIPTID_INIT},
-     {"linespace",   "lsp",  P_NUM|P_VI_DEF|P_RCLR,
- #ifdef FEAT_GUI
-                           (char_u *)&p_linespace, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
-@@ -1608,53 +1619,53 @@ static struct vimoption
- #ifdef FEAT_GUI_W32
-                           {(char_u *)1L, (char_u *)0L}
- #else
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"lisp",      NULL,   P_BOOL|P_VI_DEF,
- #ifdef FEAT_LISP
-                           (char_u *)&p_lisp, PV_LISP,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"lispwords",   "lw",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_LISP
-                           (char_u *)&p_lispwords, PV_NONE,
-                           {(char_u *)LISPWORD_VALUE, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"list",      NULL,   P_BOOL|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_LIST,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"listchars",   "lcs",  P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP,
-                           (char_u *)&p_lcs, PV_NONE,
--                          {(char_u *)"eol:$", (char_u *)0L}},
-+                          {(char_u *)"eol:$", (char_u *)0L} SCRIPTID_INIT},
-     {"loadplugins", "lpl",  P_BOOL|P_VI_DEF,
-                           (char_u *)&p_lpl, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
- #ifdef FEAT_GUI_MAC
-     {"macatsui",    NULL,   P_BOOL|P_VI_DEF|P_RCLR,
-                           (char_u *)&p_macatsui, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
- #endif
-     {"magic",     NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_magic, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"makeef",            "mef",  P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
- #ifdef FEAT_QUICKFIX
-                           (char_u *)&p_mef, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"makeprg",           "mp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
- #ifdef FEAT_QUICKFIX
-                           (char_u *)&p_mp, PV_MP,
- # ifdef VMS
-                           {(char_u *)"MMS", (char_u *)0L}
-@@ -1663,100 +1674,103 @@ static struct vimoption
- # endif
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"matchpairs",  "mps",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_mps, PV_MPS,
--                          {(char_u *)"(:),{:},[:]", (char_u *)0L}},
-+                          {(char_u *)"(:),{:},[:]", (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"matchtime",   "mat",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_mat, PV_NONE,
--                          {(char_u *)5L, (char_u *)0L}},
-+                          {(char_u *)5L, (char_u *)0L} SCRIPTID_INIT},
-     {"maxcombine",  "mco",  P_NUM|P_VI_DEF,
- #ifdef FEAT_MBYTE
-                           (char_u *)&p_mco, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)2, (char_u *)0L}},
-+                          {(char_u *)2, (char_u *)0L} SCRIPTID_INIT},
-     {"maxfuncdepth", "mfd", P_NUM|P_VI_DEF,
+       {
+-          /* restore the buffer which was previously edited by curwin, if
+-           * it's still the same window and it's valid */
++          /* Restore the buffer which was previously edited by curwin, if
++           * it was changed, we are still the same window and the buffer is
++           * valid. */
+           if (curwin == aco->new_curwin
+-                  && buf_valid(aco->save_buf)
+-                  && aco->save_buf->b_ml.ml_mfp != NULL)
++                  && curbuf != aco->new_curbuf
++                  && buf_valid(aco->new_curbuf)
++                  && aco->new_curbuf->b_ml.ml_mfp != NULL)
+           {
+               --curbuf->b_nwindows;
+-              curbuf = aco->save_buf;
++              curbuf = aco->new_curbuf;
+               curwin->w_buffer = curbuf;
+               ++curbuf->b_nwindows;
+           }
+           curwin = aco->save_curwin;
+           curbuf = curwin->w_buffer;
+       }
+     }
+-    else
+-    {
+-      /* restore buffer for curwin if it still exists and is loaded */
+-      if (buf_valid(aco->save_buf) && aco->save_buf->b_ml.ml_mfp != NULL)
+-      {
+-          --curbuf->b_nwindows;
+-          curbuf = aco->save_buf;
+-          curwin->w_buffer = curbuf;
+-          ++curbuf->b_nwindows;
+-          curwin->w_cursor = aco->save_cursor;
+-          check_cursor();
+-          /* check topline < line_count, in case lines got deleted */
+-          if (aco->save_topline <= curbuf->b_ml.ml_line_count)
+-          {
+-              curwin->w_topline = aco->save_topline;
+-#ifdef FEAT_DIFF
+-              curwin->w_topfill = aco->save_topfill;
+-#endif
+-          }
+-          else
+-          {
+-              curwin->w_topline = curbuf->b_ml.ml_line_count;
+-#ifdef FEAT_DIFF
+-              curwin->w_topfill = 0;
+-#endif
+-          }
+-      }
+-    }
+ }
+ static int    autocmd_nested = FALSE;
+ /*
+@@ -8521,10 +8806,11 @@ apply_autocmds_group(event, fname, fname
+     buf_T     *old_curbuf;
+     int               retval = FALSE;
+     char_u    *save_sourcing_name;
+     linenr_T  save_sourcing_lnum;
+     char_u    *save_autocmd_fname;
++    int               save_autocmd_fname_full;
+     int               save_autocmd_bufnr;
+     char_u    *save_autocmd_match;
+     int               save_autocmd_busy;
+     int               save_autocmd_nested;
+     static int        nesting = 0;
+@@ -8599,10 +8885,11 @@ apply_autocmds_group(event, fname, fname
+     /*
+      * Save the autocmd_* variables and info about the current buffer.
+      */
+     save_autocmd_fname = autocmd_fname;
++    save_autocmd_fname_full = autocmd_fname_full;
+     save_autocmd_bufnr = autocmd_bufnr;
+     save_autocmd_match = autocmd_match;
+     save_autocmd_busy = autocmd_busy;
+     save_autocmd_nested = autocmd_nested;
+     save_changed = curbuf->b_changed;
+@@ -8616,18 +8903,19 @@ apply_autocmds_group(event, fname, fname
+     if (fname_io == NULL)
+     {
+       if (fname != NULL && *fname != NUL)
+           autocmd_fname = fname;
+       else if (buf != NULL)
+-          autocmd_fname = buf->b_fname;
++          autocmd_fname = buf->b_ffname;
+       else
+           autocmd_fname = NULL;
+     }
+     else
+       autocmd_fname = fname_io;
+     if (autocmd_fname != NULL)
+-      autocmd_fname = FullName_save(autocmd_fname, FALSE);
++      autocmd_fname = vim_strsave(autocmd_fname);
++    autocmd_fname_full = FALSE; /* call FullName_save() later */
+     /*
+      * Set the buffer number to be used for <abuf>.
+      */
+     if (buf == NULL)
+@@ -8665,13 +8953,15 @@ apply_autocmds_group(event, fname, fname
+       fname = vim_strsave(fname);     /* make a copy, so we can change it */
+     }
+     else
+     {
+       sfname = vim_strsave(fname);
+-      /* Don't try expanding FileType, Syntax, WindowID or QuickFixCmd* */
++      /* Don't try expanding FileType, Syntax, FuncUndefined, WindowID or
++       * QuickFixCmd* */
+       if (event == EVENT_FILETYPE
+               || event == EVENT_SYNTAX
++              || event == EVENT_FUNCUNDEFINED
+               || event == EVENT_REMOTEREPLY
+               || event == EVENT_SPELLFILEMISSING
+               || event == EVENT_QUICKFIXCMDPRE
+               || event == EVENT_QUICKFIXCMDPOST)
+           fname = vim_strsave(fname);
+@@ -8808,10 +9098,11 @@ apply_autocmds_group(event, fname, fname
+     vim_free(sourcing_name);
+     sourcing_name = save_sourcing_name;
+     sourcing_lnum = save_sourcing_lnum;
+     vim_free(autocmd_fname);
+     autocmd_fname = save_autocmd_fname;
++    autocmd_fname_full = save_autocmd_fname_full;
+     autocmd_bufnr = save_autocmd_bufnr;
+     autocmd_match = save_autocmd_match;
  #ifdef FEAT_EVAL
-                           (char_u *)&p_mfd, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)100L, (char_u *)0L}},
-+                          {(char_u *)100L, (char_u *)0L} SCRIPTID_INIT},
-     {"maxmapdepth", "mmd",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_mmd, PV_NONE,
--                          {(char_u *)1000L, (char_u *)0L}},
-+                          {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT},
-     {"maxmem",            "mm",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_mm, PV_NONE,
--                          {(char_u *)DFLT_MAXMEM, (char_u *)0L}},
-+                          {(char_u *)DFLT_MAXMEM, (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"maxmempattern","mmp", P_NUM|P_VI_DEF,
-                           (char_u *)&p_mmp, PV_NONE,
--                          {(char_u *)1000L, (char_u *)0L}},
-+                          {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT},
-     {"maxmemtot",   "mmt",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_mmt, PV_NONE,
--                          {(char_u *)DFLT_MAXMEMTOT, (char_u *)0L}},
-+                          {(char_u *)DFLT_MAXMEMTOT, (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"menuitems",   "mis",  P_NUM|P_VI_DEF,
- #ifdef FEAT_MENU
-                           (char_u *)&p_mis, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)25L, (char_u *)0L}},
-+                          {(char_u *)25L, (char_u *)0L} SCRIPTID_INIT},
-     {"mesg",      NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"mkspellmem",  "msm",  P_STRING|P_VI_DEF|P_EXPAND|P_SECURE,
- #ifdef FEAT_SPELL
-                           (char_u *)&p_msm, PV_NONE,
-                           {(char_u *)"460000,2000,500", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--    },
-+                          SCRIPTID_INIT},
-     {"modeline",    "ml",   P_BOOL|P_VIM,
-                           (char_u *)&p_ml, PV_ML,
--                          {(char_u *)FALSE, (char_u *)TRUE}},
-+                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
-     {"modelines",   "mls",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_mls, PV_NONE,
--                          {(char_u *)5L, (char_u *)0L}},
-+                          {(char_u *)5L, (char_u *)0L} SCRIPTID_INIT},
-     {"modifiable",  "ma",   P_BOOL|P_VI_DEF|P_NOGLOB,
-                           (char_u *)&p_ma, PV_MA,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"modified",    "mod",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
-                           (char_u *)&p_mod, PV_MOD,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"more",      NULL,   P_BOOL|P_VIM,
-                           (char_u *)&p_more, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)TRUE}},
-+                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
-     {"mouse",     NULL,   P_STRING|P_VI_DEF|P_FLAGLIST,
-                           (char_u *)&p_mouse, PV_NONE,
-                           {
- #if defined(MSDOS) || defined(WIN3264)
-                               (char_u *)"a",
- #else
-                               (char_u *)"",
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"mousefocus",   "mousef", P_BOOL|P_VI_DEF,
- #ifdef FEAT_GUI
-                           (char_u *)&p_mousef, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"mousehide",   "mh",   P_BOOL|P_VI_DEF,
- #ifdef FEAT_GUI
-                           (char_u *)&p_mh, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+     current_SID = save_current_SID;
+     restore_funccal(save_funccalp);
+@@ -8916,11 +9207,11 @@ auto_next_pat(apc, stop_at_last)
+     for (ap = apc->curpat; ap != NULL && !got_int; ap = ap->next)
+     {
+       apc->curpat = NULL;
+-      /* only use a pattern when it has not been removed, has commands and
++      /* Only use a pattern when it has not been removed, has commands and
+        * the group matches. For buffer-local autocommands only check the
+        * buffer number. */
+       if (ap->pat != NULL && ap->cmds != NULL
+               && (apc->group == AUGROUP_ALL || apc->group == ap->group))
+       {
+@@ -8965,16 +9256,15 @@ auto_next_pat(apc, stop_at_last)
+ /*
+  * Get next autocommand command.
+  * Called by do_cmdline() to get the next line for ":if".
+  * Returns allocated string, or NULL for end of autocommands.
+  */
+-/* ARGSUSED */
+     static char_u *
+ getnextac(c, cookie, indent)
+-    int           c;              /* not used */
++    int           c UNUSED;
+     void    *cookie;
+-    int           indent;         /* not used */
++    int           indent UNUSED;
+ {
+     AutoPatCmd            *acp = (AutoPatCmd *)cookie;
+     char_u        *retval;
+     AutoCmd       *ac;
+@@ -9081,14 +9371,13 @@ has_autocmd(event, sfname, buf)
+ #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
+ /*
+  * Function given to ExpandGeneric() to obtain the list of autocommand group
+  * names.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_augroup_name(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     if (idx == augroups.ga_len)               /* add "END" add the end */
+       return (char_u *)"END";
+     if (idx >= augroups.ga_len)               /* end of list */
+@@ -9102,11 +9391,11 @@ static int include_groups = FALSE;
+     char_u  *
+ set_context_in_autocmd(xp, arg, doautocmd)
+     expand_T  *xp;
+     char_u    *arg;
+-    int               doautocmd;      /* TRUE for :doautocmd, FALSE for :autocmd */
++    int               doautocmd;      /* TRUE for :doauto*, FALSE for :autocmd */
+ {
+     char_u    *p;
+     int               group;
+     /* check for a group name, skip it if present */
+@@ -9150,14 +9439,13 @@ set_context_in_autocmd(xp, arg, doautocm
+ }
+ /*
+  * Function given to ExpandGeneric() to obtain the list of event names.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_event_name(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+     if (idx < augroups.ga_len)                /* First list group names, if wanted */
+     {
+       if (!include_groups || AUGROUP_NAME(idx) == NULL)
+@@ -9252,30 +9540,26 @@ au_exists(arg)
+      * If there isn't any, return FALSE;
+      * If there is one and no pattern given, return TRUE; */
+     ap = first_autopat[(int)event];
+     if (ap == NULL)
+       goto theend;
+-    if (pattern == NULL)
+-    {
+-      retval = TRUE;
+-      goto theend;
+-    }
+     /* if pattern is "<buffer>", special handling is needed which uses curbuf */
+     /* for pattern "<buffer=N>, fnamecmp() will work fine */
+-    if (STRICMP(pattern, "<buffer>") == 0)
++    if (pattern != NULL && STRICMP(pattern, "<buffer>") == 0)
+       buflocal_buf = curbuf;
+     /* Check if there is an autocommand with the given pattern. */
+     for ( ; ap != NULL; ap = ap->next)
+       /* only use a pattern when it has not been removed and has commands. */
+       /* For buffer-local autocommands, fnamecmp() works fine. */
+       if (ap->pat != NULL && ap->cmds != NULL
+           && (group == AUGROUP_ALL || ap->group == group)
+-          && (buflocal_buf == NULL
+-               ? fnamecmp(ap->pat, pattern) == 0
+-               : ap->buflocal_nr == buflocal_buf->b_fnum))
++          && (pattern == NULL
++              || (buflocal_buf == NULL
++                  ? fnamecmp(ap->pat, pattern) == 0
++                  : ap->buflocal_nr == buflocal_buf->b_fnum)))
+       {
+           retval = TRUE;
+           break;
+       }
+@@ -9294,25 +9578,29 @@ theend:
+     void
+ aucmd_prepbuf(aco, buf)
+     aco_save_T        *aco;           /* structure to save values in */
+     buf_T     *buf;           /* new curbuf */
+ {
+-    aco->save_buf = curbuf;
++    aco->save_curbuf = curbuf;
++    --curbuf->b_nwindows;
+     curbuf = buf;
+     curwin->w_buffer = buf;
++    ++curbuf->b_nwindows;
+ }
+ /*
+  * Restore after executing commands for a (hidden) buffer.
+  * This is the non-autocommand version.
+  */
+     void
+ aucmd_restbuf(aco)
+     aco_save_T        *aco;           /* structure holding saved values */
+ {
+-    curbuf = aco->save_buf;
++    --curbuf->b_nwindows;
++    curbuf = aco->save_curbuf;
+     curwin->w_buffer = curbuf;
++    ++curbuf->b_nwindows;
+ }
+ #endif        /* FEAT_AUTOCMD */
+@@ -9465,17 +9753,16 @@ match_file_list(list, sfname, ffname)
+  * If FEAT_OSFILETYPE defined then pass initial <type> through unchanged. Eg:
+  * '<html>myfile' becomes '<html>^myfile$' -- leonard.
+  *
+  * Returns NULL when out of memory.
+  */
+-/*ARGSUSED*/
+     char_u *
+ file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash)
+     char_u    *pat;
+     char_u    *pat_end;       /* first char after pattern or NULL */
+     char      *allow_dirs;    /* Result passed back out in here */
+-    int               no_bslash;      /* Don't use a backward slash as pathsep */
++    int               no_bslash UNUSED; /* Don't use a backward slash as pathsep */
+ {
+     int               size;
+     char_u    *endp;
+     char_u    *reg_pat;
+     char_u    *p;
+--- vim72.orig/src/fold.c
++++ vim72/src/fold.c
+@@ -46,11 +46,11 @@ typedef struct
+ static void newFoldLevelWin __ARGS((win_T *wp));
+ static int checkCloseRec __ARGS((garray_T *gap, linenr_T lnum, int level));
+ static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp));
+ static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum));
+ static void checkupdate __ARGS((win_T *wp));
+-static void setFoldRepeat __ARGS((linenr_T lnum, long count, int open));
++static void setFoldRepeat __ARGS((linenr_T lnum, long count, int do_open));
+ static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep));
+ static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep));
+ static void foldOpenNested __ARGS((fold_T *fpr));
+ static void deleteFoldEntry __ARGS((garray_T *gap, int idx, int recursive));
+ static void foldMarkAdjustRecurse __ARGS((garray_T *gap, linenr_T line1, linenr_T line2, long amount, long amount_after));
+@@ -738,11 +738,11 @@ deleteFold(start, end, recursive, had_vi
+     garray_T  *gap;
+     fold_T    *fp;
+     garray_T  *found_ga;
+     fold_T    *found_fp = NULL;
+     linenr_T  found_off = 0;
+-    int               use_level = FALSE;
++    int               use_level;
+     int               maybe_small = FALSE;
+     int               level = 0;
+     linenr_T  lnum = start;
+     linenr_T  lnum_off;
+     int               did_one = FALSE;
+@@ -755,10 +755,11 @@ deleteFold(start, end, recursive, had_vi
+     {
+       /* Find the deepest fold for "start". */
+       gap = &curwin->w_folds;
+       found_ga = NULL;
+       lnum_off = 0;
++      use_level = FALSE;
+       for (;;)
+       {
+           if (!foldFind(gap, lnum - lnum_off, &fp))
+               break;
+           /* lnum is inside this fold, remember info */
+@@ -781,24 +782,25 @@ deleteFold(start, end, recursive, had_vi
+           ++lnum;
+       }
+       else
+       {
+           lnum = found_fp->fd_top + found_fp->fd_len + found_off;
+-          did_one = TRUE;
+           if (foldmethodIsManual(curwin))
+               deleteFoldEntry(found_ga,
+                   (int)(found_fp - (fold_T *)found_ga->ga_data), recursive);
+           else
+           {
+-              if (found_fp->fd_top + found_off < first_lnum)
+-                  first_lnum = found_fp->fd_top;
+-              if (lnum > last_lnum)
++              if (first_lnum > found_fp->fd_top + found_off)
++                  first_lnum = found_fp->fd_top + found_off;
++              if (last_lnum < lnum)
+                   last_lnum = lnum;
+-              parseMarker(curwin);
++              if (!did_one)
++                  parseMarker(curwin);
+               deleteFoldMarkers(found_fp, recursive, found_off);
+           }
++          did_one = TRUE;
+           /* redraw window */
+           changed_window_setting();
+       }
+     }
+@@ -809,10 +811,14 @@ deleteFold(start, end, recursive, had_vi
+       /* Force a redraw to remove the Visual highlighting. */
+       if (had_visual)
+           redraw_curbuf_later(INVERTED);
  #endif
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"mousemodel",  "mousem", P_STRING|P_VI_DEF,
-                           (char_u *)&p_mousem, PV_NONE,
-                           {
- #if defined(MSDOS) || defined(MSWIN)
-                               (char_u *)"popup",
-@@ -1765,103 +1779,104 @@ static struct vimoption
-                               (char_u *)"popup_setpos",
- # else
-                               (char_u *)"extend",
- # endif
+     }
++    else
++      /* Deleting markers may make cursor column invalid. */
++      check_cursor_col();
++
+     if (last_lnum > 0)
+       changed_lines(first_lnum, (colnr_T)0, last_lnum, 0L);
+ }
+ /* clearFolding() {{{2 */
+@@ -841,11 +847,11 @@ foldUpdate(wp, top, bot)
+     linenr_T  bot;
+ {
+     fold_T    *fp;
+     /* Mark all folds from top to bot as maybe-small. */
+-    (void)foldFind(&curwin->w_folds, curwin->w_cursor.lnum, &fp);
++    (void)foldFind(&curwin->w_folds, top, &fp);
+     while (fp < (fold_T *)curwin->w_folds.ga_data + curwin->w_folds.ga_len
+           && fp->fd_top < bot)
+     {
+       fp->fd_small = MAYBE;
+       ++fp;
+@@ -1045,19 +1051,18 @@ find_wl_entry(win, lnum)
+     win_T     *win;
+     linenr_T  lnum;
+ {
+     int               i;
+-    if (win->w_lines_valid > 0)
+-      for (i = 0; i < win->w_lines_valid; ++i)
+-          if (win->w_lines[i].wl_valid)
+-          {
+-              if (lnum < win->w_lines[i].wl_lnum)
+-                  return -1;
+-              if (lnum <= win->w_lines[i].wl_lastlnum)
+-                  return i;
+-          }
++    for (i = 0; i < win->w_lines_valid; ++i)
++      if (win->w_lines[i].wl_valid)
++      {
++          if (lnum < win->w_lines[i].wl_lnum)
++              return -1;
++          if (lnum <= win->w_lines[i].wl_lastlnum)
++              return i;
++      }
+     return -1;
+ }
+ /* foldAdjustVisual() {{{2 */
+ #ifdef FEAT_VISUAL
+@@ -1239,22 +1244,22 @@ checkupdate(wp)
+ /*
+  * Open or close fold for current window at line "lnum".
+  * Repeat "count" times.
+  */
+     static void
+-setFoldRepeat(lnum, count, open)
++setFoldRepeat(lnum, count, do_open)
+     linenr_T  lnum;
+     long      count;
+-    int               open;
++    int               do_open;
+ {
+     int               done;
+     long      n;
+     for (n = 0; n < count; ++n)
+     {
+       done = DONE_NOTHING;
+-      (void)setManualFold(lnum, open, FALSE, &done);
++      (void)setManualFold(lnum, do_open, FALSE, &done);
+       if (!(done & DONE_ACTION))
+       {
+           /* Only give an error message when no fold could be opened. */
+           if (n == 0 && !(done & DONE_FOLD))
+               EMSG(_(e_nofold));
+@@ -1599,15 +1604,15 @@ foldMarkAdjustRecurse(gap, line1, line2,
+               else
+                   fp->fd_top += amount;
+           }
+           else
+           {
+-              /* 2, 3, or 5: need to correct nested folds too */
+-              foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
+-                                line2 - fp->fd_top, amount, amount_after);
+               if (fp->fd_top < top)
+               {
++                  /* 2 or 3: need to correct nested folds too */
++                  foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
++                                line2 - fp->fd_top, amount, amount_after);
+                   if (last <= line2)
+                   {
+                       /* 2. fold contains line1, line2 is below fold */
+                       if (amount == MAXLNUM)
+                           fp->fd_len = line1 - fp->fd_top;
+@@ -1620,11 +1625,15 @@ foldMarkAdjustRecurse(gap, line1, line2,
+                       fp->fd_len += amount_after;
+                   }
+               }
+               else
+               {
+-                  /* 5. fold is below line1 and contains line2 */
++                  /* 5. fold is below line1 and contains line2; need to
++                   * correct nested folds too */
++                  foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
++                                line2 - fp->fd_top, amount,
++                                amount_after + (fp->fd_top - top));
+                   if (amount == MAXLNUM)
+                   {
+                       fp->fd_len -= line2 - fp->fd_top + 1;
+                       fp->fd_top = line1;
+                   }
+@@ -1920,11 +1929,11 @@ get_foldtext(wp, lnum, lnume, foldinfo,
+     char_u    *text = NULL;
+ #ifdef FEAT_EVAL
+     if (*wp->w_p_fdt != NUL)
+     {
+-      char_u  dashes[51];
++      char_u  dashes[MAX_LEVEL + 2];
+       win_T   *save_curwin;
+       int     level;
+       char_u  *p;
+       /* Set "v:foldstart" and "v:foldend". */
+@@ -1932,12 +1941,12 @@ get_foldtext(wp, lnum, lnume, foldinfo,
+       set_vim_var_nr(VV_FOLDEND, lnume);
+       /* Set "v:folddashes" to a string of "level" dashes. */
+       /* Set "v:foldlevel" to "level". */
+       level = foldinfo->fi_level;
+-      if (level > 50)
+-          level = 50;
++      if (level > (int)sizeof(dashes) - 1)
++          level = (int)sizeof(dashes) - 1;
+       vim_memset(dashes, '-', (size_t)level);
+       dashes[level] = NUL;
+       set_vim_var_string(VV_FOLDDASHES, dashes, -1);
+       set_vim_var_nr(VV_FOLDLEVEL, (long)level);
+       save_curwin = curwin;
+@@ -2244,10 +2253,44 @@ foldUpdateIEMS(wp, top, bot)
+           if (fline.lvl >= 0)
+               break;
+       }
+     }
++    /*
++     * If folding is defined by the syntax, it is possible that a change in
++     * one line will cause all sub-folds of the current fold to change (e.g.,
++     * closing a C-style comment can cause folds in the subsequent lines to
++     * appear). To take that into account we should adjust the value of "bot"
++     * to point to the end of the current fold:
++     */
++    if (foldlevelSyntax == getlevel)
++    {
++      garray_T *gap = &wp->w_folds;
++      fold_T   *fp = NULL;
++      int       current_fdl = 0;
++      linenr_T  fold_start_lnum = 0;
++      linenr_T  lnum_rel = fline.lnum;
++
++      while (current_fdl < fline.lvl)
++      {
++          if (!foldFind(gap, lnum_rel, &fp))
++              break;
++          ++current_fdl;
++
++          fold_start_lnum += fp->fd_top;
++          gap = &fp->fd_nested;
++          lnum_rel -= fp->fd_top;
++      }
++      if (fp != NULL && current_fdl == fline.lvl)
++      {
++          linenr_T fold_end_lnum = fold_start_lnum + fp->fd_len;
++
++          if (fold_end_lnum > bot)
++              bot = fold_end_lnum;
++      }
++    }
++
+     start = fline.lnum;
+     end = bot;
+     /* Do at least one line. */
+     if (start > end && end < wp->w_buffer->b_ml.ml_line_count)
+       end = start;
+@@ -2805,10 +2848,12 @@ foldSplit(gap, i, top, bot)
+       return;
+     fp = (fold_T *)gap->ga_data + i;
+     fp[1].fd_top = bot + 1;
+     fp[1].fd_len = fp->fd_len - (fp[1].fd_top - fp->fd_top);
+     fp[1].fd_flags = fp->fd_flags;
++    fp[1].fd_small = MAYBE;
++    fp->fd_small = MAYBE;
+     /* Move nested folds below bot to new fold.  There can't be
+      * any between top and bot, they have been removed by the caller. */
+     gap1 = &fp->fd_nested;
+     gap2 = &fp[1].fd_nested;
+@@ -3191,12 +3236,12 @@ foldlevelMarker(flp)
+               if (n > 0)
+               {
+                   flp->lvl = n;
+                   flp->lvl_next = n - 1;
+                   /* never start a fold with an end marker */
+-                  if (flp->lvl_next > flp->lvl)
+-                      flp->lvl_next = flp->lvl;
++                  if (flp->lvl_next > start_lvl)
++                      flp->lvl_next = start_lvl;
+               }
+           }
+           else
+               --flp->lvl_next;
+       }
+--- vim72.orig/src/getchar.c
++++ vim72/src/getchar.c
+@@ -20,11 +20,11 @@
+ /*
+  * These buffers are used for storing:
+  * - stuffed characters: A command that is translated into another command.
+  * - redo characters: will redo the last change.
+- * - recorded chracters: for the "q" command.
++ * - recorded characters: for the "q" command.
+  *
+  * The bytes are stored like in the typeahead buffer:
+  * - K_SPECIAL introduces a special key (two more bytes follow).  A literal
+  *   K_SPECIAL is stored as K_SPECIAL KS_SPECIAL KE_FILLER.
+  * - CSI introduces a GUI termcap code (also when gui.in_use is FALSE,
+@@ -127,11 +127,11 @@ static void      closescript __ARGS((void));
+ static int    vgetorpeek __ARGS((int));
+ static void   map_free __ARGS((mapblock_T **));
+ static void   validate_maphash __ARGS((void));
+ static void   showmap __ARGS((mapblock_T *mp, int local));
+ #ifdef FEAT_EVAL
+-static char_u *eval_map_expr __ARGS((char_u *str));
++static char_u *eval_map_expr __ARGS((char_u *str, int c));
  #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"mouseshape",  "mouses",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_MOUSESHAPE
-                           (char_u *)&p_mouseshape, PV_NONE,
-                           {(char_u *)"i-r:beam,s:updown,sd:udsizing,vs:leftright,vd:lrsizing,m:no,ml:up-arrow,v:rightup-arrow", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"mousetime",   "mouset", P_NUM|P_VI_DEF,
-                           (char_u *)&p_mouset, PV_NONE,
--                          {(char_u *)500L, (char_u *)0L}},
-+                          {(char_u *)500L, (char_u *)0L} SCRIPTID_INIT},
-     {"mzquantum",  "mzq",   P_NUM,
- #ifdef FEAT_MZSCHEME
-                           (char_u *)&p_mzq, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)100L, (char_u *)100L}},
-+                          {(char_u *)100L, (char_u *)100L} SCRIPTID_INIT},
-     {"novice",            NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"nrformats",   "nf",   P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_nf, PV_NF,
--                          {(char_u *)"octal,hex", (char_u *)0L}},
-+                          {(char_u *)"octal,hex", (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"number",            "nu",   P_BOOL|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_NU,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"numberwidth", "nuw",  P_NUM|P_RWIN|P_VIM,
- #ifdef FEAT_LINEBREAK
-                           (char_u *)VAR_WIN, PV_NUW,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)8L, (char_u *)4L}},
-+                          {(char_u *)8L, (char_u *)4L} SCRIPTID_INIT},
-     {"omnifunc",    "ofu",  P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE,
- #ifdef FEAT_COMPL_FUNC
-                           (char_u *)&p_ofu, PV_OFU,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ /*
+  * Free and clear a buffer.
+  */
+@@ -1281,11 +1281,11 @@ free_typebuf()
+ {
+     if (typebuf.tb_buf == typebuf_init)
+       EMSG2(_(e_intern2), "Free typebuf 1");
+     else
+       vim_free(typebuf.tb_buf);
+-    if (typebuf.tb_buf == noremapbuf_init)
++    if (typebuf.tb_noremap == noremapbuf_init)
+       EMSG2(_(e_intern2), "Free typebuf 2");
+     else
+       vim_free(typebuf.tb_noremap);
+ }
+@@ -1307,10 +1307,13 @@ save_typebuf()
+       return FAIL;
+     }
+     return OK;
+ }
++static int old_char = -1;     /* character put back by vungetc() */
++static int old_mod_mask;      /* mod_mask for ungotten character */
++
+ #if defined(FEAT_EVAL) || defined(FEAT_EX_EXTRA) || defined(PROTO)
+ /*
+  * Save all three kinds of typeahead, so that the user must type at a prompt.
+  */
+@@ -1321,10 +1324,14 @@ save_typeahead(tp)
+     tp->save_typebuf = typebuf;
+     tp->typebuf_valid = (alloc_typebuf() == OK);
+     if (!tp->typebuf_valid)
+       typebuf = tp->save_typebuf;
++    tp->old_char = old_char;
++    tp->old_mod_mask = old_mod_mask;
++    old_char = -1;
++
+     tp->save_stuffbuff = stuffbuff;
+     stuffbuff.bh_first.b_next = NULL;
+ # ifdef USE_INPUT_BUF
+     tp->save_inputbuf = get_input_buf();
+ # endif
+@@ -1342,10 +1349,13 @@ restore_typeahead(tp)
+     {
+       free_typebuf();
+       typebuf = tp->save_typebuf;
+     }
++    old_char = tp->old_char;
++    old_mod_mask = tp->old_mod_mask;
++
+     free_buff(&stuffbuff);
+     stuffbuff = tp->save_stuffbuff;
+ # ifdef USE_INPUT_BUF
+     set_input_buf(tp->save_inputbuf);
+ # endif
+@@ -1497,21 +1507,18 @@ updatescript(c)
+ }
+ #define KL_PART_KEY -1                /* keylen value for incomplete key-code */
+ #define KL_PART_MAP -2                /* keylen value for incomplete mapping */
+-static int old_char = -1;     /* character put back by vungetc() */
+-static int old_mod_mask;      /* mod_mask for ungotten character */
+-
+ /*
+  * Get the next input character.
+  * Can return a special key or a multi-byte character.
+  * Can return NUL when called recursively, use safe_vgetc() if that's not
+  * wanted.
+  * This translates escaped K_SPECIAL and CSI bytes to a K_SPECIAL or CSI byte.
+  * Collects the bytes of a multibyte character into the whole character.
+- * Returns the modifers in the global "mod_mask".
++ * Returns the modifiers in the global "mod_mask".
+  */
+     int
+ vgetc()
+ {
+     int               c, c2;
+@@ -2380,10 +2387,21 @@ vgetorpeek(advance)
+                   }
+                   /* complete match */
+                   if (keylen >= 0 && keylen <= typebuf.tb_len)
+                   {
++#ifdef FEAT_EVAL
++                      int save_m_expr;
++                      int save_m_noremap;
++                      int save_m_silent;
++                      char_u *save_m_keys;
++                      char_u *save_m_str;
++#else
++# define save_m_noremap mp->m_noremap
++# define save_m_silent mp->m_silent
++#endif
++
+                       /* write chars to script file(s) */
+                       if (keylen > typebuf.tb_maplen)
+                           gotchars(typebuf.tb_buf + typebuf.tb_off
+                                                         + typebuf.tb_maplen,
+                                                 keylen - typebuf.tb_maplen);
+@@ -2422,10 +2440,20 @@ vgetorpeek(advance)
+                                                             0, TRUE, FALSE);
+                       }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"open",      NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"opendevice",  "odev", P_BOOL|P_VI_DEF,
- #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
-                           (char_u *)&p_odev, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+ #ifdef FEAT_EVAL
++                      /* Copy the values from *mp that are used, because
++                       * evaluating the expression may invoke a function
++                       * that redefines the mapping, thereby making *mp
++                       * invalid. */
++                      save_m_expr = mp->m_expr;
++                      save_m_noremap = mp->m_noremap;
++                      save_m_silent = mp->m_silent;
++                      save_m_keys = NULL;  /* only saved when needed */
++                      save_m_str = NULL;  /* only saved when needed */
++
+                       /*
+                        * Handle ":map <expr>": evaluate the {rhs} as an
+                        * expression.  Save and restore the typeahead so that
+                        * getchar() can be used.  Also save and restore the
+                        * command line for "normal :".
+@@ -2437,11 +2465,13 @@ vgetorpeek(advance)
+                           save_typeahead(&tabuf);
+                           if (tabuf.typebuf_valid)
+                           {
+                               vgetc_busy = 0;
+-                              s = eval_map_expr(mp->m_str);
++                              save_m_keys = vim_strsave(mp->m_keys);
++                              save_m_str = vim_strsave(mp->m_str);
++                              s = eval_map_expr(save_m_str, NUL);
+                               vgetc_busy = save_vgetc_busy;
+                           }
+                           else
+                               s = NULL;
+                           restore_typeahead(&tabuf);
+@@ -2460,22 +2490,37 @@ vgetorpeek(advance)
+                        */
+                       if (s == NULL)
+                           i = FAIL;
+                       else
+                       {
+-                          i = ins_typebuf(s,
+-                                  mp->m_noremap != REMAP_YES
+-                                          ? mp->m_noremap
+-                                          : STRNCMP(s, mp->m_keys,
+-                                                        (size_t)keylen) != 0
+-                                                   ? REMAP_YES : REMAP_SKIP,
+-                              0, TRUE, cmd_silent || mp->m_silent);
++                          int noremap;
++
++                          if (save_m_noremap != REMAP_YES)
++                              noremap = save_m_noremap;
++                          else if (
++#ifdef FEAT_EVAL
++                              STRNCMP(s, save_m_keys != NULL
++                                                 ? save_m_keys : mp->m_keys,
++                                                       (size_t)keylen)
++#else
++                              STRNCMP(s, mp->m_keys, (size_t)keylen)
++#endif
++                                 != 0)
++                              noremap = REMAP_YES;
++                          else
++                              noremap = REMAP_SKIP;
++                          i = ins_typebuf(s, noremap,
++                                      0, TRUE, cmd_silent || save_m_silent);
+ #ifdef FEAT_EVAL
+-                          if (mp->m_expr)
++                          if (save_m_expr)
+                               vim_free(s);
  #endif
-                           {(char_u *)FALSE, (char_u *)FALSE}
--                          },
-+                          SCRIPTID_INIT},
-     {"operatorfunc", "opfunc", P_STRING|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_opfunc, PV_NONE,
--                          {(char_u *)"", (char_u *)0L} },
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"optimize",    "opt",  P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"osfiletype",  "oft",  P_STRING|P_ALLOCED|P_VI_DEF,
- #ifdef FEAT_OSFILETYPE
-                           (char_u *)&p_oft, PV_OFT,
-                           {(char_u *)DFLT_OFT, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+                       }
++#ifdef FEAT_EVAL
++                      vim_free(save_m_keys);
++                      vim_free(save_m_str);
++#endif
+                       if (i == FAIL)
+                       {
+                           c = -1;
+                           break;
+                       }
+@@ -3311,11 +3356,11 @@ do_map(maptype, arg, mode, abbrev)
+                       if (vim_iswordc(keys[n]) != vim_iswordc(keys[len - 2]))
+                       {
+                           retval = 1;
+                           goto theend;
+                       }
+-          /* An abbrevation cannot contain white space. */
++          /* An abbreviation cannot contain white space. */
+           for (n = 0; n < len; ++n)
+               if (vim_iswhite(keys[n]))
+               {
+                   retval = 1;
+                   goto theend;
+@@ -3699,15 +3744,14 @@ get_map_mode(cmdp, forceit)
+ /*
+  * Clear all mappings or abbreviations.
+  * 'abbr' should be FALSE for mappings, TRUE for abbreviations.
+  */
+-/*ARGSUSED*/
+     void
+ map_clear(cmdp, arg, forceit, abbr)
+     char_u    *cmdp;
+-    char_u    *arg;
++    char_u    *arg UNUSED;
+     int               forceit;
+     int               abbr;
+ {
+     int               mode;
+ #ifdef FEAT_LOCALMAP
+@@ -3732,17 +3776,16 @@ map_clear(cmdp, arg, forceit, abbr)
+ }
+ /*
+  * Clear all mappings in "mode".
+  */
+-/*ARGSUSED*/
+     void
+ map_clear_int(buf, mode, local, abbr)
+-    buf_T     *buf;       /* buffer for local mappings */
+-    int               mode;       /* mode in which to delete */
+-    int               local;      /* TRUE for buffer-local mappings */
+-    int               abbr;       /* TRUE for abbreviations */
++    buf_T     *buf UNUSED;    /* buffer for local mappings */
++    int               mode;           /* mode in which to delete */
++    int               local UNUSED;   /* TRUE for buffer-local mappings */
++    int               abbr;           /* TRUE for abbreviations */
+ {
+     mapblock_T        *mp, **mpp;
+     int               hash;
+     int               new_hash;
+@@ -3814,11 +3857,15 @@ showmap(mp, local)
+     int               local;      /* TRUE for buffer-local map */
+ {
+     int len = 1;
+     if (msg_didout || msg_silent != 0)
++    {
+       msg_putchar('\n');
++      if (got_int)        /* 'q' typed at MORE prompt */
++          return;
++    }
+     if ((mp->m_mode & (INSERT + CMDLINE)) == INSERT + CMDLINE)
+       msg_putchar('!');                       /* :map! */
+     else if (mp->m_mode & INSERT)
+       msg_putchar('i');                       /* :imap */
+     else if (mp->m_mode & LANGMAP)
+@@ -4261,11 +4308,11 @@ check_abbr(c, ptr, col, mincol)
+       /* no remapping implies no abbreviation */
+       return FALSE;
+     /*
+      * Check for word before the cursor: If it ends in a keyword char all
+-     * chars before it must be al keyword chars or non-keyword chars, but not
++     * chars before it must be keyword chars or non-keyword chars, but not
+      * white space. If it ends in a non-keyword char we accept any characters
+      * before it except white space.
+      */
+     if (col == 0)                             /* cannot be an abbr. */
+       return FALSE;
+@@ -4356,13 +4403,13 @@ check_abbr(c, ptr, col, mincol)
+            *
+            * Character CTRL-] is treated specially - it completes the
+            * abbreviation, but is not inserted into the input stream.
+            */
+           j = 0;
+-                                      /* special key code, split up */
+           if (c != Ctrl_RSB)
+           {
++                                      /* special key code, split up */
+               if (IS_SPECIAL(c) || c == K_SPECIAL)
+               {
+                   tb[j++] = K_SPECIAL;
+                   tb[j++] = K_SECOND(c);
+                   tb[j++] = K_THIRD(c);
+@@ -4387,11 +4434,11 @@ check_abbr(c, ptr, col, mincol)
+                                       /* insert the last typed char */
+               (void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent);
+           }
+ #ifdef FEAT_EVAL
+           if (mp->m_expr)
+-              s = eval_map_expr(mp->m_str);
++              s = eval_map_expr(mp->m_str, c);
+           else
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"paragraphs",  "para", P_STRING|P_VI_DEF,
-                           (char_u *)&p_para, PV_NONE,
-                           {(char_u *)"IPLPPPQPP TPHPLIPpLpItpplpipbp",
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"paste",     NULL,   P_BOOL|P_VI_DEF|P_PRI_MKRC,
-                           (char_u *)&p_paste, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"pastetoggle", "pt",   P_STRING|P_VI_DEF,
-                           (char_u *)&p_pt, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"patchexpr",   "pex",  P_STRING|P_VI_DEF|P_SECURE,
- #if defined(FEAT_DIFF) && defined(FEAT_EVAL)
-                           (char_u *)&p_pex, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+               s = mp->m_str;
+           if (s != NULL)
+           {
+@@ -4423,12 +4470,13 @@ check_abbr(c, ptr, col, mincol)
+ /*
+  * Evaluate the RHS of a mapping or abbreviations and take care of escaping
+  * special characters.
+  */
+     static char_u *
+-eval_map_expr(str)
++eval_map_expr(str, c)
+     char_u    *str;
++    int               c;          /* NUL or typed character for abbreviation */
+ {
+     char_u    *res;
+     char_u    *p;
+     char_u    *save_cmd;
+     pos_T     save_cursor;
+@@ -4441,10 +4489,11 @@ eval_map_expr(str)
+      * effects.  Also restore the cursor position. */
+     ++textlock;
+ #ifdef FEAT_EX_EXTRA
+     ++ex_normal_lock;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"patchmode",   "pm",   P_STRING|P_VI_DEF|P_NFNAME,
-                           (char_u *)&p_pm, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"path",      "pa",   P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_path, PV_PATH,
-                           {
- #if defined AMIGA || defined MSDOS || defined MSWIN
-                           (char_u *)".,,",
-@@ -1870,55 +1885,55 @@ static struct vimoption
-                           (char_u *)".,/emx/include,,",
- # else /* Unix, probably */
-                           (char_u *)".,/usr/include,,",
++    set_vim_var_char(c);  /* set v:char to the typed character */
+     save_cursor = curwin->w_cursor;
+     p = eval_to_string(str, NULL, FALSE);
+     --textlock;
+ #ifdef FEAT_EX_EXTRA
+     --ex_normal_lock;
+@@ -4700,11 +4749,11 @@ makemap(fd, buf)
+                   }
+                   if (c1 && putc(c1, fd) < 0)
+                       return FAIL;
+                   if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0)
+                       return FAIL;
+-                  if (fprintf(fd, cmd) < 0)
++                  if (fputs(cmd, fd) < 0)
+                       return FAIL;
+                   if (buf != NULL && fputs(" <buffer>", fd) < 0)
+                       return FAIL;
+                   if (mp->m_silent && fputs(" <silent>", fd) < 0)
+                       return FAIL;
+@@ -4799,11 +4848,11 @@ put_escstr(fd, strstart, what)
+               c = TO_SPECIAL(str[1], str[2]);
+               str += 2;
+           }
+           if (IS_SPECIAL(c) || modifiers)     /* special key */
+           {
+-              if (fprintf(fd, (char *)get_special_key_name(c, modifiers)) < 0)
++              if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0)
+                   return FAIL;
+               continue;
+           }
+       }
+--- vim72.orig/src/globals.h
++++ vim72/src/globals.h
+@@ -480,12 +480,14 @@ EXTERN char      *foreground_argument INIT(=
+ # endif
+ /*
+  * While executing external commands or in Ex mode, should not insert GUI
+  * events in the input buffer: Set hold_gui_events to non-zero.
++ *
++ * volatile because it is used in signal handler sig_sysmouse().
+  */
+-EXTERN int    hold_gui_events INIT(= 0);
++EXTERN volatile int hold_gui_events INIT(= 0);
+ /*
+  * When resizing the shell is postponed, remember the new size, and call
+  * gui_resize_shell() later.
+  */
+@@ -505,10 +507,11 @@ EXTERN VimClipboard clip_plus;   /* CLIPBO
+ #  define clip_plus clip_star /* there is only one clipboard */
  # endif
+ EXTERN int    clip_unnamed INIT(= FALSE);
+ EXTERN int    clip_autoselect INIT(= FALSE);
+ EXTERN int    clip_autoselectml INIT(= FALSE);
++EXTERN int    clip_html INIT(= FALSE);
+ EXTERN regprog_T *clip_exclude_prog INIT(= NULL);
  #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"preserveindent", "pi", P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_pi, PV_PI,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"previewheight", "pvh", P_NUM|P_VI_DEF,
- #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
-                           (char_u *)&p_pvh, PV_NONE,
+ /*
+  * All windows are linked in a list. firstwin points to the first entry,
+@@ -520,11 +523,11 @@ EXTERN regprog_T *clip_exclude_prog INIT
+ EXTERN win_T  *firstwin;              /* first window */
+ EXTERN win_T  *lastwin;               /* last window */
+ EXTERN win_T  *prevwin INIT(= NULL);  /* previous window */
+ # define W_NEXT(wp) ((wp)->w_next)
+ # define FOR_ALL_WINDOWS(wp) for (wp = firstwin; wp != NULL; wp = wp->w_next)
+-#define FOR_ALL_TAB_WINDOWS(tp, wp) \
++# define FOR_ALL_TAB_WINDOWS(tp, wp) \
+     for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next) \
+       for ((wp) = ((tp) == curtab) \
+               ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
  #else
-                           (char_u *)NULL, PV_NONE,
+ # define firstwin curwin
+@@ -534,10 +537,15 @@ EXTERN win_T     *prevwin INIT(= NULL);  /* p
+ # define FOR_ALL_TAB_WINDOWS(tp, wp) wp = curwin;
  #endif
--                          {(char_u *)12L, (char_u *)0L}},
-+                          {(char_u *)12L, (char_u *)0L} SCRIPTID_INIT},
-     {"previewwindow", "pvw", P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB,
- #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
-                           (char_u *)VAR_WIN, PV_PVW,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"printdevice", "pdev", P_STRING|P_VI_DEF|P_SECURE,
- #ifdef FEAT_PRINTER
-                           (char_u *)&p_pdev, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"printencoding", "penc", P_STRING|P_VI_DEF,
- #ifdef FEAT_POSTSCRIPT
-                           (char_u *)&p_penc, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"printexpr", "pexpr",  P_STRING|P_VI_DEF,
- #ifdef FEAT_POSTSCRIPT
-                           (char_u *)&p_pexpr, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"printfont", "pfn",    P_STRING|P_VI_DEF,
- #ifdef FEAT_PRINTER
-                           (char_u *)&p_pfn, PV_NONE,
-                           {
- # ifdef MSWIN
-@@ -1929,187 +1944,190 @@ static struct vimoption
-                               (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"printheader", "pheader",  P_STRING|P_VI_DEF|P_GETTEXT,
- #ifdef FEAT_PRINTER
-                           (char_u *)&p_header, PV_NONE,
-                           {(char_u *)N_("%<%f%h%m%=Page %N"), (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-    {"printmbcharset", "pmbcs",  P_STRING|P_VI_DEF,
- #if defined(FEAT_POSTSCRIPT) && defined(FEAT_MBYTE)
-                           (char_u *)&p_pmcs, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"printmbfont", "pmbfn",  P_STRING|P_VI_DEF,
- #if defined(FEAT_POSTSCRIPT) && defined(FEAT_MBYTE)
-                           (char_u *)&p_pmfn, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"printoptions", "popt", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_PRINTER
-                           (char_u *)&p_popt, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"prompt",            NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_prompt, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"pumheight",   "ph",   P_NUM|P_VI_DEF,
- #ifdef FEAT_INS_EXPAND
-                           (char_u *)&p_ph, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"quoteescape", "qe",   P_STRING|P_ALLOCED|P_VI_DEF,
- #ifdef FEAT_TEXTOBJ
-                           (char_u *)&p_qe, PV_QE,
-                           {(char_u *)"\\", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"readonly",    "ro",   P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB,
-                           (char_u *)&p_ro, PV_RO,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"redraw",            NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"redrawtime",  "rdt",  P_NUM|P_VI_DEF,
- #ifdef FEAT_RELTIME
-                           (char_u *)&p_rdt, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)2000L, (char_u *)0L}},
-+                          {(char_u *)2000L, (char_u *)0L} SCRIPTID_INIT},
-     {"remap",     NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_remap, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"report",            NULL,   P_NUM|P_VI_DEF,
-                           (char_u *)&p_report, PV_NONE,
--                          {(char_u *)2L, (char_u *)0L}},
-+                          {(char_u *)2L, (char_u *)0L} SCRIPTID_INIT},
-     {"restorescreen", "rs", P_BOOL|P_VI_DEF,
- #ifdef WIN3264
-                           (char_u *)&p_rs, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"revins",            "ri",   P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_RIGHTLEFT
-                           (char_u *)&p_ri, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"rightleft",   "rl",   P_BOOL|P_VI_DEF|P_RWIN,
- #ifdef FEAT_RIGHTLEFT
-                           (char_u *)VAR_WIN, PV_RL,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"rightleftcmd", "rlc", P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN,
- #ifdef FEAT_RIGHTLEFT
-                           (char_u *)VAR_WIN, PV_RLC,
-                           {(char_u *)"search", (char_u *)NULL}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"ruler",     "ru",   P_BOOL|P_VI_DEF|P_VIM|P_RSTAT,
- #ifdef FEAT_CMDL_INFO
-                           (char_u *)&p_ru, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"rulerformat", "ruf",  P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT,
- #ifdef FEAT_STL_OPT
-                           (char_u *)&p_ruf, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"runtimepath", "rtp",  P_STRING|P_VI_DEF|P_EXPAND|P_COMMA|P_NODUP|P_SECURE,
-                           (char_u *)&p_rtp, PV_NONE,
--                          {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L}},
-+                          {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"scroll",            "scr",  P_NUM|P_NO_MKRC|P_VI_DEF,
-                           (char_u *)VAR_WIN, PV_SCROLL,
--                          {(char_u *)12L, (char_u *)0L}},
-+                          {(char_u *)12L, (char_u *)0L} SCRIPTID_INIT},
-     {"scrollbind",  "scb",  P_BOOL|P_VI_DEF,
- #ifdef FEAT_SCROLLBIND
-                           (char_u *)VAR_WIN, PV_SCBIND,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"scrolljump",  "sj",   P_NUM|P_VI_DEF|P_VIM,
-                           (char_u *)&p_sj, PV_NONE,
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"scrolloff",   "so",   P_NUM|P_VI_DEF|P_VIM|P_RALL,
-                           (char_u *)&p_so, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"scrollopt",   "sbo",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_SCROLLBIND
-                           (char_u *)&p_sbo, PV_NONE,
-                           {(char_u *)"ver,jump", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"sections",    "sect", P_STRING|P_VI_DEF,
-                           (char_u *)&p_sections, PV_NONE,
--                          {(char_u *)"SHNHH HUnhsh", (char_u *)0L}},
-+                          {(char_u *)"SHNHH HUnhsh", (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"secure",            NULL,   P_BOOL|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_secure, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"selection",   "sel",  P_STRING|P_VI_DEF,
- #ifdef FEAT_VISUAL
-                           (char_u *)&p_sel, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"inclusive", (char_u *)0L}},
-+                          {(char_u *)"inclusive", (char_u *)0L}
-+                          SCRIPTID_INIT},
-     {"selectmode",  "slm",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_VISUAL
-                           (char_u *)&p_slm, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+ EXTERN win_T  *curwin;        /* currently active window */
++#ifdef FEAT_AUTOCMD
++EXTERN win_T  *aucmd_win;     /* window used in aucmd_prepbuf() */
++EXTERN int    aucmd_win_used INIT(= FALSE);   /* aucmd_win is being used */
++#endif
++
+ /*
+  * The window layout is kept in a tree of frames.  topframe points to the top
+  * of the tree.
+  */
+ EXTERN frame_T        *topframe;      /* top of the window frame tree */
+@@ -595,11 +603,12 @@ EXTERN int       exiting INIT(= FALSE);
+                                * still keep on running if there is a changed
+                                * buffer. */
+ EXTERN int    really_exiting INIT(= FALSE);
+                               /* TRUE when we are sure to exit, e.g., after
+                                * a deadly signal */
+-EXTERN int    full_screen INIT(= FALSE);
++/* volatile because it is used in signal handler deathtrap(). */
++EXTERN volatile int full_screen INIT(= FALSE);
+                               /* TRUE when doing full-screen output
+                                * otherwise only writing some messages */
+ EXTERN int    restricted INIT(= FALSE);
+                               /* TRUE when started as "rvim" */
+@@ -614,10 +623,15 @@ EXTERN int       textlock INIT(= 0);
+ #ifdef FEAT_AUTOCMD
+ EXTERN int    curbuf_lock INIT(= 0);
+                               /* non-zero when the current buffer can't be
+                                * changed.  Used for FileChangedRO. */
++EXTERN int    allbuf_lock INIT(= 0);
++                              /* non-zero when no buffer name can be
++                               * changed, no buffer can be deleted and
++                               * current directory can't be changed.
++                               * Used for SwapExists et al. */
  #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"sessionoptions", "ssop", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_SESSION
-                           (char_u *)&p_ssop, PV_NONE,
-        {(char_u *)"blank,buffers,curdir,folds,help,options,tabpages,winsize",
-                                                              (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ #ifdef FEAT_EVAL
+ # define HAVE_SANDBOX
+ EXTERN int    sandbox INIT(= 0);
+                               /* Non-zero when evaluating an expression in a
+@@ -708,11 +722,11 @@ EXTERN int       can_si INIT(= FALSE);
+ EXTERN int    can_si_back INIT(= FALSE);
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"shell",     "sh",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_sh, PV_NONE,
-                           {
- #ifdef VMS
-                           (char_u *)"-",
-@@ -2134,11 +2152,11 @@ static struct vimoption
- #    endif
- #   endif
- #  endif
+ EXTERN pos_T  saved_cursor            /* w_cursor before formatting text. */
+ # ifdef DO_INIT
+-      = INIT_POS_T
++      = INIT_POS_T(0, 0, 0)
  # endif
- #endif /* VMS */
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"shellcmdflag","shcf", P_STRING|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_shcf, PV_NONE,
-                           {
- #if defined(MSDOS) || defined(MSWIN)
-                           (char_u *)"/c",
-@@ -2147,11 +2165,11 @@ static struct vimoption
-                           (char_u *)"/c",
- # else
-                           (char_u *)"-c",
+       ;
+ /*
+  * Stuff for insert mode.
+@@ -737,14 +751,16 @@ EXTERN JMP_BUF x_jump_env;
+  * Stuff for setjmp() and longjmp().
+  * Used to protect areas where we could crash.
+  */
+ EXTERN JMP_BUF lc_jump_env;   /* argument to SETJMP() */
+ # ifdef SIGHASARG
+-EXTERN int lc_signal;         /* catched signal number, 0 when no was signal
+-                                 catched; used for mch_libcall() */
++/* volatile because it is used in signal handlers. */
++EXTERN volatile int lc_signal;        /* caught signal number, 0 when no was signal
++                                 caught; used for mch_libcall() */
  # endif
+-EXTERN int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */
++/* volatile because it is used in signal handler deathtrap(). */
++EXTERN volatile int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */
  #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"shellpipe",   "sp",   P_STRING|P_VI_DEF|P_SECURE,
- #ifdef FEAT_QUICKFIX
-                           (char_u *)&p_sp, PV_NONE,
-                           {
- #if defined(UNIX) || defined(OS2)
-@@ -2166,66 +2184,67 @@ static struct vimoption
-                               (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ #if defined(FEAT_MBYTE) || defined(FEAT_POSTSCRIPT)
+ /*
+  * These flags are set based upon 'fileencoding'.
+@@ -798,15 +814,18 @@ EXTERN vimconv_T output_conv;                    /* type
+  * (DBCS).
+  * The value is set in mb_init();
+  */
+ /* length of char in bytes, including following composing chars */
+ EXTERN int (*mb_ptr2len) __ARGS((char_u *p)) INIT(= latin_ptr2len);
++/* idem, with limit on string length */
++EXTERN int (*mb_ptr2len_len) __ARGS((char_u *p, int size)) INIT(= latin_ptr2len_len);
+ /* byte length of char */
+ EXTERN int (*mb_char2len) __ARGS((int c)) INIT(= latin_char2len);
+ /* convert char to bytes, return the length */
+ EXTERN int (*mb_char2bytes) __ARGS((int c, char_u *buf)) INIT(= latin_char2bytes);
+ EXTERN int (*mb_ptr2cells) __ARGS((char_u *p)) INIT(= latin_ptr2cells);
++EXTERN int (*mb_ptr2cells_len) __ARGS((char_u *p, int size)) INIT(= latin_ptr2cells_len);
+ EXTERN int (*mb_char2cells) __ARGS((int c)) INIT(= latin_char2cells);
+ EXTERN int (*mb_off2cells) __ARGS((unsigned off, unsigned max_off)) INIT(= latin_off2cells);
+ EXTERN int (*mb_ptr2char) __ARGS((char_u *p)) INIT(= latin_ptr2char);
+ EXTERN int (*mb_head_off) __ARGS((char_u *base, char_u *p)) INIT(= latin_head_off);
+@@ -948,11 +967,11 @@ EXTERN struct buffheader stuffbuff       /* st
+                   = {{NULL, {NUL}}, NULL, 0, 0}
  #endif
--    },
-+                          SCRIPTID_INIT},
-     {"shellquote",  "shq",  P_STRING|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_shq, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"shellredir",  "srr",  P_STRING|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_srr, PV_NONE,
--                          {(char_u *)">", (char_u *)0L}},
-+                          {(char_u *)">", (char_u *)0L} SCRIPTID_INIT},
-     {"shellslash",  "ssl",   P_BOOL|P_VI_DEF,
- #ifdef BACKSLASH_IN_FILENAME
-                           (char_u *)&p_ssl, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+                   ;
+ EXTERN typebuf_T typebuf              /* typeahead buffer */
+ #ifdef DO_INIT
+-                  = {NULL, NULL}
++                  = {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"shelltemp",   "stmp", P_BOOL,
-                           (char_u *)&p_stmp, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)TRUE}},
-+                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
-     {"shelltype",   "st",   P_NUM|P_VI_DEF,
- #ifdef AMIGA
-                           (char_u *)&p_st, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+                   ;
+ #ifdef FEAT_EX_EXTRA
+ EXTERN int    ex_normal_busy INIT(= 0); /* recursiveness of ex_normal() */
+ EXTERN int    ex_normal_lock INIT(= 0); /* forbid use of ex_normal() */
+@@ -984,11 +1003,12 @@ EXTERN char_u   *use_viminfo INIT(= NULL);
+ EXTERN FILE   *scriptin[NSCRIPT];         /* streams to read script from */
+ EXTERN int    curscript INIT(= 0);        /* index in scriptin[] */
+ EXTERN FILE   *scriptout  INIT(= NULL);   /* stream to write script to */
+ EXTERN int    read_cmd_fd INIT(= 0);      /* fd to read commands from */
+-EXTERN int    got_int INIT(= FALSE);      /* set to TRUE when interrupt
++/* volatile because it is used in signal handler catch_sigint(). */
++EXTERN volatile int got_int INIT(= FALSE);    /* set to TRUE when interrupt
+                                               signal occurred */
+ #ifdef USE_TERM_CONSOLE
+ EXTERN int    term_console INIT(= FALSE); /* set to TRUE when console used */
  #endif
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"shellxquote", "sxq",  P_STRING|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_sxq, PV_NONE,
-                           {
- #if defined(UNIX) && defined(USE_SYSTEM) && !defined(__EMX__)
-                           (char_u *)"\"",
- #else
-                           (char_u *)"",
+ EXTERN int    termcap_active INIT(= FALSE);   /* set by starttermcap() */
+@@ -1020,16 +1040,17 @@ EXTERN char_u  *repeat_cmdline INIT(= NUL
+ #ifdef FEAT_CMDHIST
+ EXTERN char_u *new_last_cmdline INIT(= NULL); /* new value for last_cmdline */
  #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"shiftround",  "sr",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_sr, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"shiftwidth",  "sw",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_sw, PV_SW,
--                          {(char_u *)8L, (char_u *)0L}},
-+                          {(char_u *)8L, (char_u *)0L} SCRIPTID_INIT},
-     {"shortmess",   "shm",  P_STRING|P_VIM|P_FLAGLIST,
-                           (char_u *)&p_shm, PV_NONE,
--                          {(char_u *)"", (char_u *)"filnxtToO"}},
-+                          {(char_u *)"", (char_u *)"filnxtToO"}
-+                          SCRIPTID_INIT},
-     {"shortname",   "sn",   P_BOOL|P_VI_DEF,
- #ifdef SHORT_FNAME
-                           (char_u *)NULL, PV_NONE,
- #else
-                           (char_u *)&p_sn, PV_SN,
+ #ifdef FEAT_AUTOCMD
+ EXTERN char_u *autocmd_fname INIT(= NULL); /* fname for <afile> on cmdline */
++EXTERN int    autocmd_fname_full;          /* autocmd_fname is full path */
+ EXTERN int    autocmd_bufnr INIT(= 0);     /* fnum for <abuf> on cmdline */
+ EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */
+ EXTERN int    did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */
+ EXTERN pos_T  last_cursormoved            /* for CursorMoved event */
+ # ifdef DO_INIT
+-                      = INIT_POS_T
++                      = INIT_POS_T(0, 0, 0)
+ # endif
+                       ;
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"showbreak",   "sbr",  P_STRING|P_VI_DEF|P_RALL,
- #ifdef FEAT_LINEBREAK
-                           (char_u *)&p_sbr, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+ EXTERN linenr_T       write_no_eol_lnum INIT(= 0); /* non-zero lnum when last line
+@@ -1337,11 +1358,10 @@ EXTERN garray_T error_ga
+       ;
  #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"showcmd",           "sc",   P_BOOL|P_VIM,
- #ifdef FEAT_CMDL_INFO
-                           (char_u *)&p_sc, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
-@@ -2234,529 +2253,532 @@ static struct vimoption
- #ifdef UNIX
-                               (char_u *)FALSE
- #else
-                               (char_u *)TRUE
+ #ifdef FEAT_NETBEANS_INTG
+ EXTERN char *netbeansArg INIT(= NULL);        /* the -nb[:host:port:passwd] arg */
+-EXTERN int netbeansCloseFile INIT(= 0);       /* send killed if != 0 */
+ EXTERN int netbeansFireChanges INIT(= 1); /* send buffer changes if != 0 */
+ EXTERN int netbeansForcedQuit INIT(= 0);/* don't write modified files */
+ EXTERN int netbeansReadFile INIT(= 1);        /* OK to read from disk if != 0 */
+ EXTERN int netbeansSuppressNoLines INIT(= 0); /* skip "No lines in buffer" */
+ EXTERN int usingNetbeans INIT(= 0);   /* set if -nb flag is used */
+@@ -1545,10 +1565,22 @@ EXTERN int xsmp_icefd INIT(= -1);   /* T
  #endif
--                              }},
-+                              } SCRIPTID_INIT},
-     {"showfulltag", "sft",  P_BOOL|P_VI_DEF,
-                           (char_u *)&p_sft, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"showmatch",   "sm",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_sm, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"showmode",    "smd",  P_BOOL|P_VIM,
-                           (char_u *)&p_smd, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)TRUE}},
-+                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
-     {"showtabline", "stal", P_NUM|P_VI_DEF|P_RALL,
- #ifdef FEAT_WINDOWS
-                           (char_u *)&p_stal, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"sidescroll",  "ss",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_ss, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"sidescrolloff", "siso", P_NUM|P_VI_DEF|P_VIM|P_RBUF,
-                           (char_u *)&p_siso, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"slowopen",    "slow", P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"smartcase",   "scs",  P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_scs, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"smartindent", "si",   P_BOOL|P_VI_DEF|P_VIM,
- #ifdef FEAT_SMARTINDENT
-                           (char_u *)&p_si, PV_SI,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"smarttab",    "sta",  P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_sta, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"softtabstop", "sts",  P_NUM|P_VI_DEF|P_VIM,
-                           (char_u *)&p_sts, PV_STS,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"sourceany",   NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"spell",     NULL,   P_BOOL|P_VI_DEF|P_RWIN,
- #ifdef FEAT_SPELL
-                           (char_u *)VAR_WIN, PV_SPELL,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"spellcapcheck", "spc", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF,
- #ifdef FEAT_SPELL
-                           (char_u *)&p_spc, PV_SPC,
-                           {(char_u *)"[.?!]\\_[\\])'\"         ]\\+", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"spellfile",   "spf",  P_STRING|P_EXPAND|P_ALLOCED|P_VI_DEF|P_SECURE|P_COMMA,
- #ifdef FEAT_SPELL
-                           (char_u *)&p_spf, PV_SPF,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"spelllang",   "spl",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_RBUF|P_EXPAND,
- #ifdef FEAT_SPELL
-                           (char_u *)&p_spl, PV_SPL,
-                           {(char_u *)"en", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ /* For undo we need to know the lowest time possible. */
+ EXTERN time_t starttime;
++#ifdef STARTUPTIME
++EXTERN FILE *time_fd INIT(= NULL);  /* where to write startup timing */
++#endif
++
++/*
++ * Some compilers warn for not using a return value, but in some situations we
++ * can't do anything useful with the value.  Assign to this variable to avoid
++ * the warning.
++ */
++EXTERN int ignored;
++EXTERN char *ignoredp;
++
+ /*
+  * Optional Farsi support.  Include it here, so EXTERN and INIT are defined.
+  */
+ #ifdef FEAT_FKMAP
+ # include "farsi.h"
+--- vim72.orig/src/gui.c
++++ vim72/src/gui.c
+@@ -137,11 +137,11 @@ gui_start()
+           else
+           {
+               /* The read returns when the child closes the pipe (or when
+                * the child dies for some reason). */
+               close(pipefd[1]);
+-              (void)read(pipefd[0], &dummy, (size_t)1);
++              ignored = (int)read(pipefd[0], &dummy, (size_t)1);
+               close(pipefd[0]);
+           }
+           /* When swapping screens we may need to go to the next line, e.g.,
+            * after a hit-enter prompt and using ":gui". */
+@@ -676,15 +676,14 @@ gui_shell_closed()
+  * font.
+  * If "fontset" is TRUE, the "font_list" is used as one name for the fontset.
+  * Return OK when able to set the font.  When it failed FAIL is returned and
+  * the fonts are unchanged.
+  */
+-/*ARGSUSED*/
+     int
+ gui_init_font(font_list, fontset)
+     char_u    *font_list;
+-    int               fontset;
++    int               fontset UNUSED;
+ {
+ #define FONTLEN 320
+     char_u    font_name[FONTLEN];
+     int               font_list_empty = FALSE;
+     int               ret = FAIL;
+@@ -958,11 +957,11 @@ gui_update_cursor(force, clear_selection
+           {
+               static int iid;
+               guicolor_T fg, bg;
+               if (
+-# ifdef HAVE_GTK2
++# if defined(HAVE_GTK2) && !defined(FEAT_HANGULIN)
+                       preedit_get_status()
+ # else
+                       im_get_status()
+ # endif
+                       )
+@@ -1136,14 +1135,13 @@ gui_position_menu()
+ /*
+  * Position the various GUI components (text area, menu).  The vertical
+  * scrollbars are NOT handled here.  See gui_update_scrollbars().
+  */
+-/*ARGSUSED*/
+     static void
+ gui_position_components(total_width)
+-    int           total_width;
++    int           total_width UNUSED;
+ {
+     int           text_area_x;
+     int           text_area_y;
+     int           text_area_width;
+     int           text_area_height;
+@@ -1372,14 +1370,13 @@ gui_get_shellsize()
+ /*
+  * Set the size of the Vim shell according to Rows and Columns.
+  * If "fit_to_display" is TRUE then the size may be reduced to fit the window
+  * on the screen.
+  */
+-/*ARGSUSED*/
+     void
+ gui_set_shellsize(mustset, fit_to_display, direction)
+-    int               mustset;                /* set by the user */
++    int               mustset UNUSED;         /* set by the user */
+     int               fit_to_display;
+     int               direction;              /* RESIZE_HOR, RESIZE_VER */
+ {
+     int               base_width;
+     int               base_height;
+@@ -1387,10 +1384,15 @@ gui_set_shellsize(mustset, fit_to_displa
+     int               height;
+     int               min_width;
+     int               min_height;
+     int               screen_w;
+     int               screen_h;
++#ifdef HAVE_GTK2
++    int               un_maximize = mustset;
++    int         did_adjust = 0;
++#endif
++    int               x = -1, y = -1;
+     if (!gui.shell_created)
+       return;
+ #ifdef MSWIN
+@@ -1403,10 +1405,14 @@ gui_set_shellsize(mustset, fit_to_displa
+     }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"spellsuggest", "sps", P_STRING|P_VI_DEF|P_EXPAND|P_SECURE|P_COMMA,
- #ifdef FEAT_SPELL
-                           (char_u *)&p_sps, PV_NONE,
-                           {(char_u *)"best", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+     base_width = gui_get_base_width();
+     base_height = gui_get_base_height();
++    if (fit_to_display)
++      /* Remember the original window position. */
++      gui_mch_get_winpos(&x, &y);
++
+ #ifdef USE_SUN_WORKSHOP
+     if (!mustset && usingSunWorkShop
+                               && workshop_get_width_height(&width, &height))
+     {
+       Columns = (width - base_width + gui.char_width - 1) / gui.char_width;
+@@ -1426,34 +1432,60 @@ gui_set_shellsize(mustset, fit_to_displa
+       {
+           Columns = (screen_w - base_width) / gui.char_width;
+           if (Columns < MIN_COLUMNS)
+               Columns = MIN_COLUMNS;
+           width = Columns * gui.char_width + base_width;
++#ifdef HAVE_GTK2
++          ++did_adjust;
++#endif
+       }
+       if ((direction & RESIZE_VERT) && height > screen_h)
+       {
+           Rows = (screen_h - base_height) / gui.char_height;
+           check_shellsize();
+           height = Rows * gui.char_height + base_height;
++#ifdef HAVE_GTK2
++          ++did_adjust;
++#endif
+       }
++#ifdef HAVE_GTK2
++      if (did_adjust == 2 || (width + gui.char_width >= screen_w
++                                   && height + gui.char_height >= screen_h))
++          /* don't unmaximize if at maximum size */
++          un_maximize = FALSE;
++#endif
+     }
+     gui.num_cols = Columns;
+     gui.num_rows = Rows;
+     min_width = base_width + MIN_COLUMNS * gui.char_width;
+     min_height = base_height + MIN_LINES * gui.char_height;
+-# ifdef FEAT_WINDOWS
++#ifdef FEAT_WINDOWS
+     min_height += tabline_height() * gui.char_height;
+-# endif
++#endif
++
++#ifdef HAVE_GTK2
++    if (un_maximize)
++    {
++      /* If the window size is smaller than the screen unmaximize the
++       * window, otherwise resizing won't work. */
++      gui_mch_get_screen_dimensions(&screen_w, &screen_h);
++      if ((width + gui.char_width < screen_w
++                                 || height + gui.char_height * 2 < screen_h)
++              && gui_mch_maximized())
++          gui_mch_unmaximize();
++    }
++#endif
+     gui_mch_set_shellsize(width, height, min_width, min_height,
+                                         base_width, base_height, direction);
+-    if (fit_to_display)
+-    {
+-      int         x, y;
+-      /* Some window managers put the Vim window left of/above the screen. */
++    if (fit_to_display && x >= 0 && y >= 0)
++    {
++      /* Some window managers put the Vim window left of/above the screen.
++       * Only change the position if it wasn't already negative before
++       * (happens on MS-Windows with a secondary monitor). */
+       gui_mch_update();
+       if (gui_mch_get_winpos(&x, &y) == OK && (x < 0 || y < 0))
+           gui_mch_set_winpos(x < 0 ? 0 : x, y < 0 ? 0 : y);
+     }
+@@ -3118,14 +3150,13 @@ static int     prev_which_scrollbars[3];
+ /*
+  * Set which components are present.
+  * If "oldval" is not NULL, "oldval" is the previous value, the new value is
+  * in p_go.
+  */
+-/*ARGSUSED*/
+     void
+ gui_init_which_components(oldval)
+-    char_u    *oldval;
++    char_u    *oldval UNUSED;
+ {
+ #ifdef FEAT_MENU
+     static int        prev_menu_is_active = -1;
  #endif
--    },
-+                          SCRIPTID_INIT},
-     {"splitbelow",  "sb",   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_TOOLBAR
+@@ -3239,11 +3270,11 @@ gui_init_which_components(oldval)
+           /* We don't want a resize event change "Rows" here, save and
+            * restore it.  Resizing is handled below. */
+           i = Rows;
+           gui_update_tabline();
+           Rows = i;
+-          need_set_size = RESIZE_VERT;
++          need_set_size |= RESIZE_VERT;
+           if (using_tabline)
+               fix_size = TRUE;
+           if (!gui_use_tabline())
+               redraw_tabline = TRUE;    /* may draw non-GUI tab line */
+       }
+@@ -3273,13 +3304,13 @@ gui_init_which_components(oldval)
+                   }
+               }
+               if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
+               {
+                   if (i == SBAR_BOTTOM)
+-                      need_set_size = RESIZE_VERT;
++                      need_set_size |= RESIZE_VERT;
+                   else
+-                      need_set_size = RESIZE_HOR;
++                      need_set_size |= RESIZE_HOR;
+                   if (gui.which_scrollbars[i])
+                       fix_size = TRUE;
+               }
+           }
  #ifdef FEAT_WINDOWS
-                           (char_u *)&p_sb, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"splitright",  "spr",  P_BOOL|P_VI_DEF,
- #ifdef FEAT_VERTSPLIT
-                           (char_u *)&p_spr, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+@@ -3295,32 +3326,32 @@ gui_init_which_components(oldval)
+            * restore it.  Resizing is handled below. */
+           i = Rows;
+           gui_mch_enable_menu(gui.menu_is_active);
+           Rows = i;
+           prev_menu_is_active = gui.menu_is_active;
+-          need_set_size = RESIZE_VERT;
++          need_set_size |= RESIZE_VERT;
+           if (gui.menu_is_active)
+               fix_size = TRUE;
+       }
  #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"startofline", "sol",  P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_sol, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"statusline"  ,"stl",  P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT,
- #ifdef FEAT_STL_OPT
-                           (char_u *)&p_stl, PV_STL,
- #else
-                           (char_u *)NULL, PV_NONE,
+ #ifdef FEAT_TOOLBAR
+       if (using_toolbar != prev_toolbar)
+       {
+           gui_mch_show_toolbar(using_toolbar);
+           prev_toolbar = using_toolbar;
+-          need_set_size = RESIZE_VERT;
++          need_set_size |= RESIZE_VERT;
+           if (using_toolbar)
+               fix_size = TRUE;
+       }
  #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"suffixes",    "su",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_su, PV_NONE,
-                           {(char_u *)".bak,~,.o,.h,.info,.swp,.obj",
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"suffixesadd", "sua",  P_STRING|P_VI_DEF|P_ALLOCED|P_COMMA|P_NODUP,
- #ifdef FEAT_SEARCHPATH
-                           (char_u *)&p_sua, PV_SUA,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ #ifdef FEAT_FOOTER
+       if (using_footer != prev_footer)
+       {
+           gui_mch_enable_footer(using_footer);
+           prev_footer = using_footer;
+-          need_set_size = RESIZE_VERT;
++          need_set_size |= RESIZE_VERT;
+           if (using_footer)
+               fix_size = TRUE;
+       }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"swapfile",    "swf",  P_BOOL|P_VI_DEF|P_RSTAT,
-                           (char_u *)&p_swf, PV_SWF,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"swapsync",    "sws",  P_STRING|P_VI_DEF,
-                           (char_u *)&p_sws, PV_NONE,
--                          {(char_u *)"fsync", (char_u *)0L}},
-+                          {(char_u *)"fsync", (char_u *)0L} SCRIPTID_INIT},
-     {"switchbuf",   "swb",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_swb, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"synmaxcol",   "smc",  P_NUM|P_VI_DEF|P_RBUF,
- #ifdef FEAT_SYN_HL
-                           (char_u *)&p_smc, PV_SMC,
-                           {(char_u *)3000L, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+ #if defined(FEAT_MENU) && !defined(WIN16) && !(defined(WIN3264) && !defined(FEAT_TEAROFF))
+@@ -3328,14 +3359,15 @@ gui_init_which_components(oldval)
+       {
+           gui_mch_toggle_tearoffs(using_tearoff);
+           prev_tearoff = using_tearoff;
+       }
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"syntax",            "syn",  P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
- #ifdef FEAT_SYN_HL
-                           (char_u *)&p_syn, PV_SYN,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+-      if (need_set_size)
++      if (need_set_size != 0)
+       {
+ #ifdef FEAT_GUI_GTK
+-          long    c = Columns;
++          long    prev_Columns = Columns;
++          long    prev_Rows = Rows;
  #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"tabline",           "tal",  P_STRING|P_VI_DEF|P_RALL,
- #ifdef FEAT_STL_OPT
-                           (char_u *)&p_tal, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
+           /* Adjust the size of the window to make the text area keep the
+            * same size and to avoid that part of our window is off-screen
+            * and a scrollbar can't be used, for example. */
+           gui_set_shellsize(FALSE, fix_size, need_set_size);
+@@ -3347,15 +3379,18 @@ gui_init_which_components(oldval)
+            * change Columns and Rows when we don't want it.  Wait for a
+            * character here to avoid this effect.
+            * If you remove this, please test this command for resizing
+            * effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q".
+            * Don't do this while starting up though.
+-           * And don't change Rows, it may have be reduced intentionally
+-           * when adding menu/toolbar/tabline. */
+-          if (!gui.starting)
++           * Don't change Rows when adding menu/toolbar/tabline.
++           * Don't change Columns when adding vertical toolbar. */
++          if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR))
+               (void)char_avail();
+-          Columns = c;
++          if ((need_set_size & RESIZE_VERT) == 0)
++              Rows = prev_Rows;
++          if ((need_set_size & RESIZE_HOR) == 0)
++              Columns = prev_Columns;
  #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"tabpagemax",  "tpm",  P_NUM|P_VI_DEF,
+       }
  #ifdef FEAT_WINDOWS
-                           (char_u *)&p_tpm, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)10L, (char_u *)0L}},
-+                          {(char_u *)10L, (char_u *)0L} SCRIPTID_INIT},
-     {"tabstop",           "ts",   P_NUM|P_VI_DEF|P_RBUF,
-                           (char_u *)&p_ts, PV_TS,
--                          {(char_u *)8L, (char_u *)0L}},
-+                          {(char_u *)8L, (char_u *)0L} SCRIPTID_INIT},
-     {"tagbsearch",  "tbs",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_tbs, PV_NONE,
- #ifdef VMS    /* binary searching doesn't appear to work on VMS */
-                           {(char_u *)0L, (char_u *)0L}
- #else
-                           {(char_u *)TRUE, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"taglength",   "tl",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_tl, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"tagrelative", "tr",   P_BOOL|P_VIM,
-                           (char_u *)&p_tr, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)TRUE}},
-+                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
-     {"tags",      "tag",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_tags, PV_TAGS,
-                           {
- #if defined(FEAT_EMACS_TAGS) && !defined(CASE_INSENSITIVE_FILENAME)
-                           (char_u *)"./tags,./TAGS,tags,TAGS",
- #else
-                           (char_u *)"./tags,tags",
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"tagstack",    "tgst", P_BOOL|P_VI_DEF,
-                           (char_u *)&p_tgst, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"term",      NULL,   P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
-                           (char_u *)&T_NAME, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"termbidi", "tbidi",   P_BOOL|P_VI_DEF,
- #ifdef FEAT_ARABIC
-                           (char_u *)&p_tbidi, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"termencoding", "tenc", P_STRING|P_VI_DEF|P_RCLR,
- #ifdef FEAT_MBYTE
-                           (char_u *)&p_tenc, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"terse",     NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_terse, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"textauto",    "ta",   P_BOOL|P_VIM,
-                           (char_u *)&p_ta, PV_NONE,
--                          {(char_u *)DFLT_TEXTAUTO, (char_u *)TRUE}},
-+                          {(char_u *)DFLT_TEXTAUTO, (char_u *)TRUE}
-+                          SCRIPTID_INIT},
-     {"textmode",    "tx",   P_BOOL|P_VI_DEF|P_NO_MKRC,
-                           (char_u *)&p_tx, PV_TX,
-                           {
- #ifdef USE_CRNL
-                           (char_u *)TRUE,
- #else
-                           (char_u *)FALSE,
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"textwidth",   "tw",   P_NUM|P_VI_DEF|P_VIM,
-                           (char_u *)&p_tw, PV_TW,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"thesaurus",   "tsr",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_INS_EXPAND
-                           (char_u *)&p_tsr, PV_TSR,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"tildeop",           "top",  P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_to, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"timeout",           "to",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_timeout, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"timeoutlen",  "tm",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_tm, PV_NONE,
--                          {(char_u *)1000L, (char_u *)0L}},
-+                          {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT},
-     {"title",     NULL,   P_BOOL|P_VI_DEF,
- #ifdef FEAT_TITLE
-                           (char_u *)&p_title, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"titlelen",    NULL,   P_NUM|P_VI_DEF,
- #ifdef FEAT_TITLE
-                           (char_u *)&p_titlelen, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)85L, (char_u *)0L}},
-+                          {(char_u *)85L, (char_u *)0L} SCRIPTID_INIT},
-     {"titleold",    NULL,   P_STRING|P_VI_DEF|P_GETTEXT|P_SECURE|P_NO_MKRC,
- #ifdef FEAT_TITLE
-                           (char_u *)&p_titleold, PV_NONE,
-                           {(char_u *)N_("Thanks for flying Vim"),
-                                                              (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"titlestring", NULL,   P_STRING|P_VI_DEF,
- #ifdef FEAT_TITLE
-                           (char_u *)&p_titlestring, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
- #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32)
-     {"toolbar",     "tb",   P_STRING|P_COMMA|P_VI_DEF|P_NODUP,
-                           (char_u *)&p_toolbar, PV_NONE,
--                          {(char_u *)"icons,tooltips", (char_u *)0L}},
-+                          {(char_u *)"icons,tooltips", (char_u *)0L}
-+                          SCRIPTID_INIT},
- #endif
- #if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
-     {"toolbariconsize",       "tbis", P_STRING|P_VI_DEF,
-                           (char_u *)&p_tbis, PV_NONE,
--                          {(char_u *)"small", (char_u *)0L}},
-+                          {(char_u *)"small", (char_u *)0L} SCRIPTID_INIT},
- #endif
-     {"ttimeout",    NULL,   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_ttimeout, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"ttimeoutlen", "ttm",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_ttm, PV_NONE,
--                          {(char_u *)-1L, (char_u *)0L}},
-+                          {(char_u *)-1L, (char_u *)0L} SCRIPTID_INIT},
-     {"ttybuiltin",  "tbi",  P_BOOL|P_VI_DEF,
-                           (char_u *)&p_tbi, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"ttyfast",           "tf",   P_BOOL|P_NO_MKRC|P_VI_DEF,
-                           (char_u *)&p_tf, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"ttymouse",    "ttym", P_STRING|P_NODEFAULT|P_NO_MKRC|P_VI_DEF,
- #if defined(FEAT_MOUSE) && (defined(UNIX) || defined(VMS))
-                           (char_u *)&p_ttym, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"ttyscroll",   "tsl",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_ttyscroll, PV_NONE,
--                          {(char_u *)999L, (char_u *)0L}},
-+                          {(char_u *)999L, (char_u *)0L} SCRIPTID_INIT},
-     {"ttytype",           "tty",  P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
-                           (char_u *)&T_NAME, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"undolevels",  "ul",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_ul, PV_NONE,
-                           {
- #if defined(UNIX) || defined(WIN3264) || defined(OS2) || defined(VMS)
-                           (char_u *)1000L,
- #else
-                           (char_u *)100L,
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"updatecount", "uc",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_uc, PV_NONE,
--                          {(char_u *)200L, (char_u *)0L}},
-+                          {(char_u *)200L, (char_u *)0L} SCRIPTID_INIT},
-     {"updatetime",  "ut",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_ut, PV_NONE,
--                          {(char_u *)4000L, (char_u *)0L}},
-+                          {(char_u *)4000L, (char_u *)0L} SCRIPTID_INIT},
-     {"verbose",           "vbs",  P_NUM|P_VI_DEF,
-                           (char_u *)&p_verbose, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"verbosefile", "vfile", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_vfile, PV_NONE,
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"viewdir",     "vdir", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
- #ifdef FEAT_SESSION
-                           (char_u *)&p_vdir, PV_NONE,
-                           {(char_u *)DFLT_VDIR, (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"viewoptions", "vop",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_SESSION
-                           (char_u *)&p_vop, PV_NONE,
-                           {(char_u *)"folds,options,cursor", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"viminfo",           "vi",   P_STRING|P_COMMA|P_NODUP|P_SECURE,
- #ifdef FEAT_VIMINFO
-                           (char_u *)&p_viminfo, PV_NONE,
- #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
--                          {(char_u *)"", (char_u *)"'20,<50,s10,h,rA:,rB:"}
-+                          {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
- #else
- # ifdef AMIGA
-                           {(char_u *)"",
--                               (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"}
-+                               (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"}
- # else
--                          {(char_u *)"", (char_u *)"'20,<50,s10,h"}
-+                          {(char_u *)"", (char_u *)"'100,<50,s10,h"}
- # endif
- #endif
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"virtualedit", "ve",   P_STRING|P_COMMA|P_NODUP|P_VI_DEF|P_VIM,
- #ifdef FEAT_VIRTUALEDIT
-                           (char_u *)&p_ve, PV_NONE,
-                           {(char_u *)"", (char_u *)""}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"visualbell",  "vb",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_vb, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"w300",      NULL,   P_NUM|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"w1200",     NULL,   P_NUM|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"w9600",     NULL,   P_NUM|P_VI_DEF,
-                           (char_u *)NULL, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"warn",      NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_warn, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"weirdinvert", "wiv",  P_BOOL|P_VI_DEF|P_RCLR,
-                           (char_u *)&p_wiv, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"whichwrap",   "ww",   P_STRING|P_VIM|P_COMMA|P_FLAGLIST,
-                           (char_u *)&p_ww, PV_NONE,
--                          {(char_u *)"", (char_u *)"b,s"}},
-+                          {(char_u *)"", (char_u *)"b,s"} SCRIPTID_INIT},
-     {"wildchar",    "wc",   P_NUM|P_VIM,
-                           (char_u *)&p_wc, PV_NONE,
--                          {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB}},
-+                          {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB}
-+                          SCRIPTID_INIT},
-     {"wildcharm",   "wcm",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_wcm, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"wildignore",  "wig",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- #ifdef FEAT_WILDIGN
-                           (char_u *)&p_wig, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     {"wildmenu",    "wmnu", P_BOOL|P_VI_DEF,
- #ifdef FEAT_WILDMENU
-                           (char_u *)&p_wmnu, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"wildmode",    "wim",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-                           (char_u *)&p_wim, PV_NONE,
--                          {(char_u *)"full", (char_u *)0L}},
-+                          {(char_u *)"full", (char_u *)0L} SCRIPTID_INIT},
-     {"wildoptions", "wop",  P_STRING|P_VI_DEF,
- #ifdef FEAT_CMDL_COMPL
-                           (char_u *)&p_wop, PV_NONE,
-                           {(char_u *)"", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"winaltkeys",  "wak",  P_STRING|P_VI_DEF,
- #ifdef FEAT_WAK
-                           (char_u *)&p_wak, PV_NONE,
-                           {(char_u *)"menu", (char_u *)0L}
- #else
-                           (char_u *)NULL, PV_NONE,
-                           {(char_u *)NULL, (char_u *)0L}
- #endif
--                          },
-+                          SCRIPTID_INIT},
-     {"window",            "wi",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_window, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"winheight",   "wh",   P_NUM|P_VI_DEF,
- #ifdef FEAT_WINDOWS
-                           (char_u *)&p_wh, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"winfixheight", "wfh", P_BOOL|P_VI_DEF|P_RSTAT,
- #ifdef FEAT_WINDOWS
-                           (char_u *)VAR_WIN, PV_WFH,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"winfixwidth", "wfw", P_BOOL|P_VI_DEF|P_RSTAT,
- #ifdef FEAT_VERTSPLIT
-                           (char_u *)VAR_WIN, PV_WFW,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"winminheight", "wmh", P_NUM|P_VI_DEF,
- #ifdef FEAT_WINDOWS
-                           (char_u *)&p_wmh, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"winminwidth", "wmw", P_NUM|P_VI_DEF,
- #ifdef FEAT_VERTSPLIT
-                           (char_u *)&p_wmw, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)1L, (char_u *)0L}},
-+                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
-     {"winwidth",   "wiw",   P_NUM|P_VI_DEF,
- #ifdef FEAT_VERTSPLIT
-                           (char_u *)&p_wiw, PV_NONE,
- #else
-                           (char_u *)NULL, PV_NONE,
- #endif
--                          {(char_u *)20L, (char_u *)0L}},
-+                          {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT},
-     {"wrap",      NULL,   P_BOOL|P_VI_DEF|P_RWIN,
-                           (char_u *)VAR_WIN, PV_WRAP,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"wrapmargin",  "wm",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_wm, PV_WM,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
-     {"wrapscan",    "ws",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_ws, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"write",     NULL,   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_write, PV_NONE,
--                          {(char_u *)TRUE, (char_u *)0L}},
-+                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
-     {"writeany",    "wa",   P_BOOL|P_VI_DEF,
-                           (char_u *)&p_wa, PV_NONE,
--                          {(char_u *)FALSE, (char_u *)0L}},
-+                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
-     {"writebackup", "wb",   P_BOOL|P_VI_DEF|P_VIM,
-                           (char_u *)&p_wb, PV_NONE,
-                           {
- #ifdef FEAT_WRITEBACKUP
-                           (char_u *)TRUE,
- #else
-                           (char_u *)FALSE,
- #endif
--                              (char_u *)0L}},
-+                              (char_u *)0L} SCRIPTID_INIT},
-     {"writedelay",  "wd",   P_NUM|P_VI_DEF,
-                           (char_u *)&p_wd, PV_NONE,
--                          {(char_u *)0L, (char_u *)0L}},
-+                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
- /* terminal output codes */
- #define p_term(sss, vvv)   {sss, NULL, P_STRING|P_VI_DEF|P_RALL|P_SECURE, \
-                           (char_u *)&vvv, PV_NONE, \
--                          {(char_u *)"", (char_u *)0L}},
-+                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
-     p_term("t_AB", T_CAB)
-     p_term("t_AF", T_CAF)
-     p_term("t_AL", T_CAL)
-     p_term("t_al", T_AL)
-@@ -2813,11 +2835,12 @@ static struct vimoption
-     p_term("t_ZH", T_CZH)
-     p_term("t_ZR", T_CZR)
- /* terminal key codes are not in here */
--    {NULL, NULL, 0, NULL, PV_NONE, {NULL, NULL}}      /* end marker */
-+    /* end marker */
-+    {NULL, NULL, 0, NULL, PV_NONE, {NULL, NULL} SCRIPTID_INIT}
- };
- #define PARAM_COUNT (sizeof(options) / sizeof(struct vimoption))
- #ifdef FEAT_MBYTE
-@@ -3982,11 +4005,11 @@ do_set(arg, opt_flags)
-           arg += 7;
-       }
-       else
-       {
-           prefix = 1;
--          if (STRNCMP(arg, "no", 2) == 0)
-+          if (STRNCMP(arg, "no", 2) == 0 && STRNCMP(arg, "novice", 6) != 0)
-           {
-               prefix = 0;
-               arg += 2;
-           }
-           else if (STRNCMP(arg, "inv", 3) == 0)
-@@ -4117,15 +4140,27 @@ do_set(arg, opt_flags)
-           /* Skip all options that are window-local (used for :vimgrep). */
-           if ((opt_flags & OPT_NOWIN) && opt_idx >= 0
-                                          && options[opt_idx].var == VAR_WIN)
-               goto skip;
--          /* Disallow changing some options from modelines */
--          if ((opt_flags & OPT_MODELINE) && (flags & P_SECURE))
-+          /* Disallow changing some options from modelines. */
-+          if (opt_flags & OPT_MODELINE)
-           {
--              errmsg = (char_u *)_("E520: Not allowed in a modeline");
--              goto skip;
-+              if (flags & P_SECURE)
-+              {
-+                  errmsg = (char_u *)_("E520: Not allowed in a modeline");
-+                  goto skip;
-+              }
-+#ifdef FEAT_DIFF
-+              /* In diff mode some options are overruled.  This avoids that
-+               * 'foldmethod' becomes "marker" instead of "diff" and that
-+               * "wrap" gets set. */
-+              if (curwin->w_p_diff
-+                      && (options[opt_idx].indir == PV_FDM
-+                          || options[opt_idx].indir == PV_WRAP))
-+                  goto skip;
-+#endif
-           }
+       /* When the console tabline appears or disappears the window positions
+        * change. */
+@@ -3877,10 +3912,25 @@ gui_drag_scrollbar(sb, value, still_drag
  
- #ifdef HAVE_SANDBOX
-           /* Disallow changing some options in the sandbox */
-           if (sandbox != 0 && (flags & P_SECURE))
-@@ -5266,25 +5301,39 @@ insecure_flag(opt_idx, opt_flags)
-     /* Nothing special, return global flags field. */
-     return &options[opt_idx].flags;
- }
- #endif
+ /*
+  * Scrollbar stuff:
+  */
  
-+#ifdef FEAT_TITLE
-+static void redraw_titles __ARGS((void));
-+
 +/*
-+ * Redraw the window title and/or tab page text later.
++ * Called when something in the window layout has changed.
 + */
-+static void redraw_titles()
++    void
++gui_may_update_scrollbars()
 +{
-+    need_maketitle = TRUE;
-+# ifdef FEAT_WINDOWS
-+    redraw_tabline = TRUE;
-+# endif
++    if (gui.in_use && starting == 0)
++    {
++      out_flush();
++      gui_init_which_components(NULL);
++      gui_update_scrollbars(TRUE);
++    }
++    need_mouse_correct = TRUE;
 +}
-+#endif
 +
- /*
-  * Set a string option to a new value (without checking the effect).
-  * The string is copied into allocated memory.
-  * if ("opt_idx" == -1) "name" is used, otherwise "opt_idx" is used.
-  * When "set_sid" is zero set the scriptID to current_SID.  When "set_sid" is
-  * SID_NONE don't set the scriptID.  Otherwise set the scriptID to "set_sid".
-  */
--/*ARGSUSED*/
      void
- set_string_option_direct(name, opt_idx, val, opt_flags, set_sid)
-     char_u    *name;
-     int               opt_idx;
-     char_u    *val;
-     int               opt_flags;      /* OPT_FREE, OPT_LOCAL and/or OPT_GLOBAL */
--    int               set_sid;
-+    int               set_sid UNUSED;
+ gui_update_scrollbars(force)
+     int               force;      /* Force all scrollbars to get updated */
  {
-     char_u    *s;
-     char_u    **varp;
-     int               both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0;
-     int               idx = opt_idx;
-@@ -5405,10 +5454,14 @@ did_set_string_option(opt_idx, varp, new
-     char_u    *errmsg = NULL;
-     char_u    *s, *p;
-     int               did_chartab = FALSE;
-     char_u    **gvarp;
-     long_u    free_oldval = (options[opt_idx].flags & P_ALLOCED);
-+#ifdef FEAT_GUI
-+    /* set when changing an option that only requires a redraw in the GUI */
-+    int               redraw_gui_only = FALSE;
-+#endif
+     win_T     *wp;
+@@ -4405,11 +4455,11 @@ gui_do_horiz_scroll()
+ {
+     /* no wrapping, no scrolling */
+     if (curwin->w_p_wrap)
+       return FALSE;
  
-     /* Get the global option to compare with, otherwise we would have to check
-      * two values for all local options. */
-     gvarp = (char_u **)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL);
+-    if (curwin->w_leftcol == scrollbar_value)
++    if ((long_u)curwin->w_leftcol == scrollbar_value)
+       return FALSE;
  
-@@ -5666,11 +5719,11 @@ did_set_string_option(opt_idx, varp, new
-               errmsg = e_invarg;
-           else
-           {
- # ifdef FEAT_TITLE
-               /* May show a "+" in the title now. */
--              need_maketitle = TRUE;
-+              redraw_titles();
- # endif
-               /* Add 'fileencoding' to the swap file. */
-               ml_setflags(curbuf);
-           }
-       }
-@@ -5685,11 +5738,11 @@ did_set_string_option(opt_idx, varp, new
-           }
-           if (varp == &p_enc)
-           {
-               errmsg = mb_init();
- # ifdef FEAT_TITLE
--              need_maketitle = TRUE;
-+              redraw_titles();
- # endif
-           }
-       }
+     curwin->w_leftcol = (colnr_T)scrollbar_value;
  
- # if defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
-@@ -5764,18 +5817,32 @@ did_set_string_option(opt_idx, varp, new
-     else if (varp == &curbuf->b_p_keymap)
+     /* When the line of the cursor is too short, move the cursor to the
+@@ -4418,11 +4468,11 @@ gui_do_horiz_scroll()
+     if (vim_strchr(p_go, GO_HORSCROLL) == NULL
+           && longest_lnum >= curwin->w_topline
+           && longest_lnum < curwin->w_botline
+           && !virtual_active())
      {
-       /* load or unload key mapping tables */
-       errmsg = keymap_init();
--      /* When successfully installed a new keymap switch on using it. */
--      if (*curbuf->b_p_keymap != NUL && errmsg == NULL)
-+      if (errmsg == NULL)
+-      if (scrollbar_value > scroll_line_len(curwin->w_cursor.lnum))
++      if (scrollbar_value > (long_u)scroll_line_len(curwin->w_cursor.lnum))
        {
--          curbuf->b_p_iminsert = B_IMODE_LMAP;
--          if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT)
--              curbuf->b_p_imsearch = B_IMODE_LMAP;
--          set_iminsert_global();
--          set_imsearch_global();
-+          if (*curbuf->b_p_keymap != NUL)
-+          {
-+              /* Installed a new keymap, switch on using it. */
-+              curbuf->b_p_iminsert = B_IMODE_LMAP;
-+              if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT)
-+                  curbuf->b_p_imsearch = B_IMODE_LMAP;
-+          }
-+          else
-+          {
-+              /* Cleared the keymap, may reset 'iminsert' and 'imsearch'. */
-+              if (curbuf->b_p_iminsert == B_IMODE_LMAP)
-+                  curbuf->b_p_iminsert = B_IMODE_NONE;
-+              if (curbuf->b_p_imsearch == B_IMODE_LMAP)
-+                  curbuf->b_p_imsearch = B_IMODE_USE_INSERT;
-+          }
-+          if ((opt_flags & OPT_LOCAL) == 0)
-+          {
-+              set_iminsert_global();
-+              set_imsearch_global();
-+          }
- # ifdef FEAT_WINDOWS
-           status_redraw_curbuf();
- # endif
-       }
-     }
-@@ -5794,14 +5861,18 @@ did_set_string_option(opt_idx, varp, new
-           if (get_fileformat(curbuf) == EOL_DOS)
-               curbuf->b_p_tx = TRUE;
-           else
-               curbuf->b_p_tx = FALSE;
- #ifdef FEAT_TITLE
--          need_maketitle = TRUE;
-+          redraw_titles();
- #endif
-           /* update flag in swap file */
-           ml_setflags(curbuf);
-+          /* Redraw needed when switching to/from "mac": a CR in the text
-+           * will be displayed differently. */
-+          if (get_fileformat(curbuf) == EOL_MAC || *oldval == 'm')
-+              redraw_curbuf_later(NOT_VALID);
+           curwin->w_cursor.lnum = longest_lnum;
+           curwin->w_cursor.col = 0;
        }
      }
+@@ -4664,15 +4714,14 @@ gui_mouse_correct()
+ }
  
-     /* 'fileformats' */
-     else if (varp == &p_ffs)
-@@ -5975,19 +6046,27 @@ did_set_string_option(opt_idx, varp, new
-     else if (istermoption(&options[opt_idx]) && full_screen)
-     {
-       /* ":set t_Co=0" and ":set t_Co=1" do ":set t_Co=" */
-       if (varp == &T_CCO)
-       {
--          t_colors = atoi((char *)T_CCO);
--          if (t_colors <= 1)
-+          int colors = atoi((char *)T_CCO);
+ /*
+  * Find window where the mouse pointer "y" coordinate is in.
+  */
+-/*ARGSUSED*/
+     static win_T *
+ xy2win(x, y)
+-    int               x;
+-    int               y;
++    int               x UNUSED;
++    int               y UNUSED;
+ {
+ #ifdef FEAT_WINDOWS
+     int               row;
+     int               col;
+     win_T     *wp;
+@@ -4988,10 +5037,23 @@ gui_do_findrepl(flags, find_text, repl_t
+     int               i;
+     int               type = (flags & FRD_TYPE_MASK);
+     char_u    *p;
+     regmatch_T        regmatch;
+     int               save_did_emsg = did_emsg;
++    static int  busy = FALSE;
 +
-+          /* Only reinitialize colors if t_Co value has really changed to
-+           * avoid expensive reload of colorscheme if t_Co is set to the
-+           * same value multiple times. */
-+          if (colors != t_colors)
-           {
--              if (new_value_alloced)
--                  vim_free(T_CCO);
--              T_CCO = empty_option;
-+              t_colors = colors;
-+              if (t_colors <= 1)
-+              {
-+                  if (new_value_alloced)
-+                      vim_free(T_CCO);
-+                  T_CCO = empty_option;
-+              }
-+              /* We now have a different color setup, initialize it again. */
-+              init_highlight(TRUE, FALSE);
-           }
--          /* We now have a different color setup, initialize it again. */
--          init_highlight(TRUE, FALSE);
-       }
-       ttest(FALSE);
-       if (varp == &T_ME)
-       {
-           out_str(T_ME);
-@@ -6053,27 +6132,30 @@ did_set_string_option(opt_idx, varp, new
-               else
- # endif
-                   errmsg = (char_u *)N_("E596: Invalid font(s)");
-           }
-       }
-+      redraw_gui_only = TRUE;
-     }
- # ifdef FEAT_XFONTSET
-     else if (varp == &p_guifontset)
-     {
-       if (STRCMP(p_guifontset, "*") == 0)
-           errmsg = (char_u *)N_("E597: can't select fontset");
-       else if (gui.in_use && gui_init_font(p_guifontset, TRUE) != OK)
-           errmsg = (char_u *)N_("E598: Invalid fontset");
-+      redraw_gui_only = TRUE;
-     }
- # endif
- # ifdef FEAT_MBYTE
-     else if (varp == &p_guifontwide)
-     {
-       if (STRCMP(p_guifontwide, "*") == 0)
-           errmsg = (char_u *)N_("E533: can't select wide font");
-       else if (gui_get_wide_font() == FAIL)
-           errmsg = (char_u *)N_("E534: Invalid wide font");
-+      redraw_gui_only = TRUE;
++    /* When the screen is being updated we should not change buffers and
++     * windows structures, it may cause freed memory to be used.  Also don't
++     * do this recursively (pressing "Find" quickly several times. */
++    if (updating_screen || busy)
++      return FALSE;
++
++    /* refuse replace when text cannot be changed */
++    if ((type == FRD_REPLACE || type == FRD_REPLACEALL) && text_locked())
++      return FALSE;
++
++    busy = TRUE;
+     ga_init2(&ga, 1, 100);
+     if (type == FRD_REPLACEALL)
+       ga_concat(&ga, (char_u *)"%s/");
+@@ -5078,10 +5140,11 @@ gui_do_findrepl(flags, find_text, repl_t
+       msg_didout = 0;                 /* overwrite any message */
+       need_wait_return = FALSE;       /* don't wait for return */
      }
- # endif
- #endif
  
- #ifdef CURSOR_SHAPE
-@@ -6131,17 +6213,28 @@ did_set_string_option(opt_idx, varp, new
- #endif
+     vim_free(ga.ga_data);
++    busy = FALSE;
+     return (ga.ga_len > 0);
+ }
  
- #ifdef FEAT_GUI
-     /* 'guioptions' */
-     else if (varp == &p_go)
-+    {
-       gui_init_which_components(oldval);
-+      redraw_gui_only = TRUE;
-+    }
  #endif
  
- #if defined(FEAT_GUI_TABLINE)
-     /* 'guitablabel' */
-     else if (varp == &p_gtl)
-+    {
-       redraw_tabline = TRUE;
-+      redraw_gui_only = TRUE;
-+    }
-+    /* 'guitabtooltip' */
-+    else if (varp == &p_gtt)
-+    {
-+      redraw_gui_only = TRUE;
-+    }
- #endif
+@@ -5118,15 +5181,14 @@ gui_wingoto_xy(x, y)
+  * Process file drop.  Mouse cursor position, key modifiers, name of files
+  * and count of files are given.  Argument "fnames[count]" has full pathnames
+  * of dropped files, they will be freed in this function, and caller can't use
+  * fnames after call this function.
+  */
+-/*ARGSUSED*/
+     void
+ gui_handle_drop(x, y, modifiers, fnames, count)
+-    int               x;
+-    int               y;
++    int               x UNUSED;
++    int               y UNUSED;
+     int_u     modifiers;
+     char_u    **fnames;
+     int               count;
+ {
+     int               i;
+--- vim72.orig/src/gui_at_fs.c
++++ vim72/src/gui_at_fs.c
+@@ -827,11 +827,11 @@ SFsetText(path)
+     text.length = strlen(path);
+     text.ptr = path;
+     text.format = FMT8BIT;
  
- #if defined(FEAT_MOUSE_TTY) && (defined(UNIX) || defined(VMS))
-     /* 'ttymouse' */
-     else if (varp == &p_ttym)
-@@ -6319,10 +6412,13 @@ did_set_string_option(opt_idx, varp, new
-               curwin->w_redr_status = TRUE;
-               redraw_later(VALID);
-           }
- # endif
-           curbuf->b_help = (curbuf->b_p_bt[0] == 'h');
-+# ifdef FEAT_TITLE
-+          redraw_titles();
-+# endif
-       }
-     }
+ #ifdef XtNinternational
+-    if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
++    if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
+     {
+       XawTextReplace(selFileField, (XawTextPosition)0,
+                                   (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0]), &text);
+       XawTextSetInsertionPoint(selFileField,
+                                          (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0]));
+@@ -849,21 +849,19 @@ SFsetText(path)
+     XawTextSetInsertionPoint(selFileField,
+                                      (XawTextPosition)strlen(SFtextBuffer));
  #endif
+ }
  
- #ifdef FEAT_STL_OPT
-@@ -6488,11 +6584,15 @@ did_set_string_option(opt_idx, varp, new
-     {
-       if (check_opt_strings(*varp, p_fdm_values, FALSE) != OK
-               || *curwin->w_p_fdm == NUL)
-           errmsg = e_invarg;
-       else
-+      {
-           foldUpdateAll(curwin);
-+          if (foldmethodIsDiff(curwin))
-+              newFoldLevel();
-+      }
-     }
- # ifdef FEAT_EVAL
-     /* 'foldexpr' */
-     else if (varp == &curwin->w_p_fde)
-     {
-@@ -6715,11 +6815,15 @@ did_set_string_option(opt_idx, varp, new
+-/* ARGSUSED */
+     static void
+ SFbuttonPressList(w, n, event)
+-    Widget            w;
+-    int                       n;
+-    XButtonPressedEvent       *event;
++    Widget            w UNUSED;
++    int                       n UNUSED;
++    XButtonPressedEvent       *event UNUSED;
+ {
+     SFbuttonPressed = 1;
+ }
+-/* ARGSUSED */
+     static void
+ SFbuttonReleaseList(w, n, event)
+     Widget             w;
+     int                        n;
+     XButtonReleasedEvent *event;
+@@ -987,15 +985,14 @@ SFcheckFiles(dir)
      }
- #endif
  
-     if (curwin->w_curswant != MAXCOL)
-       curwin->w_set_curswant = TRUE;  /* in case 'showbreak' changed */
--    check_redraw(options[opt_idx].flags);
-+#ifdef FEAT_GUI
-+    /* check redraw when it's not a GUI option or the GUI is active. */
-+    if (!redraw_gui_only || gui.in_use)
-+#endif
-+      check_redraw(options[opt_idx].flags);
+     return result;
+ }
  
-     return errmsg;
+-/* ARGSUSED */
+     static void
+ SFdirModTimer(cl, id)
+-    XtPointer         cl;
+-    XtIntervalId      *id;
++    XtPointer         cl UNUSED;
++    XtIntervalId      *id UNUSED;
+ {
+     static int                n = -1;
+     static int                f = 0;
+     char              save;
+     SFDir             *dir;
+@@ -1594,15 +1591,14 @@ SFscrollTimerInterval()
+     return (unsigned long)t;
  }
  
- /*
-@@ -6930,10 +7034,11 @@ check_stl_option(s)
- check_clipboard_option()
+ static void SFscrollTimer __ARGS((XtPointer p, XtIntervalId *id));
+-/* ARGSUSED */
+     static void
+ SFscrollTimer(p, id)
+     XtPointer         p;
+-    XtIntervalId      *id;
++    XtIntervalId      *id UNUSED;
  {
-     int               new_unnamed = FALSE;
-     int               new_autoselect = FALSE;
-     int               new_autoselectml = FALSE;
-+    int               new_html = FALSE;
-     regprog_T *new_exclude_prog = NULL;
-     char_u    *errmsg = NULL;
-     char_u    *p;
+     SFDir     *dir;
+     int               save;
+     int               n;
  
-     for (p = p_cb; *p != NUL; )
-@@ -6953,10 +7058,15 @@ check_clipboard_option()
-                                       && (p[12] == ',' || p[12] == NUL))
-       {
-           new_autoselectml = TRUE;
-           p += 12;
+@@ -1693,14 +1689,13 @@ SFnewInvertEntry(n, event)
        }
-+      else if (STRNCMP(p, "html", 4) == 0 && (p[4] == ',' || p[4] == NUL))
-+      {
-+          new_html = TRUE;
-+          p += 4;
-+      }
-       else if (STRNCMP(p, "exclude:", 8) == 0 && new_exclude_prog == NULL)
-       {
-           p += 8;
-           new_exclude_prog = vim_regcomp(p, RE_MAGIC);
-           if (new_exclude_prog == NULL)
-@@ -6974,10 +7084,11 @@ check_clipboard_option()
-     if (errmsg == NULL)
-     {
-       clip_unnamed = new_unnamed;
-       clip_autoselect = new_autoselect;
-       clip_autoselectml = new_autoselectml;
-+      clip_html = new_html;
-       vim_free(clip_exclude_prog);
-       clip_exclude_prog = new_exclude_prog;
+       return -1;
      }
-     else
-       vim_free(new_exclude_prog);
-@@ -7092,10 +7203,18 @@ set_bool_option(opt_idx, varp, value, op
-     if ((int *)varp == &p_cp)
-     {
-       compatible_set();
+ }
+-/* ARGSUSED */
+     static void
+ SFenterList(w, n, event)
+-    Widget            w;
++    Widget            w UNUSED;
+     int                       n;
+     XEnterWindowEvent *event;
+ {
+     int                       nw;
+@@ -1717,28 +1712,26 @@ SFenterList(w, n, event)
+       SFcurrentInvert[n] = nw;
+       SFinvertEntry(n);
      }
+ }
  
-+    /* 'list', 'number' */
-+    else if ((int *)varp == &curwin->w_p_list
-+        || (int *)varp == &curwin->w_p_nu)
-+    {
-+      if (curwin->w_curswant != MAXCOL)
-+          curwin->w_set_curswant = TRUE;
-+    }
-+
-     else if ((int *)varp == &curbuf->b_p_ro)
+-/* ARGSUSED */
+     static void
+ SFleaveList(w, n, event)
+-    Widget    w;
++    Widget    w UNUSED;
+     int               n;
+-    XEvent    *event;
++    XEvent    *event UNUSED;
+ {
+     if (SFcurrentInvert[n] != -1)
      {
-       /* when 'readonly' is reset globally, also reset readonlymode */
-       if (!curbuf->b_p_ro && (opt_flags & OPT_LOCAL) == 0)
-           readonlymode = FALSE;
-@@ -7103,34 +7222,40 @@ set_bool_option(opt_idx, varp, value, op
-       /* when 'readonly' is set may give W10 again */
-       if (curbuf->b_p_ro)
-           curbuf->b_did_warn = FALSE;
- #ifdef FEAT_TITLE
--      need_maketitle = TRUE;
-+      redraw_titles();
- #endif
+       SFinvertEntry(n);
+       SFcurrentInvert[n] = -1;
      }
+ }
  
- #ifdef FEAT_TITLE
-     /* when 'modifiable' is changed, redraw the window title */
-     else if ((int *)varp == &curbuf->b_p_ma)
--      need_maketitle = TRUE;
-+    {
-+      redraw_titles();
-+    }
-     /* when 'endofline' is changed, redraw the window title */
-     else if ((int *)varp == &curbuf->b_p_eol)
--      need_maketitle = TRUE;
--#ifdef FEAT_MBYTE
--    /* when 'bomb' is changed, redraw the window title */
-+    {
-+      redraw_titles();
-+    }
-+# ifdef FEAT_MBYTE
-+    /* when 'bomb' is changed, redraw the window title and tab page text */
-     else if ((int *)varp == &curbuf->b_p_bomb)
--      need_maketitle = TRUE;
--#endif
-+    {
-+      redraw_titles();
-+    }
-+# endif
- #endif
+-/* ARGSUSED */
+     static void
+ SFmotionList(w, n, event)
+-    Widget            w;
++    Widget            w UNUSED;
+     int                       n;
+     XMotionEvent      *event;
+ {
+     int               nw;
  
-     /* when 'bin' is set also set some other options */
-     else if ((int *)varp == &curbuf->b_p_bin)
-     {
-       set_options_bin(old_value, curbuf->b_p_bin, opt_flags);
- #ifdef FEAT_TITLE
--      need_maketitle = TRUE;
-+      redraw_titles();
- #endif
+@@ -1752,11 +1745,10 @@ SFmotionList(w, n, event)
+       if (nw != -1)
+           SFinvertEntry(n);
      }
+ }
  
- #ifdef FEAT_AUTOCMD
-     /* when 'buflisted' changes, trigger autocommands */
-@@ -7277,11 +7402,11 @@ set_bool_option(opt_idx, varp, value, op
-     else if ((int *)varp == &curbuf->b_changed)
-     {
-       if (!value)
-           save_file_ff(curbuf);       /* Buffer is unchanged */
- #ifdef FEAT_TITLE
--      need_maketitle = TRUE;
-+      redraw_titles();
- #endif
- #ifdef FEAT_AUTOCMD
-       modified_was_set = value;
- #endif
-     }
-@@ -7314,10 +7439,12 @@ set_bool_option(opt_idx, varp, value, op
-     /* If 'wrap' is set, set w_leftcol to zero. */
-     else if ((int *)varp == &curwin->w_p_wrap)
-     {
-       if (curwin->w_p_wrap)
-           curwin->w_leftcol = 0;
-+      if (curwin->w_curswant != MAXCOL)
-+          curwin->w_set_curswant = TRUE;
-     }
- #ifdef FEAT_WINDOWS
-     else if ((int *)varp == &p_ea)
-     {
-@@ -7484,13 +7611,17 @@ set_bool_option(opt_idx, varp, value, op
+-/* ARGSUSED */
+     static void
+ SFvFloatSliderMovedCallback(w, n, fnew)
+     Widget    w;
+     XtPointer n;
+     XtPointer fnew;
+@@ -1765,14 +1757,13 @@ SFvFloatSliderMovedCallback(w, n, fnew)
  
-           /* Arabic requires a utf-8 encoding, inform the user if its not
-            * set. */
-           if (STRCMP(p_enc, "utf-8") != 0)
-           {
-+              static char *w_arabic = N_("W17: Arabic requires UTF-8, do ':set encoding=utf-8'");
-+
-               msg_source(hl_attr(HLF_W));
--              MSG_ATTR(_("W17: Arabic requires UTF-8, do ':set encoding=utf-8'"),
--                      hl_attr(HLF_W));
-+              MSG_ATTR(_(w_arabic), hl_attr(HLF_W));
-+#ifdef FEAT_EVAL
-+              set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_arabic), -1);
-+#endif
-           }
+     nw = (*(float *)fnew) * SFdirs[SFdirPtr + (int)(long)n].nEntries;
+     SFvSliderMovedCallback(w, (int)(long)n, nw);
+ }
  
- # ifdef FEAT_MBYTE
-           /* set 'delcombine' */
-           p_deco = TRUE;
-@@ -7533,22 +7664,45 @@ set_bool_option(opt_idx, varp, value, op
-           /* Revert to the default keymap */
-           curbuf->b_p_iminsert = B_IMODE_NONE;
-           curbuf->b_p_imsearch = B_IMODE_USE_INSERT;
- # endif
-       }
-+      if (curwin->w_curswant != MAXCOL)
-+          curwin->w_set_curswant = TRUE;
-+    }
-+
-+    else if ((int *)varp == &p_arshape)
-+    {
-+      if (curwin->w_curswant != MAXCOL)
-+          curwin->w_set_curswant = TRUE;
-+    }
-+#endif
-+
-+#ifdef FEAT_LINEBREAK
-+    if ((int *)varp == &curwin->w_p_lbr)
-+    {
-+      if (curwin->w_curswant != MAXCOL)
-+          curwin->w_set_curswant = TRUE;
-+    }
-+#endif
-+
-+#ifdef FEAT_RIGHTLEFT
-+    if ((int *)varp == &curwin->w_p_rl)
-+    {
-+      if (curwin->w_curswant != MAXCOL)
-+          curwin->w_set_curswant = TRUE;
+-/* ARGSUSED */
+     static void
+ SFvSliderMovedCallback(w, n, nw)
+-    Widget    w;
++    Widget    w UNUSED;
+     int               n;
+     int               nw;
+ {
+     int               old;
+     Window    win;
+@@ -1851,14 +1842,13 @@ SFvSliderMovedCallback(w, n, nw)
+               False);
+       SFdrawStrings(win, dir, 0, SFlistSize - 1);
      }
- #endif
+ }
  
-     /*
-      * End of handling side effects for bool options.
-      */
+-/* ARGSUSED */
+     static void
+ SFvAreaSelectedCallback(w, n, pnew)
+-    Widget            w;
++    Widget    w;
+     XtPointer n;
+     XtPointer pnew;
+ {
+     SFDir     *dir;
+     int               nw = (int)(long)pnew;
+@@ -1912,14 +1902,13 @@ SFvAreaSelectedCallback(w, n, pnew)
+     }
  
-     options[opt_idx].flags |= P_WAS_SET;
+     SFvSliderMovedCallback(w, (int)(long)n, nw);
+ }
  
-     comp_col();                           /* in case 'ruler' or 'showcmd' changed */
--    if (curwin->w_curswant != MAXCOL)
--      curwin->w_set_curswant = TRUE;  /* in case 'list' changed */
-+
-     check_redraw(options[opt_idx].flags);
+-/* ARGSUSED */
+     static void
+ SFhSliderMovedCallback(w, n, nw)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer n;
+     XtPointer nw;
+ {
+     SFDir     *dir;
+     int       save;
+@@ -1931,14 +1920,13 @@ SFhSliderMovedCallback(w, n, nw)
+       return;
  
-     return NULL;
+     SFdrawList((int)(long)n, SF_DO_NOT_SCROLL);
  }
  
-@@ -7712,11 +7866,11 @@ set_num_option(opt_idx, varp, value, err
-       if (curwin->w_p_fdl < 0)
-           curwin->w_p_fdl = 0;
-       newFoldLevel();
-     }
+-/* ARGSUSED */
+     static void
+ SFhAreaSelectedCallback(w, n, pnew)
+-    Widget            w;
++    Widget    w;
+     XtPointer n;
+     XtPointer pnew;
+ {
+     SFDir     *dir;
+     int               nw = (int)(long)pnew;
+@@ -1992,15 +1980,14 @@ SFhAreaSelectedCallback(w, n, pnew)
  
--    /* 'foldminlevel' */
-+    /* 'foldminlines' */
-     else if (pp == &curwin->w_p_fml)
-     {
-       foldUpdateAll(curwin);
+       SFhSliderMovedCallback(w, n, (XtPointer)&f);
      }
+ }
  
-@@ -7972,10 +8126,15 @@ set_num_option(opt_idx, varp, value, err
-       else if (curwin->w_p_scr <= 0)
-           curwin->w_p_scr = 1;
-       else /* curwin->w_p_scr > curwin->w_height */
-           curwin->w_p_scr = curwin->w_height;
-     }
-+    if (p_hi < 0)
-+    {
-+      errmsg = e_positive;
-+      p_hi = 0;
-+    }
-     if (p_report < 0)
-     {
-       errmsg = e_positive;
-       p_report = 1;
+-/* ARGSUSED */
+     static void
+ SFpathSliderMovedCallback(w, client_data, nw)
+-    Widget            w;
+-    XtPointer client_data;
++    Widget    w UNUSED;
++    XtPointer client_data UNUSED;
+     XtPointer nw;
+ {
+     SFDir             *dir;
+     int                       n;
+     XawTextPosition   pos;
+@@ -2029,15 +2016,14 @@ SFpathSliderMovedCallback(w, client_data
      }
-@@ -8225,17 +8384,17 @@ set_option_value(name, number, string, o
-           varp = get_varp_scope(&(options[opt_idx]), opt_flags);
-           if (varp != NULL)   /* hidden option is not changed */
-           {
-               if (number == 0 && string != NULL)
-               {
--                  int index;
-+                  int idx;
  
-                   /* Either we are given a string or we are setting option
-                    * to zero. */
--                  for (index = 0; string[index] == '0'; ++index)
-+                  for (idx = 0; string[idx] == '0'; ++idx)
-                       ;
--                  if (string[index] != NUL || index == 0)
-+                  if (string[idx] != NUL || idx == 0)
-                   {
-                       /* There's another character after zeros or the string
-                        * is empty.  In both cases, we are trying to set a
-                        * num option using a string. */
-                       EMSG3(_("E521: Number required: &%s = '%s'"),
-@@ -8321,11 +8480,11 @@ find_key_option(arg)
-       key = TERMCAP2KEY(arg[2], arg[3]);
-     else
-     {
-       --arg;                      /* put arg at the '<' */
-       modifiers = 0;
--      key = find_special_key(&arg, &modifiers, TRUE);
-+      key = find_special_key(&arg, &modifiers, TRUE, TRUE);
-       if (modifiers)              /* can't handle modifiers here */
-           key = 0;
-     }
-     return key;
- }
-@@ -8811,10 +8970,32 @@ free_termoptions()
-       }
-     clear_termcodes();
+     XawTextSetInsertionPoint(selFileField, pos);
  }
  
- /*
-+ * Free the string for one term option, if it was allocated.
-+ * Set the string to empty_option and clear allocated flag.
-+ * "var" points to the option value.
-+ */
-+    void
-+free_one_termoption(var)
-+    char_u *var;
-+{
-+    struct vimoption   *p;
-+
-+    for (p = &options[0]; p->fullname != NULL; p++)
-+      if (p->var == var)
-+      {
-+          if (p->flags & P_ALLOCED)
-+              free_string_option(*(char_u **)(p->var));
-+          *(char_u **)(p->var) = empty_option;
-+          p->flags &= ~P_ALLOCED;
-+          break;
-+      }
-+}
-+
-+/*
-  * Set the terminal option defaults to the current value.
-  * Used after setting the terminal name.
-  */
-     void
- set_term_defaults()
-@@ -9269,14 +9450,13 @@ check_win_options(win)
+-/* ARGSUSED */
+     static void
+ SFpathAreaSelectedCallback(w, client_data, pnew)
+     Widget    w;
+-    XtPointer client_data;
++    XtPointer client_data UNUSED;
+     XtPointer pnew;
+ {
+     int               nw = (int)(long)pnew;
+     float     f;
+@@ -2204,33 +2190,31 @@ static char *oneLineTextEditTranslations
+       Ctrl<Key>M:     redraw-display()\n\
+ ";
+ static void SFexposeList __ARGS((Widget w, XtPointer n, XEvent *event, Boolean *cont));
+-/* ARGSUSED */
+     static void
+ SFexposeList(w, n, event, cont)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer n;
+     XEvent    *event;
+-    Boolean   *cont;
++    Boolean   *cont UNUSED;
+ {
+     if ((event->type == NoExpose) || event->xexpose.count)
+       return;
+     SFdrawList((int)(long)n, SF_DO_NOT_SCROLL);
  }
  
- /*
-  * Check for NULL pointers in a winopt_T and replace them with empty_option.
-  */
--/*ARGSUSED*/
-     void
- check_winopt(wop)
--    winopt_T  *wop;
-+    winopt_T  *wop UNUSED;
+ static void SFmodVerifyCallback __ARGS((Widget w, XtPointer client_data, XEvent *event, Boolean *cont));
+-/* ARGSUSED */
+     static void
+ SFmodVerifyCallback(w, client_data, event, cont)
+-    Widget            w;
+-    XtPointer         client_data;
++    Widget            w UNUSED;
++    XtPointer         client_data UNUSED;
+     XEvent            *event;
+-    Boolean           *cont;
++    Boolean           *cont UNUSED;
  {
- #ifdef FEAT_FOLDING
-     check_string_option(&wop->wo_fdi);
-     check_string_option(&wop->wo_fdm);
- # ifdef FEAT_EVAL
-@@ -9294,14 +9474,13 @@ check_winopt(wop)
+     char      buf[2];
+     if ((XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) &&
+           ((*buf) == '\r'))
+@@ -2239,15 +2223,15 @@ SFmodVerifyCallback(w, client_data, even
+       SFstatus = SEL_FILE_TEXT;
  }
  
- /*
-  * Free the allocated memory inside a winopt_T.
-  */
--/*ARGSUSED*/
-     void
- clear_winopt(wop)
--    winopt_T  *wop;
-+    winopt_T  *wop UNUSED;
+ static void SFokCallback __ARGS((Widget w, XtPointer cl, XtPointer cd));
+-/* ARGSUSED */
+     static void
+ SFokCallback(w, cl, cd)
+-    Widget    w;
+-    XtPointer cl, cd;
++    Widget    w UNUSED;
++    XtPointer cl UNUSED;
++    XtPointer cd UNUSED;
  {
- #ifdef FEAT_FOLDING
-     clear_string_option(&wop->wo_fdi);
-     clear_string_option(&wop->wo_fdm);
- # ifdef FEAT_EVAL
-@@ -9643,11 +9822,11 @@ set_context_in_set_cmd(xp, arg, opt_flag
-           ++p;
-           break;
-       }
-       --p;
-     }
--    if (STRNCMP(p, "no", 2) == 0)
-+    if (STRNCMP(p, "no", 2) == 0 && STRNCMP(p, "novice", 6) != 0)
-     {
-       xp->xp_context = EXPAND_BOOL_SETTINGS;
-       p += 2;
-     }
-     if (STRNCMP(p, "inv", 3) == 0)
-@@ -9832,11 +10011,12 @@ ExpandSettings(xp, regmatch, num_file, f
-     for (loop = 0; loop <= 1; ++loop)
-     {
-       regmatch->rm_ic = ic;
-       if (xp->xp_context != EXPAND_BOOL_SETTINGS)
-       {
--          for (match = 0; match < sizeof(names) / sizeof(char *); ++match)
-+          for (match = 0; match < (int)(sizeof(names) / sizeof(char *));
-+                                                                    ++match)
-               if (vim_regexec(regmatch, (char_u *)names[match], (colnr_T)0))
-               {
-                   if (loop == 0)
-                       num_normal++;
-                   else
-@@ -10091,29 +10271,114 @@ wc_use_keyname(varp, wcp)
-     return FALSE;
+     SFstatus = SEL_FILE_OK;
  }
  
- #ifdef FEAT_LANGMAP
- /*
-- * Any character has an equivalent character.  This is used for keyboards that
-- * have a special language mode that sends characters above 128 (although
-- * other characters can be translated too).
-+ * Any character has an equivalent 'langmap' character.  This is used for
-+ * keyboards that have a special language mode that sends characters above
-+ * 128 (although other characters can be translated too).  The "to" field is a
-+ * Vim command character.  This avoids having to switch the keyboard back to
-+ * ASCII mode when leaving Insert mode.
-+ *
-+ * langmap_mapchar[] maps any of 256 chars to an ASCII char used for Vim
-+ * commands.
-+ * When FEAT_MBYTE is defined langmap_mapga.ga_data is a sorted table of
-+ * langmap_entry_T.  This does the same as langmap_mapchar[] for characters >=
-+ * 256.
-  */
-+# ifdef FEAT_MBYTE
-+/*
-+ * With multi-byte support use growarray for 'langmap' chars >= 256
-+ */
-+typedef struct
-+{
-+    int           from;
-+    int     to;
-+} langmap_entry_T;
-+
-+static garray_T langmap_mapga;
-+static void langmap_set_entry __ARGS((int from, int to));
-+
-+/*
-+ * Search for an entry in "langmap_mapga" for "from".  If found set the "to"
-+ * field.  If not found insert a new entry at the appropriate location.
-+ */
-+    static void
-+langmap_set_entry(from, to)
-+    int    from;
-+    int    to;
-+{
-+    langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data);
-+    int             a = 0;
-+    int             b = langmap_mapga.ga_len;
-+
-+    /* Do a binary search for an existing entry. */
-+    while (a != b)
-+    {
-+      int i = (a + b) / 2;
-+      int d = entries[i].from - from;
-+
-+      if (d == 0)
-+      {
-+          entries[i].to = to;
-+          return;
-+      }
-+      if (d < 0)
-+          a = i + 1;
-+      else
-+          b = i;
-+    }
-+
-+    if (ga_grow(&langmap_mapga, 1) != OK)
-+      return;  /* out of memory */
-+
-+    /* insert new entry at position "a" */
-+    entries = (langmap_entry_T *)(langmap_mapga.ga_data) + a;
-+    mch_memmove(entries + 1, entries,
-+                      (langmap_mapga.ga_len - a) * sizeof(langmap_entry_T));
-+    ++langmap_mapga.ga_len;
-+    entries[0].from = from;
-+    entries[0].to = to;
-+}
+ static XtCallbackRec SFokSelect[] =
+@@ -2256,15 +2240,15 @@ static XtCallbackRec SFokSelect[] =
+     { NULL, (XtPointer) NULL },
+ };
  
- /*
-- * char_u langmap_mapchar[256];
-- * Normally maps each of the 128 upper chars to an <128 ascii char; used to
-- * "translate" native lang chars in normal mode or some cases of
-- * insert mode without having to tediously switch lang mode back&forth.
-+ * Apply 'langmap' to multi-byte character "c" and return the result.
-  */
-+    int
-+langmap_adjust_mb(c)
-+    int c;
-+{
-+    langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data);
-+    int a = 0;
-+    int b = langmap_mapga.ga_len;
-+
-+    while (a != b)
-+    {
-+      int i = (a + b) / 2;
-+      int d = entries[i].from - c;
-+
-+      if (d == 0)
-+          return entries[i].to;  /* found matching entry */
-+      if (d < 0)
-+          a = i + 1;
-+      else
-+          b = i;
-+    }
-+    return c;  /* no entry found, return "c" unmodified */
-+}
-+# endif
+ static void SFcancelCallback __ARGS((Widget w, XtPointer cl, XtPointer cd));
  
+-/* ARGSUSED */
      static void
- langmap_init()
+ SFcancelCallback(w, cl, cd)
+-    Widget    w;
+-    XtPointer cl, cd;
++    Widget    w UNUSED;
++    XtPointer cl UNUSED;
++    XtPointer cd UNUSED;
  {
-     int i;
--    for (i = 0; i < 256; i++)         /* we init with a-one-to one map */
--      langmap_mapchar[i] = i;
-+    for (i = 0; i < 256; i++)
-+      langmap_mapchar[i] = i;  /* we init with a one-to-one map */
-+# ifdef FEAT_MBYTE
-+    ga_init2(&langmap_mapga, sizeof(langmap_entry_T), 8);
-+# endif
+     SFstatus = SEL_FILE_CANCEL;
  }
  
- /*
-  * Called when langmap option is set; the language map can be
-  * changed at any time!
-@@ -10123,11 +10388,14 @@ langmap_set()
- {
-     char_u  *p;
-     char_u  *p2;
-     int           from, to;
+ static XtCallbackRec SFcancelSelect[] =
+@@ -2273,20 +2257,19 @@ static XtCallbackRec SFcancelSelect[] =
+     { NULL, (XtPointer) NULL },
+ };
  
--    langmap_init();                       /* back to one-to-one map first */
-+#ifdef FEAT_MBYTE
-+    ga_clear(&langmap_mapga);             /* clear the previous map first */
-+#endif
-+    langmap_init();                       /* back to one-to-one map */
+ static void SFdismissAction __ARGS((Widget w, XEvent *event, String *params, Cardinal *num_params));
  
-     for (p = p_langmap; p[0] != NUL; )
-     {
-       for (p2 = p; p2[0] != NUL && p2[0] != ',' && p2[0] != ';';
-                                                              mb_ptr_adv(p2))
-@@ -10173,11 +10441,17 @@ langmap_set()
-           {
-               EMSG2(_("E357: 'langmap': Matching character missing for %s"),
-                                                            transchar(from));
-               return;
-           }
--          langmap_mapchar[from & 255] = to;
-+
-+#ifdef FEAT_MBYTE
-+          if (from >= 256)
-+              langmap_set_entry(from, to);
-+          else
-+#endif
-+              langmap_mapchar[from & 255] = to;
+-/* ARGSUSED */
+     static void
+ SFdismissAction(w, event, params, num_params)
+-    Widget    w;
+-    XEvent *event;
+-    String *params;
+-    Cardinal *num_params;
++    Widget    w UNUSED;
++    XEvent    *event;
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+-    if (event->type == ClientMessage &&
+-          event->xclient.data.l[0] != SFwmDeleteWindow)
++    if (event->type == ClientMessage
++          && (Atom)event->xclient.data.l[0] != SFwmDeleteWindow)
+       return;
  
-           /* Advance to next pair */
-           mb_ptr_adv(p);
-           if (p2 == NULL)
-           {
---- vim72.orig/runtime/doc/cmdline.txt
-+++ vim72/runtime/doc/cmdline.txt
-@@ -1,6 +1,6 @@
--*cmdline.txt*   For Vim version 7.2.  Last change: 2008 Jul 29
-+*cmdline.txt*   For Vim version 7.2.  Last change: 2008 Sep 18
+     SFstatus = SEL_FILE_CANCEL;
+ }
  
+@@ -2701,11 +2684,11 @@ SFcreateWidgets(toplevel, prompt, ok, ca
  
-                 VIM REFERENCE MANUAL    by Bram Moolenaar
+     static void
+ SFtextChanged()
+ {
+ #if defined(FEAT_XFONTSET) && defined(XtNinternational)
+-    if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
++    if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
+     {
+       wchar_t *wcbuf=(wchar_t *)SFtextBuffer;
  
+       if ((wcbuf[0] == L'/') || (wcbuf[0] == L'~'))
+       {
+@@ -2747,11 +2730,11 @@ SFtextChanged()
+ SFgetText()
+ {
+ #if defined(FEAT_XFONTSET) && defined(XtNinternational)
+     char *buf;
  
-@@ -155,10 +155,15 @@ CTRL-R {0-9a-z"%#:-=.}                                   *c_CTRL-R* *c
-                       '='     the expression register: you are prompted to
-                               enter an expression (see |expression|)
-                               (doesn't work at the expression prompt; some
-                               things such as changing the buffer or current
-                               window are not allowed to avoid side effects)
-+                              When the result is a |List| the items are used
-+                              as lines.  They can have line breaks inside
-+                              too.
-+                              When the result is a Float it's automatically
-+                              converted to a String.
-               See |registers| about registers.  {not in Vi}
-               Implementation detail: When using the |expression| register
-               and invoking setcmdpos(), this sets the position before
-               inserting the resulting string.  Use CTRL-R CTRL-R to set the
-               position afterwards.
-@@ -434,17 +439,24 @@ matching files with the next.
- For file name completion you can use the 'suffixes' option to set a priority
- between files with almost the same name.  If there are multiple matches,
- those files with an extension that is in the 'suffixes' option are ignored.
- The default is ".bak,~,.o,.h,.info,.swp,.obj", which means that files ending
- in ".bak", "~", ".o", ".h", ".info", ".swp" and ".obj" are sometimes ignored.
--It is impossible to ignore suffixes with two dots.  Examples:
-+
-+An empty entry, two consecutive commas, match a file name that does not
-+contain a ".", thus has no suffix.  This is useful to ignore "prog" and prefer
-+"prog.c".
-+
-+Examples:
+-    if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
++    if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
+     {
+       wchar_t *wcbuf;
+       int mbslength;
  
-   pattern:    files:                          match:  ~
-    test*      test.c test.h test.o            test.c
-    test*      test.h test.o                   test.h and test.o
-    test*      test.i test.h test.c            test.i and test.c
+       XtVaGetValues(selFileField,
+--- vim72.orig/src/gui_at_sb.c
++++ vim72/src/gui_at_sb.c
+@@ -196,14 +196,17 @@ ScrollbarClassRec vim_scrollbarClassRec
+     /* query_geometry */  XtInheritQueryGeometry,
+     /* display_accelerator*/  XtInheritDisplayAccelerator,
+     /* extension      */  NULL
+   },
+   { /* simple fields */
+-    /* change_sensitive       */  XtInheritChangeSensitive
++    /* change_sensitive       */  XtInheritChangeSensitive,
++#ifndef OLDXAW
++    /* extension */       NULL
++#endif
+   },
+   { /* scrollbar fields */
+-    /* ignore     */  0
++    /* empty      */      0
+   }
+ };
  
-+It is impossible to ignore suffixes with two dots.
-+
- If there is more than one matching file (after ignoring the ones matching
- the 'suffixes' option) the first file name is inserted.  You can see that
- there is only one match when you type 'wildchar' twice and the completed
- match stays the same.  You can get to the other matches by entering
- 'wildchar', CTRL-N or CTRL-P.  All files are included, also the ones with
-@@ -728,23 +740,33 @@ to use |fnameescape()|.
+ WidgetClass vim_scrollbarWidgetClass = (WidgetClass)&vim_scrollbarClassRec;
  
+@@ -239,11 +242,12 @@ FillArea(sbw, top, bottom, fill, draw_sh
+     int sw, margin, floor;
+     int lx, ly, lw, lh;
  
- In Ex commands, at places where a file name can be used, the following
- characters have a special meaning.  These can also be used in the expression
- function expand() |expand()|.
--      %       is replaced with the current file name                  *:_%*
--      #       is replaced with the alternate file name                *:_#*
-+      %       Is replaced with the current file name.           *:_%* *c_%*
-+      #       Is replaced with the alternate file name.         *:_#* *c_#*
-       #n      (where n is a number) is replaced with the file name of
--              buffer n.  "#0" is the same as "#"
--      ##      is replaced with all names in the argument list         *:_##*
-+              buffer n.  "#0" is the same as "#".
-+      ##      Is replaced with all names in the argument list   *:_##* *c_##*
-               concatenated, separated by spaces.  Each space in a name
-               is preceded with a backslash.
--Note that these give the file name as it was typed.  If an absolute path is
--needed (when using the file name from a different directory), you need to add
--":p".  See |filename-modifiers|.
-+      #<n     (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
-+              file name n.  See |:oldfiles| or |v:oldfiles| to get the
-+              number.                                                 *E809*
-+              {only when compiled with the +eval and +viminfo features}
-+
-+Note that these, except "#<n", give the file name as it was typed.  If an
-+absolute path is needed (when using the file name from a different directory),
-+you need to add ":p".  See |filename-modifiers|.
-+
-+The "#<n" item returns an absolute path, but it will start with "~/" for files
-+below your home directory.
-+
- Note that backslashes are inserted before spaces, so that the command will
- correctly interpret the file name.  But this doesn't happen for shell
--commands.  For those you probably have to use quotes: >
-+commands.  For those you probably have to use quotes (this fails for files
-+that contain a quote and wildcards): >
-       :!ls "%"
-       :r !spell "%"
+     if (bottom <= 0 || bottom <= top)
+       return;
+-    if ((sw = sbw->scrollbar.shadow_width) < 0)
++    sw = sbw->scrollbar.shadow_width;
++    if (sw < 0)
+       sw = 0;
+     margin = MARGIN (sbw);
+     floor = sbw->scrollbar.length - margin + 2;
  
- To avoid the special meaning of '%' and '#' insert a backslash before it.
- Detail: The special meaning is always escaped when there is a backslash before
---- vim72.orig/runtime/doc/eval.txt
-+++ vim72/runtime/doc/eval.txt
-@@ -1,6 +1,6 @@
--*eval.txt*    For Vim version 7.2.  Last change: 2008 Aug 09
-+*eval.txt*    For Vim version 7.2.  Last change: 2008 Nov 27
+     if (sbw->scrollbar.orientation == XtorientHorizontal)
+@@ -514,17 +518,16 @@ SetDimensions(sbw)
+       sbw->scrollbar.length = sbw->core.width;
+       sbw->scrollbar.thickness = sbw->core.height;
+     }
+ }
  
+-/* ARGSUSED */
+     static void
+ Initialize(request, new, args, num_args)
+-    Widget    request;        /* what the client asked for */
++    Widget    request UNUSED; /* what the client asked for */
+     Widget    new;            /* what we're going to give him */
+-    ArgList   args;
+-    Cardinal  *num_args;
++    ArgList   args UNUSED;
++    Cardinal  *num_args UNUSED;
+ {
+     ScrollbarWidget sbw = (ScrollbarWidget) new;
  
-                 VIM REFERENCE MANUAL    by Bram Moolenaar
+     CreateGC(new);
+     AllocTopShadowGC(new);
+@@ -554,18 +557,17 @@ Realize(w, valueMask, attributes)
+     /* The Simple widget actually stuffs the value in the valuemask. */
+     (*vim_scrollbarWidgetClass->core_class.superclass->core_class.realize)
+       (w, valueMask, attributes);
+ }
  
+-/* ARGSUSED */
+     static Boolean
+ SetValues(current, request, desired, args, num_args)
+-    Widget  current,      /* what I am */
+-          request,        /* what he wants me to be */
+-          desired;        /* what I will become */
+-    ArgList args;
+-    Cardinal *num_args;
++    Widget  current;      /* what I am */
++    Widget  request UNUSED; /* what he wants me to be */
++    Widget  desired;      /* what I will become */
++    ArgList args UNUSED;
++    Cardinal *num_args UNUSED;
+ {
+     ScrollbarWidget   sbw = (ScrollbarWidget) current;
+     ScrollbarWidget   dsbw = (ScrollbarWidget) desired;
+     Boolean           redraw = FALSE;
  
-@@ -1482,10 +1482,21 @@ v:mouse_lnum   Line number for a mouse cli
-                                       *v:mouse_col* *mouse_col-variable*
- v:mouse_col   Column number for a mouse click obtained with |getchar()|.
-               This is the screen column number, like with |virtcol()|.  The
-               value is zero when there was no mouse button click.
+@@ -607,11 +609,10 @@ Resize(w)
+     SetDimensions ((ScrollbarWidget) w);
+     Redisplay(w, (XEvent*) NULL, (Region)NULL);
+ }
  
-+                                      *v:oldfiles* *oldfiles-variable*
-+v:oldfiles    List of file names that is loaded from the |viminfo| file on
-+              startup.  These are the files that Vim remembers marks for.
-+              The length of the List is limited by the ' argument of the
-+              'viminfo' option (default is 100).
-+              Also see |:oldfiles| and |c_#<|.
-+              The List can be modified, but this has no effect on what is
-+              stored in the |viminfo| file later.  If you use values other
-+              than String this will cause trouble.
-+              {only when compiled with the +viminfo feature}
-+
-                                       *v:operator* *operator-variable*
- v:operator    The last operator given in Normal mode.  This is a single
-               character except for commands starting with <g> or <z>,
-               in which case it is two characters.  Best used alongside
-               |v:prevcount| and |v:register|.  Useful if you want to cancel
-@@ -1693,11 +1704,11 @@ eval( {string})                        any     evaluate {string}
- eventhandler( )                       Number  TRUE if inside an event handler
- executable( {expr})           Number  1 if executable {expr} exists
- exists( {expr})                       Number  TRUE if {expr} exists
- extend({expr1}, {expr2} [, {expr3}])
-                               List/Dict insert items of {expr2} into {expr1}
--expand( {expr})                       String  expand special keywords in {expr}
-+expand( {expr} [, {flag}])    String  expand special keywords in {expr}
- feedkeys( {string} [, {mode}])        Number  add key sequence to typeahead buffer
- filereadable( {file})         Number  TRUE if {file} is a readable file
- filewritable( {file})         Number  TRUE if {file} is a writable file
- filter( {expr}, {string})     List/Dict  remove items from {expr} where
-                                       {string} is 0
-@@ -1745,12 +1756,13 @@ getregtype( [{regname}])       String  type of
- gettabwinvar( {tabnr}, {winnr}, {name})
-                               any     {name} in {winnr} in tab page {tabnr}
- getwinposx()                  Number  X coord in pixels of GUI Vim window
- getwinposy()                  Number  Y coord in pixels of GUI Vim window
- getwinvar( {nr}, {varname})   any     variable {varname} in window {nr}
--glob( {expr})                 String  expand file wildcards in {expr}
--globpath( {path}, {expr})     String  do glob({expr}) for all dirs in {path}
-+glob( {expr} [, {flag}])      String  expand file wildcards in {expr}
-+globpath( {path}, {expr} [, {flag}])
-+                              String  do glob({expr}) for all dirs in {path}
- has( {feature})                       Number  TRUE if feature {feature} supported
- has_key( {dict}, {key})               Number  TRUE if {dict} has entry {key}
- haslocaldir()                 Number  TRUE if current window executed |:lcd|
- hasmapto( {what} [, {mode} [, {abbr}]])
-                               Number  TRUE if mapping to {what} exists
-@@ -1801,15 +1813,16 @@ matchend( {expr}, {pat}[, {start}[, {cou
-                               Number  position where {pat} ends in {expr}
- matchlist( {expr}, {pat}[, {start}[, {count}]])
-                               List    match and submatches of {pat} in {expr}
- matchstr( {expr}, {pat}[, {start}[, {count}]])
-                               String  {count}'th match of {pat} in {expr}
--max({list})                   Number  maximum value of items in {list}
--min({list})                   Number  minimum value of items in {list}
--mkdir({name} [, {path} [, {prot}]])
-+max( {list})                  Number  maximum value of items in {list}
-+min( {list})                  Number  minimum value of items in {list}
-+mkdir( {name} [, {path} [, {prot}]])
-                               Number  create directory {name}
- mode( [expr])                 String  current editing mode
-+mzeval( {expr})                       any     evaluate |MzScheme| expression
- nextnonblank( {lnum})         Number  line nr of non-blank line >= {lnum}
- nr2char( {expr})              String  single char with ASCII value {expr}
- pathshorten( {expr})          String  shorten directory names in a path
- pow( {x}, {y})                        Float   {x} to the power of {y}
- prevnonblank( {lnum})         Number  line nr of non-blank line <= {lnum}
-@@ -2400,10 +2413,11 @@ cursor({list})
-               line.
-               If {col} is zero, the cursor will stay in the current column.
-               When 'virtualedit' is used {off} specifies the offset in
-               screen columns from the start of the character.  E.g., a
-               position within a <Tab> or after the last character.
-+              Returns 0 when the position could be set, -1 otherwise.
  
+-/* ARGSUSED */
+     static void
+ Redisplay(w, event, region)
+     Widget w;
+     XEvent *event;
+     Region region;
+@@ -787,15 +788,14 @@ HandleThumb(w, event, params, num_params
+       XtCallActionProc(w, "MoveThumb", event, params, *num_params);
+       XtCallActionProc(w, "NotifyThumb", event, params, *num_params);
+     }
+ }
  
- deepcopy({expr}[, {noref}])                           *deepcopy()* *E698*
-               Make a copy of {expr}.  For Numbers and Strings this isn't
-               different from using {expr} directly.
-@@ -3273,18 +3287,20 @@ getwinvar({winnr}, {varname})                          *getwin
-               Like |gettabwinvar()| for the current tabpage.
-               Examples: >
-                       :let list_is_on = getwinvar(2, '&list')
-                       :echo "myvar = " . getwinvar(1, 'myvar')
- <
--                                                      *glob()*
--glob({expr})  Expand the file wildcards in {expr}.  See |wildcards| for the
-+glob({expr} [, {flag}])                                       *glob()*
-+              Expand the file wildcards in {expr}.  See |wildcards| for the
-               use of special characters.
-               The result is a String.
-               When there are several matches, they are separated by <NL>
-               characters.
--              The 'wildignore' option applies: Names matching one of the
--              patterns in 'wildignore' will be skipped.
-+              Unless the optional {flag} argument is given and is non-zero,
-+              the 'suffixes' and 'wildignore' options apply: Names matching
-+              one of the patterns in 'wildignore' will be skipped and
-+              'suffixes' affect the ordering of matches.
-               If the expansion fails, the result is an empty string.
-               A name for a non-existing file is not included.
+-/* ARGSUSED */
+     static void
+ RepeatNotify(client_data, idp)
+     XtPointer client_data;
+-    XtIntervalId *idp;
++    XtIntervalId *idp UNUSED;
+ {
+     ScrollbarWidget sbw = (ScrollbarWidget) client_data;
+     int                   call_data;
+     char          mode = sbw->scrollbar.scroll_mode;
+     unsigned long   rep;
+@@ -837,50 +837,46 @@ FloatInRange(num, small, big)
+     float num, small, big;
+ {
+     return (num < small) ? small : ((num > big) ? big : num);
+ }
  
-               For most systems backticks can be used to get files names from
-               any external command.  Example: >
-@@ -3294,24 +3310,26 @@ glob({expr})   Expand the file wildcards i
-               item per line.  Spaces inside an item are allowed.
+-/* ARGSUSED */
+     static void
+ ScrollOneLineUp(w, event, params, num_params)
+     Widget    w;
+     XEvent    *event;
+-    String    *params;
+-    Cardinal  *num_params;
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+     ScrollSome(w, event, -ONE_LINE_DATA);
+ }
  
-               See |expand()| for expanding special Vim variables.  See
-               |system()| for getting the raw output of an external command.
+-/* ARGSUSED */
+     static void
+ ScrollOneLineDown(w, event, params, num_params)
+     Widget    w;
+     XEvent    *event;
+-    String    *params;
+-    Cardinal  *num_params;
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+     ScrollSome(w, event, ONE_LINE_DATA);
+ }
  
--globpath({path}, {expr})                              *globpath()*
-+globpath({path}, {expr} [, {flag}])                   *globpath()*
-               Perform glob() on all directories in {path} and concatenate
-               the results.  Example: >
-                       :echo globpath(&rtp, "syntax/c.vim")
- <             {path} is a comma-separated list of directory names.  Each
-               directory name is prepended to {expr} and expanded like with
--              glob().  A path separator is inserted when needed.
-+              |glob()|.  A path separator is inserted when needed.
-               To add a comma inside a directory name escape it with a
-               backslash.  Note that on MS-Windows a directory may have a
-               trailing backslash, remove it if you put a comma after it.
-               If the expansion fails for one of the directories, there is no
-               error message.
--              The 'wildignore' option applies: Names matching one of the
--              patterns in 'wildignore' will be skipped.
-+              Unless the optional {flag} argument is given and is non-zero,
-+              the 'suffixes' and 'wildignore' options apply: Names matching
-+              one of the patterns in 'wildignore' will be skipped and
-+              'suffixes' affect the ordering of matches.
+-/* ARGSUSED */
+     static void
+ ScrollPageDown(w, event, params, num_params)
+     Widget    w;
+     XEvent    *event;
+-    String    *params;
+-    Cardinal  *num_params;
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+     ScrollSome(w, event, ONE_PAGE_DATA);
+ }
  
-               The "**" item can be used to search in a directory tree.
-               For example, to find all "README.txt" files in the directories
-               in 'runtimepath' and below: >
-                       :echo globpath(&rtp, "**/README.txt")
-@@ -3783,11 +3801,12 @@ log10({expr})                                          *log10()*
- map({expr}, {string})                                 *map()*
-               {expr} must be a |List| or a |Dictionary|.
-               Replace each item in {expr} with the result of evaluating
-               {string}.
-               Inside {string} |v:val| has the value of the current item.
--              For a |Dictionary| |v:key| has the key of the current item.
-+              For a |Dictionary| |v:key| has the key of the current item
-+              and for a |List| |v:key| has the index of the current item.
-               Example: >
-                       :call map(mylist, '"> " . v:val . " <"')
- <             This puts "> " before and " <" after each item in "mylist".
+-/* ARGSUSED */
+     static void
+ ScrollPageUp(w, event, params, num_params)
+     Widget    w;
+     XEvent    *event;
+-    String    *params;
+-    Cardinal  *num_params;
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+     ScrollSome(w, event, -ONE_PAGE_DATA);
+ }
  
-               Note that {string} is the result of an expression and is then
-@@ -4070,10 +4089,27 @@ mode([expr])   Return a string that indica
-               This is useful in the 'statusline' option or when used
-               with |remote_expr()| In most other places it always returns
-               "c" or "n".
-               Also see |visualmode()|.
+     static void
+@@ -899,17 +895,16 @@ ScrollSome(w, event, call_data)
  
-+mzeval({expr})                                                        *mzeval()*
-+              Evaluate MzScheme expression {expr} and return its result
-+              convert to Vim data structures.
-+              Numbers and strings are returned as they are.
-+              Pairs (including lists and improper lists) and vectors are
-+              returned as Vim |Lists|.
-+              Hash tables are represented as Vim |Dictionary| type with keys
-+              converted to strings.
-+              All other types are converted to string with display function.
-+              Examples: >
-+                  :mz (define l (list 1 2 3))
-+                  :mz (define h (make-hash)) (hash-set! h "list" l)
-+                  :echo mzeval("l")
-+                  :echo mzeval("h")
-+<
-+              {only available when compiled with the |+mzscheme| feature}
-+
- nextnonblank({lnum})                                  *nextnonblank()*
-               Return the line number of the first line at or below {lnum}
-               that is not blank.  Example: >
-                       if getline(nextnonblank(1)) =~ "Java"
- <             When {lnum} is invalid or there is no non-blank line at or
-@@ -4498,10 +4534,11 @@ remove({dict}, {key})
- rename({from}, {to})                                  *rename()*
-               Rename the file by the name {from} to the name {to}.  This
-               should also work to move files across file systems.  The
-               result is a Number, which is 0 if the file was renamed
-               successfully, and non-zero when the renaming failed.
-+              NOTE: If {to} exists it is overwritten without warning.
-               This function is not available in the |sandbox|.
+     sbw->scrollbar.scroll_mode = SMODE_LINE_UP;
+     XtCallCallbacks(w, XtNscrollProc, (XtPointer)call_data);
+ }
  
- repeat({expr}, {count})                                       *repeat()*
-               Repeat {expr} {count} times and return the concatenated
-               result.  Example: >
-@@ -5330,18 +5367,23 @@ synIDattr({synID}, {what} [, {mode}])
-               {what}          result
-               "name"          the name of the syntax item
-               "fg"            foreground color (GUI: color name used to set
-                               the color, cterm: color number as a string,
-                               term: empty string)
--              "bg"            background color (like "fg")
-+              "bg"            background color (as with "fg")
-+              "font"          font name (only available in the GUI)
-+                              |highlight-font|
-+              "sp"            special color (as with "fg") |highlight-guisp|
-               "fg#"           like "fg", but for the GUI and the GUI is
-                               running the name in "#RRGGBB" form
-               "bg#"           like "fg#" for "bg"
-+              "sp#"           like "fg#" for "sp"
-               "bold"          "1" if bold
-               "italic"        "1" if italic
-               "reverse"       "1" if reverse
-               "inverse"       "1" if inverse (= reverse)
-+              "standout"      "1" if standout
-               "underline"     "1" if underlined
-               "undercurl"     "1" if undercurled
+-/* ARGSUSED */
+     static void
+ NotifyScroll(w, event, params, num_params)
+     Widget    w;
+     XEvent    *event;
+-    String    *params;
+-    Cardinal  *num_params;
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+     ScrollbarWidget sbw = (ScrollbarWidget) w;
+     Position      x, y, loc;
+     Dimension     arrow_size;
+     unsigned long   delay = 0;
+@@ -989,17 +984,16 @@ NotifyScroll(w, event, params, num_param
+       sbw->scrollbar.timer_id =
+           XtAppAddTimeOut(XtWidgetToApplicationContext(w),
+                                          delay, RepeatNotify, (XtPointer)w);
+ }
  
-               Example (echoes the color of the syntax item under the
-               cursor): >
-@@ -5821,11 +5863,12 @@ mouse_dec              Compiled with support for Dec
- mouse_gpm             Compiled with support for gpm (Linux console mouse)
- mouse_netterm         Compiled with support for netterm mouse.
- mouse_pterm           Compiled with support for qnx pterm mouse.
- mouse_sysmouse                Compiled with support for sysmouse (*BSD console mouse)
- mouse_xterm           Compiled with support for xterm mouse.
--multi_byte            Compiled with support for editing Korean et al.
-+multi_byte            Compiled with support for 'encoding'
-+multi_byte_encoding   'encoding' is set to a multi-byte encoding.
- multi_byte_ime                Compiled with support for IME input method.
- multi_lang            Compiled with support for multiple languages.
- mzscheme              Compiled with MzScheme interface |mzscheme|.
- netbeans_intg         Compiled with support for |netbeans|.
- netbeans_enabled      Compiled with support for |netbeans| and it's used.
-@@ -5846,10 +5889,11 @@ ruby                   Compiled with Ruby interface |rub
- scrollbind            Compiled with 'scrollbind' support.
- showcmd                       Compiled with 'showcmd' support.
- signs                 Compiled with |:sign| support.
- smartindent           Compiled with 'smartindent' support.
- sniff                 Compiled with SNiFF interface support.
-+startuptime           Compiled with |--startuptime| support.
- statusline            Compiled with support for 'statusline', 'rulerformat'
-                       and special formats of 'titlestring' and 'iconstring'.
- sun_workshop          Compiled with support for Sun |workshop|.
- spell                 Compiled with spell checking support |spell|.
- syntax                        Compiled with syntax highlighting support |syntax|.
---- vim72.orig/runtime/doc/starting.txt
-+++ vim72/runtime/doc/starting.txt
-@@ -1,6 +1,6 @@
--*starting.txt*  For Vim version 7.2.  Last change: 2008 Jun 21
-+*starting.txt*  For Vim version 7.2.  Last change: 2008 Nov 09
+-/* ARGSUSED */
+     static void
+ EndScroll(w, event, params, num_params)
+     Widget w;
+-    XEvent *event;    /* unused */
+-    String *params;   /* unused */
+-    Cardinal *num_params;   /* unused */
++    XEvent *event UNUSED;
++    String *params UNUSED;
++    Cardinal *num_params UNUSED;
+ {
+     ScrollbarWidget sbw = (ScrollbarWidget) w;
  
+     sbw->scrollbar.scroll_mode = SMODE_NONE;
+     /* no need to remove any autoscroll timeout; it will no-op */
+@@ -1021,17 +1015,16 @@ FractionLoc(sbw, x, y)
+     height = (float)sbw->core.height - 2 * margin;
+     width = (float)sbw->core.width - 2 * margin;
+     return PICKLENGTH(sbw, x / width, y / height);
+ }
  
-                 VIM REFERENCE MANUAL    by Bram Moolenaar
+-/* ARGSUSED */
+     static void
+ MoveThumb(w, event, params, num_params)
+     Widget    w;
+     XEvent    *event;
+-    String    *params;        /* unused */
+-    Cardinal  *num_params;    /* unused */
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+     ScrollbarWidget   sbw = (ScrollbarWidget)w;
+     Position          x, y;
+     float             top;
+     char              old_mode = sbw->scrollbar.scroll_mode;
+@@ -1067,31 +1060,36 @@ MoveThumb(w, event, params, num_params)
+     PaintThumb(sbw);
+     XFlush(XtDisplay(w));   /* re-draw it before Notifying */
+ }
  
  
-@@ -142,10 +142,18 @@ a slash.  Thus "-R" means recovery and "
-                       (nothing)               yes                 yes
-                       -u NONE                 no                  no
-                       -u NORC                 no                  yes
-                       --noplugin              yes                 no
+-/* ARGSUSED */
+     static void
+ NotifyThumb(w, event, params, num_params)
+     Widget    w;
+     XEvent    *event;
+-    String    *params;        /* unused */
+-    Cardinal  *num_params;    /* unused */
++    String    *params UNUSED;
++    Cardinal  *num_params UNUSED;
+ {
+     ScrollbarWidget sbw = (ScrollbarWidget)w;
++    /* Use a union to avoid a warning for the weird conversion from float to
++     * XtPointer.  Comes from Xaw/Scrollbar.c. */
++    union {
++      XtPointer xtp;
++      float xtf;
++    } xtpf;
  
-+--startuptime {fname}                                 *--startuptime*
-+              During startup write timing messages to the file {fname}.
-+              This can be used to find out where time is spent while loading
-+              your .vimrc, plugins and opening the first file.
-+              When {fname} already exists new messages are appended.
-+              (Only available when compiled with the |+startuptime|
-+              feature).
-+
-                                                       *--literal*
- --literal     Take file names literally, don't expand wildcards.  Not needed
-               for Unix, because Vim always takes file names literally (the
-               shell expands wildcards).
-               Applies to all the names, also the ones that come before this
-@@ -469,10 +477,11 @@ a slash.  Thus "-R" means recovery and "
-                                                       *-X*
- -X            Do not try connecting to the X server to get the current
-               window title and copy/paste using the X clipboard.  This
-               avoids a long startup time when running Vim in a terminal
-               emulator and the connection to the X server is slow.
-+              See |--startuptime| to find out if affects you.
-               Only makes a difference on Unix or VMS, when compiled with the
-               |+X11| feature.  Otherwise it's ignored.
-               To disable the connection only for specific terminals, see the
-               'clipboard' option.
-               When the X11 Session Management Protocol (XSMP) handler has
-@@ -1335,12 +1344,13 @@ working on.  Viminfo and Session files t
- enter Vim and directly start working in your desired setup. |session-file|
+     if (LookAhead(w, event))
+       return;
  
-                                                       *viminfo-read*
- When Vim is started and the 'viminfo' option is non-empty, the contents of
- the viminfo file are read and the info can be used in the appropriate places.
--The marks are not read in at startup (but file marks are).  See
--|initialization| for how to set the 'viminfo' option upon startup.
-+The |v:oldfiles| variable is filled.  The marks are not read in at startup
-+(but file marks are).  See |initialization| for how to set the 'viminfo'
-+option upon startup.
+     /* thumbProc is not pretty, but is necessary for backwards
+        compatibility on those architectures for which it work{s,ed};
+        the intent is to pass a (truncated) float by value. */
+-    XtCallCallbacks(w, XtNthumbProc, *(XtPointer*)&sbw->scrollbar.top);
++    xtpf.xtf = sbw->scrollbar.top;
++    XtCallCallbacks(w, XtNthumbProc, xtpf.xtp);
+     XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top);
+ }
  
-                                                       *viminfo-write*
- When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
- file (it's actually merged with the existing one, if one exists).  The
- 'viminfo' option is a string containing information about what info should be
-@@ -1370,10 +1380,12 @@ about to abandon with ":bdel", use ":wv"
- stored, but the '"' mark is.  The '"' mark is very useful for jumping to the
- cursor position when the file was last exited.  No marks are saved for files
- that start with any string given with the "r" flag in 'viminfo'.  This can be
- used to avoid saving marks for files on removable media (for MS-DOS you would
- use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:").
-+The |v:oldfiles| variable is filled with the file names that the viminfo file
-+has marks for.
+-/* ARGSUSED */
+     static void
+ AllocTopShadowGC(w)
+     Widget w;
+ {
+     ScrollbarWidget sbw = (ScrollbarWidget) w;
+@@ -1101,11 +1099,10 @@ AllocTopShadowGC(w)
+     valuemask = GCForeground;
+     myXGCV.foreground = sbw->scrollbar.top_shadow_pixel;
+     sbw->scrollbar.top_shadow_GC = XtGetGC(w, valuemask, &myXGCV);
+ }
  
-                                                       *viminfo-file-marks*
- Uppercase marks ('A to 'Z) are stored when writing the viminfo file.  The
- numbered marks ('0 to '9) are a bit special.  When the viminfo file is written
- (when exiting or with the ":wviminfo" command), '0 is set to the current cursor
-@@ -1461,12 +1473,12 @@ either have to fix the error, or delete
- most of the information will be restored).
+-/* ARGSUSED */
+     static void
+ AllocBotShadowGC(w)
+     Widget w;
+ {
+     ScrollbarWidget sbw = (ScrollbarWidget) w;
+@@ -1115,15 +1112,14 @@ AllocBotShadowGC(w)
+     valuemask = GCForeground;
+     myXGCV.foreground = sbw->scrollbar.bot_shadow_pixel;
+     sbw->scrollbar.bot_shadow_GC = XtGetGC(w, valuemask, &myXGCV);
+ }
  
-                                                  *:rv* *:rviminfo* *E195*
- :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above).
-                       If [!] is given, then any information that is
--                      already set (registers, marks, etc.) will be
--                      overwritten.  {not in Vi}
-+                      already set (registers, marks, |v:oldfiles|, etc.)
-+                      will be overwritten   {not in Vi}
+-/* ARGSUSED */
+     static void
+ _Xaw3dDrawShadows(gw, event, region, out)
+     Widget  gw;
+-    XEvent  *event;
++    XEvent  *event UNUSED;
+     Region  region;
+     int           out;
+ {
+     XPoint  pt[6];
+     ScrollbarWidget sbw = (ScrollbarWidget) gw;
+--- vim72.orig/src/gui_athena.c
++++ vim72/src/gui_athena.c
+@@ -84,14 +84,13 @@ static int         puller_width = 0;
  
-                                       *:wv* *:wviminfo* *E137* *E138* *E574*
- :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above).
-                       The information in the file is first read in to make
-                       a merge between old and new info.  When [!] is used,
-@@ -1477,6 +1489,22 @@ most of the information will be restored
-                       check that no old temp files were left behind (e.g.
-                       ~/.viminf*) and that you can write in the directory of
-                       the .viminfo file.
-                       {not in Vi}
+ /*
+  * Scrollbar callback (XtNjumpProc) for when the scrollbar is dragged with the
+  * left or middle mouse button.
+  */
+-/* ARGSUSED */
+     static void
+ gui_athena_scroll_cb_jump(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data, call_data;
+ {
+     scrollbar_T *sb, *sb_info;
+     long      value;
  
-+                                              *:ol* *:oldfiles*
-+:ol[dfiles]           List the files that have marks stored in the viminfo
-+                      file.  This list is read on startup and only changes
-+                      afterwards with ":rviminfo!".  Also see |v:oldfiles|.
-+                      The number can be used with |c_#<|.
-+                      {not in Vi, only when compiled with the +eval feature}
-+
-+:bro[wse] ol[dfiles][!]
-+                      List file names as with |:oldfiles|, and then prompt
-+                      for a number.  When the number is valid that file from
-+                      the list is edited.
-+                      If you get the |press-enter| prompt you can press "q"
-+                      and still get the prompt to enter a file number.
-+                      Use ! to abondon a modified buffer. |abandon|
-+                      {not when compiled with tiny or small features}
-+
-  vim:tw=78:ts=8:ft=help:norl:
---- vim72.orig/runtime/doc/usr_21.txt
-+++ vim72/runtime/doc/usr_21.txt
-@@ -1,6 +1,6 @@
--*usr_21.txt*  For Vim version 7.2.  Last change: 2007 May 01
-+*usr_21.txt*  For Vim version 7.2.  Last change: 2008 Nov 09
+@@ -120,14 +119,13 @@ gui_athena_scroll_cb_jump(w, client_data
  
-                    VIM USER MANUAL - by Bram Moolenaar
+ /*
+  * Scrollbar callback (XtNscrollProc) for paging up or down with the left or
+  * right mouse buttons.
+  */
+-/* ARGSUSED */
+     static void
+ gui_athena_scroll_cb_scroll(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data, call_data;
+ {
+     scrollbar_T *sb, *sb_info;
+     long      value;
+     int               data = (int)(long)call_data;
+@@ -490,11 +488,11 @@ get_toolbar_pixmap(menu, sen)
+     }
  
-                          Go away and come back
+     if (menu->icon_builtin || gui_find_bitmap(menu->name, buf, "xpm") == FAIL)
+     {
+       if (menu->iconidx >= 0 && menu->iconidx
+-                 < (sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
++            < (int)(sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
+           xpm = built_in_pixmaps[menu->iconidx];
+       else
+           xpm = tb_blank_xpm;
+     }
  
-@@ -151,11 +151,11 @@ See the 'viminfo' option and |viminfo-fi
- When you run Vim multiple times, the last one exiting will store its
- information.  This may cause information that previously exiting Vims stored
- to be lost.  Each item can be remembered only once.
+@@ -761,11 +759,11 @@ athena_calculate_ins_pos(widget)
+     XtSetArg(args[n], XtNchildren, &children); n++;
+     XtSetArg(args[n], XtNnumChildren, &num_children); n++;
+     XtGetValues(XtParent(widget), args, n);
  
+     retval = num_children;
+-    for (i = 0; i < num_children; ++i)
++    for (i = 0; i < (int)num_children; ++i)
+     {
+       Widget  current = children[i];
+       vimmenu_T       *menu = NULL;
  
--GETTING BACK TO WHERE YOU WERE
-+GETTING BACK TO WHERE YOU STOPPED VIM
+       for (menu = (a_cur_menu->parent == NULL)
+@@ -778,15 +776,14 @@ athena_calculate_ins_pos(widget)
+               retval = i;
+     }
+     return retval;
+ }
  
- You are halfway editing a file and it's time to leave for holidays.  You exit
- Vim and go enjoy yourselves, forgetting all about your work.  After a couple
- of weeks you start Vim, and type:
- >
-@@ -166,10 +166,52 @@ And you are right back where you left Vi
- position that '0 pointed to is made '1.  And '1 is made to '2, and so forth.
- Mark '9 is lost.
-    The |:marks| command is useful to find out where '0 to '9 will take you.
+-/* ARGSUSED */
+     void
+ gui_mch_add_menu(menu, idx)
+     vimmenu_T *menu;
+-    int               idx;
++    int               idx UNUSED;
+ {
+     char_u    *pullright_name;
+     Dimension height, space, border;
+     vimmenu_T *parent = menu->parent;
  
+@@ -867,11 +864,11 @@ gui_mch_add_menu(menu, idx)
+           int         i;
  
-+GETTING BACK TO SOME FILE
-+
-+If you want to go back to a file that you edited recently, but not when
-+exiting Vim, there is a slightly more complicated way.  You can see a list of
-+files by typing the command: >
-+
-+      :oldfiles
-+<     1: ~/.viminfo ~
-+      2: ~/text/resume.txt ~
-+      3: /tmp/draft ~
-+
-+Now you would like to edit the second file, which is in the list preceded by
-+"2:".  You type: >
-+
-+      :e #<2
-+
-+Instead of ":e" you can use any command that has a file name argument, the
-+"#<2" item works in the same place as "%" (current file name) and "#"
-+(alternate file name).  So you can also split the window to edit the third
-+file: >
-+
-+      :split #<3
-+
-+That #<123 thing is a bit complicated when you just want to edit a file.
-+Fortunately there is a simpler way: >
-+
-+      :browse oldfiles
-+<     1: ~/.viminfo ~
-+      2: ~/text/resume.txt ~
-+      3: /tmp/draft ~
-+      -- More --
-+
-+You get the same list of files as with |:oldfiles|.  If you want to edit
-+"resume.txt" first press "q" to stop the listing.  You will get a prompt:
-+
-+      Type number and <Enter> (empty cancels): ~
-+
-+Type "2" and press <Enter> to edit the second file.
-+
-+More info at |:oldfiles|, |v:oldfiles| and |c_#<|.
-+
-+
- MOVE INFO FROM ONE VIM TO ANOTHER
+           XtVaGetValues(parent->submenu_id, XtNchildren, &children,
+                                             XtNnumChildren, &num_children,
+                                             NULL);
+-          for (i = 0; i < num_children; ++i)
++          for (i = 0; i < (int)num_children; ++i)
+           {
+               XtVaSetValues(children[i],
+                             XtNrightMargin, puller_width,
+                             NULL);
+           }
+@@ -911,11 +908,11 @@ gui_athena_menu_has_submenus(id, ignore)
+     int               i;
  
- You can use the ":wviminfo" and ":rviminfo" commands to save and restore the
- information while still running Vim.  This is useful for exchanging register
- contents between two instances of Vim, for example.  In the first Vim do: >
---- vim72.orig/src/feature.h
-+++ vim72/src/feature.h
-@@ -765,13 +765,17 @@
- # define FEAT_GUI_TABLINE
- #endif
+     XtVaGetValues(id, XtNchildren, &children,
+                     XtNnumChildren, &num_children,
+                     NULL);
+-    for (i = 0; i < num_children; ++i)
++    for (i = 0; i < (int)num_children; ++i)
+     {
+       if (children[i] == ignore)
+           continue;
+       if (has_submenu(children[i]))
+           return True;
+@@ -1173,15 +1170,14 @@ make_pull_name(name)
+           *p = '_';
+     }
+     return pname;
+ }
  
- /*
-  * +browse            ":browse" command.
-+ *                    or just the ":browse" command modifier
-  */
--#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC))
--# define FEAT_BROWSE
-+#if defined(FEAT_NORMAL)
-+# define FEAT_BROWSE_CMD
-+# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
-+#  define FEAT_BROWSE
-+# endif
- #endif
+-/* ARGSUSED */
+     void
+ gui_mch_add_menu_item(menu, idx)
+     vimmenu_T *menu;
+-    int               idx;
++    int               idx UNUSED;
+ {
+     vimmenu_T *parent = menu->parent;
  
- /*
-  * +dialog_gui                Use GUI dialog.
-  * +dialog_con                May use Console dialog.
-@@ -838,14 +842,18 @@
-  * DEBUG              Output a lot of debugging garbage.
-  */
- /* #define DEBUG */
+     a_cur_menu = menu;
+ # ifdef FEAT_TOOLBAR
+@@ -1442,11 +1438,11 @@ gui_mch_compute_toolbar_height()
+               XtNborderWidth,     &shadowThickness,
+               XtNvSpace,          &marginHeight,
+               XtNchildren,        &children,
+               XtNnumChildren,     &numChildren,
+               NULL);
+-      for (i = 0; i < numChildren; i++)
++      for (i = 0; i < (int)numChildren; i++)
+       {
+           whgt = 0;
  
- /*
-- * STARTUPTIME                Time the startup process.  Writes a "vimstartup" file
-- *                    with timestamps.
-+ * STARTUPTIME                Time the startup process.  Writes a file with
-+ *                    timestamps.
-  */
--/* #define STARTUPTIME "vimstartup" */
-+#if defined(FEAT_NORMAL) \
-+      && ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)) \
-+              || defined(WIN3264))
-+# define STARTUPTIME 1
-+#endif
+           XtVaGetValues(children[i], XtNheight, &whgt, NULL);
+           if (height < whgt)
+@@ -1471,14 +1467,13 @@ gui_mch_get_toolbar_colors(bgp, fgp, bsp
+     *hsp = *tsp;
+ }
+ #endif
  
- /*
-  * MEM_PROFILE                Debugging of memory allocation and freeing.
-  */
- /* #define MEM_PROFILE */
---- vim72.orig/src/mark.c
-+++ vim72/src/mark.c
-@@ -882,14 +882,13 @@ ex_delmarks(eap)
  
- #if defined(FEAT_JUMPLIST) || defined(PROTO)
- /*
-  * print the jumplist
-  */
--/*ARGSUSED*/
+-/* ARGSUSED */
      void
ex_jumps(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
gui_mch_toggle_tearoffs(enable)
+-    int               enable;
++    int               enable UNUSED;
  {
-     int               i;
-     char_u    *name;
-     cleanup_jumplist();
-@@ -931,14 +930,13 @@ ex_jumps(eap)
+     /* no tearoff menus */
  }
  
- /*
-  * print the changelist
-  */
--/*ARGSUSED*/
      void
- ex_changes(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     int               i;
-     char_u    *name;
+@@ -1535,11 +1530,11 @@ gui_mch_destroy_menu(menu)
+           if (gui_athena_menu_has_submenus(parent, menu->id))
+               right_margin = puller_width;
+           else
+               get_left_margin = True;
  
-     /* Highlight title */
-@@ -1021,10 +1019,13 @@ mark_adjust(line1, line2, amount, amount
- {
-     int               i;
-     int               fnum = curbuf->b_fnum;
-     linenr_T  *lp;
-     win_T     *win;
-+#ifdef FEAT_WINDOWS
-+    tabpage_T *tab;
-+#endif
-     if (line2 < line1 && amount_after == 0L)      /* nothing to do */
-       return;
+-          for (i = 0; i < num_children; ++i)
++          for (i = 0; i < (int)num_children; ++i)
+           {
+               if (children[i] == menu->id)
+                   continue;
+               if (get_left_margin == True)
+               {
+@@ -1643,15 +1638,14 @@ gui_mch_destroy_menu(menu)
+       XtDestroyWidget(menu->submenu_id);
+       menu->submenu_id = (Widget)0;
+     }
+ }
  
-     if (!cmdmod.lockmarks)
-@@ -1062,11 +1063,11 @@ mark_adjust(line1, line2, amount, amount
+-/*ARGSUSED*/
+     static void
+ gui_athena_menu_timeout(client_data, id)
+     XtPointer     client_data;
+-    XtIntervalId    *id;
++    XtIntervalId    *id UNUSED;
+ {
+     Widget  w = (Widget)client_data;
+     Widget  popup;
  
- #ifdef FEAT_QUICKFIX
-       /* quickfix marks */
-       qf_mark_adjust(NULL, line1, line2, amount, amount_after);
-       /* location lists */
--      FOR_ALL_WINDOWS(win)
-+      FOR_ALL_TAB_WINDOWS(tab, win)
-           qf_mark_adjust(win, line1, line2, amount, amount_after);
- #endif
+     timer = 0;
+@@ -1676,16 +1670,15 @@ gui_athena_menu_timeout(client_data, id)
+  * up.  It should appear even with and just slightly to the left of the
+  * rightmost end of the menu entry that caused the popup.
+  *
+  * This is called when XtPopup() is called.
+  */
+-/*ARGSUSED*/
+     static void
+ gui_athena_popup_callback(w, client_data, call_data)
+     Widget    w;
+     XtPointer client_data;
+-    XtPointer call_data;
++    XtPointer call_data UNUSED;
+ {
+     /* Assumption: XtIsSubclass(XtParent(w),simpleMenuWidgetClass) */
+     vimmenu_T *menu = (vimmenu_T *)client_data;
+     Dimension width;
+     Position  root_x, root_y;
+@@ -1709,11 +1702,10 @@ gui_athena_popup_callback(w, client_data
+     XtVaSetValues(w, XtNx, root_x,
+                    XtNy, root_y,
+                    NULL);
+ }
  
- #ifdef FEAT_SIGNS
-       sign_mark_adjust(line1, line2, amount, amount_after);
-@@ -1084,11 +1085,11 @@ mark_adjust(line1, line2, amount, amount
-       one_adjust_nodel(&(saved_cursor.lnum));
+-/* ARGSUSED */
+     static void
+ gui_athena_popdown_submenus_action(w, event, args, nargs)
+     Widget    w;
+     XEvent    *event;
+     String    *args;
+@@ -1754,11 +1746,10 @@ has_submenu(widget)
+           return True;
+     }
+     return False;
+ }
  
-     /*
-      * Adjust items in all windows related to the current buffer.
-      */
--    FOR_ALL_WINDOWS(win)
-+    FOR_ALL_TAB_WINDOWS(tab, win)
-     {
- #ifdef FEAT_JUMPLIST
-       if (!cmdmod.lockmarks)
-           /* Marks in the jumplist.  When deleting lines, this may create
-            * duplicate marks in the jumplist, they will be removed later. */
-@@ -1625,19 +1626,21 @@ write_one_mark(fp_out, c, pos)
-       fprintf(fp_out, "\t%c\t%ld\t%d\n", c, (long)pos->lnum, (int)pos->col);
+-/* ARGSUSED */
+     static void
+ gui_athena_delayed_arm_action(w, event, args, nargs)
+     Widget    w;
+     XEvent    *event;
+     String    *args;
+@@ -1835,11 +1826,10 @@ submenu_widget(widget)
+     return popup;
+     /* Postcondition: (popup != NULL) implies
+      * (XtIsSubclass(popup,simpleMenuWidgetClass) == True) */
  }
  
+-/* ARGSUSED */
+     void
+ gui_mch_show_popupmenu(menu)
+     vimmenu_T *menu;
+ {
+     int               rootx, rooty, winx, winy;
+@@ -2044,19 +2034,18 @@ gui_x11_get_wid()
+ #if defined(FEAT_BROWSE) || defined(PROTO)
  /*
-  * Handle marks in the viminfo file:
-- * fp_out == NULL   read marks for current buffer only
-- * fp_out != NULL   copy marks for buffers not in buffer list
-+ * fp_out != NULL: copy marks for buffers not in buffer list
-+ * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only
-+ * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles
+  * Put up a file requester.
+  * Returns the selected name in allocated memory, or NULL for Cancel.
   */
-     void
--copy_viminfo_marks(virp, fp_out, count, eof)
-+copy_viminfo_marks(virp, fp_out, count, eof, flags)
-     vir_T     *virp;
-     FILE      *fp_out;
-     int               count;
-     int               eof;
-+    int               flags;
+-/* ARGSUSED */
+     char_u *
+ gui_mch_browse(saving, title, dflt, ext, initdir, filter)
+-    int               saving;         /* select file to write */
+-    char_u    *title;         /* not used (title for the window) */
+-    char_u    *dflt;          /* not used (default name) */
+-    char_u    *ext;           /* not used (extension added) */
++    int               saving UNUSED;  /* select file to write */
++    char_u    *title;         /* title for the window */
++    char_u    *dflt;          /* default name */
++    char_u    *ext UNUSED;    /* extension added */
+     char_u    *initdir;       /* initial directory, NULL for current dir */
+-    char_u    *filter;        /* not used (file name filter) */
++    char_u    *filter UNUSED; /* file name filter */
  {
-     char_u    *line = virp->vir_line;
-     buf_T     *buf;
-     int               num_marked_files;
-     int               load_marks;
-@@ -1645,14 +1648,27 @@ copy_viminfo_marks(virp, fp_out, count,
-     char_u    *str;
-     int               i;
-     char_u    *p;
-     char_u    *name_buf;
-     pos_T     pos;
-+#ifdef FEAT_EVAL
-+    list_T    *list = NULL;
-+#endif
+     Position x, y;
+     char_u    dirbuf[MAXPATHL];
  
-     if ((name_buf = alloc(LSIZE)) == NULL)
-       return;
-     *name_buf = NUL;
-+
-+#ifdef FEAT_EVAL
-+    if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT)))
-+    {
-+      list = list_alloc();
-+      if (list != NULL)
-+          set_vim_var_list(VV_OLDFILES, list);
-+    }
-+#endif
-+
-     num_marked_files = get_viminfo_parameter('\'');
-     while (!eof && (count < num_marked_files || fp_out == NULL))
+     /* Concatenate "initdir" and "dflt". */
+@@ -2098,17 +2087,16 @@ static void dialog_wm_handler __ARGS((Wi
+ /*
+  * Callback function for the textfield.  When CR is hit this works like
+  * hitting the "OK" button, ESC like "Cancel".
+  */
+-/* ARGSUSED */
+     static void
+ keyhit_callback(w, client_data, event, cont)
+-    Widget            w;
+-    XtPointer         client_data;
++    Widget            w UNUSED;
++    XtPointer         client_data UNUSED;
+     XEvent            *event;
+-    Boolean           *cont;
++    Boolean           *cont UNUSED;
+ {
+     char      buf[2];
+     if (XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1)
      {
-       if (line[0] != '>')
-       {
-@@ -1679,18 +1695,23 @@ copy_viminfo_marks(virp, fp_out, count,
-           p--;
-       if (*p)
-           p++;
-       *p = NUL;
+@@ -2117,44 +2105,41 @@ keyhit_callback(w, client_data, event, c
+       else if (*buf == ESC)
+           dialogStatus = 0;
+     }
+ }
  
-+#ifdef FEAT_EVAL
-+      if (list != NULL)
-+          list_append_string(list, str, -1);
-+#endif
-+
-       /*
-        * If fp_out == NULL, load marks for current buffer.
-        * If fp_out != NULL, copy marks for buffers not in buflist.
-        */
-       load_marks = copy_marks_out = FALSE;
-       if (fp_out == NULL)
-       {
--          if (curbuf->b_ffname != NULL)
-+          if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL)
-           {
-               if (*name_buf == NUL)       /* only need to do this once */
-                   home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE);
-               if (fnamecmp(str, name_buf) == 0)
-                   load_marks = TRUE;
---- vim72.orig/src/misc1.c
-+++ vim72/src/misc1.c
-@@ -1024,16 +1024,18 @@ open_line(dir, flags, old_indent)
-               if (lead_repl != NULL)
-               {
-                   int         c = 0;
-                   int         off = 0;
+-/* ARGSUSED */
+     static void
+ butproc(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+-    XtPointer call_data;
++    XtPointer call_data UNUSED;
+ {
+     dialogStatus = (int)(long)client_data + 1;
+ }
  
--                  for (p = lead_flags; *p && *p != ':'; ++p)
-+                  for (p = lead_flags; *p != NUL && *p != ':'; )
-                   {
-                       if (*p == COM_RIGHT || *p == COM_LEFT)
--                          c = *p;
-+                          c = *p++;
-                       else if (VIM_ISDIGIT(*p) || *p == '-')
-                           off = getdigits(&p);
-+                      else
-+                          ++p;
-                   }
-                   if (c == COM_RIGHT)    /* right adjusted leader */
-                   {
-                       /* find last non-white in the leader to line up with */
-                       for (p = leader + lead_len - 1; p > leader
-@@ -1117,11 +1119,11 @@ open_line(dir, flags, old_indent)
-                                   break;
-                           }
-                           if (i != lead_repl_len)
-                           {
-                               mch_memmove(p + lead_repl_len, p + i,
--                                     (size_t)(lead_len - i - (leader - p)));
-+                                     (size_t)(lead_len - i - (p - leader)));
-                               lead_len += lead_repl_len - i;
-                           }
-                       }
- #endif
-                       mch_memmove(p, lead_repl, (size_t)lead_repl_len);
-@@ -2186,16 +2188,15 @@ del_chars(count, fixpos)
-  * If "fixpos" is TRUE, don't leave the cursor on the NUL after the line.
-  * Caller must have prepared for undo.
-  *
-  * return FAIL for failure, OK otherwise
+ /*
+  * Function called when dialog window closed.
   */
 -/*ARGSUSED*/
+     static void
+ dialog_wm_handler(w, client_data, event, dum)
+-    Widget    w;
+-    XtPointer client_data;
++    Widget    w UNUSED;
++    XtPointer client_data UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
+ {
+     if (event->type == ClientMessage
+-          && ((XClientMessageEvent *)event)->data.l[0] == dialogatom)
++          && (Atom)((XClientMessageEvent *)event)->data.l[0] == dialogatom)
+       dialogStatus = 0;
+ }
+-/* ARGSUSED */
      int
- del_bytes(count, fixpos_arg, use_delcombine)
-     long      count;
-     int               fixpos_arg;
--    int               use_delcombine;     /* 'delcombine' option applies */
-+    int               use_delcombine UNUSED;      /* 'delcombine' option applies */
+ gui_mch_dialog(type, title, message, buttons, dfltbutton, textfield)
+-    int               type;
++    int               type UNUSED;
+     char_u    *title;
+     char_u    *message;
+     char_u    *buttons;
+-    int               dfltbutton;
++    int               dfltbutton UNUSED;
+     char_u    *textfield;
  {
-     char_u    *oldp, *newp;
-     colnr_T   oldlen;
-     linenr_T  lnum = curwin->w_cursor.lnum;
-     colnr_T   col = curwin->w_cursor.col;
-@@ -2344,35 +2345,39 @@ truncate_line(fixpos)
- del_lines(nlines, undo)
-     long      nlines;         /* number of lines to delete */
-     int               undo;           /* if TRUE, prepare for undo */
+     char_u            *buts;
+     char_u            *p, *next;
+     XtAppContext      app;
+--- vim72.orig/src/gui_beval.c
++++ vim72/src/gui_beval.c
+@@ -13,15 +13,14 @@
+ #if defined(FEAT_BEVAL) || defined(PROTO)
+ /*
+  * Common code, invoked when the mouse is resting for a moment.
+  */
+-/*ARGSUSED*/
+     void
+ general_beval_cb(beval, state)
+     BalloonEval *beval;
+-    int state;
++    int               state UNUSED;
  {
-     long      n;
-+    linenr_T  first = curwin->w_cursor.lnum;
+     win_T     *wp;
+     int               col;
+     int               use_sandbox;
+     linenr_T  lnum;
+@@ -549,13 +548,12 @@ target_event_cb(GtkWidget *widget, GdkEv
+     }
  
-     if (nlines <= 0)
-       return;
+     return FALSE; /* continue emission */
+ }
  
-     /* save the deleted lines for undo */
--    if (undo && u_savedel(curwin->w_cursor.lnum, nlines) == FAIL)
-+    if (undo && u_savedel(first, nlines) == FAIL)
-       return;
+-/*ARGSUSED*/
+     static gint
+-mainwin_event_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
++mainwin_event_cb(GtkWidget *widget UNUSED, GdkEvent *event, gpointer data)
+ {
+     BalloonEval *beval = (BalloonEval *)data;
  
-     for (n = 0; n < nlines; )
+     switch (event->type)
      {
-       if (curbuf->b_ml.ml_flags & ML_EMPTY)       /* nothing to delete */
-           break;
+@@ -661,24 +659,24 @@ timeout_cb(gpointer data)
+     requestBalloon(beval);
  
--      ml_delete(curwin->w_cursor.lnum, TRUE);
-+      ml_delete(first, TRUE);
-       ++n;
+     return FALSE; /* don't call me again */
+ }
  
-       /* If we delete the last line in the file, stop */
--      if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
-+      if (first > curbuf->b_ml.ml_line_count)
-           break;
-     }
--    /* adjust marks, mark the buffer as changed and prepare for displaying */
--    deleted_lines_mark(curwin->w_cursor.lnum, n);
+-/*ARGSUSED2*/
+     static gint
+-balloon_expose_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
++balloon_expose_event_cb(GtkWidget *widget,
++                      GdkEventExpose *event,
++                      gpointer data UNUSED)
+ {
+     gtk_paint_flat_box(widget->style, widget->window,
+                      GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+                      &event->area, widget, "tooltip",
+                      0, 0, -1, -1);
  
-+    /* Correct the cursor position before calling deleted_lines_mark(), it may
-+     * trigger a callback to display the cursor. */
-     curwin->w_cursor.col = 0;
-     check_cursor_lnum();
-+
-+    /* adjust marks, mark the buffer as changed and prepare for displaying */
-+    deleted_lines_mark(first, n);
+     return FALSE; /* continue emission */
  }
  
-     int
- gchar_pos(pos)
-     pos_T *pos;
-@@ -2620,10 +2625,12 @@ deleted_lines(lnum, count)
-     changed_lines(lnum, 0, lnum + count, -count);
- }
+ # ifndef HAVE_GTK2
+-/*ARGSUSED2*/
+     static void
+ balloon_draw_cb(GtkWidget *widget, GdkRectangle *area, gpointer data)
+ {
+     GtkWidget     *child;
+     GdkRectangle    child_area;
+@@ -724,17 +722,16 @@ removeEventHandler(beval)
  
  /*
-  * Like deleted_lines(), but adjust marks first.
-+ * Make sure the cursor is on a valid line before calling, a GUI callback may
-+ * be triggered to display the cursor.
+  * The X event handler. All it does is call the real event handler.
   */
-     void
- deleted_lines_mark(lnum, count)
-     linenr_T  lnum;
-     long      count;
-@@ -2715,10 +2722,13 @@ changed_common(lnum, col, lnume, xtra)
-     colnr_T   col;
-     linenr_T  lnume;
-     long      xtra;
+-/*ARGSUSED*/
+     static void
+ pointerEventEH(w, client_data, event, unused)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+     XEvent    *event;
+-    Boolean   *unused;
++    Boolean   *unused UNUSED;
  {
-     win_T     *wp;
-+#ifdef FEAT_WINDOWS
-+    tabpage_T *tp;
-+#endif
-     int               i;
- #ifdef FEAT_JUMPLIST
-     int               cols;
-     pos_T     *p;
-     int               add;
-@@ -2767,19 +2777,19 @@ changed_common(lnum, col, lnume, xtra)
-               {
-                   /* changelist is full: remove oldest entry */
-                   curbuf->b_changelistlen = JUMPLISTSIZE - 1;
-                   mch_memmove(curbuf->b_changelist, curbuf->b_changelist + 1,
-                                         sizeof(pos_T) * (JUMPLISTSIZE - 1));
--                  FOR_ALL_WINDOWS(wp)
-+                  FOR_ALL_TAB_WINDOWS(tp, wp)
-                   {
-                       /* Correct position in changelist for other windows on
-                        * this buffer. */
-                       if (wp->w_buffer == curbuf && wp->w_changelistidx > 0)
-                           --wp->w_changelistidx;
-                   }
-               }
--              FOR_ALL_WINDOWS(wp)
-+              FOR_ALL_TAB_WINDOWS(tp, wp)
-               {
-                   /* For other windows, if the position in the changelist is
-                    * at the end it stays at the end. */
-                   if (wp->w_buffer == curbuf
-                           && wp->w_changelistidx == curbuf->b_changelistlen)
-@@ -2794,11 +2804,11 @@ changed_common(lnum, col, lnume, xtra)
-        * takes you back to it. */
-       curwin->w_changelistidx = curbuf->b_changelistlen;
- #endif
-     }
+     BalloonEval *beval = (BalloonEval *)client_data;
+     pointerEvent(beval, event);
+ }
  
--    FOR_ALL_WINDOWS(wp)
-+    FOR_ALL_TAB_WINDOWS(tp, wp)
-     {
-       if (wp->w_buffer == curbuf)
-       {
-           /* Mark this window to be redrawn later. */
-           if (wp->w_redr_type < VALID)
-@@ -2876,10 +2886,17 @@ changed_common(lnum, col, lnume, xtra)
-                        * may need to be redrawn */
-                       wp->w_lines[i].wl_valid = FALSE;
-                   }
- #endif
-               }
-+
-+#ifdef FEAT_FOLDING
-+          /* Take care of side effects for setting w_topline when folds have
-+           * changed.  Esp. when the buffer was changed in another window. */
-+          if (hasAnyFolding(wp))
-+              set_topline(wp, wp->w_topline);
-+#endif
-       }
+@@ -875,15 +872,14 @@ pointerEvent(beval, event)
+       default:
+           break;
      }
+ }
  
-     /* Call update_screen() later, which checks out what needs to be redrawn,
-      * since it notices b_mod_set and then uses b_mod_*. */
-@@ -2953,10 +2970,12 @@ check_status(buf)
-     void
- change_warning(col)
-     int           col;                /* column for message; non-zero when in insert
-                                  mode and 'showmode' is on */
+-/*ARGSUSED*/
+     static void
+ timerRoutine(dx, id)
+     XtPointer     dx;
+-    XtIntervalId    *id;
++    XtIntervalId    *id UNUSED;
  {
-+    static char *w_readonly = N_("W10: Warning: Changing a readonly file");
-+
-     if (curbuf->b_did_warn == FALSE
-           && curbufIsChanged() == 0
- #ifdef FEAT_AUTOCMD
-           && !autocmd_busy
- #endif
-@@ -2975,12 +2994,14 @@ change_warning(col)
-        */
-       msg_start();
-       if (msg_row == Rows - 1)
-           msg_col = col;
-       msg_source(hl_attr(HLF_W));
--      MSG_PUTS_ATTR(_("W10: Warning: Changing a readonly file"),
--                                                 hl_attr(HLF_W) | MSG_HIST);
-+      MSG_PUTS_ATTR(_(w_readonly), hl_attr(HLF_W) | MSG_HIST);
-+#ifdef FEAT_EVAL
-+      set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_readonly), -1);
+     BalloonEval *beval = (BalloonEval *)dx;
+     beval->timerID = (XtIntervalId)NULL;
+@@ -1289,10 +1285,27 @@ drawBalloon(beval)
+       XtVaSetValues(beval->balloonShell,
+               XtNx, tx,
+               XtNy, ty,
+               NULL);
+ #endif
++      /* Set tooltip colors */
++      {
++          Arg args[2];
++
++#ifdef FEAT_GUI_MOTIF
++          args[0].name = XmNbackground;
++          args[0].value = gui.tooltip_bg_pixel;
++          args[1].name = XmNforeground;
++          args[1].value = gui.tooltip_fg_pixel;
++#else /* Athena */
++          args[0].name = XtNbackground;
++          args[0].value = gui.tooltip_bg_pixel;
++          args[1].name = XtNforeground;
++          args[1].value = gui.tooltip_fg_pixel;
 +#endif
-       msg_clr_eos();
-       (void)msg_end();
-       if (msg_silent == 0 && !silent_mode)
-       {
-           out_flush();
-@@ -3243,13 +3264,13 @@ prompt_for_number(mouse_used)
-     int               save_cmdline_row;
-     int               save_State;
++          XtSetValues(beval->balloonLabel, &args[0], XtNumber(args));
++      }
  
-     /* When using ":silent" assume that <CR> was entered. */
-     if (mouse_used != NULL)
--      MSG_PUTS(_("Type number or click with mouse (<Enter> cancels): "));
-+      MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): "));
-     else
--      MSG_PUTS(_("Choice number (<Enter> cancels): "));
-+      MSG_PUTS(_("Type number and <Enter> (empty cancels): "));
+       XtPopup(beval->balloonShell, XtGrabNone);
  
-     /* Set the state such that text can be selected/copied/pasted and we still
-      * get mouse events. */
-     save_cmdline_row = cmdline_row;
-     cmdline_row = 0;
-@@ -3262,10 +3283,11 @@ prompt_for_number(mouse_used)
-       /* don't call wait_return() now */
-       /* msg_putchar('\n'); */
-       cmdline_row = msg_row - 1;
-       need_wait_return = FALSE;
-       msg_didany = FALSE;
-+      msg_didout = FALSE;
+       beval->showState = ShS_SHOWING;
+--- vim72.orig/src/gui_gtk.c
++++ vim72/src/gui_gtk.c
+@@ -283,18 +283,18 @@ create_menu_icon(vimmenu_T *menu, GtkIco
      }
-     else
-       cmdline_row = save_cmdline_row;
-     State = save_State;
  
-@@ -3446,11 +3468,13 @@ init_homedir()
-     {
-       char_u *homedrive, *homepath;
+     return image;
+ }
  
-       homedrive = mch_getenv((char_u *)"HOMEDRIVE");
-       homepath = mch_getenv((char_u *)"HOMEPATH");
--      if (homedrive != NULL && homepath != NULL
-+      if (homepath == NULL || *homepath == NUL)
-+          homepath = "\\";
-+      if (homedrive != NULL
-                          && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL)
-       {
-           sprintf((char *)NameBuff, "%s%s", homedrive, homepath);
-           if (NameBuff[0] != NUL)
-           {
-@@ -4139,14 +4163,13 @@ vim_setenv(name, val)
+-/*ARGSUSED*/
+     static gint
+-toolbar_button_focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
+-{
+-    /* When we're in a GtkPlug, we don't have window focus events, only widget focus.
+-     * To emulate stand-alone gvim, if a button gets focus (e.g., <Tab> into GtkPlug)
+-     * immediately pass it to mainwin.
+-     */
++toolbar_button_focus_in_event(GtkWidget *widget UNUSED,
++                            GdkEventFocus *event UNUSED,
++                            gpointer data UNUSED)
++{
++    /* When we're in a GtkPlug, we don't have window focus events, only widget
++     * focus.  To emulate stand-alone gvim, if a button gets focus (e.g.,
++     * <Tab> into GtkPlug) immediately pass it to mainwin. */
+     if (gtk_socket_id != 0)
+       gtk_widget_grab_focus(gui.drawarea);
  
- #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
- /*
-  * Function given to ExpandGeneric() to obtain an environment variable name.
+     return TRUE;
+ }
+@@ -583,13 +583,12 @@ gui_mch_add_menu(vimmenu_T *menu, int id
+     if (vim_strchr(p_go, GO_TEAROFF) != NULL)
+       gtk_widget_show(menu->tearoff_handle);
+     gtk_menu_prepend(GTK_MENU(menu->submenu_id), menu->tearoff_handle);
+ }
+-/*ARGSUSED*/
+     static void
+-menu_item_activate(GtkWidget *widget, gpointer data)
++menu_item_activate(GtkWidget *widget UNUSED, gpointer data)
+ {
+     gui_menu_cb((vimmenu_T *)data);
+ # ifndef HAVE_GTK2
+     /* Work around a bug in GTK+ 1: we don't seem to get a focus-in
+@@ -1200,13 +1199,12 @@ gui_mch_destroy_scrollbar(scrollbar_T *s
+  * on just about any event. */
+ /* # define USE_FILE_CHOOSER */
+ #endif
+ #ifndef USE_FILE_CHOOSER
+-/*ARGSUSED*/
+     static void
+-browse_ok_cb(GtkWidget *widget, gpointer cbdata)
++browse_ok_cb(GtkWidget *widget UNUSED, gpointer cbdata)
+ {
+     gui_T *vw = (gui_T *)cbdata;
+     if (vw->browse_fname != NULL)
+       g_free(vw->browse_fname);
+@@ -1216,13 +1214,12 @@ browse_ok_cb(GtkWidget *widget, gpointer
+     gtk_widget_hide(vw->filedlg);
+     if (gtk_main_level() > 0)
+       gtk_main_quit();
+ }
+-/*ARGSUSED*/
+     static void
+-browse_cancel_cb(GtkWidget *widget, gpointer cbdata)
++browse_cancel_cb(GtkWidget *widget UNUSED, gpointer cbdata)
+ {
+     gui_T *vw = (gui_T *)cbdata;
+     if (vw->browse_fname != NULL)
+     {
+@@ -1232,13 +1229,12 @@ browse_cancel_cb(GtkWidget *widget, gpoi
+     gtk_widget_hide(vw->filedlg);
+     if (gtk_main_level() > 0)
+       gtk_main_quit();
+ }
+-/*ARGSUSED*/
+     static gboolean
+-browse_destroy_cb(GtkWidget * widget)
++browse_destroy_cb(GtkWidget *widget UNUSED)
+ {
+     if (gui.browse_fname != NULL)
+     {
+       g_free(gui.browse_fname);
+       gui.browse_fname = NULL;
+@@ -1260,18 +1256,17 @@ browse_destroy_cb(GtkWidget * widget)
+  * dflt                               default name
+  * ext                                not used (extension added)
+  * initdir                    initial directory, NULL for current dir
+  * filter                     not used (file name filter)
   */
 -/*ARGSUSED*/
      char_u *
- get_env_name(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
+-gui_mch_browse(int saving,
++gui_mch_browse(int saving UNUSED,
+              char_u *title,
+              char_u *dflt,
+-             char_u *ext,
++             char_u *ext UNUSED,
+              char_u *initdir,
+-             char_u *filter)
++             char_u *filter UNUSED)
  {
- # if defined(AMIGA) || defined(__MRC__) || defined(__SC__)
-     /*
-      * No environ[] on the Amiga and on the Mac (using MPW).
-@@ -4643,11 +4666,10 @@ concat_fnames(fname1, fname2, sep)
-       STRCAT(dest, fname2);
-     }
-     return dest;
+ #ifdef USE_FILE_CHOOSER
+     GtkWidget         *fc;
+ #endif
+     char_u            dirbuf[MAXPATHL];
+@@ -1375,11 +1370,10 @@ gui_mch_browse(int saving,
+  * Returns the selected name in allocated memory, or NULL for Cancel.
+  * title                      title for the window
+  * dflt                               default name
+  * initdir                    initial directory, NULL for current dir
+  */
+-/*ARGSUSED*/
+     char_u *
+ gui_mch_browsedir(
+              char_u *title,
+              char_u *initdir)
+ {
+@@ -1458,11 +1452,10 @@ dlg_destroy(GtkWidget *dlg)
+     /* Destroy the dialog, will break the waiting loop. */
+     gtk_widget_destroy(dlg);
+ }
+ # ifdef FEAT_GUI_GNOME
+-/* ARGSUSED */
+     static int
+ gui_gnome_dialog( int type,
+               char_u  *title,
+               char_u  *message,
+               char_u  *buttons,
+@@ -1609,22 +1602,20 @@ typedef struct _CancelData
+     int               *status;
+     int               ignore_enter;
+     GtkWidget *dialog;
+ } CancelData;
+-/* ARGSUSED */
+     static void
+ dlg_button_clicked(GtkWidget * widget, ButtonData *data)
+ {
+     *(data->status) = data->index + 1;
+     dlg_destroy(data->dialog);
  }
  
--#if defined(FEAT_EVAL) || defined(FEAT_GETTEXT) || defined(PROTO)
  /*
-  * Concatenate two strings and return the result in allocated memory.
-  * Returns NULL when out of memory.
+  * This makes the Escape key equivalent to the cancel button.
   */
-     char_u  *
-@@ -4664,11 +4686,10 @@ concat_str(str1, str2)
-       STRCPY(dest, str1);
-       STRCPY(dest + l, str2);
+-/*ARGSUSED*/
+     static int
+ dlg_key_press_event(GtkWidget *widget, GdkEventKey *event, CancelData *data)
+ {
+     /* Ignore hitting Enter (or Space) when there is no default button. */
+     if (data->ignore_enter && (event->keyval == GDK_Return
+@@ -1653,11 +1644,10 @@ dlg_destroy_cb(int *p)
+     *p = TRUE;                /* set dialog_destroyed to break out of the loop */
+     if (gtk_main_level() > 0)
+       gtk_main_quit();
+ }
+-/* ARGSUSED */
+     int
+ gui_mch_dialog(       int     type,           /* type of dialog */
+               char_u  *title,         /* title of dialog */
+               char_u  *message,       /* message text */
+               char_u  *buttons,       /* names of buttons */
+@@ -2213,11 +2203,10 @@ typedef struct _DialogInfo
+     int               ignore_enter;       /* no default button, ignore "Enter" */
+     int               noalt;              /* accept accelerators without Alt */
+     GtkDialog *dialog;            /* Widget of the dialog */
+ } DialogInfo;
+-/*ARGSUSED2*/
+     static gboolean
+ dialog_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+ {
+     DialogInfo *di = (DialogInfo *)data;
+@@ -2322,23 +2311,10 @@ gui_mch_dialog(int     type,       /* type of
+           CONVERT_FROM_UTF8_FREE(text);
+       }
+       gtk_widget_destroy(dialog);
      }
-     return dest;
+-    /* Terrible hack: When the text area still has focus when we remove the
+-     * dialog, somehow gvim loses window focus.  This is with "point to type"
+-     * in the KDE 3.1 window manager.  Warp the mouse pointer to outside the
+-     * window and back to avoid that. */
+-    if (!gui.in_focus)
+-    {
+-      int x, y;
+-
+-      gdk_window_get_pointer(gui.drawarea->window, &x, &y, NULL);
+-      gui_mch_setmouse(-100, -100);
+-      gui_mch_setmouse(x, y);
+-    }
+-
+     return response > 0 ? response : 0;
  }
--#endif
  
- /*
-  * Add a path separator to a file name, unless it already ends in a path
-  * separator.
+ #endif /* FEAT_GUI_DIALOG && HAVE_GTK2 */
+@@ -2396,18 +2372,17 @@ static int popup_mouse_pos;
+  * at the current text cursor position.
+  *
+  * Note: The push_in output argument seems to affect scrolling of huge
+  * menus that don't fit on the screen.        Leave it at the default for now.
   */
-@@ -4734,13 +4755,13 @@ find_start_comment(ind_maxcomment)         /
-       /*
-        * Check if the comment start we found is inside a string.
-        * If it is then restrict the search to below this line and try again.
-        */
-       line = ml_get(pos->lnum);
--      for (p = line; *p && (unsigned)(p - line) < pos->col; ++p)
-+      for (p = line; *p && (colnr_T)(p - line) < pos->col; ++p)
-           p = skip_string(p);
--      if ((unsigned)(p - line) <= pos->col)
-+      if ((colnr_T)(p - line) <= pos->col)
-           break;
-       cur_maxcomment = curwin->w_cursor.lnum - pos->lnum - 1;
-       if (cur_maxcomment <= 0)
-       {
-           pos = NULL;
-@@ -6267,11 +6288,11 @@ get_c_indent()
-      * inserting new stuff.
-      * For unknown reasons the cursor might be past the end of the line, thus
-      * check for that.
-      */
-     if ((State & INSERT)
--          && curwin->w_cursor.col < STRLEN(linecopy)
-+          && curwin->w_cursor.col < (colnr_T)STRLEN(linecopy)
-           && linecopy[curwin->w_cursor.col] == ')')
-       linecopy[curwin->w_cursor.col] = NUL;
+-/*ARGSUSED0*/
+     static void
+-popup_menu_position_func(GtkMenu *menu,
++popup_menu_position_func(GtkMenu *menu UNUSED,
+                        gint *x, gint *y,
+ # ifdef HAVE_GTK2
+-                       gboolean *push_in,
++                       gboolean *push_in UNUSED,
+ # endif
+-                       gpointer user_data)
++                       gpointer user_data UNUSED)
+ {
+     gdk_window_get_origin(gui.drawarea->window, x, y);
  
-     theline = skipwhite(linecopy);
+     if (popup_mouse_pos)
+     {
+@@ -2462,17 +2437,16 @@ typedef struct _SharedFindReplace
+     GtkWidget *find;  /* 'Find Next' action button */
+     GtkWidget *replace;       /* 'Replace With' action button */
+     GtkWidget *all;   /* 'Replace All' action button */
+ } SharedFindReplace;
  
-@@ -7704,15 +7725,18 @@ term_again:
-       }
+-static SharedFindReplace find_widgets = { NULL, };
+-static SharedFindReplace repl_widgets = { NULL, };
++static SharedFindReplace find_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
++static SharedFindReplace repl_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
  
-       /*
-        * If the NEXT line is a function declaration, the current
-        * line needs to be indented as a function type spec.
--       * Don't do this if the current line looks like a comment
--       * or if the current line is terminated, ie. ends in ';'.
-+       * Don't do this if the current line looks like a comment or if the
-+       * current line is terminated, ie. ends in ';', or if the current line
-+       * contains { or }: "void f() {\n if (1)"
-        */
-       else if (cur_curpos.lnum < curbuf->b_ml.ml_line_count
-               && !cin_nocode(theline)
-+              && vim_strchr(theline, '{') == NULL
-+              && vim_strchr(theline, '}') == NULL
-               && !cin_ends_in(theline, (char_u *)":", NULL)
-               && !cin_ends_in(theline, (char_u *)",", NULL)
-               && cin_isfuncdecl(NULL, cur_curpos.lnum + 1)
-               && !cin_isterminated(theline, FALSE, TRUE))
-       {
-@@ -8424,10 +8448,50 @@ fast_breakcheck()
-       ui_breakcheck();
-     }
+-/* ARGSUSED */
+     static int
+ find_key_press_event(
+-              GtkWidget       *widget,
++              GtkWidget       *widget UNUSED,
+               GdkEventKey     *event,
+               SharedFindReplace *frdp)
+ {
+     /* If the user is holding one of the key modifiers we will just bail out,
+      * thus preserving the possibility of normal focus traversal.
+@@ -2960,13 +2934,12 @@ gui_gtk_synch_fonts(void)
+ /*
+  * Callback for actions of the find and replace dialogs
+  */
+-/*ARGSUSED*/
+     static void
+-find_replace_cb(GtkWidget *widget, gpointer data)
++find_replace_cb(GtkWidget *widget UNUSED, gpointer data)
+ {
+     int                       flags;
+     char_u            *find_text;
+     char_u            *repl_text;
+     gboolean          direction_down;
+@@ -3008,13 +2981,12 @@ find_replace_cb(GtkWidget *widget, gpoin
+     if (rc && gtk_main_level() > 0)
+       gtk_main_quit(); /* make sure cmd will be handled immediately */
+ }
+ /* our usual callback function */
+-/*ARGSUSED*/
+     static void
+-entry_activate_cb(GtkWidget *widget, gpointer data)
++entry_activate_cb(GtkWidget *widget UNUSED, gpointer data)
+ {
+     gtk_widget_grab_focus(GTK_WIDGET(data));
  }
  
  /*
-+ * Invoke expand_wildcards() for one pattern.
-+ * Expand items like "%:h" before the expansion.
-+ * Returns OK or FAIL.
-+ */
-+    int
-+expand_wildcards_eval(pat, num_file, file, flags)
-+    char_u     **pat;         /* pointer to input pattern */
-+    int                 *num_file;    /* resulting number of files */
-+    char_u    ***file;        /* array of resulting files */
-+    int                  flags;       /* EW_DIR, etc. */
-+{
-+    int               ret = FAIL;
-+    char_u    *eval_pat = NULL;
-+    char_u    *exp_pat = *pat;
-+    char_u      *ignored_msg;
-+    int               usedlen;
-+
-+    if (*exp_pat == '%' || *exp_pat == '#' || *exp_pat == '<')
-+    {
-+      ++emsg_off;
-+      eval_pat = eval_vars(exp_pat, exp_pat, &usedlen,
-+                                                  NULL, &ignored_msg, NULL);
-+      --emsg_off;
-+      if (eval_pat != NULL)
-+          exp_pat = concat_str(eval_pat, exp_pat + usedlen);
-+    }
-+
-+    if (exp_pat != NULL)
-+      ret = expand_wildcards(1, &exp_pat, num_file, file, flags);
-+
-+    if (eval_pat != NULL)
-+    {
-+      vim_free(exp_pat);
-+      vim_free(eval_pat);
-+    }
-+
-+    return ret;
-+}
-+
-+/*
-  * Expand wildcards.  Calls gen_expand_wildcards() and removes files matching
-  * 'wildignore'.
-  * Returns OK or FAIL.
+@@ -3053,14 +3025,13 @@ entry_changed_cb(GtkWidget * entry, GtkW
+ }
+ /*
+  * ":helpfind"
   */
-     int
-@@ -8520,15 +8584,29 @@ match_suffix(fname)
-     fnamelen = (int)STRLEN(fname);
-     setsuflen = 0;
-     for (setsuf = p_su; *setsuf; )
-     {
-       setsuflen = copy_option_part(&setsuf, suf_buf, MAXSUFLEN, ".,");
--      if (fnamelen >= setsuflen
--              && fnamencmp(suf_buf, fname + fnamelen - setsuflen,
--                                            (size_t)setsuflen) == 0)
--          break;
--      setsuflen = 0;
-+      if (setsuflen == 0)
-+      {
-+          char_u *tail = gettail(fname);
-+
-+          /* empty entry: match name without a '.' */
-+          if (vim_strchr(tail, '.') == NULL)
-+          {
-+              setsuflen = 1;
-+              break;
-+          }
-+      }
-+      else
-+      {
-+          if (fnamelen >= setsuflen
-+                  && fnamencmp(suf_buf, fname + fnamelen - setsuflen,
-+                                                (size_t)setsuflen) == 0)
-+              break;
-+          setsuflen = 0;
-+      }
-     }
-     return (setsuflen != 0);
+-/*ARGSUSED*/
+     void
+ ex_helpfind(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     /* This will fail when menus are not loaded.  Well, it's only for
+      * backwards compatibility anyway. */
+     do_cmdline_cmd((char_u *)"emenu ToolBar.FindHelp");
  }
+--- vim72.orig/src/gui_gtk_f.c
++++ vim72/src/gui_gtk_f.c
+@@ -225,18 +225,18 @@ gtk_form_get_type(void)
+ {
+     static GtkType form_type = 0;
  
- #if !defined(NO_EXPANDPATH) || defined(PROTO)
-@@ -8726,11 +8804,11 @@ dos_expandpath(
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     if (!form_type)
      {
-       /* The active codepage differs from 'encoding'.  Attempt using the
-        * wide function.  If it fails because it is not implemented fall back
-        * to the non-wide version (for Windows 98) */
--      wn = enc_to_ucs2(buf, NULL);
-+      wn = enc_to_utf16(buf, NULL);
-       if (wn != NULL)
-       {
-           hFind = FindFirstFileW(wn, &wfb);
-           if (hFind == INVALID_HANDLE_VALUE
-                             && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-@@ -8754,11 +8832,11 @@ dos_expandpath(
-     while (ok)
-     {
- #ifdef WIN3264
- # ifdef FEAT_MBYTE
-       if (wn != NULL)
--          p = ucs2_to_enc(wfb.cFileName, NULL);   /* p is allocated here */
-+          p = utf16_to_enc(wfb.cFileName, NULL);   /* p is allocated here */
-       else
- # endif
-           p = (char_u *)fb.cFileName;
- #else
-       p = (char_u *)fb.ff_name;
-@@ -8828,11 +8906,11 @@ dos_expandpath(
-           FindClose(hFind);
- # ifdef FEAT_MBYTE
-           if (wn != NULL)
-           {
-               vim_free(wn);
--              wn = enc_to_ucs2(buf, NULL);
-+              wn = enc_to_utf16(buf, NULL);
-               if (wn != NULL)
-                   hFind = FindFirstFileW(wn, &wfb);
-           }
-           if (wn == NULL)
- # endif
-@@ -9186,11 +9264,11 @@ gen_expand_wildcards(num_pat, pat, num_f
-                * found file names and start all over again.
-                */
-               else if (vim_strpbrk(p, (char_u *)"$~") != NULL)
-               {
-                   vim_free(p);
--                  ga_clear(&ga);
-+                  ga_clear_strings(&ga);
-                   i = mch_expand_wildcards(num_pat, pat, num_file, file,
-                                                                      flags);
-                   recursive = FALSE;
-                   return i;
-               }
---- vim72.orig/src/proto/eval.pro
-+++ vim72/src/proto/eval.pro
-@@ -15,11 +15,11 @@ int eval_printexpr __ARGS((char_u *fname
- void eval_diff __ARGS((char_u *origfile, char_u *newfile, char_u *outfile));
- void eval_patch __ARGS((char_u *origfile, char_u *difffile, char_u *outfile));
- int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip));
- char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip));
- int skip_expr __ARGS((char_u **pp));
--char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist));
-+char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert));
- char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox));
- int eval_to_number __ARGS((char_u *expr));
- list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr));
- int get_spellword __ARGS((list_T *list, char_u **pp));
- typval_T *eval_expr __ARGS((char_u *arg, char_u **nextcmd));
-@@ -44,24 +44,33 @@ void del_menutrans_vars __ARGS((void));
- char_u *get_user_var_name __ARGS((expand_T *xp, int idx));
- list_T *list_alloc __ARGS((void));
- void list_unref __ARGS((list_T *l));
- void list_free __ARGS((list_T *l, int recurse));
- dictitem_T *dict_lookup __ARGS((hashitem_T *hi));
-+char_u *list_find_str __ARGS((list_T *l, long idx));
-+int list_append_tv __ARGS((list_T *l, typval_T *tv));
- int list_append_dict __ARGS((list_T *list, dict_T *dict));
-+int list_append_string __ARGS((list_T *l, char_u *str, int len));
- int garbage_collect __ARGS((void));
- dict_T *dict_alloc __ARGS((void));
-+dictitem_T *dictitem_alloc __ARGS((char_u *key));
-+void dictitem_free __ARGS((dictitem_T *item));
-+int dict_add __ARGS((dict_T *d, dictitem_T *item));
- int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str));
- char_u *get_dict_string __ARGS((dict_T *d, char_u *key, int save));
- long get_dict_number __ARGS((dict_T *d, char_u *key));
- char_u *get_function_name __ARGS((expand_T *xp, int idx));
- char_u *get_expr_name __ARGS((expand_T *xp, int idx));
- long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit));
- void set_vim_var_nr __ARGS((int idx, long val));
- long get_vim_var_nr __ARGS((int idx));
- char_u *get_vim_var_str __ARGS((int idx));
--void set_vcount __ARGS((long count, long count1));
-+list_T *get_vim_var_list __ARGS((int idx));
-+void set_vim_var_char __ARGS((int c));
-+void set_vcount __ARGS((long count, long count1, int set_prevcount));
- void set_vim_var_string __ARGS((int idx, char_u *val, int len));
-+void set_vim_var_list __ARGS((int idx, list_T *val));
- void set_reg_var __ARGS((int c));
- char_u *v_exception __ARGS((char_u *oldval));
- char_u *v_throwpoint __ARGS((char_u *oldval));
- char_u *set_cmdarg __ARGS((exarg_T *eap, char_u *oldarg));
- void free_tv __ARGS((typval_T *varp));
-@@ -70,10 +79,11 @@ long get_tv_number_chk __ARGS((typval_T
- char_u *get_tv_string_chk __ARGS((typval_T *varp));
- char_u *get_var_value __ARGS((char_u *name));
- void new_script_vars __ARGS((scid_T id));
- void init_var_dict __ARGS((dict_T *dict, dictitem_T *dict_var));
- void vars_clear __ARGS((hashtab_T *ht));
-+void copy_tv __ARGS((typval_T *from, typval_T *to));
- void ex_echo __ARGS((exarg_T *eap));
- void ex_echohl __ARGS((exarg_T *eap));
- void ex_execute __ARGS((exarg_T *eap));
- void ex_function __ARGS((exarg_T *eap));
- void free_all_functions __ARGS((void));
-@@ -92,8 +102,9 @@ int func_has_ended __ARGS((void *cookie)
- int func_has_abort __ARGS((void *cookie));
- int read_viminfo_varlist __ARGS((vir_T *virp, int writing));
- void write_viminfo_varlist __ARGS((FILE *fp));
- int store_session_globals __ARGS((FILE *fd));
- void last_set_msg __ARGS((scid_T scriptID));
-+void ex_oldfiles __ARGS((exarg_T *eap));
- int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen));
- char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags));
- /* vim: set ft=c : */
---- vim72.orig/src/proto/ex_cmds.pro
-+++ vim72/src/proto/ex_cmds.pro
-@@ -7,13 +7,13 @@ int do_move __ARGS((linenr_T line1, line
- void ex_copy __ARGS((linenr_T line1, linenr_T line2, linenr_T n));
- void free_prev_shellcmd __ARGS((void));
- void do_bang __ARGS((int addr_count, exarg_T *eap, int forceit, int do_in, int do_out));
- void do_shell __ARGS((char_u *cmd, int flags));
- char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp));
--void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname));
-+void append_redir __ARGS((char_u *buf, int buflen, char_u *opt, char_u *fname));
- int viminfo_error __ARGS((char *errnum, char *message, char_u *line));
--int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit));
-+int read_viminfo __ARGS((char_u *file, int flags));
- void write_viminfo __ARGS((char_u *file, int forceit));
- int viminfo_readline __ARGS((vir_T *virp));
- char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert));
- void viminfo_writestring __ARGS((FILE *fd, char_u *p));
- void do_fixdel __ARGS((exarg_T *eap));
-@@ -25,11 +25,11 @@ void ex_write __ARGS((exarg_T *eap));
- int do_write __ARGS((exarg_T *eap));
- void ex_wnext __ARGS((exarg_T *eap));
- void do_wqall __ARGS((exarg_T *eap));
- int not_writing __ARGS((void));
- int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit));
--int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags));
-+int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags, win_T *oldwin));
- void ex_append __ARGS((exarg_T *eap));
- void ex_change __ARGS((exarg_T *eap));
- void ex_z __ARGS((exarg_T *eap));
- int check_restricted __ARGS((void));
- int check_secure __ARGS((void));
-@@ -53,7 +53,10 @@ void ex_sign __ARGS((exarg_T *eap));
- void sign_gui_started __ARGS((void));
- int sign_get_attr __ARGS((int typenr, int line));
- char_u *sign_get_text __ARGS((int typenr));
- void *sign_get_image __ARGS((int typenr));
- char_u *sign_typenr2name __ARGS((int typenr));
-+void free_signs __ARGS((void));
-+char_u *get_sign_name __ARGS((expand_T *xp, int idx));
-+void set_context_in_sign_cmd __ARGS((expand_T *xp, char_u *arg));
- void ex_drop __ARGS((exarg_T *eap));
- /* vim: set ft=c : */
---- vim72.orig/src/proto/mark.pro
-+++ vim72/src/proto/mark.pro
-@@ -24,7 +24,7 @@ void set_last_cursor __ARGS((win_T *win)
- void free_all_marks __ARGS((void));
- int read_viminfo_filemark __ARGS((vir_T *virp, int force));
- void write_viminfo_filemarks __ARGS((FILE *fp));
- int removable __ARGS((char_u *name));
- int write_viminfo_marks __ARGS((FILE *fp_out));
--void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof));
-+void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags));
- /* vim: set ft=c : */
---- vim72.orig/src/structs.h
-+++ vim72/src/structs.h
-@@ -14,11 +14,11 @@
-  * There is something wrong in the SAS compiler that makes typedefs not
-  * valid in include files.  Has been fixed in version 6.58.
+-      GtkTypeInfo form_info =
+-      {
+-          "GtkForm",
+-          sizeof(GtkForm),
+-          sizeof(GtkFormClass),
+-          (GtkClassInitFunc) gtk_form_class_init,
+-          (GtkObjectInitFunc) gtk_form_init
+-      };
++      GtkTypeInfo form_info;
++
++      vim_memset(&form_info, 0, sizeof(form_info));
++      form_info.type_name = "GtkForm";
++      form_info.object_size = sizeof(GtkForm);
++      form_info.class_size = sizeof(GtkFormClass);
++      form_info.class_init_func = (GtkClassInitFunc)gtk_form_class_init;
++      form_info.object_init_func = (GtkObjectInitFunc)gtk_form_init;
+       form_type = gtk_type_unique(GTK_TYPE_CONTAINER, &form_info);
+     }
+     return form_type;
+ }
+@@ -609,14 +609,13 @@ gtk_form_remove(GtkContainer *container,
+       g_list_free_1(tmp_list);
+       g_free(child);
+     }
+ }
+-/*ARGSUSED1*/
+     static void
+ gtk_form_forall(GtkContainer  *container,
+-              gboolean        include_internals,
++              gboolean        include_internals UNUSED,
+               GtkCallback     callback,
+               gpointer        callback_data)
+ {
+     GtkForm *form;
+     GtkFormChild *child;
+@@ -784,13 +783,12 @@ gtk_form_position_children(GtkForm *form
+  * This routine identifies expose events that are generated when
+  * we've temporarily moved the bin_window_origin, and translates
+  * them or discards them, depending on whether we are obscured
+  * or not.
   */
- #if defined(SASC) && SASC < 658
- typedef long          linenr_T;
--typedef unsigned      colnr_T;
-+typedef int           colnr_T;
- typedef unsigned short        short_u;
- #endif
+-/*ARGSUSED1*/
+     static GdkFilterReturn
+-gtk_form_filter(GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
++gtk_form_filter(GdkXEvent *gdk_xevent, GdkEvent *event UNUSED, gpointer data)
+ {
+     XEvent *xevent;
+     GtkForm *form;
  
- /*
-  * position in file or buffer
-@@ -31,13 +31,13 @@ typedef struct
-     colnr_T   coladd;
- #endif
- } pos_T;
+     xevent = (XEvent *) gdk_xevent;
+@@ -819,13 +817,14 @@ gtk_form_filter(GdkXEvent *gdk_xevent, G
  
- #ifdef FEAT_VIRTUALEDIT
--# define INIT_POS_T {0, 0, 0}
-+# define INIT_POS_T(l, c, ca) {l, c, ca}
+ /* Although GDK does have a GDK_VISIBILITY_NOTIFY event,
+  * there is no corresponding event in GTK, so we have
+  * to get the events from a filter
+  */
+-/*ARGSUSED1*/
+     static GdkFilterReturn
+-gtk_form_main_filter(GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
++gtk_form_main_filter(GdkXEvent *gdk_xevent,
++                   GdkEvent *event UNUSED,
++                   gpointer data)
+ {
+     XEvent *xevent;
+     GtkForm *form;
+     xevent = (XEvent *) gdk_xevent;
+@@ -859,15 +858,13 @@ gtk_form_main_filter(GdkXEvent *gdk_xeve
+  */
+     static void
+ gtk_form_set_static_gravity(GdkWindow *window, gboolean use_static)
+ {
+ #ifdef HAVE_GTK2
+-    gboolean static_gravity_supported;
+-
+-    static_gravity_supported = gdk_window_set_static_gravities(window,
+-                                                             use_static);
+-    g_return_if_fail(static_gravity_supported);
++    /* We don't check if static gravity is actually supported, because it
++     * results in an annoying assertion error message. */
++    gdk_window_set_static_gravities(window, use_static);
  #else
--# define INIT_POS_T {0, 0}
-+# define INIT_POS_T(l, c, ca) {l, c}
+     XSetWindowAttributes xattributes;
+     xattributes.win_gravity = (use_static) ? StaticGravity : NorthWestGravity;
+     xattributes.bit_gravity = (use_static) ? StaticGravity : NorthWestGravity;
+@@ -909,25 +906,23 @@ gtk_form_send_configure(GtkForm *form)
+ #else
+     gtk_widget_event(widget, (GdkEvent*)&event);
  #endif
+ }
  
- /*
-  * Same, but without coladd.
-  */
-@@ -430,10 +430,11 @@ struct buffheader
-  */
- typedef struct expand
+-/*ARGSUSED0*/
+     static void
+-gtk_form_child_map(GtkWidget *widget, gpointer user_data)
++gtk_form_child_map(GtkWidget *widget UNUSED, gpointer user_data)
  {
-     int               xp_context;             /* type of expansion */
-     char_u    *xp_pattern;            /* start of item to expand */
-+    int               xp_pattern_len;         /* bytes in xp_pattern before cursor */
- #if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
-     char_u    *xp_arg;                /* completion function */
-     int               xp_scriptID;            /* SID for completion function */
+     GtkFormChild *child;
+     child = (GtkFormChild *)user_data;
+     child->mapped = TRUE;
+     gdk_window_show(child->window);
+ }
+-/*ARGSUSED0*/
+     static void
+-gtk_form_child_unmap(GtkWidget *widget, gpointer user_data)
++gtk_form_child_unmap(GtkWidget *widget UNUSED, gpointer user_data)
+ {
+     GtkFormChild *child;
+     child = (GtkFormChild *)user_data;
+--- vim72.orig/src/gui_gtk_x11.c
++++ vim72/src/gui_gtk_x11.c
+@@ -105,10 +105,11 @@ enum
+ {
+     TARGET_TYPE_NONE,
+     TARGET_UTF8_STRING,
+     TARGET_STRING,
+     TARGET_COMPOUND_TEXT,
++    TARGET_HTML,
+     TARGET_TEXT,
+     TARGET_TEXT_URI_LIST,
+     TARGET_TEXT_PLAIN,
+     TARGET_VIM,
+     TARGET_VIMENC
+@@ -121,10 +122,11 @@ enum
+ static const GtkTargetEntry selection_targets[] =
+ {
+     {VIMENC_ATOM_NAME,        0, TARGET_VIMENC},
+     {VIM_ATOM_NAME,   0, TARGET_VIM},
+ #ifdef FEAT_MBYTE
++    {"text/html",     0, TARGET_HTML},
+     {"UTF8_STRING",   0, TARGET_UTF8_STRING},
  #endif
-     int               xp_backslash;           /* one of the XP_BS_ values */
-@@ -457,11 +458,11 @@ typedef struct expand
-  * easy manipulation.
+     {"COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT},
+     {"TEXT",          0, TARGET_TEXT},
+     {"STRING",                0, TARGET_STRING}
+@@ -138,10 +140,11 @@ static const GtkTargetEntry selection_ta
   */
- typedef struct
+ static const GtkTargetEntry dnd_targets[] =
  {
-     int               hide;                   /* TRUE when ":hide" was used */
--# ifdef FEAT_BROWSE
-+# ifdef FEAT_BROWSE_CMD
-     int               browse;                 /* TRUE to invoke file dialog */
+     {"text/uri-list", 0, TARGET_TEXT_URI_LIST},
+ # ifdef FEAT_MBYTE
++    {"text/html",     0, TARGET_HTML},
+     {"UTF8_STRING",   0, TARGET_UTF8_STRING},
  # endif
- # ifdef FEAT_WINDOWS
-     int               split;                  /* flags for win_split() */
-     int               tab;                    /* > 0 when ":tab" was used */
-@@ -880,10 +881,12 @@ typedef struct
- /* Struct to hold the saved typeahead for save_typeahead(). */
- typedef struct
- {
-     typebuf_T         save_typebuf;
-     int                       typebuf_valid;      /* TRUE when save_typebuf valid */
-+    int                       old_char;
-+    int                       old_mod_mask;
-     struct buffheader save_stuffbuff;
- #ifdef USE_INPUT_BUF
-     char_u            *save_inputbuf;
- #endif
- } tasave_T;
-@@ -1164,11 +1167,12 @@ struct file_buffer
-     char_u    *b_ffname;      /* full path file name */
-     char_u    *b_sfname;      /* short file name */
-     char_u    *b_fname;       /* current file name */
+     {"STRING",                0, TARGET_STRING},
+     {"text/plain",    0, TARGET_TEXT_PLAIN}
+ };
+@@ -176,10 +179,11 @@ static GdkAtom save_yourself_atom = GDK_
  
- #ifdef UNIX
--    int               b_dev;          /* device number (-1 if not set) */
-+    int               b_dev_valid;    /* TRUE when b_dev has a valid number */
-+    dev_t     b_dev;          /* device number */
-     ino_t     b_ino;          /* inode number */
+ /*
+  * Atoms used to control/reference X11 selections.
+  */
+ #ifdef FEAT_MBYTE
++static GdkAtom html_atom = GDK_NONE;
+ static GdkAtom utf8_string_atom = GDK_NONE;
  #endif
- #ifdef FEAT_CW_EDITOR
-     FSSpec    b_FSSpec;       /* MacOS File Identification */
+ #ifndef HAVE_GTK2
+ static GdkAtom compound_text_atom = GDK_NONE;
+ static GdkAtom text_atom = GDK_NONE;
+@@ -410,10 +414,11 @@ static char **gui_argv = NULL;
+ #ifdef HAVE_GTK2
+ static const char *role_argument = NULL;
  #endif
-@@ -1618,10 +1622,18 @@ struct diffblock_S
-     linenr_T  df_lnum[DB_COUNT];      /* line number in buffer */
-     linenr_T  df_count[DB_COUNT];     /* nr of inserted/changed lines */
- };
+ #if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION)
+ static const char *restart_command = NULL;
++static       char *abs_restart_command = NULL;
  #endif
+ static int found_iconic_arg = FALSE;
  
-+#define SNAP_HELP_IDX 0
-+#ifdef FEAT_AUTOCMD
-+# define SNAP_AUCMD_IDX 1
-+# define SNAP_COUNT   2
-+#else
-+# define SNAP_COUNT   1
-+#endif
-+
+ #ifdef FEAT_GUI_GNOME
  /*
-  * Tab pages point to the top frame of each tab page.
-  * Note: Most values are NOT valid for the current tab page!  Use "curwin",
-  * "firstwin", etc. for that.  "tp_topframe" is always valid and can be
-  * compared against "topframe" to find the current tab page.
-@@ -1646,11 +1658,11 @@ struct tabpage_S
- #ifdef FEAT_DIFF
-     diff_T        *tp_first_diff;
-     buf_T         *(tp_diffbuf[DB_COUNT]);
-     int                   tp_diff_invalid;    /* list of diffs is outdated */
- #endif
--    frame_T       *tp_snapshot;    /* window layout snapshot */
-+    frame_T       *(tp_snapshot[SNAP_COUNT]);  /* window layout snapshots */
- #ifdef FEAT_EVAL
-     dictitem_T            tp_winvar;      /* variable for "t:" Dictionary */
-     dict_T        tp_vars;        /* internal variables, local to tab page */
- #endif
- };
-@@ -1782,14 +1794,19 @@ struct window_S
-     colnr_T   w_old_visual_col;   /* last known start of visual part */
-     colnr_T   w_old_curswant;     /* last known value of Curswant */
+@@ -447,12 +452,14 @@ gui_mch_prepare(int *argc, char **argv)
+     if (strchr(argv[0], G_DIR_SEPARATOR) != NULL)
+     {
+       char_u buf[MAXPATHL];
+       if (mch_FullName((char_u *)argv[0], buf, (int)sizeof(buf), TRUE) == OK)
+-          /* Tiny leak; doesn't matter, and usually we don't even get here */
+-          restart_command = (char *)vim_strsave(buf);
++      {
++          abs_restart_command = (char *)vim_strsave(buf);
++          restart_command = abs_restart_command;
++      }
+     }
  #endif
  
      /*
--     * The next three specify the offsets for displaying the buffer:
-+     * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for
-+     * displaying the buffer.
-      */
-     linenr_T  w_topline;          /* buffer line number of the line at the
-                                      top of the window */
-+#ifdef FEAT_AUTOCMD
-+    char      w_topline_was_set;  /* flag set to TRUE when topline is set,
-+                                     e.g. by winrestview() */
-+#endif
- #ifdef FEAT_DIFF
-     int               w_topfill;          /* number of filler lines above w_topline */
-     int               w_old_topfill;      /* w_topfill at last redraw */
-     int               w_botfill;          /* TRUE when filler lines are actually
-                                      below w_topline (at end of file) */
-@@ -2268,20 +2285,17 @@ typedef int vimmenu_T;
-  * Struct to save values in before executing autocommands for a buffer that is
-  * not the current buffer.  Without FEAT_AUTOCMD only "curbuf" is remembered.
-  */
- typedef struct
+      * Move all the entries in argv which are relevant to GTK+ and GNOME
+@@ -609,21 +616,25 @@ gui_mch_prepare(int *argc, char **argv)
+ #if defined(EXITFREE) || defined(PROTO)
+     void
+ gui_mch_free_all()
  {
--    buf_T     *save_buf;      /* saved curbuf */
-+    buf_T     *save_curbuf;   /* saved curbuf */
- #ifdef FEAT_AUTOCMD
--    buf_T     *new_curbuf;    /* buffer to be used */
--    win_T     *save_curwin;   /* saved curwin, NULL if it didn't change */
--    win_T     *new_curwin;    /* new curwin if save_curwin != NULL */
--    pos_T     save_cursor;    /* saved cursor pos of save_curwin */
--    linenr_T  save_topline;   /* saved topline of save_curwin */
--# ifdef FEAT_DIFF
--    int               save_topfill;   /* saved topfill of save_curwin */
--# endif
-+    int               use_aucmd_win;  /* using aucmd_win */
-+    win_T     *save_curwin;   /* saved curwin */
-+    win_T     *new_curwin;    /* new curwin */
-+    buf_T     *new_curbuf;    /* new curbuf */
-+    char_u    *globaldir;     /* saved value of globaldir */
+     vim_free(gui_argv);
++#if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION)
++    vim_free(abs_restart_command);
++#endif
+ }
  #endif
- } aco_save_T;
  
  /*
-  * Generic option table item, only used for printer at the moment.
---- vim72.orig/src/vim.h
-+++ vim72/src/vim.h
-@@ -50,11 +50,13 @@
- # endif
- #endif
- /* user ID of root is usually zero, but not for everybody */
- #ifdef __TANDEM
--# define _TANDEM_SOURCE
-+# ifndef _TANDEM_SOURCE
-+#  define _TANDEM_SOURCE
-+# endif
- # include <floss.h>
- # define ROOT_UID 65535
- #else
- # define ROOT_UID 0
- #endif
-@@ -260,10 +262,18 @@
- /* __ARGS and __PARMS are the same thing. */
- #ifndef __PARMS
- # define __PARMS(x) __ARGS(x)
- #endif
-+/* Mark unused function arguments with UNUSED, so that gcc -Wunused-parameter
-+ * can be used to check for mistakes. */
-+#ifdef HAVE_ATTRIBUTE_UNUSED
-+# define UNUSED __attribute__((unused))
-+#else
-+# define UNUSED
-+#endif
-+
- /* if we're compiling in C++ (currently only KVim), the system
-  * headers must have the correct prototypes or nothing will build.
-  * conversely, our prototypes might clash due to throw() specifiers and
-  * cause compilation failures even though the headers are correct.  For
-  * a concrete example, gcc-3.2 enforces exception specifications, and
-@@ -339,12 +349,18 @@
- # endif
- #endif
- #ifdef BACKSLASH_IN_FILENAME
- # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
- #else
--# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
--# define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
-+# ifdef VMS
-+    /* VMS allows a lot of characters in the file name */
-+#  define PATH_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'\"|!")
-+#  define SHELL_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'|!()&")
-+# else
-+#  define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
-+#  define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
-+# endif
- #endif
- #define NUMBUFLEN 30      /* length of a buffer to store a number in ASCII */
- /*
-@@ -368,11 +384,11 @@ typedef           __int64        long_i;
-    * that change size between 32-bit and 64-bit platforms.  For any such type,
-    * __w64 should appear only on the 32-bit definition of the typedef.
-    * Define __w64 as an empty token for everything but MSVC 7.x or later.
-    */
- # if !defined(_MSC_VER)       || (_MSC_VER < 1300)
--#  define __w64 
-+#  define __w64
- # endif
- typedef unsigned long __w64   long_u;
- typedef                long __w64     long_i;
- # define SCANF_HEX_LONG_U       "%lx"
- # define SCANF_DECIMAL_LONG_U   "%lu"
-@@ -459,10 +475,27 @@ typedef unsigned long u8char_T;      /* l
- #endif
- #ifdef HAVE_STDARG_H
- # include <stdarg.h>
- #endif
-+# if defined(HAVE_SYS_SELECT_H) && \
-+      (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME))
-+#  include <sys/select.h>
-+# endif
-+
-+# ifndef HAVE_SELECT
-+#  ifdef HAVE_SYS_POLL_H
-+#   include <sys/poll.h>
-+#   define HAVE_POLL
-+#  else
-+#   ifdef HAVE_POLL_H
-+#    include <poll.h>
-+#    define HAVE_POLL
-+#   endif
-+#  endif
-+# endif
-+
- /* ================ end of the header file puzzle =============== */
- /*
-  * For dynamically loaded imm library. Currently, only for Win32.
-  */
-@@ -577,11 +610,11 @@ extern char *(*dyn_libintl_textdomain)(c
- #define VALID_BOTLINE_AP 0x40 /* w_botine is approximated */
- #define VALID_TOPLINE 0x80    /* w_topline is valid (for cursor position) */
- /*
-  * Terminal highlighting attribute bits.
-- * Attibutes above HL_ALL are used for syntax highlighting.
-+ * Attributes above HL_ALL are used for syntax highlighting.
-  */
- #define HL_NORMAL             0x00
- #define HL_INVERSE            0x01
- #define HL_BOLD                       0x02
- #define HL_ITALIC             0x04
-@@ -700,10 +733,14 @@ extern char *(*dyn_libintl_textdomain)(c
- #define EXPAND_COLORS         28
- #define EXPAND_COMPILER               29
- #define EXPAND_USER_DEFINED   30
- #define EXPAND_USER_LIST      31
- #define EXPAND_SHELLCMD               32
-+#define EXPAND_CSCOPE         33
-+#define EXPAND_SIGN           34
-+#define EXPAND_PROFILE                35
-+#define EXPAND_BEHAVE         36
- /* Values for exmode_active (0 is no exmode) */
- #define EXMODE_NORMAL         1
- #define EXMODE_VIM            2
-@@ -1049,10 +1086,11 @@ extern char *(*dyn_libintl_textdomain)(c
- #define WSP_TOP               4       /* window at top-left of shell */
- #define WSP_BOT               8       /* window at bottom-right of shell */
- #define WSP_HELP      16      /* creating the help window */
- #define WSP_BELOW     32      /* put new window below/right */
- #define WSP_ABOVE     64      /* put new window above/left */
-+#define WSP_NEWLOC    128     /* don't copy location list */
+  * This should be maybe completely removed.
+  * Doesn't seem possible, since check_copy_area() relies on
+  * this information.  --danielk
+  */
+-/*ARGSUSED*/
+     static gint
+-visibility_event(GtkWidget *widget, GdkEventVisibility *event, gpointer data)
++visibility_event(GtkWidget *widget UNUSED,
++               GdkEventVisibility *event,
++               gpointer data UNUSED)
+ {
+     gui.visibility = event->state;
+     /*
+      * When we do an gdk_window_copy_area(), and the window is partially
+      * obscured, we want to receive an event to tell us whether it worked
+@@ -636,13 +647,14 @@ visibility_event(GtkWidget *widget, GdkE
+ }
  
  /*
-  * arguments for gui_set_shellsize()
-  */
- #define RESIZE_VERT   1       /* resize vertically */
-@@ -1240,11 +1278,11 @@ typedef enum
-     , HLF_CUL     /* 'cursurline' */
-     , HLF_COUNT           /* MUST be the last one */
- } hlf_T;
- /* The HL_FLAGS must be in the same order as the HLF_ enums!
-- * When chainging this also adjust the default for 'highlight'. */
-+ * When changing this also adjust the default for 'highlight'. */
- #define HL_FLAGS {'8', '@', 'd', 'e', 'h', 'i', 'l', 'm', 'M', \
-                 'n', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', \
-                 'f', 'F', 'A', 'C', 'D', 'T', '>', \
-                 'B', 'P', 'R', 'L', \
-                 '+', '=', 'x', 'X', '*', '#', '_', '!', '.'}
-@@ -1326,15 +1364,15 @@ typedef enum
- #else
- # define MSG_BUF_LEN 80               /* length of buffer for small messages */
- # define MSG_BUF_CLEN  MSG_BUF_LEN        /* cell length */
- #endif
--#if defined(AMIGA) || defined(__linux__) || defined(__QNX__) || defined(__CYGWIN32__) || defined(_AIX)
--# define TBUFSZ 2048          /* buffer size for termcap entry */
--#else
--# define TBUFSZ 1024          /* buffer size for termcap entry */
--#endif
-+/* Size of the buffer used for tgetent().  Unfortunately this is largely
-+ * undocumented, some systems use 1024.  Using a buffer that is too small
-+ * causes a buffer overrun and a crash.  Use the maximum known value to stay
-+ * on the safe side. */
-+#define TBUFSZ 2048           /* buffer size for termcap entry */
- /*
-  * Maximum length of key sequence to be mapped.
-  * Must be able to hold an Amiga resize report.
+  * Redraw the corresponding portions of the screen.
   */
-@@ -1408,11 +1446,11 @@ typedef enum
- #endif
- #ifdef FEAT_MBYTE
- /* We need to call mb_stricmp() even when we aren't dealing with a multi-byte
-  * encoding because mb_stricmp() takes care of all ascii and non-ascii
-- * encodings, including characters with umluats in latin1, etc., while
-+ * encodings, including characters with umlauts in latin1, etc., while
-  * STRICMP() only handles the system locale version, which often does not
-  * handle non-ascii properly. */
- # define MB_STRICMP(d, s)     mb_strnicmp((char_u *)(d), (char_u *)(s), (int)MAXCOL)
- # define MB_STRNICMP(d, s, n) mb_strnicmp((char_u *)(d), (char_u *)(s), (int)(n))
-@@ -1449,12 +1487,12 @@ typedef enum
- # define PERROR(msg)              (void)emsg3((char_u *)"%s: %s", (char_u *)msg, (char_u *)strerror(errno))
- #else
- # define PERROR(msg)              perror(msg)
- #endif
--typedef long      linenr_T;           /* line number type */
--typedef unsigned    colnr_T;          /* column number type */
-+typedef long  linenr_T;               /* line number type */
-+typedef int   colnr_T;                /* column number type */
- typedef unsigned short disptick_T;    /* display tick type */
- #define MAXLNUM (0x7fffffffL)         /* maximum (invalid) line number */
- /*
-@@ -1726,11 +1764,12 @@ typedef int proftime_T;            /* dummy for
- #define VV_MOUSE_WIN  49
- #define VV_MOUSE_LNUM   50
- #define VV_MOUSE_COL  51
- #define VV_OP         52
- #define VV_SEARCHFORWARD 53
--#define VV_LEN                54      /* number of v: vars */
-+#define VV_OLDFILES   54
-+#define VV_LEN                55      /* number of v: vars */
- #ifdef FEAT_CLIPBOARD
- /* VIM_ATOM_NAME is the older Vim-specific selection type for X11.  Still
-  * supported for when a mix of Vim versions is used. VIMENC_ATOM_NAME includes
-@@ -1977,10 +2016,13 @@ typedef int VimClipboard;      /* This is req
- # else
- #  define X_DISPLAY   xterm_dpy
- # endif
- #endif
-+#ifndef FEAT_NETBEANS_INTG
-+# undef NBDEBUG
-+#endif
- #ifdef NBDEBUG /* Netbeans debugging. */
- # include "nbdebug.h"
- #else
- # define nbdebug(a)
- #endif
-@@ -2052,6 +2094,12 @@ typedef int VimClipboard;       /* This is req
- /* last argument for do_source() */
- #define DOSO_NONE     0
- #define DOSO_VIMRC    1       /* loading vimrc file */
- #define DOSO_GVIMRC   2       /* loading gvimrc file */
+-/*ARGSUSED*/
+     static gint
+-expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
++expose_event(GtkWidget *widget UNUSED,
++           GdkEventExpose *event,
++           gpointer data UNUSED)
+ {
+     /* Skip this when the GUI isn't set up yet, will redraw later. */
+     if (gui.starting)
+       return FALSE;
  
-+/* flags for read_viminfo() and children */
-+#define VIF_WANT_INFO         1       /* load non-mark info */
-+#define VIF_WANT_MARKS                2       /* load file marks */
-+#define VIF_FORCEIT           4       /* overwrite info already read */
-+#define VIF_GET_OLDFILES      8       /* load v:oldfiles */
-+
- #endif /* VIM__H */
---- vim72.orig/src/gui_x11.c
-+++ vim72/src/gui_x11.c
-@@ -568,26 +568,24 @@ static char **gui_argv = NULL;
+@@ -666,13 +678,14 @@ expose_event(GtkWidget *widget, GdkEvent
  
+ #ifdef FEAT_CLIENTSERVER
  /*
-  * Call-back routines.
+  * Handle changes to the "Comm" property
   */
--/* ARGSUSED */
-     static void
- gui_x11_timer_cb(timed_out, interval_id)
-     XtPointer     timed_out;
--    XtIntervalId    *interval_id;
-+    XtIntervalId    *interval_id UNUSED;
+-/*ARGSUSED2*/
+     static gint
+-property_event(GtkWidget *widget, GdkEventProperty *event, gpointer data)
++property_event(GtkWidget *widget,
++             GdkEventProperty *event,
++             gpointer data UNUSED)
  {
-     *((int *)timed_out) = TRUE;
+     if (event->type == GDK_PROPERTY_NOTIFY
+           && event->state == (int)GDK_PROPERTY_NEW_VALUE
+           && GDK_WINDOW_XWINDOW(event->window) == commWindow
+           && GET_X_ATOM(event->atom) == commProperty)
+@@ -738,13 +751,12 @@ gui_mch_stop_blink(void)
+     if (blink_state == BLINK_OFF)
+       gui_update_cursor(TRUE, FALSE);
+     blink_state = BLINK_NONE;
  }
  
--/* ARGSUSED */
-     static void
- gui_x11_visibility_cb(w, dud, event, dum)
--    Widget    w;
--    XtPointer dud;
-+    Widget    w UNUSED;
-+    XtPointer dud UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
+-/*ARGSUSED*/
+     static gint
+-blink_cb(gpointer data)
++blink_cb(gpointer data UNUSED)
  {
-     if (event->type != VisibilityNotify)
-       return;
-     gui.visibility = event->xvisibility.state;
-@@ -601,17 +599,16 @@ gui_x11_visibility_cb(w, dud, event, dum
-     /* This is needed for when redrawing is slow. */
-     gui_mch_update();
+     if (blink_state == BLINK_ON)
+     {
+       gui_undraw_cursor();
+       blink_state = BLINK_OFF;
+@@ -779,13 +791,14 @@ gui_mch_start_blink(void)
+       blink_state = BLINK_ON;
+       gui_update_cursor(TRUE, FALSE);
+     }
  }
  
--/* ARGSUSED */
-     static void
- gui_x11_expose_cb(w, dud, event, dum)
--    Widget    w;
--    XtPointer dud;
-+    Widget    w UNUSED;
-+    XtPointer dud UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
+-/*ARGSUSED*/
+     static gint
+-enter_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
++enter_notify_event(GtkWidget *widget UNUSED,
++                 GdkEventCrossing *event UNUSED,
++                 gpointer data UNUSED)
  {
-     XExposeEvent      *gevent;
-     int                       new_x;
-     if (event->type != Expose)
-@@ -678,17 +675,16 @@ shellRectangle(Widget shell, XRectangle
-     r->y = absy;
-     XtVaGetValues(shell, XmNheight, &r->height, XmNwidth, &r->width, NULL);
- }
- #endif
+     if (blink_state == BLINK_NONE)
+       gui_mch_start_blink();
  
--/* ARGSUSED */
-     static void
- gui_x11_resize_window_cb(w, dud, event, dum)
--    Widget    w;
--    XtPointer dud;
-+    Widget    w UNUSED;
-+    XtPointer dud UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
- {
-     static int lastWidth, lastHeight;
+     /* make sure keyboard input goes there */
+@@ -793,23 +806,25 @@ enter_notify_event(GtkWidget *widget, Gd
+       gtk_widget_grab_focus(gui.drawarea);
  
-     if (event->type != ConfigureNotify)
-       return;
-@@ -725,56 +721,52 @@ gui_x11_resize_window_cb(w, dud, event,
- #ifdef FEAT_XIM
-     xim_set_preedit();
- #endif
+     return FALSE;
  }
  
--/* ARGSUSED */
-     static void
- gui_x11_focus_change_cb(w, data, event, dum)
--    Widget    w;
--    XtPointer data;
-+    Widget    w UNUSED;
-+    XtPointer data UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
+-/*ARGSUSED*/
+     static gint
+-leave_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
++leave_notify_event(GtkWidget *widget UNUSED,
++                 GdkEventCrossing *event UNUSED,
++                 gpointer data UNUSED)
  {
-     gui_focus_change(event->type == FocusIn);
+     if (blink_state != BLINK_NONE)
+       gui_mch_stop_blink();
+     return FALSE;
  }
  
--/* ARGSUSED */
-     static void
- gui_x11_enter_cb(w, data, event, dum)
--    Widget    w;
--    XtPointer data;
--    XEvent    *event;
--    Boolean   *dum;
-+    Widget    w UNUSED;
-+    XtPointer data UNUSED;
-+    XEvent    *event UNUSED;
-+    Boolean   *dum UNUSED;
+-/*ARGSUSED*/
+     static gint
+-focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
++focus_in_event(GtkWidget *widget,
++             GdkEventFocus *event UNUSED,
++             gpointer data UNUSED)
  {
      gui_focus_change(TRUE);
+     if (blink_state == BLINK_NONE)
+       gui_mch_start_blink();
+@@ -824,13 +839,14 @@ focus_in_event(GtkWidget *widget, GdkEve
+       gtk_main_quit();
+     return TRUE;
  }
  
--/* ARGSUSED */
-     static void
- gui_x11_leave_cb(w, data, event, dum)
--    Widget    w;
--    XtPointer data;
--    XEvent    *event;
--    Boolean   *dum;
-+    Widget    w UNUSED;
-+    XtPointer data UNUSED;
-+    XEvent    *event UNUSED;
-+    Boolean   *dum UNUSED;
+-/*ARGSUSED*/
+     static gint
+-focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
++focus_out_event(GtkWidget *widget UNUSED,
++              GdkEventFocus *event UNUSED,
++              gpointer data UNUSED)
  {
      gui_focus_change(FALSE);
- }
  
- #if defined(X_HAVE_UTF8_STRING) && defined(FEAT_MBYTE)
- # if X_HAVE_UTF8_STRING
- #  define USE_UTF8LOOKUP
- # endif
- #endif
+     if (blink_state != BLINK_NONE)
+       gui_mch_stop_blink();
+@@ -954,13 +970,14 @@ modifiers_gdk2mouse(guint state)
+ }
  
--/* ARGSUSED */
-     void
- gui_x11_key_hit_cb(w, dud, event, dum)
--    Widget    w;
--    XtPointer dud;
-+    Widget    w UNUSED;
-+    XtPointer dud UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
+ /*
+  * Main keyboard handler:
+  */
+-/*ARGSUSED*/
+     static gint
+-key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
++key_press_event(GtkWidget *widget UNUSED,
++              GdkEventKey *event,
++              gpointer data UNUSED)
  {
-     XKeyPressedEvent  *ev_press;
- #ifdef FEAT_XIM
-     char_u            string2[256];
-     char_u            string_shortbuf[256];
-@@ -1076,17 +1068,16 @@ theend:
-     if (string_alloced)
-       XtFree((char *)string);
- #endif
+ #ifdef HAVE_GTK2
+     /* 256 bytes is way over the top, but for safety let's reduce it only
+      * for GTK+ 2 where we know for sure how large the string might get.
+      * (That is, up to 6 bytes + NUL + CSI escapes + safety measure.) */
+@@ -1223,13 +1240,14 @@ key_press_event(GtkWidget *widget, GdkEv
+     return TRUE;
  }
  
--/* ARGSUSED */
-     static void
- gui_x11_mouse_cb(w, dud, event, dum)
--    Widget    w;
--    XtPointer dud;
-+    Widget    w UNUSED;
-+    XtPointer dud UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
+ #if defined(FEAT_XIM) && defined(HAVE_GTK2)
+-/*ARGSUSED0*/
+     static gboolean
+-key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
++key_release_event(GtkWidget *widget UNUSED,
++                GdkEventKey *event,
++                gpointer data UNUSED)
  {
-     static XtIntervalId timer = (XtIntervalId)0;
-     static int        timed_out = TRUE;
-     int               button;
-@@ -1208,15 +1199,15 @@ gui_mch_prepare(argc, argv)
-     gui_argv[gui_argc++] = argv[0];
-     arg = 1;
-     while (arg < *argc)
-     {
-       /* Look for argv[arg] in cmdline_options[] table */
--      for (i = 0; i < XtNumber(cmdline_options); i++)
-+      for (i = 0; i < (int)XtNumber(cmdline_options); i++)
-           if (strcmp(argv[arg], cmdline_options[i].option) == 0)
-               break;
+     /*
+      * GTK+ 2 input methods may do fancy stuff on key release events too.
+      * With the default IM for instance, you can enter any UCS code point
+      * by holding down CTRL-SHIFT and typing hexadecimal digits.
+@@ -1241,15 +1259,14 @@ key_release_event(GtkWidget *widget, Gdk
  
--      if (i < XtNumber(cmdline_options))
-+      if (i < (int)XtNumber(cmdline_options))
-       {
-           /* Remember finding "-rv" or "-reverse" */
-           if (strcmp("-rv", argv[arg]) == 0
-                   || strcmp("-reverse", argv[arg]) == 0)
-               found_reverse_arg = TRUE;
-@@ -1317,16 +1308,15 @@ gui_mch_init_check()
+ /****************************************************************************
+  * Selection handlers:
   */
- static XtInputId _xsmp_xtinputid;
- static void local_xsmp_handle_requests __ARGS((XtPointer c, int *s, XtInputId *i));
  
 -/*ARGSUSED*/
-     static void
- local_xsmp_handle_requests(c, s, i)
--    XtPointer c;
--    int               *s;
--    XtInputId *i;
-+    XtPointer c UNUSED;
-+    int               *s UNUSED;
-+    XtInputId *i UNUSED;
+     static gint
+-selection_clear_event(GtkWidget               *widget,
++selection_clear_event(GtkWidget               *widget UNUSED,
+                     GdkEventSelection *event,
+-                    gpointer          user_data)
++                    gpointer          user_data UNUSED)
  {
-     if (xsmp_handle_requests() == FAIL)
-       XtRemoveInput(_xsmp_xtinputid);
- }
- #endif
-@@ -1436,11 +1426,11 @@ gui_mch_init()
-       mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h);
-       if (mask & WidthValue)
-           Columns = w;
-       if (mask & HeightValue)
-       {
--          if (p_window > h - 1 || !option_was_set((char_u *)"window"))
-+          if (p_window > (long)h - 1 || !option_was_set((char_u *)"window"))
-               p_window = h - 1;
-           Rows = h;
-       }
-       /*
-        * Set the (x,y) position of the main window only if specified in the
-@@ -1585,10 +1575,12 @@ gui_mch_uninit()
+     if (event->selection == clip_plus.gtk_sel_atom)
+       clip_lose_selection(&clip_plus);
+     else
+       clip_lose_selection(&clip_star);
+@@ -1263,16 +1280,15 @@ selection_clear_event(GtkWidget                *widget
+ #define RS_NONE       0       /* selection_received_cb() not called yet */
+ #define RS_OK 1       /* selection_received_cb() called and OK */
+ #define RS_FAIL       2       /* selection_received_cb() called and failed */
+ static int received_selection = RS_NONE;
+-/*ARGSUSED*/
+     static void
+-selection_received_cb(GtkWidget               *widget,
++selection_received_cb(GtkWidget               *widget UNUSED,
+                     GtkSelectionData  *data,
+-                    guint             time_,
+-                    gpointer          user_data)
++                    guint             time_ UNUSED,
++                    gpointer          user_data UNUSED)
  {
-     gui_x11_destroy_widgets();
-     XtCloseDisplay(gui.dpy);
-     gui.dpy = NULL;
-     vimShell = (Widget)0;
-+    vim_free(gui_argv);
-+    gui_argv = NULL;
- }
+     VimClipboard    *cbd;
+     char_u        *text;
+     char_u        *tmpbuf = NULL;
+ #ifdef HAVE_GTK2
+@@ -1350,10 +1366,28 @@ selection_received_cb(GtkWidget                *widget
+                   text = tmpbuf;
+           }
+           else
+               text = tmpbuf_utf8;
+       }
++      else if (len >= 2 && text[0] == 0xff && text[1] == 0xfe)
++      {
++          vimconv_T conv;
++
++          /* UTF-16, we get this for HTML */
++          conv.vc_type = CONV_NONE;
++          convert_setup_ext(&conv, (char_u *)"utf-16le", FALSE, p_enc, TRUE);
++
++          if (conv.vc_type != CONV_NONE)
++          {
++              text += 2;
++              len -= 2;
++              tmpbuf = string_convert(&conv, text, &len);
++              convert_setup(&conv, NULL, NULL);
++          }
++          if (tmpbuf != NULL)
++              text = tmpbuf;
++      }
+     }
+ #else /* !HAVE_GTK2 */
+ # ifdef FEAT_MBYTE
+     else if (data->type == utf8_string_atom)
+     {
+@@ -1412,17 +1446,16 @@ selection_received_cb(GtkWidget                *widget
  
  /*
-  * Called when the foreground or background color has been changed.
+  * Prepare our selection data for passing it to the external selection
+  * client.
   */
-@@ -1749,20 +1741,21 @@ gui_init_menu_font()
-     }
- #endif
- }
- #endif
 -/*ARGSUSED*/
-     void
- gui_mch_exit(rc)
--    int               rc;
-+    int               rc UNUSED;
+     static void
+-selection_get_cb(GtkWidget        *widget,
++selection_get_cb(GtkWidget        *widget UNUSED,
+                GtkSelectionData   *selection_data,
+                guint              info,
+-               guint              time_,
+-               gpointer           user_data)
++               guint              time_ UNUSED,
++               gpointer           user_data UNUSED)
  {
- #if 0
-     /* Lesstif gives an error message here, and so does Solaris.  The man page
-      * says that this isn't needed when exiting, so just skip it. */
-     XtCloseDisplay(gui.dpy);
+     char_u        *string;
+     char_u        *tmpbuf;
+     long_u        tmplen;
+     int                   length;
+@@ -1438,10 +1471,11 @@ selection_get_cb(GtkWidget         *widget,
+     if (!cbd->owned)
+       return;                 /* Shouldn't ever happen */
+     if (info != (guint)TARGET_STRING
+ #ifdef FEAT_MBYTE
++          && (!clip_html || info != (guint)TARGET_HTML)
+           && info != (guint)TARGET_UTF8_STRING
+           && info != (guint)TARGET_VIMENC
  #endif
-+    vim_free(gui_argv);
-+    gui_argv = NULL;
+           && info != (guint)TARGET_VIM
+           && info != (guint)TARGET_COMPOUND_TEXT
+@@ -1473,10 +1507,44 @@ selection_get_cb(GtkWidget         *widget,
+       string = tmpbuf;
+       type = vim_atom;
+     }
+ #ifdef FEAT_MBYTE
++    else if (info == (guint)TARGET_HTML)
++    {
++      vimconv_T conv;
++
++      /* Since we get utf-16, we probably should set it as well. */
++      conv.vc_type = CONV_NONE;
++      convert_setup_ext(&conv, p_enc, TRUE, (char_u *)"utf-16le", FALSE);
++      if (conv.vc_type != CONV_NONE)
++      {
++          tmpbuf = string_convert(&conv, string, &length);
++          convert_setup(&conv, NULL, NULL);
++          vim_free(string);
++          string = tmpbuf;
++      }
++
++      /* Prepend the BOM: "fffe" */
++      if (string != NULL)
++      {
++          tmpbuf = alloc(length + 2);
++          tmpbuf[0] = 0xff;
++          tmpbuf[1] = 0xfe;
++          mch_memmove(tmpbuf + 2, string, (size_t)length);
++          vim_free(string);
++          string = tmpbuf;
++          length += 2;
++
++          selection_data->type = selection_data->target;
++          selection_data->format = 16;        /* 16 bits per char */
++          gtk_selection_data_set(selection_data, html_atom, 16,
++                                                            string, length);
++          vim_free(string);
++      }
++      return;
++    }
+     else if (info == (guint)TARGET_VIMENC)
+     {
+       int l = STRLEN(p_enc);
+       /* contents: motion_type 'encoding' NUL text */
+@@ -1676,11 +1744,11 @@ process_motion_notify(int x, int y, GdkM
+       dx = x < 0 ? -x : x - gui.drawarea->allocation.width;
+       dy = y < 0 ? -y : y - gui.drawarea->allocation.height;
+       offshoot = dx > dy ? dx : dy;
+-      /* Make a linearly declaying timer delay with a threshold of 5 at a
++      /* Make a linearly decaying timer delay with a threshold of 5 at a
+        * distance of 127 pixels from the main window.
+        *
+        * One could think endlessly about the most ergonomic variant here.
+        * For example it could make sense to calculate the distance from the
+        * drags start instead...
+@@ -1705,13 +1773,12 @@ process_motion_notify(int x, int y, GdkM
  }
  
  /*
-  * Get the position of the top left corner of the window.
+  * Timer used to recognize multiple clicks of the mouse button.
   */
-@@ -1793,21 +1786,20 @@ gui_mch_set_winpos(x, y)
-       XtNx,   x,
-       XtNy,   y,
-       NULL);
+-/*ARGSUSED0*/
+     static gint
+-motion_repeat_timer_cb(gpointer data)
++motion_repeat_timer_cb(gpointer data UNUSED)
+ {
+     int                   x;
+     int                   y;
+     GdkModifierType state;
+@@ -1747,13 +1814,14 @@ motion_repeat_timer_cb(gpointer data)
+     /* Don't happen again.  We will get reinstalled in the synthetic event
+      * if needed -- thus repeating should still work. */
+     return FALSE;
  }
  
--/*ARGSUSED*/
-     void
- gui_mch_set_shellsize(width, height, min_width, min_height,
-                   base_width, base_height, direction)
-     int               width;
-     int               height;
-     int               min_width;
-     int               min_height;
-     int               base_width;
-     int               base_height;
--    int               direction;
-+    int               direction UNUSED;
+-/*ARGSUSED2*/
+     static gint
+-motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
++motion_notify_event(GtkWidget *widget,
++                  GdkEventMotion *event,
++                  gpointer data UNUSED)
  {
- #ifdef FEAT_XIM
-     height += xim_get_status_area_height(),
- #endif
-     XtVaSetValues(vimShell,
-@@ -1841,15 +1833,14 @@ gui_mch_get_screen_dimensions(screen_w,
-  * Initialise vim to use the font "font_name".  If it's NULL, pick a default
-  * font.
-  * If "fontset" is TRUE, load the "font_name" as a fontset.
-  * Return FAIL if the font could not be loaded, OK otherwise.
+     if (event->is_hint)
+     {
+       int             x;
+       int             y;
+@@ -1775,13 +1843,14 @@ motion_notify_event(GtkWidget *widget, G
+ /*
+  * Mouse button handling.  Note please that we are capturing multiple click's
+  * by our own timeout mechanism instead of the one provided by GTK+ itself.
+  * This is due to the way the generic VIM code is recognizing multiple clicks.
   */
--/*ARGSUSED*/
-     int
- gui_mch_init_font(font_name, do_fontset)
-     char_u    *font_name;
--    int               do_fontset;
-+    int               do_fontset UNUSED;
+-/*ARGSUSED2*/
+     static gint
+-button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
++button_press_event(GtkWidget *widget,
++                 GdkEventButton *event,
++                 gpointer data UNUSED)
  {
-     XFontStruct       *font = NULL;
- #ifdef FEAT_XFONTSET
-     XFontSet  fontset = NULL;
-@@ -2023,14 +2014,13 @@ gui_mch_get_font(name, giveErrorIfMissin
- #if defined(FEAT_EVAL) || defined(PROTO)
+     int button;
+     int repeated_click = FALSE;
+     int x, y;
+     int_u vim_modifiers;
+@@ -1853,13 +1922,14 @@ button_press_event(GtkWidget *widget, Gd
+ #ifdef HAVE_GTK2
  /*
-  * Return the name of font "font" in allocated memory.
-  * Don't know how to get the actual name, thus use the provided name.
+  * GTK+ 2 doesn't handle mouse buttons 4, 5, 6 and 7 the same way as GTK+ 1.
+  * Instead, it abstracts scrolling via the new GdkEventScroll.
   */
--/*ARGSUSED*/
-     char_u *
- gui_mch_get_fontname(font, name)
--    GuiFont font;
-+    GuiFont font UNUSED;
-     char_u  *name;
+-/*ARGSUSED2*/
+     static gboolean
+-scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer data)
++scroll_event(GtkWidget *widget,
++           GdkEventScroll *event,
++           gpointer data UNUSED)
  {
-     if (name == NULL)
-       return NULL;
-     return vim_strsave(name);
-@@ -2448,11 +2438,11 @@ find_closest_color(colormap, colorPtr)
-     {
-       gui.color_approx = TRUE;
-       *colorPtr = colortable[closest];
-     }
+     int           button;
+     int_u   vim_modifiers;
  
--    free(colortable);
-+    vim_free(colortable);
-     return OK;
+     if (gtk_socket_id != 0 && !GTK_WIDGET_HAS_FOCUS(widget))
+@@ -1894,13 +1964,14 @@ scroll_event(GtkWidget *widget, GdkEvent
+     return TRUE;
  }
+ #endif /* HAVE_GTK2 */
  
- /*
-  * Set the current text foreground color.
-@@ -2515,11 +2505,11 @@ draw_curl(row, col, cells)
-     int col;
-     int cells;
- {
-     int                       i;
-     int                       offset;
--    const static int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
-+    static const int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
  
-     XSetForeground(gui.dpy, gui.text_gc, prev_sp_color);
-     for (i = FILL_X(col); i < FILL_X(col + cells); ++i)
-     {
-       offset = val[i % 8];
-@@ -2563,12 +2553,14 @@ gui_mch_draw_string(row, col, s, len, fl
-       {
-           c = utf_ptr2char(p);
- # ifdef FEAT_XFONTSET
-           if (current_fontset != NULL)
-           {
--              if (c >= 0x10000 && sizeof(wchar_t) <= 2)
-+#  ifdef SMALL_WCHAR_T
-+              if (c >= 0x10000)
-                   c = 0xbf;           /* show chars > 0xffff as ? */
-+#  endif
-               ((wchar_t *)buf)[wlen] = c;
-           }
-           else
- # endif
-           {
-@@ -3130,15 +3122,15 @@ gui_mch_menu_hidden(menu, hidden)
- gui_mch_draw_menubar()
+-/*ARGSUSED*/
+     static gint
+-button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
++button_release_event(GtkWidget *widget UNUSED,
++                   GdkEventButton *event,
++                   gpointer data UNUSED)
  {
-     /* Nothing to do in X */
+     int x, y;
+     int_u vim_modifiers;
+     /* Remove any motion "machine gun" timers used for automatic further
+@@ -2098,20 +2169,19 @@ drag_handle_text(GdkDragContext            *con
  }
  
--/* ARGSUSED */
-     void
- gui_x11_menu_cb(w, client_data, call_data)
--    Widget    w;
--    XtPointer client_data, call_data;
-+    Widget    w UNUSED;
-+    XtPointer client_data;
-+    XtPointer call_data UNUSED;
+ /*
+  * DND receiver.
+  */
+-/*ARGSUSED2*/
+     static void
+ drag_data_received_cb(GtkWidget               *widget,
+                     GdkDragContext    *context,
+                     gint              x,
+                     gint              y,
+                     GtkSelectionData  *data,
+                     guint             info,
+                     guint             time_,
+-                    gpointer          user_data)
++                    gpointer          user_data UNUSED)
  {
-     gui_menu_cb((vimmenu_T *)client_data);
- }
+     GdkModifierType state;
  
- #endif /* FEAT_MENU */
-@@ -3147,17 +3139,16 @@ gui_x11_menu_cb(w, client_data, call_dat
+     /* Guard against trash */
+     if (data->data == NULL
+@@ -2141,11 +2211,10 @@ drag_data_received_cb(GtkWidget                *widget
+ /*
+  * GnomeClient interact callback.  Check for unsaved buffers that cannot
+  * be abandoned and pop up a dialog asking the user for confirmation if
+  * necessary.
+  */
+-/*ARGSUSED0*/
+     static void
+ sm_client_check_changed_any(GnomeClient           *client,
+                           gint            key,
+                           GnomeDialogType type,
+                           gpointer        data)
+@@ -2249,11 +2318,10 @@ write_session_file(char_u *filename)
+ /*
+  * "save_yourself" signal handler.  Initiate an interaction to ask the user
+  * for confirmation if necessary.  Save the current editing session and tell
+  * the session manager how to restart Vim.
+  */
+-/*ARGSUSED1*/
+     static gboolean
+ sm_client_save_yourself(GnomeClient       *client,
+                       gint                phase,
+                       GnomeSaveStyle      save_style,
+                       gboolean            shutdown,
+@@ -2337,11 +2405,10 @@ sm_client_save_yourself(GnomeClient
+ /*
+  * Called when the session manager wants us to die.  There isn't much to save
+  * here since "save_yourself" has been emitted before (unless serious trouble
+  * is happening).
+  */
+-/*ARGSUSED0*/
+     static void
+ sm_client_die(GnomeClient *client, gpointer data)
+ {
+     /* Don't write messages to the GUI anymore */
+     full_screen = FALSE;
+@@ -2377,14 +2444,13 @@ setup_save_yourself(void)
  
+ # ifdef USE_XSMP
  /*
-  * Function called when window closed.        Works like ":qa".
-  * Should put up a requester!
+  * GTK tells us that XSMP needs attention
   */
 -/*ARGSUSED*/
-     static void
- gui_x11_wm_protocol_handler(w, client_data, event, dum)
--    Widget    w;
--    XtPointer client_data;
-+    Widget    w UNUSED;
-+    XtPointer client_data UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
+     static gboolean
+ local_xsmp_handle_requests(source, condition, data)
+-    GIOChannel                *source;
++    GIOChannel                *source UNUSED;
+     GIOCondition      condition;
+     gpointer          data;
  {
-     /*
-      * Only deal with Client messages.
-      */
-     if (event->type != ClientMessage)
-@@ -3166,11 +3157,11 @@ gui_x11_wm_protocol_handler(w, client_da
-     /*
-      * The WM_SAVE_YOURSELF event arrives when the window manager wants to
-      * exit.  That can be cancelled though, thus Vim shouldn't exit here.
-      * Just sync our swap files.
-      */
--    if (((XClientMessageEvent *)event)->data.l[0] ==
-+    if ((Atom)((XClientMessageEvent *)event)->data.l[0] ==
-                                                 wm_atoms[SAVE_YOURSELF_IDX])
+     if (condition == G_IO_IN)
      {
-       out_flush();
-       ml_sync_all(FALSE, FALSE);      /* preserve all swap files */
+@@ -2478,20 +2544,22 @@ setup_save_yourself(void)
+  *
+  * The GNOME session support is much cooler anyway.  Unlike this ugly
+  * WM_SAVE_YOURSELF hack it actually stores the session...  And yes,
+  * it should work with KDE as well.
+  */
+-/*ARGSUSED1*/
+     static GdkFilterReturn
+-global_event_filter(GdkXEvent *xev, GdkEvent *event, gpointer data)
++global_event_filter(GdkXEvent *xev,
++                  GdkEvent *event UNUSED,
++                  gpointer data UNUSED)
+ {
+     XEvent *xevent = (XEvent *)xev;
  
-@@ -3179,28 +3170,27 @@ gui_x11_wm_protocol_handler(w, client_da
-        * thus set argv to NULL. */
-       XSetCommand(gui.dpy, XtWindow(vimShell), NULL, 0);
-       return;
-     }
+     if (xevent != NULL
+           && xevent->type == ClientMessage
+           && xevent->xclient.message_type == GET_X_ATOM(wm_protocols_atom)
+-          && xevent->xclient.data.l[0] == GET_X_ATOM(save_yourself_atom))
++          && (long_u)xevent->xclient.data.l[0]
++                                          == GET_X_ATOM(save_yourself_atom))
+     {
+       out_flush();
+       ml_sync_all(FALSE, FALSE); /* preserve all swap files */
+       /*
+        * Set the window's WM_COMMAND property, to let the window manager
+@@ -2510,11 +2578,10 @@ global_event_filter(GdkXEvent *xev, GdkE
+ # else /* !HAVE_GTK2 */
  
--    if (((XClientMessageEvent *)event)->data.l[0] !=
-+    if ((Atom)((XClientMessageEvent *)event)->data.l[0] !=
-                                                 wm_atoms[DELETE_WINDOW_IDX])
-       return;
+ /*
+  * GDK handler for X ClientMessage events.
+  */
+-/*ARGSUSED2*/
+     static GdkFilterReturn
+ gdk_wm_protocols_filter(GdkXEvent *xev, GdkEvent *event, gpointer data)
+ {
+     /* From example in gdkevents.c/gdk_wm_protocols_filter */
+     XEvent *xevent = (XEvent *)xev;
+@@ -2556,13 +2623,12 @@ gdk_wm_protocols_filter(GdkXEvent *xev,
  
-     gui_shell_closed();
- }
  
- #ifdef FEAT_CLIENTSERVER
  /*
-  * Function called when property changed. Check for incoming commands
+  * Setup the window icon & xcmdsrv comm after the main window has been realized.
   */
 -/*ARGSUSED*/
      static void
- gui_x11_send_event_handler(w, client_data, event, dum)
--    Widget    w;
--    XtPointer client_data;
-+    Widget    w UNUSED;
-+    XtPointer client_data UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
+-mainwin_realize(GtkWidget *widget, gpointer data)
++mainwin_realize(GtkWidget *widget UNUSED, gpointer data UNUSED)
  {
-     XPropertyEvent *e = (XPropertyEvent *) event;
+ /* If you get an error message here, you still need to unpack the runtime
+  * archive! */
+ #ifdef magick
+ # undef magick
+@@ -2710,15 +2776,14 @@ create_blank_pointer(void)
  
-     if (e->type == PropertyNotify && e->window == commWindow
-           && e->atom == commProperty &&  e->state == PropertyNewValue)
-@@ -3271,15 +3261,14 @@ gui_mch_start_blink()
-       blink_state = BLINK_ON;
-       gui_update_cursor(TRUE, FALSE);
-     }
+     return cursor;
  }
  
--/* ARGSUSED */
+ #ifdef HAVE_GTK_MULTIHEAD
+-/*ARGSUSED1*/
      static void
- gui_x11_blink_cb(timed_out, interval_id)
--    XtPointer     timed_out;
--    XtIntervalId    *interval_id;
-+    XtPointer     timed_out UNUSED;
-+    XtIntervalId    *interval_id UNUSED;
- {
-     if (blink_state == BLINK_ON)
-     {
-       gui_undraw_cursor();
-       blink_state = BLINK_OFF;
-@@ -3437,62 +3426,51 @@ gui_mch_drawsign(row, col, typenr)
-     void *
- gui_mch_register_sign(signfile)
-     char_u        *signfile;
+ mainwin_screen_changed_cb(GtkWidget  *widget,
+-                        GdkScreen  *previous_screen,
+-                        gpointer   data)
++                        GdkScreen  *previous_screen UNUSED,
++                        gpointer   data UNUSED)
  {
-     XpmAttributes   attrs;
--    XImage        *sign;
-+    XImage        *sign = NULL;
-     int                   status;
+     if (!gtk_widget_has_screen(widget))
+       return;
  
      /*
-      * Setup the color substitution table.
-      */
--    sign = NULL;
-     if (signfile[0] != NUL && signfile[0] != '-')
-     {
--      sign = (XImage *)alloc(sizeof(XImage));
--      if (sign != NULL)
-+      XpmColorSymbol color[5] =
-       {
--          XpmColorSymbol color[5] =
--          {
--              {"none", NULL, 0},
--              {"iconColor1", NULL, 0},
--              {"bottomShadowColor", NULL, 0},
--              {"topShadowColor", NULL, 0},
--              {"selectColor", NULL, 0}
--          };
--          attrs.valuemask = XpmColorSymbols;
--          attrs.numsymbols = 2;
--          attrs.colorsymbols = color;
--          attrs.colorsymbols[0].pixel = gui.back_pixel;
--          attrs.colorsymbols[1].pixel = gui.norm_pixel;
--          status = XpmReadFileToImage(gui.dpy, (char *)signfile,
-+          {"none", NULL, 0},
-+          {"iconColor1", NULL, 0},
-+          {"bottomShadowColor", NULL, 0},
-+          {"topShadowColor", NULL, 0},
-+          {"selectColor", NULL, 0}
-+      };
-+      attrs.valuemask = XpmColorSymbols;
-+      attrs.numsymbols = 2;
-+      attrs.colorsymbols = color;
-+      attrs.colorsymbols[0].pixel = gui.back_pixel;
-+      attrs.colorsymbols[1].pixel = gui.norm_pixel;
-+      status = XpmReadFileToImage(gui.dpy, (char *)signfile,
-                                                        &sign, NULL, &attrs);
--
--          if (status == 0)
--          {
--              /* Sign width is fixed at two columns now.
--              if (sign->width > gui.sign_width)
--                  gui.sign_width = sign->width + 8; */
--          }
--          else
--          {
--              vim_free(sign);
--              sign = NULL;
--              EMSG(_(e_signdata));
--          }
-+      if (status == 0)
-+      {
-+          /* Sign width is fixed at two columns now.
-+          if (sign->width > gui.sign_width)
-+              gui.sign_width = sign->width + 8; */
-       }
-+      else
-+          EMSG(_(e_signdata));
-     }
+@@ -2755,13 +2820,12 @@ mainwin_screen_changed_cb(GtkWidget  *wi
+  * dummy blank cursor.
+  *
+  * Don't try to set any VIM scrollbar sizes anywhere here. I'm relying on the
+  * fact that the main VIM engine doesn't take them into account anywhere.
+  */
+-/*ARGSUSED1*/
+     static void
+-drawarea_realize_cb(GtkWidget *widget, gpointer data)
++drawarea_realize_cb(GtkWidget *widget, gpointer data UNUSED)
+ {
+     GtkWidget *sbar;
  
-     return (void *)sign;
+ #ifdef FEAT_XIM
+     xim_init();
+@@ -2787,13 +2851,12 @@ drawarea_realize_cb(GtkWidget *widget, g
  }
  
-     void
- gui_mch_destroy_sign(sign)
-     void *sign;
+ /*
+  * Properly clean up on shutdown.
+  */
+-/*ARGSUSED0*/
+     static void
+-drawarea_unrealize_cb(GtkWidget *widget, gpointer data)
++drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED)
  {
--    XFree(((XImage *)sign)->data);
--    vim_free(sign);
-+    XDestroyImage((XImage*)sign);
- }
- #endif
- #ifdef FEAT_MOUSESHAPE
---- vim72.orig/src/os_unix.c
-+++ vim72/src/os_unix.c
-@@ -179,11 +179,12 @@ static RETSIGTYPE catch_sigpwr __ARGS(SI
- #endif
- #if defined(SIGALRM) && defined(FEAT_X11) \
-       && defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK)
- # define SET_SIG_ALARM
- static RETSIGTYPE sig_alarm __ARGS(SIGPROTOARG);
--static int sig_alarm_called;
-+/* volatile because it is used in signal handler sig_alarm(). */
-+static volatile int sig_alarm_called;
- #endif
- static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG);
- static void catch_int_signal __ARGS((void));
- static void set_signals __ARGS((void));
-@@ -199,17 +200,20 @@ static int save_patterns __ARGS((int num
- #ifndef SIG_ERR
- # define SIG_ERR      ((RETSIGTYPE (*)())-1)
- #endif
--static int    do_resize = FALSE;
-+/* volatile because it is used in signal handler sig_winch(). */
-+static volatile int do_resize = FALSE;
- #ifndef __EMX__
- static char_u *extra_shell_arg = NULL;
- static int    show_shell_mess = TRUE;
- #endif
--static int    deadly_signal = 0;          /* The signal we caught */
--static int    in_mch_delay = FALSE;       /* sleeping in mch_delay() */
-+/* volatile because it is used in signal handler deathtrap(). */
-+static volatile int deadly_signal = 0;            /* The signal we caught */
-+/* volatile because it is used in signal handler deathtrap(). */
-+static volatile int in_mch_delay = FALSE;    /* sleeping in mch_delay() */
- static int curr_tmode = TMODE_COOK;   /* contains current terminal mode */
+     /* Don't write messages to the GUI anymore */
+     full_screen = FALSE;
  
- #ifdef USE_XSMP
- typedef struct
-@@ -313,16 +317,36 @@ static struct signalinfo
-     {SIGPIPE,     "PIPE",     FALSE},
+ #ifdef FEAT_XIM
+@@ -2825,26 +2888,26 @@ drawarea_unrealize_cb(GtkWidget *widget,
+     gdk_cursor_destroy(gui.blank_pointer);
+     gui.blank_pointer = NULL;
  #endif
-     {-1,          "Unknown!", FALSE}
- };
-+    int
-+mch_chdir(path)
-+    char *path;
-+{
-+    if (p_verbose >= 5)
-+    {
-+      verbose_enter();
-+      smsg((char_u *)"chdir(%s)", path);
-+      verbose_leave();
-+    }
-+# ifdef VMS
-+    return chdir(vms_fixfilename(path));
-+# else
-+    return chdir(path);
-+# endif
-+}
-+
-+/*
-+ * Write s[len] to the screen.
-+ */
-     void
- mch_write(s, len)
-     char_u    *s;
-     int               len;
- {
--    write(1, (char *)s, len);
-+    ignored = (int)write(1, (char *)s, len);
-     if (p_wd)         /* Unix is too fast, slow down a bit more */
-       RealWaitForChar(read_cmd_fd, p_wd, NULL);
  }
  
- /*
-@@ -445,14 +469,13 @@ mch_char_avail()
- /*
-  * Return total amount of memory available in Kbyte.
-  * Doesn't change when memory has been allocated.
-  */
--/* ARGSUSED */
-     long_u
- mch_total_mem(special)
--    int special;
-+    int special UNUSED;
+-/*ARGSUSED0*/
+     static void
+-drawarea_style_set_cb(GtkWidget       *widget,
+-                    GtkStyle  *previous_style,
+-                    gpointer  data)
++drawarea_style_set_cb(GtkWidget       *widget UNUSED,
++                    GtkStyle  *previous_style UNUSED,
++                    gpointer  data UNUSED)
  {
- # ifdef __EMX__
-     return ulimit(3, 0L) >> 10;   /* always 32MB? */
- # else
-     long_u    mem = 0;
-@@ -797,16 +820,15 @@ init_signal_stack()
-     }
+     gui_mch_new_colors();
  }
- #endif
  
  /*
-- * We need correct potatotypes for a signal function, otherwise mean compilers
-+ * We need correct prototypes for a signal function, otherwise mean compilers
-  * will barf when the second argument to signal() is ``wrong''.
-  * Let me try it with a few tricky defines from my own osdef.h        (jw).
+  * Callback routine for the "delete_event" signal on the toplevel window.
+  * Tries to vim gracefully, or refuses to exit with changed buffers.
   */
- #if defined(SIGWINCH)
--/* ARGSUSED */
-     static RETSIGTYPE
- sig_winch SIGDEFARG(sigarg)
+-/*ARGSUSED*/
+     static gint
+-delete_event_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
++delete_event_cb(GtkWidget *widget UNUSED,
++              GdkEventAny *event UNUSED,
++              gpointer data UNUSED)
  {
-     /* this is not required on all systems, but it doesn't hurt anybody */
-     signal(SIGWINCH, (RETSIGTYPE (*)())sig_winch);
-@@ -814,11 +836,10 @@ sig_winch SIGDEFARG(sigarg)
-     SIGRETURN;
+     gui_shell_closed();
+     return TRUE;
  }
- #endif
  
- #if defined(SIGINT)
--/* ARGSUSED */
-     static RETSIGTYPE
- catch_sigint SIGDEFARG(sigarg)
- {
-     /* this is not required on all systems, but it doesn't hurt anybody */
-     signal(SIGINT, (RETSIGTYPE (*)())catch_sigint);
-@@ -826,11 +847,10 @@ catch_sigint SIGDEFARG(sigarg)
-     SIGRETURN;
- }
- #endif
+@@ -2962,11 +3025,11 @@ update_window_manager_hints(int force_wi
+     int min_width;
+     int min_height;
  
- #if defined(SIGPWR)
--/* ARGSUSED */
-     static RETSIGTYPE
- catch_sigpwr SIGDEFARG(sigarg)
- {
-     /* this is not required on all systems, but it doesn't hurt anybody */
-     signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr);
-@@ -846,11 +866,10 @@ catch_sigpwr SIGDEFARG(sigarg)
+     /* At start-up, don't try to set the hints until the initial
+      * values have been used (those that dictate our initial size)
+-     * Let forced (i.e., correct) values thruogh always.
++     * Let forced (i.e., correct) values through always.
+      */
+     if (!(force_width && force_height)  &&  init_window_hints_state > 0)
+     {
+       /* Don't do it! */
+       init_window_hints_state = 2;
+@@ -3140,13 +3203,12 @@ static GtkTooltips *tabline_tooltip;
+ static int clicked_page;          /* page clicked in tab line */
  
- #ifdef SET_SIG_ALARM
  /*
-  * signal function for alarm().
+  * Handle selecting an item in the tab line popup menu.
   */
--/* ARGSUSED */
-     static RETSIGTYPE
- sig_alarm SIGDEFARG(sigarg)
+-/*ARGSUSED*/
+     static void
+-tabline_menu_handler(GtkMenuItem *item, gpointer user_data)
++tabline_menu_handler(GtkMenuItem *item UNUSED, gpointer user_data)
  {
-     /* doesn't do anything, just to break a system call */
-     sig_alarm_called = TRUE;
-@@ -1063,23 +1082,27 @@ deathtrap SIGDEFARG(sigarg)
- #endif
+     /* Add the string cmd into input buffer */
+     send_tabline_menu_event(clicked_page, (int)(long)user_data);
  
-     SIGRETURN;
+     if (gtk_main_level() > 0)
+@@ -3242,17 +3304,16 @@ on_tabline_menu(GtkWidget *widget, GdkEv
  }
  
--#ifdef _REENTRANT
-+#if defined(_REENTRANT) && defined(SIGCONT)
- /*
-  * On Solaris with multi-threading, suspending might not work immediately.
-  * Catch the SIGCONT signal, which will be used as an indication whether the
-  * suspending has been done or not.
-+ *
-+ * On Linux, signal is not always handled immediately either.
-+ * See https://bugs.launchpad.net/bugs/291373
-+ *
-+ * volatile because it is used in in signal handler sigcont_handler().
-  */
--static int sigcont_received;
-+static volatile int sigcont_received;
- static RETSIGTYPE sigcont_handler __ARGS(SIGPROTOARG);
  /*
-  * signal handler for SIGCONT
+  * Handle selecting one of the tabs.
   */
--/* ARGSUSED */
-     static RETSIGTYPE
- sigcont_handler SIGDEFARG(sigarg)
+-/*ARGSUSED*/
+     static void
+ on_select_tab(
+-      GtkNotebook     *notebook,
+-      GtkNotebookPage *page,
++      GtkNotebook     *notebook UNUSED,
++      GtkNotebookPage *page UNUSED,
+       gint            idx,
+-      gpointer        data)
++      gpointer        data UNUSED)
  {
-     sigcont_received = TRUE;
-     SIGRETURN;
-@@ -1113,19 +1136,32 @@ mch_suspend()
-       if (x11_display != NULL)
-           XFlush(x11_display);
-     }
- # endif
--# ifdef _REENTRANT
-+# if defined(_REENTRANT) && defined(SIGCONT)
-     sigcont_received = FALSE;
- # endif
-     kill(0, SIGTSTP);     /* send ourselves a STOP signal */
--# ifdef _REENTRANT
--    /* When we didn't suspend immediately in the kill(), do it now.  Happens
--     * on multi-threaded Solaris. */
--    if (!sigcont_received)
--      pause();
-+# if defined(_REENTRANT) && defined(SIGCONT)
-+    /*
-+     * Wait for the SIGCONT signal to be handled. It generally happens
-+     * immediately, but somehow not all the time. Do not call pause()
-+     * because there would be race condition which would hang Vim if
-+     * signal happened in between the test of sigcont_received and the
-+     * call to pause(). If signal is not yet received, call sleep(0)
-+     * to just yield CPU. Signal should then be received. If somehow
-+     * it's still not received, sleep 1, 2, 3 ms. Don't bother waiting
-+     * further if signal is not received after 1+2+3+4 ms (not expected
-+     * to happen).
-+     */
-+    {
-+      long wait_time;
-+      for (wait_time = 0; !sigcont_received && wait_time <= 3L; wait_time++)
-+          /* Loop is not entered most of the time */
-+          mch_delay(wait_time, FALSE);
-+    }
- # endif
+     if (!ignore_tabline_evt)
+     {
+       if (send_tabline_event(idx + 1) && gtk_main_level() > 0)
+           gtk_main_quit();
+@@ -3458,10 +3519,11 @@ gui_mch_init(void)
+     /* LINTED: avoid warning: conversion to 'unsigned long' */
+     gui.spcolor = g_new0(GdkColor, 1);
  
- # ifdef FEAT_TITLE
-     /*
-      * Set oldtitle to NULL, so the current title is obtained again.
-@@ -1170,11 +1206,11 @@ set_signals()
-      * For "rvim" the STOP signal is ignored.
-      */
- #ifdef SIGTSTP
-     signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
- #endif
--#ifdef _REENTRANT
-+#if defined(_REENTRANT) && defined(SIGCONT)
-     signal(SIGCONT, sigcont_handler);
+     /* Initialise atoms */
+ #ifdef FEAT_MBYTE
++    html_atom = gdk_atom_intern("text/html", FALSE);
+     utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
  #endif
-     /*
-      * We want to ignore breaking of PIPEs.
-@@ -1229,11 +1265,11 @@ catch_int_signal()
-     void
- reset_signals()
- {
-     catch_signals(SIG_DFL, SIG_DFL);
--#ifdef _REENTRANT
-+#if defined(_REENTRANT) && defined(SIGCONT)
-     /* SIGCONT isn't in the list, because its default action is ignore */
-     signal(SIGCONT, SIG_DFL);
+ #ifndef HAVE_GTK2
+     compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE);
+     text_atom = gdk_atom_intern("TEXT", FALSE);
+@@ -3782,11 +3844,11 @@ gui_mch_init(void)
+     wm_protocols_atom = gdk_atom_intern("WM_PROTOCOLS", FALSE);
+     save_yourself_atom = gdk_atom_intern("WM_SAVE_YOURSELF", FALSE);
  #endif
- }
  
-@@ -1324,15 +1360,14 @@ vim_handle_signal(sig)
- }
+     if (gtk_socket_id != 0)
+-      /* make sure keybord input can go to the drawarea */
++      /* make sure keyboard input can go to the drawarea */
+       GTK_WIDGET_SET_FLAGS(gui.drawarea, GTK_CAN_FOCUS);
  
- /*
-  * Check_win checks whether we have an interactive stdout.
-  */
--/* ARGSUSED */
-     int
- mch_check_win(argc, argv)
--    int           argc;
--    char    **argv;
-+    int           argc UNUSED;
-+    char    **argv UNUSED;
- {
- #ifdef OS2
      /*
-      * Store argv[0], may be used for $VIM.  Only use it if it is an absolute
-      * name, mostly it's just "vim" and found in the path, which is unusable.
-@@ -1412,15 +1447,14 @@ x_error_handler(dpy, error_event)
+      * Set clipboard specific atoms
+      */
+@@ -3920,14 +3982,14 @@ gui_mch_new_colors(void)
  }
  
  /*
-  * Another X Error handler, just used to check for errors.
+  * This signal informs us about the need to rearrange our sub-widgets.
   */
--/* ARGSUSED */
-     static int
- x_error_check(dpy, error_event)
--    Display *dpy;
--    XErrorEvent       *error_event;
-+    Display *dpy UNUSED;
-+    XErrorEvent       *error_event UNUSED;
+-/*ARGSUSED*/
+     static gint
+-form_configure_event(GtkWidget *widget, GdkEventConfigure *event,
+-                   gpointer data)
++form_configure_event(GtkWidget *widget UNUSED,
++                   GdkEventConfigure *event,
++                   gpointer data UNUSED)
  {
-     got_x_error = TRUE;
-     return 0;
- }
+     int usable_height = event->height;
  
-@@ -1429,41 +1463,41 @@ x_error_check(dpy, error_event)
+     /* When in a GtkPlug, we can't guarantee valid heights (as a round
+      * no. of char-heights), so we have to manually sanitise them.
+@@ -3946,13 +4008,12 @@ form_configure_event(GtkWidget *widget,
  /*
-  * An X IO Error handler, used to catch error while opening the display.
+  * Function called when window already closed.
+  * We can't do much more here than to trying to preserve what had been done,
+  * since the window is already inevitably going away.
   */
- static int x_IOerror_check __ARGS((Display *dpy));
--/* ARGSUSED */
-     static int
- x_IOerror_check(dpy)
--    Display *dpy;
-+    Display *dpy UNUSED;
+-/*ARGSUSED0*/
+     static void
+-mainwin_destroy_cb(GtkObject *object, gpointer data)
++mainwin_destroy_cb(GtkObject *object UNUSED, gpointer data UNUSED)
  {
-     /* This function should not return, it causes exit().  Longjump instead. */
-     LONGJMP(lc_jump_env, 1);
--    /*NOTREACHED*/
--    return 0;
-+#  ifdef VMS
-+    return 0;  /* avoid the compiler complains about missing return value */
-+#  endif
- }
- # endif
+     /* Don't write messages to the GUI anymore */
+     full_screen = FALSE;
  
- /*
-  * An X IO Error handler, used to catch terminal errors.
+     gui.mainwin  = NULL;
+@@ -3978,13 +4039,12 @@ mainwin_destroy_cb(GtkObject *object, gp
+  * Thus set hints at start-up to ensure correct init. size, then a
+  * second after the final attempt to reset the real minimum hinst (done by
+  * scrollbar init.), actually do the standard hinst and stop the timer.
+  * We'll not let the default hints be set while this timer's active.
   */
- static int x_IOerror_handler __ARGS((Display *dpy));
--/* ARGSUSED */
-     static int
- x_IOerror_handler(dpy)
--    Display *dpy;
-+    Display *dpy UNUSED;
- {
-     xterm_dpy = NULL;
-     x11_window = 0;
-     x11_display = NULL;
-     xterm_Shell = (Widget)0;
-     /* This function should not return, it causes exit().  Longjump instead. */
-     LONGJMP(x_jump_env, 1);
--    /*NOTREACHED*/
--    return 0;
-+# ifdef VMS
-+    return 0;  /* avoid the compiler complains about missing return value */
-+# endif
- }
- #endif
- /*
-  * Return TRUE when connection to the X server is desired.
-@@ -1704,13 +1738,13 @@ get_x11_icon(test_only)
-     /* could not get old icon, use terminal name */
-     if (oldicon == NULL && !test_only)
+-/*ARGSUSED*/
+     static gboolean
+-check_startup_plug_hints(gpointer data)
++check_startup_plug_hints(gpointer data UNUSED)
+ {
+     if (init_window_hints_state == 1)
      {
-       if (STRNCMP(T_NAME, "builtin_", 8) == 0)
--          oldicon = T_NAME + 8;
-+          oldicon = vim_strsave(T_NAME + 8);
-       else
--          oldicon = T_NAME;
-+          oldicon = vim_strsave(T_NAME);
-     }
-     return retval;
- }
+       /* Safe to use normal hints now */
+       init_window_hints_state = 0;
+@@ -4004,10 +4064,12 @@ check_startup_plug_hints(gpointer data)
+     int
+ gui_mch_open(void)
+ {
+     guicolor_T fg_pixel = INVALCOLOR;
+     guicolor_T bg_pixel = INVALCOLOR;
++    guint             pixel_width;
++    guint             pixel_height;
  
-@@ -1895,14 +1929,13 @@ set_x11_icon(icon)
-     XFlush(x11_display);
- }
+ #ifdef HAVE_GTK2
+     /*
+      * Allow setting a window role on the command line, or invent one
+      * if none was specified.  This is mainly useful for GNOME session
+@@ -4044,20 +4106,18 @@ gui_mch_open(void)
+     {
+       int             mask;
+       unsigned int    w, h;
+       int             x = 0;
+       int             y = 0;
+-      guint           pixel_width;
+-      guint           pixel_height;
  
- #else  /* FEAT_X11 */
+       mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h);
  
--/*ARGSUSED*/
-     static int
- get_x11_title(test_only)
--    int           test_only;
-+    int           test_only UNUSED;
- {
-     return FALSE;
- }
+       if (mask & WidthValue)
+           Columns = w;
+       if (mask & HeightValue)
+       {
+-          if (p_window > h - 1 || !option_was_set((char_u *)"window"))
++          if (p_window > (long)h - 1 || !option_was_set((char_u *)"window"))
+               p_window = h - 1;
+           Rows = h;
+       }
  
-     static int
-@@ -1910,13 +1943,13 @@ get_x11_icon(test_only)
-     int           test_only;
- {
-     if (!test_only)
-     {
-       if (STRNCMP(T_NAME, "builtin_", 8) == 0)
--          oldicon = T_NAME + 8;
-+          oldicon = vim_strsave(T_NAME + 8);
-       else
--          oldicon = T_NAME;
-+          oldicon = vim_strsave(T_NAME);
-     }
-     return FALSE;
- }
+       pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width);
+@@ -4068,18 +4128,18 @@ gui_mch_open(void)
+       pixel_height += get_menu_tool_height();
+ #endif
  
- #endif /* FEAT_X11 */
-@@ -2412,10 +2445,16 @@ mch_FullName(fname, buf, len, force)
-       if (p != NULL)
+       if (mask & (XValue | YValue))
        {
- #ifdef HAVE_FCHDIR
-           if (fd >= 0)
-           {
-+              if (p_verbose >= 5)
-+              {
-+                  verbose_enter();
-+                  MSG("fchdir() to previous dir");
-+                  verbose_leave();
-+              }
-               l = fchdir(fd);
-               close(fd);
-           }
-           else
+-          int w, h;
+-          gui_mch_get_screen_dimensions(&w, &h);
+-          h += p_ghr + get_menu_tool_height();
+-          w += get_menu_tool_width();
++          int ww, hh;
++          gui_mch_get_screen_dimensions(&ww, &hh);
++          hh += p_ghr + get_menu_tool_height();
++          ww += get_menu_tool_width();
+           if (mask & XNegative)
+-              x += w - pixel_width;
++              x += ww - pixel_width;
+           if (mask & YNegative)
+-              y += h - pixel_height;
++              y += hh - pixel_height;
+ #ifdef HAVE_GTK2
+           gtk_window_move(GTK_WINDOW(gui.mainwin), x, y);
+ #else
+           gtk_widget_set_uposition(gui.mainwin, x, y);
  #endif
-@@ -2436,11 +2475,11 @@ mch_FullName(fname, buf, len, force)
+@@ -4098,13 +4158,20 @@ gui_mch_open(void)
+           init_window_hints_state = 1;
+           g_timeout_add(1000, check_startup_plug_hints, NULL);
        }
- #endif
      }
  
-     /* Catch file names which are too long. */
--    if (retval == FAIL || STRLEN(buf) + STRLEN(fname) >= len)
-+    if (retval == FAIL || (int)(STRLEN(buf) + STRLEN(fname)) >= len)
-       return FAIL;
+-    gtk_form_set_size(GTK_FORM(gui.formwin),
+-          (guint)(gui_get_base_width() + Columns * gui.char_width),
+-          (guint)(gui_get_base_height() + Rows * gui.char_height));
++    pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width);
++    pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height);
++#ifdef HAVE_GTK2
++    /* For GTK2 changing the size of the form widget doesn't cause window
++     * resizing. */
++    if (gtk_socket_id == 0)
++      gtk_window_resize(GTK_WINDOW(gui.mainwin), pixel_width, pixel_height);
++#else
++    gtk_form_set_size(GTK_FORM(gui.formwin), pixel_width, pixel_height);
++#endif
+     update_window_manager_hints(0, 0);
  
-     /* Do not append ".", "/dir/." is equal to "/dir". */
-     if (STRCMP(fname, ".") != 0)
-       STRCAT(buf, fname);
-@@ -2473,15 +2512,14 @@ mch_isFullName(fname)
- /*
-  * Set the case of the file name, if it already exists.  This will cause the
-  * file name to remain exactly the same.
-  * Only required for file systems where case is ignored and preserved.
-  */
--/*ARGSUSED*/
+     if (foreground_argument != NULL)
+       fg_pixel = gui_get_color((char_u *)foreground_argument);
+     if (fg_pixel == INVALCOLOR)
+@@ -4227,13 +4294,12 @@ gui_mch_open(void)
+     return OK;
+ }
+-/*ARGSUSED0*/
      void
- fname_case(name, len)
-     char_u    *name;
--    int               len;        /* buffer size, only used when name gets longer */
-+    int               len UNUSED;  /* buffer size, only used when name gets longer */
+-gui_mch_exit(int rc)
++gui_mch_exit(int rc UNUSED)
  {
-     struct stat st;
-     char_u    *slash, *tail;
-     DIR               *dirp;
-     struct dirent *dp;
-@@ -2655,11 +2693,11 @@ mch_copy_sec(from_file, to_file)
-  * Return a pointer to the ACL of file "fname" in allocated memory.
-  * Return NULL if the ACL is not available for whatever reason.
+     if (gui.mainwin != NULL)
+       gtk_widget_destroy(gui.mainwin);
+     if (gtk_main_level() > 0)
+@@ -4284,11 +4350,10 @@ static int resize_idle_installed = FALSE
+  * DISABLED: When doing ":set lines+=1" this function would first invoke
+  * gui_resize_shell() with the old size, then the normal callback would
+  * report the new size through form_configure_event().  That caused the window
+  * layout to be messed up.
   */
-     vim_acl_T
- mch_get_acl(fname)
--    char_u    *fname;
-+    char_u    *fname UNUSED;
+-/*ARGSUSED0*/
+     static gboolean
+ force_shell_resize_idle(gpointer data)
  {
-     vim_acl_T ret = NULL;
- #ifdef HAVE_POSIX_ACL
-     ret = (vim_acl_T)acl_get_file((char *)fname, ACL_TYPE_ACCESS);
- #else
-@@ -2715,11 +2753,11 @@ mch_get_acl(fname)
+     if (gui.mainwin != NULL
+           && GTK_WIDGET_REALIZED(gui.mainwin)
+@@ -4309,19 +4374,41 @@ force_shell_resize_idle(gpointer data)
+     return FALSE; /* don't call me again */
+ }
+ #endif
+ #endif /* HAVE_GTK2 */
++#if defined(HAVE_GTK2) || defined(PROTO)
++/*
++ * Return TRUE if the main window is maximized.
++ */
++    int
++gui_mch_maximized()
++{
++    return (gui.mainwin != NULL && gui.mainwin->window != NULL
++          && (gdk_window_get_state(gui.mainwin->window)
++                                             & GDK_WINDOW_STATE_MAXIMIZED));
++}
++
++/*
++ * Unmaximize the main window
++ */
++    void
++gui_mch_unmaximize()
++{
++    if (gui.mainwin != NULL)
++      gtk_window_unmaximize(GTK_WINDOW(gui.mainwin));
++}
++#endif
++
  /*
-  * Set the ACL of file "fname" to "acl" (unless it's NULL).
+  * Set the windows size.
   */
+-/*ARGSUSED2*/
      void
- mch_set_acl(fname, aclent)
--    char_u    *fname;
-+    char_u    *fname UNUSED;
-     vim_acl_T aclent;
+ gui_mch_set_shellsize(int width, int height,
+-                    int min_width,  int min_height,
+-                    int base_width, int base_height,
+-                    int direction)
++                    int min_width UNUSED,  int min_height UNUSED,
++                    int base_width UNUSED, int base_height UNUSED,
++                    int direction UNUSED)
  {
-     if (aclent == NULL)
-       return;
- #ifdef HAVE_POSIX_ACL
-@@ -2758,14 +2796,13 @@ mch_free_acl(aclent)
- #endif
+ #ifndef HAVE_GTK2
+     /* Hack: When the form already is at the desired size, the window might
+      * have been resized with the mouse.  Force a resize by setting a
+      * different size first. */
+@@ -4411,13 +4498,12 @@ gui_mch_get_screen_dimensions(int *scree
+     *screen_w -= get_menu_tool_width();
+     *screen_h -= get_menu_tool_height();
+ }
  
+ #if defined(FEAT_TITLE) || defined(PROTO)
+-/*ARGSUSED*/
+     void
+-gui_mch_settitle(char_u *title, char_u *icon)
++gui_mch_settitle(char_u *title, char_u *icon UNUSED)
+ {
+ # ifdef HAVE_GTK2
+     if (title != NULL && output_conv.vc_type != CONV_NONE)
+       title = string_convert(&output_conv, title, NULL);
+ # endif
+@@ -4491,11 +4577,10 @@ gui_mch_show_toolbar(int showit)
+ #ifndef HAVE_GTK2
  /*
-  * Set hidden flag for "name".
+  * Get a font structure for highlighting.
+  * "cbdata" is a pointer to the global gui structure.
   */
--/* ARGSUSED */
-     void
- mch_hide(name)
--    char_u    *name;
-+    char_u    *name UNUSED;
+-/*ARGSUSED*/
+     static void
+ font_sel_ok(GtkWidget *wgt, gpointer cbdata)
  {
-     /* can't hide a file */
+     gui_T *vw = (gui_T *)cbdata;
+     GtkFontSelectionDialog *fs = (GtkFontSelectionDialog *)vw->fontdlg;
+@@ -4507,22 +4592,20 @@ font_sel_ok(GtkWidget *wgt, gpointer cbd
+     gtk_widget_hide(vw->fontdlg);
+     if (gtk_main_level() > 0)
+       gtk_main_quit();
  }
  
- /*
-@@ -2903,11 +2940,11 @@ mch_early_init()
-      * running out of stack space.
-      * Use of sigaltstack() is preferred, it's more portable.
-      * Ignore any errors.
-      */
- #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
--    signal_stack = malloc(SIGSTKSZ);
-+    signal_stack = (char *)alloc(SIGSTKSZ);
-     init_signal_stack();
- #endif
+-/*ARGSUSED*/
+     static void
+ font_sel_cancel(GtkWidget *wgt, gpointer cbdata)
+ {
+     gui_T *vw = (gui_T *)cbdata;
+     gtk_widget_hide(vw->fontdlg);
+     if (gtk_main_level() > 0)
+       gtk_main_quit();
  }
  
- #if defined(EXITFREE) || defined(PROTO)
-@@ -2934,11 +2971,12 @@ mch_free_mem()
-       x11_display = NULL; /* freed by XtDestroyApplicationContext() */
- #   endif
-     }
- #  endif
- # endif
--# ifdef FEAT_X11
-+    /* Don't close the display for GTK 1, it is done in exit(). */
-+# if defined(FEAT_X11) && (!defined(FEAT_GUI_GTK) || defined(HAVE_GTK2))
-     if (x11_display != NULL
- #  ifdef FEAT_XCLIPBOARD
-           && x11_display != xterm_dpy
- #  endif
-           )
-@@ -3449,14 +3487,13 @@ check_mouse_termcode()
- #endif
+-/*ARGSUSED*/
+     static void
+ font_sel_destroy(GtkWidget *wgt, gpointer cbdata)
+ {
+     gui_T *vw = (gui_T *)cbdata;
  
+@@ -4618,11 +4701,10 @@ gui_mch_adjust_charheight(void)
+ #if defined(FEAT_XFONTSET) || defined(PROTO)
  /*
-  * set screen mode, always fails.
+  * Try to load the requested fontset.
   */
--/* ARGSUSED */
-     int
- mch_screenmode(arg)
--    char_u   *arg;
-+    char_u   *arg UNUSED;
+-/*ARGSUSED2*/
+     GuiFontset
+ gui_mch_get_fontset(char_u *name, int report_error, int fixed_width)
  {
-     EMSG(_(e_screenmode));
-     return FAIL;
- }
-@@ -3924,13 +3961,13 @@ mch_call_shell(cmd, options)
-                * or dup() failed we'd just do the same thing ourselves
-                * anyway -- webb
-                */
-               if (fd >= 0)
-               {
--                  dup(fd); /* To replace stdin  (file descriptor 0) */
--                  dup(fd); /* To replace stdout (file descriptor 1) */
--                  dup(fd); /* To replace stderr (file descriptor 2) */
-+                  ignored = dup(fd); /* To replace stdin  (fd 0) */
-+                  ignored = dup(fd); /* To replace stdout (fd 1) */
-+                  ignored = dup(fd); /* To replace stderr (fd 2) */
+     GdkFont *font;
  
-                   /* Don't need this now that we've duplicated it */
-                   close(fd);
-               }
-           }
-@@ -3944,11 +3981,21 @@ mch_call_shell(cmd, options)
- # ifdef HAVE_SETSID
-               /* Create our own process group, so that the child and all its
-                * children can be kill()ed.  Don't do this when using pipes,
-                * because stdin is not a tty, we would lose /dev/tty. */
-               if (p_stmp)
-+              {
-                   (void)setsid();
-+#  if defined(SIGHUP)
-+                  /* When doing "!xterm&" and 'shell' is bash: the shell
-+                   * will exit and send SIGHUP to all processes in its
-+                   * group, killing the just started process.  Ignore SIGHUP
-+                   * to avoid that. (suggested by Simon Schubert)
-+                   */
-+                  signal(SIGHUP, SIG_IGN);
-+#  endif
-+              }
- # endif
- # ifdef FEAT_GUI
-               if (pty_slave_fd >= 0)
-               {
-                   /* push stream discipline modules */
-@@ -3994,42 +4041,42 @@ mch_call_shell(cmd, options)
-               {
-                   close(pty_master_fd);   /* close master side of pty */
+@@ -4675,10 +4757,13 @@ gui_mch_font_dialog(char_u *oldval)
+     }
  
-                   /* set up stdin/stdout/stderr for the child */
-                   close(0);
--                  dup(pty_slave_fd);
-+                  ignored = dup(pty_slave_fd);
-                   close(1);
--                  dup(pty_slave_fd);
-+                  ignored = dup(pty_slave_fd);
-                   if (gui.in_use)
-                   {
-                       close(2);
--                      dup(pty_slave_fd);
-+                      ignored = dup(pty_slave_fd);
-                   }
+     if (oldval != NULL && *oldval != NUL)
+       gtk_font_selection_dialog_set_font_name(
+               GTK_FONT_SELECTION_DIALOG(gui.fontdlg), (char *)oldval);
++    else
++      gtk_font_selection_dialog_set_font_name(
++              GTK_FONT_SELECTION_DIALOG(gui.fontdlg), DEFAULT_FONT);
  
-                   close(pty_slave_fd);    /* has been dupped, close it now */
-               }
-               else
- # endif
-               {
-                   /* set up stdin for the child */
-                   close(fd_toshell[1]);
-                   close(0);
--                  dup(fd_toshell[0]);
-+                  ignored = dup(fd_toshell[0]);
-                   close(fd_toshell[0]);
+     if (gui.fontname)
+     {
+       g_free(gui.fontname);
+       gui.fontname = NULL;
+@@ -4762,10 +4847,13 @@ gui_mch_font_dialog(char_u *oldval)
+               GTK_FONT_SELECTION_DIALOG(dialog), (const char *)oldname);
  
-                   /* set up stdout for the child */
-                   close(fd_fromshell[0]);
-                   close(1);
--                  dup(fd_fromshell[1]);
-+                  ignored = dup(fd_fromshell[1]);
-                   close(fd_fromshell[1]);
+       if (oldname != oldval)
+           vim_free(oldname);
+     }
++    else
++      gtk_font_selection_dialog_set_font_name(
++              GTK_FONT_SELECTION_DIALOG(dialog), DEFAULT_FONT);
  
- # ifdef FEAT_GUI
-                   if (gui.in_use)
-                   {
-                       /* set up stderr for the child */
-                       close(2);
--                      dup(1);
-+                      ignored = dup(1);
-                   }
- # endif
-               }
-           }
+     response = gtk_dialog_run(GTK_DIALOG(dialog));
  
-@@ -4076,10 +4123,13 @@ mch_call_shell(cmd, options)
-               int         c;
-               int         toshell_fd;
-               int         fromshell_fd;
-               garray_T    ga;
-               int         noread_cnt;
-+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
-+              struct timeval  start_tv;
-+# endif
+     if (response == GTK_RESPONSE_OK)
+     {
+@@ -4861,11 +4949,11 @@ get_styled_font_variants(char_u * font_n
  
- # ifdef FEAT_GUI
-               if (pty_master_fd >= 0)
-               {
-                   close(pty_slave_fd);        /* close slave side of pty */
-@@ -4144,23 +4194,25 @@ mch_call_shell(cmd, options)
-                               len = write(toshell_fd, "", (size_t)1);
-                           else
-                           {
-                               s = vim_strchr(lp + written, NL);
-                               len = write(toshell_fd, (char *)lp + written,
--                                         s == NULL ? l : s - (lp + written));
-+                                         s == NULL ? l
-+                                            : (size_t)(s - (lp + written)));
-                           }
--                          if (len == l)
-+                          if (len == (int)l)
-                           {
-                               /* Finished a line, add a NL, unless this line
-                                * should not have one. */
-                               if (lnum != curbuf->b_op_end.lnum
-                                       || !curbuf->b_p_bin
-                                       || (lnum != write_no_eol_lnum
-                                           && (lnum !=
-                                                   curbuf->b_ml.ml_line_count
-                                                   || curbuf->b_p_eol)))
--                                  write(toshell_fd, "\n", (size_t)1);
-+                                  ignored = write(toshell_fd, "\n",
-+                                                                 (size_t)1);
-                               ++lnum;
-                               if (lnum > curbuf->b_op_end.lnum)
-                               {
-                                   /* finished all the lines, close pipe */
-                                   close(toshell_fd);
-@@ -4184,11 +4236,13 @@ mch_call_shell(cmd, options)
+     styled_font[0] = &gui.bold_font;
+     styled_font[1] = &gui.ital_font;
+     styled_font[2] = &gui.boldital_font;
  
-               if (options & SHELL_READ)
-                   ga_init2(&ga, 1, BUFLEN);
+-    /* First free whatever was freviously there. */
++    /* First free whatever was previously there. */
+     for (i = 0; i < 3; ++i)
+       if (*styled_font[i])
+       {
+           gdk_font_unref(*styled_font[i]);
+           *styled_font[i] = NULL;
+@@ -5010,13 +5098,12 @@ ascii_glyph_table_init(void)
  
-               noread_cnt = 0;
--
-+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
-+              gettimeofday(&start_tv, NULL);
-+# endif
-               for (;;)
-               {
-                   /*
-                    * Check if keys have been typed, write them to the child
-                    * if there are any.
-@@ -4197,29 +4251,38 @@ mch_call_shell(cmd, options)
-                    * Don't do this when filtering and terminal is in cooked
-                    * mode, the shell command will handle the I/O.  Avoids
-                    * that a typed password is echoed for ssh or gpg command.
-                    * Don't get characters when the child has already
-                    * finished (wait_pid == 0).
--                   * Don't get extra characters when we already have one.
-                    * Don't read characters unless we didn't get output for a
--                   * while, avoids that ":r !ls" eats typeahead.
-+                   * while (noread_cnt > 4), avoids that ":r !ls" eats
-+                   * typeahead.
-                    */
-                   len = 0;
-                   if (!(options & SHELL_EXPAND)
-                           && ((options &
-                                        (SHELL_READ|SHELL_WRITE|SHELL_COOKED))
-                                     != (SHELL_READ|SHELL_WRITE|SHELL_COOKED)
--#ifdef FEAT_GUI
-+# ifdef FEAT_GUI
-                                                   || gui.in_use
--#endif
-+# endif
-                                                   )
-                           && wait_pid == 0
--                          && (ta_len > 0
--                              || (noread_cnt > 4
--                                  && (len = ui_inchar(ta_buf,
--                                                     BUFLEN, 10L, 0)) > 0)))
-+                          && (ta_len > 0 || noread_cnt > 4))
-                   {
-+                    if (ta_len == 0)
-+                    {
-+                        /* Get extra characters when we don't have any.
-+                         * Reset the counter and timer. */
-+                        noread_cnt = 0;
-+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
-+                        gettimeofday(&start_tv, NULL);
-+# endif
-+                        len = ui_inchar(ta_buf, BUFLEN, 10L, 0);
-+                    }
-+                    if (ta_len > 0 || len > 0)
-+                    {
-                       /*
-                        * For pipes:
-                        * Check for CTRL-C: send interrupt signal to child.
-                        * Check for CTRL-D: EOF, close pipe to child.
-                        */
-@@ -4269,11 +4332,12 @@ mch_call_shell(cmd, options)
-                           }
-                           else if (ta_buf[i] == '\r')
-                               ta_buf[i] = '\n';
- # ifdef FEAT_MBYTE
-                           if (has_mbyte)
--                              i += (*mb_ptr2len)(ta_buf + i) - 1;
-+                              i += (*mb_ptr2len_len)(ta_buf + i,
-+                                                      ta_len + len - i) - 1;
+ /*
+  * Initialize Vim to use the font or fontset with the given name.
+  * Return FAIL if the font could not be loaded, OK otherwise.
+  */
+-/*ARGSUSED1*/
+     int
+-gui_mch_init_font(char_u *font_name, int fontset)
++gui_mch_init_font(char_u *font_name, int fontset UNUSED)
+ {
+ #ifdef HAVE_GTK2
+     PangoFontDescription    *font_desc;
+     PangoLayout                   *layout;
+     int                           width;
+@@ -5178,12 +5265,28 @@ gui_mch_init_font(char_u *font_name, int
+       gtk_widget_show(alignment);
+     }
  # endif
-                       }
-                       /*
-                        * For pipes: echo the typed characters.
-@@ -4317,13 +4381,13 @@ mch_call_shell(cmd, options)
-                           len = write(toshell_fd, (char *)ta_buf, (size_t)1);
-                           if (len > 0)
-                           {
-                               ta_len -= len;
-                               mch_memmove(ta_buf, ta_buf + len, ta_len);
--                              noread_cnt = 0;
-                           }
-                       }
-+                    }
-                   }
+ #endif /* !HAVE_GTK2 */
  
-                   if (got_int)
-                   {
-                       /* CTRL-C sends a signal to the child, we ignore it
-@@ -4427,10 +4491,29 @@ mch_call_shell(cmd, options)
-                       windgoto(msg_row, msg_col);
-                       cursor_on();
-                       out_flush();
-                       if (got_int)
-                           break;
-+
-+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
-+                      {
-+                          struct timeval  now_tv;
-+                          long            msec;
+-    /* Preserve the logical dimensions of the screen. */
+-    update_window_manager_hints(0, 0);
++#ifdef HAVE_GTK2
++    if (gui_mch_maximized())
++    {
++      int w, h;
 +
-+                          /* Avoid that we keep looping here without
-+                           * checking for a CTRL-C for a long time.  Don't
-+                           * break out too often to avoid losing typeahead. */
-+                          gettimeofday(&now_tv, NULL);
-+                          msec = (now_tv.tv_sec - start_tv.tv_sec) * 1000L
-+                              + (now_tv.tv_usec - start_tv.tv_usec) / 1000L;
-+                          if (msec > 2000)
-+                          {
-+                              noread_cnt = 5;
-+                              break;
-+                          }
-+                      }
-+# endif
-                   }
++      /* Update lines and columns in accordance with the new font, keep the
++       * window maximized. */
++      gtk_window_get_size(GTK_WINDOW(gui.mainwin), &w, &h);
++      w -= get_menu_tool_width();
++      h -= get_menu_tool_height();
++      gui_resize_shell(w, h);
++    }
++    else
++#endif
++    {
++      /* Preserve the logical dimensions of the screen. */
++      update_window_manager_hints(0, 0);
++    }
  
-                   /* If we already detected the child has finished break the
-                    * loop now. */
-                   if (wait_pid == pid)
-@@ -4670,20 +4753,19 @@ WaitForChar(msec)
-  * Time == -1 will block forever.
-  * When a GUI is being used, this will not be used for input -- webb
-  * Returns also, when a request from Sniff is waiting -- toni.
-  * Or when a Linux GPM mouse event is waiting.
-  */
--/* ARGSUSED */
- #if defined(__BEOS__)
-     int
- #else
-     static  int
- #endif
- RealWaitForChar(fd, msec, check_for_gpm)
-     int               fd;
-     long      msec;
--    int               *check_for_gpm;
-+    int               *check_for_gpm UNUSED;
- {
-     int               ret;
- #if defined(FEAT_XCLIPBOARD) || defined(USE_XSMP) || defined(FEAT_MZSCHEME)
-     static int        busy = FALSE;
+     return OK;
+ }
  
-@@ -5074,11 +5156,10 @@ mch_expandpath(gap, path, flags)
- # define SEEK_END 2
- #endif
+ /*
+@@ -5324,13 +5427,12 @@ gui_mch_get_font(char_u *name, int repor
  
- #define SHELL_SPECIAL (char_u *)"\t \"&'$;<>()\\|"
+ #if defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * Return the name of font "font" in allocated memory.
+  */
+-/*ARGSUSED*/
+     char_u *
+-gui_mch_get_fontname(GuiFont font, char_u *name)
++gui_mch_get_fontname(GuiFont font, char_u *name UNUSED)
+ {
+ # ifdef HAVE_GTK2
+     if (font != NOFONT)
+     {
+       char    *pangoname = pango_font_description_to_string(font);
+@@ -5730,11 +5832,11 @@ draw_glyph_string(int row, int col, int
+     static void
+ draw_under(int flags, int row, int col, int cells)
+ {
+     int                       i;
+     int                       offset;
+-    const static int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
++    static const int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
+     int                       y = FILL_Y(row + 1) - 1;
  
--/* ARGSUSED */
-     int
- mch_expand_wildcards(num_pat, pat, num_file, file, flags)
-     int                  num_pat;
-     char_u     **pat;
-     int                 *num_file;
-@@ -5496,11 +5577,11 @@ mch_expand_wildcards(num_pat, pat, num_f
-       return FAIL;
-     }
-     i = fread((char *)buffer, 1, len, fd);
-     fclose(fd);
-     mch_remove(tempname);
--    if (i != len)
-+    if (i != (int)len)
+     /* Undercurl: draw curl at the bottom of the character cell. */
+     if (flags & DRAW_UNDERC)
      {
-       /* unexpected read error */
-       EMSG2(_(e_notread), tempname);
-       vim_free(tempname);
-       vim_free(buffer);
-@@ -5557,11 +5638,11 @@ mch_expand_wildcards(num_pat, pat, num_f
-        */
-       check_spaces = FALSE;
-       if (shell_style == STYLE_PRINT && !did_find_nul)
+@@ -6083,16 +6185,19 @@ gui_mch_draw_string(int row, int col, ch
+       while (p < s + len)
        {
-           /* If there is a NUL, set did_find_nul, else set check_spaces */
--          if (len && (int)STRLEN(buffer) < len - 1)
-+          if (len && (int)STRLEN(buffer) < (int)len - 1)
-               did_find_nul = TRUE;
+ # ifdef FEAT_MBYTE
+           if (enc_utf8)
+           {
+-              c = utf_ptr2char(p);
++              int pcc[MAX_MCO];
++
++              /* TODO: use the composing characters */
++              c = utfc_ptr2char_len(p, pcc, len - (p - s));
+               if (c >= 0x10000)       /* show chars > 0xffff as ? */
+                   c = 0xbf;
+               buf[textlen].byte1 = c >> 8;
+               buf[textlen].byte2 = c;
+-              p += utf_ptr2len(p);
++              p += utfc_ptr2len_len(p, len - (p - s));
+               width += utf_char2cells(c);
+           }
            else
-               check_spaces = TRUE;
-       }
-@@ -5849,11 +5930,13 @@ gpm_open()
-           /* gpm library tries to handling TSTP causes
-            * problems. Anyways, we close connection to Gpm whenever
-            * we are going to suspend or starting an external process
-            * so we shouldn't  have problem with this
-            */
-+# ifdef SIGTSTP
-           signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
-+# endif
-           return 1; /* succeed */
+ # endif
+           {
+@@ -6112,12 +6217,12 @@ gui_mch_draw_string(int row, int col, ch
+       textlen = len;
+ # ifdef FEAT_MBYTE
+       if (has_mbyte)
+       {
+           width = 0;
+-          for (p = s; p < s + len; p += (*mb_ptr2len)(p))
+-              width += (*mb_ptr2cells)(p);
++          for (p = s; p < s + len; p += (*mb_ptr2len_len)(p, len - (p - s)))
++              width += (*mb_ptr2cells_len)(p, len - (p - s));
        }
-       if (gpm_fd == -2)
-           Gpm_Close(); /* We don't want to talk to xterm via gpm */
-       return 0;
-@@ -5999,11 +6082,10 @@ sysmouse_close()
- }
+       else
+ # endif
+           width = len;
+     }
+@@ -6400,11 +6505,10 @@ input_timer_cb(gpointer data)
  
+ #ifdef FEAT_SNIFF
  /*
-  * Gets info from sysmouse and adds special keys to input buf.
+  * Callback function, used when data is available on the SNiFF connection.
   */
 -/* ARGSUSED */
-     static RETSIGTYPE
- sig_sysmouse SIGDEFARG(sigarg)
+     static void
+ sniff_request_cb(
+     gpointer  data,
+     gint      source_fd,
+     GdkInputCondition condition)
+@@ -6663,16 +6767,18 @@ gui_mch_insert_lines(int row, int num_li
+     void
+ clip_mch_request_selection(VimClipboard *cbd)
  {
-     struct mouse_info mouse;
-     struct video_info video;
-@@ -6563,15 +6645,14 @@ static void xsmp_handle_interaction __AR
+     GdkAtom   target;
+     unsigned  i;
+-    int               nbytes;
+-    char_u    *buffer;
+     time_t    start;
+     for (i = 0; i < N_SELECTION_TARGETS; ++i)
+     {
++#ifdef FEAT_MBYTE
++      if (!clip_html && selection_targets[i].info == TARGET_HTML)
++          continue;
++#endif
+       received_selection = RS_NONE;
+       target = gdk_atom_intern(selection_targets[i].target, FALSE);
+       gtk_selection_convert(gui.drawarea,
+                             cbd->gtk_sel_atom, target,
+@@ -6688,34 +6794,18 @@ clip_mch_request_selection(VimClipboard
+       if (received_selection != RS_FAIL)
+           return;
+     }
+     /* Final fallback position - use the X CUT_BUFFER0 store */
+-    nbytes = 0;
+-    buffer = (char_u *)XFetchBuffer(GDK_WINDOW_XDISPLAY(gui.mainwin->window),
+-                                  &nbytes, 0);
+-    if (nbytes > 0)
+-    {
+-      /* Got something */
+-      clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
+-      if (p_verbose > 0)
+-      {
+-          verbose_enter();
+-          smsg((char_u *)_("Used CUT_BUFFER0 instead of empty selection"));
+-          verbose_leave();
+-      }
+-    }
+-    if (buffer != NULL)
+-      XFree(buffer);
++    yank_cut_buffer0(GDK_WINDOW_XDISPLAY(gui.mainwin->window), cbd);
+ }
  
  /*
-  * This is our chance to ask the user if they want to save,
-  * or abort the logout
+  * Disown the selection.
   */
 -/*ARGSUSED*/
-     static void
- xsmp_handle_interaction(smc_conn, client_data)
-     SmcConn   smc_conn;
--    SmPointer client_data;
-+    SmPointer client_data UNUSED;
+     void
+-clip_mch_lose_selection(VimClipboard *cbd)
++clip_mch_lose_selection(VimClipboard *cbd UNUSED)
  {
-     cmdmod_T  save_cmdmod;
-     int               cancel_shutdown = False;
-     save_cmdmod = cmdmod;
-@@ -6600,20 +6681,19 @@ xsmp_handle_interaction(smc_conn, client
- # endif
+     /* WEIRD: when using NULL to actually disown the selection, we lose the
+      * selection the first time we own it. */
+     /*
+     gtk_selection_owner_set(NULL, cbd->gtk_sel_atom, (guint32)GDK_CURRENT_TIME);
+@@ -6739,13 +6829,12 @@ clip_mch_own_selection(VimClipboard *cbd
  
  /*
-  * Callback that starts save-yourself.
+  * Send the current selection to the clipboard.  Do nothing for X because we
+  * will fill in the selection only when requested by another app.
   */
 -/*ARGSUSED*/
-     static void
- xsmp_handle_save_yourself(smc_conn, client_data, save_type,
-                                              shutdown, interact_style, fast)
-     SmcConn   smc_conn;
--    SmPointer client_data;
--    int               save_type;
-+    SmPointer client_data UNUSED;
-+    int               save_type UNUSED;
-     Bool      shutdown;
--    int               interact_style;
--    Bool      fast;
-+    int               interact_style UNUSED;
-+    Bool      fast UNUSED;
+     void
+-clip_mch_set_selection(VimClipboard *cbd)
++clip_mch_set_selection(VimClipboard *cbd UNUSED)
  {
-     /* Handle already being in saveyourself */
-     if (xsmp.save_yourself)
-       SmcSaveYourselfDone(smc_conn, True);
-     xsmp.save_yourself = True;
-@@ -6643,15 +6723,14 @@ xsmp_handle_save_yourself(smc_conn, clie
+ }
+ #if defined(FEAT_MENU) || defined(PROTO)
+@@ -6948,11 +7037,11 @@ mch_set_mouse_shape(int shape)
+           if (id >= GDK_LAST_CURSOR)
+               id = GDK_LEFT_PTR;
+           else
+               id &= ~1;       /* they are always even (why?) */
+       }
+-      else if (shape < sizeof(mshape_ids) / sizeof(int))
++      else if (shape < (int)(sizeof(mshape_ids) / sizeof(int)))
+           id = mshape_ids[shape];
+       else
+           return;
+ # ifdef HAVE_GTK_MULTIHEAD
+       c = gdk_cursor_new_for_display(
+--- vim72.orig/src/gui_mac.c
++++ vim72/src/gui_mac.c
+@@ -4964,11 +4964,11 @@ gui_mch_add_menu_item(vimmenu_T *menu, i
+       int         key = 0;
+       int         modifiers = 0;
+       char_u      *p_actext;
  
+       p_actext = menu->actext;
+-      key = find_special_key(&p_actext, &modifiers, /*keycode=*/0);
++      key = find_special_key(&p_actext, &modifiers, FALSE, FALSE);
+       if (*p_actext != 0)
+           key = 0; /* error: trailing text */
+       /* find_special_key() returns a keycode with as many of the
+        * specified modifiers as appropriate already applied (e.g., for
+        * "<D-C-x>" it returns Ctrl-X as the keycode and MOD_MASK_CMD
+--- vim72.orig/src/gui_motif.c
++++ vim72/src/gui_motif.c
+@@ -115,14 +115,13 @@ static void gui_motif_scroll_colors __AR
  
  /*
-  * Callback to warn us of imminent death.
+  * Call-back routines.
   */
--/*ARGSUSED*/
+-/* ARGSUSED */
      static void
- xsmp_die(smc_conn, client_data)
--    SmcConn   smc_conn;
--    SmPointer client_data;
-+    SmcConn   smc_conn UNUSED;
-+    SmPointer client_data UNUSED;
+ scroll_cb(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data, call_data;
  {
-     xsmp_close();
+     scrollbar_T *sb;
+     long      value;
+     int               dragging;
+@@ -134,28 +133,28 @@ scroll_cb(w, client_data, call_data)
+                                                             (int)XmCR_DRAG);
+     gui_drag_scrollbar(sb, value, dragging);
+ }
  
-     /* quit quickly leaving swapfiles for modified buffers behind */
-     getout_preserve_modified(0);
-@@ -6659,29 +6738,27 @@ xsmp_die(smc_conn, client_data)
+ #ifdef FEAT_GUI_TABLINE
+-/*ARGSUSED*/
+     static void
+ tabline_cb(w, client_data, call_data)
+-    Widget    w;
+-    XtPointer client_data, call_data;
++    Widget    w UNUSED;
++    XtPointer client_data UNUSED;
++    XtPointer call_data;
+ {
+     XmNotebookCallbackStruct *nptr;
  
+     nptr = (XmNotebookCallbackStruct *)call_data;
+     if (nptr->reason != (int)XmCR_NONE)
+       send_tabline_event(nptr->page_number);
+ }
  
- /*
-  * Callback to tell us that save-yourself has completed.
-  */
 -/*ARGSUSED*/
      static void
xsmp_save_complete(smc_conn, client_data)
--    SmcConn   smc_conn;
--    SmPointer client_data;
-+    SmcConn   smc_conn UNUSED;
-+    SmPointer client_data UNUSED;
tabline_button_cb(w, client_data, call_data)
+     Widget    w;
+-    XtPointer client_data, call_data;
++    XtPointer client_data UNUSED;
++    XtPointer call_data UNUSED;
  {
-     xsmp.save_yourself = False;
- }
+     int               cmd, tab_idx;
  
+     XtVaGetValues(w, XmNuserData, &cmd, NULL);
+     XtVaGetValues(tabLine_menu, XmNuserData, &tab_idx, NULL);
+@@ -164,15 +163,14 @@ tabline_button_cb(w, client_data, call_d
+ }
  
  /*
-  * Callback to tell us that an instigated shutdown was cancelled
-  * (maybe even by us)
+  * Tabline single mouse click timeout handler
   */
 -/*ARGSUSED*/
      static void
xsmp_shutdown_cancelled(smc_conn, client_data)
-     SmcConn   smc_conn;
--    SmPointer client_data;
-+    SmPointer client_data UNUSED;
motif_tabline_timer_cb (timed_out, interval_id)
+     XtPointer         timed_out;
+-    XtIntervalId      *interval_id;
++    XtIntervalId      *interval_id UNUSED;
  {
-     if (xsmp.save_yourself)
-       SmcSaveYourselfDone(smc_conn, True);
-     xsmp.save_yourself = False;
-     xsmp.shutdown = False;
-@@ -6689,17 +6766,16 @@ xsmp_shutdown_cancelled(smc_conn, client
+     *((int *)timed_out) = TRUE;
+ }
  
  /*
-  * Callback to tell us that a new ICE connection has been established.
-  */
+@@ -201,17 +199,16 @@ tabline_scroller_clicked(scroller_name,
+       }
+     }
+     return FALSE;
+ }
 -/*ARGSUSED*/
      static void
xsmp_ice_connection(iceConn, clientData, opening, watchData)
-     IceConn   iceConn;
--    IcePointer        clientData;
-+    IcePointer        clientData UNUSED;
-     Bool      opening;
--    IcePointer        *watchData;
-+    IcePointer        *watchData UNUSED;
tabline_menu_cb(w, closure, e, continue_dispatch)
+     Widget    w;
+-    XtPointer closure;
++    XtPointer closure UNUSED;
+     XEvent    *e;
+-    Boolean   *continue_dispatch;
++    Boolean   *continue_dispatch UNUSED;
  {
-     /* Intercept creation of ICE connection fd */
-     if (opening)
+     Widget                    tab_w;
+     XButtonPressedEvent               *event;
+     int                               tab_idx = 0;
+     WidgetList                        children;
+@@ -275,15 +272,14 @@ tabline_menu_cb(w, closure, e, continue_
+     XtManageChildren(children, numChildren);
+     XmMenuPosition(tabLine_menu, (XButtonPressedEvent *)e) ;
+     XtManageChild(tabLine_menu);
+ }
+-/*ARGSUSED*/
+     static void
+ tabline_balloon_cb(beval, state)
+     BalloonEval       *beval;
+-    int               state;
++    int               state UNUSED;
+ {
+     int               nr;
+     tabpage_T *tp;
+     if (beval->target == (Widget)0)
+@@ -640,17 +636,16 @@ gui_x11_destroy_widgets()
+ #ifdef FEAT_MENU
+     menuBar = NULL;
+ #endif
+ }
+-/*ARGSUSED*/
+     void
+ gui_mch_set_text_area_pos(x, y, w, h)
+-    int           x;
+-    int           y;
+-    int           w;
+-    int           h;
++    int           x UNUSED;
++    int           y UNUSED;
++    int           w UNUSED;
++    int           h UNUSED;
+ {
+ #ifdef FEAT_TOOLBAR
+     /* Give keyboard focus to the textArea instead of the toolbar. */
+     reset_focus();
+ #endif
+@@ -1259,11 +1254,11 @@ get_toolbar_pixmap(menu, fname)
+     }
+     if (menu->icon_builtin || gui_find_bitmap(menu->name, buf, "xpm") == FAIL)
      {
-       xsmp_icefd = IceConnectionNumber(iceConn);
-@@ -6812,11 +6888,12 @@ xsmp_init(void)
- xsmp_close()
+       if (menu->iconidx >= 0 && menu->iconidx
+-                 < (sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
++             < (int)(sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
+           xpm = built_in_pixmaps[menu->iconidx];
+       else
+           xpm = tb_blank_xpm;
+     }
+@@ -1714,14 +1709,13 @@ gui_mch_destroy_menu(menu)
+       }
+ #endif
+     }
+ }
+-/* ARGSUSED */
+     void
+ gui_mch_show_popupmenu(menu)
+-    vimmenu_T *menu;
++    vimmenu_T *menu UNUSED;
  {
-     if (xsmp_icefd != -1)
+ #ifdef MOTIF_POPUP
+     XmMenuPosition(menu->submenu_id, gui_x11_get_last_mouse_event());
+     XtManageChild(menu->submenu_id);
+ #endif
+@@ -2044,13 +2038,12 @@ do_mnemonic(Widget w, unsigned int keyco
+ }
+ /*
+  * Callback routine for dialog mnemonic processing.
+  */
+-/*ARGSUSED*/
+     static void
+-mnemonic_event(Widget w, XtPointer call_data, XKeyEvent *event)
++mnemonic_event(Widget w, XtPointer call_data UNUSED, XKeyEvent *event)
+ {
+     do_mnemonic(w, event->keycode);
+ }
+@@ -2285,17 +2278,16 @@ set_predefined_fontlist(parent, name)
+ /*
+  * Put up a file requester.
+  * Returns the selected name in allocated memory, or NULL for Cancel.
+  */
+-/* ARGSUSED */
+     char_u *
+ gui_mch_browse(saving, title, dflt, ext, initdir, filter)
+-    int               saving;         /* select file to write */
++    int               saving UNUSED;  /* select file to write */
+     char_u    *title;         /* title for the window */
+     char_u    *dflt;          /* default name */
+-    char_u    *ext;           /* not used (extension added) */
++    char_u    *ext UNUSED;    /* not used (extension added) */
+     char_u    *initdir;       /* initial directory, NULL for current dir */
+     char_u    *filter;        /* file name filter */
+ {
+     char_u    dirbuf[MAXPATHL];
+     char_u    dfltbuf[MAXPATHL];
+@@ -2411,16 +2403,15 @@ gui_mch_browse(saving, title, dflt, ext,
+  */
+ /*
+  * Process callback from Dialog cancel actions.
+  */
+-/* ARGSUSED */
+     static void
+ DialogCancelCB(w, client_data, call_data)
+-    Widget    w;              /*  widget id           */
+-    XtPointer client_data;    /*  data from application   */
+-    XtPointer call_data;      /*  data from widget class  */
++    Widget    w UNUSED;               /*  widget id           */
++    XtPointer client_data UNUSED;     /*  data from application   */
++    XtPointer call_data UNUSED;       /*  data from widget class  */
+ {
+     if (browse_fname != NULL)
      {
-       SmcCloseConnection(xsmp.smcconn, 0, NULL);
--      vim_free(xsmp.clientid);
-+      if (xsmp.clientid != NULL)
-+          free(xsmp.clientid);
-       xsmp.clientid = NULL;
-       xsmp_icefd = -1;
+       XtFree(browse_fname);
+       browse_fname = NULL;
+@@ -2429,16 +2420,15 @@ DialogCancelCB(w, client_data, call_data
+ }
+ /*
+  * Process callback from Dialog actions.
+  */
+-/* ARGSUSED */
+     static void
+ DialogAcceptCB(w, client_data, call_data)
+-    Widget    w;              /*  widget id           */
+-    XtPointer client_data;    /*  data from application   */
+-    XtPointer call_data;      /*  data from widget class  */
++    Widget    w UNUSED;               /*  widget id           */
++    XtPointer client_data UNUSED;     /*  data from application   */
++    XtPointer call_data;              /*  data from widget class  */
+ {
+     XmFileSelectionBoxCallbackStruct *fcb;
+     if (browse_fname != NULL)
+     {
+@@ -2465,17 +2455,16 @@ static void butproc __ARGS((Widget w, Xt
+ /*
+  * Callback function for the textfield.  When CR is hit this works like
+  * hitting the "OK" button, ESC like "Cancel".
+  */
+-/* ARGSUSED */
+     static void
+ keyhit_callback(w, client_data, event, cont)
+     Widget            w;
+-    XtPointer         client_data;
++    XtPointer         client_data UNUSED;
+     XEvent            *event;
+-    Boolean           *cont;
++    Boolean           *cont UNUSED;
+ {
+     char      buf[2];
+     KeySym    key_sym;
+     if (XLookupString(&(event->xkey), buf, 2, &key_sym, NULL) == 1)
+@@ -2488,16 +2477,15 @@ keyhit_callback(w, client_data, event, c
+     if ((key_sym == XK_Left || key_sym == XK_Right)
+           && !(event->xkey.state & ShiftMask))
+       XmTextFieldClearSelection(w, XtLastTimestampProcessed(gui.dpy));
+ }
+-/* ARGSUSED */
+     static void
+ butproc(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+-    XtPointer call_data;
++    XtPointer call_data UNUSED;
+ {
+     dialogStatus = (int)(long)client_data + 1;
+ }
+ #ifdef HAVE_XPM
+@@ -2565,14 +2553,13 @@ create_pixmap_label(parent, name, data,
+     return label;
+ }
+ #endif
+-/* ARGSUSED */
+     int
+ gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield)
+-    int               type;
++    int               type UNUSED;
+     char_u    *title;
+     char_u    *message;
+     char_u    *button_names;
+     int               dfltbutton;
+     char_u    *textfield;             /* buffer of size IOSIZE */
+@@ -3195,11 +3182,11 @@ gui_mch_compute_toolbar_height()
+               XmNshadowThickness, &tst,
+               XmNmarginHeight, &tmh,
+               XmNchildren, &children,
+               XmNnumChildren, &numChildren, NULL);
+       borders += tst + tmh;
+-      for (i = 0; i < numChildren; i++)
++      for (i = 0; i < (int)numChildren; i++)
+       {
+           whgt = 0;
+           XtVaGetValues(children[i], XmNheight, &whgt, NULL);
+           if (height < whgt)
+               height = whgt;
+@@ -3235,34 +3222,32 @@ motif_get_toolbar_colors(bgp, fgp, bsp,
+ /*
+  * The next toolbar enter/leave callbacks should really do balloon help.  But
+  * I have to use footer help for backwards compatability.  Hopefully both will
+  * get implemented and the user will have a choice.
+  */
+-/*ARGSUSED*/
+     static void
+ toolbarbutton_enter_cb(w, client_data, event, cont)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+-    XEvent    *event;
+-    Boolean   *cont;
++    XEvent    *event UNUSED;
++    Boolean   *cont UNUSED;
+ {
+     vimmenu_T *menu = (vimmenu_T *) client_data;
+     if (menu->strings[MENU_INDEX_TIP] != NULL)
+     {
+       if (vim_strchr(p_go, GO_FOOTER) != NULL)
+           gui_mch_set_footer(menu->strings[MENU_INDEX_TIP]);
      }
  }
- #endif /* USE_XSMP */
+-/*ARGSUSED*/
+     static void
+ toolbarbutton_leave_cb(w, client_data, event, cont)
+-    Widget    w;
+-    XtPointer client_data;
+-    XEvent    *event;
+-    Boolean   *cont;
++    Widget    w UNUSED;
++    XtPointer client_data UNUSED;
++    XEvent    *event UNUSED;
++    Boolean   *cont UNUSED;
+ {
+     gui_mch_set_footer((char_u *) "");
+ }
+ # endif
+ #endif
+@@ -3490,14 +3475,13 @@ gui_motif_scroll_colors(id)
+ }
+ /*
+  * Set the fontlist for Widget "id" to use gui.menu_fontset or gui.menu_font.
+  */
+-/*ARGSUSED*/
+     void
+ gui_motif_menu_fontlist(id)
+-    Widget  id;
++    Widget  id UNUSED;
+ {
+ #ifdef FEAT_MENU
+ #ifdef FONTSET_ALWAYS
+     if (gui.menu_fontset != NOFONTSET)
+     {
+@@ -3564,63 +3548,59 @@ typedef struct _SharedFindReplace
+     Widget undo;      /* 'Undo' action button */
+     Widget cancel;
+ } SharedFindReplace;
+-static SharedFindReplace find_widgets = { NULL };
+-static SharedFindReplace repl_widgets = { NULL };
++static SharedFindReplace find_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
++static SharedFindReplace repl_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+ static void find_replace_destroy_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
+ static void find_replace_dismiss_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
+ static void entry_activate_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
+ static void find_replace_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
+ static void find_replace_keypress __ARGS((Widget w, SharedFindReplace * frdp, XKeyEvent * event));
+ static void find_replace_dialog_create __ARGS((char_u *entry_text, int do_replace));
+-/*ARGSUSED*/
+     static void
+ find_replace_destroy_callback(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+-    XtPointer call_data;
++    XtPointer call_data UNUSED;
+ {
+     SharedFindReplace *cd = (SharedFindReplace *)client_data;
+     if (cd != NULL)
+        /* suppress_dialog_mnemonics(cd->dialog); */
+       cd->dialog = (Widget)0;
+ }
+-/*ARGSUSED*/
+     static void
+ find_replace_dismiss_callback(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+-    XtPointer call_data;
++    XtPointer call_data UNUSED;
+ {
+     SharedFindReplace *cd = (SharedFindReplace *)client_data;
+     if (cd != NULL)
+       XtUnmanageChild(cd->dialog);
+ }
+-/*ARGSUSED*/
+     static void
+ entry_activate_callback(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+-    XtPointer call_data;
++    XtPointer call_data UNUSED;
+ {
+     XmProcessTraversal((Widget)client_data, XmTRAVERSE_CURRENT);
+ }
+-/*ARGSUSED*/
+     static void
+ find_replace_callback(w, client_data, call_data)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer client_data;
+-    XtPointer call_data;
++    XtPointer call_data UNUSED;
+ {
+     long_u    flags = (long_u)client_data;
+     char      *find_text, *repl_text;
+     Boolean   direction_down = TRUE;
+     Boolean   wword;
+@@ -3666,14 +3646,13 @@ find_replace_callback(w, client_data, ca
+       XtFree(find_text);
+     if (repl_text != NULL)
+       XtFree(repl_text);
+ }
+-/*ARGSUSED*/
+     static void
+ find_replace_keypress(w, frdp, event)
+-    Widget            w;
++    Widget            w UNUSED;
+     SharedFindReplace *frdp;
+     XKeyEvent         *event;
+ {
+     KeySym keysym;
+--- vim72.orig/src/gui_photon.c
++++ vim72/src/gui_photon.c
+@@ -836,11 +836,16 @@ gui_ph_handle_window_open(
+ /* TODO: Set a clipping rect? */
+     static void
+ gui_ph_draw_start( void )
+ {
++    PhGC_t *gc;
++
++    gc = PgGetGC();
+     PgSetRegion( PtWidgetRid( PtFindDisjoint( gui.vimTextArea ) ) );
++    PgClearClippingsCx( gc );
++    PgClearTranslationCx( gc );
+     PtWidgetOffset( gui.vimTextArea, &gui_ph_raw_offset );
+     PhTranslatePoint( &gui_ph_raw_offset, PtWidgetPos( gui.vimTextArea, NULL ) );
+     PgSetTranslation( &gui_ph_raw_offset, Pg_RELATIVE );
+@@ -2968,11 +2973,11 @@ gui_mch_init_font(char_u *vim_font_name,
+     PhRect_t extent;
+     if( vim_font_name == NULL )
+     {
+       /* Default font */
+-      vim_font_name = "PC Term";
++      vim_font_name = "PC Terminal";
+     }
+     if( STRCMP( vim_font_name, "*" ) == 0 )
+     {
+       font_tag = PtFontSelection( gui.vimWindow, NULL, NULL,
 --- vim72.orig/src/gui_riscos.c
 +++ vim72/src/gui_riscos.c
 @@ -693,11 +693,11 @@ gui_mch_set_winpos(int x, int y)
@@ -25614,38 +23373,244 @@ Individual patches for Vim 7.2:
  
  /* Load and convert the named font.
   * If name is NULL or a null string then convert the system font.
---- vim72.orig/src/gui_w48.c
-+++ vim72/src/gui_w48.c
-@@ -151,10 +151,13 @@ static int               s_busy_processing = FALSE;
- static int            destroying = FALSE;     /* call DestroyWindow() ourselves */
+--- vim72.orig/src/gui_w32.c
++++ vim72/src/gui_w32.c
+@@ -210,34 +210,34 @@ typedef struct _DllVersionInfo
+     DWORD dwMinorVersion;
+     DWORD dwBuildNumber;
+     DWORD dwPlatformID;
+ } DLLVERSIONINFO;
  
- #ifdef MSWIN_FIND_REPLACE
- static UINT           s_findrep_msg = 0;      /* set in gui_w[16/32].c */
- static FINDREPLACE    s_findrep_struct;
-+# if defined(FEAT_MBYTE) && defined(WIN3264)
-+static FINDREPLACEW   s_findrep_struct_w;
-+# endif
- static HWND           s_findrep_hwnd = NULL;
- static int            s_findrep_is_find;      /* TRUE for find dialog, FALSE
-                                                  for find/replace dialog */
++#include <poppack.h>
++
+ typedef struct tagTOOLINFOA_NEW
+ {
+       UINT cbSize;
+       UINT uFlags;
+       HWND hwnd;
+-      UINT uId;
++      UINT_PTR uId;
+       RECT rect;
+       HINSTANCE hinst;
+       LPSTR lpszText;
+       LPARAM lParam;
+ } TOOLINFO_NEW;
+ typedef struct tagNMTTDISPINFO_NEW
+ {
+     NMHDR      hdr;
+-    LPTSTR     lpszText;
++    LPSTR      lpszText;
+     char       szText[80];
+     HINSTANCE  hinst;
+     UINT       uFlags;
+     LPARAM     lParam;
+ } NMTTDISPINFO_NEW;
+-#include <poppack.h>
+-
+ typedef HRESULT (WINAPI* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
+ #ifndef TTM_SETMAXTIPWIDTH
+ # define TTM_SETMAXTIPWIDTH   (WM_USER+24)
  #endif
  
-@@ -545,11 +548,11 @@ char_to_string(int ch, char_u *string, i
-           }
-       }
-       else
-       {
-           len = 1;
--          ws = ucs2_to_enc(wstring, &len);
-+          ws = utf16_to_enc(wstring, &len);
-           if (ws == NULL)
-               len = 0;
-           else
-           {
-               if (len > slen) /* just in case */
-@@ -882,19 +885,68 @@ _OnMenu(
-       gui_menu_cb(pMenu);
- }
+@@ -990,11 +990,11 @@ _WndProc(
+                           /* Set the maximum width, this also enables using
+                            * \n for line break. */
+                           SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH,
+                                                                     0, 500);
+-                          tt_text = enc_to_ucs2(str, NULL);
++                          tt_text = enc_to_utf16(str, NULL);
+                           lpdi->lpszText = tt_text;
+                           /* can't show tooltip if failed */
+                       }
+                       else
+ # endif
+@@ -1327,10 +1327,11 @@ gui_mch_init(void)
+     const char szVimWndClass[] = VIM_CLASS;
+     const char szTextAreaClass[] = "VimTextArea";
+     WNDCLASS wndclass;
+ #ifdef FEAT_MBYTE
+     const WCHAR szVimWndClassW[] = VIM_CLASSW;
++    const WCHAR szTextAreaClassW[] = L"VimTextArea";
+     WNDCLASSW wndclassw;
+ #endif
+ #ifdef GLOBAL_IME
+     ATOM      atom;
+ #endif
+@@ -1477,10 +1478,32 @@ gui_mch_init(void)
+ #if defined(FEAT_MBYTE_IME) && defined(DYNAMIC_IME)
+     dyn_imm_load();
+ #endif
+     /* Create the text area window */
++#ifdef FEAT_MBYTE
++    if (wide_WindowProc)
++    {
++      if (GetClassInfoW(s_hinst, szTextAreaClassW, &wndclassw) == 0)
++      {
++          wndclassw.style = CS_OWNDC;
++          wndclassw.lpfnWndProc = _TextAreaWndProc;
++          wndclassw.cbClsExtra = 0;
++          wndclassw.cbWndExtra = 0;
++          wndclassw.hInstance = s_hinst;
++          wndclassw.hIcon = NULL;
++          wndclassw.hCursor = LoadCursor(NULL, IDC_ARROW);
++          wndclassw.hbrBackground = NULL;
++          wndclassw.lpszMenuName = NULL;
++          wndclassw.lpszClassName = szTextAreaClassW;
++
++          if (RegisterClassW(&wndclassw) == 0)
++              return FAIL;
++      }
++    }
++    else
++#endif
+     if (GetClassInfo(s_hinst, szTextAreaClass, &wndclass) == 0)
+     {
+       wndclass.style = CS_OWNDC;
+       wndclass.lpfnWndProc = _TextAreaWndProc;
+       wndclass.cbClsExtra = 0;
+@@ -1580,10 +1603,21 @@ gui_mch_init(void)
+     s_findrep_struct.lpstrFindWhat[0] = NUL;
+     s_findrep_struct.lpstrReplaceWith = alloc(MSWIN_FR_BUFSIZE);
+     s_findrep_struct.lpstrReplaceWith[0] = NUL;
+     s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE;
+     s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE;
++# if defined(FEAT_MBYTE) && defined(WIN3264)
++    s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w);
++    s_findrep_struct_w.lpstrFindWhat =
++                            (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
++    s_findrep_struct_w.lpstrFindWhat[0] = NUL;
++    s_findrep_struct_w.lpstrReplaceWith =
++                            (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
++    s_findrep_struct_w.lpstrReplaceWith[0] = NUL;
++    s_findrep_struct_w.wFindWhatLen = MSWIN_FR_BUFSIZE;
++    s_findrep_struct_w.wReplaceWithLen = MSWIN_FR_BUFSIZE;
++# endif
+ #endif
+ theend:
+     /* Display any pending error messages */
+     display_errors();
+@@ -1933,11 +1967,11 @@ GetResultStr(HWND hwnd, int GCS, int *le
+     /* Reads in the composition string. */
+     buf = GetCompositionString_inUCS2(hIMC, GCS, lenp);
+     if (buf == NULL)
+       return NULL;
+-    convbuf = ucs2_to_enc(buf, lenp);
++    convbuf = utf16_to_enc(buf, lenp);
+     pImmReleaseContext(hwnd, hIMC);
+     vim_free(buf);
+     return convbuf;
+ }
+ #endif
+@@ -2564,11 +2598,11 @@ gui_mch_add_menu(
+           if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+           {
+               /* 'encoding' differs from active codepage: convert menu name
+                * and use wide function */
+-              wn = enc_to_ucs2(menu->name, NULL);
++              wn = enc_to_utf16(menu->name, NULL);
+               if (wn != NULL)
+               {
+                   MENUITEMINFOW       infow;
+                   infow.cbSize = sizeof(infow);
+@@ -2726,11 +2760,11 @@ gui_mch_add_menu_item(
+       if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+       {
+           /* 'encoding' differs from active codepage: convert menu item name
+            * and use wide function */
+-          wn = enc_to_ucs2(menu->name, NULL);
++          wn = enc_to_utf16(menu->name, NULL);
+           if (wn != NULL)
+           {
+               n = InsertMenuW(parent->submenu_id, (UINT)idx,
+                       (menu_is_separator(menu->name)
+                                ? MF_SEPARATOR : MF_STRING) | MF_BYPOSITION,
+@@ -2936,12 +2970,31 @@ dialog_callback(
+       if (button >= DLG_NONBUTTON_CONTROL)
+           return TRUE;
+       /* If the edit box exists, copy the string. */
+       if (s_textfield != NULL)
+-          GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2,
++      {
++# if defined(FEAT_MBYTE) && defined(WIN3264)
++          /* If the OS is Windows NT, and 'encoding' differs from active
++           * codepage: use wide function and convert text. */
++          if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
++                  && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
++            {
++             WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
++             char_u *p;
++
++             GetDlgItemTextW(hwnd, DLG_NONBUTTON_CONTROL + 2, wp, IOSIZE);
++             p = utf16_to_enc(wp, NULL);
++             vim_strncpy(s_textfield, p, IOSIZE);
++             vim_free(p);
++             vim_free(wp);
++          }
++          else
++# endif
++              GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2,
+                                                        s_textfield, IOSIZE);
++      }
+       /*
+        * Need to check for IDOK because if the user just hits Return to
+        * accept the default value, some reason this is what we get.
+        */
+@@ -3568,11 +3621,11 @@ nCopyAnsiToWideChar(
+     WCHAR     *wn;
+     if (enc_codepage == 0 && (int)GetACP() != enc_codepage)
+     {
+       /* Not a codepage, use our own conversion function. */
+-      wn = enc_to_ucs2(lpAnsiIn, NULL);
++      wn = enc_to_utf16(lpAnsiIn, NULL);
+       if (wn != NULL)
+       {
+           wcscpy(lpWCStr, wn);
+           nChar = (int)wcslen(wn) + 1;
+           vim_free(wn);
+--- vim72.orig/src/gui_w48.c
++++ vim72/src/gui_w48.c
+@@ -151,10 +151,13 @@ static int               s_busy_processing = FALSE;
+ static int            destroying = FALSE;     /* call DestroyWindow() ourselves */
+ #ifdef MSWIN_FIND_REPLACE
+ static UINT           s_findrep_msg = 0;      /* set in gui_w[16/32].c */
+ static FINDREPLACE    s_findrep_struct;
++# if defined(FEAT_MBYTE) && defined(WIN3264)
++static FINDREPLACEW   s_findrep_struct_w;
++# endif
+ static HWND           s_findrep_hwnd = NULL;
+ static int            s_findrep_is_find;      /* TRUE for find dialog, FALSE
+                                                  for find/replace dialog */
+ #endif
+@@ -545,11 +548,11 @@ char_to_string(int ch, char_u *string, i
+           }
+       }
+       else
+       {
+           len = 1;
+-          ws = ucs2_to_enc(wstring, &len);
++          ws = utf16_to_enc(wstring, &len);
+           if (ws == NULL)
+               len = 0;
+           else
+           {
+               if (len > slen) /* just in case */
+@@ -882,19 +885,68 @@ _OnMenu(
+       gui_menu_cb(pMenu);
+ }
  #endif
  
  #ifdef MSWIN_FIND_REPLACE
@@ -26034,5616 +23999,4741 @@ Individual patches for Vim 7.2:
      *argvp = argv;
      return argc;
  }
---- vim72.orig/src/os_vms.c
-+++ vim72/src/os_vms.c
-@@ -226,11 +226,11 @@ mch_getenv(char_u *lognam)
-       return(cp);
-     }
-     else if ((sbuf = getenv((char *)lognam)))
-     {
-       lengte = strlen(sbuf) + 1;
--      cp = (char_u *)malloc((size_t)lengte);
-+      cp = (char_u *)alloc((size_t)lengte);
-       if (cp)
-           strcpy((char *)cp, sbuf);
-       return cp;
-     }
-     else
-@@ -379,11 +379,11 @@ vms_wproc(char *name, int val)
-           return 1;
-     }
-     if (--vms_match_free == 0) {
-       /* add more space to store matches */
-       vms_match_alloced += EXPL_ALLOC_INC;
--      vms_fmatch = (char_u **)realloc(vms_fmatch,
-+      vms_fmatch = (char_u **)vim_realloc(vms_fmatch,
-               sizeof(char **) * vms_match_alloced);
-       if (!vms_fmatch)
-           return 0;
-       vms_match_free = EXPL_ALLOC_INC;
-     }
-@@ -458,11 +458,11 @@ mch_expand_wildcards(int num_pat, char_u
+--- vim72.orig/src/gui_x11.c
++++ vim72/src/gui_x11.c
+@@ -568,26 +568,24 @@ static char **gui_argv = NULL;
  
-           /* allocate memory for pointers */
-           if (--files_free < 1)
-           {
-               files_alloced += EXPL_ALLOC_INC;
--              *file = (char_u **)realloc(*file,
-+              *file = (char_u **)vim_realloc(*file,
-                   sizeof(char_u **) * files_alloced);
-               if (*file == NULL)
-               {
-                   *file = (char_u **)"";
-                   *num_file = 0;
-@@ -612,18 +612,18 @@ vms_fixfilename(void *instring)
-     len = strlen(instring) + 1;
-     if (len > buflen)
-     {
-       buflen = len + 128;
-       if (buf)
--          buf = (char *)realloc(buf, buflen);
-+          buf = (char *)vim_realloc(buf, buflen);
-       else
--          buf = (char *)calloc(buflen, sizeof(char));
-+          buf = (char *)alloc(buflen * sizeof(char));
-     }
+ /*
+  * Call-back routines.
+  */
  
- #ifdef DEBUG
-      char              *tmpbuf = NULL;
--     tmpbuf = (char *)calloc(buflen, sizeof(char));
-+     tmpbuf = (char *)alloc(buflen * sizeof(char));
-      strcpy(tmpbuf, instring);
- #endif
+-/* ARGSUSED */
+     static void
+ gui_x11_timer_cb(timed_out, interval_id)
+     XtPointer     timed_out;
+-    XtIntervalId    *interval_id;
++    XtIntervalId    *interval_id UNUSED;
+ {
+     *((int *)timed_out) = TRUE;
+ }
  
-     Fspec_Rms = buf;                          /* for decc$to_vms */
+-/* ARGSUSED */
+     static void
+ gui_x11_visibility_cb(w, dud, event, dum)
+-    Widget    w;
+-    XtPointer dud;
++    Widget    w UNUSED;
++    XtPointer dud UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
+ {
+     if (event->type != VisibilityNotify)
+       return;
  
---- vim72.orig/src/os_w32exe.c
-+++ vim72/src/os_w32exe.c
-@@ -127,11 +127,12 @@ WinMain(
- #ifdef VIMDLL
-     FreeLibrary(hLib);
- errout:
+     gui.visibility = event->xvisibility.state;
+@@ -601,17 +599,16 @@ gui_x11_visibility_cb(w, dud, event, dum
+     /* This is needed for when redrawing is slow. */
+     gui_mch_update();
+ }
+-/* ARGSUSED */
+     static void
+ gui_x11_expose_cb(w, dud, event, dum)
+-    Widget    w;
+-    XtPointer dud;
++    Widget    w UNUSED;
++    XtPointer dud UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
+ {
+     XExposeEvent      *gevent;
+     int                       new_x;
+     if (event->type != Expose)
+@@ -678,17 +675,16 @@ shellRectangle(Widget shell, XRectangle
+     r->y = absy;
+     XtVaGetValues(shell, XmNheight, &r->height, XmNwidth, &r->width, NULL);
+ }
  #endif
-     free(argv);
--    free(tofree);
-+    if (tofree != NULL)
-+      free(tofree);
- #ifdef FEAT_MBYTE
-     free_cmd_argsW();
+-/* ARGSUSED */
+     static void
+ gui_x11_resize_window_cb(w, dud, event, dum)
+-    Widget    w;
+-    XtPointer dud;
++    Widget    w UNUSED;
++    XtPointer dud UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
+ {
+     static int lastWidth, lastHeight;
+     if (event->type != ConfigureNotify)
+       return;
+@@ -725,56 +721,52 @@ gui_x11_resize_window_cb(w, dud, event,
+ #ifdef FEAT_XIM
+     xim_set_preedit();
  #endif
+ }
  
-     return 0;
---- vim72.orig/src/os_win16.c
-+++ vim72/src/os_win16.c
-@@ -119,11 +119,12 @@ WinMain(
-     pmain = VimMain;
-     pSaveInst(hInstance);
-     pmain(argc, argv);
+-/* ARGSUSED */
+     static void
+ gui_x11_focus_change_cb(w, data, event, dum)
+-    Widget    w;
+-    XtPointer data;
++    Widget    w UNUSED;
++    XtPointer data UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
+ {
+     gui_focus_change(event->type == FocusIn);
+ }
  
-     free(argv);
--    free(tofree);
-+    if (tofree != NULL)
-+      free(tofree);
+-/* ARGSUSED */
+     static void
+ gui_x11_enter_cb(w, data, event, dum)
+-    Widget    w;
+-    XtPointer data;
+-    XEvent    *event;
+-    Boolean   *dum;
++    Widget    w UNUSED;
++    XtPointer data UNUSED;
++    XEvent    *event UNUSED;
++    Boolean   *dum UNUSED;
+ {
+     gui_focus_change(TRUE);
+ }
  
-     return 0;
+-/* ARGSUSED */
+     static void
+ gui_x11_leave_cb(w, data, event, dum)
+-    Widget    w;
+-    XtPointer data;
+-    XEvent    *event;
+-    Boolean   *dum;
++    Widget    w UNUSED;
++    XtPointer data UNUSED;
++    XEvent    *event UNUSED;
++    Boolean   *dum UNUSED;
+ {
+     gui_focus_change(FALSE);
  }
- #endif
  
---- vim72.orig/src/if_xcmdsrv.c
-+++ vim72/src/if_xcmdsrv.c
-@@ -19,25 +19,10 @@
- # ifdef FEAT_X11
- #  include <X11/Intrinsic.h>
- #  include <X11/Xatom.h>
+ #if defined(X_HAVE_UTF8_STRING) && defined(FEAT_MBYTE)
+ # if X_HAVE_UTF8_STRING
+ #  define USE_UTF8LOOKUP
  # endif
+ #endif
  
--# if defined(HAVE_SYS_SELECT_H) && \
--      (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME))
--#  include <sys/select.h>
--# endif
--
--# ifndef HAVE_SELECT
--#  ifdef HAVE_SYS_POLL_H
--#   include <sys/poll.h>
--#  else
--#   ifdef HAVE_POLL_H
--#    include <poll.h>
--#   endif
--#  endif
--# endif
--
- /*
-  * This file provides procedures that implement the command server
-  * functionality of Vim when in contact with an X11 server.
-  *
-  * Adapted from TCL/TK's send command  in tkSend.c of the tk 3.6 distribution.
-@@ -680,11 +665,11 @@ serverGetVimNames(dpy)
+-/* ARGSUSED */
+     void
+ gui_x11_key_hit_cb(w, dud, event, dum)
+-    Widget    w;
+-    XtPointer dud;
++    Widget    w UNUSED;
++    XtPointer dud UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
+ {
+     XKeyPressedEvent  *ev_press;
+ #ifdef FEAT_XIM
+     char_u            string2[256];
+     char_u            string_shortbuf[256];
+@@ -1076,17 +1068,16 @@ theend:
+     if (string_alloced)
+       XtFree((char *)string);
+ #endif
+ }
  
-     /*
-      * Scan all of the names out of the property.
-      */
-     ga_init2(&ga, 1, 100);
--    for (p = regProp; (p - regProp) < numItems; p++)
-+    for (p = regProp; (long_u)(p - regProp) < numItems; p++)
-     {
-       entry = p;
-       while (*p != 0 && !isspace(*p))
-           p++;
-       if (*p != 0)
-@@ -734,11 +719,11 @@ ServerReplyFind(w, op)
-       {
-           p = ((struct ServerReply *) serverReply.ga_data)
-               + serverReply.ga_len;
-           e.id = w;
-           ga_init2(&e.strings, 1, 100);
--          memcpy(p, &e, sizeof(e));
-+          mch_memmove(p, &e, sizeof(e));
-           serverReply.ga_len++;
-       }
-     }
-     else if (p != NULL && op == SROP_Delete)
-     {
-@@ -967,11 +952,11 @@ LookupName(dpy, name, delete, loose)
-     /*
-      * Scan the property for the desired name.
-      */
-     returnValue = (int_u)None;
-     entry = NULL;     /* Not needed, but eliminates compiler warning. */
--    for (p = regProp; (p - regProp) < numItems; )
-+    for (p = regProp; (long_u)(p - regProp) < numItems; )
-     {
-       entry = p;
-       while (*p != 0 && !isspace(*p))
-           p++;
-       if (*p != 0 && STRICMP(name, p + 1) == 0)
-@@ -984,11 +969,11 @@ LookupName(dpy, name, delete, loose)
-       p++;
-     }
+-/* ARGSUSED */
+     static void
+ gui_x11_mouse_cb(w, dud, event, dum)
+-    Widget    w;
+-    XtPointer dud;
++    Widget    w UNUSED;
++    XtPointer dud UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
+ {
+     static XtIntervalId timer = (XtIntervalId)0;
+     static int        timed_out = TRUE;
  
-     if (loose != NULL && returnValue == (int_u)None && !IsSerialName(name))
+     int               button;
+@@ -1208,15 +1199,15 @@ gui_mch_prepare(argc, argv)
+     gui_argv[gui_argc++] = argv[0];
+     arg = 1;
+     while (arg < *argc)
      {
--      for (p = regProp; (p - regProp) < numItems; )
-+      for (p = regProp; (long_u)(p - regProp) < numItems; )
-       {
-           entry = p;
-           while (*p != 0 && !isspace(*p))
-               p++;
-           if (*p != 0 && IsSerialName(p + 1)
-@@ -1016,11 +1001,11 @@ LookupName(dpy, name, delete, loose)
-       while (*p != 0)
-           p++;
-       p++;
-       count = numItems - (p - regProp);
-       if (count > 0)
--          memcpy(entry, p, count);
-+          mch_memmove(entry, p, count);
-       XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING,
-                       8, PropModeReplace, regProp,
-                       (int)(numItems - (p - entry)));
-       XSync(dpy, False);
-     }
-@@ -1054,11 +1039,11 @@ DeleteAnyLingerer(dpy, win)
-      */
-     if (GetRegProp(dpy, &regProp, &numItems, FALSE) == FAIL)
-       return;
+       /* Look for argv[arg] in cmdline_options[] table */
+-      for (i = 0; i < XtNumber(cmdline_options); i++)
++      for (i = 0; i < (int)XtNumber(cmdline_options); i++)
+           if (strcmp(argv[arg], cmdline_options[i].option) == 0)
+               break;
  
-     /* Scan the property for the window id.  */
--    for (p = regProp; (p - regProp) < numItems; )
-+    for (p = regProp; (long_u)(p - regProp) < numItems; )
-     {
-       if (*p != 0)
-       {
-           sscanf((char *)p, "%x", &wwin);
-           if ((Window)wwin == win)
-@@ -1070,11 +1055,11 @@ DeleteAnyLingerer(dpy, win)
-               while (*p != 0)
-                   p++;
-               p++;
-               lastHalf = numItems - (p - regProp);
-               if (lastHalf > 0)
--                  memcpy(entry, p, lastHalf);
-+                  mch_memmove(entry, p, lastHalf);
-               numItems = (entry - regProp) + lastHalf;
-               p = entry;
-               continue;
-           }
-       }
-@@ -1194,11 +1179,11 @@ serverEventProc(dpy, eventPtr)
-     /*
-      * Several commands and results could arrive in the property at
-      * one time;  each iteration through the outer loop handles a
-      * single command or result.
-      */
--    for (p = propInfo; (p - propInfo) < numItems; )
-+    for (p = propInfo; (long_u)(p - propInfo) < numItems; )
-     {
-       /*
-        * Ignore leading NULs; each command or result starts with a
-        * NUL so that no matter how badly formed a preceding command
-        * is, we'll be able to tell that a new command/result is
-@@ -1228,11 +1213,11 @@ serverEventProc(dpy, eventPtr)
-           name = NULL;
-           resWindow = None;
-           serial = (char_u *)"";
-           script = NULL;
-           enc = NULL;
--          while (p - propInfo < numItems && *p == '-')
-+          while ((long_u)(p - propInfo) < numItems && *p == '-')
-           {
-               switch (p[1])
-               {
-                   case 'r':
-                       end = skipwhite(p + 2);
-@@ -1331,11 +1316,11 @@ serverEventProc(dpy, eventPtr)
-           p += 2;
-           gotSerial = 0;
-           res = (char_u *)"";
-           code = 0;
-           enc = NULL;
--          while ((p-propInfo) < numItems && *p == '-')
-+          while ((long_u)(p - propInfo) < numItems && *p == '-')
-           {
-               switch (p[1])
-               {
-                   case 'r':
-                       if (p[2] == ' ')
-@@ -1399,11 +1384,11 @@ serverEventProc(dpy, eventPtr)
-            */
-           p += 2;
-           gotWindow = 0;
-           str = (char_u *)"";
-           enc = NULL;
--          while ((p-propInfo) < numItems && *p == '-')
-+          while ((long_u)(p - propInfo) < numItems && *p == '-')
-           {
-               switch (p[1])
-               {
-                   case 'n':
-                       if (p[2] == ' ')
-@@ -1487,15 +1472,14 @@ AppendPropCarefully(dpy, window, propert
+-      if (i < XtNumber(cmdline_options))
++      if (i < (int)XtNumber(cmdline_options))
+       {
+           /* Remember finding "-rv" or "-reverse" */
+           if (strcmp("-rv", argv[arg]) == 0
+                   || strcmp("-reverse", argv[arg]) == 0)
+               found_reverse_arg = TRUE;
+@@ -1317,16 +1308,15 @@ gui_mch_init_check()
+  */
+ static XtInputId _xsmp_xtinputid;
  
+ static void local_xsmp_handle_requests __ARGS((XtPointer c, int *s, XtInputId *i));
  
- /*
-  * Another X Error handler, just used to check for errors.
-  */
--/* ARGSUSED */
-     static int
- x_error_check(dpy, error_event)
--    Display   *dpy;
--    XErrorEvent       *error_event;
-+    Display   *dpy UNUSED;
-+    XErrorEvent       *error_event UNUSED;
+-/*ARGSUSED*/
+     static void
+ local_xsmp_handle_requests(c, s, i)
+-    XtPointer c;
+-    int               *s;
+-    XtInputId *i;
++    XtPointer c UNUSED;
++    int               *s UNUSED;
++    XtInputId *i UNUSED;
  {
-     got_x_error = TRUE;
-     return 0;
+     if (xsmp_handle_requests() == FAIL)
+       XtRemoveInput(_xsmp_xtinputid);
+ }
+ #endif
+@@ -1436,11 +1426,11 @@ gui_mch_init()
+       mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h);
+       if (mask & WidthValue)
+           Columns = w;
+       if (mask & HeightValue)
+       {
+-          if (p_window > h - 1 || !option_was_set((char_u *)"window"))
++          if (p_window > (long)h - 1 || !option_was_set((char_u *)"window"))
+               p_window = h - 1;
+           Rows = h;
+       }
+       /*
+        * Set the (x,y) position of the main window only if specified in the
+@@ -1585,10 +1575,12 @@ gui_mch_uninit()
+ {
+     gui_x11_destroy_widgets();
+     XtCloseDisplay(gui.dpy);
+     gui.dpy = NULL;
+     vimShell = (Widget)0;
++    vim_free(gui_argv);
++    gui_argv = NULL;
  }
  
---- vim72.orig/src/if_sniff.c
-+++ vim72/src/if_sniff.c
-@@ -714,12 +714,14 @@ ConnectToSniffEmacs()
+ /*
+  * Called when the foreground or background color has been changed.
+  */
+@@ -1749,20 +1741,21 @@ gui_init_menu_font()
      }
+ #endif
+ }
+ #endif
  
- #else         /* UNIX Version of the Code */
-     int ToSniffEmacs[2], FromSniffEmacs[2];
--    pipe(ToSniffEmacs);
--    pipe(FromSniffEmacs);
-+    if (pipe(ToSniffEmacs) != 0)
-+      return 1;
-+    if (pipe(FromSniffEmacs) != 0)
-+      return 1;
-     /* fork */
-     if ((sniffemacs_pid=fork()) == 0)
-     {
-       /* child */
-@@ -1112,11 +1114,12 @@ vi_error_msg(str)
-     static void
- vi_open_file(fname)
-     char *fname;
+-/*ARGSUSED*/
+     void
+ gui_mch_exit(rc)
+-    int               rc;
++    int               rc UNUSED;
  {
-     ++no_wait_return;
--    do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF);
-+    do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF,
-+          curwin);
-     curbuf->b_sniff = TRUE;
-     --no_wait_return;                                 /* [ex_docmd.c] */
+ #if 0
+     /* Lesstif gives an error message here, and so does Solaris.  The man page
+      * says that this isn't needed when exiting, so just skip it. */
+     XtCloseDisplay(gui.dpy);
+ #endif
++    vim_free(gui_argv);
++    gui_argv = NULL;
  }
  
-     static buf_T *
---- vim72.orig/src/netbeans.c
-+++ vim72/src/netbeans.c
-@@ -30,10 +30,11 @@
- #  include <tchar.h>  /* for _T definition for TRACEn macros */
- # endif
- /* WinSock API is separated from C API, thus we can't use read(), write(),
-  * errno... */
- # define sock_errno WSAGetLastError()
-+# undef ECONNREFUSED
- # define ECONNREFUSED WSAECONNREFUSED
- # ifdef EINTR
- #  undef EINTR
- # endif
- # define EINTR WSAEINTR
-@@ -67,11 +68,12 @@ static char *ExtEdProtocolVersion = "2.4
- static long pos2off __ARGS((buf_T *, pos_T *));
- static pos_T *off2pos __ARGS((buf_T *, long));
- static pos_T *get_off_or_lnum __ARGS((buf_T *buf, char_u **argp));
- static long get_buf_size __ARGS((buf_T *));
--static void netbeans_keystring __ARGS((int key, char *keystr));
-+static int netbeans_keystring __ARGS((char_u *keystr));
-+static void postpone_keycommand __ARGS((char_u *keystr));
- static void special_keys __ARGS((char_u *args));
- static void netbeans_connect __ARGS((void));
- static int getConnInfo __ARGS((char *file, char **host, char **port, char **password));
-@@ -499,11 +501,11 @@ getConnInfo(char *file, char **host, cha
+ /*
+  * Get the position of the top left corner of the window.
+  */
+@@ -1793,21 +1786,20 @@ gui_mch_set_winpos(x, y)
+       XtNx,   x,
+       XtNy,   y,
+       NULL);
  }
  
- struct keyqueue
+-/*ARGSUSED*/
+     void
+ gui_mch_set_shellsize(width, height, min_width, min_height,
+                   base_width, base_height, direction)
+     int               width;
+     int               height;
+     int               min_width;
+     int               min_height;
+     int               base_width;
+     int               base_height;
+-    int               direction;
++    int               direction UNUSED;
  {
--    int                    key;
-+    char_u        *keystr;
-     struct keyqueue *next;
-     struct keyqueue *prev;
- };
- typedef struct keyqueue keyQ_T;
-@@ -511,17 +513,21 @@ typedef struct keyqueue keyQ_T;
- static keyQ_T keyHead; /* dummy node, header for circular queue */
+ #ifdef FEAT_XIM
+     height += xim_get_status_area_height(),
+ #endif
+     XtVaSetValues(vimShell,
+@@ -1841,15 +1833,14 @@ gui_mch_get_screen_dimensions(screen_w,
+  * Initialise vim to use the font "font_name".  If it's NULL, pick a default
+  * font.
+  * If "fontset" is TRUE, load the "font_name" as a fontset.
+  * Return FAIL if the font could not be loaded, OK otherwise.
+  */
+-/*ARGSUSED*/
+     int
+ gui_mch_init_font(font_name, do_fontset)
+     char_u    *font_name;
+-    int               do_fontset;
++    int               do_fontset UNUSED;
+ {
+     XFontStruct       *font = NULL;
  
+ #ifdef FEAT_XFONTSET
+     XFontSet  fontset = NULL;
+@@ -2023,14 +2014,13 @@ gui_mch_get_font(name, giveErrorIfMissin
+ #if defined(FEAT_EVAL) || defined(PROTO)
  /*
-  * Queue up key commands sent from netbeans.
-+ * We store the string, because it may depend on the global mod_mask and
-+ * :nbkey doesn't have a key number.
+  * Return the name of font "font" in allocated memory.
+  * Don't know how to get the actual name, thus use the provided name.
   */
-     static void
--postpone_keycommand(int key)
-+postpone_keycommand(char_u *keystr)
+-/*ARGSUSED*/
+     char_u *
+ gui_mch_get_fontname(font, name)
+-    GuiFont font;
++    GuiFont font UNUSED;
+     char_u  *name;
  {
-     keyQ_T *node;
+     if (name == NULL)
+       return NULL;
+     return vim_strsave(name);
+@@ -2448,11 +2438,11 @@ find_closest_color(colormap, colorPtr)
+     {
+       gui.color_approx = TRUE;
+       *colorPtr = colortable[closest];
+     }
  
-     node = (keyQ_T *)alloc(sizeof(keyQ_T));
-+    if (node == NULL)
-+      return;  /* out of memory, drop the key */
+-    free(colortable);
++    vim_free(colortable);
+     return OK;
+ }
  
-     if (keyHead.next == NULL) /* initialize circular queue */
+ /*
+  * Set the current text foreground color.
+@@ -2515,11 +2505,11 @@ draw_curl(row, col, cells)
+     int col;
+     int cells;
+ {
+     int                       i;
+     int                       offset;
+-    const static int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
++    static const int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
+     XSetForeground(gui.dpy, gui.text_gc, prev_sp_color);
+     for (i = FILL_X(col); i < FILL_X(col + cells); ++i)
      {
-       keyHead.next = &keyHead;
-       keyHead.prev = &keyHead;
-@@ -531,28 +537,33 @@ postpone_keycommand(int key)
-     node->next = &keyHead;
-     node->prev = keyHead.prev;
-     keyHead.prev->next = node;
-     keyHead.prev = node;
+       offset = val[i % 8];
+@@ -2563,12 +2553,14 @@ gui_mch_draw_string(row, col, s, len, fl
+       {
+           c = utf_ptr2char(p);
+ # ifdef FEAT_XFONTSET
+           if (current_fontset != NULL)
+           {
+-              if (c >= 0x10000 && sizeof(wchar_t) <= 2)
++#  ifdef SMALL_WCHAR_T
++              if (c >= 0x10000)
+                   c = 0xbf;           /* show chars > 0xffff as ? */
++#  endif
+               ((wchar_t *)buf)[wlen] = c;
+           }
+           else
+ # endif
+           {
+@@ -3130,15 +3122,15 @@ gui_mch_menu_hidden(menu, hidden)
+ gui_mch_draw_menubar()
+ {
+     /* Nothing to do in X */
+ }
  
--    node->key = key;
-+    node->keystr = vim_strsave(keystr);
+-/* ARGSUSED */
+     void
+ gui_x11_menu_cb(w, client_data, call_data)
+-    Widget    w;
+-    XtPointer client_data, call_data;
++    Widget    w UNUSED;
++    XtPointer client_data;
++    XtPointer call_data UNUSED;
+ {
+     gui_menu_cb((vimmenu_T *)client_data);
  }
  
+ #endif /* FEAT_MENU */
+@@ -3147,17 +3139,16 @@ gui_x11_menu_cb(w, client_data, call_dat
  /*
-  * Handle any queued-up NetBeans keycommands to be send.
+  * Function called when window closed.        Works like ":qa".
+  * Should put up a requester!
   */
+-/*ARGSUSED*/
      static void
- handle_key_queue(void)
+ gui_x11_wm_protocol_handler(w, client_data, event, dum)
+-    Widget    w;
+-    XtPointer client_data;
++    Widget    w UNUSED;
++    XtPointer client_data UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
  {
--    while (keyHead.next && keyHead.next != &keyHead)
-+    int postponed = FALSE;
-+
-+    while (!postponed && keyHead.next && keyHead.next != &keyHead)
+     /*
+      * Only deal with Client messages.
+      */
+     if (event->type != ClientMessage)
+@@ -3166,11 +3157,11 @@ gui_x11_wm_protocol_handler(w, client_da
+     /*
+      * The WM_SAVE_YOURSELF event arrives when the window manager wants to
+      * exit.  That can be cancelled though, thus Vim shouldn't exit here.
+      * Just sync our swap files.
+      */
+-    if (((XClientMessageEvent *)event)->data.l[0] ==
++    if ((Atom)((XClientMessageEvent *)event)->data.l[0] ==
+                                                 wm_atoms[SAVE_YOURSELF_IDX])
      {
-       /* first, unlink the node */
-       keyQ_T *node = keyHead.next;
-       keyHead.next = node->next;
-       node->next->prev = node->prev;
--      /* now, send the keycommand */
--      netbeans_keycommand(node->key);
-+      /* Now, send the keycommand.  This may cause it to be postponed again
-+       * and change keyHead. */
-+      if (node->keystr != NULL)
-+          postponed = !netbeans_keystring(node->keystr);
-+      vim_free(node->keystr);
+       out_flush();
+       ml_sync_all(FALSE, FALSE);      /* preserve all swap files */
  
-       /* Finally, dispose of the node */
-       vim_free(node);
+@@ -3179,28 +3170,27 @@ gui_x11_wm_protocol_handler(w, client_da
+        * thus set argv to NULL. */
+       XSetCommand(gui.dpy, XtWindow(vimShell), NULL, 0);
+       return;
      }
+-    if (((XClientMessageEvent *)event)->data.l[0] !=
++    if ((Atom)((XClientMessageEvent *)event)->data.l[0] !=
+                                                 wm_atoms[DELETE_WINDOW_IDX])
+       return;
+     gui_shell_closed();
  }
-@@ -698,33 +709,43 @@ netbeans_parse_messages(void)
- #define MAXMSGSIZE 4096
  
+ #ifdef FEAT_CLIENTSERVER
  /*
-  * Read and process a command from netbeans.
+  * Function called when property changed. Check for incoming commands
   */
 -/*ARGSUSED*/
- #if defined(FEAT_GUI_W32) || defined(PROTO)
- /* Use this one when generating prototypes, the others are static. */
-     void
- messageFromNetbeansW32()
- #else
- # ifdef FEAT_GUI_MOTIF
-     static void
--messageFromNetbeans(XtPointer clientData, int *unused1, XtInputId *unused2)
-+messageFromNetbeans(XtPointer clientData UNUSED,
-+                  int *unused1 UNUSED,
-+                  XtInputId *unused2 UNUSED)
- # endif
- # ifdef FEAT_GUI_GTK
      static void
--messageFromNetbeans(gpointer clientData, gint unused1,
--                                                  GdkInputCondition unused2)
-+messageFromNetbeans(gpointer clientData UNUSED,
-+                  gint unused1 UNUSED,
-+                  GdkInputCondition unused2 UNUSED)
- # endif
- #endif
+ gui_x11_send_event_handler(w, client_data, event, dum)
+-    Widget    w;
+-    XtPointer client_data;
++    Widget    w UNUSED;
++    XtPointer client_data UNUSED;
+     XEvent    *event;
+-    Boolean   *dum;
++    Boolean   *dum UNUSED;
  {
-     static char_u     *buf = NULL;
-     int                       len;
-     int                       readlen = 0;
- #ifndef FEAT_GUI_GTK
-     static int                level = 0;
- #endif
-+#ifdef HAVE_SELECT
-+    struct timeval    tval;
-+    fd_set            rfds;
-+#else
-+# ifdef HAVE_POLL
-+    struct pollfd     fds;
-+# endif
-+#endif
+     XPropertyEvent *e = (XPropertyEvent *) event;
  
-     if (sd < 0)
-     {
-       nbdebug(("messageFromNetbeans() called without a socket\n"));
-       return;
-@@ -740,13 +761,30 @@ messageFromNetbeans(gpointer clientData,
-       buf = alloc(MAXMSGSIZE);
-       if (buf == NULL)
-           return;     /* out of memory! */
+     if (e->type == PropertyNotify && e->window == commWindow
+           && e->atom == commProperty &&  e->state == PropertyNewValue)
+@@ -3271,15 +3261,14 @@ gui_mch_start_blink()
+       blink_state = BLINK_ON;
+       gui_update_cursor(TRUE, FALSE);
      }
+ }
  
--    /* Keep on reading for as long as there is something to read. */
-+    /* Keep on reading for as long as there is something to read.
-+     * Use select() or poll() to avoid blocking on a message that is exactly
-+     * MAXMSGSIZE long. */
-     for (;;)
+-/* ARGSUSED */
+     static void
+ gui_x11_blink_cb(timed_out, interval_id)
+-    XtPointer     timed_out;
+-    XtIntervalId    *interval_id;
++    XtPointer     timed_out UNUSED;
++    XtIntervalId    *interval_id UNUSED;
+ {
+     if (blink_state == BLINK_ON)
      {
-+#ifdef HAVE_SELECT
-+      FD_ZERO(&rfds);
-+        FD_SET(sd, &rfds);
-+        tval.tv_sec = 0;
-+        tval.tv_usec = 0;
-+        if (select(sd + 1, &rfds, NULL, NULL, &tval) <= 0)
-+            break;
-+#else
-+# ifdef HAVE_POLL
-+      fds.fd = sd;
-+      fds.events = POLLIN;
-+        if (poll(&fds, 1, 0) <= 0)
-+            break;
-+# endif
-+#endif
-       len = sock_read(sd, buf, MAXMSGSIZE);
-       if (len <= 0)
-           break;      /* error or nothing more to read */
-       /* Store the read message in the queue. */
-@@ -767,15 +805,18 @@ messageFromNetbeans(gpointer clientData,
-           PERROR(_("read from Netbeans socket"));
-       }
-       return; /* don't try to parse it */
-     }
+       gui_undraw_cursor();
+       blink_state = BLINK_OFF;
+@@ -3437,62 +3426,51 @@ gui_mch_drawsign(row, col, typenr)
+     void *
+ gui_mch_register_sign(signfile)
+     char_u        *signfile;
+ {
+     XpmAttributes   attrs;
+-    XImage        *sign;
++    XImage        *sign = NULL;
+     int                   status;
  
--#ifdef FEAT_GUI_GTK
-+#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32)
-+    /* Let the main loop handle messages. */
-+# ifdef FEAT_GUI_GTK
-     if (gtk_main_level() > 0)
-       gtk_main_quit();
-+# endif
- #else
--    /* Parse the messages, but avoid recursion. */
-+    /* Parse the messages now, but avoid recursion. */
-     if (level == 1)
-       netbeans_parse_messages();
-     --level;
- #endif
-@@ -865,11 +906,11 @@ nb_parse_cmd(char_u *cmd)
-     if (nb_do_cmd(bufno, (char_u *)verb, isfunc, r_cmdno, (char_u *)q) == FAIL)
+     /*
+      * Setup the color substitution table.
+      */
+-    sign = NULL;
+     if (signfile[0] != NUL && signfile[0] != '-')
      {
- #ifdef NBDEBUG
-       /*
--       * This happens because the ExtEd can send a cammand or 2 after
-+       * This happens because the ExtEd can send a command or 2 after
-        * doing a stopDocumentListen command. It doesn't harm anything
-        * so I'm disabling it except for debugging.
-        */
-       nbdebug(("nb_parse_cmd: Command error for \"%s\"\n", cmd));
-       EMSG("E629: bad return from nb_do_cmd");
-@@ -1041,11 +1082,11 @@ netbeans_end(void)
+-      sign = (XImage *)alloc(sizeof(XImage));
+-      if (sign != NULL)
++      XpmColorSymbol color[5] =
+       {
+-          XpmColorSymbol color[5] =
+-          {
+-              {"none", NULL, 0},
+-              {"iconColor1", NULL, 0},
+-              {"bottomShadowColor", NULL, 0},
+-              {"topShadowColor", NULL, 0},
+-              {"selectColor", NULL, 0}
+-          };
+-          attrs.valuemask = XpmColorSymbols;
+-          attrs.numsymbols = 2;
+-          attrs.colorsymbols = color;
+-          attrs.colorsymbols[0].pixel = gui.back_pixel;
+-          attrs.colorsymbols[1].pixel = gui.norm_pixel;
+-          status = XpmReadFileToImage(gui.dpy, (char *)signfile,
++          {"none", NULL, 0},
++          {"iconColor1", NULL, 0},
++          {"bottomShadowColor", NULL, 0},
++          {"topShadowColor", NULL, 0},
++          {"selectColor", NULL, 0}
++      };
++      attrs.valuemask = XpmColorSymbols;
++      attrs.numsymbols = 2;
++      attrs.colorsymbols = color;
++      attrs.colorsymbols[0].pixel = gui.back_pixel;
++      attrs.colorsymbols[1].pixel = gui.norm_pixel;
++      status = XpmReadFileToImage(gui.dpy, (char *)signfile,
+                                                        &sign, NULL, &attrs);
+-
+-          if (status == 0)
+-          {
+-              /* Sign width is fixed at two columns now.
+-              if (sign->width > gui.sign_width)
+-                  gui.sign_width = sign->width + 8; */
+-          }
+-          else
+-          {
+-              vim_free(sign);
+-              sign = NULL;
+-              EMSG(_(e_signdata));
+-          }
++      if (status == 0)
++      {
++          /* Sign width is fixed at two columns now.
++          if (sign->width > gui.sign_width)
++              gui.sign_width = sign->width + 8; */
        }
-       sprintf(buf, "%d:killed=%d\n", i, r_cmdno);
-       nbdebug(("EVT: %s", buf));
- /*    nb_send(buf, "netbeans_end");    avoid "write failed" messages */
-       if (sd >= 0)
--          sock_write(sd, buf, (int)STRLEN(buf));  /* ignore errors */
-+          ignored = sock_write(sd, buf, (int)STRLEN(buf));
++      else
++          EMSG(_(e_signdata));
      }
- }
  
- /*
-  * Send a message to netbeans.
-@@ -1166,11 +1207,11 @@ nb_quote(char_u *txt)
-           default:
-               *q++ = *p;
-               break;
-       }
-     }
--    *q++ = '\0';
-+    *q = '\0';
+     return (void *)sign;
+ }
  
-     return buf;
+     void
+ gui_mch_destroy_sign(sign)
+     void *sign;
+ {
+-    XFree(((XImage *)sign)->data);
+-    vim_free(sign);
++    XDestroyImage((XImage*)sign);
  }
+ #endif
  
  
-@@ -1491,33 +1532,36 @@ nb_do_cmd(
-                   netbeansFireChanges = oldFire;
-                   netbeansSuppressNoLines = oldSuppress;
-                   return FAIL;
-               }
-               first = *pos;
--              nbdebug(("    FIRST POS: line %d, col %d\n", first.lnum, first.col));
-+              nbdebug(("    FIRST POS: line %d, col %d\n",
-+                                                    first.lnum, first.col));
-               pos = off2pos(buf->bufp, off+count-1);
-               if (!pos)
-               {
-                   nbdebug(("    !bad count\n"));
-                   nb_reply_text(cmdno, (char_u *)"!bad count");
-                   netbeansFireChanges = oldFire;
-                   netbeansSuppressNoLines = oldSuppress;
-                   return FAIL;
-               }
-               last = *pos;
--              nbdebug(("    LAST POS: line %d, col %d\n", last.lnum, last.col));
-+              nbdebug(("    LAST POS: line %d, col %d\n",
-+                                                      last.lnum, last.col));
-               del_from_lnum = first.lnum;
-               del_to_lnum = last.lnum;
-               doupdate = 1;
+ #ifdef FEAT_MOUSESHAPE
+--- vim72.orig/src/gui_xmdlg.c
++++ vim72/src/gui_xmdlg.c
+@@ -8,11 +8,11 @@
+  */
  
-               /* Get the position of the first byte after the deleted
-                * section.  "next" is NULL when deleting to the end of the
-                * file. */
-               next = off2pos(buf->bufp, off + count);
+ /*
+  * (C) 2001,2005 by Marcin Dalecki <martin@dalecki.de>
+  *
+- * Implementation of dialogue functions for the Motif GUI variant.
++ * Implementation of dialog functions for the Motif GUI variant.
+  *
+  * Note about Lesstif: Apparently lesstif doesn't get the widget layout right,
+  * when using a dynamic scrollbar policy.
+  */
  
-               /* Remove part of the first line. */
--              if (first.col != 0 || (next != NULL && first.lnum == next->lnum))
-+              if (first.col != 0
-+                              || (next != NULL && first.lnum == next->lnum))
-               {
-                   if (first.lnum != last.lnum
-                           || (next != NULL && first.lnum != next->lnum))
-                   {
-                       /* remove to the end of the first line */
-@@ -1576,18 +1620,22 @@ nb_do_cmd(
-                   for (i = del_from_lnum; i <= del_to_lnum; i++)
-                   {
-                       int id = buf_findsign_id(buf->bufp, (linenr_T)i);
-                       if (id > 0)
-                       {
--                          nbdebug(("    Deleting sign %d on line %d\n", id, i));
-+                          nbdebug(("    Deleting sign %d on line %d\n",
-+                                                                    id, i));
-                           buf_delsign(buf->bufp, id);
-                       }
-                       else
-+                      {
-                           nbdebug(("    No sign on line %d\n", i));
-+                      }
-                   }
+@@ -367,14 +367,14 @@ fill_lists(enum ListSpecifier fix, Share
+     char      *list[NONE][MAX_ENTRIES_IN_LIST];
+     int               count[NONE];
+     char      buf[TEMP_BUF_SIZE];
+     XmString  items[MAX_ENTRIES_IN_LIST];
+     int               i;
+-    int               index;
++    int               idx;
  
--                  nbdebug(("    Deleting lines %d through %d\n", del_from_lnum, del_to_lnum));
-+                  nbdebug(("    Deleting lines %d through %d\n",
-+                                               del_from_lnum, del_to_lnum));
-                   curwin->w_cursor.lnum = del_from_lnum;
-                   curwin->w_cursor.col = 0;
-                   del_lines(del_to_lnum - del_from_lnum + 1, FALSE);
-               }
+-    for (index = (int)ENCODING; index < (int)NONE; ++index)
+-      count[index] = 0;
++    for (idx = (int)ENCODING; idx < (int)NONE; ++idx)
++      count[idx] = 0;
  
-@@ -1793,11 +1841,11 @@ nb_do_cmd(
-           }
-           vim_free(buf->displayname);
-           buf->displayname = NULL;
+     /* First we insert the wild char into every single list. */
+     if (fix != ENCODING)
+       add_to_list(list[ENCODING], wild, &count[ENCODING]);
+     if (fix != NAME)
+@@ -446,11 +446,11 @@ fill_lists(enum ListSpecifier fix, Share
+       {
+           Widget button;
  
-           netbeansReadFile = 0; /* don't try to open disk file */
--          do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF);
-+          do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF, curwin);
-           netbeansReadFile = 1;
-           buf->bufp = curbuf;
-           maketitle();
-           buf->insertDone = FALSE;
-           gui_update_menus(0);
-@@ -1919,11 +1967,11 @@ nb_do_cmd(
-               return FAIL;
-           bufp = buflist_findname(path);
-           vim_free(path);
-           if (bufp == NULL)
-           {
--              nbdebug(("    File %s not found in setBufferNumber\n", args));
-+              nbdebug(("    File %s not found in setBufferNumber\n", args));
-               EMSG2("E642: File %s not found in setBufferNumber", args);
-               return FAIL;
-           }
-           buf->bufp = bufp;
-           buf->nbbuf_number = bufp->b_fnum;
-@@ -1958,11 +2006,11 @@ nb_do_cmd(
-           vim_free(buf->displayname);
-           buf->displayname = nb_unquote(args, NULL);
+           items[i] = XmStringCreateLocalized(list[ENCODING][i]);
  
-           netbeansReadFile = 0; /* don't try to open disk file */
-           do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE,
--                                                   ECMD_HIDE + ECMD_OLDBUF);
-+                                           ECMD_HIDE + ECMD_OLDBUF, curwin);
-           netbeansReadFile = 1;
-           buf->bufp = curbuf;
-           maketitle();
-           gui_update_menus(0);
- /* =====================================================================*/
-@@ -1977,11 +2025,11 @@ nb_do_cmd(
-           }
-           /* Edit a file: like create + setFullName + read the file. */
-           vim_free(buf->displayname);
-           buf->displayname = nb_unquote(args, NULL);
-           do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE,
--                                                   ECMD_HIDE + ECMD_OLDBUF);
-+                                           ECMD_HIDE + ECMD_OLDBUF, curwin);
-           buf->bufp = curbuf;
-           buf->initDone = TRUE;
-           doupdate = 1;
- #if defined(FEAT_TITLE)
-           maketitle();
-@@ -2139,11 +2187,13 @@ nb_do_cmd(
- #ifdef FEAT_FOLDING
-               foldOpenCursor();
- #endif
-           }
-           else
-+          {
-               nbdebug(("    BAD POSITION in setDot: %s\n", s));
-+          }
+-          if (i < n_items)
++          if (i < (int)n_items)
+           {
+               /* recycle old button */
+               XtVaSetValues(children[i],
+                       XmNlabelString, items[i],
+                       XmNuserData, i,
+@@ -479,11 +479,11 @@ fill_lists(enum ListSpecifier fix, Share
+           XtFree(list[ENCODING][i]);
+       }
  
-           /* gui_update_cursor(TRUE, FALSE); */
-           /* update_curbuf(NOT_VALID); */
-           update_topline();           /* scroll to show the line */
-           update_screen(VALID);
-@@ -2275,13 +2325,10 @@ nb_do_cmd(
+       /* Destroy all the outstanding menu items.
+        */
+-      for (i = count[ENCODING]; i < n_items; ++i)
++      for (i = count[ENCODING]; i < (int)n_items; ++i)
        {
- #ifdef FEAT_SIGNS
-           int serNum;
-           int localTypeNum;
-           int typeNum;
--# ifdef NBDEBUG
--          int len;
--# endif
-           pos_T *pos;
+           XtUnmanageChild(children[i]);
+           XtDestroyWidget(children[i]);
+       }
  
-           if (buf == NULL || buf->bufp == NULL)
-           {
-               nbdebug(("    invalid buffer identifier in addAnno\n"));
-@@ -2301,17 +2348,14 @@ nb_do_cmd(
-           typeNum = mapsigntype(buf, localTypeNum);
+@@ -501,18 +501,18 @@ fill_lists(enum ListSpecifier fix, Share
+     }
  
-           pos = get_off_or_lnum(buf->bufp, &args);
+     /*
+      * Now loop trough the remaining lists and set them up.
+      */
+-    for (index = (int)NAME; index < (int)NONE; ++index)
++    for (idx = (int)NAME; idx < (int)NONE; ++idx)
+     {
+       Widget w;
  
-           cp = (char *)args;
--# ifdef NBDEBUG
--          len =
--# endif
--              strtol(cp, &cp, 10);
-+          ignored = (int)strtol(cp, &cp, 10);
-           args = (char_u *)cp;
- # ifdef NBDEBUG
--          if (len != -1)
-+          if (ignored != -1)
-           {
-               nbdebug(("    partial line annotation -- Not Yet Implemented!\n"));
-           }
- # endif
-           if (serNum >= GUARDEDOFFSET)
-@@ -2319,11 +2363,11 @@ nb_do_cmd(
-               nbdebug(("    too many annotations! ignoring...\n"));
-               return FAIL;
-           }
-           if (pos)
-           {
--              coloncmd(":sign place %d line=%d name=%d buffer=%d",
-+              coloncmd(":sign place %d line=%ld name=%d buffer=%d",
-                          serNum, pos->lnum, typeNum, buf->bufp->b_fnum);
-               if (typeNum == curPCtype)
-                   coloncmd(":sign jump %d buffer=%d", serNum,
-                                                      buf->bufp->b_fnum);
-           }
-@@ -2423,11 +2467,11 @@ nb_do_cmd(
-                       {
-                           if (buf_findsigntype_id(buf->bufp, lnum,
-                               GUARDED) == 0)
-                           {
-                               coloncmd(
--                                  ":sign place %d line=%d name=%d buffer=%d",
-+                                  ":sign place %d line=%ld name=%d buffer=%d",
-                                    guardId++, lnum, GUARDED,
-                                    buf->bufp->b_fnum);
-                           }
-                       }
-                   }
-@@ -2484,11 +2528,11 @@ nb_do_cmd(
- #endif
-               }
-           }
-           else
-           {
--              nbdebug(("    Buffer has no changes!\n"));
-+              nbdebug(("    Buffer has no changes!\n"));
-           }
- /* =====================================================================*/
+-      if (fix == (enum ListSpecifier)index)
++      if (fix == (enum ListSpecifier)idx)
+           continue;
+-      switch ((enum ListSpecifier)index)
++      switch ((enum ListSpecifier)idx)
+       {
+           case NAME:
+               w = data->list[NAME];
+               break;
+           case STYLE:
+@@ -523,32 +523,31 @@ fill_lists(enum ListSpecifier fix, Share
+               break;
+           default:
+               w = (Widget)0;  /* for lint */
        }
-       else if (streq((char *)cmd, "netbeansBuffer"))
+-      for (i = 0; i < count[index]; ++i)
++      for (i = 0; i < count[idx]; ++i)
        {
-@@ -2580,11 +2624,11 @@ coloncmd(char *cmd, ...)
- {
-     char buf[1024];
-     va_list ap;
+-          items[i] = XmStringCreateLocalized(list[index][i]);
+-          XtFree(list[index][i]);
++          items[i] = XmStringCreateLocalized(list[idx][i]);
++          XtFree(list[idx][i]);
+       }
+       XmListDeleteAllItems(w);
+-      XmListAddItems(w, items, count[index], 1);
+-      if (data->sel[index])
++      XmListAddItems(w, items, count[idx], 1);
++      if (data->sel[idx])
+       {
+           XmStringFree(items[0]);
+-          items[0] = XmStringCreateLocalized(data->sel[index]);
++          items[0] = XmStringCreateLocalized(data->sel[idx]);
+           XmListSelectItem(w, items[0], False);
+           XmListSetBottomItem(w, items[0]);
+       }
+-      for (i = 0; i < count[index]; ++i)
++      for (i = 0; i < count[idx]; ++i)
+           XmStringFree(items[i]);
+     }
+ }
  
-     va_start(ap, cmd);
--    vsprintf(buf, cmd, ap);
-+    vim_vsnprintf(buf, sizeof(buf), cmd, ap, NULL);
-     va_end(ap);
+-/*ARGSUSED*/
+     static void
+-stoggle_callback(Widget w,
++stoggle_callback(Widget w UNUSED,
+       SharedFontSelData *data,
+       XmToggleButtonCallbackStruct *call_data)
+ {
+     int               i, do_sel;
+     char      newSize[TEMP_BUF_SIZE];
+@@ -632,20 +631,23 @@ do_choice(Widget w,
  
-     nbdebug(("    COLONCMD %s\n", buf));
+     if (!data->sel[which])
+       data->sel[which] = XtNewString(sel);
+     else
+     {
+-      XtFree(data->sel[which]);
+       if (!strcmp(data->sel[which], sel))
+       {
+           /* unselecting current selection */
++          XtFree(data->sel[which]);
+           data->sel[which] = NULL;
+           if (w)
+               XmListDeselectItem(w, call_data->item);
+       }
+       else
++      {
++          XtFree(data->sel[which]);
+           data->sel[which] = XtNewString(sel);
++      }
+     }
+     XtFree(sel);
  
- /*     ALT_INPUT_LOCK_ON; */
-@@ -2647,11 +2691,11 @@ special_keys(char_u *args)
+     fill_lists(which, data);
  
-     void
- ex_nbkey(eap)
-     exarg_T   *eap;
- {
--    netbeans_keystring(0, (char *)eap->arg);
-+    (void)netbeans_keystring(eap->arg);
- }
+@@ -693,29 +695,28 @@ do_choice(Widget w,
+     else
+     {
+       int         n;
+       XmString    str;
+       Arg         args[4];
+-      char        *msg = _("no specific match");
++      char        *nomatch_msg = _("no specific match");
  
+       n = 0;
+-      str = XmStringCreateLocalized(msg);
++      str = XmStringCreateLocalized(nomatch_msg);
+       XtSetArg(args[n], XmNlabelString, str); ++n;
+       XtSetValues(data->sample, args, n);
+       apply_fontlist(data->sample);
+-      XmTextSetString(data->name, msg);
++      XmTextSetString(data->name, nomatch_msg);
+       XmStringFree(str);
  
- /*
-  * Initialize highlights and signs for use by netbeans  (mostly obsolete)
-@@ -2669,11 +2713,11 @@ nb_init_graphics(void)
-       did_init = TRUE;
+       return False;
      }
  }
  
- /*
-- * Convert key to netbeans name.
-+ * Convert key to netbeans name.  This uses the global "mod_mask".
-  */
+-/*ARGSUSED*/
      static void
- netbeans_keyname(int key, char *buf)
+ encoding_callback(Widget w,
+       SharedFontSelData *data,
+-      XtPointer dummy)
++      XtPointer dummy UNUSED)
  {
-     char *name = 0;
-@@ -2745,15 +2789,14 @@ netbeans_keyname(int key, char *buf)
- /*
-  * Function to be called for balloon evaluation.  Grabs the text under the
-  * cursor and sends it to the debugger for evaluation.  The debugger should
-  * respond with a showBalloon command when there is a useful result.
-  */
--/*ARGSUSED*/
-     void
- netbeans_beval_cb(
-       BalloonEval     *beval,
--      int              state)
-+      int              state UNUSED)
+     XmString str;
+     XmListCallbackStruct fake_data;
+     XtVaGetValues(w, XmNlabelString, &str, NULL);
+@@ -750,15 +751,14 @@ size_callback(Widget w,
+       XmListCallbackStruct *call_data)
  {
-     win_T     *wp;
-     char_u    *text;
-     linenr_T  lnum;
-     int               col;
-@@ -2922,48 +2965,30 @@ netbeans_file_opened(buf_T *bufp)
-     if (p_acd && vim_chdirfile(bufp->b_ffname) == OK)
-       shorten_fnames(TRUE);
+     do_choice(w, data, call_data, SIZE);
  }
  
- /*
-- * Tell netbeans a file was closed.
-+ * Tell netbeans that a file was deleted or wiped out.
-  */
-     void
--netbeans_file_closed(buf_T *bufp)
-+netbeans_file_killed(buf_T *bufp)
+-/*ARGSUSED*/
+     static void
+-cancel_callback(Widget w,
++cancel_callback(Widget w UNUSED,
+       SharedFontSelData *data,
+-      XmListCallbackStruct *call_data)
++      XmListCallbackStruct *call_data UNUSED)
  {
-     int               bufno = nb_getbufno(bufp);
-     nbbuf_T   *nbbuf = nb_get_buf(bufno);
-     char      buffer[2*MAXPATHL];
+     if (data->sel[ENCODING])
+     {
+       XtFree(data->sel[ENCODING]);
+       data->sel[ENCODING] = NULL;
+@@ -787,15 +787,14 @@ cancel_callback(Widget w,
+     XFreeFontNames(data->names);
+     data->names = NULL;
+     data->exit = True;
+ }
  
--    if (!haveConnection || bufno < 0)
-+    if (!haveConnection || bufno == -1)
-       return;
+-/*ARGSUSED*/
+     static void
+-ok_callback(Widget w,
++ok_callback(Widget w UNUSED,
+       SharedFontSelData *data,
+-      XmPushButtonCallbackStruct *call_data)
++      XmPushButtonCallbackStruct *call_data UNUSED)
+ {
+     char    *pattern;
+     char    **name;
+     int           i;
  
--    if (!netbeansCloseFile)
--    {
--      nbdebug(("Ignoring file_closed for %s. File was closed from IDE\n",
--                  bufp->b_ffname));
--      return;
--    }
--
--    nbdebug(("netbeans_file_closed:\n"));
--    nbdebug(("    Closing bufno: %d", bufno));
--    if (curbuf != NULL && curbuf != bufp)
--    {
--      nbdebug(("    Curbuf bufno:  %d\n", nb_getbufno(curbuf)));
--    }
--    else if (curbuf == bufp)
--    {
--      nbdebug(("    curbuf == bufp\n"));
--    }
--
--    if (bufno <= 0)
--      return;
-+    nbdebug(("netbeans_file_killed:\n"));
-+    nbdebug(("    Killing bufno: %d", bufno));
+@@ -884,25 +883,25 @@ gui_xm_select_font(char_u *current)
+      */
  
-     sprintf(buffer, "%d:killed=%d\n", bufno, r_cmdno);
+     {
+       int     i;
+       int     max;
+-      int     index = 0;
++      int     idx = 0;
+       int     size;
+-      char    str[128];
++      char    buf[128];
  
-     nbdebug(("EVT: %s", buffer));
+       for (i = 0, max = 0; i < data->num; i++)
+       {
+-          get_part(fn(data, i), 7, str);
+-          size = atoi(str);
++          get_part(fn(data, i), 7, buf);
++          size = atoi(buf);
+           if ((size > max) && (size < MAX_DISPLAY_SIZE))
+           {
+-              index = i;
++              idx = i;
+               max = size;
+           }
+       }
+-      strcpy(big_font, fn(data, index));
++      strcpy(big_font, fn(data, idx));
+     }
+     data->old = XLoadQueryFont(XtDisplay(parent), big_font);
+     data->old_list = gui_motif_create_fontlist(data->old);
  
--    nb_send(buffer, "netbeans_file_closed");
-+    nb_send(buffer, "netbeans_file_killed");
+     /* Set the title of the Dialog window. */
+@@ -1215,32 +1214,32 @@ gui_xm_select_font(char_u *current)
  
-     if (nbbuf != NULL)
-       nbbuf->bufp = NULL;
+       names = XListFonts(XtDisplay(form), (char *) current, 1, &i);
+       if (i != 0)
+       {
+-          char name[TEMP_BUF_SIZE];
+-          char style[TEMP_BUF_SIZE];
+-          char size[TEMP_BUF_SIZE];
+-          char encoding[TEMP_BUF_SIZE];
++          char namebuf[TEMP_BUF_SIZE];
++          char stylebuf[TEMP_BUF_SIZE];
++          char sizebuf[TEMP_BUF_SIZE];
++          char encodingbuf[TEMP_BUF_SIZE];
+           char *found;
+           found = names[0];
+-          name_part(found, name);
+-          style_part(found, style);
+-          size_part(found, size, data->in_pixels);
+-          encoding_part(found, encoding);
+-
+-          if (strlen(name) > 0
+-                  && strlen(style) > 0
+-                  && strlen(size) > 0
+-                  && strlen(encoding) > 0)
++          name_part(found, namebuf);
++          style_part(found, stylebuf);
++          size_part(found, sizebuf, data->in_pixels);
++          encoding_part(found, encodingbuf);
++
++          if (strlen(namebuf) > 0
++                  && strlen(stylebuf) > 0
++                  && strlen(sizebuf) > 0
++                  && strlen(encodingbuf) > 0)
+           {
+-              data->sel[NAME] = XtNewString(name);
+-              data->sel[STYLE] = XtNewString(style);
+-              data->sel[SIZE] = XtNewString(size);
+-              data->sel[ENCODING] = XtNewString(encoding);
++              data->sel[NAME] = XtNewString(namebuf);
++              data->sel[STYLE] = XtNewString(stylebuf);
++              data->sel[SIZE] = XtNewString(sizebuf);
++              data->sel[ENCODING] = XtNewString(encodingbuf);
+               data->font_name = XtNewString(names[0]);
+               display_sample(data);
+               XmTextSetString(data->name, data->font_name);
+           }
+           else
+@@ -1273,17 +1272,16 @@ gui_xm_select_font(char_u *current)
+     /* modal event loop */
+     while (!data->exit)
+       XtAppProcessEvent(XtWidgetToApplicationContext(data->dialog),
+                                                       (XtInputMask)XtIMAll);
+-    XtDestroyWidget(data->dialog);
+-
+     if (data->old)
+     {
+       XFreeFont(XtDisplay(data->dialog),  data->old);
+       XmFontListFree(data->old_list);
+     }
++    XtDestroyWidget(data->dialog);
+     gui_motif_synch_fonts();
+     return (char_u *) data->font_name;
  }
+--- vim72.orig/src/gui_xmebw.c
++++ vim72/src/gui_xmebw.c
+@@ -233,17 +233,16 @@ bump_color(unsigned short value)
+     int tmp = 2 * (((int) value - 65535) / 3) + 65535;
  
-@@ -3078,15 +3103,14 @@ netbeans_removed(
-     nbdebug(("EVT: %s", buf));
-     nb_send((char *)buf, "netbeans_removed");
+     return tmp;
  }
  
- /*
-- * Send netbeans an unmodufied command.
-+ * Send netbeans an unmodified command.
-  */
 -/*ARGSUSED*/
-     void
--netbeans_unmodified(buf_T *bufp)
-+netbeans_unmodified(buf_T *bufp UNUSED)
+     static int
+ alloc_color(Display   *display,
+       Colormap        colormap,
+       char            *colorname,
+       XColor          *xcolor,
+-      void            *closure)
++      void            *closure UNUSED)
  {
- #if 0
-     char_u    buf[128];
-     int               bufno;
-     nbbuf_T   *nbbuf;
-@@ -3136,56 +3160,59 @@ netbeans_button_release(int button)
+     int status;
  
+     if (colorname)
+       if (!XParseColor(display, colormap, colorname, xcolor))
+@@ -593,13 +592,14 @@ draw_unhighlight(XmEnhancedButtonWidget
+     else
+       XmeClearBorder(XtDisplay(eb), XtWindow(eb), 0, 0, XtWidth(eb),
+                      XtHeight(eb), eb->primitive.highlight_thickness);
+ }
  
- /*
-  * Send a keypress event back to netbeans. This usually simulates some
-  * kind of function key press. This function operates on a key code.
-+ * Return TRUE when the key was sent, FALSE when the command has been
-+ * postponed.
-  */
--    void
-+    int
- netbeans_keycommand(int key)
+-/*ARGSUSED*/
+     static void
+-draw_pixmap(XmEnhancedButtonWidget eb, XEvent *event, Region region)
++draw_pixmap(XmEnhancedButtonWidget eb,
++          XEvent *event UNUSED,
++          Region region UNUSED)
  {
-     char      keyName[60];
+     Pixmap    pix;
+     GC                gc = eb->label.normal_GC;
+     int               depth;
+     Cardinal  width;
+@@ -639,11 +639,11 @@ draw_pixmap(XmEnhancedButtonWidget eb, X
+     if (w < width)
+       width = w;
+     height = eb->core.height - 2 * y;
+     if (h < height)
+       height = h;
+-    if (depth == eb->core.depth)
++    if (depth == (int)eb->core.depth)
+       XCopyArea(XtDisplay(eb), pix, XtWindow(eb), gc, 0, 0,
+               width, height, x, y);
+     else if (depth == 1)
+       XCopyPlane(XtDisplay(eb), pix, XtWindow(eb), gc, 0, 0,
+               width, height, x, y, (unsigned long)1);
+@@ -729,13 +729,15 @@ draw_label(XmEnhancedButtonWidget eb, XE
  
-     netbeans_keyname(key, keyName);
--    netbeans_keystring(key, keyName);
-+    return netbeans_keystring((char_u *)keyName);
+     if (replaceGC)
+       eb->label.normal_GC = tmp_gc;
  }
  
- /*
-  * Send a keypress event back to netbeans. This usually simulates some
-  * kind of function key press. This function operates on a key string.
-+ * Return TRUE when the key was sent, FALSE when the command has been
-+ * postponed.
-  */
--    static void
--netbeans_keystring(int key, char *keyName)
-+    static int
-+netbeans_keystring(char_u *keyName)
+-/*ARGSUSED*/
+     static void
+-Enter(Widget wid, XEvent *event, String *params, Cardinal *num_params)
++Enter(Widget wid,
++      XEvent *event,
++      String *params UNUSED,
++      Cardinal *num_params UNUSED)
  {
-     char      buf[2*MAXPATHL];
-     int               bufno = nb_getbufno(curbuf);
-     long      off;
-     char_u    *q;
+     XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget) wid;
+     XmPushButtonCallbackStruct call_value;
  
-     if (!haveConnection)
--      return;
-+      return TRUE;
+     if (Lab_IsMenupane(eb))
+@@ -816,13 +818,15 @@ Enter(Widget wid, XEvent *event, String
+       draw_shadows(eb);
+       draw_pixmap(eb, event, NULL);
+     }
+ }
  
+-/*ARGSUSED*/
+     static void
+-Leave(Widget wid, XEvent *event, String *params, Cardinal *num_params)
++Leave(Widget wid,
++      XEvent *event,
++      String *params UNUSED,
++      Cardinal *num_params UNUSED)
+ {
+     XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget)wid;
+     XmPushButtonCallbackStruct call_value;
  
-     if (bufno == -1)
-     {
-       nbdebug(("got keycommand for non-NetBeans buffer, opening...\n"));
-       q = curbuf->b_ffname == NULL ? (char_u *)""
-                                                : nb_quote(curbuf->b_ffname);
-       if (q == NULL)
--          return;
-+          return TRUE;
-       vim_snprintf(buf, sizeof(buf), "0:fileOpened=%d \"%s\" %s %s\n", 0,
-               q,
-               "T",  /* open in NetBeans */
-               "F"); /* modified */
-       if (curbuf->b_ffname != NULL)
-           vim_free(q);
-       nbdebug(("EVT: %s", buf));
-       nb_send(buf, "netbeans_keycommand");
+     if (Lab_IsMenupane(eb))
+@@ -974,13 +978,12 @@ set_size(XmEnhancedButtonWidget newtb)
  
--      if (key > 0)
--          postpone_keycommand(key);
--      return;
-+      postpone_keycommand(keyName);
-+      return FALSE;
+       (* resize) ((Widget) newtb);
      }
+ }
  
-     /* sync the cursor position */
-     off = pos2off(curbuf, &curwin->w_cursor);
-     sprintf(buf, "%d:newDotAndMark=%d %ld %ld\n", bufno, r_cmdno, off, off);
-@@ -3207,10 +3234,11 @@ netbeans_keystring(int key, char *keyNam
-     vim_snprintf(buf, sizeof(buf), "%d:keyAtPos=%d \"%s\" %ld %ld/%ld\n",
-           bufno, r_cmdno, keyName,
-               off, (long)curwin->w_cursor.lnum, (long)curwin->w_cursor.col);
-     nbdebug(("EVT: %s", buf));
-     nb_send(buf, "netbeans_keycommand");
-+    return TRUE;
+-/*ARGSUSED*/
+     static void
+-Initialize(Widget rq, Widget ebw, ArgList args, Cardinal *n)
++Initialize(Widget rq, Widget ebw, ArgList args UNUSED, Cardinal *n UNUSED)
+ {
+     XmEnhancedButtonWidget  request = (XmEnhancedButtonWidget)rq;
+     XmEnhancedButtonWidget  eb = (XmEnhancedButtonWidget)ebw;
+     XtWidgetProc          resize;
+@@ -1054,13 +1057,16 @@ Destroy(Widget w)
+       return;
+     free_pixmaps((XmEnhancedButtonWidget)w);
  }
  
+-/*ARGSUSED*/
+     static Boolean
+-SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *n)
++SetValues(Widget current,
++        Widget request UNUSED,
++        Widget new,
++        ArgList args UNUSED,
++        Cardinal *n UNUSED)
+ {
+     XmEnhancedButtonWidget  cur = (XmEnhancedButtonWidget) current;
+     XmEnhancedButtonWidget  eb = (XmEnhancedButtonWidget) new;
+     Boolean               redraw = False;
+     Boolean               change = True;
+@@ -1106,11 +1112,11 @@ SetValues(Widget current, Widget request
+           if (root == root_q)
+           {
+               if ((win_x < 0) || (win_y < 0))
+                   return False;
  
- /*
-  * Send a save event to netbeans.
-@@ -3375,11 +3403,11 @@ netbeans_gutter_click(linenr_T lnum)
+-              if ((win_x > r_width) || (win_y > r_height))
++              if ((win_x > (int)r_width) || (win_y > (int)r_height))
+                   return False;
+               draw_highlight(eb);
+               draw_shadows(eb);
+           }
+       }
+@@ -1254,11 +1260,11 @@ Redisplay(Widget w, XEvent *event, Regio
+              ->primitive_class.border_highlight))(w);
+       draw_pixmap(eb, event, region);
      }
- }
+     else
+     {
+-      int adjust = 0;
++      adjust = 0;
+ #if !defined(LESSTIF_VERSION) && (XmVersion > 1002)
+       /*
+        *  NOTE: PushButton has two types of shadows: primitive-shadow and
+        *  default-button-shadow.  If pushbutton is in a menu only primitive
+@@ -1266,16 +1272,15 @@ Redisplay(Widget w, XEvent *event, Regio
+        */
+       switch (default_button_emphasis)
+       {
+           case XmEXTERNAL_HIGHLIGHT:
+               adjust = (eb->primitive.highlight_thickness -
+-                      (eb->pushbutton.default_button_shadow_thickness ?
+-                       Xm3D_ENHANCE_PIXEL : 0));
++                       (eb->pushbutton.default_button_shadow_thickness
++                        ?  Xm3D_ENHANCE_PIXEL : 0));
+               break;
+           case XmINTERNAL_HIGHLIGHT:
+-              adjust = 0;
+               break;
  
+           default:
+               assert(FALSE);
+               return;
+--- vim72.orig/src/gvim.exe.mnf
++++ vim72/src/gvim.exe.mnf
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
++<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
+   <assemblyIdentity
+     processorArchitecture="*"
+     version="7.2.0.0"
+     type="win32"
+     name="Vim"
+@@ -27,6 +27,12 @@
+           level="asInvoker"
+           uiAccess="false"/>
+       </requestedPrivileges>
+     </security>
+   </trustInfo>
++  <!-- Vista High DPI aware -->
++  <asmv3:application>
++    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
++      <dpiAware>true</dpiAware>
++    </asmv3:windowsSettings>
++  </asmv3:application>
+ </assembly>
+--- vim72.orig/src/hardcopy.c
++++ vim72/src/hardcopy.c
+@@ -440,16 +440,15 @@ prt_get_unit(idx)
+ }
  
  /*
-- * Add a sign of the reqested type at the requested location.
-+ * Add a sign of the requested type at the requested location.
-  *
-  * Reverse engineering:
-  * Apparently an annotation is defined the first time it is used in a buffer.
-  * When the same annotation is used in two buffers, the second time we do not
-  * need to define a new sign name but reuse the existing one.  But since the
-@@ -3389,17 +3417,16 @@ netbeans_gutter_click(linenr_T lnum)
-  *
-  * globalsignmap[]    stores the signs that have been defined globally.
-  * buf->signmapused[] maps buffer-local annotation IDs to an index in
-  *                    globalsignmap[].
+  * Print the page header.
   */
 -/*ARGSUSED*/
      static void
- addsigntype(
-     nbbuf_T   *buf,
-     int               typeNum,
-     char_u    *typeName,
--    char_u    *tooltip,
-+    char_u    *tooltip UNUSED,
-     char_u    *glyphFile,
-     int               use_fg,
-     int               fg,
-     int               use_bg,
-     int               bg)
-@@ -3529,11 +3556,12 @@ get_buf_size(buf_T *bufp)
-           eol_size = 2;
-       else
-           eol_size = 1;
-       for (lnum = 1; lnum <= bufp->b_ml.ml_line_count; ++lnum)
-       {
--          char_count += (long)STRLEN(ml_get(lnum)) + eol_size;
-+          char_count += (long)STRLEN(ml_get_buf(bufp, lnum, FALSE))
-+                                                                 + eol_size;
-           /* Check for a CTRL-C every 100000 characters */
-           if (char_count > last_check)
-           {
-               ui_breakcheck();
-               if (got_int)
---- vim72.orig/src/popupmnu.c
-+++ vim72/src/popupmnu.c
-@@ -343,25 +343,40 @@ pum_redraw()
-                       if (curwin->w_p_rl)
-                       {
-                           if (st != NULL)
-                           {
-                               char_u  *rt = reverse_text(st);
--                              char_u  *rt_saved = rt;
--                              int     len, j;
+ prt_header(psettings, pagenum, lnum)
+     prt_settings_T  *psettings;
+     int               pagenum;
+-    linenr_T  lnum;
++    linenr_T  lnum UNUSED;
+ {
+     int               width = psettings->chars_per_line;
+     int               page_line;
+     char_u    *tbuf;
+     char_u    *p;
+@@ -1879,11 +1878,11 @@ prt_next_dsc(p_dsc_line)
+     /* DSC comments always start %% */
+     if (prt_resfile_strncmp(0, "%%", 2) != 0)
+       return FALSE;
  
-                               if (rt != NULL)
-                               {
--                                  len = (int)STRLEN(rt);
--                                  if (len > pum_width)
-+                                  char_u      *rt_start = rt;
-+                                  int         size;
-+
-+                                  size = vim_strsize(rt);
-+                                  if (size > pum_width)
-                                   {
--                                      for (j = pum_width; j < len; ++j)
-+                                      do
-+                                      {
-+                                          size -= has_mbyte
-+                                                  ? (*mb_ptr2cells)(rt) : 1;
-                                           mb_ptr_adv(rt);
--                                      len = pum_width;
-+                                      } while (size > pum_width);
-+
-+                                      if (size < pum_width)
-+                                      {
-+                                          /* Most left character requires
-+                                           * 2-cells but only 1 cell is
-+                                           * available on screen.  Put a
-+                                           * '<' on the left of the pum
-+                                           * item */
-+                                          *(--rt) = '<';
-+                                          size++;
-+                                      }
-                                   }
--                                  screen_puts_len(rt, len, row,
--                                                      col - len + 1, attr);
--                                  vim_free(rt_saved);
-+                                  screen_puts_len(rt, (int)STRLEN(rt),
-+                                                 row, col - size + 1, attr);
-+                                  vim_free(rt_start);
-                               }
-                               vim_free(st);
-                           }
-                           col -= width;
-                       }
-@@ -571,11 +586,11 @@ pum_set_selected(n, repeat)
-               }
-               else
-               {
-                   /* Don't want to sync undo in the current buffer. */
-                   ++no_u_sync;
--                  res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0);
-+                  res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0, NULL);
-                   --no_u_sync;
-                   if (res == OK)
-                   {
-                       /* Edit a new, empty buffer. Set options for a "wipeout"
-                        * buffer. */
---- vim72.orig/src/proto/buffer.pro
-+++ vim72/src/proto/buffer.pro
-@@ -31,33 +31,32 @@ void buf_set_name __ARGS((int fnum, char
- void buf_name_changed __ARGS((buf_T *buf));
- buf_T *setaltfname __ARGS((char_u *ffname, char_u *sfname, linenr_T lnum));
- char_u *getaltfname __ARGS((int errmsg));
- int buflist_add __ARGS((char_u *fname, int flags));
- void buflist_slash_adjust __ARGS((void));
--void buflist_altfpos __ARGS((void));
-+void buflist_altfpos __ARGS((win_T *win));
- int otherfile __ARGS((char_u *ffname));
- void buf_setino __ARGS((buf_T *buf));
- void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate));
--void col_print __ARGS((char_u *buf, int col, int vcol));
-+void col_print __ARGS((char_u *buf, size_t buflen, int col, int vcol));
- void maketitle __ARGS((void));
- void resettitle __ARGS((void));
- void free_titles __ARGS((void));
- int build_stl_str_hl __ARGS((win_T *wp, char_u *out, size_t outlen, char_u *fmt, int use_sandbox, int fillchar, int maxwidth, struct stl_hlrec *hltab, struct stl_hlrec *tabtab));
--void get_rel_pos __ARGS((win_T *wp, char_u *str));
--int append_arg_number __ARGS((win_T *wp, char_u *buf, int add_file, int maxlen));
-+void get_rel_pos __ARGS((win_T *wp, char_u *buf, int buflen));
- char_u *fix_fname __ARGS((char_u *fname));
- void fname_expand __ARGS((buf_T *buf, char_u **ffname, char_u **sfname));
- char_u *alist_name __ARGS((aentry_T *aep));
- void do_arg_all __ARGS((int count, int forceit, int keep_tabs));
- void ex_buffer_all __ARGS((exarg_T *eap));
- void do_modelines __ARGS((int flags));
- int read_viminfo_bufferlist __ARGS((vir_T *virp, int writing));
- void write_viminfo_bufferlist __ARGS((FILE *fp));
- char *buf_spname __ARGS((buf_T *buf));
- void buf_addsign __ARGS((buf_T *buf, int id, linenr_T lnum, int typenr));
--int buf_change_sign_type __ARGS((buf_T *buf, int markId, int typenr));
--int_u buf_getsigntype __ARGS((buf_T *buf, linenr_T lnum, int type));
-+linenr_T buf_change_sign_type __ARGS((buf_T *buf, int markId, int typenr));
-+int buf_getsigntype __ARGS((buf_T *buf, linenr_T lnum, int type));
- linenr_T buf_delsign __ARGS((buf_T *buf, int id));
- int buf_findsign __ARGS((buf_T *buf, int id));
- int buf_findsign_id __ARGS((buf_T *buf, linenr_T lnum));
- int buf_findsigntype_id __ARGS((buf_T *buf, linenr_T lnum, int typenr));
- int buf_signcount __ARGS((buf_T *buf, linenr_T lnum));
---- vim72.orig/src/quickfix.c
-+++ vim72/src/quickfix.c
-@@ -1417,11 +1417,13 @@ qf_jump(qi, dir, errornr, forceit)
-     char_u            *old_swb = p_swb;
-     unsigned          old_swb_flags = swb_flags;
-     int                       opened_window = FALSE;
-     win_T             *win;
-     win_T             *altwin;
-+    int                       flags;
- #endif
-+    win_T             *oldwin = curwin;
-     int                       print_message = TRUE;
-     int                       len;
- #ifdef FEAT_FOLDING
-     int                       old_KeyTyped = KeyTyped; /* getting file may reset it */
+     /* Find type of DSC comment */
+-    for (comment = 0; comment < NUM_ELEMENTS(prt_dsc_table); comment++)
++    for (comment = 0; comment < (int)NUM_ELEMENTS(prt_dsc_table); comment++)
+       if (prt_resfile_strncmp(0, prt_dsc_table[comment].string,
+                                           prt_dsc_table[comment].len) == 0)
+           break;
+     if (comment != NUM_ELEMENTS(prt_dsc_table))
+@@ -2452,16 +2451,15 @@ prt_match_charset(p_charset, p_cmap, pp_
+     }
+     return FALSE;
+ }
  #endif
-@@ -1528,11 +1530,10 @@ qf_jump(qi, dir, errornr, forceit)
-      * For ":helpgrep" find a help window or open one.
-      */
-     if (qf_ptr->qf_type == 1 && (!curwin->w_buffer->b_help || cmdmod.tab != 0))
-     {
-       win_T   *wp;
--      int     n;
  
-       if (cmdmod.tab != 0)
-           wp = NULL;
-       else
-           for (wp = firstwin; wp != NULL; wp = wp->w_next)
-@@ -1544,27 +1545,29 @@ qf_jump(qi, dir, errornr, forceit)
-       {
-           /*
-            * Split off help window; put it at far top if no position
-            * specified, the current window is vertically split and narrow.
-            */
--          n = WSP_HELP;
-+          flags = WSP_HELP;
- # ifdef FEAT_VERTSPLIT
-           if (cmdmod.split == 0 && curwin->w_width != Columns
-                                                     && curwin->w_width < 80)
--              n |= WSP_TOP;
-+              flags |= WSP_TOP;
- # endif
--          if (win_split(0, n) == FAIL)
-+          if (qi != &ql_info)
-+              flags |= WSP_NEWLOC;  /* don't copy the location list */
-+
-+          if (win_split(0, flags) == FAIL)
-               goto theend;
-           opened_window = TRUE;       /* close it when fail */
+-/*ARGSUSED*/
+     int
+ mch_print_init(psettings, jobname, forceit)
+     prt_settings_T *psettings;
+     char_u    *jobname;
+-    int               forceit;
++    int               forceit UNUSED;
+ {
+     int               i;
+     char      *paper_name;
+     int               paper_strlen;
+     int               fontsize;
+@@ -2512,11 +2510,11 @@ mch_print_init(psettings, jobname, force
+     p_mbenc = NULL;
+     props = enc_canon_props(p_encoding);
+     if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE)))
+     {
+       p_mbenc_first = NULL;
+-      for (cmap = 0; cmap < NUM_ELEMENTS(prt_ps_mbfonts); cmap++)
++      for (cmap = 0; cmap < (int)NUM_ELEMENTS(prt_ps_mbfonts); cmap++)
+           if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap],
+                                                                   &p_mbenc))
+           {
+               if (p_mbenc_first == NULL)
+                   p_mbenc_first = p_mbenc;
+@@ -2640,11 +2638,11 @@ mch_print_init(psettings, jobname, force
+     else
+     {
+       paper_name = "A4";
+       paper_strlen = 2;
+     }
+-    for (i = 0; i < PRT_MEDIASIZE_LEN; ++i)
++    for (i = 0; i < (int)PRT_MEDIASIZE_LEN; ++i)
+       if (STRLEN(prt_mediasize[i].name) == (unsigned)paper_strlen
+               && STRNICMP(prt_mediasize[i].name, paper_name,
+                                                          paper_strlen) == 0)
+           break;
+     if (i == PRT_MEDIASIZE_LEN)
+@@ -3306,14 +3304,13 @@ mch_print_end_page()
+     prt_dsc_noarg("PageTrailer");
  
-           if (curwin->w_height < p_hh)
-               win_setheight((int)p_hh);
+     return !prt_file_error;
+ }
  
-           if (qi != &ql_info)     /* not a quickfix list */
-           {
-               /* The new window should use the supplied location list */
--              qf_free_all(curwin);
-               curwin->w_llist = qi;
-               qi->qf_refcount++;
-           }
-       }
+-/*ARGSUSED*/
+     int
+ mch_print_begin_page(str)
+-    char_u    *str;
++    char_u    *str UNUSED;
+ {
+     int               page_num[2];
  
-@@ -1607,24 +1610,28 @@ qf_jump(qi, dir, errornr, forceit)
-           {
-               if (wp->w_buffer->b_fnum == qf_ptr->qf_fnum)
-               {
-                   goto_tabpage_win(tp, wp);
-                   usable_win = 1;
--                  break;
-+                  goto win_found;
-               }
-           }
-       }
-+win_found:
+     prt_page_num++;
  
-       /*
-        * If there is only one window and it is the quickfix window, create a
-        * new one above the quickfix window.
-        */
-       if (((firstwin == lastwin) && bt_quickfix(curbuf)) || !usable_win)
-       {
-           ll_ref = curwin->w_llist_ref;
+@@ -3377,15 +3374,14 @@ mch_print_start_line(margin, page_line)
+ #ifdef FEAT_MBYTE
+     prt_half_width = FALSE;
+ #endif
+ }
  
--          if (win_split(0, WSP_ABOVE) == FAIL)
-+          flags = WSP_ABOVE;
-+          if (ll_ref != NULL)
-+              flags |= WSP_NEWLOC;
-+          if (win_split(0, flags) == FAIL)
-               goto failed;            /* not enough room for window */
-           opened_window = TRUE;       /* close it when fail */
-           p_swb = empty_option;       /* don't split again */
-           swb_flags = 0;
- # ifdef FEAT_SCROLLBIND
-@@ -1632,11 +1639,10 @@ qf_jump(qi, dir, errornr, forceit)
- # endif
-           if (ll_ref != NULL)
-           {
-               /* The new window should use the location list from the
-                * location list window */
--              qf_free_all(curwin);
-               curwin->w_llist = ll_ref;
-               ll_ref->qf_refcount++;
-           }
-       }
-       else
-@@ -1742,11 +1748,12 @@ qf_jump(qi, dir, errornr, forceit)
-               EMSG(_(e_nowrtmsg));
-               ok = FALSE;
-           }
-           else
-               ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1,
--                                                 ECMD_HIDE + ECMD_SET_HELP);
-+                                         ECMD_HIDE + ECMD_SET_HELP,
-+                                         oldwin == curwin ? curwin : NULL);
-       }
-       else
-           ok = buflist_getfile(qf_ptr->qf_fnum,
-                           (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
-     }
-@@ -1890,11 +1897,10 @@ qf_list(eap)
-     char_u    *fname;
-     qfline_T  *qfp;
-     int               i;
-     int               idx1 = 1;
-     int               idx2 = -1;
--    int               need_return = TRUE;
-     char_u    *arg = eap->arg;
-     int               all = eap->forceit;     /* if not :cl!, only show
-                                                  recognised errors */
-     qf_info_T *qi = &ql_info;
+-/*ARGSUSED*/
+     int
+ mch_print_text_out(p, len)
+     char_u    *p;
+-    int               len;
++    int               len UNUSED;
+ {
+     int               need_break;
+     char_u    ch;
+     char_u      ch_buff[8];
+     float       char_width;
+--- vim72.orig/src/if_cscope.c
++++ vim72/src/if_cscope.c
+@@ -44,11 +44,10 @@ static void            cs_file_results __ARGS((
+ static void       cs_fill_results __ARGS((char *, int , int *, char ***,
+                       char ***, int *));
+ static int        cs_find __ARGS((exarg_T *eap));
+ static int        cs_find_common __ARGS((char *opt, char *pat, int, int, int));
+ static int        cs_help __ARGS((exarg_T *eap));
+-static void       cs_init __ARGS((void));
+ static void       clear_csinfo __ARGS((int i));
+ static int        cs_insert_filelist __ARGS((char *, char *, char *,
+                       struct stat *));
+ static int        cs_kill __ARGS((exarg_T *eap));
+ static void       cs_kill_execute __ARGS((int, char *));
+@@ -64,52 +63,167 @@ static void           cs_release_csp __ARGS((i
+ static int        cs_reset __ARGS((exarg_T *eap));
+ static char *     cs_resolve_file __ARGS((int, char *));
+ static int        cs_show __ARGS((exarg_T *eap));
  
-@@ -1930,17 +1936,13 @@ qf_list(eap)
-     qfp = qi->qf_lists[qi->qf_curlist].qf_start;
-     for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; )
-     {
-       if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2)
-       {
--          if (need_return)
--          {
--              msg_putchar('\n');
--              if (got_int)
--                  break;
--              need_return = FALSE;
--          }
-+          msg_putchar('\n');
-+          if (got_int)
-+              break;
  
-           fname = NULL;
-           if (qfp->qf_fnum != 0
-                             && (buf = buflist_findnr(qfp->qf_fnum)) != NULL)
-           {
-@@ -1979,11 +1981,10 @@ qf_list(eap)
-           qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
-                                    ? skipwhite(qfp->qf_text) : qfp->qf_text,
-                                                             IObuff, IOSIZE);
-           msg_prt_line(IObuff, FALSE);
-           out_flush();                /* show one line at a time */
--          need_return = TRUE;
-       }
+-static csinfo_T           csinfo[CSCOPE_MAX_CONNECTIONS];
++static csinfo_T *   csinfo = NULL;
++static int        csinfo_size = 0;    /* number of items allocated in
++                                         csinfo[] */
++
+ static int        eap_arg_len;    /* length of eap->arg, set in
+                                      cs_lookup_cmd() */
+ static cscmd_T            cs_cmds[] =
+ {
+     { "add",  cs_add,
+               N_("Add a new database"),     "add file|dir [pre-path] [flags]", 0 },
+     { "find", cs_find,
+-              N_("Query for a pattern"),    FIND_USAGE, 1 },
++              N_("Query for a pattern"),    "find c|d|e|f|g|i|s|t name", 1 },
+     { "help", cs_help,
+               N_("Show this message"),      "help", 0 },
+     { "kill", cs_kill,
+               N_("Kill a connection"),      "kill #", 0 },
+     { "reset",        cs_reset,
+               N_("Reinit all connections"), "reset", 0 },
+     { "show", cs_show,
+               N_("Show connections"),       "show", 0 },
+-    { NULL }
++    { NULL, NULL, NULL, NULL, 0 }
+ };
  
-       qfp = qfp->qf_next;
-       ++i;
-       ui_breakcheck();
-@@ -2231,11 +2232,10 @@ ex_cwindow(eap)
+     static void
+ cs_usage_msg(x)
+     csid_e x;
+ {
+     (void)EMSG2(_("E560: Usage: cs[cope] %s"), cs_cmds[(int)x].usage);
+ }
  
++#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
++
++static enum
++{
++    EXP_CSCOPE_SUBCMD,        /* expand ":cscope" sub-commands */
++    EXP_SCSCOPE_SUBCMD,       /* expand ":scscope" sub-commands */
++    EXP_CSCOPE_FIND,  /* expand ":cscope find" arguments */
++    EXP_CSCOPE_KILL   /* expand ":cscope kill" arguments */
++} expand_what;
++
++/*
++ * Function given to ExpandGeneric() to obtain the cscope command
++ * expansion.
++ */
++    char_u *
++get_cscope_name(xp, idx)
++    expand_T  *xp UNUSED;
++    int               idx;
++{
++    int               current_idx;
++    int               i;
++
++    switch (expand_what)
++    {
++    case EXP_CSCOPE_SUBCMD:
++      /* Complete with sub-commands of ":cscope":
++       * add, find, help, kill, reset, show */
++      return (char_u *)cs_cmds[idx].name;
++    case EXP_SCSCOPE_SUBCMD:
++      /* Complete with sub-commands of ":scscope": same sub-commands as
++       * ":cscope" but skip commands which don't support split windows */
++      for (i = 0, current_idx = 0; cs_cmds[i].name != NULL; i++)
++          if (cs_cmds[i].cansplit)
++              if (current_idx++ == idx)
++                  break;
++      return (char_u *)cs_cmds[i].name;
++    case EXP_CSCOPE_FIND:
++      {
++          const char *query_type[] =
++          {
++              "c", "d", "e", "f", "g", "i", "s", "t", NULL
++          };
++
++          /* Complete with query type of ":cscope find {query_type}".
++           * {query_type} can be letters (c, d, ... t) or numbers (0, 1,
++           * ..., 8) but only complete with letters, since numbers are
++           * redundant. */
++          return (char_u *)query_type[idx];
++      }
++    case EXP_CSCOPE_KILL:
++      {
++          static char connection[5];
++
++          /* ":cscope kill" accepts connection numbers or partial names of
++           * the pathname of the cscope database as argument.  Only complete
++           * with connection numbers. -1 can also be used to kill all
++           * connections. */
++          for (i = 0, current_idx = 0; i < csinfo_size; i++)
++          {
++              if (csinfo[i].fname == NULL)
++                  continue;
++              if (current_idx++ == idx)
++              {
++                  vim_snprintf(connection, sizeof(connection), "%d", i);
++                  return (char_u *)connection;
++              }
++          }
++          return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL;
++      }
++    default:
++      return NULL;
++    }
++}
++
++/*
++ * Handle command line completion for :cscope command.
++ */
++    void
++set_context_in_cscope_cmd(xp, arg, cmdidx)
++    expand_T  *xp;
++    char_u    *arg;
++    cmdidx_T  cmdidx;
++{
++    char_u    *p;
++
++    /* Default: expand subcommands */
++    xp->xp_context = EXPAND_CSCOPE;
++    xp->xp_pattern = arg;
++    expand_what = (cmdidx == CMD_scscope)
++                      ? EXP_SCSCOPE_SUBCMD : EXP_CSCOPE_SUBCMD;
++
++    /* (part of) subcommand already typed */
++    if (*arg != NUL)
++    {
++      p = skiptowhite(arg);
++      if (*p != NUL)              /* past first word */
++      {
++          xp->xp_pattern = skipwhite(p);
++          if (*skiptowhite(xp->xp_pattern) != NUL)
++              xp->xp_context = EXPAND_NOTHING;
++          else if (STRNICMP(arg, "add", p - arg) == 0)
++              xp->xp_context = EXPAND_FILES;
++          else if (STRNICMP(arg, "kill", p - arg) == 0)
++              expand_what = EXP_CSCOPE_KILL;
++          else if (STRNICMP(arg, "find", p - arg) == 0)
++              expand_what = EXP_CSCOPE_FIND;
++          else
++              xp->xp_context = EXPAND_NOTHING;
++      }
++    }
++}
++
++#endif /* FEAT_CMDL_COMPL */
++
  /*
-  * ":cclose": close the window showing the list of errors.
-  * ":lclose": close the window showing the location list
+  * PRIVATE: do_cscope_general
+  *
+- * find the command, print help if invalid, and the then call the
+- * corresponding command function,
+- * called from do_cscope and do_scscope
++ * Find the command, print help if invalid, and then call the corresponding
++ * command function.
   */
--/*ARGSUSED*/
-     void
- ex_cclose(eap)
+     static void
+ do_cscope_general(eap, make_split)
      exarg_T   *eap;
+     int               make_split; /* whether to split window */
  {
-     win_T     *win = NULL;
-@@ -2265,10 +2265,11 @@ ex_copen(eap)
-     qf_info_T *qi = &ql_info;
-     int               height;
-     win_T     *win;
-     tabpage_T *prevtab = curtab;
-     buf_T     *qf_buf;
-+    win_T     *oldwin = curwin;
+     cscmd_T *cmdp;
  
-     if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
+-    cs_init();
+     if ((cmdp = cs_lookup_cmd(eap)) == NULL)
      {
-       qi = GET_LOC_LIST(curwin);
-       if (qi == NULL)
-@@ -2305,43 +2306,48 @@ ex_copen(eap)
-       win = curwin;
-       if (eap->cmdidx == CMD_copen || eap->cmdidx == CMD_cwindow)
-           /* Create the new window at the very bottom. */
-           win_goto(lastwin);
--      if (win_split(height, WSP_BELOW) == FAIL)
-+      if (win_split(height, WSP_BELOW | WSP_NEWLOC) == FAIL)
-           return;             /* not enough room for window */
- #ifdef FEAT_SCROLLBIND
-       curwin->w_p_scb = FALSE;
- #endif
+       cs_help(eap);
+       return;
+     }
+@@ -166,12 +280,10 @@ do_scscope(eap)
+ do_cstag(eap)
+     exarg_T *eap;
+ {
+     int ret = FALSE;
  
--      /* Remove the location list for the quickfix window */
--      qf_free_all(curwin);
+-    cs_init();
 -
-       if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
-       {
-           /*
-            * For the location list window, create a reference to the
-            * location list from the window 'win'.
-            */
-           curwin->w_llist_ref = win->w_llist;
-           win->w_llist->qf_refcount++;
-       }
-+      if (oldwin != curwin)
-+          oldwin = NULL;  /* don't store info when in another window */
-       if (qf_buf != NULL)
-           /* Use the existing quickfix buffer */
-           (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
--                                                   ECMD_HIDE + ECMD_OLDBUF);
-+                                           ECMD_HIDE + ECMD_OLDBUF, oldwin);
-       else
-       {
-           /* Create a new quickfix buffer */
--          (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
-+          (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin);
-           /* switch off 'swapfile' */
-           set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
-           set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
-                                                                  OPT_LOCAL);
-           set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
--          set_option_value((char_u *)"diff", 0L, NULL, OPT_LOCAL);
-+#ifdef FEAT_DIFF
-+          curwin->w_p_diff = FALSE;
-+#endif
-+#ifdef FEAT_FOLDING
-+          set_option_value((char_u *)"fdm", 0L, (char_u *)"manual",
-+                                                                 OPT_LOCAL);
-+#endif
-       }
-       /* Only set the height when still in the same tab page and there is no
-        * window to the side. */
-       if (curtab == prevtab
-@@ -2598,14 +2604,16 @@ qf_fill_buffer(qi)
-      * autocommands. */
-     set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL);
-     curbuf->b_p_ma = FALSE;
- #ifdef FEAT_AUTOCMD
-+    keep_filetype = TRUE;             /* don't detect 'filetype' */
-     apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
-                                                              FALSE, curbuf);
-     apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL,
-                                                              FALSE, curbuf);
-+    keep_filetype = FALSE;
- #endif
-     /* make sure it will be redrawn */
-     redraw_curbuf_later(NOT_VALID);
-@@ -2757,11 +2765,11 @@ ex_make(eap)
-     if (cmd == NULL)
+     if (*eap->arg == NUL)
+     {
+       (void)EMSG(_("E562: Usage: cstag <ident>"));
        return;
-     sprintf((char *)cmd, "%s%s%s", (char *)p_shq, (char *)eap->arg,
-                                                              (char *)p_shq);
-     if (*p_sp != NUL)
--      append_redir(cmd, p_sp, fname);
-+      append_redir(cmd, len, p_sp, fname);
-     /*
-      * Output a newline if there's something else than the :make command that
-      * was typed (in which case the cursor is in column 0).
-      */
-     if (msg_col == 0)
-@@ -3194,11 +3202,11 @@ ex_vimgrep(eap)
-                   if ((flags & VGR_GLOBAL) == 0
-                                              || regmatch.endpos[0].lnum > 0)
-                       break;
-                   col = regmatch.endpos[0].col
-                                           + (col == regmatch.endpos[0].col);
--                  if (col > STRLEN(ml_get_buf(buf, lnum, FALSE)))
-+                  if (col > (colnr_T)STRLEN(ml_get_buf(buf, lnum, FALSE)))
-                       break;
-               }
-               line_breakcheck();
-               if (got_int)
-                   break;
-@@ -3395,18 +3403,19 @@ load_dummy_buffer(fname)
-       return NULL;
-     /* Init the options. */
-     buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP);
--    /* set curwin/curbuf to buf and save a few things */
--    aucmd_prepbuf(&aco, newbuf);
-+    /* need to open the memfile before putting the buffer in a window */
-+    if (ml_open(newbuf) == OK)
-+    {
-+      /* set curwin/curbuf to buf and save a few things */
-+      aucmd_prepbuf(&aco, newbuf);
--    /* Need to set the filename for autocommands. */
--    (void)setfname(curbuf, fname, NULL, FALSE);
-+      /* Need to set the filename for autocommands. */
-+      (void)setfname(curbuf, fname, NULL, FALSE);
+     }
+@@ -323,11 +435,11 @@ cs_connection(num, dbpath, ppath)
+     int i;
  
--    if (ml_open(curbuf) == OK)
--    {
-       /* Create swap file now to avoid the ATTENTION message. */
-       check_need_swap(TRUE);
+     if (num < 0 || num > 4 || (num > 0 && !dbpath))
+       return FALSE;
  
-       /* Remove the "dummy" flag, otherwise autocommands may not
-        * work. */
-@@ -3425,14 +3434,14 @@ load_dummy_buffer(fname)
-               if (buf_valid(newbuf))
-                   wipe_buffer(newbuf, FALSE);
-               newbuf = curbuf;
-           }
-       }
--    }
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
+     {
+       if (!csinfo[i].fname)
+           continue;
  
--    /* restore curwin/curbuf and a few other things */
--    aucmd_restbuf(&aco);
-+      /* restore curwin/curbuf and a few other things */
-+      aucmd_restbuf(&aco);
-+    }
+       if (num == 0)
+@@ -377,14 +489,13 @@ cs_connection(num, dbpath, ppath)
+  * add cscope database or a directory name (to look for cscope.out)
+  * to the cscope connection list
+  *
+  * MAXPATHL 256
+  */
+-/* ARGSUSED */
+     static int
+ cs_add(eap)
+-    exarg_T *eap;
++    exarg_T *eap UNUSED;
+ {
+     char *fname, *ppath, *flags = NULL;
  
-     if (!buf_valid(newbuf))
-       return NULL;
-     if (failed)
+     if ((fname = strtok((char *)NULL, (const char *)" ")) == NULL)
      {
---- vim72.orig/src/window.c
-+++ vim72/src/window.c
-@@ -9,24 +9,24 @@
- #include "vim.h"
+@@ -567,11 +678,11 @@ cs_check_for_tags()
+ cs_cnt_connections()
+ {
+     short i;
+     short cnt = 0;
  
- static int path_is_url __ARGS((char_u *p));
- #if defined(FEAT_WINDOWS) || defined(PROTO)
--static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
--static void win_init __ARGS((win_T *newp, win_T *oldp));
-+static void win_init __ARGS((win_T *newp, win_T *oldp, int flags));
-+static void win_init_some __ARGS((win_T *newp, win_T *oldp));
- static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col));
- static void frame_setheight __ARGS((frame_T *curfrp, int height));
- #ifdef FEAT_VERTSPLIT
- static void frame_setwidth __ARGS((frame_T *curfrp, int width));
- #endif
- static void win_exchange __ARGS((long));
- static void win_rotate __ARGS((int, int));
- static void win_totop __ARGS((int size, int flags));
- static void win_equal_rec __ARGS((win_T *next_curwin, int current, frame_T *topfr, int dir, int col, int row, int width, int height));
- static int last_window __ARGS((void));
-+static int one_window __ARGS((void));
- static win_T *win_free_mem __ARGS((win_T *win, int *dirp, tabpage_T *tp));
--static win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));
- static frame_T *win_altframe __ARGS((win_T *win, tabpage_T *tp));
- static tabpage_T *alt_tabpage __ARGS((void));
- static win_T *frame2win __ARGS((frame_T *frp));
- static int frame_has_win __ARGS((frame_T *frp, win_T *wp));
- static void frame_new_height __ARGS((frame_T *topfrp, int height, int topfirst, int wfh));
-@@ -39,20 +39,19 @@ static void frame_add_vsep __ARGS((frame
- static int frame_minwidth __ARGS((frame_T *topfrp, win_T *next_curwin));
- static void frame_fix_width __ARGS((win_T *wp));
- #endif
- #endif
- static int win_alloc_firstwin __ARGS((win_T *oldwin));
-+static void new_frame __ARGS((win_T *wp));
- #if defined(FEAT_WINDOWS) || defined(PROTO)
- static tabpage_T *alloc_tabpage __ARGS((void));
- static int leave_tabpage __ARGS((buf_T *new_curbuf));
- static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf));
- static void frame_fix_height __ARGS((win_T *wp));
- static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin));
- static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin));
- static void win_free __ARGS((win_T *wp, tabpage_T *tp));
--static void win_append __ARGS((win_T *, win_T *));
--static void win_remove __ARGS((win_T *, tabpage_T *tp));
- static void frame_append __ARGS((frame_T *after, frame_T *frp));
- static void frame_insert __ARGS((frame_T *before, frame_T *frp));
- static void frame_remove __ARGS((frame_T *frp));
- #ifdef FEAT_VERTSPLIT
- static void win_new_width __ARGS((win_T *wp, int width));
-@@ -60,21 +59,19 @@ static void win_goto_ver __ARGS((int up,
- static void win_goto_hor __ARGS((int left, long count));
- #endif
- static void frame_add_height __ARGS((frame_T *frp, int n));
- static void last_status_rec __ARGS((frame_T *fr, int statusline));
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
+     {
+       if (csinfo[i].fname != NULL)
+           cnt++;
+     }
+     return cnt;
+@@ -657,10 +768,11 @@ cs_create_cmd(csoption, pattern)
+     char *csoption;
+     char *pattern;
+ {
+     char *cmd;
+     short search;
++    char *pat;
  
--static void make_snapshot __ARGS((void));
- static void make_snapshot_rec __ARGS((frame_T *fr, frame_T **frp));
--static void clear_snapshot __ARGS((tabpage_T *tp));
-+static void clear_snapshot __ARGS((tabpage_T *tp, int idx));
- static void clear_snapshot_rec __ARGS((frame_T *fr));
--static void restore_snapshot __ARGS((int close_curwin));
- static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
- static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
+     switch (csoption[0])
+     {
+     case '0' : case 's' :
+       search = 0;
+@@ -690,14 +802,21 @@ cs_create_cmd(csoption, pattern)
+       (void)EMSG(_("E561: unknown cscope search type"));
+       cs_usage_msg(Find);
+       return NULL;
+     }
  
- #endif /* FEAT_WINDOWS */
+-    if ((cmd = (char *)alloc((unsigned)(strlen(pattern) + 2))) == NULL)
++    /* Skip white space before the patter, except for text and pattern search,
++     * they may want to use the leading white space. */
++    pat = pattern;
++    if (search != 4 && search != 6)
++      while vim_iswhite(*pat)
++          ++pat;
++
++    if ((cmd = (char *)alloc((unsigned)(strlen(pat) + 2))) == NULL)
+       return NULL;
  
--static win_T *win_alloc __ARGS((win_T *after));
-+static win_T *win_alloc __ARGS((win_T *after, int hidden));
- static void win_new_height __ARGS((win_T *, int));
+-    (void)sprintf(cmd, "%d%s", search, pattern);
++    (void)sprintf(cmd, "%d%s", search, pat);
  
- #define URL_SLASH     1               /* path_is_url() has found "://" */
#define URL_BACKSLASH 2               /* path_is_url() has found ":\\" */
+     return cmd;
} /* cs_create_cmd */
  
-@@ -257,11 +254,11 @@ newwindow:
-     case Ctrl_W:
-     case 'w':
- /* cursor to previous window with wrap around */
-     case 'W':
-               CHECK_CMDWIN
--              if (lastwin == firstwin && Prenum != 1) /* just one window */
-+              if (firstwin == lastwin && Prenum != 1) /* just one window */
-                   beep_flush();
-               else
-               {
-                   if (Prenum)                 /* go to specified window */
-                   {
-@@ -341,11 +338,11 @@ newwindow:
-               break;
- #endif
  
- /* move window to new tab page */
-     case 'T':
--              if (firstwin == lastwin)
-+              if (one_window())
-                   MSG(_(m_onlyone));
-               else
-               {
-                   tabpage_T   *oldtab = curtab;
-                   tabpage_T   *newtab;
-@@ -529,11 +526,12 @@ wingotofile:
-                   if (win_split(0, 0) == OK)
-                   {
- # ifdef FEAT_SCROLLBIND
-                       curwin->w_p_scb = FALSE;
+@@ -867,11 +986,11 @@ err_closing:
+       vim_free(prog);
  # endif
--                      (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, ECMD_HIDE);
-+                      (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL,
-+                                                         ECMD_HIDE, NULL);
-                       if (nchar == 'F' && lnum >= 0)
-                       {
-                           curwin->w_cursor.lnum = lnum;
-                           check_cursor_lnum();
-                           beginline(BL_SOL | BL_FIX);
-@@ -591,13 +589,11 @@ wingotofile:
- #endif
-               ++no_mapping;
-               ++allow_keys;   /* no mapping for xchar, but allow key codes */
-               if (xchar == NUL)
-                   xchar = plain_vgetc();
--#ifdef FEAT_LANGMAP
-               LANGMAP_ADJUST(xchar, TRUE);
--#endif
-               --no_mapping;
-               --allow_keys;
- #ifdef FEAT_CMDL_INFO
-               (void)add_to_showcmd(xchar);
- #endif
-@@ -628,11 +624,11 @@ wingotofile:
-                       break;
+       vim_free(ppath);
  
- #ifdef FEAT_SEARCHPATH
-                   case 'f':       /* CTRL-W gf: "gf" in a new tab page */
-                   case 'F':       /* CTRL-W gF: "gF" in a new tab page */
--                      cmdmod.tab = TRUE;
-+                      cmdmod.tab = tabpage_index(curtab) + 1;
-                       nchar = xchar;
-                       goto wingotofile;
- #endif
-                   default:
-                       beep_flush();
-@@ -678,24 +674,24 @@ win_split(size, flags)
-     }
+ #if defined(UNIX)
+-      if (execl("/bin/sh", "sh", "-c", cmd, NULL) == -1)
++      if (execl("/bin/sh", "sh", "-c", cmd, (char *)NULL) == -1)
+           PERROR(_("cs_create_connection exec failed"));
  
-     /* When creating the help window make a snapshot of the window layout.
-      * Otherwise clear the snapshot, it's now invalid. */
-     if (flags & WSP_HELP)
--      make_snapshot();
-+      make_snapshot(SNAP_HELP_IDX);
-     else
--      clear_snapshot(curtab);
-+      clear_snapshot(curtab, SNAP_HELP_IDX);
+       exit(127);
+       /* NOTREACHED */
+     default:  /* parent. */
+@@ -987,28 +1106,33 @@ cs_find_common(opt, pat, forceit, verbos
+     int verbose;
+     int       use_ll;
+ {
+     int i;
+     char *cmd;
+-    int nummatches[CSCOPE_MAX_CONNECTIONS], totmatches;
++    int *nummatches;
++    int totmatches;
+ #ifdef FEAT_QUICKFIX
+     char cmdletter;
+     char *qfpos;
+ #endif
  
-     return win_split_ins(size, flags, NULL, 0);
- }
+     /* create the actual command to send to cscope */
+     cmd = cs_create_cmd(opt, pat);
+     if (cmd == NULL)
+       return FALSE;
  
- /*
-  * When "newwin" is NULL: split the current window in two.
-  * When "newwin" is not NULL: insert this window at the far
-  * top/left/right/bottom.
-  * return FAIL for failure, OK otherwise
-  */
--    static int
-+    int
- win_split_ins(size, flags, newwin, dir)
-     int               size;
-     int               flags;
-     win_T     *newwin;
-     int               dir;
-@@ -892,29 +888,36 @@ win_split_ins(size, flags, newwin, dir)
- #endif
-                       p_sb))))
-     {
-       /* new window below/right of current one */
-       if (newwin == NULL)
--          wp = win_alloc(oldwin);
-+          wp = win_alloc(oldwin, FALSE);
-       else
-           win_append(oldwin, wp);
-     }
-     else
++    nummatches = (int *)alloc(sizeof(int)*csinfo_size);
++    if (nummatches == NULL)
++      return FALSE;
++
+     /* send query to all open connections, then count the total number
+      * of matches so we can alloc matchesp all in one swell foop
+      */
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
+       nummatches[i] = 0;
+     totmatches = 0;
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
      {
-       if (newwin == NULL)
--          wp = win_alloc(oldwin->w_prev);
-+          wp = win_alloc(oldwin->w_prev, FALSE);
-       else
-           win_append(oldwin->w_prev, wp);
-     }
+       if (csinfo[i].fname == NULL || csinfo[i].to_fp == NULL)
+           continue;
  
-     if (newwin == NULL)
+       /* send cmd to cscope */
+@@ -1029,21 +1153,25 @@ cs_find_common(opt, pat, forceit, verbos
      {
-       if (wp == NULL)
-           return FAIL;
+       char *nf = _("E259: no matches found for cscope query %s of %s");
+       char *buf;
  
-+      new_frame(wp);
-+      if (wp->w_frame == NULL)
+       if (!verbose)
 +      {
-+          win_free(wp, NULL);
-+          return FAIL;
++          vim_free(nummatches);
+           return FALSE;
 +      }
-+
-       /* make the contents of the new window the same as the current one */
--      win_init(wp, curwin);
-+      win_init(wp, curwin, flags);
-     }
  
-     /*
-      * Reorganise the tree of frames to insert the new window.
-      */
-@@ -969,17 +972,11 @@ win_split_ins(size, flags, newwin, dir)
-           for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next)
-               frp->fr_parent = curfrp;
+       buf = (char *)alloc((unsigned)(strlen(opt) + strlen(pat) + strlen(nf)));
+       if (buf == NULL)
+           (void)EMSG(nf);
+       else
+       {
+           sprintf(buf, nf, opt, pat);
+           (void)EMSG(buf);
+           vim_free(buf);
+       }
++      vim_free(nummatches);
+       return FALSE;
      }
  
-     if (newwin == NULL)
--    {
--      /* Create a frame for the new window. */
--      frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
--      frp->fr_layout = FR_LEAF;
--      frp->fr_win = wp;
--      wp->w_frame = frp;
--    }
-+      frp = wp->w_frame;
+ #ifdef FEAT_QUICKFIX
+     /* get cmd letter */
+@@ -1092,10 +1220,11 @@ cs_find_common(opt, pat, forceit, verbos
+           {
+               sprintf(buf, nf, *qfpos, *(qfpos-1));
+               (void)EMSG(buf);
+               vim_free(buf);
+           }
++          vim_free(nummatches);
+           return FALSE;
+       }
+     }
+     if (qfpos != NULL && *qfpos != '0' && totmatches > 0)
+     {
+@@ -1139,10 +1268,11 @@ cs_find_common(opt, pat, forceit, verbos
+               qf_jump(qi, 0, 0, forceit);
+           }
+       }
+       mch_remove(tmp);
+       vim_free(tmp);
++      vim_free(nummatches);
+       return TRUE;
+     }
      else
-       frp = newwin->w_frame;
-     frp->fr_parent = curfrp->fr_parent;
+ #endif /* FEAT_QUICKFIX */
+     {
+@@ -1150,10 +1280,11 @@ cs_find_common(opt, pat, forceit, verbos
+       int matched = 0;
  
-     /* Insert the new frame at the right place in the frame list. */
-@@ -1155,19 +1152,23 @@ win_split_ins(size, flags, newwin, dir)
-       p_wh = i;
+       /* read output */
+       cs_fill_results((char *)pat, totmatches, nummatches, &matches,
+                                                        &contexts, &matched);
++      vim_free(nummatches);
+       if (matches == NULL)
+           return FALSE;
  
-     return OK;
- }
+       (void)cs_manage_matches(matches, contexts, matched, Store);
  
-+
+@@ -1165,52 +1296,48 @@ cs_find_common(opt, pat, forceit, verbos
  /*
-  * Initialize window "newp" from window "oldp".
-  * Used when splitting a window and when creating a new tab page.
-  * The windows will both edit the same buffer.
-+ * WSP_NEWLOC may be specified in flags to prevent the location list from
-+ * being copied.
+  * PRIVATE: cs_help
+  *
+  * print help
   */
-     static void
--win_init(newp, oldp)
-+win_init(newp, oldp, flags)
-     win_T     *newp;
-     win_T     *oldp;
-+    int                flags UNUSED;
+-/* ARGSUSED */
+     static int
+ cs_help(eap)
+-    exarg_T *eap;
++    exarg_T *eap UNUSED;
  {
-     int               i;
-     newp->w_buffer = oldp->w_buffer;
-     oldp->w_buffer->b_nwindows++;
-@@ -1188,36 +1189,55 @@ win_init(newp, oldp)
-     newp->w_prev_fraction_row = oldp->w_prev_fraction_row;
- #ifdef FEAT_JUMPLIST
-     copy_jumplist(oldp, newp);
- #endif
- #ifdef FEAT_QUICKFIX
--    copy_loclist(oldp, newp);
-+    if (flags & WSP_NEWLOC)
-+    {
-+      /* Don't copy the location list.  */
-+      newp->w_llist = NULL;
-+      newp->w_llist_ref = NULL;
-+    }
-+    else
-+      copy_loclist(oldp, newp);
- #endif
-     if (oldp->w_localdir != NULL)
-       newp->w_localdir = vim_strsave(oldp->w_localdir);
+     cscmd_T *cmdp = cs_cmds;
  
--    /* Use the same argument list. */
--    newp->w_alist = oldp->w_alist;
--    ++newp->w_alist->al_refcount;
--    newp->w_arg_idx = oldp->w_arg_idx;
--
--    /*
--     * copy tagstack and options from existing window
--     */
-+    /* copy tagstack and folds */
-     for (i = 0; i < oldp->w_tagstacklen; i++)
+     (void)MSG_PUTS(_("cscope commands:\n"));
+     while (cmdp->name != NULL)
      {
-       newp->w_tagstack[i] = oldp->w_tagstack[i];
-       if (newp->w_tagstack[i].tagname != NULL)
-           newp->w_tagstack[i].tagname =
-                                  vim_strsave(newp->w_tagstack[i].tagname);
-     }
-     newp->w_tagstackidx = oldp->w_tagstackidx;
-     newp->w_tagstacklen = oldp->w_tagstacklen;
--    win_copy_options(oldp, newp);
- # ifdef FEAT_FOLDING
-     copyFoldingState(oldp, newp);
- # endif
-+
-+    win_init_some(newp, oldp);
-+}
+-      (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"),
+-                                    cmdp->name, _(cmdp->help), cmdp->usage);
++      char *help = _(cmdp->help);
++      int  space_cnt = 30 - vim_strsize((char_u *)help);
 +
-+/*
-+ * Initialize window "newp" from window"old".
-+ * Only the essential things are copied.
-+ */
-+    static void
-+win_init_some(newp, oldp)
-+    win_T     *newp;
-+    win_T     *oldp;
-+{
-+    /* Use the same argument list. */
-+    newp->w_alist = oldp->w_alist;
-+    ++newp->w_alist->al_refcount;
-+    newp->w_arg_idx = oldp->w_arg_idx;
++      /* Use %*s rather than %30s to ensure proper alignment in utf-8 */
++      if (space_cnt < 0)
++          space_cnt = 0;
++      (void)smsg((char_u *)_("%-5s: %s%*s (Usage: %s)"),
++                                    cmdp->name,
++                                    help, space_cnt, " ",
++                                    cmdp->usage);
+       if (strcmp(cmdp->name, "find") == 0)
+-          MSG_PUTS(FIND_HELP);
++          MSG_PUTS(_("\n"
++                     "       c: Find functions calling this function\n"
++                     "       d: Find functions called by this function\n"
++                     "       e: Find this egrep pattern\n"
++                     "       f: Find this file\n"
++                     "       g: Find this definition\n"
++                     "       i: Find files #including this file\n"
++                     "       s: Find this C symbol\n"
++                     "       t: Find assignments to\n"));
 +
-+    /* copy options from existing window */
-+    win_copy_options(oldp, newp);
- }
+       cmdp++;
+     }
  
- #endif /* FEAT_WINDOWS */
+     wait_return(TRUE);
+     return 0;
+ } /* cs_help */
  
- #if defined(FEAT_WINDOWS) || defined(PROTO)
-@@ -1256,15 +1276,14 @@ win_count()
-  * Make "count" windows on the screen.
-  * Return actual number of windows on the screen.
-  * Must be called when there is just one window, filling the whole screen
-  * (excluding the command line).
+-/*
+- * PRIVATE: cs_init
+- *
+- * initialize cscope structure if not already
+- */
+-    static void
+-cs_init()
+-{
+-    short i;
+-    static int init_already = FALSE;
+-
+-    if (init_already)
+-      return;
+-
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
+-      clear_csinfo(i);
+-
+-    init_already = TRUE;
+-} /* cs_init */
+-
+     static void
+ clear_csinfo(i)
+     int           i;
+ {
+     csinfo[i].fname  = NULL;
+@@ -1255,17 +1382,16 @@ GetWin32Error()
+ /*
+  * PRIVATE: cs_insert_filelist
+  *
+  * insert a new cscope database filename into the filelist
   */
 -/*ARGSUSED*/
-     int
- make_windows(count, vertical)
-     int               count;
--    int               vertical;       /* split windows vertically if TRUE */
-+    int               vertical UNUSED;  /* split windows vertically if TRUE */
+     static int
+ cs_insert_filelist(fname, ppath, flags, sb)
+     char *fname;
+     char *ppath;
+     char *flags;
+-    struct stat *sb;
++    struct stat *sb UNUSED;
  {
-     int               maxcount;
-     int               todo;
+     short     i, j;
+ #ifndef UNIX
+     HANDLE    hFile;
+     BY_HANDLE_FILE_INFORMATION bhfi;
+@@ -1304,11 +1430,11 @@ cs_insert_filelist(fname, ppath, flags,
+       CloseHandle(hFile);
+     }
+ #endif
  
- #ifdef FEAT_VERTSPLIT
-@@ -1555,19 +1574,12 @@ win_totop(size, flags)
+     i = -1; /* can be set to the index of an empty item in csinfo */
+-    for (j = 0; j < CSCOPE_MAX_CONNECTIONS; j++)
++    for (j = 0; j < csinfo_size; j++)
+     {
+       if (csinfo[j].fname != NULL
+ #if defined(UNIX)
+           && csinfo[j].st_dev == sb->st_dev && csinfo[j].st_ino == sb->st_ino
+ #else
+@@ -1331,13 +1457,29 @@ cs_insert_filelist(fname, ppath, flags,
+           i = j; /* remember first empty entry */
      }
  
- #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
-     /* When 'guioptions' includes 'L' or 'R' may have to remove or add
-      * scrollbars.  Have to update them anyway. */
--    if (gui.in_use)
--    {
--      out_flush();
--      gui_init_which_components(NULL);
--      gui_update_scrollbars(TRUE);
--    }
--    need_mouse_correct = TRUE;
-+    gui_may_update_scrollbars();
- #endif
--
- }
+     if (i == -1)
+     {
+-      if (p_csverbose)
+-          (void)EMSG(_("E569: maximum number of cscope connections reached"));
+-      return -1;
++      i = csinfo_size;
++      if (csinfo_size == 0)
++      {
++          /* First time allocation: allocate only 1 connection. It should
++           * be enough for most users.  If more is needed, csinfo will be
++           * reallocated. */
++          csinfo_size = 1;
++          csinfo = (csinfo_T *)alloc_clear(sizeof(csinfo_T));
++      }
++      else
++      {
++          /* Reallocate space for more connections. */
++          csinfo_size *= 2;
++          csinfo = vim_realloc(csinfo, sizeof(csinfo_T)*csinfo_size);
++      }
++      if (csinfo == NULL)
++          return -1;
++      for (j = csinfo_size/2; j < csinfo_size; j++)
++          clear_csinfo(j);
+     }
  
- /*
-  * Move window "win1" to below/right of "win2" and make "win1" the current
-  * window.  Only works within the same frame!
-@@ -2038,17 +2050,44 @@ close_windows(buf, keep_curwin)
-     if (h != tabline_height())
-       shell_new_rows();
- }
+     if ((csinfo[i].fname = (char *)alloc((unsigned)strlen(fname)+1)) == NULL)
+       return -1;
  
+@@ -1417,14 +1559,13 @@ cs_lookup_cmd(eap)
  /*
-- * Return TRUE if the current window is the only window that exists.
-+ * Return TRUE if the current window is the only window that exists (ignoring
-+ * "aucmd_win").
-  * Returns FALSE if there is a window, possibly in another tab page.
+  * PRIVATE: cs_kill
+  *
+  * nuke em
   */
+-/* ARGSUSED */
      static int
- last_window()
+ cs_kill(eap)
+-    exarg_T *eap;
++    exarg_T *eap UNUSED;
  {
--    return (lastwin == firstwin && first_tabpage->tp_next == NULL);
-+    return (one_window() && first_tabpage->tp_next == NULL);
-+}
-+
-+/*
-+ * Return TRUE if there is only one window other than "aucmd_win" in the
-+ * current tab page.
-+ */
-+    static int
-+one_window()
-+{
-+#ifdef FEAT_AUTOCMD
-+    win_T     *wp;
-+    int               seen_one = FALSE;
-+
-+    FOR_ALL_WINDOWS(wp)
-+    {
-+      if (wp != aucmd_win)
-+      {
-+          if (seen_one)
-+              return FALSE;
-+          seen_one = TRUE;
-+      }
-+    }
-+    return TRUE;
-+#else
-+    return firstwin == lastwin;
-+#endif
- }
+     char *stok;
+     short i;
  
- /*
-  * Close window "win".  Only works for the current tab page.
-  * If "free_buf" is TRUE related buffer may be unloaded.
-@@ -2073,10 +2112,23 @@ win_close(win, free_buf)
+     if ((stok = strtok((char *)NULL, (const char *)" ")) == NULL)
+@@ -1441,28 +1582,27 @@ cs_kill(eap)
+     else
      {
-       EMSG(_("E444: Cannot close last window"));
-       return;
+       /* It must be part of a name.  We will try to find a match
+        * within all the names in the csinfo data structure
+        */
+-      for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++      for (i = 0; i < csinfo_size; i++)
+       {
+           if (csinfo[i].fname != NULL && strstr(csinfo[i].fname, stok))
+               break;
+       }
      }
  
-+#ifdef FEAT_AUTOCMD
-+    if (win == aucmd_win)
-+    {
-+      EMSG(_("E813: Cannot close autocmd window"));
-+      return;
-+    }
-+    if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window())
-+    {
-+      EMSG(_("E814: Cannot close window, only autocmd window would remain"));
-+      return;
-+    }
-+#endif
-+
-     /*
-      * When closing the last window in a tab page first go to another tab
-      * page and then close the window and the tab page.  This avoids that
-      * curwin and curtab are not invalid while we are freeing memory, they may
-      * be used in GUI events.
-@@ -2102,11 +2154,11 @@ win_close(win, free_buf)
-     /* When closing the help window, try restoring a snapshot after closing
-      * the window.  Otherwise clear the snapshot, it's now invalid. */
-     if (win->w_buffer->b_help)
-       help_window = TRUE;
+-    if ((i >= CSCOPE_MAX_CONNECTIONS || i < -1 || csinfo[i].fname == NULL)
+-          && i != -1)
++    if ((i != -1) && (i >= csinfo_size || i < -1 || csinfo[i].fname == NULL))
+     {
+       if (p_csverbose)
+           (void)EMSG2(_("E261: cscope connection %s not found"), stok);
+     }
      else
--      clear_snapshot(curtab);
-+      clear_snapshot(curtab, SNAP_HELP_IDX);
+     {
+       if (i == -1)
+       {
+-          for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++          for (i = 0; i < csinfo_size; i++)
+           {
+               if (csinfo[i].fname)
+                   cs_kill_execute(i, csinfo[i].fname);
+           }
+       }
+@@ -1718,11 +1858,11 @@ cs_file_results(f, nummatches_a)
  
- #ifdef FEAT_AUTOCMD
-     if (win == curwin)
+     buf = (char *)alloc(CSREAD_BUFSIZE);
+     if (buf == NULL)
+       return;
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
      {
-       /*
-@@ -2219,11 +2271,11 @@ win_close(win, free_buf)
-     last_status(FALSE);
+       if (nummatches_a[i] < 1)
+           continue;
  
-     /* After closing the help window, try restoring the window layout from
-      * before it was opened. */
-     if (help_window)
--      restore_snapshot(close_curwin);
-+      restore_snapshot(SNAP_HELP_IDX, close_curwin);
+       for (j = 0; j < nummatches_a[i]; j++)
+@@ -1790,11 +1930,11 @@ cs_fill_results(tagstr, totmatches, numm
+     if ((matches = (char **)alloc(sizeof(char *) * totmatches)) == NULL)
+       goto parse_out;
+     if ((cntxts = (char **)alloc(sizeof(char *) * totmatches)) == NULL)
+       goto parse_out;
  
- #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
-     /* When 'guioptions' includes 'L' or 'R' may have to remove scrollbars. */
-     if (gui.in_use && !win_hasvertsplit())
-       gui_init_which_components(NULL);
-@@ -2300,17 +2352,10 @@ win_free_mem(win, dirp, tp)
-     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
- {
-     frame_T   *frp;
-     win_T     *wp;
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
+     {
+       if (nummatches_a[i] < 1)
+           continue;
  
--#ifdef FEAT_FOLDING
--    clearFolding(win);
--#endif
--
--    /* reduce the reference count to the argument list. */
--    alist_unlink(win->w_alist);
--
-     /* Remove the window and its frame from the tree of frames. */
-     frp = win->w_frame;
-     wp = winframe_remove(win, dirp, tp);
-     vim_free(frp);
-     win_free(win, tp);
-@@ -2332,24 +2377,31 @@ win_free_all()
- # ifdef FEAT_WINDOWS
-     while (first_tabpage->tp_next != NULL)
-       tabpage_close(TRUE);
- # endif
+       for (j = 0; j < nummatches_a[i]; j++)
+@@ -1927,11 +2067,11 @@ cs_print_tags_priv(matches, cntxts, num_
+        */
+       if ((tbuf = (char *)alloc((unsigned)strlen(matches[idx]) + 1)) == NULL)
+           continue;
+       (void)strcpy(tbuf, matches[idx]);
  
-+# ifdef FEAT_AUTOCMD
-+    if (aucmd_win != NULL)
-+    {
-+      (void)win_free_mem(aucmd_win, &dummy, NULL);
-+      aucmd_win = NULL;
-+    }
-+# endif
-+
-     while (firstwin != NULL)
-       (void)win_free_mem(firstwin, &dummy, NULL);
- }
- #endif
+-      if ((fname = strtok(tbuf, (const char *)"\t")) == NULL)
++      if (strtok(tbuf, (const char *)"\t") == NULL)
+           continue;
+       if ((fname = strtok(NULL, (const char *)"\t")) == NULL)
+           continue;
+       if ((lno = strtok(NULL, (const char *)"\t")) == NULL)
+           continue;
+@@ -2097,11 +2237,10 @@ cs_read_prompt(i)
  
+ #if defined(UNIX) && defined(SIGALRM)
  /*
-  * Remove a window and its frame from the tree of frames.
-  * Returns a pointer to the window that got the freed up space.
+  * Used to catch and ignore SIGALRM below.
   */
--/*ARGSUSED*/
--    static win_T *
-+    win_T *
- winframe_remove(win, dirp, tp)
-     win_T     *win;
--    int               *dirp;          /* set to 'v' or 'h' for direction if 'ea' */
-+    int               *dirp UNUSED;   /* set to 'v' or 'h' for direction if 'ea' */
-     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
+-/* ARGSUSED */
+     static RETSIGTYPE
+ sig_handler SIGDEFARG(sigarg)
  {
-     frame_T   *frp, *frp2, *frp3;
-     frame_T   *frp_close = win->w_frame;
-     win_T     *wp;
-@@ -3081,11 +3133,11 @@ close_others(message, forceit)
+     /* do nothing */
+     SIGRETURN;
+@@ -2137,11 +2276,15 @@ cs_release_csp(i, freefnpp)
+       struct sigaction sa, old;
+       /* Use sigaction() to limit the waiting time to two seconds. */
+       sigemptyset(&sa.sa_mask);
+       sa.sa_handler = sig_handler;
++#  ifdef SA_NODEFER
+       sa.sa_flags = SA_NODEFER;
++#  else
++      sa.sa_flags = 0;
++#  endif
+       sigaction(SIGALRM, &sa, &old);
+       alarm(2); /* 2 sec timeout */
+       /* Block until cscope exits or until timer expires */
+       pid = waitpid(csinfo[i].pid, &pstat, 0);
+@@ -2237,42 +2380,44 @@ cs_release_csp(i, freefnpp)
+ /*
+  * PRIVATE: cs_reset
+  *
+  * calls cs_kill on all cscope connections then reinits
+  */
+-/* ARGSUSED */
+     static int
+ cs_reset(eap)
+-    exarg_T *eap;
++    exarg_T *eap UNUSED;
  {
-     win_T     *wp;
-     win_T     *nextwp;
-     int               r;
+     char      **dblist = NULL, **pplist = NULL, **fllist = NULL;
+     int       i;
+     char buf[20]; /* for sprintf " (#%d)" */
  
--    if (lastwin == firstwin)
-+    if (one_window())
++    if (csinfo_size == 0)
++      return CSCOPE_SUCCESS;
++
+     /* malloc our db and ppath list */
+-    dblist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
+-    pplist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
+-    fllist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
++    dblist = (char **)alloc(csinfo_size * sizeof(char *));
++    pplist = (char **)alloc(csinfo_size * sizeof(char *));
++    fllist = (char **)alloc(csinfo_size * sizeof(char *));
+     if (dblist == NULL || pplist == NULL || fllist == NULL)
      {
-       if (message
- #ifdef FEAT_AUTOCMD
-                   && !autocmd_busy
- #endif
-@@ -3143,31 +3195,38 @@ close_others(message, forceit)
-  * Called when a new file is being edited.
+       vim_free(dblist);
+       vim_free(pplist);
+       vim_free(fllist);
+       return CSCOPE_FAILURE;
+     }
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
+     {
+       dblist[i] = csinfo[i].fname;
+       pplist[i] = csinfo[i].ppath;
+       fllist[i] = csinfo[i].flags;
+       if (csinfo[i].fname != NULL)
+           cs_release_csp(i, FALSE);
+     }
+     /* rebuild the cscope connection list */
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
+     {
+       if (dblist[i] != NULL)
+       {
+           cs_add_common(dblist[i], pplist[i], fllist[i]);
+           if (p_csverbose)
+@@ -2353,24 +2498,23 @@ cs_resolve_file(i, name)
+ /*
+  * PRIVATE: cs_show
+  *
+  * show all cscope connections
   */
+-/* ARGSUSED */
+     static int
+ cs_show(eap)
+-    exarg_T *eap;
++    exarg_T *eap UNUSED;
+ {
+     short i;
+     if (cs_cnt_connections() == 0)
+       MSG_PUTS(_("no cscope connections\n"));
+     else
+     {
+       MSG_PUTS_ATTR(
+           _(" # pid    database name                       prepend path\n"),
+           hl_attr(HLF_T));
+-      for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++      for (i = 0; i < csinfo_size; i++)
+       {
+           if (csinfo[i].fname == NULL)
+               continue;
+           if (csinfo[i].ppath != NULL)
+@@ -2395,12 +2539,14 @@ cs_show(eap)
      void
- curwin_init()
+ cs_end()
  {
--    redraw_win_later(curwin, NOT_VALID);
--    curwin->w_lines_valid = 0;
--    curwin->w_cursor.lnum = 1;
--    curwin->w_curswant = curwin->w_cursor.col = 0;
-+    win_init_empty(curwin);
-+}
-+
-+    void
-+win_init_empty(wp)
-+    win_T *wp;
-+{
-+    redraw_win_later(wp, NOT_VALID);
-+    wp->w_lines_valid = 0;
-+    wp->w_cursor.lnum = 1;
-+    wp->w_curswant = wp->w_cursor.col = 0;
- #ifdef FEAT_VIRTUALEDIT
--    curwin->w_cursor.coladd = 0;
-+    wp->w_cursor.coladd = 0;
- #endif
--    curwin->w_pcmark.lnum = 1;        /* pcmark not cleared but set to line 1 */
--    curwin->w_pcmark.col = 0;
--    curwin->w_prev_pcmark.lnum = 0;
--    curwin->w_prev_pcmark.col = 0;
--    curwin->w_topline = 1;
-+    wp->w_pcmark.lnum = 1;    /* pcmark not cleared but set to line 1 */
-+    wp->w_pcmark.col = 0;
-+    wp->w_prev_pcmark.lnum = 0;
-+    wp->w_prev_pcmark.col = 0;
-+    wp->w_topline = 1;
- #ifdef FEAT_DIFF
--    curwin->w_topfill = 0;
-+    wp->w_topfill = 0;
- #endif
--    curwin->w_botline = 2;
-+    wp->w_botline = 2;
- #ifdef FEAT_FKMAP
--    if (curwin->w_p_rl)
--      curwin->w_farsi = W_CONV + W_R_L;
-+    if (wp->w_p_rl)
-+      wp->w_farsi = W_CONV + W_R_L;
-     else
--      curwin->w_farsi = W_CONV;
-+      wp->w_farsi = W_CONV;
- #endif
- }
+     int i;
  
- /*
-  * Allocate the first window and put an empty buffer in it.
-@@ -3185,13 +3244,34 @@ win_alloc_first()
-     if (first_tabpage == NULL)
-       return FAIL;
-     first_tabpage->tp_topframe = topframe;
-     curtab = first_tabpage;
- #endif
-+
-     return OK;
+-    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
++    for (i = 0; i < csinfo_size; i++)
+       cs_release_csp(i, TRUE);
++    vim_free(csinfo);
++    csinfo_size = 0;
  }
  
-+#if defined(FEAT_AUTOCMD) || defined(PROTO)
-+/*
-+ * Init "aucmd_win".  This can only be done after the first
-+ * window is fully initialized, thus it can't be in win_alloc_first().
-+ */
-+    void
-+win_alloc_aucmd_win()
-+{
-+    aucmd_win = win_alloc(NULL, TRUE);
-+    if (aucmd_win != NULL)
-+    {
-+      win_init_some(aucmd_win, curwin);
-+# ifdef FEAT_SCROLLBIND
-+      aucmd_win->w_p_scb = FALSE;
-+# endif
-+      new_frame(aucmd_win);
-+    }
-+}
-+#endif
-+
- /*
-  * Allocate the first window or the first window in a new tab page.
-  * When "oldwin" is NULL create an empty buffer for it.
-  * When "oldwin" is not NULL copy info from it to the new window (only with
-  * FEAT_WINDOWS).
-@@ -3199,11 +3279,11 @@ win_alloc_first()
-  */
-     static int
- win_alloc_firstwin(oldwin)
-     win_T     *oldwin;
- {
--    curwin = win_alloc(NULL);
-+    curwin = win_alloc(NULL, FALSE);
-     if (oldwin == NULL)
-     {
-       /* Very first window, need to create an empty buffer for it and
-        * initialize from scratch. */
-       curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
-@@ -3218,34 +3298,49 @@ win_alloc_firstwin(oldwin)
-     }
- #ifdef FEAT_WINDOWS
-     else
-     {
-       /* First window in new tab page, initialize it from "oldwin". */
--      win_init(curwin, oldwin);
-+      win_init(curwin, oldwin, 0);
+ #endif        /* FEAT_CSCOPE */
  
- # ifdef FEAT_SCROLLBIND
-       /* We don't want scroll-binding in the first window. */
-       curwin->w_p_scb = FALSE;
+ /* the end */
+--- vim72.orig/src/if_cscope.h
++++ vim72/src/if_cscope.h
+@@ -23,11 +23,10 @@
  # endif
-     }
  #endif
  
--    topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
--    if (topframe == NULL)
-+    new_frame(curwin);
-+    if (curwin->w_frame == NULL)
-       return FAIL;
--    topframe->fr_layout = FR_LEAF;
-+    topframe = curwin->w_frame;
- #ifdef FEAT_VERTSPLIT
-     topframe->fr_width = Columns;
- #endif
-     topframe->fr_height = Rows - p_ch;
-     topframe->fr_win = curwin;
--    curwin->w_frame = topframe;
+ #define CSCOPE_SUCCESS                0
+ #define CSCOPE_FAILURE                -1
+-#define CSCOPE_MAX_CONNECTIONS        8   /* you actually need more? */
  
-     return OK;
- }
+ #define       CSCOPE_DBFILE           "cscope.out"
+ #define       CSCOPE_PROMPT           ">> "
  
  /*
-+ * Create a frame for window "wp".
-+ */
-+    static void
-+new_frame(win_T *wp)
-+{
-+    frame_T *frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
-+
-+    wp->w_frame = frp;
-+    if (frp != NULL)
-+    {
-+      frp->fr_layout = FR_LEAF;
-+      frp->fr_win = wp;
-+    }
-+}
-+
-+/*
-  * Initialize the window and frame size to the maximum.
-  */
-     void
- win_init_size()
- {
-@@ -3291,14 +3386,17 @@ alloc_tabpage()
-     void
- free_tabpage(tp)
-     tabpage_T *tp;
- {
-+    int idx;
-+
- # ifdef FEAT_DIFF
-     diff_clear(tp);
- # endif
--    clear_snapshot(tp);
-+    for (idx = 0; idx < SNAP_COUNT; ++idx)
-+      clear_snapshot(tp, idx);
- #ifdef FEAT_EVAL
-     vars_clear(&tp->tp_vars.dv_hashtab);      /* free all t: variables */
- #endif
-     vim_free(tp);
- }
-@@ -3361,16 +3459,11 @@ win_new_tabpage(after)
-       last_status(FALSE);
- #if defined(FEAT_GUI)
-       /* When 'guioptions' includes 'L' or 'R' may have to remove or add
-        * scrollbars.  Have to update them anyway. */
--      if (gui.in_use && starting == 0)
--      {
--          gui_init_which_components(NULL);
--          gui_update_scrollbars(TRUE);
--      }
--      need_mouse_correct = TRUE;
-+      gui_may_update_scrollbars();
- #endif
-       redraw_all_later(CLEAR);
- #ifdef FEAT_AUTOCMD
-       apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
-@@ -3488,14 +3581,13 @@ tabpage_index(ftp)
-  * Prepare for leaving the current tab page.
-  * When autocomands change "curtab" we don't leave the tab page and return
-  * FAIL.
-  * Careful: When OK is returned need to get a new tab page very very soon!
+@@ -40,21 +39,10 @@
+  *   5pattern change pattern -- NOT USED
+  * e 6pattern Find this egrep pattern
+  * f 7name    Find this file
+  * i 8name    Find files #including this file
   */
--/*ARGSUSED*/
-     static int
- leave_tabpage(new_curbuf)
--    buf_T     *new_curbuf;        /* what is going to be the new curbuf,
-+    buf_T     *new_curbuf UNUSED;    /* what is going to be the new curbuf,
-                                      NULL if unknown */
- {
-     tabpage_T *tp = curtab;
- #ifdef FEAT_VISUAL
-@@ -3533,15 +3625,14 @@ leave_tabpage(new_curbuf)
+-#define       FIND_USAGE "find c|d|e|f|g|i|s|t name"
+-#define FIND_HELP "\n\
+-       c: Find functions calling this function\n\
+-       d: Find functions called by this function\n\
+-       e: Find this egrep pattern\n\
+-       f: Find this file\n\
+-       g: Find this definition\n\
+-       i: Find files #including this file\n\
+-       s: Find this C symbol\n\
+-       t: Find assignments to\n"
+-
  
- /*
-  * Start using tab page "tp".
-  * Only to be used after leave_tabpage() or freeing the current tab page.
+ typedef struct {
+     char *  name;
+     int     (*func) __ARGS((exarg_T *eap));
+     char *  help;
+--- vim72.orig/src/if_mzsch.c
++++ vim72/src/if_mzsch.c
+@@ -2,10 +2,12 @@
+  *
+  * MzScheme interface by Sergey Khorev <sergey.khorev@gmail.com>
+  * Original work by Brent Fulgham <bfulgham@debian.org>
+  * (Based on lots of help from Matthew Flatt)
+  *
++ * TODO Convert byte-strings to char strings?
++ *
+  * This consists of six parts:
+  * 1. MzScheme interpreter main program
+  * 2. Routines that handle the external interface between MzScheme and
+  *    Vim.
+  * 3. MzScheme input/output handlers: writes output via [e]msg().
+@@ -16,37 +18,38 @@
+  * NOTES
+  * 1. Memory, allocated with scheme_malloc*, need not to be freed explicitly,
+  *    garbage collector will do it self
+  * 2. Requires at least NORMAL features. I can't imagine why one may want
+  *    to build with SMALL or TINY features but with MzScheme interface.
+- * 3. I don't use K&R-style functions. Anyway, MzScheme headers are ANSI.
++ * 3. I don't use K&R-style functions. Anyways, MzScheme headers are ANSI.
   */
--/*ARGSUSED*/
-     static void
- enter_tabpage(tp, old_curbuf)
-     tabpage_T *tp;
--    buf_T     *old_curbuf;
-+    buf_T     *old_curbuf UNUSED;
- {
-     int               old_off = tp->tp_firstwin->w_winrow;
-     win_T     *next_prevwin = tp->tp_prevwin;
-     curtab = tp;
-@@ -3586,16 +3677,11 @@ enter_tabpage(tp, old_curbuf)
- #endif
- #if defined(FEAT_GUI)
-     /* When 'guioptions' includes 'L' or 'R' may have to remove or add
-      * scrollbars.  Have to update them anyway. */
--    if (gui.in_use && starting == 0)
--    {
--      gui_init_which_components(NULL);
--      gui_update_scrollbars(TRUE);
--    }
--    need_mouse_correct = TRUE;
-+    gui_may_update_scrollbars();
- #endif
-     redraw_all_later(CLEAR);
- }
-@@ -4026,18 +4112,18 @@ win_enter_ext(wp, undo_sync, curwin_inva
-           char_u      cwd[MAXPATHL];
-           if (mch_dirname(cwd, MAXPATHL) == OK)
-               globaldir = vim_strsave(cwd);
-       }
--      mch_chdir((char *)curwin->w_localdir);
--      shorten_fnames(TRUE);
-+      if (mch_chdir((char *)curwin->w_localdir) == 0)
-+          shorten_fnames(TRUE);
-     }
-     else if (globaldir != NULL)
-     {
-       /* Window doesn't have a local directory and we are not in the global
-        * directory: Change to the global directory. */
--      mch_chdir((char *)globaldir);
-+      ignored = mch_chdir((char *)globaldir);
-       vim_free(globaldir);
-       globaldir = NULL;
-       shorten_fnames(TRUE);
-     }
  
-@@ -4143,16 +4229,17 @@ buf_jump_open_tab(buf)
- # endif
- }
- #endif
+ #include "vim.h"
  
- /*
-- * allocate a window structure and link it in the window list
-+ * Allocate a window structure and link it in the window list when "hidden" is
-+ * FALSE.
-  */
--/*ARGSUSED*/
-     static win_T *
--win_alloc(after)
--    win_T     *after;
-+win_alloc(after, hidden)
-+    win_T     *after UNUSED;
-+    int               hidden UNUSED;
- {
-     win_T     *newwin;
+ #include "if_mzsch.h"
  
-     /*
-      * allocate window structure and linesizes arrays
-@@ -4174,11 +4261,12 @@ win_alloc(after)
- #endif
-       /*
-        * link the window in the window list
-        */
- #ifdef FEAT_WINDOWS
--      win_append(after, newwin);
-+      if (!hidden)
-+          win_append(after, newwin);
- #endif
- #ifdef FEAT_VERTSPLIT
-       newwin->w_wincol = 0;
-       newwin->w_width = Columns;
- #endif
-@@ -4235,10 +4323,17 @@ win_free(wp, tp)
-     win_T     *wp;
-     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
- {
-     int               i;
+ /* Only do the following when the feature is enabled.  Needed for "make
+  * depend". */
+ #if defined(FEAT_MZSCHEME) || defined(PROTO)
  
-+#ifdef FEAT_FOLDING
-+    clearFolding(wp);
-+#endif
-+
-+    /* reduce the reference count to the argument list. */
-+    alist_unlink(wp->w_alist);
++#include <assert.h>
 +
- #ifdef FEAT_AUTOCMD
-     /* Don't execute autocommands while the window is halfway being deleted.
-      * gui_mch_destroy_scrollbar() may trigger a FocusGained event. */
-     block_autocmds();
- #endif
-@@ -4297,22 +4392,25 @@ win_free(wp, tp)
-       gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_LEFT]);
-       gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_RIGHT]);
-     }
- #endif /* FEAT_GUI */
--    win_remove(wp, tp);
-+#ifdef FEAT_AUTOCMD
-+    if (wp != aucmd_win)
-+#endif
-+      win_remove(wp, tp);
-     vim_free(wp);
- #ifdef FEAT_AUTOCMD
-     unblock_autocmds();
- #endif
- }
+ /* Base data structures */
+ #define SCHEME_VIMBUFFERP(obj)  SAME_TYPE(SCHEME_TYPE(obj), mz_buffer_type)
+ #define SCHEME_VIMWINDOWP(obj)  SAME_TYPE(SCHEME_TYPE(obj), mz_window_type)
  
- /*
-  * Append window "wp" in the window list after window "after".
-  */
--    static void
-+    void
- win_append(after, wp)
-     win_T     *after, *wp;
+ typedef struct
  {
-     win_T     *before;
-@@ -4334,11 +4432,11 @@ win_append(after, wp)
- }
+-    Scheme_Type           tag;
+-    Scheme_Env            *env;
++    Scheme_Object   so;
+     buf_T         *buf;
+ } vim_mz_buffer;
  
- /*
-  * Remove a window from the window list.
-  */
--    static void
-+    void
- win_remove(wp, tp)
-     win_T     *wp;
-     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
- {
-     if (wp->w_prev != NULL)
-@@ -6034,10 +6132,11 @@ min_rows()
- }
+ #define INVALID_BUFFER_VALUE ((buf_T *)(-1))
  
- /*
-  * Return TRUE if there is only one window (in the current tab page), not
-  * counting a help or preview window, unless it is the current window.
-+ * Does not count "aucmd_win".
-  */
-     int
- only_one_window()
+ typedef struct
  {
- #ifdef FEAT_WINDOWS
-@@ -6047,15 +6146,19 @@ only_one_window()
-     /* If there is another tab page there always is another window. */
-     if (first_tabpage->tp_next != NULL)
-       return FALSE;
+-    Scheme_Type           tag;
++    Scheme_Object   so;
+     win_T         *win;
+ } vim_mz_window;
  
-     for (wp = firstwin; wp != NULL; wp = wp->w_next)
--      if (!((wp->w_buffer->b_help && !curbuf->b_help)
-+      if ((!((wp->w_buffer->b_help && !curbuf->b_help)
- # ifdef FEAT_QUICKFIX
-                   || wp->w_p_pvw
- # endif
-            ) || wp == curwin)
-+# ifdef FEAT_AUTOCMD
-+              && wp != aucmd_win
-+# endif
-+         )
-           ++count;
-     return (count <= 1);
- #else
-     return TRUE;
- #endif
-@@ -6106,15 +6209,16 @@ check_lnums(do_curwin)
-  */
+ #define INVALID_WINDOW_VALUE ((win_T *)(-1))
  
- /*
-  * Create a snapshot of the current frame sizes.
-  */
--    static void
--make_snapshot()
-+    void
-+make_snapshot(idx)
-+    int idx;
+@@ -65,31 +68,10 @@ typedef struct
  {
--    clear_snapshot(curtab);
--    make_snapshot_rec(topframe, &curtab->tp_snapshot);
-+    clear_snapshot(curtab, idx);
-+    make_snapshot_rec(topframe, &curtab->tp_snapshot[idx]);
- }
-     static void
- make_snapshot_rec(fr, frp)
-     frame_T   *fr;
-@@ -6138,15 +6242,16 @@ make_snapshot_rec(fr, frp)
+     char          *name;
+     Scheme_Object   *port;
+ } Port_Info;
  
+-/* info for closed prim */
+-/*
+- * data have different means:
+- * for do_eval it is char*
+- * for do_apply is Apply_Onfo*
+- * for do_load is Port_Info*
+- */
+-typedef struct
+-{
+-    void      *data;
+-    Scheme_Env        *env;
+-} Cmd_Info;
+-
+-/* info for do_apply */
+-typedef struct
+-{
+-    Scheme_Object   *proc;
+-    int                   argc;
+-    Scheme_Object   **argv;
+-} Apply_Info;
+-
  /*
-  * Remove any existing snapshot.
+  *========================================================================
+  *  Vim-Control Commands
+  *========================================================================
   */
-     static void
--clear_snapshot(tp)
-+clear_snapshot(tp, idx)
-     tabpage_T *tp;
-+    int               idx;
- {
--    clear_snapshot_rec(tp->tp_snapshot);
--    tp->tp_snapshot = NULL;
-+    clear_snapshot_rec(tp->tp_snapshot[idx]);
-+    tp->tp_snapshot[idx] = NULL;
- }
+@@ -120,11 +102,10 @@ static Scheme_Object *mzscheme_open_buff
+ static Scheme_Object *set_buffer_line(void *, int, Scheme_Object **);
+ static Scheme_Object *set_buffer_line_list(void *, int, Scheme_Object **);
+ static Scheme_Object *insert_buffer_line_list(void *, int, Scheme_Object **);
+ static Scheme_Object *get_range_start(void *, int, Scheme_Object **);
+ static Scheme_Object *get_range_end(void *, int, Scheme_Object **);
+-static Scheme_Object *get_buffer_namespace(void *, int, Scheme_Object **);
+ static vim_mz_buffer *get_vim_curr_buffer(void);
  
-     static void
- clear_snapshot_rec(fr)
-     frame_T   *fr;
-@@ -6162,30 +6267,31 @@ clear_snapshot_rec(fr)
- /*
-  * Restore a previously created snapshot, if there is any.
-  * This is only done if the screen size didn't change and the window layout is
-  * still the same.
+ /*  Window-related commands */
+ static Scheme_Object *window_new(win_T *win);
+ static Scheme_Object *get_curr_win(void *, int, Scheme_Object **);
+@@ -161,34 +142,66 @@ static Scheme_Object *vim_window_validp(
   */
--    static void
--restore_snapshot(close_curwin)
-+    void
-+restore_snapshot(idx, close_curwin)
-+    int               idx;
-     int               close_curwin;       /* closing current window */
- {
-     win_T     *wp;
--    if (curtab->tp_snapshot != NULL
-+    if (curtab->tp_snapshot[idx] != NULL
- # ifdef FEAT_VERTSPLIT
--          && curtab->tp_snapshot->fr_width == topframe->fr_width
-+          && curtab->tp_snapshot[idx]->fr_width == topframe->fr_width
- # endif
--          && curtab->tp_snapshot->fr_height == topframe->fr_height
--          && check_snapshot_rec(curtab->tp_snapshot, topframe) == OK)
-+          && curtab->tp_snapshot[idx]->fr_height == topframe->fr_height
-+          && check_snapshot_rec(curtab->tp_snapshot[idx], topframe) == OK)
-     {
--      wp = restore_snapshot_rec(curtab->tp_snapshot, topframe);
-+      wp = restore_snapshot_rec(curtab->tp_snapshot[idx], topframe);
-       win_comp_pos();
-       if (wp != NULL && close_curwin)
-           win_goto(wp);
-       redraw_all_later(CLEAR);
-     }
--    clear_snapshot(curtab);
-+    clear_snapshot(curtab, idx);
- }
+ static int vim_error_check(void);
+ static int do_mzscheme_command(exarg_T *, void *, Scheme_Closed_Prim *what);
+ static void startup_mzscheme(void);
+ static char *string_to_line(Scheme_Object *obj);
+-static int mzscheme_io_init(void);
+-static void mzscheme_interface_init(vim_mz_buffer *self);
+ static void do_output(char *mesg, long len);
+ static void do_printf(char *format, ...);
+ static void do_flush(void);
+ static Scheme_Object *_apply_thunk_catch_exceptions(
+       Scheme_Object *, Scheme_Object **);
+ static Scheme_Object *extract_exn_message(Scheme_Object *v);
+ static Scheme_Object *do_eval(void *, int noargc, Scheme_Object **noargv);
+ static Scheme_Object *do_load(void *, int noargc, Scheme_Object **noargv);
+-static Scheme_Object *do_apply(void *, int noargc, Scheme_Object **noargv);
+-static void register_vim_exn(Scheme_Env *env);
++static void register_vim_exn(void);
+ static vim_mz_buffer *get_buffer_arg(const char *fname, int argnum,
+       int argc, Scheme_Object **argv);
+ static vim_mz_window *get_window_arg(const char *fname, int argnum,
+       int argc, Scheme_Object **argv);
+-static void add_vim_exn(Scheme_Env *env);
+ static int line_in_range(linenr_T, buf_T *);
+ static void check_line_range(linenr_T, buf_T *);
+ static void mz_fix_cursor(int lo, int hi, int extra);
  
- /*
-  * Check if frames "sn" and "fr" have the same layout, same following frames
-  * and same children.
---- vim72.orig/src/move.c
-+++ vim72/src/move.c
-@@ -181,13 +181,10 @@ update_topline()
-     if (bufempty())           /* special case - file is empty */
-     {
-       if (curwin->w_topline != 1)
-           redraw_later(NOT_VALID);
-       curwin->w_topline = 1;
--#ifdef FEAT_DIFF
--      curwin->w_topfill = 0;
--#endif
-       curwin->w_botline = 2;
-       curwin->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP;
- #ifdef FEAT_SCROLLBIND
-       curwin->w_scbind_pos = 1;
- #endif
-@@ -278,22 +275,24 @@ update_topline()
-       if (!(curwin->w_valid & VALID_BOTLINE_AP))
-           validate_botline();
+-static int eval_in_namespace(void *, Scheme_Closed_Prim *, Scheme_Env *,
+-              Scheme_Object **ret);
+-static void make_modules(Scheme_Env *);
++static int eval_with_exn_handling(void *, Scheme_Closed_Prim *,
++          Scheme_Object **ret);
++static void make_modules(void);
++static void init_exn_catching_apply(void);
++static int mzscheme_env_main(Scheme_Env *env, int argc, char **argv);
++static int mzscheme_init(void);
++#ifdef FEAT_EVAL
++static Scheme_Object *vim_to_mzscheme(typval_T *vim_value, int depth,
++      Scheme_Hash_Table *visited);
++static int mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth,
++      Scheme_Hash_Table *visited);
++#endif
++
++#ifdef MZ_PRECISE_GC
++static int buffer_size_proc(void *obj)
++{
++    return gcBYTES_TO_WORDS(sizeof(vim_mz_buffer));
++}
++static int buffer_mark_proc(void *obj)
++{
++    return buffer_size_proc(obj);
++}
++static int buffer_fixup_proc(void *obj)
++{
++    return buffer_size_proc(obj);
++}
++static int window_size_proc(void *obj)
++{
++    return gcBYTES_TO_WORDS(sizeof(vim_mz_window));
++}
++static int window_mark_proc(void *obj)
++{
++    return window_size_proc(obj);
++}
++static int window_fixup_proc(void *obj)
++{
++    return window_size_proc(obj);
++}
++#endif
  
-       if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
-       {
--          if (curwin->w_cursor.lnum < curwin->w_botline
--                  && ((long)curwin->w_cursor.lnum
-+          if (curwin->w_cursor.lnum < curwin->w_botline)
-+          {
-+            if (((long)curwin->w_cursor.lnum
-                                            >= (long)curwin->w_botline - p_so
- #ifdef FEAT_FOLDING
-                       || hasAnyFolding(curwin)
- #endif
-                       ))
--          {
-+            {
-               lineoff_T       loff;
+ #ifdef DYNAMIC_MZSCHEME
  
--              /* Cursor is above botline, check if there are 'scrolloff'
--               * window lines below the cursor.  If not, need to scroll. */
-+              /* Cursor is (a few lines) above botline, check if there are
-+               * 'scrolloff' window lines below the cursor.  If not, need to
-+               * scroll. */
-               n = curwin->w_empty_rows;
-               loff.lnum = curwin->w_cursor.lnum;
- #ifdef FEAT_FOLDING
-               /* In a fold go to its last line. */
-               (void)hasFolding(loff.lnum, NULL, &loff.lnum);
-@@ -315,10 +314,14 @@ update_topline()
-                   botline_forw(&loff);
-               }
-               if (n >= p_so)
-                   /* sufficient context, no need to scroll */
-                   check_botline = FALSE;
-+            }
-+            else
-+                /* sufficient context, no need to scroll */
-+                check_botline = FALSE;
-           }
-           if (check_botline)
-           {
- #ifdef FEAT_FOLDING
-               if (hasAnyFolding(curwin))
-@@ -507,10 +510,13 @@ set_topline(wp, lnum)
-     (void)hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
- #endif
-     /* Approximate the value of w_botline */
-     wp->w_botline += lnum - wp->w_topline;
-     wp->w_topline = lnum;
-+#ifdef FEAT_AUTOCMD
-+    wp->w_topline_was_set = TRUE;
-+#endif
- #ifdef FEAT_DIFF
-     wp->w_topfill = 0;
- #endif
-     wp->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_TOPLINE);
-     /* Don't set VALID_TOPLINE here, 'scrolloff' needs to be checked. */
-@@ -881,26 +887,26 @@ validate_cheight()
-     void
- validate_cursor_col()
- {
-     colnr_T off;
-     colnr_T col;
-+    int     width;
+ static Scheme_Object *dll_scheme_eof;
+ static Scheme_Object *dll_scheme_false;
+@@ -258,12 +271,10 @@ static Scheme_Object *(*dll_scheme_looku
+       Scheme_Env *env);
+ static Scheme_Object *(*dll_scheme_make_closed_prim_w_arity)
+     (Scheme_Closed_Prim *prim, void *data, const char *name, mzshort mina,
+      mzshort maxa);
+ static Scheme_Object *(*dll_scheme_make_integer_value)(long i);
+-static Scheme_Object *(*dll_scheme_make_namespace)(int argc,
+-      Scheme_Object *argv[]);
+ static Scheme_Object *(*dll_scheme_make_pair)(Scheme_Object *car,
+       Scheme_Object *cdr);
+ static Scheme_Object *(*dll_scheme_make_prim_w_arity)(Scheme_Prim *prim,
+       const char *name, mzshort mina, mzshort maxa);
+ # if MZSCHEME_VERSION_MAJOR < 299
+@@ -309,10 +320,21 @@ static Scheme_Config *(*dll_scheme_curre
+ static Scheme_Object *(*dll_scheme_char_string_to_byte_string)
+     (Scheme_Object *s);
+ static Scheme_Object *(*dll_scheme_char_string_to_path)
+     (Scheme_Object *s);
+ # endif
++static Scheme_Hash_Table *(*dll_scheme_make_hash_table)(int type);
++static void (*dll_scheme_hash_set)(Scheme_Hash_Table *table,
++      Scheme_Object *key, Scheme_Object *value);
++static Scheme_Object *(*dll_scheme_hash_get)(Scheme_Hash_Table *table,
++      Scheme_Object *key);
++static Scheme_Object *(*dll_scheme_make_double)(double d);
++# ifdef INCLUDE_MZSCHEME_BASE
++static Scheme_Object *(*dll_scheme_make_sized_byte_string)(char *chars,
++      long len, int copy);
++static Scheme_Object *(*dll_scheme_namespace_require)(Scheme_Object *req);
++# endif
  
-     validate_virtcol();
-     if (!(curwin->w_valid & VALID_WCOL))
-     {
-       col = curwin->w_virtcol;
-       off = curwin_col_off();
-       col += off;
-+      width = W_WIDTH(curwin) - off + curwin_col_off2();
+ /* arrays are imported directly */
+ # define scheme_eof dll_scheme_eof
+ # define scheme_false dll_scheme_false
+ # define scheme_void dll_scheme_void
+@@ -366,11 +388,10 @@ static Scheme_Object *(*dll_scheme_char_
+ # endif
+ # define scheme_intern_symbol dll_scheme_intern_symbol
+ # define scheme_lookup_global dll_scheme_lookup_global
+ # define scheme_make_closed_prim_w_arity dll_scheme_make_closed_prim_w_arity
+ # define scheme_make_integer_value dll_scheme_make_integer_value
+-# define scheme_make_namespace dll_scheme_make_namespace
+ # define scheme_make_pair dll_scheme_make_pair
+ # define scheme_make_prim_w_arity dll_scheme_make_prim_w_arity
+ # if MZSCHEME_VERSION_MAJOR < 299
+ #  define scheme_make_string dll_scheme_make_string
+ #  define scheme_make_string_output_port dll_scheme_make_string_output_port
+@@ -401,10 +422,18 @@ static Scheme_Object *(*dll_scheme_char_
+ #  define scheme_char_string_to_byte_string \
+     dll_scheme_char_string_to_byte_string
+ #  define scheme_char_string_to_path \
+     dll_scheme_char_string_to_path
+ # endif
++# define scheme_make_hash_table dll_scheme_make_hash_table
++# define scheme_hash_set dll_scheme_hash_set
++# define scheme_hash_get dll_scheme_hash_get
++# define scheme_make_double dll_scheme_make_double
++# ifdef INCLUDE_MZSCHEME_BASE
++#  define scheme_make_sized_byte_string dll_scheme_make_sized_byte_string
++#  define scheme_namespace_require dll_scheme_namespace_require
++# endif
  
-       /* long line wrapping, adjust curwin->w_wrow */
-       if (curwin->w_p_wrap
-               && col >= (colnr_T)W_WIDTH(curwin)
--              && W_WIDTH(curwin) - off + curwin_col_off2() > 0)
--      {
--          col -= W_WIDTH(curwin);
--          col = col % (W_WIDTH(curwin) - off + curwin_col_off2());
--      }
-+              && width > 0)
-+          /* use same formula as what is used in curs_columns() */
-+          col -= ((col - W_WIDTH(curwin)) / width + 1) * width;
-       if (col > (int)curwin->w_leftcol)
-           col -= curwin->w_leftcol;
-       else
-           col = 0;
-       curwin->w_wcol = col;
-@@ -1033,10 +1039,11 @@ curs_columns(scroll)
-       width = textwidth + curwin_col_off2();
+ typedef struct
+ {
+     char    *name;
+     void    **ptr;
+@@ -466,11 +495,10 @@ static Thunk_Info mzsch_imports[] = {
+     {"scheme_intern_symbol", (void **)&dll_scheme_intern_symbol},
+     {"scheme_lookup_global", (void **)&dll_scheme_lookup_global},
+     {"scheme_make_closed_prim_w_arity",
+       (void **)&dll_scheme_make_closed_prim_w_arity},
+     {"scheme_make_integer_value", (void **)&dll_scheme_make_integer_value},
+-    {"scheme_make_namespace", (void **)&dll_scheme_make_namespace},
+     {"scheme_make_pair", (void **)&dll_scheme_make_pair},
+     {"scheme_make_prim_w_arity", (void **)&dll_scheme_make_prim_w_arity},
+ # if MZSCHEME_VERSION_MAJOR < 299
+     {"scheme_make_string", (void **)&dll_scheme_make_string},
+     {"scheme_make_string_output_port",
+@@ -500,13 +528,20 @@ static Thunk_Info mzsch_imports[] = {
+ # if MZSCHEME_VERSION_MAJOR >= 299
+     {"scheme_set_param", (void **)&dll_scheme_set_param},
+     {"scheme_current_config", (void **)&dll_scheme_current_config},
+     {"scheme_char_string_to_byte_string",
+       (void **)&dll_scheme_char_string_to_byte_string},
+-    {"scheme_char_string_to_path",
+-      (void **)&dll_scheme_char_string_to_path},
++    {"scheme_char_string_to_path", (void **)&dll_scheme_char_string_to_path},
+ # endif
++    {"scheme_make_hash_table", (void **)&dll_scheme_make_hash_table},
++    {"scheme_hash_set", (void **)&dll_scheme_hash_set},
++    {"scheme_hash_get", (void **)&dll_scheme_hash_get},
++    {"scheme_make_double", (void **)&dll_scheme_make_double},
++# ifdef INCLUDE_MZSCHEME_BASE
++    {"scheme_make_sized_byte_string", (void **)&dll_scheme_make_sized_byte_string},
++    {"scheme_namespace_require", (void **)&dll_scheme_namespace_require},
++#endif
+     {NULL, NULL}};
  
-       /* long line wrapping, adjust curwin->w_wrow */
-       if (curwin->w_wcol >= W_WIDTH(curwin))
-       {
-+          /* this same formula is used in validate_cursor_col() */
-           n = (curwin->w_wcol - W_WIDTH(curwin)) / width + 1;
-           curwin->w_wcol -= n * width;
-           curwin->w_wrow += n;
+ static HINSTANCE hMzGC = 0;
+ static HINSTANCE hMzSch = 0;
  
- #ifdef FEAT_LINEBREAK
-@@ -1227,15 +1234,14 @@ curs_columns(scroll)
+@@ -590,34 +625,42 @@ dynamic_mzscheme_end(void)
+       hMzGC = 0;
+     }
  }
+ #endif /* DYNAMIC_MZSCHEME */
  
++/* need to put it here for dynamic stuff to work */
++#if defined(INCLUDE_MZSCHEME_BASE)
++# include "mzscheme_base.c"
++#elif MZSCHEME_VERSION_MAJOR >= 400
++# error MzScheme 4.x must include mzscheme_base.c, for MinGW32 you need to define MZSCHEME_GENERATE_BASE=yes
++#endif
++
  /*
-  * Scroll the current window down by "line_count" logical lines.  "CTRL-Y"
+  *========================================================================
+  *  1. MzScheme interpreter startup
+  *========================================================================
   */
--/*ARGSUSED*/
-     void
- scrolldown(line_count, byfold)
-     long      line_count;
--    int               byfold;         /* TRUE: count a closed fold as one line */
-+    int               byfold UNUSED;  /* TRUE: count a closed fold as one line */
- {
-     long      done = 0;       /* total # of physical lines done */
-     int               wrow;
-     int               moved = FALSE;
  
-@@ -1247,11 +1253,12 @@ scrolldown(line_count, byfold)
- #endif
-     validate_cursor();                /* w_wrow needs to be valid */
-     while (line_count-- > 0)
-     {
- #ifdef FEAT_DIFF
--      if (curwin->w_topfill < diff_check(curwin, curwin->w_topline))
-+      if (curwin->w_topfill < diff_check(curwin, curwin->w_topline)
-+              && curwin->w_topfill < curwin->w_height - 1)
-       {
-           ++curwin->w_topfill;
-           ++done;
-       }
-       else
-@@ -1338,15 +1345,14 @@ scrolldown(line_count, byfold)
- }
+ static Scheme_Type mz_buffer_type;
+ static Scheme_Type mz_window_type;
  
- /*
-  * Scroll the current window up by "line_count" logical lines.  "CTRL-E"
-  */
--/*ARGSUSED*/
-     void
- scrollup(line_count, byfold)
-     long      line_count;
--    int               byfold;         /* TRUE: count a closed fold as one line */
-+    int               byfold UNUSED;  /* TRUE: count a closed fold as one line */
- {
- #if defined(FEAT_FOLDING) || defined(FEAT_DIFF)
-     linenr_T  lnum;
+-static int initialized = 0;
++static int initialized = FALSE;
  
-     if (
-@@ -1602,11 +1608,11 @@ scrollup_clamp()
+ /* global environment */
+ static Scheme_Env    *environment = NULL;
+ /* output/error handlers */
+ static Scheme_Object *curout = NULL;
+ static Scheme_Object *curerr = NULL;
+-/* vim:exn exception */
++/* exn:vim exception */
+ static Scheme_Object *exn_catching_apply = NULL;
+ static Scheme_Object *exn_p = NULL;
+ static Scheme_Object *exn_message = NULL;
+ static Scheme_Object *vim_exn = NULL; /* Vim Error exception */
+- /* values for exn:vim - constructor, predicate, accessors etc */
+-static Scheme_Object *vim_exn_names = NULL;
+-static Scheme_Object *vim_exn_values = NULL;
++
++#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
++static void *stack_base = NULL;
++#endif
  
- /*
-  * Add one line above "lp->lnum".  This can be a filler line, a closed fold or
-  * a (wrapped) text line.  Uses and sets "lp->fill".
-  * Returns the height of the added line in "lp->height".
-- * Lines above the first one are incredibly high.
-+ * Lines above the first one are incredibly high: MAXCOL.
-  */
+ static long range_start;
+ static long range_end;
+ /* MzScheme threads scheduling stuff */
+@@ -665,15 +708,13 @@ static void remove_timer(void);
+ /* timers are presented in GUI only */
+ # if defined(FEAT_GUI_W32)
+     static void CALLBACK
+ timer_proc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
+ # elif defined(FEAT_GUI_GTK)
+-/*ARGSUSED*/
+     static gint
+ timer_proc(gpointer data)
+ # elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)
+-/* ARGSUSED */
      static void
- topline_back(lp)
-     lineoff_T *lp;
- {
-@@ -1934,11 +1940,11 @@ scroll_cursor_bot(min_scroll, set_topbot
-               curwin->w_topline > 1;
-               curwin->w_topline = loff.lnum)
-       {
-           loff.lnum = curwin->w_topline;
-           topline_back(&loff);
--          if (used + loff.height > curwin->w_height)
-+          if (loff.height == MAXCOL || used + loff.height > curwin->w_height)
-               break;
-           used += loff.height;
- #ifdef FEAT_DIFF
-           curwin->w_topfill = loff.fill;
+ timer_proc(XtPointer timed_out, XtIntervalId *interval_id)
+ # elif defined(FEAT_GUI_MAC)
+     pascal void
+ timer_proc(EventLoopTimerRef theTimer, void *userData)
+@@ -751,203 +792,333 @@ mzscheme_end(void)
+ #ifdef DYNAMIC_MZSCHEME
+     dynamic_mzscheme_end();
  #endif
-@@ -2013,11 +2019,14 @@ scroll_cursor_bot(min_scroll, set_topbot
-               )
-           break;
+ }
  
-       /* Add one line above */
-       topline_back(&loff);
--      used += loff.height;
-+      if (loff.height == MAXCOL)
-+          used = MAXCOL;
-+      else
-+          used += loff.height;
-       if (used > curwin->w_height)
-           break;
-       if (loff.lnum >= curwin->w_botline
- #ifdef FEAT_DIFF
-               && (loff.lnum > curwin->w_botline
-@@ -2167,11 +2176,14 @@ scroll_cursor_halfway(atend)
-       }
++    void
++mzscheme_main(void)
++{
++#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400
++    /* use trampoline for precise GC in MzScheme >= 4.x */
++    scheme_main_setup(TRUE, mzscheme_env_main, 0, NULL);
++#else
++    mzscheme_env_main(NULL, 0, NULL);
++#endif
++}
++
++    static int
++mzscheme_env_main(Scheme_Env *env, int argc, char **argv)
++{
++    /* neither argument nor return values are used */
++#ifdef MZ_PRECISE_GC
++# if MZSCHEME_VERSION_MAJOR < 400
++    /*
++     * Starting from version 4.x, embedding applications must use
++     * scheme_main_setup/scheme_main_stack_setup trampolines
++     * rather than setting stack base directly with scheme_set_stack_base
++     */
++    Scheme_Object   *dummy = NULL;
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, dummy);
++
++    stack_base = &__gc_var_stack__;
++# else
++    /* environment has been created by us by Scheme */
++    environment = env;
++# endif
++    /*
++     * In 4.x, all activities must be performed inside trampoline
++     * so we are forced to initialise GC immediately
++     * This can be postponed in 3.x but I see no point in implementing
++     * a feature which will work in older versions only.
++     * One would better use conservative GC if he needs dynamic MzScheme
++     */
++    mzscheme_init();
++#else
++    int dummy = 0;
++    stack_base = (void *)&dummy;
++#endif
++    main_loop(FALSE, FALSE);
++#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR < 400
++    /* releasing dummy */
++    MZ_GC_REG();
++    MZ_GC_UNREG();
++#endif
++    return 0;
++}
++
+     static void
+ startup_mzscheme(void)
+ {
+-    Scheme_Object *proc_make_security_guard;
+-
+-    scheme_set_stack_base(NULL, 1);
++#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
++    scheme_set_stack_base(stack_base, 1);
++#endif
  
-       if (below > above)          /* add a line above the cursor */
-       {
-           topline_back(&loff);
--          used += loff.height;
-+          if (loff.height == MAXCOL)
-+              used = MAXCOL;
-+          else
-+              used += loff.height;
-           if (used > curwin->w_height)
-               break;
-           above += loff.height;
-           topline = loff.lnum;
- #ifdef FEAT_DIFF
-@@ -2464,13 +2476,16 @@ onepage(dir, count)
-            * at the bottom of the window. */
-           n = 0;
-           while (n <= curwin->w_height && loff.lnum >= 1)
-           {
-               topline_back(&loff);
--              n += loff.height;
-+              if (loff.height == MAXCOL)
-+                  n = MAXCOL;
-+              else
-+                  n += loff.height;
-           }
--          if (n <= curwin->w_height)              /* at begin of file */
-+          if (loff.lnum < 1)                  /* at begin of file */
-           {
-               curwin->w_topline = 1;
- #ifdef FEAT_DIFF
-               max_topfill();
- #endif
---- vim72.orig/src/auto/configure
-+++ vim72/src/auto/configure
-@@ -1,8 +1,8 @@
- #! /bin/sh
- # Guess values for system-dependent variables and create Makefiles.
--# Generated by GNU Autoconf 2.62.
-+# Generated by GNU Autoconf 2.63.
- #
- # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
- # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
- # This configure script is free software; the Free Software Foundation
- # gives unlimited permission to copy, distribute and modify it.
-@@ -633,147 +633,151 @@ ac_includes_default="\
- #endif
- #ifdef HAVE_UNISTD_H
- # include <unistd.h>
- #endif"
--ac_subst_vars='SHELL
--PATH_SEPARATOR
--PACKAGE_NAME
--PACKAGE_TARNAME
--PACKAGE_VERSION
--PACKAGE_STRING
--PACKAGE_BUGREPORT
--exec_prefix
--prefix
--program_transform_name
--bindir
--sbindir
--libexecdir
--datarootdir
--datadir
--sysconfdir
--sharedstatedir
--localstatedir
--includedir
--oldincludedir
--docdir
--infodir
--htmldir
--dvidir
--pdfdir
--psdir
--libdir
--localedir
--mandir
--DEFS
--ECHO_C
--ECHO_N
--ECHO_T
--LIBS
--build_alias
--host_alias
--target_alias
--SET_MAKE
--CC
--CFLAGS
--LDFLAGS
--CPPFLAGS
--ac_ct_CC
--EXEEXT
--OBJEXT
--CPP
--GREP
--EGREP
--AWK
--STRIP
--CPP_MM
--OS_EXTRA_SRC
--OS_EXTRA_OBJ
--VIMNAME
--EXNAME
--VIEWNAME
--line_break
--dovimdiff
--dogvimdiff
--compiledby
--vi_cv_path_mzscheme
--MZSCHEME_SRC
--MZSCHEME_OBJ
--MZSCHEME_PRO
--MZSCHEME_LIBS
--MZSCHEME_CFLAGS
--vi_cv_path_perl
--vi_cv_perllib
--shrpenv
--PERL_SRC
--PERL_OBJ
--PERL_PRO
--PERL_CFLAGS
--PERL_LIBS
--vi_cv_path_python
--PYTHON_CONFDIR
--PYTHON_LIBS
--PYTHON_GETPATH_CFLAGS
--PYTHON_CFLAGS
--PYTHON_SRC
--PYTHON_OBJ
--vi_cv_path_tcl
--TCL_SRC
--TCL_OBJ
--TCL_PRO
--TCL_CFLAGS
--TCL_LIBS
--vi_cv_path_ruby
--RUBY_SRC
--RUBY_OBJ
--RUBY_PRO
--RUBY_CFLAGS
--RUBY_LIBS
--WORKSHOP_SRC
--WORKSHOP_OBJ
--NETBEANS_SRC
--NETBEANS_OBJ
--SNIFF_SRC
--SNIFF_OBJ
--xmkmfpath
--XMKMF
--X_CFLAGS
--X_PRE_LIBS
--X_LIBS
--X_EXTRA_LIBS
--X_LIB
--GTK_CONFIG
--GTK12_CONFIG
--PKG_CONFIG
--GTK_CFLAGS
--GTK_LIBS
--GTK_LIBNAME
--GNOME_LIBS
--GNOME_LIBDIR
--GNOME_INCLUDEDIR
--GNOME_CONFIG
--MOTIF_LIBNAME
--NARROW_PROTO
--GUI_INC_LOC
--GUI_LIB_LOC
--GUITYPE
--GUI_X_LIBS
--HANGULIN_SRC
--HANGULIN_OBJ
--TAGPRG
--INSTALL_LANGS
--INSTALL_TOOL_LANGS
--MSGFMT
--MAKEMO
--DEPEND_CFLAGS_FILTER
-+ac_subst_vars='LTLIBOBJS
- LIBOBJS
--LTLIBOBJS'
-+DEPEND_CFLAGS_FILTER
-+MAKEMO
-+MSGFMT
-+INSTALL_TOOL_LANGS
-+INSTALL_LANGS
-+TAGPRG
-+HANGULIN_OBJ
-+HANGULIN_SRC
-+GUI_X_LIBS
-+GUITYPE
-+GUI_LIB_LOC
-+GUI_INC_LOC
-+NARROW_PROTO
-+MOTIF_LIBNAME
-+GNOME_CONFIG
-+GNOME_INCLUDEDIR
-+GNOME_LIBDIR
-+GNOME_LIBS
-+GTK_LIBNAME
-+GTK_LIBS
-+GTK_CFLAGS
-+PKG_CONFIG
-+GTK12_CONFIG
-+GTK_CONFIG
-+X_LIB
-+X_EXTRA_LIBS
-+X_LIBS
-+X_PRE_LIBS
-+X_CFLAGS
-+XMKMF
-+xmkmfpath
-+SNIFF_OBJ
-+SNIFF_SRC
-+NETBEANS_OBJ
-+NETBEANS_SRC
-+WORKSHOP_OBJ
-+WORKSHOP_SRC
-+RUBY_LIBS
-+RUBY_CFLAGS
-+RUBY_PRO
-+RUBY_OBJ
-+RUBY_SRC
-+vi_cv_path_ruby
-+TCL_LIBS
-+TCL_CFLAGS
-+TCL_PRO
-+TCL_OBJ
-+TCL_SRC
-+vi_cv_path_tcl
-+PYTHON_OBJ
-+PYTHON_SRC
-+PYTHON_CFLAGS
-+PYTHON_GETPATH_CFLAGS
-+PYTHON_LIBS
-+PYTHON_CONFDIR
-+vi_cv_path_python
-+PERL_LIBS
-+PERL_CFLAGS
-+PERL_PRO
-+PERL_OBJ
-+PERL_SRC
-+shrpenv
-+vi_cv_perllib
-+vi_cv_path_perl
-+MZSCHEME_MZC
-+MZSCHEME_EXTRA
-+MZSCHEME_CFLAGS
-+MZSCHEME_LIBS
-+MZSCHEME_PRO
-+MZSCHEME_OBJ
-+MZSCHEME_SRC
-+vi_cv_path_mzscheme
-+compiledby
-+dogvimdiff
-+dovimdiff
-+line_break
-+VIEWNAME
-+EXNAME
-+VIMNAME
-+OS_EXTRA_OBJ
-+OS_EXTRA_SRC
-+XCODE_SELECT
-+CPP_MM
-+STRIP
-+AWK
-+EGREP
-+GREP
-+CPP
-+OBJEXT
-+EXEEXT
-+ac_ct_CC
-+CPPFLAGS
-+LDFLAGS
-+CFLAGS
-+CC
-+SET_MAKE
-+target_alias
-+host_alias
-+build_alias
-+LIBS
-+ECHO_T
-+ECHO_N
-+ECHO_C
-+DEFS
-+mandir
-+localedir
-+libdir
-+psdir
-+pdfdir
-+dvidir
-+htmldir
-+infodir
-+docdir
-+oldincludedir
-+includedir
-+localstatedir
-+sharedstatedir
-+sysconfdir
-+datadir
-+datarootdir
-+libexecdir
-+sbindir
-+bindir
-+program_transform_name
-+prefix
-+exec_prefix
-+PACKAGE_BUGREPORT
-+PACKAGE_STRING
-+PACKAGE_VERSION
-+PACKAGE_TARNAME
-+PACKAGE_NAME
-+PATH_SEPARATOR
-+SHELL'
- ac_subst_files=''
- ac_user_opts='
- enable_option_checking
- enable_darwin
- with_mac_arch
-+with_developer_dir
- with_local_dir
- with_vim_name
- with_ex_name
- with_view_name
- with_global_runtime
-@@ -789,10 +793,11 @@ enable_perlinterp
- enable_pythoninterp
- with_python_config_dir
- enable_tclinterp
- with_tclsh
- enable_rubyinterp
-+with_ruby_command
- enable_cscope
- enable_workshop
- enable_netbeans
- enable_sniff
- enable_multibyte
-@@ -1251,13 +1256,13 @@ if test -n "$ac_prev"; then
- fi
- if test -n "$ac_unrecognized_opts"; then
-   case $enable_option_checking in
-     no) ;;
--    fatal) { $as_echo "$as_me: error: Unrecognized options: $ac_unrecognized_opts" >&2
-+    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
-    { (exit 1); exit 1; }; } ;;
--    *)     $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2 ;;
-+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-   esac
- fi
- # Check all directory arguments for consistency.
- for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
-@@ -1306,11 +1311,11 @@ test "$silent" = yes && exec 6>/dev/null
- ac_pwd=`pwd` && test -n "$ac_pwd" &&
- ac_ls_di=`ls -di .` &&
- ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
--  { $as_echo "$as_me: error: Working directory cannot be determined" >&2
-+  { $as_echo "$as_me: error: working directory cannot be determined" >&2
-    { (exit 1); exit 1; }; }
- test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-   { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
-    { (exit 1); exit 1; }; }
-@@ -1487,10 +1492,11 @@ Optional Features:
- Optional Packages:
-   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-   --with-mac-arch=ARCH    current, intel, ppc or both
-+  --with-developer-dir=PATH    use PATH as location for Xcode developer tools
-   --with-local-dir=PATH   search PATH instead of /usr/local for local libraries.
-   --without-local-dir     do not search /usr/local for local libraries.
-   --with-vim-name=NAME    what to call the Vim executable
-   --with-ex-name=NAME     what to call the Ex executable
-   --with-view-name=NAME   what to call the View executable
-@@ -1499,10 +1505,11 @@ Optional Packages:
-   --with-features=TYPE    tiny, small, normal, big or huge (default: normal)
-   --with-compiledby=NAME  name to show in :version message
-   --with-plthome=PLTHOME   Use PLTHOME.
-   --with-python-config-dir=PATH  Python's config directory
-   --with-tclsh=PATH       which tclsh to use (default: tclsh8.0)
-+  --with-ruby-command=RUBY  name of the Ruby command (default: ruby)
-   --with-x                use the X Window System
-   --with-gtk-prefix=PFX   Prefix where GTK is installed (optional)
-   --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)
-   --with-gnome-includes=DIR Specify location of GNOME headers
-   --with-gnome-libs=DIR   Specify location of GNOME libs
-@@ -1585,11 +1592,11 @@ fi
- test -n "$ac_init_help" && exit $ac_status
- if $ac_init_version; then
-   cat <<\_ACEOF
- configure
--generated by GNU Autoconf 2.62
-+generated by GNU Autoconf 2.63
- Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
- This configure script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it.
-@@ -1599,11 +1606,11 @@ fi
- cat >auto/config.log <<_ACEOF
- This file contains any messages produced by compilers while
- running configure, to aid debugging if configure makes a mistake.
+     MZ_REGISTER_STATIC(environment);
+     MZ_REGISTER_STATIC(curout);
+     MZ_REGISTER_STATIC(curerr);
+     MZ_REGISTER_STATIC(exn_catching_apply);
+     MZ_REGISTER_STATIC(exn_p);
+     MZ_REGISTER_STATIC(exn_message);
+     MZ_REGISTER_STATIC(vim_exn);
+-    MZ_REGISTER_STATIC(vim_exn_names);
+-    MZ_REGISTER_STATIC(vim_exn_values);
  
- It was created by $as_me, which was
--generated by GNU Autoconf 2.62.  Invocation command line was
-+generated by GNU Autoconf 2.63.  Invocation command line was
++#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
++    /* in newer versions of precise GC the initial env has been created */
+     environment = scheme_basic_env();
++#endif
++    MZ_GC_CHECK();
++
++#ifdef INCLUDE_MZSCHEME_BASE
++    {
++      /*
++       * versions 4.x do not provide Scheme bindings by default
++       * we need to add them explicitly
++       */
++      Scheme_Object *scheme_base_symbol = NULL;
++      MZ_GC_DECL_REG(1);
++      MZ_GC_VAR_IN_REG(0, scheme_base_symbol);
++      MZ_GC_REG();
++      /* invoke function from generated and included mzscheme_base.c */
++      declare_modules(environment);
++      scheme_base_symbol = scheme_intern_symbol("scheme/base");
++      MZ_GC_CHECK();
++      scheme_namespace_require(scheme_base_symbol);
++      MZ_GC_CHECK();
++      MZ_GC_UNREG();
++    }
++#endif
++    register_vim_exn();
++    /* use new environment to initialise exception handling */
++    init_exn_catching_apply();
  
-   $ $0 $@
+     /* redirect output */
+     scheme_console_output = do_output;
+     scheme_console_printf = do_printf;
  
- _ACEOF
- exec 5>>auto/config.log
-@@ -1722,12 +1729,12 @@ _ASBOX
-   for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-     eval ac_val=\$$ac_var
-     case $ac_val in #(
-     *${as_nl}*)
-       case $ac_var in #(
--      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
--$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
-+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
-+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-       esac
-       case $ac_var in #(
-       _ | IFS | as_nl) ;; #(
-       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-       *) $as_unset $ac_var ;;
-@@ -1926,10 +1933,12 @@ $as_echo "$as_me:   current value: \`$ac
-       *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-     esac
-   fi
- done
- if $ac_cache_corrupted; then
-+  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-   { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
- $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-   { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
- $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
-    { (exit 1); exit 1; }; }
-@@ -2082,16 +2091,12 @@ fi
-   if test "x$ac_ct_CC" = x; then
-     CC=""
-   else
-     case $cross_compiling:$ac_tool_warned in
- yes:)
--{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
--whose name does not start with the host triplet.  If you think this
--configuration is useful to you, please write to autoconf@gnu.org." >&5
--$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
--whose name does not start with the host triplet.  If you think this
--configuration is useful to you, please write to autoconf@gnu.org." >&2;}
-+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
-+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
- ac_tool_warned=yes ;;
- esac
-     CC=$ac_ct_CC
-   fi
- else
-@@ -2286,30 +2291,28 @@ done
-   if test "x$ac_ct_CC" = x; then
-     CC=""
-   else
-     case $cross_compiling:$ac_tool_warned in
- yes:)
--{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
--whose name does not start with the host triplet.  If you think this
--configuration is useful to you, please write to autoconf@gnu.org." >&5
--$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
--whose name does not start with the host triplet.  If you think this
--configuration is useful to you, please write to autoconf@gnu.org." >&2;}
-+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
-+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
- ac_tool_warned=yes ;;
- esac
-     CC=$ac_ct_CC
-   fi
- fi
+ #ifdef MZSCHEME_COLLECTS
+     /* setup 'current-library-collection-paths' parameter */
+-    scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS,
+-          scheme_make_pair(
+ # if MZSCHEME_VERSION_MAJOR >= 299
+-              scheme_char_string_to_path(
+-                  scheme_byte_string_to_char_string(
+-                      scheme_make_byte_string(MZSCHEME_COLLECTS))),
++    {
++      Scheme_Object   *coll_byte_string = NULL;
++      Scheme_Object   *coll_char_string = NULL;
++      Scheme_Object   *coll_path = NULL;
++      Scheme_Object   *coll_pair = NULL;
++      Scheme_Config   *config = NULL;
++
++      MZ_GC_DECL_REG(5);
++      MZ_GC_VAR_IN_REG(0, coll_byte_string);
++      MZ_GC_VAR_IN_REG(1, coll_char_string);
++      MZ_GC_VAR_IN_REG(2, coll_path);
++      MZ_GC_VAR_IN_REG(3, coll_pair);
++      MZ_GC_VAR_IN_REG(4, config);
++      MZ_GC_REG();
++      coll_byte_string = scheme_make_byte_string(MZSCHEME_COLLECTS);
++      MZ_GC_CHECK();
++      coll_char_string = scheme_byte_string_to_char_string(coll_byte_string);
++      MZ_GC_CHECK();
++      coll_path = scheme_char_string_to_path(coll_char_string);
++      MZ_GC_CHECK();
++      coll_pair = scheme_make_pair(coll_path, scheme_null);
++      MZ_GC_CHECK();
++      config = scheme_config;
++      MZ_GC_CHECK();
++      scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
++      MZ_GC_CHECK();
++      MZ_GC_UNREG();
++    }
+ # else
+-              scheme_make_string(MZSCHEME_COLLECTS),
++    {
++      Scheme_Object   *coll_string = NULL;
++      Scheme_Object   *coll_pair = NULL;
++      Scheme_Config   *config = NULL;
++
++      MZ_GC_DECL_REG(3);
++      MZ_GC_VAR_IN_REG(0, coll_string);
++      MZ_GC_VAR_IN_REG(1, coll_pair);
++      MZ_GC_VAR_IN_REG(2, config);
++      MZ_GC_REG();
++      coll_string = scheme_make_string(MZSCHEME_COLLECTS);
++      MZ_GC_CHECK();
++      coll_pair = scheme_make_pair(coll_string, scheme_null);
++      MZ_GC_CHECK();
++      config = scheme_config;
++      MZ_GC_CHECK();
++      scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
++      MZ_GC_CHECK();
++      MZ_GC_UNREG();
++    }
+ # endif
+-              scheme_null));
+ #endif
+ #ifdef HAVE_SANDBOX
+-    /* setup sandbox guards */
+-    proc_make_security_guard = scheme_lookup_global(
+-          scheme_intern_symbol("make-security-guard"),
+-          environment);
+-    if (proc_make_security_guard != NULL)
+-    {
+-      Scheme_Object *args[3];
+-      Scheme_Object *guard;
+-      args[0] = scheme_get_param(scheme_config, MZCONFIG_SECURITY_GUARD);
+-      args[1] = scheme_make_prim_w_arity(sandbox_file_guard,
+-              "sandbox-file-guard", 3, 3);
+-      args[2] = scheme_make_prim_w_arity(sandbox_network_guard,
+-              "sandbox-network-guard", 4, 4);
+-      guard = scheme_apply(proc_make_security_guard, 3, args);
+-      scheme_set_param(scheme_config, MZCONFIG_SECURITY_GUARD, guard);
++    {
++      Scheme_Object   *make_security_guard = NULL;
++      MZ_GC_DECL_REG(1);
++      MZ_GC_VAR_IN_REG(0, make_security_guard);
++      MZ_GC_REG();
++
++#if MZSCHEME_VERSION_MAJOR < 400
++      {
++          Scheme_Object       *make_security_guard_symbol = NULL;
++          MZ_GC_DECL_REG(1);
++          MZ_GC_VAR_IN_REG(0, make_security_guard_symbol);
++          MZ_GC_REG();
++          make_security_guard_symbol = scheme_intern_symbol("make-security-guard");
++          MZ_GC_CHECK();
++          make_security_guard = scheme_lookup_global(
++                  make_security_guard_symbol, environment);
++          MZ_GC_UNREG();
++      }
++#else
++      make_security_guard = scheme_builtin_value("make-security-guard");
++      MZ_GC_CHECK();
++#endif
++
++      /* setup sandbox guards */
++      if (make_security_guard != NULL)
++      {
++          Scheme_Object   *args[3] = {NULL, NULL, NULL};
++          Scheme_Object   *guard = NULL;
++          Scheme_Config   *config = NULL;
++          MZ_GC_DECL_REG(5);
++          MZ_GC_ARRAY_VAR_IN_REG(0, args, 3);
++          MZ_GC_VAR_IN_REG(3, guard);
++          MZ_GC_VAR_IN_REG(4, config);
++          MZ_GC_REG();
++          config = scheme_config;
++          MZ_GC_CHECK();
++          args[0] = scheme_get_param(config, MZCONFIG_SECURITY_GUARD);
++          MZ_GC_CHECK();
++          args[1] = scheme_make_prim_w_arity(sandbox_file_guard,
++                  "sandbox-file-guard", 3, 3);
++          args[2] = scheme_make_prim_w_arity(sandbox_network_guard,
++                  "sandbox-network-guard", 4, 4);
++          guard = scheme_apply(make_security_guard, 3, args);
++          MZ_GC_CHECK();
++          scheme_set_param(config, MZCONFIG_SECURITY_GUARD, guard);
++          MZ_GC_CHECK();
++          MZ_GC_UNREG();
++      }
++      MZ_GC_UNREG();
+     }
+ #endif
+     /* Create buffer and window types for use in Scheme code */
+     mz_buffer_type = scheme_make_type("<vim-buffer>");
++    MZ_GC_CHECK();
+     mz_window_type = scheme_make_type("<vim-window>");
++    MZ_GC_CHECK();
++#ifdef MZ_PRECISE_GC
++    GC_register_traversers(mz_buffer_type,
++          buffer_size_proc, buffer_mark_proc, buffer_fixup_proc,
++          TRUE, TRUE);
++    GC_register_traversers(mz_window_type,
++          window_size_proc, window_mark_proc, window_fixup_proc,
++          TRUE, TRUE);
++#endif
  
- fi
+-    register_vim_exn(environment);
+-    make_modules(environment);
++    make_modules();
  
+     /*
+      * setup callback to receive notifications
+      * whether thread scheduling is (or not) required
+      */
+     scheme_notify_multithread = notify_multithread;
+-    initialized = 1;
+ }
  
--test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
- See \`config.log' for more details." >&5
- $as_echo "$as_me: error: no acceptable C compiler found in \$PATH
- See \`config.log' for more details." >&2;}
--   { (exit 1); exit 1; }; }
-+   { (exit 1); exit 1; }; }; }
+ /*
+  * This routine is called for each new invocation of MzScheme
+  * to make sure things are properly initialized.
+  */
+     static int
+ mzscheme_init(void)
+ {
+-    int do_require = FALSE;
+-
+     if (!initialized)
+     {
+-      do_require = TRUE;
+ #ifdef DYNAMIC_MZSCHEME
+       if (!mzscheme_enabled(TRUE))
+       {
+-          EMSG(_("???: Sorry, this command is disabled, the MzScheme library could not be loaded."));
++          EMSG(_("E815: Sorry, this command is disabled, the MzScheme libraries could not be loaded."));
+           return -1;
+       }
+ #endif
+       startup_mzscheme();
+-
+-      if (mzscheme_io_init())
+-          return -1;
+-
+-    }
+-    /* recreate ports each call effectivelly clearing these ones */
+-    curout = scheme_make_string_output_port();
+-    curerr = scheme_make_string_output_port();
+-    scheme_set_param(scheme_config, MZCONFIG_OUTPUT_PORT, curout);
+-    scheme_set_param(scheme_config, MZCONFIG_ERROR_PORT, curerr);
+-
+-    if (do_require)
+-    {
+-      /* auto-instantiate in basic env */
+-      eval_in_namespace("(require (prefix vimext: vimext))", do_eval,
+-              environment, NULL);
++      initialized = TRUE;
+     }
+-
+-    return 0;
+-}
+-
+-/*
+- * This routine fills the namespace with various important routines that can
+- * be used within MzScheme.
+- */
+-    static void
+-mzscheme_interface_init(vim_mz_buffer *mzbuff)
+-{
+-    Scheme_Object   *attach;
+-
+-    mzbuff->env = (Scheme_Env *)scheme_make_namespace(0, NULL);
+-
+-    /*
+-     * attach instantiated modules from global namespace
+-     * so they can be easily instantiated in the buffer namespace
+-     */
+-    attach = scheme_lookup_global(
+-          scheme_intern_symbol("namespace-attach-module"),
+-          environment);
+-
+-    if (attach != NULL)
+     {
+-      Scheme_Object   *ret;
+-      Scheme_Object   *args[2];
+-
+-      args[0] = (Scheme_Object *)environment;
+-      args[1] = scheme_intern_symbol("vimext");
+-
+-      ret = (Scheme_Object *)mzvim_apply(attach, 2, args);
++      Scheme_Config   *config = NULL;
++      MZ_GC_DECL_REG(1);
++      MZ_GC_VAR_IN_REG(0, config);
++      MZ_GC_REG();
++      config = scheme_config;
++      MZ_GC_CHECK();
++      /* recreate ports each call effectively clearing these ones */
++      curout = scheme_make_string_output_port();
++      MZ_GC_CHECK();
++      curerr = scheme_make_string_output_port();
++      MZ_GC_CHECK();
++      scheme_set_param(config, MZCONFIG_OUTPUT_PORT, curout);
++      MZ_GC_CHECK();
++      scheme_set_param(config, MZCONFIG_ERROR_PORT, curerr);
++      MZ_GC_CHECK();
++      MZ_GC_UNREG();
+     }
  
- # Provide some information about the compiler.
- $as_echo "$as_me:$LINENO: checking for C compiler version" >&5
- set X $ac_compile
- ac_compiler=$2
-@@ -2435,15 +2438,17 @@ fi
- $as_echo "$ac_file" >&6; }
- if test -z "$ac_file"; then
-   $as_echo "$as_me: failed program was:" >&5
- sed 's/^/| /' conftest.$ac_ext >&5
+-    add_vim_exn(mzbuff->env);
++    return 0;
+ }
  
-+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
- See \`config.log' for more details." >&5
- $as_echo "$as_me: error: C compiler cannot create executables
- See \`config.log' for more details." >&2;}
--   { (exit 77); exit 77; }; }
-+   { (exit 77); exit 77; }; }; }
- fi
+ /*
+  *========================================================================
+  *  2.  External Interface
+  *========================================================================
+  */
  
- ac_exeext=$ac_cv_exeext
+ /*
+- * Evaluate command in namespace with exception handling
++ * Evaluate command with exception handling
+  */
+     static int
+-eval_in_namespace(void *data, Scheme_Closed_Prim *what, Scheme_Env *env,
+-              Scheme_Object **ret)
++eval_with_exn_handling(void *data, Scheme_Closed_Prim *what, Scheme_Object **ret)
+ {
+-    Scheme_Object   *value;
+-    Scheme_Object   *exn;
+-    Cmd_Info      info;   /* closure info */
+-
+-    info.data = data;
+-    info.env = env;
+-
+-    scheme_set_param(scheme_config, MZCONFIG_ENV,
+-          (Scheme_Object *) env);
+-    /*
+-     * ensure all evaluations will be in current buffer namespace,
+-     * the second argument to scheme_eval_string isn't enough!
+-     */
+-    value = _apply_thunk_catch_exceptions(
+-          scheme_make_closed_prim_w_arity(what, &info, "mzvim", 0, 0),
+-          &exn);
++    Scheme_Object   *value = NULL;
++    Scheme_Object   *exn = NULL;
++    Scheme_Object   *prim = NULL;
++
++    MZ_GC_DECL_REG(3);
++    MZ_GC_VAR_IN_REG(0, value);
++    MZ_GC_VAR_IN_REG(1, exn);
++    MZ_GC_VAR_IN_REG(2, prim);
++    MZ_GC_REG();
++
++    prim = scheme_make_closed_prim_w_arity(what, data, "mzvim", 0, 0);
++    MZ_GC_CHECK();
++    value = _apply_thunk_catch_exceptions(prim, &exn);
++    MZ_GC_CHECK();
  
- # Check that the compiler produces executables we can run.  If not, either
-@@ -2467,17 +2472,19 @@ $as_echo "$ac_try_echo") >&5
-     cross_compiling=no
-   else
-     if test "$cross_compiling" = maybe; then
-       cross_compiling=yes
-     else
--      { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
-+      { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-+{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
- If you meant to cross compile, use \`--host'.
- See \`config.log' for more details." >&5
- $as_echo "$as_me: error: cannot run C compiled programs.
- If you meant to cross compile, use \`--host'.
- See \`config.log' for more details." >&2;}
--   { (exit 1); exit 1; }; }
-+   { (exit 1); exit 1; }; }; }
-     fi
-   fi
- fi
- { $as_echo "$as_me:$LINENO: result: yes" >&5
- $as_echo "yes" >&6; }
-@@ -2516,15 +2523,17 @@ for ac_file in conftest.exe conftest con
-         break;;
-     * ) break;;
-   esac
- done
- else
--  { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
- See \`config.log' for more details." >&5
- $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
- See \`config.log' for more details." >&2;}
--   { (exit 1); exit 1; }; }
-+   { (exit 1); exit 1; }; }; }
- fi
+     if (!value)
+     {
+       value = extract_exn_message(exn);
+       /* Got an exn? */
+       if (value)
+       {
+-          scheme_display(value, curerr);  /*  Send to stderr-vim */
++          scheme_display(value, curerr);   /*  Send to stderr-vim */
++          MZ_GC_CHECK();
+           do_flush();
+       }
++      MZ_GC_UNREG();
+       /* `raise' was called on some arbitrary value */
+       return FAIL;
+     }
  
- rm -f conftest$ac_cv_exeext
- { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
- $as_echo "$ac_cv_exeext" >&6; }
-@@ -2574,15 +2583,17 @@ $as_echo "$ac_try_echo") >&5
- done
- else
-   $as_echo "$as_me: failed program was:" >&5
- sed 's/^/| /' conftest.$ac_ext >&5
+     if (ret != NULL)  /* if pointer to retval supported give it up */
+       *ret = value;
+     /* Print any result, as long as it's not a void */
+     else if (!SCHEME_VOIDP(value))
++    {
+       scheme_display(value, curout);  /* Send to stdout-vim */
++      MZ_GC_CHECK();
++    }
  
-+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
- See \`config.log' for more details." >&5
- $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
- See \`config.log' for more details." >&2;}
--   { (exit 1); exit 1; }; }
-+   { (exit 1); exit 1; }; }; }
- fi
+     do_flush();
++    MZ_GC_UNREG();
+     return OK;
+ }
  
- rm -f conftest.$ac_cv_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-@@ -3146,15 +3157,17 @@ done
- # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
- rm -f conftest.err conftest.$ac_ext
- if $ac_preproc_ok; then
-   :
- else
--  { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
- See \`config.log' for more details." >&5
- $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
- See \`config.log' for more details." >&2;}
--   { (exit 1); exit 1; }; }
-+   { (exit 1); exit 1; }; }; }
- fi
+ /* :mzscheme */
+     static int
+@@ -957,11 +1128,11 @@ do_mzscheme_command(exarg_T *eap, void *
+       return FAIL;
  
- ac_ext=c
- ac_cpp='$CPP $CPPFLAGS'
- ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-@@ -3821,17 +3834,82 @@ else
-   MACARCH="current"; { $as_echo "$as_me:$LINENO: result: defaulting to $MACARCH" >&5
- $as_echo "defaulting to $MACARCH" >&6; }
- fi
+     range_start = eap->line1;
+     range_end = eap->line2;
  
+-    return eval_in_namespace(data, what, get_vim_curr_buffer()->env, NULL);
++    return eval_with_exn_handling(data, what, NULL);
+ }
  
-+  { $as_echo "$as_me:$LINENO: checking --with-developer-dir argument" >&5
-+$as_echo_n "checking --with-developer-dir argument... " >&6; }
-+
-+# Check whether --with-developer-dir was given.
-+if test "${with_developer_dir+set}" = set; then
-+  withval=$with_developer_dir; DEVELOPER_DIR="$withval"; { $as_echo "$as_me:$LINENO: result: $DEVELOPER_DIR" >&5
-+$as_echo "$DEVELOPER_DIR" >&6; }
-+else
-+  DEVELOPER_DIR=""; { $as_echo "$as_me:$LINENO: result: not present" >&5
-+$as_echo "not present" >&6; }
-+fi
-+
-+
-+  if test "x$DEVELOPER_DIR" = "x"; then
-+    # Extract the first word of "xcode-select", so it can be a program name with args.
-+set dummy xcode-select; ac_word=$2
-+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-+$as_echo_n "checking for $ac_word... " >&6; }
-+if test "${ac_cv_path_XCODE_SELECT+set}" = set; then
-+  $as_echo_n "(cached) " >&6
-+else
-+  case $XCODE_SELECT in
-+  [\\/]* | ?:[\\/]*)
-+  ac_cv_path_XCODE_SELECT="$XCODE_SELECT" # Let the user override the test with a path.
-+  ;;
-+  *)
-+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-+for as_dir in $PATH
-+do
-+  IFS=$as_save_IFS
-+  test -z "$as_dir" && as_dir=.
-+  for ac_exec_ext in '' $ac_executable_extensions; do
-+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-+    ac_cv_path_XCODE_SELECT="$as_dir/$ac_word$ac_exec_ext"
-+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-+    break 2
-+  fi
-+done
-+done
-+IFS=$as_save_IFS
-+
-+  ;;
-+esac
-+fi
-+XCODE_SELECT=$ac_cv_path_XCODE_SELECT
-+if test -n "$XCODE_SELECT"; then
-+  { $as_echo "$as_me:$LINENO: result: $XCODE_SELECT" >&5
-+$as_echo "$XCODE_SELECT" >&6; }
-+else
-+  { $as_echo "$as_me:$LINENO: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+
-+    if test "x$XCODE_SELECT" != "x"; then
-+      { $as_echo "$as_me:$LINENO: checking for developer dir using xcode-select" >&5
-+$as_echo_n "checking for developer dir using xcode-select... " >&6; }
-+      DEVELOPER_DIR=`$XCODE_SELECT -print-path`
-+      { $as_echo "$as_me:$LINENO: result: $DEVELOPER_DIR" >&5
-+$as_echo "$DEVELOPER_DIR" >&6; }
-+    else
-+      DEVELOPER_DIR=/Developer
-+    fi
-+  fi
-+
-   if test "x$MACARCH" = "xboth"; then
-     { $as_echo "$as_me:$LINENO: checking for 10.4 universal SDK" >&5
- $as_echo_n "checking for 10.4 universal SDK... " >&6; }
-                             save_cppflags="$CPPFLAGS"
-     save_cflags="$CFLAGS"
-     save_ldflags="$LDFLAGS"
--    CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
-+    CFLAGS="$CFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
-     cat >conftest.$ac_ext <<_ACEOF
- /* confdefs.h.  */
- _ACEOF
- cat confdefs.h >>conftest.$ac_ext
- cat >>conftest.$ac_ext <<_ACEOF
-@@ -3948,13 +4026,13 @@ rm -f core conftest.err conftest.$ac_obj
-     MACOSX=yes
-     OS_EXTRA_SRC="os_macosx.c os_mac_conv.c";
-     OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
-         CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
-     if test "x$MACARCH" = "xboth"; then
--      CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
-+      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
-     else
--      CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon"
-+      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
-     fi
+ /*
+  * Routine called by VIM when deleting a buffer
+  */
+@@ -974,10 +1145,11 @@ mzscheme_buffer_free(buf_T *buf)
  
-                 # On IRIX 5.3, sys/types and inttypes.h are conflicting.
+       bp = buf->b_mzscheme_ref;
+       bp->buf = INVALID_BUFFER_VALUE;
+       buf->b_mzscheme_ref = NULL;
+       scheme_gc_ptr_ok(bp);
++      MZ_GC_CHECK();
+     }
+ }
  
+ /*
+  * Routine called by VIM when deleting a Window
+@@ -990,10 +1162,11 @@ mzscheme_window_free(win_T *win)
+       vim_mz_window *wp;
+       wp = win->w_mzscheme_ref;
+       wp->win = INVALID_WINDOW_VALUE;
+       win->w_mzscheme_ref = NULL;
+       scheme_gc_ptr_ok(wp);
++      MZ_GC_CHECK();
+     }
+ }
  
-@@ -4014,12 +4092,13 @@ rm -f core conftest.err conftest.$ac_obj
- fi
- ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
+ /*
+  * ":mzscheme" (or ":mz")
+@@ -1014,80 +1187,67 @@ ex_mzscheme(exarg_T *eap)
+           vim_free(script);
+       }
+     }
+ }
  
- fi
-@@ -4152,11 +4231,11 @@ else
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_header_Carbon_Carbon_h" >&5
- $as_echo "$ac_cv_header_Carbon_Carbon_h" >&6; }
+-/* eval MzScheme string */
+-    void *
+-mzvim_eval_string(char_u *str)
+-{
+-    Scheme_Object *ret = NULL;
+-    if (mzscheme_init())
+-      return FAIL;
+-
+-    eval_in_namespace(str, do_eval, get_vim_curr_buffer()->env, &ret);
+-    return ret;
+-}
+-
+-/*
+- * apply MzScheme procedure with arguments,
+- * handling errors
+- */
+-    Scheme_Object *
+-mzvim_apply(Scheme_Object *proc, int argc, Scheme_Object **argv)
+-{
+-    Apply_Info        data;
+-    Scheme_Object *ret = NULL;
+-
+-    if (mzscheme_init())
+-      return FAIL;
+-
+-    data.proc = proc;
+-    data.argc = argc;
+-    data.argv = argv;
+-
+-    eval_in_namespace(&data, do_apply, get_vim_curr_buffer()->env, &ret);
+-    return ret;
+-}
+-
+     static Scheme_Object *
+ do_load(void *data, int noargc, Scheme_Object **noargv)
+ {
+-    Cmd_Info      *info = (Cmd_Info *)data;
+-    Scheme_Object   *result = scheme_void;
+-    Scheme_Object   *expr;
+-    char_u        *file = scheme_malloc_fail_ok(
+-                                        scheme_malloc_atomic, MAXPATHL + 1);
+-    Port_Info     *pinfo = (Port_Info *)(info->data);
++    Scheme_Object   *expr = NULL;
++    Scheme_Object   *result = NULL;
++    char          *file = NULL;
++    Port_Info     *pinfo = (Port_Info *)data;
++
++    MZ_GC_DECL_REG(3);
++    MZ_GC_VAR_IN_REG(0, expr);
++    MZ_GC_VAR_IN_REG(1, result);
++    MZ_GC_VAR_IN_REG(2, file);
++    MZ_GC_REG();
++
++    file = (char *)scheme_malloc_fail_ok(scheme_malloc_atomic, MAXPATHL + 1);
++    MZ_GC_CHECK();
  
- fi
--if test $ac_cv_header_Carbon_Carbon_h = yes; then
-+if test "x$ac_cv_header_Carbon_Carbon_h" = x""yes; then
-   CARBON=yes
- fi
+     /* make Vim expansion */
+-    expand_env((char_u *)pinfo->name, file, MAXPATHL);
+-    /* scheme_load looks strange working with namespaces and error handling*/
++    expand_env((char_u *)pinfo->name, (char_u *)file, MAXPATHL);
+     pinfo->port = scheme_open_input_file(file, "mzfile");
+-    scheme_count_lines(pinfo->port); /* to get accurate read error location*/
++    MZ_GC_CHECK();
++    scheme_count_lines(pinfo->port);  /* to get accurate read error location*/
++    MZ_GC_CHECK();
  
+     /* Like REPL but print only last result */
+     while (!SCHEME_EOFP(expr = scheme_read(pinfo->port)))
+-      result = scheme_eval(expr, info->env);
++    {
++      result = scheme_eval(expr, environment);
++      MZ_GC_CHECK();
++    }
  
-     if test "x$CARBON" = "xyes"; then
-@@ -4482,11 +4561,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_selinux_is_selinux_enabled" >&5
- $as_echo "$ac_cv_lib_selinux_is_selinux_enabled" >&6; }
--if test $ac_cv_lib_selinux_is_selinux_enabled = yes; then
-+if test "x$ac_cv_lib_selinux_is_selinux_enabled" = x""yes; then
-   LIBS="$LIBS -lselinux"
-          cat >>confdefs.h <<\_ACEOF
- #define HAVE_SELINUX 1
- _ACEOF
+-    /* errors will be caught in do_mzscheme_comamnd and ex_mzfile */
++    /* errors will be caught in do_mzscheme_command and ex_mzfile */
+     scheme_close_input_port(pinfo->port);
++    MZ_GC_CHECK();
+     pinfo->port = NULL;
++    MZ_GC_UNREG();
+     return result;
+ }
  
-@@ -4632,12 +4711,12 @@ $as_echo_n "checking PLTHOME environment
-     if test "X$PLTHOME" != "X"; then
-       { $as_echo "$as_me:$LINENO: result: \"$PLTHOME\"" >&5
- $as_echo "\"$PLTHOME\"" >&6; }
-       vi_cv_path_mzscheme_pfx="$PLTHOME"
-     else
--      { $as_echo "$as_me:$LINENO: result: \"not set\"" >&5
--$as_echo "\"not set\"" >&6; }
-+      { $as_echo "$as_me:$LINENO: result: not set" >&5
-+$as_echo "not set" >&6; }
-               # Extract the first word of "mzscheme", so it can be a program name with args.
- set dummy mzscheme; ac_word=$2
- { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
- if test "${ac_cv_path_vi_cv_path_mzscheme+set}" = set; then
-@@ -4688,66 +4767,90 @@ fi
-                   { $as_echo "$as_me:$LINENO: checking MzScheme install prefix" >&5
- $as_echo_n "checking MzScheme install prefix... " >&6; }
- if test "${vi_cv_path_mzscheme_pfx+set}" = set; then
-   $as_echo_n "(cached) " >&6
- else
--   vi_cv_path_mzscheme_pfx=`
--          ${vi_cv_path_mzscheme} -evm \
--          "(display (simplify-path            \
-+                  echo "(display (simplify-path               \
-              (build-path (call-with-values    \
-               (lambda () (split-path (find-system-path (quote exec-file)))) \
--              (lambda (base name must-be-dir?) base)) (quote up))))"`
-+              (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
-+                   vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
-+              sed -e 's+/$++'`
- fi
- { $as_echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme_pfx" >&5
- $as_echo "$vi_cv_path_mzscheme_pfx" >&6; }
--                  vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
-+          rm -f mzdirs.scm
-       fi
-     fi
-   fi
+ /* :mzfile */
+     void
+ ex_mzfile(exarg_T *eap)
+ {
+-    Port_Info pinfo;
++    Port_Info pinfo = {NULL, NULL};
++
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, pinfo.port);
++    MZ_GC_REG();
  
-   SCHEME_INC=
-   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
-     { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include" >&5
- $as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include... " >&6; }
-     if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
--      { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
--$as_echo "\"yes\"" >&6; }
-+      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
-+      { $as_echo "$as_me:$LINENO: result: yes" >&5
-+$as_echo "yes" >&6; }
-     else
--      { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
--$as_echo "\"no\"" >&6; }
--      { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include" >&5
--$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include... " >&6; }
-+      { $as_echo "$as_me:$LINENO: result: no" >&5
-+$as_echo "no" >&6; }
-+      { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt" >&5
-+$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt... " >&6; }
-       if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
--      { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
--$as_echo "\"yes\"" >&6; }
--      SCHEME_INC=/plt
-+      { $as_echo "$as_me:$LINENO: result: yes" >&5
-+$as_echo "yes" >&6; }
-+      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
-       else
--      { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
--$as_echo "\"no\"" >&6; }
--      vi_cv_path_mzscheme_pfx=
-+      { $as_echo "$as_me:$LINENO: result: no" >&5
-+$as_echo "no" >&6; }
-+      { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in /usr/include/plt/" >&5
-+$as_echo_n "checking if scheme.h can be found in /usr/include/plt/... " >&6; }
-+      if test -f /usr/include/plt/scheme.h; then
-+        { $as_echo "$as_me:$LINENO: result: yes" >&5
-+$as_echo "yes" >&6; }
-+        SCHEME_INC=/usr/include/plt
-+      else
-+        { $as_echo "$as_me:$LINENO: result: no" >&5
-+$as_echo "no" >&6; }
-+        vi_cv_path_mzscheme_pfx=
-+      fi
-       fi
-     fi
-   fi
+     pinfo.name = (char *)eap->arg;
+-    pinfo.port = NULL;
+     if (do_mzscheme_command(eap, &pinfo, do_load) != OK
+           && pinfo.port != NULL)      /* looks like port was not closed */
++    {
+       scheme_close_input_port(pinfo.port);
++      MZ_GC_CHECK();
++    }
++    MZ_GC_UNREG();
+ }
  
-   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
-     if test "x$MACOSX" = "xyes"; then
-       MZSCHEME_LIBS="-framework PLT_MzScheme"
-+    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
-+      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
-+      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
-     elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
-       MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
-     else
--      MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
-+            if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
-+        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
-+      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
-+      else
-+        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
-+      fi
-       if test "$GCC" = yes; then
--                      MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
-+                      MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
-       elif test "`(uname) 2>/dev/null`" = SunOS &&
-                              uname -r | grep '^5' >/dev/null; then
--      MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
-+      MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
-       fi
-     fi
-     if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
-       SCHEME_COLLECTS=lib/plt/
-     fi
--    MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC}   \
-+    if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
-+            MZSCHEME_EXTRA="mzscheme_base.c"
-+      MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
-+      MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
-+    fi
-+    MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
-       -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
-     MZSCHEME_SRC="if_mzsch.c"
-     MZSCHEME_OBJ="objects/if_mzsch.o"
-     MZSCHEME_PRO="if_mzsch.pro"
-     cat >>confdefs.h <<\_ACEOF
-@@ -4758,10 +4861,12 @@ _ACEOF
  
+ /*
+  *========================================================================
+@@ -1103,18 +1263,16 @@ init_exn_catching_apply(void)
+       char *e =
+           "(lambda (thunk) "
+               "(with-handlers ([void (lambda (exn) (cons #f exn))]) "
+               "(cons #t (thunk))))";
  
+-      /* make sure we have a namespace with the standard syntax: */
+-      Scheme_Env *env = (Scheme_Env *)scheme_make_namespace(0, NULL);
+-      add_vim_exn(env);
+-
+-      exn_catching_apply = scheme_eval_string(e, env);
+-      exn_p = scheme_lookup_global(scheme_intern_symbol("exn?"), env);
+-      exn_message = scheme_lookup_global(
+-              scheme_intern_symbol("exn-message"), env);
++      exn_catching_apply = scheme_eval_string(e, environment);
++      MZ_GC_CHECK();
++      exn_p = scheme_builtin_value("exn?");
++      MZ_GC_CHECK();
++      exn_message = scheme_builtin_value("exn-message");
++      MZ_GC_CHECK();
+     }
+ }
  
+ /*
+  * This function applies a thunk, returning the Scheme value if there's
+@@ -1124,12 +1282,10 @@ init_exn_catching_apply(void)
+     static Scheme_Object *
+ _apply_thunk_catch_exceptions(Scheme_Object *f, Scheme_Object **exn)
+ {
+     Scheme_Object *v;
  
+-    init_exn_catching_apply();
+-
+     v = _scheme_apply(exn_catching_apply, 1, &f);
+     /* v is a pair: (cons #t value) or (cons #f exn) */
  
-+
-+
- fi
+     if (SCHEME_TRUEP(SCHEME_CAR(v)))
+       return SCHEME_CDR(v);
+@@ -1141,32 +1297,20 @@ _apply_thunk_catch_exceptions(Scheme_Obj
+ }
  
+     static Scheme_Object *
+ extract_exn_message(Scheme_Object *v)
+ {
+-    init_exn_catching_apply();
+-
+     if (SCHEME_TRUEP(_scheme_apply(exn_p, 1, &v)))
+       return _scheme_apply(exn_message, 1, &v);
+     else
+       return NULL; /* Not an exn structure */
+ }
  
- { $as_echo "$as_me:$LINENO: checking --enable-perlinterp argument" >&5
- $as_echo_n "checking --enable-perlinterp argument... " >&6; }
-@@ -5089,11 +5194,11 @@ if test "${vi_cv_path_python_conf+set}"
-   $as_echo_n "(cached) " >&6
- else
+     static Scheme_Object *
+ do_eval(void *s, int noargc, Scheme_Object **noargv)
+ {
+-    Cmd_Info  *info = (Cmd_Info *)s;
+-
+-    return scheme_eval_string_all((char *)(info->data), info->env, TRUE);
+-}
+-
+-    static Scheme_Object *
+-do_apply(void *a, int noargc, Scheme_Object **noargv)
+-{
+-    Apply_Info        *info = (Apply_Info *)(((Cmd_Info *)a)->data);
+-
+-    return scheme_apply(info->proc, info->argc, info->argv);
++    return scheme_eval_string_all((char *)s, environment, TRUE);
+ }
  
-       vi_cv_path_python_conf=
-       for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do
--        for subdir in lib share; do
-+        for subdir in lib64 lib share; do
-           d="${path}/${subdir}/python${vi_cv_var_python_version}/config"
-           if test -d "$d" && test -f "$d/config.c"; then
-             vi_cv_path_python_conf="$d"
-           fi
-         done
-@@ -5666,13 +5771,25 @@ else
- fi
+ /*
+  *========================================================================
+  *  3.  MzScheme I/O Handlers
+@@ -1219,28 +1363,23 @@ do_flush(void)
+ {
+     char *buff;
+     long length;
  
- { $as_echo "$as_me:$LINENO: result: $enable_rubyinterp" >&5
- $as_echo "$enable_rubyinterp" >&6; }
- if test "$enable_rubyinterp" = "yes"; then
-+  { $as_echo "$as_me:$LINENO: checking --with-ruby-command argument" >&5
-+$as_echo_n "checking --with-ruby-command argument... " >&6; }
-+
-+# Check whether --with-ruby-command was given.
-+if test "${with_ruby_command+set}" = set; then
-+  withval=$with_ruby_command; RUBY_CMD="$withval"; { $as_echo "$as_me:$LINENO: result: $RUBY_CMD" >&5
-+$as_echo "$RUBY_CMD" >&6; }
-+else
-+  RUBY_CMD="ruby"; { $as_echo "$as_me:$LINENO: result: defaulting to $RUBY_CMD" >&5
-+$as_echo "defaulting to $RUBY_CMD" >&6; }
-+fi
+     buff = scheme_get_sized_string_output(curerr, &length);
++    MZ_GC_CHECK();
+     if (length)
+     {
+       do_err_output(buff, length);
+       return;
+     }
  
--  # Extract the first word of "ruby", so it can be a program name with args.
--set dummy ruby; ac_word=$2
+     buff = scheme_get_sized_string_output(curout, &length);
++    MZ_GC_CHECK();
+     if (length)
+       do_output(buff, length);
+ }
+-    static int
+-mzscheme_io_init(void)
+-{
+-    /* Nothing needed so far... */
+-    return 0;
+-}
+-
+ /*
+  *========================================================================
+  *  4. Implementation of the Vim Features for MzScheme
+  *========================================================================
+  */
+@@ -1263,26 +1402,34 @@ vim_command(void *data, int argc, Scheme
+ /* (eval {expr-string}) */
+     static Scheme_Object *
+ vim_eval(void *data, int argc, Scheme_Object **argv)
+ {
+ #ifdef FEAT_EVAL
+-    Vim_Prim      *prim = (Vim_Prim *)data;
+-    char          *expr;
+-    char          *str;
+-    Scheme_Object   *result;
++    Vim_Prim          *prim = (Vim_Prim *)data;
++    char              *expr;
++    Scheme_Object     *result;
++    /* hash table to store visited values to avoid infinite loops */
++    Scheme_Hash_Table *visited = NULL;
++    typval_T          *vim_result;
 +
-+  # Extract the first word of "$RUBY_CMD", so it can be a program name with args.
-+set dummy $RUBY_CMD; ac_word=$2
- { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
- if test "${ac_cv_path_vi_cv_path_ruby+set}" = set; then
-   $as_echo_n "(cached) " >&6
- else
-@@ -5715,15 +5832,21 @@ $as_echo_n "checking Ruby version... " >
-     if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
-       { $as_echo "$as_me:$LINENO: result: OK" >&5
- $as_echo "OK" >&6; }
-       { $as_echo "$as_me:$LINENO: checking Ruby header files" >&5
- $as_echo_n "checking Ruby header files... " >&6; }
--      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
-+      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["rubyhdrdir"] || Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
-       if test "X$rubyhdrdir" != "X"; then
-       { $as_echo "$as_me:$LINENO: result: $rubyhdrdir" >&5
- $as_echo "$rubyhdrdir" >&6; }
-       RUBY_CFLAGS="-I$rubyhdrdir"
-+        rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["arch"]'`
-+        if test -d "$rubyhdrdir/$rubyarch"; then
-+          RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
-+        fi
-+        rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["ruby_version"].gsub(/\./, "")[0,2]'`
-+        RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
-       rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LIBS"]'`
-       if test "X$rubylibs" != "X"; then
-         RUBY_LIBS="$rubylibs"
-       fi
-       librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG["LIBRUBYARG"])'`
-@@ -5743,22 +5866,25 @@ $as_echo "$rubyhdrdir" >&6; }
-       if test "X$librubyarg" != "X"; then
-         RUBY_LIBS="$librubyarg $RUBY_LIBS"
-       fi
-       rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LDFLAGS"]'`
-       if test "X$rubyldflags" != "X"; then
--        LDFLAGS="$rubyldflags $LDFLAGS"
-+                                rubyldflags=`echo "$rubyldflags" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//'`
-+        if test "X$rubyldflags" != "X"; then
-+          LDFLAGS="$rubyldflags $LDFLAGS"
-+        fi
-       fi
-       RUBY_SRC="if_ruby.c"
-       RUBY_OBJ="objects/if_ruby.o"
-       RUBY_PRO="if_ruby.pro"
-       cat >>confdefs.h <<\_ACEOF
- #define FEAT_RUBY 1
- _ACEOF
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, visited);
++    MZ_GC_REG();
  
-       else
--      { $as_echo "$as_me:$LINENO: result: not found" >&5
--$as_echo "not found" >&6; }
-+      { $as_echo "$as_me:$LINENO: result: not found; disabling Ruby" >&5
-+$as_echo "not found; disabling Ruby" >&6; }
-       fi
-     else
-       { $as_echo "$as_me:$LINENO: result: too old; need Ruby version 1.6.0 or later" >&5
- $as_echo "too old; need Ruby version 1.6.0 or later" >&6; }
-     fi
-@@ -5889,11 +6015,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5
- $as_echo "$ac_cv_lib_socket_socket" >&6; }
--if test $ac_cv_lib_socket_socket = yes; then
-+if test "x$ac_cv_lib_socket_socket" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBSOCKET 1
- _ACEOF
+-    expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
++    visited = scheme_make_hash_table(SCHEME_hash_ptr);
++    MZ_GC_CHECK();
  
-   LIBS="-lsocket $LIBS"
-@@ -5964,11 +6090,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
- $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
--if test $ac_cv_lib_nsl_gethostbyname = yes; then
-+if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBNSL 1
- _ACEOF
+-    str = (char *)eval_to_string((char_u *)expr, NULL, TRUE);
++    expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
++    vim_result = eval_expr((char_u *)expr, NULL);
  
-   LIBS="-lnsl $LIBS"
-@@ -6201,12 +6327,12 @@ fi
- if test "x$with_x" = xno; then
-   # The user explicitly disabled X.
-   have_x=disabled
- else
-   case $x_includes,$x_libraries in #(
--    *\'*) { { $as_echo "$as_me:$LINENO: error: Cannot use X directory names containing '" >&5
--$as_echo "$as_me: error: Cannot use X directory names containing '" >&2;}
-+    *\'*) { { $as_echo "$as_me:$LINENO: error: cannot use X directory names containing '" >&5
-+$as_echo "$as_me: error: cannot use X directory names containing '" >&2;}
-    { (exit 1); exit 1; }; };; #(
-     *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then
-   $as_echo_n "(cached) " >&6
- else
-   # One or both of the vars are not set, and there is no cached value.
-@@ -6240,11 +6366,11 @@ _ACEOF
-     case $ac_im_incroot in
-       /usr/include) ac_x_includes= ;;
-       *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
-     esac
-     case $ac_im_usrlibdir in
--      /usr/lib | /lib) ;;
-+      /usr/lib | /usr/lib64 | /lib | /lib64) ;;
-       *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
-     esac
-   fi
-   cd ..
-   rm -f -r conftest.dir
-@@ -6680,11 +6806,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
- $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
--if test $ac_cv_lib_dnet_dnet_ntoa = yes; then
-+if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
- fi
+-    if (str == NULL)
++    if (vim_result == NULL)
+       raise_vim_exn(_("invalid expression"));
  
-     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
-       { $as_echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5
-@@ -6750,11 +6876,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
- $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
--if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then
-+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
- fi
+-    result = scheme_make_string(str);
+-
+-    vim_free(str);
++    result = vim_to_mzscheme(vim_result, 1, visited);
++    free_tv(vim_result);
  
-     fi
- fi
-@@ -6922,11 +7048,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
- $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
--if test $ac_cv_lib_nsl_gethostbyname = yes; then
-+if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
- fi
++    MZ_GC_UNREG();
+     return result;
+ #else
+     raise_vim_exn(_("expressions disabled at compile time"));
+     /* unreachable */
+     return scheme_false;
+@@ -1318,11 +1465,11 @@ static Scheme_Object *M_global = NULL;
+ get_option(void *data, int argc, Scheme_Object **argv)
+ {
+     Vim_Prim      *prim = (Vim_Prim *)data;
+     char_u        *name;
+     long          value;
+-    char_u        *strval;
++    char          *strval;
+     int                   rc;
+     Scheme_Object   *rval;
+     int                   opt_flags = 0;
+     buf_T         *save_curb = curbuf;
+     win_T         *save_curw = curwin;
+@@ -1333,10 +1480,11 @@ get_option(void *data, int argc, Scheme_
+     {
+       if (M_global == NULL)
+       {
+           MZ_REGISTER_STATIC(M_global);
+           M_global = scheme_intern_symbol("global");
++          MZ_GC_CHECK();
+       }
  
-       if test $ac_cv_lib_nsl_gethostbyname = no; then
-       { $as_echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5
-@@ -6992,11 +7118,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5
- $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
--if test $ac_cv_lib_bsd_gethostbyname = yes; then
-+if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
- fi
+       if (argv[1] == M_global)
+           opt_flags = OPT_GLOBAL;
+       else if (SCHEME_VIMBUFFERP(argv[1]))
+@@ -1354,20 +1502,21 @@ get_option(void *data, int argc, Scheme_
+       }
+       else
+           scheme_wrong_type(prim->name, "vim-buffer/window", 1, argc, argv);
+     }
  
-       fi
-     fi
-@@ -7158,11 +7284,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
- $as_echo "$ac_cv_lib_socket_connect" >&6; }
--if test $ac_cv_lib_socket_connect = yes; then
-+if test "x$ac_cv_lib_socket_connect" = x""yes; then
-   X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
- fi
+-    rc = get_option_value(name, &value, &strval, opt_flags);
++    rc = get_option_value(name, &value, (char_u **)&strval, opt_flags);
+     curbuf = save_curb;
+     curwin = save_curw;
  
-     fi
+     switch (rc)
+     {
+     case 1:
+       return scheme_make_integer_value(value);
+     case 0:
+       rval = scheme_make_string(strval);
++      MZ_GC_CHECK();
+       vim_free(strval);
+       return rval;
+     case -1:
+     case -2:
+       raise_vim_exn(_("hidden option"));
+@@ -1393,10 +1542,11 @@ set_option(void *data, int argc, Scheme_
+     {
+       if (M_global == NULL)
+       {
+           MZ_REGISTER_STATIC(M_global);
+           M_global = scheme_intern_symbol("global");
++          MZ_GC_CHECK();
+       }
  
-@@ -7317,11 +7443,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5
- $as_echo "$ac_cv_lib_posix_remove" >&6; }
--if test $ac_cv_lib_posix_remove = yes; then
-+if test "x$ac_cv_lib_posix_remove" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
- fi
+       if (argv[1] == M_global)
+           opt_flags = OPT_GLOBAL;
+       else if (SCHEME_VIMBUFFERP(argv[1]))
+@@ -1463,19 +1613,26 @@ get_window_list(void *data, int argc, Sc
+     buf = get_buffer_arg(prim->name, 0, argc, argv);
+     list = scheme_null;
  
-     fi
+     for (w = firstwin; w != NULL; w = w->w_next)
+       if (w->w_buffer == buf->buf)
++      {
+           list = scheme_make_pair(window_new(w), list);
++          MZ_GC_CHECK();
++      }
  
-@@ -7476,11 +7602,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5
- $as_echo "$ac_cv_lib_ipc_shmat" >&6; }
--if test $ac_cv_lib_ipc_shmat = yes; then
-+if test "x$ac_cv_lib_ipc_shmat" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
- fi
+     return list;
+ }
  
-     fi
-   fi
-@@ -7557,11 +7683,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
- $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
--if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then
-+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then
-   X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
- fi
+     static Scheme_Object *
+ window_new(win_T *win)
+ {
+-    vim_mz_window *self;
++    vim_mz_window *self = NULL;
++
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, self);
++    MZ_GC_REG();
  
-   LDFLAGS=$ac_save_LDFLAGS
+     /* We need to handle deletion of windows underneath us.
+      * If we add a "w_mzscheme_ref" field to the win_T structure,
+      * then we can get at it in win_free() in vim.
+      *
+@@ -1485,17 +1642,18 @@ window_new(win_T *win)
+      */
+     if (win->w_mzscheme_ref != NULL)
+       return win->w_mzscheme_ref;
  
-@@ -7725,11 +7851,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&5
- $as_echo "$ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&6; }
--if test $ac_cv_lib_Xdmcp__XdmcpAuthDoIt = yes; then
-+if test "x$ac_cv_lib_Xdmcp__XdmcpAuthDoIt" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -lXdmcp"
- fi
+     self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_window));
+-
+     vim_memset(self, 0, sizeof(vim_mz_window));
+     scheme_dont_gc_ptr(self); /* because win isn't visible to GC */
++    MZ_GC_CHECK();
+     win->w_mzscheme_ref = self;
+     self->win = win;
+-    self->tag = mz_window_type;
++    self->so.type = mz_window_type;
  
++    MZ_GC_UNREG();
+     return (Scheme_Object *)(self);
+ }
  
-                     { $as_echo "$as_me:$LINENO: checking for IceOpenConnection in -lICE" >&5
-@@ -7795,11 +7921,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceOpenConnection" >&5
- $as_echo "$ac_cv_lib_ICE_IceOpenConnection" >&6; }
--if test $ac_cv_lib_ICE_IceOpenConnection = yes; then
-+if test "x$ac_cv_lib_ICE_IceOpenConnection" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -lSM -lICE"
- fi
+ /* (get-win-num [window]) */
+     static Scheme_Object *
+@@ -1660,27 +1818,26 @@ set_cursor(void *data, int argc, Scheme_
+     return scheme_void;
+ }
+ /*
+  *===========================================================================
+  *  6. Vim Buffer-related Manipulation Functions
+- *     Note that each buffer should have its own private namespace.
+  *===========================================================================
+  */
  
+ /* (open-buff {filename}) */
+     static Scheme_Object *
+ mzscheme_open_buffer(void *data, int argc, Scheme_Object **argv)
+ {
+     Vim_Prim      *prim = (Vim_Prim *)data;
+-    char          *fname;
++    char_u        *fname;
+     int                   num = 0;
+     Scheme_Object   *onum;
  
-         LDFLAGS="$X_LIBS $ac_save_LDFLAGS"
-@@ -7866,11 +7992,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&5
- $as_echo "$ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&6; }
--if test $ac_cv_lib_Xpm_XpmCreatePixmapFromData = yes; then
-+if test "x$ac_cv_lib_Xpm_XpmCreatePixmapFromData" = x""yes; then
-   X_PRE_LIBS="$X_PRE_LIBS -lXpm"
- fi
+ #ifdef HAVE_SANDBOX
+     sandbox_check();
+ #endif
+-    fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
++    fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
+     /* TODO make open existing file */
+     num = buflist_add(fname, BLN_LISTED | BLN_CURBUF);
  
+     if (num == 0)
+       raise_vim_exn(_("couldn't open buffer"));
+@@ -1712,11 +1869,11 @@ get_buffer_by_name(void *data, int argc,
+ {
+     Vim_Prim  *prim = (Vim_Prim *)data;
+     buf_T     *buf;
+     char_u    *fname;
  
-         { $as_echo "$as_me:$LINENO: checking if X11 header files implicitly declare return values" >&5
-@@ -7968,10 +8094,86 @@ fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-     CFLAGS=$cflags_save
+-    fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
++    fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
  
-     LDFLAGS="$ac_save_LDFLAGS"
+     for (buf = firstbuf; buf; buf = buf->b_next)
+       if (buf->b_ffname == NULL || buf->b_sfname == NULL)
+           /* empty string */
+       {
+@@ -1783,11 +1940,11 @@ get_buffer_count(void *data, int argc, S
+ get_buffer_name(void *data, int argc, Scheme_Object **argv)
+ {
+     Vim_Prim      *prim = (Vim_Prim *)data;
+     vim_mz_buffer   *buf = get_buffer_arg(prim->name, 0, argc, argv);
  
-+    { $as_echo "$as_me:$LINENO: checking size of wchar_t is 2 bytes" >&5
-+$as_echo_n "checking size of wchar_t is 2 bytes... " >&6; }
-+    if test "${ac_cv_small_wchar_t+set}" = set; then
-+  $as_echo_n "(cached) " >&6
-+else
-+  if test "$cross_compiling" = yes; then
-+  { { $as_echo "$as_me:$LINENO: error: failed to compile test program" >&5
-+$as_echo "$as_me: error: failed to compile test program" >&2;}
-+   { (exit 1); exit 1; }; }
-+else
-+  cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+
-+#include <X11/Xlib.h>
-+#if STDC_HEADERS
-+# include <stdlib.h>
-+# include <stddef.h>
-+#endif
-+              main()
-+              {
-+                if (sizeof(wchar_t) <= 2)
-+                  exit(1);
-+                exit(0);
-+              }
-+_ACEOF
-+rm -f conftest$ac_exeext
-+if { (ac_try="$ac_link"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_link") 2>&5
-+  ac_status=$?
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-+  { (case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_try") 2>&5
-+  ac_status=$?
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); }; }; then
-+  ac_cv_small_wchar_t="no"
-+else
-+  $as_echo "$as_me: program exited with status $ac_status" >&5
-+$as_echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
-+
-+( exit $ac_status )
-+ac_cv_small_wchar_t="yes"
-+fi
-+rm -rf conftest.dSYM
-+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-+fi
-+
-+
-+fi
-+
-+    { $as_echo "$as_me:$LINENO: result: $ac_cv_small_wchar_t" >&5
-+$as_echo "$ac_cv_small_wchar_t" >&6; }
-+    if test "x$ac_cv_small_wchar_t" = "xyes" ; then
-+      cat >>confdefs.h <<\_ACEOF
-+#define SMALL_WCHAR_T 1
-+_ACEOF
-+
-+    fi
-+
-   fi
- fi
+-    return scheme_make_string(buf->buf->b_ffname);
++    return scheme_make_string((char *)buf->buf->b_ffname);
+ }
  
- test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no
+ /* (curr-buff) */
+     static Scheme_Object *
+ get_curr_buffer(void *data, int argc, Scheme_Object **argv)
+@@ -1796,29 +1953,32 @@ get_curr_buffer(void *data, int argc, Sc
+ }
  
-@@ -9249,11 +9451,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xext_XShapeQueryExtension" >&5
- $as_echo "$ac_cv_lib_Xext_XShapeQueryExtension" >&6; }
--if test $ac_cv_lib_Xext_XShapeQueryExtension = yes; then
-+if test "x$ac_cv_lib_Xext_XShapeQueryExtension" = x""yes; then
-   GUI_X_LIBS="-lXext"
- fi
+     static Scheme_Object *
+ buffer_new(buf_T *buf)
+ {
+-    vim_mz_buffer *self;
++    vim_mz_buffer *self = NULL;
++
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, self);
++    MZ_GC_REG();
  
-     { $as_echo "$as_me:$LINENO: checking for wslen in -lw" >&5
- $as_echo_n "checking for wslen in -lw... " >&6; }
-@@ -9318,11 +9520,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_w_wslen" >&5
- $as_echo "$ac_cv_lib_w_wslen" >&6; }
--if test $ac_cv_lib_w_wslen = yes; then
-+if test "x$ac_cv_lib_w_wslen" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -lw"
- fi
+     /* We need to handle deletion of buffers underneath us.
+      * If we add a "b_mzscheme_ref" field to the buf_T structure,
+      * then we can get at it in buf_freeall() in vim.
+      */
+     if (buf->b_mzscheme_ref)
+       return buf->b_mzscheme_ref;
  
-   { $as_echo "$as_me:$LINENO: checking for dlsym in -ldl" >&5
- $as_echo_n "checking for dlsym in -ldl... " >&6; }
-@@ -9387,11 +9589,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlsym" >&5
- $as_echo "$ac_cv_lib_dl_dlsym" >&6; }
--if test $ac_cv_lib_dl_dlsym = yes; then
-+if test "x$ac_cv_lib_dl_dlsym" = x""yes; then
-   X_EXTRA_LIBS="$X_EXTRA_LIBS -ldl"
- fi
+     self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_buffer));
+-
+     vim_memset(self, 0, sizeof(vim_mz_buffer));
+-    scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */
++    scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */
++    MZ_GC_CHECK();
+     buf->b_mzscheme_ref = self;
+     self->buf = buf;
+-    self->tag = mz_buffer_type;
+-
+-    mzscheme_interface_init(self);    /* Set up namespace */
++    self->so.type = mz_buffer_type;
  
-   { $as_echo "$as_me:$LINENO: checking for XmuCreateStippledPixmap in -lXmu" >&5
- $as_echo_n "checking for XmuCreateStippledPixmap in -lXmu... " >&6; }
-@@ -9456,11 +9658,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&5
- $as_echo "$ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&6; }
--if test $ac_cv_lib_Xmu_XmuCreateStippledPixmap = yes; then
-+if test "x$ac_cv_lib_Xmu_XmuCreateStippledPixmap" = x""yes; then
-   GUI_X_LIBS="-lXmu $GUI_X_LIBS"
- fi
++    MZ_GC_UNREG();
+     return (Scheme_Object *)(self);
+ }
  
-   if test -z "$SKIP_MOTIF"; then
-     { $as_echo "$as_me:$LINENO: checking for XpEndJob in -lXp" >&5
-@@ -9526,11 +9728,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xp_XpEndJob" >&5
- $as_echo "$ac_cv_lib_Xp_XpEndJob" >&6; }
--if test $ac_cv_lib_Xp_XpEndJob = yes; then
-+if test "x$ac_cv_lib_Xp_XpEndJob" = x""yes; then
-   GUI_X_LIBS="-lXp $GUI_X_LIBS"
- fi
-   fi
-   LDFLAGS=$ldflags_save
-@@ -9697,12 +9899,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
+ /*
+  * (get-buff-size [buffer])
+@@ -1845,18 +2005,18 @@ get_buffer_size(void *data, int argc, Sc
+ get_buffer_line(void *data, int argc, Scheme_Object **argv)
+ {
+     Vim_Prim      *prim = (Vim_Prim *)data;
+     vim_mz_buffer   *buf;
+     int                   linenr;
+-    char          *line;
++    char_u        *line;
  
- fi
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
+     buf = get_buffer_arg(prim->name, 1, argc, argv);
+     linenr = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
+     line = ml_get_buf(buf->buf, (linenr_T)linenr, FALSE);
  
- fi
-@@ -9850,12 +10053,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
+     raise_if_error();
+-    return scheme_make_string(line);
++    return scheme_make_string((char *)line);
+ }
  
- fi
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
  
- fi
-@@ -10096,12 +10300,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
+ /*
+  * (get-buff-line-list {start} {end} [buffer])
+@@ -1869,11 +2029,15 @@ get_buffer_line(void *data, int argc, Sc
+ get_buffer_line_list(void *data, int argc, Scheme_Object **argv)
+ {
+     Vim_Prim      *prim = (Vim_Prim *)data;
+     vim_mz_buffer   *buf;
+     int                   i, hi, lo, n;
+-    Scheme_Object   *list;
++    Scheme_Object   *list = NULL;
++
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, list);
++    MZ_GC_REG();
  
- fi
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
+     buf = get_buffer_arg(prim->name, 2, argc, argv);
+     list = scheme_null;
+     hi = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 1));
+     lo = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
+@@ -1897,12 +2061,13 @@ get_buffer_line_list(void *data, int arg
+                      (char *)ml_get_buf(buf->buf, (linenr_T)(lo+i), FALSE));
+       raise_if_error();
  
- fi
-@@ -10360,10 +10565,60 @@ sed 's/^/| /' conftest.$ac_ext >&5
- $as_echo "no" >&6; }
- fi
+       /* Set the list item */
+       list = scheme_make_pair(str, list);
++      MZ_GC_CHECK();
+     }
+-
++    MZ_GC_UNREG();
+     return list;
+ }
  
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ /*
+  * (set-buff-line {linenr} {string/#f} [buffer])
+@@ -1917,23 +2082,26 @@ get_buffer_line_list(void *data, int arg
+  * string changed.
+  */
+     static Scheme_Object *
+ set_buffer_line(void *data, int argc, Scheme_Object **argv)
+ {
+-    /* First of all, we check the the of the supplied MzScheme object.
++    /* First of all, we check the value of the supplied MzScheme object.
+      * There are three cases:
+      *          1. #f - this is a deletion.
+      *          2. A string      - this is a replacement.
+      *          3. Anything else - this is an error.
+      */
+     Vim_Prim      *prim = (Vim_Prim *)data;
+     vim_mz_buffer   *buf;
+-    Scheme_Object   *line;
++    Scheme_Object   *line = NULL;
+     char          *save;
+-    buf_T         *savebuf;
+     int                   n;
  
-+{ $as_echo "$as_me:$LINENO: checking whether __attribute__((unused)) is allowed" >&5
-+$as_echo_n "checking whether __attribute__((unused)) is allowed... " >&6; }
-+cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+#include <stdio.h>
-+int
-+main ()
-+{
-+int x __attribute__((unused));
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+rm -f conftest.$ac_objext
-+if { (ac_try="$ac_compile"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_compile") 2>conftest.er1
-+  ac_status=$?
-+  grep -v '^ *+' conftest.er1 >conftest.err
-+  rm -f conftest.er1
-+  cat conftest.err >&5
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && {
-+       test -z "$ac_c_werror_flag" ||
-+       test ! -s conftest.err
-+       } && test -s conftest.$ac_objext; then
-+  { $as_echo "$as_me:$LINENO: result: yes" >&5
-+$as_echo "yes" >&6; }; cat >>confdefs.h <<\_ACEOF
-+#define HAVE_ATTRIBUTE_UNUSED 1
-+_ACEOF
-+
-+else
-+  $as_echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
-+
-+      { $as_echo "$as_me:$LINENO: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, line);
++    MZ_GC_REG();
 +
- if test "${ac_cv_header_elf_h+set}" = set; then
-   { $as_echo "$as_me:$LINENO: checking for elf.h" >&5
- $as_echo_n "checking for elf.h... " >&6; }
- if test "${ac_cv_header_elf_h+set}" = set; then
-   $as_echo_n "(cached) " >&6
-@@ -10487,11 +10742,11 @@ else
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_header_elf_h" >&5
- $as_echo "$ac_cv_header_elf_h" >&6; }
+ #ifdef HAVE_SANDBOX
+     sandbox_check();
+ #endif
+     n = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
+     if (!SCHEME_STRINGP(argv[1]) && !SCHEME_FALSEP(argv[1]))
+@@ -1943,11 +2111,12 @@ set_buffer_line(void *data, int argc, Sc
  
- fi
--if test $ac_cv_header_elf_h = yes; then
-+if test "x$ac_cv_header_elf_h" = x""yes; then
-   HAS_ELF=1
- fi
+     check_line_range(n, buf->buf);
  
+     if (SCHEME_FALSEP(line))
+     {
+-      savebuf = curbuf;
++      buf_T       *savebuf = curbuf;
++
+       curbuf = buf->buf;
  
- if test "$HAS_ELF" = 1; then
-@@ -10553,11 +10808,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_elf_main" >&5
- $as_echo "$ac_cv_lib_elf_main" >&6; }
--if test $ac_cv_lib_elf_main = yes; then
-+if test "x$ac_cv_lib_elf_main" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBELF 1
- _ACEOF
+       if (u_savedel((linenr_T)n, 1L) == FAIL)
+       {
+           curbuf = savebuf;
+@@ -1956,43 +2125,66 @@ set_buffer_line(void *data, int argc, Sc
+       else if (ml_delete((linenr_T)n, FALSE) == FAIL)
+       {
+           curbuf = savebuf;
+           raise_vim_exn(_("cannot delete line"));
+       }
+-      deleted_lines_mark((linenr_T)n, 1L);
+       if (buf->buf == curwin->w_buffer)
+           mz_fix_cursor(n, n + 1, -1);
++      deleted_lines_mark((linenr_T)n, 1L);
  
-   LIBS="-lelf $LIBS"
-@@ -10627,12 +10882,13 @@ rm -f core conftest.err conftest.$ac_obj
- fi
- ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
- _ACEOF
+       curbuf = savebuf;
  
- ac_header_dirent=$ac_hdr; break
-@@ -10914,19 +11170,18 @@ fi
++      MZ_GC_UNREG();
+       raise_if_error();
+       return scheme_void;
+     }
++    else
++    {
++      /* Otherwise it's a line */
++      buf_T       *savebuf = curbuf;
  
+-    /* Otherwise it's a line */
+-    save = string_to_line(line);
+-    savebuf = curbuf;
++      save = string_to_line(line);
  
+-    curbuf = buf->buf;
++      curbuf = buf->buf;
++
++      if (u_savesub((linenr_T)n) == FAIL)
++      {
++          curbuf = savebuf;
++          vim_free(save);
++          raise_vim_exn(_("cannot save undo information"));
++      }
++      else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL)
++      {
++          curbuf = savebuf;
++          vim_free(save);
++          raise_vim_exn(_("cannot replace line"));
++      }
++      else
++      {
++          vim_free(save);
++          changed_bytes((linenr_T)n, 0);
++      }
  
+-    if (u_savesub((linenr_T)n) == FAIL)
+-    {
+-      curbuf = savebuf;
+-      raise_vim_exn(_("cannot save undo information"));
+-    }
+-    else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL)
+-    {
+       curbuf = savebuf;
+-      raise_vim_exn(_("cannot replace line"));
+-    }
+-    else
+-      changed_bytes((linenr_T)n, 0);
  
+-    curbuf = savebuf;
++      /* Check that the cursor is not beyond the end of the line now. */
++      if (buf->buf == curwin->w_buffer)
++          check_cursor_col();
  
--
- for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \
-       termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h sys/types.h termio.h \
-       iconv.h langinfo.h math.h unistd.h stropts.h errno.h \
-       sys/resource.h sys/systeminfo.h locale.h \
-       sys/stream.h termios.h libc.h sys/statfs.h \
-       poll.h sys/poll.h pwd.h utime.h sys/param.h libintl.h \
-       libgen.h util/debug.h util/msg18n.h frame.h \
--      sys/acl.h sys/access.h sys/sysctl.h sys/sysinfo.h wchar.h wctype.h
-+      sys/acl.h sys/access.h sys/sysinfo.h wchar.h wctype.h
- do
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-   { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
- $as_echo_n "checking for $ac_header... " >&6; }
-@@ -11048,31 +11303,97 @@ esac
- { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
- $as_echo_n "checking for $ac_header... " >&6; }
- if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-   $as_echo_n "(cached) " >&6
- else
--  eval "$as_ac_Header=\$ac_header_preproc"
-+  eval "$as_ac_Header=\$ac_header_preproc"
-+fi
-+ac_res=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+             { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
-+$as_echo "$ac_res" >&6; }
-+
-+fi
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-+  cat >>confdefs.h <<_ACEOF
-+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-+_ACEOF
-+
-+fi
-+
-+done
-+
-+
-+
-+for ac_header in sys/ptem.h
-+do
-+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
-+$as_echo_n "checking for $ac_header... " >&6; }
-+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-+  $as_echo_n "(cached) " >&6
-+else
-+  cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+#if defined HAVE_SYS_STREAM_H
-+#  include <sys/stream.h>
-+#endif
-+
-+#include <$ac_header>
-+_ACEOF
-+rm -f conftest.$ac_objext
-+if { (ac_try="$ac_compile"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_compile") 2>conftest.er1
-+  ac_status=$?
-+  grep -v '^ *+' conftest.er1 >conftest.err
-+  rm -f conftest.er1
-+  cat conftest.err >&5
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && {
-+       test -z "$ac_c_werror_flag" ||
-+       test ! -s conftest.err
-+       } && test -s conftest.$ac_objext; then
-+  eval "$as_ac_Header=yes"
-+else
-+  $as_echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
-+
-+      eval "$as_ac_Header=no"
-+fi
+-    raise_if_error();
+-    return scheme_void;
++      MZ_GC_UNREG();
++      raise_if_error();
++      return scheme_void;
++    }
++}
 +
-+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--
--fi
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
++    static void
++free_array(char **array)
++{
++    char **curr = array;
++    while (*curr != NULL)
++      vim_free(*curr++);
++    vim_free(array);
+ }
  
- fi
+ /*
+  * (set-buff-line-list {start} {end} {string-list/#f/null} [buffer])
+  *
+@@ -2013,19 +2205,19 @@ set_buffer_line_list(void *data, int arg
+      *          1. #f - this is a deletion.
+      *          2. A list        - this is a replacement.
+      *          3. Anything else - this is an error.
+      */
+     Vim_Prim      *prim = (Vim_Prim *)data;
+-    vim_mz_buffer   *buf;
+-    Scheme_Object   *line_list;
+-    Scheme_Object   *line;
+-    Scheme_Object   *rest;
+-    char          **array;
+-    buf_T         *savebuf;
++    vim_mz_buffer   *buf = NULL;
++    Scheme_Object   *line_list = NULL;
+     int                   i, old_len, new_len, hi, lo;
+     long          extra;
  
- done
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, line_list);
++    MZ_GC_REG();
++
+ #ifdef HAVE_SANDBOX
+     sandbox_check();
+ #endif
+     lo = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
+     hi = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 1));
+@@ -2047,11 +2239,11 @@ set_buffer_line_list(void *data, int arg
+     check_line_range(lo, buf->buf);       /* inclusive */
+     check_line_range(hi - 1, buf->buf);           /* exclusive */
  
+     if (SCHEME_FALSEP(line_list) || SCHEME_NULLP(line_list))
+     {
+-      savebuf = curbuf;
++      buf_T   *savebuf = curbuf;
+       curbuf = buf->buf;
  
+       if (u_savedel((linenr_T)lo, (long)old_len) == FAIL)
+       {
+           curbuf = savebuf;
+@@ -2063,115 +2255,138 @@ set_buffer_line_list(void *data, int arg
+               if (ml_delete((linenr_T)lo, FALSE) == FAIL)
+               {
+                   curbuf = savebuf;
+                   raise_vim_exn(_("cannot delete line"));
+               }
+-          deleted_lines_mark((linenr_T)lo, (long)old_len);
+           if (buf->buf == curwin->w_buffer)
+               mz_fix_cursor(lo, hi, -old_len);
++          deleted_lines_mark((linenr_T)lo, (long)old_len);
+       }
  
--for ac_header in sys/ptem.h
-+for ac_header in sys/sysctl.h
- do
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
- $as_echo_n "checking for $ac_header... " >&6; }
- if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-@@ -11082,12 +11403,12 @@ else
- /* confdefs.h.  */
- _ACEOF
- cat confdefs.h >>conftest.$ac_ext
- cat >>conftest.$ac_ext <<_ACEOF
- /* end confdefs.h.  */
--#if defined HAVE_SYS_STREAM_H
--#  include <sys/stream.h>
-+#if defined HAVE_SYS_PARAM_H
-+#  include <sys/param.h>
- #endif
+       curbuf = savebuf;
  
- #include <$ac_header>
- _ACEOF
- rm -f conftest.$ac_objext
-@@ -11120,12 +11441,13 @@ rm -f core conftest.err conftest.$ac_obj
- fi
- ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
++      MZ_GC_UNREG();
+       raise_if_error();
+       return scheme_void;
+     }
++    else
++    {
++      buf_T   *savebuf = curbuf;
  
- fi
-@@ -11320,12 +11642,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
- fi
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
- fi
-@@ -11563,10 +11886,71 @@ cat >>confdefs.h <<\_ACEOF
- #define const /**/
- _ACEOF
- fi
-+{ $as_echo "$as_me:$LINENO: checking for working volatile" >&5
-+$as_echo_n "checking for working volatile... " >&6; }
-+if test "${ac_cv_c_volatile+set}" = set; then
-+  $as_echo_n "(cached) " >&6
-+else
-+  cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+
-+int
-+main ()
-+{
-+
-+volatile int x;
-+int * volatile y = (int *) 0;
-+return !x && !y;
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+rm -f conftest.$ac_objext
-+if { (ac_try="$ac_compile"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_compile") 2>conftest.er1
-+  ac_status=$?
-+  grep -v '^ *+' conftest.er1 >conftest.err
-+  rm -f conftest.er1
-+  cat conftest.err >&5
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && {
-+       test -z "$ac_c_werror_flag" ||
-+       test ! -s conftest.err
-+       } && test -s conftest.$ac_objext; then
-+  ac_cv_c_volatile=yes
-+else
-+  $as_echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
-+
-+      ac_cv_c_volatile=no
-+fi
-+
-+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-+fi
-+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5
-+$as_echo "$ac_cv_c_volatile" >&6; }
-+if test $ac_cv_c_volatile = no; then
-+
-+cat >>confdefs.h <<\_ACEOF
-+#define volatile /**/
-+_ACEOF
-+
-+fi
+-    /* List */
+-    new_len = scheme_proper_list_length(line_list);
+-    if (new_len < 0)  /* improper or cyclic list */
+-      scheme_wrong_type(prim->name, "proper list",
+-              2, argc, argv);
++      /* List */
++      new_len = scheme_proper_list_length(line_list);
++      MZ_GC_CHECK();
++      if (new_len < 0)        /* improper or cyclic list */
++          scheme_wrong_type(prim->name, "proper list",
++                  2, argc, argv);
++      else
++      {
++          char                **array = NULL;
++          Scheme_Object   *line = NULL;
++          Scheme_Object   *rest = NULL;
 +
- { $as_echo "$as_me:$LINENO: checking for mode_t" >&5
- $as_echo_n "checking for mode_t... " >&6; }
- if test "${ac_cv_type_mode_t+set}" = set; then
-   $as_echo_n "(cached) " >&6
- else
-@@ -11657,11 +12041,11 @@ fi
++          MZ_GC_DECL_REG(2);
++          MZ_GC_VAR_IN_REG(0, line);
++          MZ_GC_VAR_IN_REG(1, rest);
++          MZ_GC_REG();
  
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5
- $as_echo "$ac_cv_type_mode_t" >&6; }
--if test $ac_cv_type_mode_t = yes; then
-+if test "x$ac_cv_type_mode_t" = x""yes; then
-   :
- else
+-    /* Using MzScheme allocator, so we don't need to free this and
+-     * can safely keep pointers to GC collected strings
+-     */
+-    array = (char **)scheme_malloc_fail_ok(scheme_malloc,
+-              (unsigned)(new_len * sizeof(char *)));
++          array = (char **)alloc(new_len * sizeof(char *));
++          vim_memset(array, 0, new_len * sizeof(char *));
  
- cat >>confdefs.h <<_ACEOF
- #define mode_t int
-@@ -11761,11 +12145,11 @@ fi
+-    rest = line_list;
+-    for (i = 0; i < new_len; ++i)
+-    {
+-      line = SCHEME_CAR(rest);
+-      rest = SCHEME_CDR(rest);
+-      if (!SCHEME_STRINGP(line))
+-          scheme_wrong_type(prim->name, "string-list", 2, argc, argv);
+-      array[i] = string_to_line(line);
+-    }
++          rest = line_list;
++          for (i = 0; i < new_len; ++i)
++          {
++              line = SCHEME_CAR(rest);
++              rest = SCHEME_CDR(rest);
++              if (!SCHEME_STRINGP(line))
++              {
++                  free_array(array);
++                  scheme_wrong_type(prim->name, "string-list", 2, argc, argv);
++              }
++              array[i] = string_to_line(line);
++          }
  
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
- $as_echo "$ac_cv_type_off_t" >&6; }
--if test $ac_cv_type_off_t = yes; then
-+if test "x$ac_cv_type_off_t" = x""yes; then
-   :
- else
+-    savebuf = curbuf;
+-    curbuf = buf->buf;
++          curbuf = buf->buf;
  
- cat >>confdefs.h <<_ACEOF
- #define off_t long int
-@@ -11865,11 +12249,11 @@ fi
+-    if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
+-    {
+-      curbuf = savebuf;
+-      raise_vim_exn(_("cannot save undo information"));
+-    }
++          if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
++          {
++              curbuf = savebuf;
++              free_array(array);
++              raise_vim_exn(_("cannot save undo information"));
++          }
  
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5
- $as_echo "$ac_cv_type_pid_t" >&6; }
--if test $ac_cv_type_pid_t = yes; then
-+if test "x$ac_cv_type_pid_t" = x""yes; then
-   :
- else
+-    /*
+-     * If the size of the range is reducing (ie, new_len < old_len) we
+-     * need to delete some old_len. We do this at the start, by
+-     * repeatedly deleting line "lo".
+-     */
+-    for (i = 0; i < old_len - new_len; ++i)
+-    {
+-      if (ml_delete((linenr_T)lo, FALSE) == FAIL)
+-      {
+-          curbuf = savebuf;
+-          raise_vim_exn(_("cannot delete line"));
+-      }
+-      extra--;
+-    }
++          /*
++           * If the size of the range is reducing (ie, new_len < old_len) we
++           * need to delete some old_len. We do this at the start, by
++           * repeatedly deleting line "lo".
++           */
++          for (i = 0; i < old_len - new_len; ++i)
++          {
++              if (ml_delete((linenr_T)lo, FALSE) == FAIL)
++              {
++                  curbuf = savebuf;
++                  free_array(array);
++                  raise_vim_exn(_("cannot delete line"));
++              }
++              extra--;
++          }
  
- cat >>confdefs.h <<_ACEOF
- #define pid_t int
-@@ -11969,11 +12353,11 @@ fi
+-    /*
+-     * For as long as possible, replace the existing old_len with the
+-     * new old_len. This is a more efficient operation, as it requires
+-     * less memory allocation and freeing.
+-     */
+-    for (i = 0; i < old_len && i < new_len; i++)
+-      if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL)
+-      {
+-          curbuf = savebuf;
+-          raise_vim_exn(_("cannot replace line"));
+-      }
++          /*
++           * For as long as possible, replace the existing old_len with the
++           * new old_len. This is a more efficient operation, as it requires
++           * less memory allocation and freeing.
++           */
++          for (i = 0; i < old_len && i < new_len; i++)
++              if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL)
++              {
++                  curbuf = savebuf;
++                  free_array(array);
++                  raise_vim_exn(_("cannot replace line"));
++              }
  
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
- $as_echo "$ac_cv_type_size_t" >&6; }
--if test $ac_cv_type_size_t = yes; then
-+if test "x$ac_cv_type_size_t" = x""yes; then
-   :
- else
+-    /*
+-     * Now we may need to insert the remaining new_len.  We don't need to
+-     * free the string passed back because MzScheme has control of that
+-     * memory.
+-     */
+-    while (i < new_len)
+-    {
+-      if (ml_append((linenr_T)(lo + i - 1),
+-              (char_u *)array[i], 0, FALSE) == FAIL)
+-      {
+-          curbuf = savebuf;
+-          raise_vim_exn(_("cannot insert line"));
++          /*
++           * Now we may need to insert the remaining new_len.  We don't need to
++           * free the string passed back because MzScheme has control of that
++           * memory.
++           */
++          while (i < new_len)
++          {
++              if (ml_append((linenr_T)(lo + i - 1),
++                          (char_u *)array[i], 0, FALSE) == FAIL)
++              {
++                  curbuf = savebuf;
++                  free_array(array);
++                  raise_vim_exn(_("cannot insert line"));
++              }
++              ++i;
++              ++extra;
++          }
++          MZ_GC_UNREG();
++          free_array(array);
+       }
+-      ++i;
+-      ++extra;
+-    }
  
- cat >>confdefs.h <<_ACEOF
- #define size_t unsigned int
-@@ -12173,11 +12557,11 @@ fi
+-    /*
+-     * Adjust marks. Invalidate any which lie in the
+-     * changed range, and move any in the remainder of the buffer.
+-     */
+-    mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra);
+-    changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
++      /*
++       * Adjust marks. Invalidate any which lie in the
++       * changed range, and move any in the remainder of the buffer.
++       */
++      mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra);
++      changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
  
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_type_ino_t" >&5
- $as_echo "$ac_cv_type_ino_t" >&6; }
--if test $ac_cv_type_ino_t = yes; then
-+if test "x$ac_cv_type_ino_t" = x""yes; then
-   :
- else
+-    if (buf->buf == curwin->w_buffer)
+-      mz_fix_cursor(lo, hi, extra);
+-    curbuf = savebuf;
++      if (buf->buf == curwin->w_buffer)
++          mz_fix_cursor(lo, hi, extra);
++      curbuf = savebuf;
  
- cat >>confdefs.h <<_ACEOF
- #define ino_t long
-@@ -12277,11 +12661,11 @@ fi
+-    raise_if_error();
+-    return scheme_void;
++      MZ_GC_UNREG();
++      raise_if_error();
++      return scheme_void;
++    }
+ }
  
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_type_dev_t" >&5
- $as_echo "$ac_cv_type_dev_t" >&6; }
--if test $ac_cv_type_dev_t = yes; then
-+if test "x$ac_cv_type_dev_t" = x""yes; then
-   :
- else
+ /*
+  * (insert-buff-line-list {linenr} {string/string-list} [buffer])
+  *
+- * Insert a number of lines into the specified buffer after the specifed line.
++ * Insert a number of lines into the specified buffer after the specified line.
+  * The line number is in Vim format (1-based). The lines to be inserted are
+  * given as an MzScheme list of string objects or as a single string. The lines
+  * to be added are checked for validity and correct format. Errors are
+  * returned as a value of FAIL.  The return value is OK on success.
+  * If OK is returned and len_change is not NULL, *len_change
+@@ -2179,19 +2394,19 @@ set_buffer_line_list(void *data, int arg
+  */
+     static Scheme_Object *
+ insert_buffer_line_list(void *data, int argc, Scheme_Object **argv)
+ {
+     Vim_Prim      *prim = (Vim_Prim *)data;
+-    vim_mz_buffer   *buf;
+-    Scheme_Object   *list;
+-    Scheme_Object   *line;
+-    Scheme_Object   *rest;
+-    char          **array;
+-    char          *str;
+-    buf_T         *savebuf;
++    vim_mz_buffer   *buf = NULL;
++    Scheme_Object   *list = NULL;
++    char          *str = NULL;
+     int                   i, n, size;
  
- cat >>confdefs.h <<_ACEOF
- #define dev_t unsigned
-@@ -12567,12 +12951,13 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- ac_res=`eval 'as_val=${'$as_ac_Lib'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if test `eval 'as_val=${'$as_ac_Lib'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Lib'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_LIB${libname}" | $as_tr_cpp` 1
- _ACEOF
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, list);
++    MZ_GC_REG();
++
+ #ifdef HAVE_SANDBOX
+     sandbox_check();
+ #endif
+     /*
+      * First of all, we check the type of the supplied MzScheme object.
+@@ -2206,93 +2421,103 @@ insert_buffer_line_list(void *data, int
  
-   LIBS="-l${libname} $LIBS"
-@@ -13419,24 +13804,24 @@ $as_echo "$ac_try_echo") >&5
-       fi
-       { $as_echo "$as_me:$LINENO: result: pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group" >&5
- $as_echo "pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group" >&6; }
-       else
-       vim_cv_tty_group=world
--      { $as_echo "$as_me:$LINENO: result: ptys are world accessable" >&5
--$as_echo "ptys are world accessable" >&6; }
-+      { $as_echo "$as_me:$LINENO: result: ptys are world accessible" >&5
-+$as_echo "ptys are world accessible" >&6; }
-       fi
+     if (n != 0)           /* 0 can be used in insert */
+       check_line_range(n, buf->buf);
+     if (SCHEME_STRINGP(list))
+     {
+-      str = string_to_line(list);
++      buf_T       *savebuf = curbuf;
  
- else
-   $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
- sed 's/^/| /' conftest.$ac_ext >&5
+-      savebuf = curbuf;
++      str = string_to_line(list);
+       curbuf = buf->buf;
  
- ( exit $ac_status )
+       if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL)
+       {
+           curbuf = savebuf;
++          vim_free(str);
+           raise_vim_exn(_("cannot save undo information"));
+       }
+       else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL)
+       {
+           curbuf = savebuf;
++          vim_free(str);
+           raise_vim_exn(_("cannot insert line"));
+       }
+       else
++      {
++          vim_free(str);
+           appended_lines_mark((linenr_T)n, 1L);
++      }
  
-       vim_cv_tty_group=world
--      { $as_echo "$as_me:$LINENO: result: can't determine - assume ptys are world accessable" >&5
--$as_echo "can't determine - assume ptys are world accessable" >&6; }
-+      { $as_echo "$as_me:$LINENO: result: can't determine - assume ptys are world accessible" >&5
-+$as_echo "can't determine - assume ptys are world accessible" >&6; }
+       curbuf = savebuf;
+       update_screen(VALID);
  
- fi
- rm -rf conftest.dSYM
- rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
- fi
-@@ -13719,14 +14104,13 @@ fi
++      MZ_GC_UNREG();
+       raise_if_error();
+       return scheme_void;
+     }
  
+     /* List */
+     size = scheme_proper_list_length(list);
++    MZ_GC_CHECK();
+     if (size < 0)     /* improper or cyclic list */
+       scheme_wrong_type(prim->name, "proper list",
+               2, argc, argv);
+-
+-    /* Using MzScheme allocator, so we don't need to free this and
+-     * can safely keep pointers to GC collected strings
+-     */
+-    array = (char **)scheme_malloc_fail_ok(
+-          scheme_malloc, (unsigned)(size * sizeof(char *)));
+-
+-    rest = list;
+-    for (i = 0; i < size; ++i)
++    else
+     {
+-      line = SCHEME_CAR(rest);
+-      rest = SCHEME_CDR(rest);
+-      array[i] = string_to_line(line);
+-    }
++      Scheme_Object   *line = NULL;
++      Scheme_Object   *rest = NULL;
++      char            **array;
++      buf_T           *savebuf = curbuf;
++
++      MZ_GC_DECL_REG(2);
++      MZ_GC_VAR_IN_REG(0, line);
++      MZ_GC_VAR_IN_REG(1, rest);
++      MZ_GC_REG();
  
+-    savebuf = curbuf;
+-    curbuf = buf->buf;
++      array = (char **)alloc(size * sizeof(char *));
++      vim_memset(array, 0, size * sizeof(char *));
  
+-    if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
+-    {
+-      curbuf = savebuf;
+-      raise_vim_exn(_("cannot save undo information"));
+-    }
+-    else
+-    {
++      rest = list;
+       for (i = 0; i < size; ++i)
+-          if (ml_append((linenr_T)(n + i), (char_u *)array[i],
+-                      0, FALSE) == FAIL)
+-          {
+-              curbuf = savebuf;
+-              raise_vim_exn(_("cannot insert line"));
+-          }
++      {
++          line = SCHEME_CAR(rest);
++          rest = SCHEME_CDR(rest);
++          array[i] = string_to_line(line);
++      }
  
+-      if (i > 0)
+-          appended_lines_mark((linenr_T)n, (long)i);
+-    }
++      curbuf = buf->buf;
  
--
--for ac_func in bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \
-+for ac_func in bcmp fchdir fchown fsync getcwd getpseudotty \
-       getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \
--      memset nanosleep opendir putenv qsort readlink select setenv \
-+      memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
-       setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
-       sigvec strcasecmp strerror strftime stricmp strncasecmp \
-       strnicmp strpbrk strtol tgetent towlower towupper iswupper \
-       usleep utime utimes
- do
-@@ -13816,19 +14200,152 @@ rm -f core conftest.err conftest.$ac_obj
- fi
- ac_res=`eval 'as_val=${'$as_ac_var'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if test `eval 'as_val=${'$as_ac_var'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_var'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
+-    curbuf = savebuf;
+-    update_screen(VALID);
++      if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
++      {
++          curbuf = savebuf;
++          free_array(array);
++          raise_vim_exn(_("cannot save undo information"));
++      }
++      else
++      {
++          for (i = 0; i < size; ++i)
++              if (ml_append((linenr_T)(n + i), (char_u *)array[i],
++                          0, FALSE) == FAIL)
++              {
++                  curbuf = savebuf;
++                  free_array(array);
++                  raise_vim_exn(_("cannot insert line"));
++              }
  
- fi
- done
++          if (i > 0)
++              appended_lines_mark((linenr_T)n, (long)i);
++      }
++      free_array(array);
++      MZ_GC_UNREG();
++      curbuf = savebuf;
++      update_screen(VALID);
++    }
++
++    MZ_GC_UNREG();
+     raise_if_error();
+     return scheme_void;
+ }
  
-+{ $as_echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5
-+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
-+if test "${ac_cv_sys_largefile_source+set}" = set; then
-+  $as_echo_n "(cached) " >&6
-+else
-+  while :; do
-+  cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+#include <sys/types.h> /* for off_t */
-+     #include <stdio.h>
-+int
-+main ()
-+{
-+int (*fp) (FILE *, off_t, int) = fseeko;
-+     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+rm -f conftest.$ac_objext conftest$ac_exeext
-+if { (ac_try="$ac_link"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_link") 2>conftest.er1
-+  ac_status=$?
-+  grep -v '^ *+' conftest.er1 >conftest.err
-+  rm -f conftest.er1
-+  cat conftest.err >&5
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && {
-+       test -z "$ac_c_werror_flag" ||
-+       test ! -s conftest.err
-+       } && test -s conftest$ac_exeext && {
-+       test "$cross_compiling" = yes ||
-+       $as_test_x conftest$ac_exeext
-+       }; then
-+  ac_cv_sys_largefile_source=no; break
-+else
-+  $as_echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
+-/* (get-buff-namespace [buffer]) */
+-    static Scheme_Object *
+-get_buffer_namespace(void *data, int argc, Scheme_Object **argv)
+-{
+-    Vim_Prim  *prim = (Vim_Prim *)data;
+-
+-    return (Scheme_Object *)get_buffer_arg(prim->name, 0, argc, argv)->env;
+-}
+-
+ /*
+  * Predicates
+  */
+ /* (buff? obj) */
+     static Scheme_Object *
+@@ -2343,44 +2568,395 @@ vim_window_validp(void *data, int argc,
+  */
+ /*
+  * Convert an MzScheme string into a Vim line.
+  *
+- * The result is in allocated memory. All internal nulls are replaced by
+- * newline characters. It is an error for the string to contain newline
+- * characters.
++ * All internal nulls are replaced by newline characters.
++ * It is an error for the string to contain newline characters.
+  *
++ * Returns pointer to Vim allocated memory
+  */
+     static char *
+ string_to_line(Scheme_Object *obj)
+ {
+-    char      *str;
++    char      *scheme_str = NULL;
++    char      *vim_str = NULL;
+     long      len;
+     int               i;
+-    str = scheme_display_to_string(obj, &len);
++    scheme_str = scheme_display_to_string(obj, &len);
+     /* Error checking: String must not contain newlines, as we
+      * are replacing a single line, and we must replace it with
+      * a single line.
+      */
+-    if (memchr(str, '\n', len))
++    if (memchr(scheme_str, '\n', len))
+       scheme_signal_error(_("string cannot contain newlines"));
++    vim_str = (char *)alloc(len + 1);
 +
+     /* Create a copy of the string, with internal nulls replaced by
+      * newline characters, as is the vim convention.
+      */
+     for (i = 0; i < len; ++i)
+     {
+-      if (str[i] == '\0')
+-          str[i] = '\n';
++      if (scheme_str[i] == '\0')
++          vim_str[i] = '\n';
++      else
++          vim_str[i] = scheme_str[i];
++    }
 +
-+fi
++    vim_str[i] = '\0';
 +
-+rm -rf conftest.dSYM
-+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-+      conftest$ac_exeext conftest.$ac_ext
-+  cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+#define _LARGEFILE_SOURCE 1
-+#include <sys/types.h> /* for off_t */
-+     #include <stdio.h>
-+int
-+main ()
-+{
-+int (*fp) (FILE *, off_t, int) = fseeko;
-+     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
-+  ;
-+  return 0;
++    MZ_GC_CHECK();
++    return vim_str;
 +}
-+_ACEOF
-+rm -f conftest.$ac_objext conftest$ac_exeext
-+if { (ac_try="$ac_link"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_link") 2>conftest.er1
-+  ac_status=$?
-+  grep -v '^ *+' conftest.er1 >conftest.err
-+  rm -f conftest.er1
-+  cat conftest.err >&5
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && {
-+       test -z "$ac_c_werror_flag" ||
-+       test ! -s conftest.err
-+       } && test -s conftest$ac_exeext && {
-+       test "$cross_compiling" = yes ||
-+       $as_test_x conftest$ac_exeext
-+       }; then
-+  ac_cv_sys_largefile_source=1; break
-+else
-+  $as_echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
 +
++#ifdef FEAT_EVAL
++/*
++ * Convert Vim value into MzScheme, adopted from if_python.c
++ */
++    static Scheme_Object *
++vim_to_mzscheme(typval_T *vim_value, int depth, Scheme_Hash_Table *visited)
++{
++    Scheme_Object   *result = NULL;
++    int                   new_value = TRUE;
 +
-+fi
++    MZ_GC_DECL_REG(1);
++    MZ_GC_VAR_IN_REG(0, result);
++    MZ_GC_REG();
 +
-+rm -rf conftest.dSYM
-+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-+      conftest$ac_exeext conftest.$ac_ext
-+  ac_cv_sys_largefile_source=unknown
-+  break
-+done
-+fi
-+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5
-+$as_echo "$ac_cv_sys_largefile_source" >&6; }
-+case $ac_cv_sys_largefile_source in #(
-+  no | unknown) ;;
-+  *)
-+cat >>confdefs.h <<_ACEOF
-+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
-+_ACEOF
-+;;
-+esac
-+rm -rf conftest*
++    /* Avoid infinite recursion */
++    if (depth > 100)
++    {
++      MZ_GC_UNREG();
++      return scheme_void;
++    }
 +
-+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
-+# in glibc 2.1.3, but that breaks too many other things.
-+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
-+if test $ac_cv_sys_largefile_source != unknown; then
++    /* Check if we run into a recursive loop.  The item must be in visited
++     * then and we can use it again.
++     */
++    result = scheme_hash_get(visited, (Scheme_Object *)vim_value);
++    MZ_GC_CHECK();
++    if (result != NULL) /* found, do nothing */
++      new_value = FALSE;
++    else if (vim_value->v_type == VAR_STRING)
++    {
++      result = scheme_make_string((char *)vim_value->vval.v_string);
++      MZ_GC_CHECK();
++    }
++    else if (vim_value->v_type == VAR_NUMBER)
++    {
++      result = scheme_make_integer((long)vim_value->vval.v_number);
++      MZ_GC_CHECK();
++    }
++# ifdef FEAT_FLOAT
++    else if (vim_value->v_type == VAR_FLOAT)
++    {
++      result = scheme_make_double((double)vim_value->vval.v_float);
++      MZ_GC_CHECK();
++    }
++# endif
++    else if (vim_value->v_type == VAR_LIST)
++    {
++      list_T          *list = vim_value->vval.v_list;
++      listitem_T      *curr;
 +
-+cat >>confdefs.h <<\_ACEOF
-+#define HAVE_FSEEKO 1
-+_ACEOF
++      if (list == NULL || list->lv_first == NULL)
++          result = scheme_null;
++      else
++      {
++          Scheme_Object   *obj = NULL;
 +
-+fi
++          MZ_GC_DECL_REG(1);
++          MZ_GC_VAR_IN_REG(0, obj);
++          MZ_GC_REG();
 +
- { $as_echo "$as_me:$LINENO: checking for st_blksize" >&5
- $as_echo_n "checking for st_blksize... " >&6; }
- cat >conftest.$ac_ext <<_ACEOF
- /* confdefs.h.  */
-@@ -14200,11 +14717,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_strtod" >&5
- $as_echo "$ac_cv_lib_m_strtod" >&6; }
--if test $ac_cv_lib_m_strtod = yes; then
-+if test "x$ac_cv_lib_m_strtod" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBM 1
- _ACEOF
-   LIBS="-lm $LIBS"
-@@ -14360,11 +14877,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix1e_acl_get_file" >&5
- $as_echo "$ac_cv_lib_posix1e_acl_get_file" >&6; }
--if test $ac_cv_lib_posix1e_acl_get_file = yes; then
-+if test "x$ac_cv_lib_posix1e_acl_get_file" = x""yes; then
-   LIBS="$LIBS -lposix1e"
- else
-   { $as_echo "$as_me:$LINENO: checking for acl_get_file in -lacl" >&5
- $as_echo_n "checking for acl_get_file in -lacl... " >&6; }
- if test "${ac_cv_lib_acl_acl_get_file+set}" = set; then
-@@ -14428,11 +14945,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_acl_acl_get_file" >&5
- $as_echo "$ac_cv_lib_acl_acl_get_file" >&6; }
--if test $ac_cv_lib_acl_acl_get_file = yes; then
-+if test "x$ac_cv_lib_acl_acl_get_file" = x""yes; then
-   LIBS="$LIBS -lacl"
-                 { $as_echo "$as_me:$LINENO: checking for fgetxattr in -lattr" >&5
- $as_echo_n "checking for fgetxattr in -lattr... " >&6; }
- if test "${ac_cv_lib_attr_fgetxattr+set}" = set; then
-   $as_echo_n "(cached) " >&6
-@@ -14495,11 +15012,11 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_attr_fgetxattr" >&5
- $as_echo "$ac_cv_lib_attr_fgetxattr" >&6; }
--if test $ac_cv_lib_attr_fgetxattr = yes; then
-+if test "x$ac_cv_lib_attr_fgetxattr" = x""yes; then
-   LIBS="$LIBS -lattr"
- fi
- fi
-@@ -14873,10 +15390,62 @@ _ACEOF
- else
-   { $as_echo "$as_me:$LINENO: result: yes" >&5
- $as_echo "yes" >&6; }
- fi
-+{ $as_echo "$as_me:$LINENO: checking for FD_CLOEXEC" >&5
-+$as_echo_n "checking for FD_CLOEXEC... " >&6; }
-+cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+#if HAVE_FCNTL_H
-+# include <fcntl.h>
-+#endif
-+int
-+main ()
-+{
-+      int flag = FD_CLOEXEC;
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+rm -f conftest.$ac_objext
-+if { (ac_try="$ac_compile"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-+$as_echo "$ac_try_echo") >&5
-+  (eval "$ac_compile") 2>conftest.er1
-+  ac_status=$?
-+  grep -v '^ *+' conftest.er1 >conftest.err
-+  rm -f conftest.er1
-+  cat conftest.err >&5
-+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && {
-+       test -z "$ac_c_werror_flag" ||
-+       test ! -s conftest.err
-+       } && test -s conftest.$ac_objext; then
-+  { $as_echo "$as_me:$LINENO: result: yes" >&5
-+$as_echo "yes" >&6; }; cat >>confdefs.h <<\_ACEOF
-+#define HAVE_FD_CLOEXEC 1
-+_ACEOF
++          curr = list->lv_last;
++          obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited);
++          result = scheme_make_pair(obj, scheme_null);
++          MZ_GC_CHECK();
 +
-+else
-+  $as_echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
++          while (curr != list->lv_first)
++          {
++              curr = curr->li_prev;
++              obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited);
++              result = scheme_make_pair(obj, result);
++              MZ_GC_CHECK();
++          }
++      }
++      MZ_GC_UNREG();
++    }
++    else if (vim_value->v_type == VAR_DICT)
++    {
++      Scheme_Object     *key = NULL;
++      Scheme_Object     *obj = NULL;
 +
-+      { $as_echo "$as_me:$LINENO: result: not usable" >&5
-+$as_echo "not usable" >&6; }
-+fi
++      MZ_GC_DECL_REG(2);
++      MZ_GC_VAR_IN_REG(0, key);
++      MZ_GC_VAR_IN_REG(1, obj);
++      MZ_GC_REG();
 +
-+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++      result = (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr);
++      MZ_GC_CHECK();
++      if (vim_value->vval.v_dict != NULL)
++      {
++          hashtab_T   *ht = &vim_value->vval.v_dict->dv_hashtab;
++          long_u      todo = ht->ht_used;
++          hashitem_T  *hi;
++          dictitem_T  *di;
 +
- { $as_echo "$as_me:$LINENO: checking for rename" >&5
- $as_echo_n "checking for rename... " >&6; }
- cat >conftest.$ac_ext <<_ACEOF
- /* confdefs.h.  */
- _ACEOF
-@@ -15224,11 +15793,10 @@ cat >>confdefs.h <<_ACEOF
- #define SIZEOF_INT $ac_cv_sizeof_int
- _ACEOF
--
- bcopy_test_prog='
- #include "confdefs.h"
- #ifdef HAVE_STRING_H
- # include <string.h>
- #endif
-@@ -15456,11 +16024,11 @@ fi
- if test "$enable_multibyte" = "yes"; then
-   cflags_save=$CFLAGS
-   ldflags_save=$LDFLAGS
--  if test -n "$x_includes" ; then
-+  if test "x$x_includes" != "xNONE" ; then
-     CFLAGS="$CFLAGS -I$x_includes"
-     LDFLAGS="$X_LIBS $LDFLAGS -lX11"
-     { $as_echo "$as_me:$LINENO: checking whether X_LOCALE needed" >&5
- $as_echo_n "checking whether X_LOCALE needed... " >&6; }
-     cat >conftest.$ac_ext <<_ACEOF
-@@ -15633,21 +16201,22 @@ rm -f core conftest.err conftest.$ac_obj
-       conftest$ac_exeext conftest.$ac_ext
- LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_xpg4__xpg4_setrunelocale" >&5
- $as_echo "$ac_cv_lib_xpg4__xpg4_setrunelocale" >&6; }
--if test $ac_cv_lib_xpg4__xpg4_setrunelocale = yes; then
-+if test "x$ac_cv_lib_xpg4__xpg4_setrunelocale" = x""yes; then
-   LIBS="$LIBS -lxpg4"
- fi
- { $as_echo "$as_me:$LINENO: checking how to create tags" >&5
- $as_echo_n "checking how to create tags... " >&6; }
- test -f tags && mv tags tags.save
- if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&5 2>&1; then
-   TAGPRG="ctags -I INIT+ --fields=+S"
- else
-+  TAGPRG="ctags"
-   (eval etags    /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags"
-   (eval etags -c   /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags -c"
-   (eval ctags    /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags"
-   (eval ctags -t   /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -t"
-   (eval ctags -ts  /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -ts"
-@@ -15931,12 +16500,13 @@ rm -f core conftest.err conftest.$ac_obj
- fi
- ac_res=`eval 'as_val=${'$as_ac_var'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if test `eval 'as_val=${'$as_ac_var'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_var'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
- fi
-@@ -16132,11 +16702,11 @@ else
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5
- $as_echo "$ac_cv_header_dlfcn_h" >&6; }
- fi
--if test $ac_cv_header_dlfcn_h = yes; then
-+if test "x$ac_cv_header_dlfcn_h" = x""yes; then
-   DLL=dlfcn.h
- else
-   if test "${ac_cv_header_dl_h+set}" = set; then
-   { $as_echo "$as_me:$LINENO: checking for dl.h" >&5
- $as_echo_n "checking for dl.h... " >&6; }
-@@ -16262,11 +16832,11 @@ else
- fi
- { $as_echo "$as_me:$LINENO: result: $ac_cv_header_dl_h" >&5
- $as_echo "$ac_cv_header_dl_h" >&6; }
- fi
--if test $ac_cv_header_dl_h = yes; then
-+if test "x$ac_cv_header_dl_h" = x""yes; then
-   DLL=dl.h
- fi
- fi
-@@ -16781,12 +17351,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'}
-                $as_echo "$as_val"'`
-              { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
- fi
--if test `eval 'as_val=${'$as_ac_Header'}
--               $as_echo "$as_val"'` = yes; then
-+as_val=`eval 'as_val=${'$as_ac_Header'}
-+               $as_echo "$as_val"'`
-+   if test "x$as_val" = x""yes; then
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
++          for (hi = ht->ht_array; todo > 0; ++hi)
++          {
++              if (!HASHITEM_EMPTY(hi))
++              {
++                  --todo;
++
++                  di = dict_lookup(hi);
++                  obj = vim_to_mzscheme(&di->di_tv, depth + 1, visited);
++                  key = scheme_make_string((char *)hi->hi_key);
++                  MZ_GC_CHECK();
++                  scheme_hash_set((Scheme_Hash_Table *)result, key, obj);
++                  MZ_GC_CHECK();
++              }
++          }
++      }
++      MZ_GC_UNREG();
++    }
++    else
++    {
++      result = scheme_void;
++      new_value = FALSE;
++    }
++    if (new_value)
++    {
++      scheme_hash_set(visited, (Scheme_Object *)vim_value, result);
++      MZ_GC_CHECK();
++    }
++    MZ_GC_UNREG();
++    return result;
++}
++
++    static int
++mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth,
++      Scheme_Hash_Table *visited)
++{
++    int               status = OK;
++    typval_T  *found;
++    MZ_GC_CHECK();
++    if (depth > 100) /* limit the deepest recursion level */
++    {
++      tv->v_type = VAR_NUMBER;
++      tv->vval.v_number = 0;
++      return FAIL;
++    }
++
++    found = (typval_T *)scheme_hash_get(visited, obj);
++    if (found != NULL)
++      copy_tv(found, tv);
++    else if (SCHEME_VOIDP(obj))
++    {
++      tv->v_type = VAR_NUMBER;
++      tv->vval.v_number = 0;
++    }
++    else if (SCHEME_INTP(obj))
++    {
++      tv->v_type = VAR_NUMBER;
++      tv->vval.v_number = SCHEME_INT_VAL(obj);
++    }
++    else if (SCHEME_BOOLP(obj))
++    {
++      tv->v_type = VAR_NUMBER;
++      tv->vval.v_number = SCHEME_TRUEP(obj);
++    }
++# ifdef FEAT_FLOAT
++    else if (SCHEME_DBLP(obj))
++    {
++      tv->v_type = VAR_FLOAT;
++      tv->vval.v_float = SCHEME_DBL_VAL(obj);
++    }
++# endif
++    else if (SCHEME_STRINGP(obj))
++    {
++      tv->v_type = VAR_STRING;
++      tv->vval.v_string = vim_strsave((char_u *)SCHEME_STR_VAL(obj));
++    }
++    else if (SCHEME_VECTORP(obj) || SCHEME_NULLP(obj)
++          || SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj))
++    {
++      list_T  *list = list_alloc();
++      if (list == NULL)
++          status = FAIL;
++      else
++      {
++          int             i;
++          Scheme_Object   *curr = NULL;
++          Scheme_Object   *cval = NULL;
++          /* temporary var to hold current element of vectors and pairs */
++          typval_T        *v;
++
++          MZ_GC_DECL_REG(2);
++          MZ_GC_VAR_IN_REG(0, curr);
++          MZ_GC_VAR_IN_REG(1, cval);
++          MZ_GC_REG();
++
++          tv->v_type = VAR_LIST;
++          tv->vval.v_list = list;
++          ++list->lv_refcount;
++
++          v = (typval_T *)alloc(sizeof(typval_T));
++          if (v == NULL)
++              status = FAIL;
++          else
++          {
++              /* add the value in advance to allow handling of self-referencial
++               * data structures */
++              typval_T    *visited_tv = (typval_T *)alloc(sizeof(typval_T));
++              copy_tv(tv, visited_tv);
++              scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv);
++
++              if (SCHEME_VECTORP(obj))
++              {
++                  for (i = 0; i < SCHEME_VEC_SIZE(obj); ++i)
++                  {
++                      cval = SCHEME_VEC_ELS(obj)[i];
++                      status = mzscheme_to_vim(cval, v, depth + 1, visited);
++                      if (status == FAIL)
++                          break;
++                      status = list_append_tv(list, v);
++                      clear_tv(v);
++                      if (status == FAIL)
++                          break;
++                  }
++              }
++              else if (SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj))
++              {
++                  for (curr = obj;
++                          SCHEME_PAIRP(curr) || SCHEME_MUTABLE_PAIRP(curr);
++                          curr = SCHEME_CDR(curr))
++                  {
++                      cval = SCHEME_CAR(curr);
++                      status = mzscheme_to_vim(cval, v, depth + 1, visited);
++                      if (status == FAIL)
++                          break;
++                      status = list_append_tv(list, v);
++                      clear_tv(v);
++                      if (status == FAIL)
++                          break;
++                  }
++                  /* impoper list not terminated with null
++                   * need to handle the last element */
++                  if (status == OK && !SCHEME_NULLP(curr))
++                  {
++                      status = mzscheme_to_vim(cval, v, depth + 1, visited);
++                      if (status == OK)
++                      {
++                          status = list_append_tv(list, v);
++                          clear_tv(v);
++                      }
++                  }
++              }
++              /* nothing to do for scheme_null */
++              vim_free(v);
++          }
++          MZ_GC_UNREG();
++      }
++    }
++    else if (SCHEME_HASHTP(obj))
++    {
++      int             i;
++      dict_T          *dict;
++      Scheme_Object   *key = NULL;
++      Scheme_Object   *val = NULL;
++
++      MZ_GC_DECL_REG(2);
++      MZ_GC_VAR_IN_REG(0, key);
++      MZ_GC_VAR_IN_REG(1, val);
++      MZ_GC_REG();
++
++      dict = dict_alloc();
++      if (dict == NULL)
++          status = FAIL;
++      else
++      {
++          typval_T    *visited_tv = (typval_T *)alloc(sizeof(typval_T));
++
++          tv->v_type = VAR_DICT;
++          tv->vval.v_dict = dict;
++          ++dict->dv_refcount;
++
++          copy_tv(tv, visited_tv);
++          scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv);
++
++          for (i = 0; i < ((Scheme_Hash_Table *)obj)->size; ++i)
++          {
++              if (((Scheme_Hash_Table *) obj)->vals[i] != NULL)
++              {
++                  /* generate item for `diplay'ed Scheme key */
++                  dictitem_T  *item = dictitem_alloc((char_u *)string_to_line(
++                              ((Scheme_Hash_Table *) obj)->keys[i]));
++                  /* convert Scheme val to Vim and add it to the dict */
++                  if (mzscheme_to_vim(((Scheme_Hash_Table *) obj)->vals[i],
++                                  &item->di_tv, depth + 1, visited) == FAIL
++                          || dict_add(dict, item) == FAIL)
++                  {
++                      dictitem_free(item);
++                      status = FAIL;
++                      break;
++                  }
++              }
++
++          }
++      }
++      MZ_GC_UNREG();
++    }
++    else
++    {
++      /* `display' any other value to string */
++      tv->v_type = VAR_STRING;
++      tv->vval.v_string = (char_u *)string_to_line(obj);
+     }
++    return status;
++}
++
++    void
++do_mzeval(char_u *str, typval_T *rettv)
++{
++    int i;
++    Scheme_Object     *ret = NULL;
++    Scheme_Hash_Table *visited = NULL;
  
- fi
-@@ -16814,28 +17385,36 @@ $as_echo "yes" >&6; }
-     { $as_echo "$as_me:$LINENO: result: no" >&5
- $as_echo "no" >&6; }
-   fi
- fi
- if test "x$MACARCH" = "xboth"; then
--  LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
-+  LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
- fi
+-    str[i] = '\0';
++    MZ_GC_DECL_REG(2);
++    MZ_GC_VAR_IN_REG(0, ret);
++    MZ_GC_VAR_IN_REG(0, visited);
++    MZ_GC_REG();
++
++    if (mzscheme_init())
++    {
++      MZ_GC_UNREG();
++      return;
++    }
  
--{ $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
--$as_echo_n "checking for GCC 3 or later... " >&6; }
- DEPEND_CFLAGS_FILTER=
- if test "$GCC" = yes; then
-+  { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
-+$as_echo_n "checking for GCC 3 or later... " >&6; }
-   gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'`
-   if test "$gccmajor" -gt "2"; then
-     DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
--  fi
--fi
--if test "$DEPEND_CFLAGS_FILTER" = ""; then
--  { $as_echo "$as_me:$LINENO: result: no" >&5
-+    { $as_echo "$as_me:$LINENO: result: yes" >&5
-+$as_echo "yes" >&6; }
-+  else
-+    { $as_echo "$as_me:$LINENO: result: no" >&5
- $as_echo "no" >&6; }
--else
--  { $as_echo "$as_me:$LINENO: result: yes" >&5
-+  fi
-+        { $as_echo "$as_me:$LINENO: checking whether we need -D_FORTIFY_SOURCE=1" >&5
-+$as_echo_n "checking whether we need -D_FORTIFY_SOURCE=1... " >&6; }
-+  if test "$gccmajor" -gt "3"; then
-+    CFLAGS=`echo "$CFLAGS" | sed -e 's/-Wp,-D_FORTIFY_SOURCE=.//g' -e 's/-D_FORTIFY_SOURCE=.//g' -e 's/$/ -D_FORTIFY_SOURCE=1/'`
-+    { $as_echo "$as_me:$LINENO: result: yes" >&5
- $as_echo "yes" >&6; }
-+  else
-+    { $as_echo "$as_me:$LINENO: result: no" >&5
-+$as_echo "no" >&6; }
-+  fi
- fi
+-    return str;
++    MZ_GC_CHECK();
++    visited = scheme_make_hash_table(SCHEME_hash_ptr);
++    MZ_GC_CHECK();
++
++    if (eval_with_exn_handling(str, do_eval, &ret) == OK)
++      mzscheme_to_vim(ret, rettv, 1, visited);
++
++    for (i = 0; i < visited->size; ++i)
++    {
++      /* free up remembered objects */
++      if (visited->vals[i] != NULL)
++      {
++          free_tv((typval_T *)visited->vals[i]);
++      }
++    }
++
++    MZ_GC_UNREG();
+ }
++#endif
  
+ /*
+  * Check to see whether a Vim error has been reported, or a keyboard
+  * interrupt (from vim --> got_int) has been detected.
+  */
+@@ -2392,82 +2968,119 @@ vim_error_check(void)
  
- ac_config_files="$ac_config_files auto/config.mk:config.mk.in"
+ /*
+  * register Scheme exn:vim
+  */
+     static void
+-register_vim_exn(Scheme_Env *env)
++register_vim_exn(void)
+ {
+-    Scheme_Object   *exn_name = scheme_intern_symbol("exn:vim");
++    int       nc = 0;
++    int i;
++    Scheme_Object   *struct_exn = NULL;
++    Scheme_Object   *exn_name = NULL;
++
++    MZ_GC_DECL_REG(2);
++    MZ_GC_VAR_IN_REG(0, struct_exn);
++    MZ_GC_VAR_IN_REG(1, exn_name);
++    MZ_GC_REG();
++
++    exn_name = scheme_intern_symbol("exn:vim");
++    MZ_GC_CHECK();
++    struct_exn = scheme_builtin_value("struct:exn");
++    MZ_GC_CHECK();
  
-@@ -16864,12 +17443,12 @@ _ACEOF
-   for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-     eval ac_val=\$$ac_var
-     case $ac_val in #(
-     *${as_nl}*)
-       case $ac_var in #(
--      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
--$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
-+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
-+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-       esac
-       case $ac_var in #(
-       _ | IFS | as_nl) ;; #(
-       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-       *) $as_unset $ac_var ;;
-@@ -17257,11 +17836,11 @@ exec 6>&1
- # Save the log message, to keep $[0] and so on meaningful, and to
- # report actual input values of CONFIG_FILES etc. instead of their
- # values after options handling.
- ac_log="
- This file was extended by $as_me, which was
--generated by GNU Autoconf 2.62.  Invocation command line was
-+generated by GNU Autoconf 2.63.  Invocation command line was
+     if (vim_exn == NULL)
+       vim_exn = scheme_make_struct_type(exn_name,
+-              scheme_builtin_value("struct:exn"), NULL, 0, 0, NULL, NULL
++              struct_exn, NULL, 0, 0, NULL, NULL
+ #if MZSCHEME_VERSION_MAJOR >= 299
+               , NULL
+ #endif
+               );
  
-   CONFIG_FILES    = $CONFIG_FILES
-   CONFIG_HEADERS  = $CONFIG_HEADERS
-   CONFIG_LINKS    = $CONFIG_LINKS
-   CONFIG_COMMANDS = $CONFIG_COMMANDS
-@@ -17270,10 +17849,19 @@ generated by GNU Autoconf 2.62.  Invocat
- on `(hostname || uname -n) 2>/dev/null | sed 1q`
- "
+-    if (vim_exn_values == NULL)
+-    {
+-      int     nc = 0;
  
- _ACEOF
+-      Scheme_Object   **exn_names = scheme_make_struct_names(
+-              exn_name, scheme_null, 0, &nc);
+-      Scheme_Object   **exn_values = scheme_make_struct_values(
+-              vim_exn, exn_names, nc, 0);
+-
+-      vim_exn_names = scheme_make_vector(nc, scheme_false);
+-      vim_exn_values = scheme_make_vector(nc, scheme_false);
+-      /* remember names and values */
+-      mch_memmove(SCHEME_VEC_ELS(vim_exn_names), exn_names,
+-              nc * sizeof(Scheme_Object *));
+-      mch_memmove(SCHEME_VEC_ELS(vim_exn_values), exn_values,
+-              nc * sizeof(Scheme_Object *));
++    {
++      Scheme_Object   **tmp = NULL;
++      Scheme_Object   *exn_names[5] = {NULL, NULL, NULL, NULL, NULL};
++      Scheme_Object   *exn_values[5] = {NULL, NULL, NULL, NULL, NULL};
++      MZ_GC_DECL_REG(6);
++      MZ_GC_ARRAY_VAR_IN_REG(0, exn_names, 5);
++      MZ_GC_ARRAY_VAR_IN_REG(3, exn_values, 5);
++      MZ_GC_REG();
++
++      tmp = scheme_make_struct_names(exn_name, scheme_null, 0, &nc);
++      assert(nc <= 5);
++      mch_memmove(exn_names, tmp, nc * sizeof(Scheme_Object *));
++      MZ_GC_CHECK();
++
++      tmp = scheme_make_struct_values(vim_exn, exn_names, nc, 0);
++      mch_memmove(exn_values, tmp, nc * sizeof(Scheme_Object *));
++      MZ_GC_CHECK();
++
++      for (i = 0; i < nc; i++)
++      {
++          scheme_add_global_symbol(exn_names[i],
++                  exn_values[i], environment);
++          MZ_GC_CHECK();
++      }
++      MZ_GC_UNREG();
+     }
+-
+-    add_vim_exn(env);
+-}
+-
+-/*
+- * Add stuff of exn:vim to env
+- */
+-    static void
+-add_vim_exn(Scheme_Env *env)
+-{
+-    int i;
+-
+-    for (i = 0; i < SCHEME_VEC_SIZE(vim_exn_values); i++)
+-      scheme_add_global_symbol(SCHEME_VEC_ELS(vim_exn_names)[i],
+-              SCHEME_VEC_ELS(vim_exn_values)[i], env);
++    MZ_GC_UNREG();
+ }
  
-+case $ac_config_files in *"
-+"*) set x $ac_config_files; shift; ac_config_files=$*;;
-+esac
+ /*
+  * raise exn:vim, may be with additional info string
+  */
+     void
+ raise_vim_exn(const char *add_info)
+ {
+-    Scheme_Object   *argv[2];
+-    char_u        *fmt = _("Vim error: ~a");
++    char          *fmt = _("Vim error: ~a");
++    Scheme_Object   *argv[2] = {NULL, NULL};
++    Scheme_Object   *exn = NULL;
 +
-+case $ac_config_headers in *"
-+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-+esac
++    MZ_GC_DECL_REG(4);
++    MZ_GC_ARRAY_VAR_IN_REG(0, argv, 2);
++    MZ_GC_VAR_IN_REG(3, exn);
++    MZ_GC_REG();
+     if (add_info != NULL)
+     {
+-      Scheme_Object   *info = scheme_make_string(add_info);
+-      argv[0] = scheme_byte_string_to_char_string(scheme_make_string(
+-              scheme_format(fmt, strlen(fmt), 1, &info, NULL)));
++      char            *c_string = NULL;
++      Scheme_Object   *byte_string = NULL;
++      Scheme_Object   *info = NULL;
 +
++      MZ_GC_DECL_REG(3);
++      MZ_GC_VAR_IN_REG(0, c_string);
++      MZ_GC_VAR_IN_REG(1, byte_string);
++      MZ_GC_VAR_IN_REG(2, info);
++      MZ_GC_REG();
 +
- cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- # Files that config.status was made for.
- config_files="$ac_config_files"
- config_headers="$ac_config_headers"
++      info = scheme_make_string(add_info);
++      MZ_GC_CHECK();
++      c_string = scheme_format(fmt, STRLEN(fmt), 1, &info, NULL);
++      MZ_GC_CHECK();
++      byte_string = scheme_make_string(c_string);
++      MZ_GC_CHECK();
++      argv[0] = scheme_byte_string_to_char_string(byte_string);
++      MZ_GC_CHECK();
+       SCHEME_SET_IMMUTABLE(argv[0]);
++      MZ_GC_UNREG();
+     }
+     else
+       argv[0] = scheme_make_string(_("Vim error"));
++    MZ_GC_CHECK();
  
-@@ -17282,20 +17870,21 @@ _ACEOF
- cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
- ac_cs_usage="\
- \`$as_me' instantiates files from templates according to the
- current configuration.
+ #if MZSCHEME_VERSION_MAJOR < 360
+     argv[1] = scheme_current_continuation_marks();
++    MZ_GC_CHECK();
+ #else
+     argv[1] = scheme_current_continuation_marks(NULL);
++    MZ_GC_CHECK();
+ #endif
  
--Usage: $0 [OPTIONS] [FILE]...
-+Usage: $0 [OPTION]... [FILE]...
+-    scheme_raise(scheme_make_struct_instance(vim_exn, 2, argv));
++    exn = scheme_make_struct_instance(vim_exn, 2, argv);
++    MZ_GC_CHECK();
++    scheme_raise(exn);
++    MZ_GC_UNREG();
+ }
  
-   -h, --help       print this help, then exit
-   -V, --version    print version number and configuration settings, then exit
--  -q, --quiet      do not print progress messages
-+  -q, --quiet, --silent
-+                   do not print progress messages
-   -d, --debug      don't remove temporary files
-       --recheck    update $as_me by reconfiguring in the same conditions
--  --file=FILE[:TEMPLATE]
-+      --file=FILE[:TEMPLATE]
-                    instantiate the configuration file FILE
--  --header=FILE[:TEMPLATE]
-+      --header=FILE[:TEMPLATE]
-                    instantiate the configuration header FILE
+     void
+ raise_if_error(void)
+ {
+@@ -2570,10 +3183,12 @@ mz_fix_cursor(int lo, int hi, int extra)
+       else if (extra < 0)
+       {
+           curwin->w_cursor.lnum = lo;
+           check_cursor();
+       }
++      else
++          check_cursor_col();
+       changed_cline_bef_curs();
+     }
+     invalidate_botline();
+ }
  
- Configuration files:
- $config_files
+@@ -2595,11 +3210,10 @@ static Vim_Prim prims[]=
+     {get_next_buffer, "get-next-buff", 0, 1},
+     {get_prev_buffer, "get-prev-buff", 0, 1},
+     {mzscheme_open_buffer, "open-buff", 1, 1},
+     {get_buffer_by_name, "get-buff-by-name", 1, 1},
+     {get_buffer_by_num, "get-buff-by-num", 1, 1},
+-    {get_buffer_namespace, "get-buff-namespace", 0, 1},
+     /*
+      * Window-related commands
+      */
+     {get_curr_win, "curr-win", 0, 0},
+     {get_window_count, "win-count", 0, 0},
+@@ -2653,27 +3267,39 @@ get_vim_curr_window(void)
+     else
+       return (vim_mz_window *)curwin->w_mzscheme_ref;
+ }
  
-@@ -17306,11 +17895,11 @@ Report bugs to <bug-autoconf@gnu.org>."
+     static void
+-make_modules(Scheme_Env *env)
++make_modules()
+ {
+-    int               i;
+-    Scheme_Env        *mod;
+-
+-    mod = scheme_primitive_module(scheme_intern_symbol("vimext"), env);
++    int                   i;
++    Scheme_Env            *mod = NULL;
++    Scheme_Object   *vimext_symbol = NULL;
++    Scheme_Object   *closed_prim = NULL;
++
++    MZ_GC_DECL_REG(3);
++    MZ_GC_VAR_IN_REG(0, mod);
++    MZ_GC_VAR_IN_REG(1, vimext_symbol);
++    MZ_GC_VAR_IN_REG(2, closed_prim);
++    MZ_GC_REG();
++
++    vimext_symbol = scheme_intern_symbol("vimext");
++    MZ_GC_CHECK();
++    mod = scheme_primitive_module(vimext_symbol, environment);
++    MZ_GC_CHECK();
+     /* all prims made closed so they can access their own names */
+-    for (i = 0; i < sizeof(prims)/sizeof(prims[0]); i++)
++    for (i = 0; i < (int)(sizeof(prims)/sizeof(prims[0])); i++)
+     {
+       Vim_Prim *prim = prims + i;
+-      scheme_add_global(prim->name,
+-              scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name,
+-                  prim->mina, prim->maxa),
+-              mod);
++      closed_prim = scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name,
++                          prim->mina, prim->maxa);
++      scheme_add_global(prim->name, closed_prim, mod);
++      MZ_GC_CHECK();
+     }
+-    scheme_add_global("global-namespace", (Scheme_Object *)environment, mod);
+     scheme_finish_primitive_module(mod);
++    MZ_GC_CHECK();
++    MZ_GC_UNREG();
+ }
  
- _ACEOF
- cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- ac_cs_version="\\
- config.status
--configured by $0, generated by GNU Autoconf 2.62,
-+configured by $0, generated by GNU Autoconf 2.63,
-   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+ #ifdef HAVE_SANDBOX
+ static Scheme_Object *M_write = NULL;
+ static Scheme_Object *M_read = NULL;
+@@ -2697,25 +3323,29 @@ sandbox_file_guard(int argc, Scheme_Obje
  
- Copyright (C) 2008 Free Software Foundation, Inc.
- This config.status script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it."
-@@ -17503,11 +18092,12 @@ for ac_last_try in false false false fal
-   . ./conf$$subs.sh ||
-     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
- $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-    { (exit 1); exit 1; }; }
+       if (M_write == NULL)
+       {
+           MZ_REGISTER_STATIC(M_write);
+           M_write = scheme_intern_symbol("write");
++          MZ_GC_CHECK();
+       }
+       if (M_read == NULL)
+       {
+           MZ_REGISTER_STATIC(M_read);
+           M_read = scheme_intern_symbol("read");
++          MZ_GC_CHECK();
+       }
+       if (M_execute == NULL)
+       {
+           MZ_REGISTER_STATIC(M_execute);
+           M_execute = scheme_intern_symbol("execute");
++          MZ_GC_CHECK();
+       }
+       if (M_delete == NULL)
+       {
+           MZ_REGISTER_STATIC(M_delete);
+           M_delete = scheme_intern_symbol("delete");
++          MZ_GC_CHECK();
+       }
  
--  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then
-+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-+  if test $ac_delim_n = $ac_delim_num; then
-     break
-   elif $ac_last_try; then
-     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
- $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-    { (exit 1); exit 1; }; }
-@@ -17708,21 +18298,21 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
-     defundef = substr(arg[1], 2)
-     mac1 = arg[2]
-   }
-   split(mac1, mac2, "(") #)
-   macro = mac2[1]
-+  prefix = substr(line, 1, index(line, defundef) - 1)
-   if (D_is_set[macro]) {
-     # Preserve the white space surrounding the "#".
--    prefix = substr(line, 1, index(line, defundef) - 1)
-     print prefix "define", macro P[macro] D[macro]
-     next
-   } else {
-     # Replace #undef with comments.  This is necessary, for example,
-     # in the case of _POSIX_SOURCE, which is predefined and required
-     # on some systems where configure will not decide to define it.
-     if (defundef == "undef") {
--      print "/*", line, "*/"
-+      print "/*", prefix defundef, macro, "*/"
-       next
-     }
-   }
- }
- { print }
-@@ -17742,12 +18332,12 @@ do
-   case $ac_tag in
-   :[FHLC]) ac_mode=$ac_tag; continue;;
-   esac
-   case $ac_mode$ac_tag in
-   :[FHL]*:*);;
--  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
--$as_echo "$as_me: error: Invalid tag $ac_tag." >&2;}
-+  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
-+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
-    { (exit 1); exit 1; }; };;
-   :[FH]-) ac_tag=-:-;;
-   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-   esac
-   ac_save_IFS=$IFS
-@@ -18061,10 +18651,10 @@ if test "$no_create" != yes; then
-   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-   # would make configure fail if this is the last instruction.
-   $ac_cs_success || { (exit 1); exit 1; }
- fi
- if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
--  { $as_echo "$as_me:$LINENO: WARNING: Unrecognized options: $ac_unrecognized_opts" >&5
--$as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;}
-+  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
- fi
+       while (!SCHEME_NULLP(requested_access))
+       {
+           Scheme_Object *item = SCHEME_CAR(requested_access);
+--- vim72.orig/src/if_mzsch.h
++++ vim72/src/if_mzsch.h
+@@ -9,10 +9,11 @@
+ # define __CYGWIN32__
+ #endif
  
+ /* #ifdef needed for "make depend" */
+ #ifdef FEAT_MZSCHEME
++# include <schvers.h>
+ # include <scheme.h>
+ #endif
  
---- vim72.orig/src/configure.in
-+++ vim72/src/configure.in
-@@ -114,10 +114,26 @@ if test "`(uname) 2>/dev/null`" = Darwin
-   AC_MSG_CHECKING(--with-mac-arch argument)
-   AC_ARG_WITH(mac-arch, [  --with-mac-arch=ARCH    current, intel, ppc or both],
-       MACARCH="$withval"; AC_MSG_RESULT($MACARCH),
-       MACARCH="current"; AC_MSG_RESULT(defaulting to $MACARCH))
+ #ifdef __MINGW32__
+ # undef __CYGWIN32__
+@@ -44,6 +45,33 @@
+ # define SCHEME_BYTE_STRLEN_VAL SCHEME_STRLEN_VAL
+ # define SCHEME_BYTE_STR_VAL SCHEME_STR_VAL
+ # define scheme_byte_string_to_char_string(obj) (obj)
+ #endif
  
-+  AC_MSG_CHECKING(--with-developer-dir argument)
-+  AC_ARG_WITH(developer-dir, [  --with-developer-dir=PATH    use PATH as location for Xcode developer tools],
-+      DEVELOPER_DIR="$withval"; AC_MSG_RESULT($DEVELOPER_DIR),
-+        DEVELOPER_DIR=""; AC_MSG_RESULT(not present))
++/* Precise GC macros */
++#ifndef MZ_GC_DECL_REG
++# define MZ_GC_DECL_REG(size)            /* empty */
++#endif
++#ifndef MZ_GC_VAR_IN_REG
++# define MZ_GC_VAR_IN_REG(x, v)          /* empty */
++#endif
++#ifndef MZ_GC_ARRAY_VAR_IN_REG
++# define MZ_GC_ARRAY_VAR_IN_REG(x, v, l) /* empty */
++#endif
++#ifndef MZ_GC_REG
++# define MZ_GC_REG()                     /* empty */
++#endif
++#ifndef MZ_GC_UNREG
++# define MZ_GC_UNREG()                   /* empty */
++#endif
 +
-+  if test "x$DEVELOPER_DIR" = "x"; then
-+    AC_PATH_PROG(XCODE_SELECT, xcode-select)
-+    if test "x$XCODE_SELECT" != "x"; then
-+      AC_MSG_CHECKING(for developer dir using xcode-select)
-+      DEVELOPER_DIR=`$XCODE_SELECT -print-path`
-+      AC_MSG_RESULT([$DEVELOPER_DIR])
-+    else
-+      DEVELOPER_DIR=/Developer
-+    fi
-+  fi
++#ifdef MZSCHEME_FORCE_GC
++/*
++ * force garbage collection to check all references are registered
++ * seg faults will indicate not registered refs
++ */
++# define MZ_GC_CHECK() scheme_collect_garbage();
++#else
++# define MZ_GC_CHECK()                        /* empty */
++#endif
 +
-   if test "x$MACARCH" = "xboth"; then
-     AC_MSG_CHECKING(for 10.4 universal SDK)
-     dnl There is a terrible inconsistency (but we appear to get away with it):
-     dnl $CFLAGS uses the 10.4u SDK library for the headers, while $CPPFLAGS
-     dnl doesn't, because "gcc -E" doesn't grok it.  That means the configure
-@@ -125,11 +141,11 @@ if test "`(uname) 2>/dev/null`" = Darwin
-     dnl files. $LDFLAGS is set at the end, because configure uses it together
-     dnl with $CFLAGS and we can only have one -sysroot argument.
-     save_cppflags="$CPPFLAGS"
-     save_cflags="$CFLAGS"
-     save_ldflags="$LDFLAGS"
--    CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
-+    CFLAGS="$CFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
-     AC_TRY_LINK([ ], [ ],
-       AC_MSG_RESULT(found, will make universal binary),
-       AC_MSG_RESULT(not found)
-       CFLAGS="$save_cflags"
-@@ -155,13 +171,13 @@ if test "`(uname) 2>/dev/null`" = Darwin
-     OS_EXTRA_SRC="os_macosx.c os_mac_conv.c";
-     OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
-     dnl TODO: use -arch i386 on Intel machines
-     CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
-     if test "x$MACARCH" = "xboth"; then
--      CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
-+      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
-     else
--      CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon"
-+      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
-     fi
-     dnl If Carbon is found, assume we don't want X11
-     dnl unless it was specifically asked for (--with-x)
-     dnl or Motif, Athena or GTK GUI is used.
-@@ -412,11 +428,11 @@ if test "$enable_mzschemeinterp" = "yes"
-     AC_MSG_CHECKING(PLTHOME environment var)
-     if test "X$PLTHOME" != "X"; then
-       AC_MSG_RESULT("$PLTHOME")
-       vi_cv_path_mzscheme_pfx="$PLTHOME"
-     else
--      AC_MSG_RESULT("not set")
-+      AC_MSG_RESULT(not set)
-       dnl -- try to find MzScheme executable
-       AC_PATH_PROG(vi_cv_path_mzscheme, mzscheme)
+ #endif /* _IF_MZSCH_H_ */
+--- vim72.orig/src/if_ole.cpp
++++ vim72/src/if_ole.cpp
+@@ -351,13 +351,17 @@ CVim::SendKeys(BSTR keys)
+       vim_free(str);
+       return E_INVALIDARG;
+     }
  
-       dnl resolve symbolic link, the executable is often elsewhere and there
-       dnl are no links for the include files.
-@@ -428,60 +444,85 @@ if test "$enable_mzschemeinterp" = "yes"
-       fi
+     /* Pass the string to the main input loop. The memory will be freed when
+-     * the message is processed.
++     * the message is processed.  Except for an empty message, we don't need
++     * to post it then.
+      */
+-    PostMessage(NULL, WM_OLE, 0, (LPARAM)str);
++    if (*str == NUL)
++      vim_free(str);
++    else
++      PostMessage(NULL, WM_OLE, 0, (LPARAM)str);
  
-       if test "X$vi_cv_path_mzscheme" != "X"; then
-           dnl -- find where MzScheme thinks it was installed
-           AC_CACHE_CHECK(MzScheme install prefix,vi_cv_path_mzscheme_pfx,
--          [ vi_cv_path_mzscheme_pfx=`
--          ${vi_cv_path_mzscheme} -evm \
--          "(display (simplify-path            \
-+          dnl different versions of MzScheme differ in command line processing
-+          dnl use universal approach
-+          echo "(display (simplify-path               \
-              (build-path (call-with-values    \
-               (lambda () (split-path (find-system-path (quote exec-file)))) \
--              (lambda (base name must-be-dir?) base)) (quote up))))"` ])
--          dnl Remove a trailing slash.
--          vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
-+              (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
-+          dnl Remove a trailing slash
-+          [ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
-+              sed -e 's+/$++'` ])
-+          rm -f mzdirs.scm
-       fi
-     fi
-   fi
+     return S_OK;
+ }
  
-   SCHEME_INC=
-   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
-     AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include)
-     if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
--      AC_MSG_RESULT("yes")
-+      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
-+      AC_MSG_RESULT(yes)
-     else
--      AC_MSG_RESULT("no")
--      AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include)
-+      AC_MSG_RESULT(no)
-+      AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt)
-       if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
--      AC_MSG_RESULT("yes")
--      SCHEME_INC=/plt
-+      AC_MSG_RESULT(yes)
-+      SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
-       else
--      AC_MSG_RESULT("no")
--      vi_cv_path_mzscheme_pfx=
-+      AC_MSG_RESULT(no)
-+      AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/)
-+      if test -f /usr/include/plt/scheme.h; then
-+        AC_MSG_RESULT(yes)
-+        SCHEME_INC=/usr/include/plt
-+      else
-+        AC_MSG_RESULT(no)
-+        vi_cv_path_mzscheme_pfx=
-+      fi
-       fi
-     fi
-   fi
+ STDMETHODIMP
+--- vim72.orig/src/if_perl.xs
++++ vim72/src/if_perl.xs
+@@ -60,10 +60,15 @@
+ #endif
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 9)
+ # define PERL589_OR_LATER
+ #endif
  
-   if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
-     if test "x$MACOSX" = "xyes"; then
-       MZSCHEME_LIBS="-framework PLT_MzScheme"
-+    elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
-+      MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
-+      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
-     elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
-       MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
-     else
--      MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
-+      dnl Using shared objects
-+      if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
-+        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
-+      MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
-+      else
-+        MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
-+      fi
-       if test "$GCC" = yes; then
-       dnl Make Vim remember the path to the library.  For when it's not in
-       dnl $LD_LIBRARY_PATH.
--      MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
-+      MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
-       elif test "`(uname) 2>/dev/null`" = SunOS &&
-                              uname -r | grep '^5' >/dev/null; then
--      MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
-+      MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
-       fi
-     fi
-     if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
-       SCHEME_COLLECTS=lib/plt/
-     fi
--    MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC}   \
-+    if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
-+      dnl need to generate bytecode for MzScheme base
-+      MZSCHEME_EXTRA="mzscheme_base.c"
-+      MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
-+      MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
-+    fi
-+    MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
-       -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
-     MZSCHEME_SRC="if_mzsch.c"
-     MZSCHEME_OBJ="objects/if_mzsch.o"
-     MZSCHEME_PRO="if_mzsch.pro"
-     AC_DEFINE(FEAT_MZSCHEME)
-@@ -489,10 +530,12 @@ if test "$enable_mzschemeinterp" = "yes"
-   AC_SUBST(MZSCHEME_SRC)
-   AC_SUBST(MZSCHEME_OBJ)
-   AC_SUBST(MZSCHEME_PRO)
-   AC_SUBST(MZSCHEME_LIBS)
-   AC_SUBST(MZSCHEME_CFLAGS)
-+  AC_SUBST(MZSCHEME_EXTRA)
-+  AC_SUBST(MZSCHEME_MZC)
- fi
++#if (PERL_REVISION == 5) && ((PERL_VERSION > 10) || \
++    (PERL_VERSION == 10) && (PERL_SUBVERSION >= 1))
++# define PERL5101_OR_LATER
++#endif
++
+ #ifndef pTHX
+ #    define pTHX void
+ #    define pTHX_
+ #endif
  
+@@ -91,10 +96,13 @@ EXTERN_C void boot_DynaLoader __ARGS((pT
+ # define perl_run dll_perl_run
+ # define perl_destruct dll_perl_destruct
+ # define perl_free dll_perl_free
+ # define Perl_get_context dll_Perl_get_context
+ # define Perl_croak dll_Perl_croak
++# ifdef PERL5101_OR_LATER
++#  define Perl_croak_xs_usage dll_Perl_croak_xs_usage
++# endif
+ # ifndef PROTO
+ #  define Perl_croak_nocontext dll_Perl_croak_nocontext
+ #  define Perl_call_argv dll_Perl_call_argv
+ #  define Perl_call_pv dll_Perl_call_pv
+ #  define Perl_eval_sv dll_Perl_eval_sv
+@@ -134,10 +142,13 @@ EXTERN_C void boot_DynaLoader __ARGS((pT
+ #ifdef PERL589_OR_LATER
+ #  define Perl_sv_2iv_flags dll_Perl_sv_2iv_flags
+ #  define Perl_newXS_flags dll_Perl_newXS_flags
+ #endif
+ # define Perl_sv_free dll_Perl_sv_free
++# if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
++#  define Perl_sv_free2 dll_Perl_sv_free2
++# endif
+ # define Perl_sv_isa dll_Perl_sv_isa
+ # define Perl_sv_magic dll_Perl_sv_magic
+ # define Perl_sv_setiv dll_Perl_sv_setiv
+ # define Perl_sv_setpv dll_Perl_sv_setpv
+ # define Perl_sv_setpvn dll_Perl_sv_setpvn
+@@ -161,11 +172,11 @@ EXTERN_C void boot_DynaLoader __ARGS((pT
+ # define Perl_Idefgv_ptr dll_Perl_Idefgv_ptr
+ # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr
+ # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr
+ # define boot_DynaLoader dll_boot_DynaLoader
  
- AC_MSG_CHECKING(--enable-perlinterp argument)
- AC_ARG_ENABLE(perlinterp,
-@@ -657,11 +700,11 @@ if test "$enable_pythoninterp" = "yes";
+-# define Perl_sys_init3 dll_Perl_sys_init3
++# define Perl_sys_init dll_Perl_sys_init
+ # define Perl_sys_term dll_Perl_sys_term
+ # define Perl_ISv_ptr dll_Perl_ISv_ptr
+ # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr
+ # define Perl_Istack_base_ptr dll_Perl_Istack_base_ptr
+ # define Perl_Itmps_ix_ptr dll_Perl_Itmps_ix_ptr
+@@ -197,10 +208,13 @@ static void (*perl_destruct)(PerlInterpr
+ static void (*perl_free)(PerlInterpreter*);
+ static int (*perl_run)(PerlInterpreter*);
+ static int (*perl_parse)(PerlInterpreter*, XSINIT_t, int, char**, char**);
+ static void* (*Perl_get_context)(void);
+ static void (*Perl_croak)(pTHX_ const char*, ...);
++#ifdef PERL5101_OR_LATER
++static void (*Perl_croak_xs_usage)(pTHX_ const CV *const, const char *const params);
++#endif
+ static void (*Perl_croak_nocontext)(const char*, ...);
+ static I32 (*Perl_dowantarray)(pTHX);
+ static void (*Perl_free_tmps)(pTHX);
+ static HV* (*Perl_gv_stashpv)(pTHX_ const char*, I32);
+ static void (*Perl_markstack_grow)(pTHX);
+@@ -266,11 +280,12 @@ static GV** (*Perl_Idefgv_ptr)(register
+ static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*);
+ static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*);
+ static void (*boot_DynaLoader)_((pTHX_ CV*));
  
-       AC_CACHE_CHECK(Python's configuration directory,vi_cv_path_python_conf,
-       [
-       vi_cv_path_python_conf=
-       for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do
--        for subdir in lib share; do
-+        for subdir in lib64 lib share; do
-           d="${path}/${subdir}/python${vi_cv_var_python_version}/config"
-           if test -d "$d" && test -f "$d/config.c"; then
-             vi_cv_path_python_conf="$d"
-           fi
-         done
-@@ -920,21 +963,31 @@ AC_MSG_CHECKING(--enable-rubyinterp argu
- AC_ARG_ENABLE(rubyinterp,
-       [  --enable-rubyinterp     Include Ruby interpreter.], ,
-       [enable_rubyinterp="no"])
- AC_MSG_RESULT($enable_rubyinterp)
- if test "$enable_rubyinterp" = "yes"; then
-+  AC_MSG_CHECKING(--with-ruby-command argument)
-+  AC_ARG_WITH(ruby-command, [  --with-ruby-command=RUBY  name of the Ruby command (default: ruby)],
-+      RUBY_CMD="$withval"; AC_MSG_RESULT($RUBY_CMD),
-+      RUBY_CMD="ruby"; AC_MSG_RESULT(defaulting to $RUBY_CMD))
-   AC_SUBST(vi_cv_path_ruby)
--  AC_PATH_PROG(vi_cv_path_ruby, ruby)
-+  AC_PATH_PROG(vi_cv_path_ruby, $RUBY_CMD)
-   if test "X$vi_cv_path_ruby" != "X"; then
-     AC_MSG_CHECKING(Ruby version)
-     if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
-       AC_MSG_RESULT(OK)
-       AC_MSG_CHECKING(Ruby header files)
--      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
-+      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["rubyhdrdir"]] || Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
-       if test "X$rubyhdrdir" != "X"; then
-       AC_MSG_RESULT($rubyhdrdir)
-       RUBY_CFLAGS="-I$rubyhdrdir"
-+        rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["arch"]]'`
-+        if test -d "$rubyhdrdir/$rubyarch"; then
-+          RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
-+        fi
-+        rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["ruby_version"]].gsub(/\./, "")[[0,2]]'`
-+        RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
-       rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LIBS"]]'`
-       if test "X$rubylibs" != "X"; then
-         RUBY_LIBS="$rubylibs"
-       fi
-       librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG[["LIBRUBYARG"]])'`
-@@ -955,18 +1008,24 @@ if test "$enable_rubyinterp" = "yes"; th
-       if test "X$librubyarg" != "X"; then
-         RUBY_LIBS="$librubyarg $RUBY_LIBS"
-       fi
-       rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LDFLAGS"]]'`
-       if test "X$rubyldflags" != "X"; then
--        LDFLAGS="$rubyldflags $LDFLAGS"
-+        dnl Ruby on Mac OS X 10.5 adds "-arch" flags but these should only
-+        dnl be included if requested by passing --with-mac-arch to
-+        dnl configure, so strip these flags first (if present)
-+        rubyldflags=`echo "$rubyldflags" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//'`
-+        if test "X$rubyldflags" != "X"; then
-+          LDFLAGS="$rubyldflags $LDFLAGS"
-+        fi
-       fi
-       RUBY_SRC="if_ruby.c"
-       RUBY_OBJ="objects/if_ruby.o"
-       RUBY_PRO="if_ruby.pro"
-       AC_DEFINE(FEAT_RUBY)
-       else
--      AC_MSG_RESULT(not found, disabling Ruby)
-+      AC_MSG_RESULT(not found; disabling Ruby)
-       fi
-     else
-       AC_MSG_RESULT(too old; need Ruby version 1.6.0 or later)
-     fi
-   fi
-@@ -1191,10 +1250,32 @@ else
-     )
-     CFLAGS=$cflags_save
-     LDFLAGS="$ac_save_LDFLAGS"
-+    AC_MSG_CHECKING(size of wchar_t is 2 bytes)
-+    AC_CACHE_VAL(ac_cv_small_wchar_t,
-+      [AC_TRY_RUN([
-+#include <X11/Xlib.h>
-+#if STDC_HEADERS
-+# include <stdlib.h>
-+# include <stddef.h>
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
+-static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env);
++static void (*Perl_sv_free2)(pTHX_ SV*);
++static void (*Perl_sys_init)(int* argc, char*** argv);
+ static void (*Perl_sys_term)(void);
+ static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
+ static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*);
+ static SV*** (*Perl_Istack_base_ptr)(register PerlInterpreter*);
+ static XPV** (*Perl_IXpv_ptr)(register PerlInterpreter*);
+@@ -300,10 +315,13 @@ static struct {
+     {"perl_free", (PERL_PROC*)&perl_free},
+     {"perl_run", (PERL_PROC*)&perl_run},
+     {"perl_parse", (PERL_PROC*)&perl_parse},
+     {"Perl_get_context", (PERL_PROC*)&Perl_get_context},
+     {"Perl_croak", (PERL_PROC*)&Perl_croak},
++#ifdef PERL5101_OR_LATER
++    {"Perl_croak_xs_usage", (PERL_PROC*)&Perl_croak_xs_usage},
 +#endif
-+              main()
-+              {
-+                if (sizeof(wchar_t) <= 2)
-+                  exit(1);
-+                exit(0);
-+              }],
-+              ac_cv_small_wchar_t="no",
-+              ac_cv_small_wchar_t="yes",
-+              AC_MSG_ERROR(failed to compile test program))])
-+    AC_MSG_RESULT($ac_cv_small_wchar_t)
-+    if test "x$ac_cv_small_wchar_t" = "xyes" ; then
-+      AC_DEFINE(SMALL_WCHAR_T)
-+    fi
-+
-   fi
- fi
- test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no
-@@ -2065,10 +2146,15 @@ fi
- AC_MSG_CHECKING(whether __DATE__ and __TIME__ work)
- AC_TRY_COMPILE([#include <stdio.h>], [printf("(" __DATE__ " " __TIME__ ")");],
-       AC_MSG_RESULT(yes); AC_DEFINE(HAVE_DATE_TIME),
-       AC_MSG_RESULT(no))
-+AC_MSG_CHECKING(whether __attribute__((unused)) is allowed)
-+AC_TRY_COMPILE([#include <stdio.h>], [int x __attribute__((unused));],
-+      AC_MSG_RESULT(yes); AC_DEFINE(HAVE_ATTRIBUTE_UNUSED),
-+      AC_MSG_RESULT(no))
-+
- dnl Checks for header files.
- AC_CHECK_HEADER(elf.h, HAS_ELF=1)
- dnl AC_CHECK_HEADER(dwarf.h, SVR4=1)
- if test "$HAS_ELF" = 1; then
-   AC_CHECK_LIB(elf, main)
-@@ -2093,18 +2179,24 @@ AC_CHECK_HEADERS(stdarg.h stdlib.h strin
-       iconv.h langinfo.h math.h unistd.h stropts.h errno.h \
-       sys/resource.h sys/systeminfo.h locale.h \
-       sys/stream.h termios.h libc.h sys/statfs.h \
-       poll.h sys/poll.h pwd.h utime.h sys/param.h libintl.h \
-       libgen.h util/debug.h util/msg18n.h frame.h \
--      sys/acl.h sys/access.h sys/sysctl.h sys/sysinfo.h wchar.h wctype.h)
-+      sys/acl.h sys/access.h sys/sysinfo.h wchar.h wctype.h)
- dnl sys/ptem.h depends on sys/stream.h on Solaris
- AC_CHECK_HEADERS(sys/ptem.h, [], [],
- [#if defined HAVE_SYS_STREAM_H
- #  include <sys/stream.h>
- #endif])
-+dnl sys/sysctl.h depends on sys/param.h on OpenBSD
-+AC_CHECK_HEADERS(sys/sysctl.h, [], [],
-+[#if defined HAVE_SYS_PARAM_H
-+#  include <sys/param.h>
-+#endif])
-+
- dnl pthread_np.h may exist but can only be used after including pthread.h
- AC_MSG_CHECKING([for pthread_np.h])
- AC_TRY_COMPILE([
- #include <pthread.h>
-@@ -2146,10 +2238,11 @@ CPPFLAGS=$cppflags_save
- fi
- dnl Checks for typedefs, structures, and compiler characteristics.
- AC_PROG_GCC_TRADITIONAL
- AC_C_CONST
-+AC_C_VOLATILE
- AC_TYPE_MODE_T
- AC_TYPE_OFF_T
- AC_TYPE_PID_T
- AC_TYPE_SIZE_T
- AC_TYPE_UID_T
-@@ -2488,15 +2581,15 @@ main()
-         vim_cv_tty_mode=0620
-       fi
-       AC_MSG_RESULT([pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group])
-       else
-       vim_cv_tty_group=world
--      AC_MSG_RESULT([ptys are world accessable])
-+      AC_MSG_RESULT([ptys are world accessible])
-       fi
-     ],[
-       vim_cv_tty_group=world
--      AC_MSG_RESULT([can't determine - assume ptys are world accessable])
-+      AC_MSG_RESULT([can't determine - assume ptys are world accessible])
-     ],[
-       AC_MSG_ERROR(cross-compiling: please set 'vim_cv_tty_group' and 'vim_cv_tty_mode')
-     ])
-   ])
- rm -f conftest_grp
-@@ -2563,18 +2656,20 @@ main()
- if test "x$vim_cv_getcwd_broken" = "xyes" ; then
-   AC_DEFINE(BAD_GETCWD)
- fi
--dnl Check for functions in one big call, to reduce the size of configure
--AC_CHECK_FUNCS(bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \
-+dnl Check for functions in one big call, to reduce the size of configure.
-+dnl Can only be used for functions that do not require any include.
-+AC_CHECK_FUNCS(bcmp fchdir fchown fsync getcwd getpseudotty \
-       getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \
--      memset nanosleep opendir putenv qsort readlink select setenv \
-+      memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
-       setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
-       sigvec strcasecmp strerror strftime stricmp strncasecmp \
-       strnicmp strpbrk strtol tgetent towlower towupper iswupper \
-       usleep utime utimes)
-+AC_FUNC_FSEEKO
- dnl fstatfs() can take 2 to 4 arguments, try to use st_blksize if possible
- AC_MSG_CHECKING(for st_blksize)
- AC_TRY_COMPILE(
- [#include <sys/types.h>
-@@ -2786,10 +2881,20 @@ if test "$enable_sysmouse" = "yes"; then
-   fi
- else
-   AC_MSG_RESULT(yes)
- fi
-+dnl make sure the FD_CLOEXEC flag for fcntl()'s F_SETFD command is known
-+AC_MSG_CHECKING(for FD_CLOEXEC)
-+AC_TRY_COMPILE(
-+[#if HAVE_FCNTL_H
-+# include <fcntl.h>
-+#endif],
-+[     int flag = FD_CLOEXEC;],
-+      AC_MSG_RESULT(yes); AC_DEFINE(HAVE_FD_CLOEXEC),
-+      AC_MSG_RESULT(not usable))
-+
- dnl rename needs to be checked separately to work on Nextstep with cc
- AC_MSG_CHECKING(for rename)
- AC_TRY_LINK([#include <stdio.h>], [rename("this", "that")],
-       AC_MSG_RESULT(yes); AC_DEFINE(HAVE_RENAME),
-       AC_MSG_RESULT(no))
-@@ -2867,11 +2972,10 @@ main()
-           ac_cv_sizeof_int=0,
-           AC_MSG_ERROR(failed to compile test program))])
- AC_MSG_RESULT($ac_cv_sizeof_int)
- AC_DEFINE_UNQUOTED(SIZEOF_INT, $ac_cv_sizeof_int)
--
- dnl Check for memmove() before bcopy(), makes memmove() be used when both are
- dnl present, fixes problem with incompatibility between Solaris 2.4 and 2.5.
- [bcopy_test_prog='
- #include "confdefs.h"
-@@ -2949,11 +3053,11 @@ dnl Find out if _Xsetlocale() is support
- dnl Check if X_LOCALE should be defined.
- if test "$enable_multibyte" = "yes"; then
-   cflags_save=$CFLAGS
-   ldflags_save=$LDFLAGS
--  if test -n "$x_includes" ; then
-+  if test "x$x_includes" != "xNONE" ; then
-     CFLAGS="$CFLAGS -I$x_includes"
-     LDFLAGS="$X_LIBS $LDFLAGS -lX11"
-     AC_MSG_CHECKING(whether X_LOCALE needed)
-     AC_TRY_COMPILE([#include <X11/Xlocale.h>],,
-       AC_TRY_LINK_FUNC([_Xsetlocale], [AC_MSG_RESULT(yes)
-@@ -2965,11 +3069,11 @@ if test "$enable_multibyte" = "yes"; the
- fi
+     {"Perl_croak_nocontext", (PERL_PROC*)&Perl_croak_nocontext},
+     {"Perl_dowantarray", (PERL_PROC*)&Perl_dowantarray},
+     {"Perl_free_tmps", (PERL_PROC*)&Perl_free_tmps},
+     {"Perl_gv_stashpv", (PERL_PROC*)&Perl_gv_stashpv},
+     {"Perl_markstack_grow", (PERL_PROC*)&Perl_markstack_grow},
+@@ -365,11 +383,12 @@ static struct {
+     {"Perl_Tmarkstack_max_ptr", (PERL_PROC*)&Perl_Tmarkstack_max_ptr},
+     {"Perl_TSv_ptr", (PERL_PROC*)&Perl_TSv_ptr},
+     {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr},
+     {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
+ #else
+-    {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3},
++    {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
++    {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init},
+     {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
+     {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
+     {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
+     {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr},
+     {"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr},
+@@ -453,11 +472,11 @@ perl_init()
+     char *bootargs[] = { "VI", NULL };
+     int argc = 3;
+     static char *argv[] = { "", "-e", "" };
  
- dnl Link with xpg4, it is said to make Korean locale working
- AC_CHECK_LIB(xpg4, _xpg4_setrunelocale, [LIBS="$LIBS -lxpg4"],,)
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
+-    Perl_sys_init3(&argc, (char***)&argv, NULL);
++    Perl_sys_init(&argc, (char***)&argv);
+ #endif
+     perl_interp = perl_alloc();
+     perl_construct(perl_interp);
+     perl_parse(perl_interp, xs_init, argc, argv, 0);
+     perl_call_argv("VIM::bootstrap", (long)G_DISCARD, bootargs);
+@@ -713,13 +732,16 @@ ex_perl(eap)
+     }
  
--dnl Check how we can run ctags
-+dnl Check how we can run ctags.  Default to "ctags" when nothing works.
- dnl --version for Exuberant ctags (preferred)
- dnl       Add --fields=+S to get function signatures for omni completion.
- dnl -t for typedefs (many ctags have this)
- dnl -s for static functions (Elvis ctags only?)
- dnl -v for variables. Dangerous, most ctags take this for 'vgrind style'.
-@@ -2977,10 +3081,11 @@ dnl -i+m to test for older Exuberant cta
- AC_MSG_CHECKING(how to create tags)
- test -f tags && mv tags tags.save
- if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&AC_FD_CC 2>&1; then
-   TAGPRG="ctags -I INIT+ --fields=+S"
- else
-+  TAGPRG="ctags"
-   (eval etags    /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags"
-   (eval etags -c   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags -c"
-   (eval ctags    /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags"
-   (eval ctags -t   /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -t"
-   (eval ctags -ts  /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -ts"
-@@ -3142,30 +3247,38 @@ if test "x$MACOSX" = "xyes" && test "x$C
-   else
-     AC_MSG_RESULT(no)
-   fi
- fi
- if test "x$MACARCH" = "xboth"; then
--  LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
-+  LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
- fi
+ #ifdef HAVE_SANDBOX
+     if (sandbox)
+     {
+-      if ((safe = perl_get_sv( "VIM::safe", FALSE )) == NULL || !SvTRUE(safe))
++      safe = perl_get_sv( "VIM::safe", FALSE );
++# ifndef MAKE_TEST  /* avoid a warning for unreachable code */
++      if (safe == NULL || !SvTRUE(safe))
+           EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module"));
+       else
++# endif
+       {
+           PUSHMARK(SP);
+           XPUSHs(safe);
+           XPUSHs(sv);
+           PUTBACK;
+@@ -1226,13 +1248,12 @@ Delete(vimbuf, ...)
+                   aucmd_prepbuf(&aco, vimbuf);
  
- dnl gcc 3.1 changed the meaning of -MM.  The only solution appears to be to
- dnl use "-isystem" instead of "-I" for all non-Vim include dirs.
- dnl But only when making dependencies, cproto and lint don't take "-isystem".
- dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow
- dnl the number before the version number.
--AC_MSG_CHECKING(for GCC 3 or later)
- DEPEND_CFLAGS_FILTER=
- if test "$GCC" = yes; then
-+  AC_MSG_CHECKING(for GCC 3 or later)
-   gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'`
-   if test "$gccmajor" -gt "2"; then
-     DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
-+    AC_MSG_RESULT(yes)
-+  else
-+    AC_MSG_RESULT(no)
-+  fi
-+  dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is
-+  dnl declared as char x[1] but actually longer.  Introduced in gcc 4.0.
-+  dnl Also remove duplicate _FORTIFY_SOURCE arguments.
-+  AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1)
-+  if test "$gccmajor" -gt "3"; then
-+    CFLAGS=`echo "$CFLAGS" | sed -e 's/-Wp,-D_FORTIFY_SOURCE=.//g' -e 's/-D_FORTIFY_SOURCE=.//g' -e 's/$/ -D_FORTIFY_SOURCE=1/'`
-+    AC_MSG_RESULT(yes)
-+  else
-+    AC_MSG_RESULT(no)
-   fi
--fi
--if test "$DEPEND_CFLAGS_FILTER" = ""; then
--  AC_MSG_RESULT(no)
--else
--  AC_MSG_RESULT(yes)
- fi
- AC_SUBST(DEPEND_CFLAGS_FILTER)
+                   if (u_savedel(lnum, 1) == OK)
+                   {
+                       ml_delete(lnum, 0);
++                      check_cursor();
+                       deleted_lines_mark(lnum, 1L);
+-                      if (aco.save_buf == curbuf)
+-                          check_cursor();
+                   }
  
- dnl write output files
- AC_OUTPUT(auto/config.mk:config.mk.in)
+                   /* restore curwin/curbuf and a few other things */
+                   aucmd_restbuf(&aco);
+                   /* Careful: autocommands may have made "vimbuf" invalid! */
 --- vim72.orig/src/if_python.c
 +++ vim72/src/if_python.c
 @@ -35,10 +35,16 @@
@@ -31967,17400 +29057,18799 @@ Individual patches for Vim 7.2:
        curbuf = savebuf;
  
        if (PyErr_Occurred() || VimErrorCheck())
---- vim72.orig/src/gui_w32.c
-+++ vim72/src/gui_w32.c
-@@ -210,34 +210,34 @@ typedef struct _DllVersionInfo
-     DWORD dwMinorVersion;
-     DWORD dwBuildNumber;
-     DWORD dwPlatformID;
- } DLLVERSIONINFO;
+--- vim72.orig/src/if_ruby.c
++++ vim72/src/if_ruby.c
+@@ -37,20 +37,40 @@
+ # define rb_cNilClass         (*dll_rb_cNilClass)
+ # define rb_cSymbol           (*dll_rb_cSymbol)
+ # define rb_cTrueClass                (*dll_rb_cTrueClass)
+ # if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
+ /*
+- * On ver 1.8, all Ruby functions are exported with "__declspce(dllimport)"
+- * in ruby.h.  But it cause trouble for these variables, because it is
++ * On ver 1.8, all Ruby functions are exported with "__declspec(dllimport)"
++ * in ruby.h.  But it causes trouble for these variables, because it is
+  * defined in this file.  When defined this RUBY_EXPORT it modified to
+  * "extern" and be able to avoid this problem.
+  */
+ #  define RUBY_EXPORT
+ # endif
+ #endif
  
-+#include <poppack.h>
++/* suggested by Ariya Mizutani */
++#if (_MSC_VER == 1200)
++# undef _WIN32_WINNT
++#endif
 +
- typedef struct tagTOOLINFOA_NEW
- {
-       UINT cbSize;
-       UINT uFlags;
-       HWND hwnd;
--      UINT uId;
-+      UINT_PTR uId;
-       RECT rect;
-       HINSTANCE hinst;
-       LPSTR lpszText;
-       LPARAM lParam;
- } TOOLINFO_NEW;
++#if (defined(RUBY_VERSION) && RUBY_VERSION >= 19) \
++    || (defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19)
++# define RUBY19_OR_LATER 1
++#endif
++
++#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
++/* Ruby 1.9 defines a number of static functions which use rb_num2long and
++ * rb_int2big */
++# define rb_num2long rb_num2long_stub
++# define rb_int2big rb_int2big_stub
++#endif
++
+ #include <ruby.h>
++#ifdef RUBY19_OR_LATER
++# include <ruby/encoding.h>
++#endif
  
- typedef struct tagNMTTDISPINFO_NEW
- {
-     NMHDR      hdr;
--    LPTSTR     lpszText;
-+    LPSTR      lpszText;
-     char       szText[80];
-     HINSTANCE  hinst;
-     UINT       uFlags;
-     LPARAM     lParam;
- } NMTTDISPINFO_NEW;
+ #undef EXTERN
+ #undef _
  
--#include <poppack.h>
--
- typedef HRESULT (WINAPI* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
- #ifndef TTM_SETMAXTIPWIDTH
- # define TTM_SETMAXTIPWIDTH   (WM_USER+24)
+ /* T_DATA defined both by Ruby and Mac header files, hack around it... */
+@@ -58,10 +78,32 @@
+ # define __OPENTRANSPORT__
+ # define __OPENTRANSPORTPROTOCOL__
+ # define __OPENTRANSPORTPROVIDERS__
  #endif
  
-@@ -990,11 +990,11 @@ _WndProc(
-                           /* Set the maximum width, this also enables using
-                            * \n for line break. */
-                           SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH,
-                                                                     0, 500);
--                          tt_text = enc_to_ucs2(str, NULL);
-+                          tt_text = enc_to_utf16(str, NULL);
-                           lpdi->lpszText = tt_text;
-                           /* can't show tooltip if failed */
-                       }
-                       else
- # endif
-@@ -1327,10 +1327,11 @@ gui_mch_init(void)
-     const char szVimWndClass[] = VIM_CLASS;
-     const char szTextAreaClass[] = "VimTextArea";
-     WNDCLASS wndclass;
- #ifdef FEAT_MBYTE
-     const WCHAR szVimWndClassW[] = VIM_CLASSW;
-+    const WCHAR szTextAreaClassW[] = L"VimTextArea";
-     WNDCLASSW wndclassw;
- #endif
- #ifdef GLOBAL_IME
-     ATOM      atom;
- #endif
-@@ -1477,10 +1478,32 @@ gui_mch_init(void)
- #if defined(FEAT_MBYTE_IME) && defined(DYNAMIC_IME)
-     dyn_imm_load();
- #endif
++/*
++ * Backward compatiblity for Ruby 1.8 and earlier.
++ * Ruby 1.9 does not provide STR2CSTR, instead StringValuePtr is provided.
++ * Ruby 1.9 does not provide RXXX(s)->len and RXXX(s)->ptr, instead
++ * RXXX_LEN(s) and RXXX_PTR(s) are provided.
++ */
++#ifndef StringValuePtr
++# define StringValuePtr(s) STR2CSTR(s)
++#endif
++#ifndef RARRAY_LEN
++# define RARRAY_LEN(s) RARRAY(s)->len
++#endif
++#ifndef RARRAY_PTR
++# define RARRAY_PTR(s) RARRAY(s)->ptr
++#endif
++#ifndef RSTRING_LEN
++# define RSTRING_LEN(s) RSTRING(s)->len
++#endif
++#ifndef RSTRING_PTR
++# define RSTRING_PTR(s) RSTRING(s)->ptr
++#endif
++
+ #include "vim.h"
+ #include "version.h"
  
-     /* Create the text area window */
-+#ifdef FEAT_MBYTE
-+    if (wide_WindowProc)
-+    {
-+      if (GetClassInfoW(s_hinst, szTextAreaClassW, &wndclassw) == 0)
-+      {
-+          wndclassw.style = CS_OWNDC;
-+          wndclassw.lpfnWndProc = _TextAreaWndProc;
-+          wndclassw.cbClsExtra = 0;
-+          wndclassw.cbWndExtra = 0;
-+          wndclassw.hInstance = s_hinst;
-+          wndclassw.hIcon = NULL;
-+          wndclassw.hCursor = LoadCursor(NULL, IDC_ARROW);
-+          wndclassw.hbrBackground = NULL;
-+          wndclassw.lpszMenuName = NULL;
-+          wndclassw.lpszClassName = szTextAreaClassW;
-+
-+          if (RegisterClassW(&wndclassw) == 0)
-+              return FAIL;
-+      }
-+    }
-+    else
+ #if defined(PROTO) && !defined(FEAT_RUBY)
+ /* Define these to be able to generate the function prototypes. */
+@@ -127,17 +169,37 @@ static void ruby_vim_init(void);
+ #define rb_str2cstr                   dll_rb_str2cstr
+ #define rb_str_cat                    dll_rb_str_cat
+ #define rb_str_concat                 dll_rb_str_concat
+ #define rb_str_new                    dll_rb_str_new
+ #define rb_str_new2                   dll_rb_str_new2
+-#define ruby_errinfo                  (*dll_ruby_errinfo)
++#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
++# define rb_string_value_ptr          dll_rb_string_value_ptr
++# define rb_float_new                 dll_rb_float_new
++# define rb_ary_new                   dll_rb_ary_new
++# define rb_ary_push                  dll_rb_ary_push
 +#endif
-     if (GetClassInfo(s_hinst, szTextAreaClass, &wndclass) == 0)
-     {
-       wndclass.style = CS_OWNDC;
-       wndclass.lpfnWndProc = _TextAreaWndProc;
-       wndclass.cbClsExtra = 0;
-@@ -1580,10 +1603,21 @@ gui_mch_init(void)
-     s_findrep_struct.lpstrFindWhat[0] = NUL;
-     s_findrep_struct.lpstrReplaceWith = alloc(MSWIN_FR_BUFSIZE);
-     s_findrep_struct.lpstrReplaceWith[0] = NUL;
-     s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE;
-     s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE;
-+# if defined(FEAT_MBYTE) && defined(WIN3264)
-+    s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w);
-+    s_findrep_struct_w.lpstrFindWhat =
-+                            (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
-+    s_findrep_struct_w.lpstrFindWhat[0] = NUL;
-+    s_findrep_struct_w.lpstrReplaceWith =
-+                            (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
-+    s_findrep_struct_w.lpstrReplaceWith[0] = NUL;
-+    s_findrep_struct_w.wFindWhatLen = MSWIN_FR_BUFSIZE;
-+    s_findrep_struct_w.wReplaceWithLen = MSWIN_FR_BUFSIZE;
-+# endif
++#ifdef RUBY19_OR_LATER
++# define rb_errinfo                   dll_rb_errinfo
++#else
++# define ruby_errinfo                 (*dll_ruby_errinfo)
++#endif
+ #define ruby_init                     dll_ruby_init
+ #define ruby_init_loadpath            dll_ruby_init_loadpath
++#define NtInitialize                  dll_NtInitialize
+ #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
+ # define rb_w32_snprintf              dll_rb_w32_snprintf
  #endif
  
- theend:
-     /* Display any pending error messages */
-     display_errors();
-@@ -1933,11 +1967,11 @@ GetResultStr(HWND hwnd, int GCS, int *le
-     /* Reads in the composition string. */
-     buf = GetCompositionString_inUCS2(hIMC, GCS, lenp);
-     if (buf == NULL)
-       return NULL;
--    convbuf = ucs2_to_enc(buf, lenp);
-+    convbuf = utf16_to_enc(buf, lenp);
-     pImmReleaseContext(hwnd, hIMC);
-     vim_free(buf);
-     return convbuf;
- }
++#ifdef RUBY19_OR_LATER
++# define ruby_script                  dll_ruby_script
++# define rb_enc_find_index            dll_rb_enc_find_index
++# define rb_enc_find                  dll_rb_enc_find
++# define rb_enc_str_new                       dll_rb_enc_str_new
++# define rb_sprintf                   dll_rb_sprintf
++# define ruby_init_stack              dll_ruby_init_stack
++#endif
++
+ /*
+  * Pointers for dynamic link
+  */
+ static VALUE (*dll_rb_assoc_new) (VALUE, VALUE);
+ static VALUE *dll_rb_cFalseClass;
+@@ -181,17 +243,51 @@ static void (*dll_rb_raise) (VALUE, cons
+ static char *(*dll_rb_str2cstr) (VALUE,int*);
+ static VALUE (*dll_rb_str_cat) (VALUE, const char*, long);
+ static VALUE (*dll_rb_str_concat) (VALUE, VALUE);
+ static VALUE (*dll_rb_str_new) (const char*, long);
+ static VALUE (*dll_rb_str_new2) (const char*);
++#ifdef RUBY19_OR_LATER
++static VALUE (*dll_rb_errinfo) (void);
++#else
+ static VALUE *dll_ruby_errinfo;
++#endif
+ static void (*dll_ruby_init) (void);
+ static void (*dll_ruby_init_loadpath) (void);
++static void (*dll_NtInitialize) (int*, char***);
++#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
++static char * (*dll_rb_string_value_ptr) (volatile VALUE*);
++static VALUE (*dll_rb_float_new) (double);
++static VALUE (*dll_rb_ary_new) (void);
++static VALUE (*dll_rb_ary_push) (VALUE, VALUE);
++#endif
++#ifdef RUBY19_OR_LATER
++static VALUE (*dll_rb_int2big)(SIGNED_VALUE);
++#endif
+ #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
+ static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...);
  #endif
-@@ -2564,11 +2598,11 @@ gui_mch_add_menu(
  
-           if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-           {
-               /* 'encoding' differs from active codepage: convert menu name
-                * and use wide function */
--              wn = enc_to_ucs2(menu->name, NULL);
-+              wn = enc_to_utf16(menu->name, NULL);
-               if (wn != NULL)
-               {
-                   MENUITEMINFOW       infow;
++#ifdef RUBY19_OR_LATER
++static void (*dll_ruby_script) (const char*);
++static int (*dll_rb_enc_find_index) (const char*);
++static rb_encoding* (*dll_rb_enc_find) (const char*);
++static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*);
++static VALUE (*dll_rb_sprintf) (const char*, ...);
++static void (*ruby_init_stack)(VALUE*);
++#endif
++
++#ifdef RUBY19_OR_LATER
++static SIGNED_VALUE rb_num2long_stub(VALUE x)
++{
++    return dll_rb_num2long(x);
++}
++static VALUE rb_int2big_stub(SIGNED_VALUE x)
++{
++    return dll_rb_int2big(x);
++}
++#endif
++
+ static HINSTANCE hinstRuby = 0; /* Instance of ruby.dll */
  
-                   infow.cbSize = sizeof(infow);
-@@ -2726,11 +2760,11 @@ gui_mch_add_menu_item(
+ /*
+  * Table of name to function pointer of ruby.
+  */
+@@ -243,16 +339,42 @@ static struct
+     {"rb_str2cstr", (RUBY_PROC*)&dll_rb_str2cstr},
+     {"rb_str_cat", (RUBY_PROC*)&dll_rb_str_cat},
+     {"rb_str_concat", (RUBY_PROC*)&dll_rb_str_concat},
+     {"rb_str_new", (RUBY_PROC*)&dll_rb_str_new},
+     {"rb_str_new2", (RUBY_PROC*)&dll_rb_str_new2},
++#ifdef RUBY19_OR_LATER
++    {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo},
++#else
+     {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo},
++#endif
+     {"ruby_init", (RUBY_PROC*)&dll_ruby_init},
+     {"ruby_init_loadpath", (RUBY_PROC*)&dll_ruby_init_loadpath},
++    {
++#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER < 19
++    "NtInitialize",
++#else
++    "ruby_sysinit",
++#endif
++                      (RUBY_PROC*)&dll_NtInitialize},
+ #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
+     {"rb_w32_snprintf", (RUBY_PROC*)&dll_rb_w32_snprintf},
+ #endif
++#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
++    {"rb_string_value_ptr", (RUBY_PROC*)&dll_rb_string_value_ptr},
++    {"rb_float_new", (RUBY_PROC*)&dll_rb_float_new},
++    {"rb_ary_new", (RUBY_PROC*)&dll_rb_ary_new},
++    {"rb_ary_push", (RUBY_PROC*)&dll_rb_ary_push},
++#endif
++#ifdef RUBY19_OR_LATER
++    {"rb_int2big", (RUBY_PROC*)&dll_rb_int2big},
++    {"ruby_script", (RUBY_PROC*)&dll_ruby_script},
++    {"rb_enc_find_index", (RUBY_PROC*)&dll_rb_enc_find_index},
++    {"rb_enc_find", (RUBY_PROC*)&dll_rb_enc_find},
++    {"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new},
++    {"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf},
++    {"ruby_init_stack", (RUBY_PROC*)&dll_ruby_init_stack},
++#endif
+     {"", NULL},
+ };
  
-       if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-       {
-           /* 'encoding' differs from active codepage: convert menu item name
-            * and use wide function */
--          wn = enc_to_ucs2(menu->name, NULL);
-+          wn = enc_to_utf16(menu->name, NULL);
-           if (wn != NULL)
-           {
-               n = InsertMenuW(parent->submenu_id, (UINT)idx,
-                       (menu_is_separator(menu->name)
-                                ? MF_SEPARATOR : MF_STRING) | MF_BYPOSITION,
-@@ -2936,12 +2970,31 @@ dialog_callback(
-       if (button >= DLG_NONBUTTON_CONTROL)
-           return TRUE;
+ /*
+  * Free ruby.dll
+@@ -338,10 +460,62 @@ void ex_ruby(exarg_T *eap)
+           error_print(state);
+     }
+     vim_free(script);
+ }
  
-       /* If the edit box exists, copy the string. */
-       if (s_textfield != NULL)
--          GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2,
-+      {
-+# if defined(FEAT_MBYTE) && defined(WIN3264)
-+          /* If the OS is Windows NT, and 'encoding' differs from active
-+           * codepage: use wide function and convert text. */
-+          if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-+                  && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-+            {
-+             WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
-+             char_u *p;
++/*
++ *  In Ruby 1.9 or later, ruby String object has encoding.
++ *  conversion buffer string of vim to ruby String object using
++ *  VIM encoding option.
++ */
++    static VALUE
++vim_str2rb_enc_str(const char *s)
++{
++#ifdef RUBY19_OR_LATER
++    int isnum;
++    long lval;
++    char_u *sval;
++    rb_encoding *enc;
 +
-+             GetDlgItemTextW(hwnd, DLG_NONBUTTON_CONTROL + 2, wp, IOSIZE);
-+             p = utf16_to_enc(wp, NULL);
-+             vim_strncpy(s_textfield, p, IOSIZE);
-+             vim_free(p);
-+             vim_free(wp);
-+          }
-+          else
-+# endif
-+              GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2,
-                                                        s_textfield, IOSIZE);
++    isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
++    if (isnum == 0)
++    {
++      enc = rb_enc_find((char *)sval);
++      vim_free(sval);
++      if (enc) {
++          return rb_enc_str_new(s, strlen(s), enc);
 +      }
-       /*
-        * Need to check for IDOK because if the user just hits Return to
-        * accept the default value, some reason this is what we get.
-        */
-@@ -3568,11 +3621,11 @@ nCopyAnsiToWideChar(
-     WCHAR     *wn;
-     if (enc_codepage == 0 && (int)GetACP() != enc_codepage)
-     {
-       /* Not a codepage, use our own conversion function. */
--      wn = enc_to_ucs2(lpAnsiIn, NULL);
-+      wn = enc_to_utf16(lpAnsiIn, NULL);
-       if (wn != NULL)
-       {
-           wcscpy(lpWCStr, wn);
-           nChar = (int)wcslen(wn) + 1;
-           vim_free(wn);
---- vim72.orig/src/os_mswin.c
-+++ vim72/src/os_mswin.c
-@@ -307,11 +307,11 @@ mch_settitle(
-     {
- #  ifdef FEAT_MBYTE
-       if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-       {
-           /* Convert the title from 'encoding' to the active codepage. */
--          WCHAR       *wp = enc_to_ucs2(title, NULL);
-+          WCHAR       *wp = enc_to_utf16(title, NULL);
-           int n;
-           if (wp != NULL)
-           {
-               n = SetConsoleTitleW(wp);
-@@ -404,14 +404,14 @@ mch_FullName(
-           /* Use the wide function:
-            * - convert the fname from 'encoding' to UCS2.
-            * - invoke _wfullpath()
-            * - convert the result from UCS2 to 'encoding'.
-            */
--          wname = enc_to_ucs2(fname, NULL);
-+          wname = enc_to_utf16(fname, NULL);
-           if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH - 1) != NULL)
-           {
--              cname = ucs2_to_enc((short_u *)wbuf, NULL);
-+              cname = utf16_to_enc((short_u *)wbuf, NULL);
-               if (cname != NULL)
-               {
-                   vim_strncpy(buf, cname, len - 1);
-                   nResult = OK;
-               }
-@@ -505,11 +505,11 @@ vim_stat(const char *name, struct stat *
-           /* Wide functions of Borland C 5.5 do not work on Windows 98. */
-           && g_PlatformId == VER_PLATFORM_WIN32_NT
- # endif
-        )
-     {
--      WCHAR   *wp = enc_to_ucs2(buf, NULL);
-+      WCHAR   *wp = enc_to_utf16(buf, NULL);
-       int     n;
-       if (wp != NULL)
-       {
-           n = _wstat(wp, (struct _stat *)stp);
-@@ -651,10 +651,16 @@ mch_has_wildcard(char_u *p)
- mch_chdir(char *path)
- {
-     if (path[0] == NUL)               /* just checking... */
-       return -1;
-+    if (p_verbose >= 5)
++    }
++#endif
++    return rb_str_new2(s);
++}
++
++    static VALUE
++eval_enc_string_protect(const char *str, int *state)
++{
++#ifdef RUBY19_OR_LATER
++    int isnum;
++    long lval;
++    char_u *sval;
++    rb_encoding *enc;
++    VALUE v;
++
++    isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
++    if (isnum == 0)
 +    {
-+      verbose_enter();
-+      smsg((char_u *)"chdir(%s)", path);
-+      verbose_leave();
++      enc = rb_enc_find((char *)sval);
++      vim_free(sval);
++      if (enc)
++      {
++          v = rb_sprintf("#-*- coding:%s -*-\n%s", rb_enc_name(enc), str);
++          return rb_eval_string_protect(StringValuePtr(v), state);
++      }
 +    }
-     if (isalpha(path[0]) && path[1] == ':')   /* has a drive name */
-     {
-       /* If we can change to the drive, skip that part of the path.  If we
-        * can't then the current directory may be invalid, try using chdir()
-        * with the whole path. */
-@@ -666,11 +672,11 @@ mch_chdir(char *path)
-       return 0;
++#endif
++    return rb_eval_string_protect(str, state);
++}
++
+ void ex_rubydo(exarg_T *eap)
+ {
+     int state;
+     linenr_T i;
  
- #ifdef FEAT_MBYTE
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
--      WCHAR   *p = enc_to_ucs2(path, NULL);
-+      WCHAR   *p = enc_to_utf16(path, NULL);
-       int     n;
+@@ -350,24 +524,24 @@ void ex_rubydo(exarg_T *eap)
+       if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
+           return;
+       for (i = eap->line1; i <= eap->line2; i++) {
+           VALUE line, oldline;
  
-       if (p != NULL)
+-          line = oldline = rb_str_new2((char *)ml_get(i));
++          line = oldline = vim_str2rb_enc_str((char *)ml_get(i));
+           rb_lastline_set(line);
+-          rb_eval_string_protect((char *) eap->arg, &state);
++          eval_enc_string_protect((char *) eap->arg, &state);
+           if (state) {
+               error_print(state);
+               break;
+           }
+           line = rb_lastline_get();
+           if (!NIL_P(line)) {
+               if (TYPE(line) != T_STRING) {
+                   EMSG(_("E265: $_ must be an instance of String"));
+                   return;
+               }
+-              ml_replace(i, (char_u *) STR2CSTR(line), 1);
++              ml_replace(i, (char_u *) StringValuePtr(line), 1);
+               changed();
+ #ifdef SYNTAX_HL
+               syn_changed(i); /* recompute syntax hl. for this line */
+ #endif
+           }
+@@ -412,13 +586,28 @@ static int ensure_ruby_initialized(void)
+     {
+ #ifdef DYNAMIC_RUBY
+       if (ruby_enabled(TRUE))
        {
-           n = _wchdir(p);
-@@ -889,23 +895,24 @@ mch_libcall(
- }
  #endif
++#ifdef _WIN32
++          /* suggested by Ariya Mizutani */
++          int argc = 1;
++          char *argv[] = {"gvim.exe"};
++          NtInitialize(&argc, &argv);
++#endif
++#ifdef RUBY19_OR_LATER
++          RUBY_INIT_STACK;
++#endif
+           ruby_init();
++#ifdef RUBY19_OR_LATER
++          ruby_script("vim-ruby");
++#endif
+           ruby_init_loadpath();
+           ruby_io_init();
++#ifdef RUBY19_OR_LATER
++          rb_enc_find_index("encdb");
++#endif
+           ruby_vim_init();
+           ruby_initialized = 1;
+ #ifdef DYNAMIC_RUBY
+       }
+       else
+@@ -432,12 +621,15 @@ static int ensure_ruby_initialized(void)
+ }
  
- #if defined(FEAT_MBYTE) || defined(PROTO)
- /*
-- * Convert an UTF-8 string to UCS-2.
-+ * Convert an UTF-8 string to UTF-16.
-  * "instr[inlen]" is the input.  "inlen" is in bytes.
-- * When "outstr" is NULL only return the number of UCS-2 words produced.
-+ * When "outstr" is NULL only return the number of UTF-16 words produced.
-  * Otherwise "outstr" must be a buffer of sufficient size.
-- * Returns the number of UCS-2 words produced.
-+ * Returns the number of UTF-16 words produced.
-  */
-     int
--utf8_to_ucs2(char_u *instr, int inlen, short_u *outstr, int *unconvlenp)
-+utf8_to_utf16(char_u *instr, int inlen, short_u *outstr, int *unconvlenp)
+ static void error_print(int state)
  {
-     int               outlen = 0;
-     char_u    *p = instr;
-     int               todo = inlen;
-     int               l;
-+    int               ch;
+ #ifndef DYNAMIC_RUBY
++#if !(defined(RUBY_VERSION) && RUBY_VERSION >= 19) \
++    && !(defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19)
+     RUBYEXTERN VALUE ruby_errinfo;
+ #endif
++#endif
+     VALUE eclass;
+     VALUE einfo;
+     char buff[BUFSIZ];
  
-     while (todo > 0)
-     {
-       /* Only convert if we have a complete sequence. */
-       l = utf_ptr2len_len(p, todo);
-@@ -915,44 +922,68 @@ utf8_to_ucs2(char_u *instr, int inlen, s
-           if (unconvlenp != NULL)
-               *unconvlenp = todo;
-           break;
+ #define TAG_RETURN    0x1
+@@ -466,22 +658,27 @@ static void error_print(int state)
+     case TAG_RETRY:
+       EMSG(_("E271: retry outside of rescue clause"));
+       break;
+     case TAG_RAISE:
+     case TAG_FATAL:
++#ifdef RUBY19_OR_LATER
++      eclass = CLASS_OF(rb_errinfo());
++      einfo = rb_obj_as_string(rb_errinfo());
++#else
+       eclass = CLASS_OF(ruby_errinfo);
+       einfo = rb_obj_as_string(ruby_errinfo);
+-      if (eclass == rb_eRuntimeError && RSTRING(einfo)->len == 0) {
++#endif
++      if (eclass == rb_eRuntimeError && RSTRING_LEN(einfo) == 0) {
+           EMSG(_("E272: unhandled exception"));
        }
+       else {
+           VALUE epath;
+           char *p;
  
--      if (outstr != NULL)
--          *outstr++ = utf_ptr2char(p);
-+      ch = utf_ptr2char(p);
-+      if (ch >= 0x10000)
-+      {
-+          /* non-BMP character, encoding with surrogate pairs */
-+          ++outlen;
-+          if (outstr != NULL)
-+          {
-+              *outstr++ = (0xD800 - (0x10000 >> 10)) + (ch >> 10);
-+              *outstr++ = 0xDC00 | (ch & 0x3FF);
-+          }
-+      }
-+      else if (outstr != NULL)
-+          *outstr++ = ch;
-       ++outlen;
-       p += l;
-       todo -= l;
+           epath = rb_class_path(eclass);
+           vim_snprintf(buff, BUFSIZ, "%s: %s",
+-                   RSTRING(epath)->ptr, RSTRING(einfo)->ptr);
++                   RSTRING_PTR(epath), RSTRING_PTR(einfo));
+           p = strchr(buff, '\n');
+           if (p) *p = '\0';
+           EMSG(buff);
+       }
+       break;
+@@ -490,50 +687,119 @@ static void error_print(int state)
+       EMSG(buff);
+       break;
      }
-     return outlen;
  }
  
- /*
-- * Convert an UCS-2 string to UTF-8.
-- * The input is "instr[inlen]" with "inlen" in number of ucs-2 words.
-+ * Convert an UTF-16 string to UTF-8.
-+ * The input is "instr[inlen]" with "inlen" in number of UTF-16 words.
-  * When "outstr" is NULL only return the required number of bytes.
-  * Otherwise "outstr" must be a buffer of sufficient size.
-  * Return the number of bytes produced.
-  */
-     int
--ucs2_to_utf8(short_u *instr, int inlen, char_u *outstr)
-+utf16_to_utf8(short_u *instr, int inlen, char_u *outstr)
+-static VALUE vim_message(VALUE self, VALUE str)
++static VALUE vim_message(VALUE self UNUSED, VALUE str)
  {
-     int               outlen = 0;
-     int               todo = inlen;
-     short_u   *p = instr;
-     int               l;
-+    int               ch, ch2;
+     char *buff, *p;
  
-     while (todo > 0)
+     str = rb_obj_as_string(str);
+-    buff = ALLOCA_N(char, RSTRING(str)->len);
+-    strcpy(buff, RSTRING(str)->ptr);
++    buff = ALLOCA_N(char, RSTRING_LEN(str));
++    strcpy(buff, RSTRING_PTR(str));
+     p = strchr(buff, '\n');
+     if (p) *p = '\0';
+     MSG(buff);
+     return Qnil;
+ }
+-static VALUE vim_set_option(VALUE self, VALUE str)
++static VALUE vim_set_option(VALUE self UNUSED, VALUE str)
+ {
+-    do_set((char_u *)STR2CSTR(str), 0);
++    do_set((char_u *)StringValuePtr(str), 0);
+     update_screen(NOT_VALID);
+     return Qnil;
+ }
+-static VALUE vim_command(VALUE self, VALUE str)
++static VALUE vim_command(VALUE self UNUSED, VALUE str)
+ {
+-    do_cmdline_cmd((char_u *)STR2CSTR(str));
++    do_cmdline_cmd((char_u *)StringValuePtr(str));
+     return Qnil;
+ }
+-static VALUE vim_evaluate(VALUE self, VALUE str)
+-{
+ #ifdef FEAT_EVAL
+-    char_u *value = eval_to_string((char_u *)STR2CSTR(str), NULL, TRUE);
++static VALUE vim_to_ruby(typval_T *tv)
++{
++    VALUE result = Qnil;
+-    if (value != NULL)
++    if (tv->v_type == VAR_STRING)
      {
-+      ch = *p;
-+      if (ch >= 0xD800 && ch <= 0xDBFF && todo > 1)
+-      VALUE val = rb_str_new2((char *)value);
+-      vim_free(value);
+-      return val;
++      result = rb_str_new2(tv->vval.v_string == NULL
++                                        ? "" : (char *)(tv->vval.v_string));
+     }
+-    else
++    else if (tv->v_type == VAR_NUMBER)
++    {
++      result = INT2NUM(tv->vval.v_number);
++    }
++# ifdef FEAT_FLOAT
++    else if (tv->v_type == VAR_FLOAT)
++    {
++      result = rb_float_new(tv->vval.v_float);
++    }
++# endif
++    else if (tv->v_type == VAR_LIST)
++    {
++      list_T      *list = tv->vval.v_list;
++      listitem_T  *curr;
++
++      result = rb_ary_new();
++
++      if (list != NULL)
 +      {
-+          /* surrogate pairs handling */
-+          ch2 = p[1];
-+          if (ch2 >= 0xDC00 && ch2 <= 0xDFFF)
++          for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
 +          {
-+              ch = ((ch - 0xD800) << 10) + (ch2 & 0x3FF) + 0x10000;
-+              ++p;
-+              --todo;
++              rb_ary_push(result, vim_to_ruby(&curr->li_tv));
 +          }
 +      }
-       if (outstr != NULL)
-       {
--          l = utf_char2bytes(*p, outstr);
-+          l = utf_char2bytes(ch, outstr);
-           outstr += l;
-       }
-       else
--          l = utf_char2len(*p);
-+          l = utf_char2len(ch);
-       ++p;
-       outlen += l;
-       --todo;
-     }
-@@ -1077,18 +1108,18 @@ crnl_to_nl(const char_u *str, int *size)
-  * Note: the following two functions are only guaranteed to work when using
-  * valid MS-Windows codepages or when iconv() is available.
-  */
++    }
++    else if (tv->v_type == VAR_DICT)
++    {
++      result = rb_hash_new();
++
++      if (tv->vval.v_dict != NULL)
++      {
++          hashtab_T   *ht = &tv->vval.v_dict->dv_hashtab;
++          long_u      todo = ht->ht_used;
++          hashitem_T  *hi;
++          dictitem_T  *di;
++
++          for (hi = ht->ht_array; todo > 0; ++hi)
++          {
++              if (!HASHITEM_EMPTY(hi))
++              {
++                  --todo;
++
++                  di = dict_lookup(hi);
++                  rb_hash_aset(result, rb_str_new2((char *)hi->hi_key),
++                                                   vim_to_ruby(&di->di_tv));
++              }
++          }
++      }
++    } /* else return Qnil; */
++
++    return result;
++}
+ #endif
++
++static VALUE vim_evaluate(VALUE self UNUSED, VALUE str)
++{
++#ifdef FEAT_EVAL
++    typval_T    *tv;
++    VALUE       result;
++
++    tv = eval_expr((char_u *)StringValuePtr(str), NULL);
++    if (tv == NULL)
++    {
+       return Qnil;
++    }
++    result = vim_to_ruby(tv);
++
++    free_tv(tv);
++
++    return result;
++#else
++    return Qnil;
++#endif
+ }
  
- /*
-- * Convert "str" from 'encoding' to UCS-2.
-+ * Convert "str" from 'encoding' to UTF-16.
-  * Input in "str" with length "*lenp".  When "lenp" is NULL, use strlen().
-  * Output is returned as an allocated string.  "*lenp" is set to the length of
-  * the result.  A trailing NUL is always added.
-  * Returns NULL when out of memory.
-  */
-     short_u *
--enc_to_ucs2(char_u *str, int *lenp)
-+enc_to_utf16(char_u *str, int *lenp)
+ static VALUE buffer_new(buf_T *buf)
  {
-     vimconv_T conv;
-     WCHAR     *ret;
-     char_u    *allocbuf = NULL;
-     int               len_loc;
-@@ -1100,11 +1131,11 @@ enc_to_ucs2(char_u *str, int *lenp)
-       lenp = &len_loc;
+     if (buf->b_ruby_ref)
+@@ -578,11 +844,11 @@ static VALUE buffer_s_count()
      }
  
-     if (enc_codepage > 0)
-     {
--      /* We can do any CP### -> UCS-2 in one pass, and we can do it
-+      /* We can do any CP### -> UTF-16 in one pass, and we can do it
-        * without iconv() (convert_* may need iconv). */
-       MultiByteToWideChar_alloc(enc_codepage, 0, str, *lenp, &ret, &length);
-     }
-     else
-     {
-@@ -1121,15 +1152,15 @@ enc_to_ucs2(char_u *str, int *lenp)
-           if (str == NULL)
-               return NULL;
-       }
-       convert_setup(&conv, NULL, NULL);
+     return INT2NUM(n);
+ }
  
--      length = utf8_to_ucs2(str, *lenp, NULL, NULL);
-+      length = utf8_to_utf16(str, *lenp, NULL, NULL);
-       ret = (WCHAR *)alloc((unsigned)((length + 1) * sizeof(WCHAR)));
-       if (ret != NULL)
-       {
--          utf8_to_ucs2(str, *lenp, (short_u *)ret, NULL);
-+          utf8_to_utf16(str, *lenp, (short_u *)ret, NULL);
-           ret[length] = 0;
-       }
+-static VALUE buffer_s_aref(VALUE self, VALUE num)
++static VALUE buffer_s_aref(VALUE self UNUSED, VALUE num)
+ {
+     buf_T *b;
+     int n = NUM2INT(num);
  
-       vim_free(allocbuf);
+     for (b = firstbuf; b != NULL; b = b->b_next)
+@@ -624,14 +890,16 @@ static VALUE buffer_count(VALUE self)
+ static VALUE get_buffer_line(buf_T *buf, linenr_T n)
+ {
+     if (n > 0 && n <= buf->b_ml.ml_line_count)
+     {
+       char *line = (char *)ml_get_buf(buf, n, FALSE);
+-      return line ? rb_str_new2(line) : Qnil;
++      return line ? vim_str2rb_enc_str(line) : Qnil;
      }
-@@ -1137,19 +1168,19 @@ enc_to_ucs2(char_u *str, int *lenp)
-     *lenp = length;
-     return (short_u *)ret;
+-    rb_raise(rb_eIndexError, "index %d out of buffer", n);
++    rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
++#ifndef __GNUC__
+     return Qnil; /* For stop warning */
++#endif
  }
  
- /*
-- * Convert an UCS-2 string to 'encoding'.
-+ * Convert an UTF-16 string to 'encoding'.
-  * Input in "str" with length (counted in wide characters) "*lenp".  When
-  * "lenp" is NULL, use wcslen().
-  * Output is returned as an allocated string.  If "*lenp" is not NULL it is
-  * set to the length of the result.
-  * Returns NULL when out of memory.
-  */
-     char_u *
--ucs2_to_enc(short_u *str, int *lenp)
-+utf16_to_enc(short_u *str, int *lenp)
+ static VALUE buffer_aref(VALUE self, VALUE num)
  {
-     vimconv_T conv;
-     char_u    *utf8_str = NULL, *enc_str = NULL;
-     int               len_loc;
+     buf_T *buf = get_buf(self);
+@@ -641,11 +909,11 @@ static VALUE buffer_aref(VALUE self, VAL
+     return Qnil; /* For stop warning */
+ }
  
-@@ -1159,24 +1190,24 @@ ucs2_to_enc(short_u *str, int *lenp)
-       lenp = &len_loc;
-     }
+ static VALUE set_buffer_line(buf_T *buf, linenr_T n, VALUE str)
+ {
+-    char      *line = STR2CSTR(str);
++    char      *line = StringValuePtr(str);
+     aco_save_T        aco;
  
-     if (enc_codepage > 0)
+     if (n > 0 && n <= buf->b_ml.ml_line_count && line != NULL)
      {
--      /* We can do any UCS-2 -> CP### in one pass. */
-+      /* We can do any UTF-16 -> CP### in one pass. */
-       int length;
+       /* set curwin/curbuf for "buf" and save some things */
+@@ -665,12 +933,14 @@ static VALUE set_buffer_line(buf_T *buf,
  
-       WideCharToMultiByte_alloc(enc_codepage, 0, str, *lenp,
-                                           (LPSTR *)&enc_str, &length, 0, 0);
-       *lenp = length;
-       return enc_str;
+       update_curbuf(NOT_VALID);
      }
-     /* Avoid allocating zero bytes, it generates an error message. */
--    utf8_str = alloc(ucs2_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL));
-+    utf8_str = alloc(utf16_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL));
-     if (utf8_str != NULL)
+     else
      {
--      *lenp = ucs2_to_utf8(str, *lenp, utf8_str);
-+      *lenp = utf16_to_utf8(str, *lenp, utf8_str);
-       /* We might be called before we have p_enc set up. */
-       conv.vc_type = CONV_NONE;
-       convert_setup(&conv, (char_u *)"utf-8",
-                                           p_enc? p_enc: (char_u *)"latin1");
-@@ -1197,10 +1228,29 @@ ucs2_to_enc(short_u *str, int *lenp)
-     return enc_str;
+-      rb_raise(rb_eIndexError, "index %d out of buffer", n);
++      rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
++#ifndef __GNUC__
+       return Qnil; /* For stop warning */
++#endif
+     }
+     return str;
  }
- #endif /* FEAT_MBYTE */
- /*
-+ * Wait for another process to Close the Clipboard.
-+ * Returns TRUE for success.
-+ */
-+    static int
-+vim_open_clipboard(void)
-+{
-+    int delay = 10;
-+
-+    while (!OpenClipboard(NULL))
-+    {
-+        if (delay > 500)
-+            return FALSE;  /* waited too long, give up */
-+        Sleep(delay);
-+        delay *= 2;   /* wait for 10, 20, 40, 80, etc. msec */
-+    }
-+    return TRUE;
-+}
-+
-+/*
-  * Get the current selection and put it in the clipboard register.
-  *
-  * NOTE: Must use GlobalLock/Unlock here to ensure Win32s compatibility.
-  * On NT/W95 the clipboard data is a fixed global memory object and
-  * so its handle = its pointer.
-@@ -1227,11 +1277,11 @@ clip_mch_request_selection(VimClipboard
  
-     /*
-      * Don't pass GetActiveWindow() as an argument to OpenClipboard() because
-      * then we can't paste back into the same window for some reason - webb.
-      */
--    if (!OpenClipboard(NULL))
-+    if (!vim_open_clipboard())
-       return;
+ static VALUE buffer_aset(VALUE self, VALUE num, VALUE str)
+@@ -709,23 +979,26 @@ static VALUE buffer_delete(VALUE self, V
  
-     /* Check for vim's own clipboard format first.  This only gets the type of
-      * the data, still need to use CF_UNICODETEXT or CF_TEXT for the text. */
-     if (IsClipboardFormatAvailable(cbd->format))
-@@ -1306,11 +1356,11 @@ clip_mch_request_selection(VimClipboard
-           {
-               for (str_size = 0; str_size < maxlen; ++str_size)
-                   if (hMemWstr[str_size] == NUL)
-                       break;
-           }
--          to_free = str = ucs2_to_enc((short_u *)hMemWstr, &str_size);
-+          to_free = str = utf16_to_enc((short_u *)hMemWstr, &str_size);
-           GlobalUnlock(hMemW);
-       }
+       update_curbuf(NOT_VALID);
      }
      else
- #endif
-@@ -1338,11 +1388,11 @@ clip_mch_request_selection(VimClipboard
-                       break;
-           }
- # if defined(FEAT_MBYTE) && defined(WIN3264)
-           /* The text is in the active codepage.  Convert to 'encoding',
--           * going through UCS-2. */
-+           * going through UTF-16. */
-           acp_to_enc(str, str_size, &to_free, &maxlen);
-           if (to_free != NULL)
-           {
-               str_size = maxlen;
-               str = to_free;
-@@ -1402,11 +1452,11 @@ acp_to_enc(str, str_size, out, outlen)
-     MultiByteToWideChar_alloc(GetACP(), 0, str, str_size, &widestr, outlen);
-     if (widestr != NULL)
      {
-       ++*outlen;      /* Include the 0 after the string */
--      *out = ucs2_to_enc((short_u *)widestr, outlen);
-+      *out = utf16_to_enc((short_u *)widestr, outlen);
-       vim_free(widestr);
+-      rb_raise(rb_eIndexError, "index %d out of buffer", n);
++      rb_raise(rb_eIndexError, "line number %ld out of range", n);
      }
+     return Qnil;
  }
- #endif
  
-@@ -1464,13 +1514,13 @@ clip_mch_set_selection(VimClipboard *cbd
- # if defined(FEAT_MBYTE) && defined(WIN3264)
-     {
-       WCHAR           *out;
-       int             len = metadata.txtlen;
+ static VALUE buffer_append(VALUE self, VALUE num, VALUE str)
+ {
+     buf_T     *buf = get_buf(self);
+-    char      *line = STR2CSTR(str);
++    char      *line = StringValuePtr(str);
+     long      n = NUM2LONG(num);
+     aco_save_T        aco;
  
--      /* Convert the text to UCS-2. This is put on the clipboard as
-+      /* Convert the text to UTF-16. This is put on the clipboard as
-        * CF_UNICODETEXT. */
--      out = (WCHAR *)enc_to_ucs2(str, &len);
-+      out = (WCHAR *)enc_to_utf16(str, &len);
-       if (out != NULL)
-       {
-           WCHAR *lpszMemW;
+-    if (n >= 0 && n <= buf->b_ml.ml_line_count && line != NULL)
++    if (line == NULL) {
++      rb_raise(rb_eIndexError, "NULL line");
++    }
++    else if (n >= 0 && n <= buf->b_ml.ml_line_count)
+     {
+       /* set curwin/curbuf for "buf" and save some things */
+       aucmd_prepbuf(&aco, buf);
  
-           /* Convert the text for CF_TEXT to Active codepage. Otherwise it's
-@@ -1486,11 +1536,11 @@ clip_mch_set_selection(VimClipboard *cbd
-               return;         /* out of memory */
-           }
-           WideCharToMultiByte(GetACP(), 0, out, len,
-                                                 str, metadata.txtlen, 0, 0);
+       if (u_inssub(n + 1) == OK) {
+@@ -743,11 +1016,11 @@ static VALUE buffer_append(VALUE self, V
+       /* Careful: autocommands may have made "buf" invalid! */
  
--          /* Allocate memory for the UCS-2 text, add one NUL word to
-+          /* Allocate memory for the UTF-16 text, add one NUL word to
-            * terminate the string. */
-           hMemW = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
-                                                  (len + 1) * sizeof(WCHAR));
-           lpszMemW = (WCHAR *)GlobalLock(hMemW);
-           if (lpszMemW != NULL)
-@@ -1535,11 +1585,11 @@ clip_mch_set_selection(VimClipboard *cbd
-      *
-      * Don't pass GetActiveWindow() as an argument to OpenClipboard()
-      * because then we can't paste back into the same window for some
-      * reason - webb.
-      */
--    if (OpenClipboard(NULL))
-+    if (vim_open_clipboard())
-     {
-       if (EmptyClipboard())
-       {
-           SetClipboardData(cbd->format, hMemVim);
-           hMemVim = 0;
---- vim72.orig/src/os_win32.c
-+++ vim72/src/os_win32.c
-@@ -1585,11 +1585,11 @@ executable_exists(char *name)
-     char      fname[_MAX_PATH];
+       update_curbuf(NOT_VALID);
+     }
+     else {
+-      rb_raise(rb_eIndexError, "index %d out of buffer", n);
++      rb_raise(rb_eIndexError, "line number %ld out of range", n);
+     }
+     return str;
+ }
  
- #ifdef FEAT_MBYTE
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
--      WCHAR   *p = enc_to_ucs2(name, NULL);
-+      WCHAR   *p = enc_to_utf16(name, NULL);
-       WCHAR   fnamew[_MAX_PATH];
-       WCHAR   *dumw;
-       long    n;
+ static VALUE window_new(win_T *win)
+@@ -787,11 +1060,11 @@ static VALUE window_s_current()
+ static VALUE line_s_current()
+ {
+     return get_buffer_line(curbuf, curwin->w_cursor.lnum);
+ }
  
-       if (p != NULL)
-@@ -2438,11 +2438,11 @@ mch_dirname(
-     {
-       WCHAR   wbuf[_MAX_PATH + 1];
+-static VALUE set_current_line(VALUE self, VALUE str)
++static VALUE set_current_line(VALUE self UNUSED, VALUE str)
+ {
+     return set_buffer_line(curbuf, curwin->w_cursor.lnum, str);
+ }
  
-       if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0)
-       {
--          char_u  *p = ucs2_to_enc(wbuf, NULL);
-+          char_u  *p = utf16_to_enc(wbuf, NULL);
+ static VALUE current_line_number()
+@@ -813,11 +1086,11 @@ static VALUE window_s_count()
+ #else
+     return INT2NUM(1);
+ #endif
+ }
  
-           if (p != NULL)
-           {
-               vim_strncpy(buf, p, len - 1);
-               vim_free(p);
-@@ -2464,11 +2464,11 @@ mch_dirname(
- mch_getperm(char_u *name)
+-static VALUE window_s_aref(VALUE self, VALUE num)
++static VALUE window_s_aref(VALUE self UNUSED, VALUE num)
  {
- #ifdef FEAT_MBYTE
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
--      WCHAR   *p = enc_to_ucs2(name, NULL);
-+      WCHAR   *p = enc_to_utf16(name, NULL);
-       long    n;
+     win_T *w;
+     int n = NUM2INT(num);
  
-       if (p != NULL)
-       {
-           n = (long)GetFileAttributesW(p);
-@@ -2493,11 +2493,11 @@ mch_setperm(
+ #ifndef FEAT_WINDOWS
+@@ -884,31 +1157,31 @@ static VALUE window_set_cursor(VALUE sel
  {
-     perm |= FILE_ATTRIBUTE_ARCHIVE;   /* file has changed, set archive bit */
- #ifdef FEAT_MBYTE
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
--      WCHAR   *p = enc_to_ucs2(name, NULL);
-+      WCHAR   *p = enc_to_utf16(name, NULL);
-       long    n;
+     VALUE lnum, col;
+     win_T *win = get_win(self);
  
-       if (p != NULL)
-       {
-           n = (long)SetFileAttributesW(p, perm);
-@@ -2520,11 +2520,11 @@ mch_hide(char_u *name)
-     int               perm;
- #ifdef FEAT_MBYTE
-     WCHAR     *p = NULL;
+     Check_Type(pos, T_ARRAY);
+-    if (RARRAY(pos)->len != 2)
++    if (RARRAY_LEN(pos) != 2)
+       rb_raise(rb_eArgError, "array length must be 2");
+-    lnum = RARRAY(pos)->ptr[0];
+-    col = RARRAY(pos)->ptr[1];
++    lnum = RARRAY_PTR(pos)[0];
++    col = RARRAY_PTR(pos)[1];
+     win->w_cursor.lnum = NUM2LONG(lnum);
+     win->w_cursor.col = NUM2UINT(col);
+     check_cursor();               /* put cursor on an existing line */
+     update_screen(NOT_VALID);
+     return Qnil;
+ }
  
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
--      p = enc_to_ucs2(name, NULL);
-+      p = enc_to_utf16(name, NULL);
- #endif
+-static VALUE f_p(int argc, VALUE *argv, VALUE self)
++static VALUE f_p(int argc, VALUE *argv, VALUE self UNUSED)
+ {
+     int i;
+     VALUE str = rb_str_new("", 0);
  
- #ifdef FEAT_MBYTE
-     if (p != NULL)
-     {
-@@ -2588,11 +2588,11 @@ mch_is_linked(char_u *fname)
-     BY_HANDLE_FILE_INFORMATION inf;
- #ifdef FEAT_MBYTE
-     WCHAR     *wn = NULL;
+     for (i = 0; i < argc; i++) {
+       if (i > 0) rb_str_cat(str, ", ", 2);
+       rb_str_concat(str, rb_inspect(argv[i]));
+     }
+-    MSG(RSTRING(str)->ptr);
++    MSG(RSTRING_PTR(str));
+     return Qnil;
+ }
  
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
--      wn = enc_to_ucs2(fname, NULL);
-+      wn = enc_to_utf16(fname, NULL);
-     if (wn != NULL)
-     {
-       hFile = CreateFileW(wn,         /* file name */
-                   GENERIC_READ,       /* access mode */
-                   0,                  /* share mode */
-@@ -4237,11 +4237,11 @@ mch_remove(char_u *name)
-     WCHAR     *wn = NULL;
-     int               n;
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
--      wn = enc_to_ucs2(name, NULL);
-+      wn = enc_to_utf16(name, NULL);
-       if (wn != NULL)
-       {
-           SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL);
-           n = DeleteFileW(wn) ? 0 : -1;
-           vim_free(wn);
-@@ -4380,12 +4380,12 @@ mch_rename(
-     WCHAR     *wnew = NULL;
-     int               retval = -1;
+ static void ruby_io_init(void)
+ {
+--- vim72.orig/src/if_sniff.c
++++ vim72/src/if_sniff.c
+@@ -714,12 +714,14 @@ ConnectToSniffEmacs()
+     }
  
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
--      wold = enc_to_ucs2((char_u *)pszOldFile, NULL);
--      wnew = enc_to_ucs2((char_u *)pszNewFile, NULL);
-+      wold = enc_to_utf16((char_u *)pszOldFile, NULL);
-+      wnew = enc_to_utf16((char_u *)pszNewFile, NULL);
-       if (wold != NULL && wnew != NULL)
-           retval = mch_wrename(wold, wnew);
-       vim_free(wold);
-       vim_free(wnew);
-       if (retval == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-@@ -4490,11 +4490,11 @@ mch_access(char *n, int p)
-     int               retval = -1;        /* default: fail */
- #ifdef FEAT_MBYTE
-     WCHAR     *wn = NULL;
+ #else         /* UNIX Version of the Code */
+     int ToSniffEmacs[2], FromSniffEmacs[2];
  
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
--      wn = enc_to_ucs2(n, NULL);
-+      wn = enc_to_utf16(n, NULL);
- #endif
+-    pipe(ToSniffEmacs);
+-    pipe(FromSniffEmacs);
++    if (pipe(ToSniffEmacs) != 0)
++      return 1;
++    if (pipe(FromSniffEmacs) != 0)
++      return 1;
  
-     if (mch_isdir(n))
+     /* fork */
+     if ((sniffemacs_pid=fork()) == 0)
      {
-       char TempName[_MAX_PATH + 16] = "";
-@@ -4616,11 +4616,11 @@ getout:
-     return retval;
+       /* child */
+@@ -1112,11 +1114,12 @@ vi_error_msg(str)
+     static void
+ vi_open_file(fname)
+     char *fname;
+ {
+     ++no_wait_return;
+-    do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF);
++    do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF,
++          curwin);
+     curbuf->b_sniff = TRUE;
+     --no_wait_return;                                 /* [ex_docmd.c] */
  }
  
- #if defined(FEAT_MBYTE) || defined(PROTO)
+     static buf_T *
+--- vim72.orig/src/if_tcl.c
++++ vim72/src/if_tcl.c
+@@ -159,11 +159,11 @@ static struct ref refsdeleted;   /* dummy
+ # ifndef  DYNAMIC_TCL /* Just generating prototypes */
+ typedef int HANDLE;
+ # endif
  /*
-- * Version of open() that may use ucs2 file name.
-+ * Version of open() that may use UTF-16 file name.
+- * Declare HANDLE for perl.dll and function pointers.
++ * Declare HANDLE for tcl.dll and function pointers.
   */
-     int
- mch_open(char *name, int flags, int mode)
- {
-     /* _wopen() does not work with Borland C 5.5: creates a read-only file. */
-@@ -4628,11 +4628,11 @@ mch_open(char *name, int flags, int mode
-     WCHAR     *wn;
-     int               f;
+ static HANDLE hTclLib = NULL;
+ Tcl_Interp* (*dll_Tcl_CreateInterp)();
  
-     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-     {
--      wn = enc_to_ucs2(name, NULL);
-+      wn = enc_to_utf16(name, NULL);
-       if (wn != NULL)
-       {
-           f = _wopen(wn, flags, mode);
-           vim_free(wn);
-           if (f >= 0)
-@@ -4646,11 +4646,11 @@ mch_open(char *name, int flags, int mode
+ /*
+@@ -180,11 +180,11 @@ static struct {
  
-     return open(name, flags, mode);
+ /*
+  * Make all runtime-links of tcl.
+  *
+  * 1. Get module handle using LoadLibraryEx.
+- * 2. Get pointer to perl function by GetProcAddress.
++ * 2. Get pointer to tcl function by GetProcAddress.
+  * 3. Repeat 2, until get all functions will be used.
+  *
+  * Parameter 'libname' provides name of DLL.
+  * Return OK or FAIL.
+  */
+@@ -288,14 +288,13 @@ tcl_end()
+  * we just delete the Tcl interpreter (and create a new one with the next
+  * :tcl command).
+  */
+ #define TCL_EXIT      5
+-/* ARGSUSED */
+     static int
+ exitcmd(dummy, interp, objc, objv)
+-    ClientData dummy;
++    ClientData dummy UNUSED;
+     Tcl_Interp *interp;
+     int objc;
+     Tcl_Obj *CONST objv[];
+ {
+     int value = 0;
+@@ -313,14 +312,13 @@ exitcmd(dummy, interp, objc, objv)
+           Tcl_WrongNumArgs(interp, 1, objv, "?returnCode?");
+     }
+     return TCL_ERROR;
+ }
+-/* ARGSUSED */
+     static int
+ catchcmd(dummy, interp, objc, objv)
+-    ClientData        dummy;
++    ClientData        dummy UNUSED;
+     Tcl_Interp        *interp;
+     int               objc;
+     Tcl_Obj   *CONST objv[];
+ {
+     char    *varname = NULL;
+@@ -354,14 +352,13 @@ catchcmd(dummy, interp, objc, objv)
  }
  
  /*
-- * Version of fopen() that may use ucs2 file name.
-+ * Version of fopen() that may use UTF-16 file name.
+  *  "::vim::beep" - what Vi[m] does best :-)
   */
-     FILE *
- mch_fopen(char *name, char *mode)
+-/* ARGSUSED */
+     static int
+ beepcmd(dummy, interp, objc, objv)
+-    ClientData dummy;
++    ClientData dummy UNUSED;
+     Tcl_Interp *interp;
+     int objc;
+     Tcl_Obj *CONST objv[];
  {
-     WCHAR     *wn, *wm;
-@@ -4673,12 +4673,12 @@ mch_fopen(char *name, char *mode)
-       if (newMode == 't')
-           _set_fmode(_O_TEXT);
-       else if (newMode == 'b')
-           _set_fmode(_O_BINARY);
- # endif
--      wn = enc_to_ucs2(name, NULL);
--      wm = enc_to_ucs2(mode, NULL);
-+      wn = enc_to_utf16(name, NULL);
-+      wm = enc_to_utf16(mode, NULL);
-       if (wn != NULL && wm != NULL)
-           f = _wfopen(wn, wm);
-       vim_free(wn);
-       vim_free(wm);
+     if (objc != 1)
+@@ -376,14 +373,13 @@ beepcmd(dummy, interp, objc, objv)
+ /*
+  *  "::vim::buffer list" - create a list of buffer commands.
+  *  "::vim::buffer {N}" - create buffer command for buffer N.
+  *  "::vim::buffer new" - create a new buffer (not implemented)
+  */
+-/* ARGSUSED */
+     static int
+ buffercmd(dummy, interp, objc, objv)
+-    ClientData dummy;
++    ClientData dummy UNUSED;
+     Tcl_Interp *interp;
+     int objc;
+     Tcl_Obj *CONST objv[];
+ {
+     char      *name;
+@@ -473,14 +469,13 @@ buffercmd(dummy, interp, objc, objv)
+ }
  
-@@ -4774,12 +4774,12 @@ copy_infostreams(char_u *from, char_u *t
-     void              *context = NULL;
-     DWORD             lo, hi;
-     int                       len;
+ /*
+  * "::vim::window list" - create list of window commands.
+  */
+-/* ARGSUSED */
+     static int
+ windowcmd(dummy, interp, objc, objv)
+-    ClientData        dummy;
++    ClientData        dummy UNUSED;
+     Tcl_Interp        *interp;
+     int               objc;
+     Tcl_Obj   *CONST objv[];
+ {
+     char      *what, *string;
+@@ -1128,14 +1123,13 @@ winselfcmd(ref, interp, objc, objv)
  
-     /* Convert the file names to wide characters. */
--    fromw = enc_to_ucs2(from, NULL);
--    tow = enc_to_ucs2(to, NULL);
-+    fromw = enc_to_utf16(from, NULL);
-+    tow = enc_to_utf16(to, NULL);
-     if (fromw != NULL && tow != NULL)
-     {
-       /* Open the file for reading. */
-       sh = CreateFileW(fromw, GENERIC_READ, FILE_SHARE_READ, NULL,
-                            OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
-@@ -5120,11 +5120,11 @@ fix_arg_enc(void)
-       return;         /* out of memory */
+     return err;
+ }
  
-     for (i = 0; i < used_file_count; ++i)
-     {
-       idx = used_file_indexes[i];
--      str = ucs2_to_enc(ArglistW[idx], NULL);
-+      str = utf16_to_enc(ArglistW[idx], NULL);
-       if (str != NULL)
-       {
- #ifdef FEAT_DIFF
-           /* When using diff mode may need to concatenate file name to
-            * directory name.  Just like it's done in main(). */
---- vim72.orig/src/proto/os_mswin.pro
-+++ vim72/src/proto/os_mswin.pro
-@@ -20,18 +20,18 @@ int mch_has_exp_wildcard __ARGS((char_u
- int mch_has_wildcard __ARGS((char_u *p));
- int mch_chdir __ARGS((char *path));
- int can_end_termcap_mode __ARGS((int give_msg));
- int mch_screenmode __ARGS((char_u *arg));
- int mch_libcall __ARGS((char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result));
--int utf8_to_ucs2 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp));
--int ucs2_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr));
-+int utf8_to_utf16 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp));
-+int utf16_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr));
- void MultiByteToWideChar_alloc __ARGS((UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen));
- void WideCharToMultiByte_alloc __ARGS((UINT cp, DWORD flags, LPCWSTR in, int inlen, LPSTR *out, int *outlen, LPCSTR def, LPBOOL useddef));
- int clip_mch_own_selection __ARGS((VimClipboard *cbd));
- void clip_mch_lose_selection __ARGS((VimClipboard *cbd));
--short_u *enc_to_ucs2 __ARGS((char_u *str, int *lenp));
--char_u *ucs2_to_enc __ARGS((short_u *str, int *lenp));
-+short_u *enc_to_utf16 __ARGS((char_u *str, int *lenp));
-+char_u *utf16_to_enc __ARGS((short_u *str, int *lenp));
- void clip_mch_request_selection __ARGS((VimClipboard *cbd));
- void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen));
- void clip_mch_set_selection __ARGS((VimClipboard *cbd));
- void DumpPutS __ARGS((const char *psz));
- int mch_get_winpos __ARGS((int *x, int *y));
---- vim72.orig/runtime/doc/options.txt
-+++ vim72/runtime/doc/options.txt
-@@ -1,6 +1,6 @@
--*options.txt* For Vim version 7.2.  Last change: 2008 Aug 06
-+*options.txt* For Vim version 7.2.  Last change: 2008 Nov 25
  
+-/* ARGSUSED */
+     static int
+ commandcmd(dummy, interp, objc, objv)
+-    ClientData        dummy;
++    ClientData        dummy UNUSED;
+     Tcl_Interp        *interp;
+     int               objc;
+     Tcl_Obj   *CONST objv[];
+ {
+     int               err;
+@@ -1143,14 +1137,13 @@ commandcmd(dummy, interp, objc, objv)
+     err = tcldoexcommand(interp, objc, objv, 1);
+     update_screen(VALID);
+     return err;
+ }
  
-                 VIM REFERENCE MANUAL    by Bram Moolenaar
+-/* ARGSUSED */
+     static int
+ optioncmd(dummy, interp, objc, objv)
+-    ClientData        dummy;
++    ClientData        dummy UNUSED;
+     Tcl_Interp        *interp;
+     int               objc;
+     Tcl_Obj   *CONST objv[];
+ {
+     int               err;
+@@ -1158,14 +1151,13 @@ optioncmd(dummy, interp, objc, objv)
+     err = tclsetoption(interp, objc, objv, 1);
+     update_screen(VALID);
+     return err;
+ }
  
+-/* ARGSUSED */
+     static int
+ exprcmd(dummy, interp, objc, objv)
+-    ClientData        dummy;
++    ClientData        dummy UNUSED;
+     Tcl_Interp        *interp;
+     int               objc;
+     Tcl_Obj   *CONST objv[];
+ {
+     return tclvimexpr(interp, objc, objv, 1);
+@@ -1582,15 +1574,14 @@ tclsetdelcmd(interp, reflist, vimobj, de
  
-@@ -1441,10 +1441,18 @@ A jump table for the options with a shor
-                       Also applies to the modeless selection.
+ /*******************************************
+     I/O Channel
+ ********************************************/
  
-       autoselectml    Like "autoselect", but for the modeless selection
-                       only.  Compare to the 'A' flag in 'guioptions'.
+-/* ARGSUSED */
+     static int
+ channel_close(instance, interp)
+     ClientData        instance;
+-    Tcl_Interp        *interp;
++    Tcl_Interp        *interp UNUSED;
+ {
+     int               err = 0;
  
-+      html            When the clipboard contains HTML, use this when
-+                      pasting.  When putting text on the clipboard, mark it
-+                      as HTML.  This works to copy rendered HTML from
-+                      Firefox, paste it as raw HTML in Vim, select the HTML
-+                      in Vim and paste it in a rich edit box in Firefox.
-+                      Only supported for GTK version 2 and later.
-+                      Only available with the |+multi_byte| feature.
-+
-       exclude:{pattern}
-                       Defines a pattern that is matched against the name of
-                       the terminal 'term'.  If there is a match, no
-                       connection will be made to the X server.  This is
-                       useful in this situation:
-@@ -4173,13 +4181,10 @@ A jump table for the options with a shor
-       care of translating these special characters to the original meaning
-       of the key.  This means you don't have to change the keyboard mode to
-       be able to execute Normal mode commands.
-       This is the opposite of the 'keymap' option, where characters are
-       mapped in Insert mode.
--      This only works for 8-bit characters.  The value of 'langmap' may be
--      specified with multi-byte characters (e.g., UTF-8), but only the lower
--      8 bits of each character will be used.
+     /* currently does nothing */
  
-       Example (for Greek, in UTF-8):                          *greek*  >
-           :set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz
- <     Example (exchanges meaning of z and y for commands): >
-           :set langmap=zy,yz,ZY,YZ
-@@ -7470,11 +7475,13 @@ A jump table for the options with a shor
-                       global
-                       {not in Vi}
-                       {not available when compiled without the |+wildignore|
-                       feature}
-       A list of file patterns.  A file that matches with one of these
--      patterns is ignored when completing file or directory names.
-+      patterns is ignored when completing file or directory names, and
-+      influences the result of |expand()|, |glob()| and |globpath()| unless
-+      a flag is passed to disable this.
-       The pattern is used like with |:autocmd|, see |autocmd-patterns|.
-       Also see 'suffixes'.
-       Example: >
-               :set wildignore=*.o,*.obj
- <     The use of |:set+=| and |:set-=| is preferred when adding or removing
---- vim72.orig/src/proto/ex_getln.pro
-+++ vim72/src/proto/ex_getln.pro
-@@ -2,10 +2,11 @@
- char_u *getcmdline __ARGS((int firstc, long count, int indent));
- char_u *getcmdline_prompt __ARGS((int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg));
- int text_locked __ARGS((void));
- void text_locked_msg __ARGS((void));
- int curbuf_locked __ARGS((void));
-+int allbuf_locked __ARGS((void));
- char_u *getexline __ARGS((int c, void *dummy, int indent));
- char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent));
- int cmdline_overstrike __ARGS((void));
- int cmdline_at_end __ARGS((void));
- colnr_T cmdline_getvcol_cursor __ARGS((void));
-@@ -29,11 +30,11 @@ void tilde_replace __ARGS((char_u *orig_
- char_u *sm_gettail __ARGS((char_u *s));
- char_u *addstar __ARGS((char_u *fname, int len, int context));
- void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col));
- int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches));
- int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int))));
--char_u *globpath __ARGS((char_u *path, char_u *file));
-+char_u *globpath __ARGS((char_u *path, char_u *file, int expand_options));
- void init_history __ARGS((void));
- int get_histtype __ARGS((char_u *name));
- void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep));
- int get_history_idx __ARGS((int histype));
- char_u *get_cmdline_str __ARGS((void));
---- vim72.orig/src/workshop.c
-+++ vim72/src/workshop.c
-@@ -54,16 +54,16 @@ static void         load_buffer_by_name(char *,
- static void    load_buffer_by_number(int, int);
- #endif
- static void    load_window(char *, int lnum);
- static void    warp_to_pc(int);
- #ifdef FEAT_BEVAL
--void          workshop_beval_cb(BalloonEval *, int);
-+void           workshop_beval_cb(BalloonEval *, int);
-+static int     computeIndex(int, char_u *, int);
- #endif
- static char   *fixAccelText(char *);
- static void    addMenu(char *, char *, char *);
- static char   *lookupVerb(char *, int);
--static int     computeIndex(int, char_u *, int);
- static void    coloncmd(char *, Boolean);
+@@ -1600,16 +1591,15 @@ channel_close(instance, interp)
+       err = EBADF;
+     }
+     return err;
+ }
  
- extern Widget  vimShell;
- extern Widget  textArea;
- extern XtAppContext app_context;
-@@ -202,16 +202,15 @@ workshop_get_editor_version()
-  *    workshop_load_file
-  *
-  * Function:
-  *    Load a given file into the WorkShop buffer.
-  */
--/*ARGSUSED*/
-     void
- workshop_load_file(
-       char    *filename,              /* the file to load */
-       int      line,                  /* an optional line number (or 0) */
--      char    *frameid)               /* used for multi-frame support */
-+      char    *frameid UNUSED)        /* used for multi-frame support */
+-/* ARGSUSED */
+     static int
+ channel_input(instance, buf, bufsiz, errptr)
+-    ClientData        instance;
+-    char      *buf;
+-    int               bufsiz;
++    ClientData        instance UNUSED;
++    char      *buf UNUSED;
++    int               bufsiz UNUSED;
+     int               *errptr;
  {
- #ifdef WSDEBUG_TRACE
-     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
-       wstrace("workshop_load_file(%s, %d)\n", filename, line);
- #endif
-@@ -261,14 +260,13 @@ workshop_goto_line(
- #endif
  
-     load_window(filename, lineno);
- }
+     /* input is currently not supported */
  
--/*ARGSUSED*/
-     void
- workshop_front_file(
--      char    *filename)
-+      char    *filename UNUSED)
- {
- #ifdef WSDEBUG_TRACE
-     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
-       wstrace("workshop_front_file()\n");
- #endif
-@@ -536,13 +534,12 @@ workshop_adjust_marks(Widget *window, in
-  * Are there any moved marks? If so, call workshop_move_mark on
-  * each of them now. This is how eserve can find out if for example
-  * breakpoints have moved when a program has been recompiled and
-  * reloaded into dbx.
-  */
--/*ARGSUSED*/
-     void
--workshop_moved_marks(char *filename)
-+workshop_moved_marks(char *filename UNUSED)
- {
- #ifdef WSDEBUG_TRACE
-     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
-       wstrace("XXXworkshop_moved_marks(%s)\n", filename);
- #endif
-@@ -573,15 +570,14 @@ workshop_get_font_height()
+@@ -1657,43 +1647,56 @@ channel_output(instance, buf, bufsiz, er
      }
+     vim_free(str);
+     return result;
+ }
  
-     return (int)h;
+-/* ARGSUSED */
+     static void
+ channel_watch(instance, mask)
+-    ClientData        instance;
+-    int               mask;
++    ClientData        instance UNUSED;
++    int               mask UNUSED;
+ {
+     Tcl_SetErrno(EINVAL);
  }
  
--/*ARGSUSED*/
-     void
- workshop_footer_message(
--      char            *message,
--      int              severity)      /* severity is currently unused */
-+      char    *message,
-+      int     severity UNUSED)        /* severity is currently unused */
+-/* ARGSUSED */
+     static int
+ channel_gethandle(instance, direction, handleptr)
+-    ClientData        instance;
+-    int               direction;
+-    ClientData        *handleptr;
++    ClientData        instance UNUSED;
++    int               direction UNUSED;
++    ClientData        *handleptr UNUSED;
  {
- #ifdef WSDEBUG_TRACE
-     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
-       wstrace("workshop_footer_message(%s, %d)\n", message, severity);
- #endif
-@@ -685,19 +681,18 @@ workshop_submenu_end()
- /*
-  * This is where menus are really made. Each item will generate an amenu vim
-  * command. The globals curMenuName and curMenuPriority contain the name and
-  * priority of the parent menu tree.
-  */
--/*ARGSUSED*/
-     void
- workshop_menu_item(
-       char            *label,
-       char            *verb,
--      char            *accelerator,
-+      char            *accelerator UNUSED,
-       char            *acceleratorText,
--      char            *name,
--      char            *filepos,
-+      char            *name UNUSED,
-+      char            *filepos UNUSED,
-       char            *sensitive)
- {
-     char               cbuf[BUFSIZ];
-     char               namebuf[BUFSIZ];
-     char               accText[BUFSIZ];
-@@ -808,17 +803,16 @@ workshop_toolbar_end()
-       set_option_value((char_u *)"go", 0L, buf, 0);
-     }
-     workshopInitDone = True;
+     Tcl_SetErrno(EINVAL);
+     return EINVAL;
  }
  
--/*ARGSUSED*/
-     void
- workshop_toolbar_button(
-       char    *label,
-       char    *verb,
--      char    *senseVerb,
--      char    *filepos,
-+      char    *senseVerb UNUSED,
-+      char    *filepos UNUSED,
-       char    *help,
-       char    *sense,
-       char    *file,
-       char    *left)
+ static Tcl_ChannelType channel_type =
  {
-@@ -966,11 +960,13 @@ workshop_set_option(
+-    "vimmessage",
+-    NULL,   /* blockmode */
+-    channel_close,
+-    channel_input,
+-    channel_output,
+-    NULL,   /* seek */
+-    NULL,   /* set option */
+-    NULL,   /* get option */
+-    channel_watch,
+-    channel_gethandle
++    "vimmessage",     /* typeName */
++    NULL,             /* version */
++    channel_close,    /* closeProc */
++    channel_input,    /* inputProc */
++    channel_output,   /* outputProc */
++    NULL,             /* seekProc */
++    NULL,             /* setOptionProc */
++    NULL,             /* getOptionProc */
++    channel_watch,    /* watchProc */
++    channel_gethandle,        /* getHandleProc */
++    NULL,             /* close2Proc */
++    NULL,             /* blockModeProc */
++#ifdef TCL_CHANNEL_VERSION_2
++    NULL,             /* flushProc */
++    NULL,             /* handlerProc */
++#endif
++#ifdef TCL_CHANNEL_VERSION_3
++    NULL,             /* wideSeekProc */
++#endif
++#ifdef TCL_CHANNEL_VERSION_4
++    NULL,             /* threadActionProc */
++#endif
++#ifdef TCL_CHANNEL_VERSION_5
++    NULL              /* truncateProc */
++#endif
+ };
+ /**********************************
+   Interface to vim
+  **********************************/
+--- vim72.orig/src/if_xcmdsrv.c
++++ vim72/src/if_xcmdsrv.c
+@@ -19,25 +19,10 @@
+ # ifdef FEAT_X11
+ #  include <X11/Intrinsic.h>
+ #  include <X11/Xatom.h>
+ # endif
+-# if defined(HAVE_SYS_SELECT_H) && \
+-      (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME))
+-#  include <sys/select.h>
+-# endif
+-
+-# ifndef HAVE_SELECT
+-#  ifdef HAVE_SYS_POLL_H
+-#   include <sys/poll.h>
+-#  else
+-#   ifdef HAVE_POLL_H
+-#    include <poll.h>
+-#   endif
+-#  endif
+-# endif
+-
+ /*
+  * This file provides procedures that implement the command server
+  * functionality of Vim when in contact with an X11 server.
+  *
+  * Adapted from TCL/TK's send command  in tkSend.c of the tk 3.6 distribution.
+@@ -680,11 +665,11 @@ serverGetVimNames(dpy)
+     /*
+      * Scan all of the names out of the property.
+      */
+     ga_init2(&ga, 1, 100);
+-    for (p = regProp; (p - regProp) < numItems; p++)
++    for (p = regProp; (long_u)(p - regProp) < numItems; p++)
      {
-       case 's':
-           if (strcmp(option, "syntax") == 0)
-               vim_snprintf(cbuf, sizeof(cbuf), "syntax %s", value);
-           else if (strcmp(option, "savefiles") == 0)
--              ; /* XXX - Not yet implemented */
-+          {
-+              /* XXX - Not yet implemented */
-+          }
-           break;
+       entry = p;
+       while (*p != 0 && !isspace(*p))
+           p++;
+       if (*p != 0)
+@@ -734,11 +719,11 @@ ServerReplyFind(w, op)
+       {
+           p = ((struct ServerReply *) serverReply.ga_data)
+               + serverReply.ga_len;
+           e.id = w;
+           ga_init2(&e.strings, 1, 100);
+-          memcpy(p, &e, sizeof(e));
++          mch_memmove(p, &e, sizeof(e));
+           serverReply.ga_len++;
+       }
+     }
+     else if (p != NULL && op == SROP_Delete)
+     {
+@@ -967,11 +952,11 @@ LookupName(dpy, name, delete, loose)
+     /*
+      * Scan the property for the desired name.
+      */
+     returnValue = (int_u)None;
+     entry = NULL;     /* Not needed, but eliminates compiler warning. */
+-    for (p = regProp; (p - regProp) < numItems; )
++    for (p = regProp; (long_u)(p - regProp) < numItems; )
+     {
+       entry = p;
+       while (*p != 0 && !isspace(*p))
+           p++;
+       if (*p != 0 && STRICMP(name, p + 1) == 0)
+@@ -984,11 +969,11 @@ LookupName(dpy, name, delete, loose)
+       p++;
+     }
+     if (loose != NULL && returnValue == (int_u)None && !IsSerialName(name))
+     {
+-      for (p = regProp; (p - regProp) < numItems; )
++      for (p = regProp; (long_u)(p - regProp) < numItems; )
+       {
+           entry = p;
+           while (*p != 0 && !isspace(*p))
+               p++;
+           if (*p != 0 && IsSerialName(p + 1)
+@@ -1016,11 +1001,11 @@ LookupName(dpy, name, delete, loose)
+       while (*p != 0)
+           p++;
+       p++;
+       count = numItems - (p - regProp);
+       if (count > 0)
+-          memcpy(entry, p, count);
++          mch_memmove(entry, p, count);
+       XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING,
+                       8, PropModeReplace, regProp,
+                       (int)(numItems - (p - entry)));
+       XSync(dpy, False);
+     }
+@@ -1054,11 +1039,11 @@ DeleteAnyLingerer(dpy, win)
+      */
+     if (GetRegProp(dpy, &regProp, &numItems, FALSE) == FAIL)
+       return;
+     /* Scan the property for the window id.  */
+-    for (p = regProp; (p - regProp) < numItems; )
++    for (p = regProp; (long_u)(p - regProp) < numItems; )
+     {
+       if (*p != 0)
+       {
+           sscanf((char *)p, "%x", &wwin);
+           if ((Window)wwin == win)
+@@ -1070,11 +1055,11 @@ DeleteAnyLingerer(dpy, win)
+               while (*p != 0)
+                   p++;
+               p++;
+               lastHalf = numItems - (p - regProp);
+               if (lastHalf > 0)
+-                  memcpy(entry, p, lastHalf);
++                  mch_memmove(entry, p, lastHalf);
+               numItems = (entry - regProp) + lastHalf;
+               p = entry;
+               continue;
+           }
+       }
+@@ -1194,11 +1179,11 @@ serverEventProc(dpy, eventPtr)
+     /*
+      * Several commands and results could arrive in the property at
+      * one time;  each iteration through the outer loop handles a
+      * single command or result.
+      */
+-    for (p = propInfo; (p - propInfo) < numItems; )
++    for (p = propInfo; (long_u)(p - propInfo) < numItems; )
+     {
+       /*
+        * Ignore leading NULs; each command or result starts with a
+        * NUL so that no matter how badly formed a preceding command
+        * is, we'll be able to tell that a new command/result is
+@@ -1228,11 +1213,11 @@ serverEventProc(dpy, eventPtr)
+           name = NULL;
+           resWindow = None;
+           serial = (char_u *)"";
+           script = NULL;
+           enc = NULL;
+-          while (p - propInfo < numItems && *p == '-')
++          while ((long_u)(p - propInfo) < numItems && *p == '-')
+           {
+               switch (p[1])
+               {
+                   case 'r':
+                       end = skipwhite(p + 2);
+@@ -1331,11 +1316,11 @@ serverEventProc(dpy, eventPtr)
+           p += 2;
+           gotSerial = 0;
+           res = (char_u *)"";
+           code = 0;
+           enc = NULL;
+-          while ((p-propInfo) < numItems && *p == '-')
++          while ((long_u)(p - propInfo) < numItems && *p == '-')
+           {
+               switch (p[1])
+               {
+                   case 'r':
+                       if (p[2] == ' ')
+@@ -1399,11 +1384,11 @@ serverEventProc(dpy, eventPtr)
+            */
+           p += 2;
+           gotWindow = 0;
+           str = (char_u *)"";
+           enc = NULL;
+-          while ((p-propInfo) < numItems && *p == '-')
++          while ((long_u)(p - propInfo) < numItems && *p == '-')
+           {
+               switch (p[1])
+               {
+                   case 'n':
+                       if (p[2] == ' ')
+@@ -1487,15 +1472,14 @@ AppendPropCarefully(dpy, window, propert
  
-       case 'l':
-           if (strcmp(option, "lineno") == 0)
-               sprintf(cbuf, "set %snu",
-@@ -1096,14 +1092,13 @@ workshop_hotkeys(
- }
  
  /*
-  * A button in the toolbar has been pushed.
+  * Another X Error handler, just used to check for errors.
   */
--/*ARGSUSED*/
-     int
- workshop_get_positions(
--      void            *clientData,    /* unused */
-+      void            *clientData UNUSED,
-       char           **filename,      /* output data */
-       int             *curLine,       /* output data */
-       int             *curCol,        /* output data */
-       int             *selStartLine,  /* output data */
-       int             *selStartCol,   /* output data */
-@@ -1119,12 +1114,16 @@ workshop_get_positions(
-       wstrace("workshop_get_positions(%#x, \"%s\", ...)\n",
-               clientData, (curbuf && curbuf->b_sfname != NULL)
-                                     ? (char *)curbuf->b_sfname : "<None>");
+-/* ARGSUSED */
+     static int
+ x_error_check(dpy, error_event)
+-    Display   *dpy;
+-    XErrorEvent       *error_event;
++    Display   *dpy UNUSED;
++    XErrorEvent       *error_event UNUSED;
+ {
+     got_x_error = TRUE;
+     return 0;
+ }
+--- vim72.orig/src/integration.c
++++ vim72/src/integration.c
+@@ -76,11 +76,11 @@
+ # define NOCATGETS(x) x
  #endif
  
--    strcpy(ffname, (char *) curbuf->b_ffname);
--    *filename = ffname;               /* copy so nobody can change b_ffname */
-+    if (curbuf->b_ffname == NULL)
-+      ffname[0] = NUL;
-+    else
-+      /* copy so nobody can change b_ffname */
-+      strcpy(ffname, (char *) curbuf->b_ffname);
-+    *filename = ffname;
-     *curLine = curwin->w_cursor.lnum;
-     *curCol = curwin->w_cursor.col;
+ /* Functions private to this file */
+ static void workshop_connection_closed(void);
+-static void messageFromEserve(XtPointer clientData, int *NOTUSED1, XtInputId *NOTUSED2);
++static void messageFromEserve(XtPointer clientData, int *dum1, XtInputId *dum2);
+ static void workshop_disconnect(void);
+ static void workshop_sensitivity(int num, char *table);
+ static void adjust_sign_name(char *filename);
+ static void process_menuItem(char *);
+ static void process_toolbarButton(char *);
+@@ -155,13 +155,14 @@ getCommand(void)
+               return NULL;
+       }
  
-     if (curbuf->b_visual.vi_mode == 'v' &&
-           equalpos(curwin->w_cursor, curbuf->b_visual.vi_end))
-@@ -1520,13 +1519,12 @@ workshop_test_getselectedtext()
-       return selection;
-     else
-       return NULL;
  }
  
 -/*ARGSUSED*/
-     void
--workshop_save_sensitivity(char *filename)
-+workshop_save_sensitivity(char *filename UNUSED)
+ void
+-messageFromEserve(XtPointer clientData, int *NOTUSED1, XtInputId *NOTUSED2)
++messageFromEserve(XtPointer clientData UNUSED,
++                int *dum1 UNUSED,
++                XtInputId *dum2 UNUSED)
  {
- }
+       char    *cmd;           /* the 1st word of the command */
  
+       cmd = getCommand();
+       if (cmd == NULL) {
+@@ -197,11 +198,11 @@ messageFromEserve(XtPointer clientData,
+                               color++;
+                       }
+                       if (sign) {
+                               sign++;
+                       }
+-                      /* Change sign name to accomodate a different size? */
++                      /* Change sign name to accommodate a different size? */
+                       adjust_sign_name(sign);
+                       workshop_add_mark_type(idx, color, sign);
+               }
+               HANDLE_ERRORS(cmd);
+               break;
+@@ -578,11 +579,11 @@ unrecognised_message(
+       /* abort(); */
+ }
  #endif
  
-@@ -1624,12 +1622,10 @@ workshop_beval_cb(
-               workshop_send_message(buf);
-           }
-       }
-     }
- }
--#endif
--
  
-     static int
- computeIndex(
-       int              wantedCol,
-       char_u          *line,
-@@ -1649,10 +1645,11 @@ computeIndex(
-           return idx;
-     }
+-/* Change sign name to accomodate a different size:
++/* Change sign name to accommodate a different size:
+  * Create the filename based on the height. The filename format
+  * of multisize icons are:
+  *    x.xpm   : largest icon
+  *    x1.xpm  : smaller icon
+  *    x2.xpm  : smallest icon */
+@@ -612,10 +613,11 @@ adjust_sign_name(char *filename)
+               strcpy(s, "1.xpm");
+       else
+               strcpy(s, ".xpm");
+ }
  
-     return -1;
++#if 0
+ /* Were we invoked by WorkShop? This function can be used early during startup
+    if you want to do things differently if the editor is started standalone
+    or in WorkShop mode. For example, in standalone mode you may not want to
+    add a footer/message area or a sign gutter. */
+ int
+@@ -625,10 +627,11 @@ workshop_invoked()
+       if (result == -1) {
+               result = (getenv(NOCATGETS("SPRO_EDITOR_SOCKET")) != NULL);
+       }
+       return result;
  }
 +#endif
  
-     static void
- addMenu(
-       char            *menu,          /* menu name */
-       char            *accel,         /* accelerator text (optional) */
---- vim72.orig/src/getchar.c
-+++ vim72/src/getchar.c
-@@ -20,11 +20,11 @@
- /*
-  * These buffers are used for storing:
-  * - stuffed characters: A command that is translated into another command.
-  * - redo characters: will redo the last change.
-- * - recorded chracters: for the "q" command.
-+ * - recorded characters: for the "q" command.
-  *
-  * The bytes are stored like in the typeahead buffer:
-  * - K_SPECIAL introduces a special key (two more bytes follow).  A literal
-  *   K_SPECIAL is stored as K_SPECIAL KS_SPECIAL KE_FILLER.
-  * - CSI introduces a GUI termcap code (also when gui.in_use is FALSE,
-@@ -127,11 +127,11 @@ static void      closescript __ARGS((void));
- static int    vgetorpeek __ARGS((int));
- static void   map_free __ARGS((mapblock_T **));
- static void   validate_maphash __ARGS((void));
- static void   showmap __ARGS((mapblock_T *mp, int local));
- #ifdef FEAT_EVAL
--static char_u *eval_map_expr __ARGS((char_u *str));
-+static char_u *eval_map_expr __ARGS((char_u *str, int c));
- #endif
+ /* Connect back to eserve */
+ void  workshop_connect(XtAppContext context)
+ {
+ #ifdef INET_SOCKETS
+@@ -748,10 +751,11 @@ void     workshop_disconnect()
  
  /*
-  * Free and clear a buffer.
+  * Utility functions
   */
-@@ -1281,11 +1281,11 @@ free_typebuf()
++#if 0
+ /* Set icon for the window */
+ void
+ workshop_set_icon(Display *display, Widget shell, char **xpmdata,
+                 int width, int height)
  {
-     if (typebuf.tb_buf == typebuf_init)
-       EMSG2(_(e_intern2), "Free typebuf 1");
-     else
-       vim_free(typebuf.tb_buf);
--    if (typebuf.tb_buf == noremapbuf_init)
-+    if (typebuf.tb_noremap == noremapbuf_init)
-       EMSG2(_(e_intern2), "Free typebuf 2");
-     else
-       vim_free(typebuf.tb_noremap);
+@@ -791,10 +795,11 @@ workshop_set_icon(Display *display, Widg
+               XtVaSetValues(shell,
+                   XtNiconWindow, iconWindow, NULL);
+       }
+       XtFree((char *)xpmAttributes.colorsymbols);
  }
++#endif
  
-@@ -1307,10 +1307,13 @@ save_typebuf()
-       return FAIL;
-     }
-     return OK;
+ /* Minimize and maximize shells. From libutil's shell.cc. */
+ /* utility functions from libutil's shell.cc */
+ static Boolean
+@@ -925,11 +930,11 @@ Boolean workshop_get_width_height(int *w
+               *height = hgt;
+       }
+       return success;
  }
  
-+static int old_char = -1;     /* character put back by vungetc() */
-+static int old_mod_mask;      /* mod_mask for ungotten character */
-+
- #if defined(FEAT_EVAL) || defined(FEAT_EX_EXTRA) || defined(PROTO)
+-
++#if 0
+ Boolean workshop_get_rows_cols(int *rows, int *cols)
+ {
+       static int      r = 0;
+       static int      c = 0;
+       static Boolean  firstTime = True;
+@@ -956,10 +961,11 @@ Boolean workshop_get_rows_cols(int *rows
+               *rows = r;
+               *cols = c;
+       }
+       return success;
+ }
++#endif
  
  /*
-  * Save all three kinds of typeahead, so that the user must type at a prompt.
+  * Toolbar code
   */
-@@ -1321,10 +1324,14 @@ save_typeahead(tp)
-     tp->save_typebuf = typebuf;
-     tp->typebuf_valid = (alloc_typebuf() == OK);
-     if (!tp->typebuf_valid)
-       typebuf = tp->save_typebuf;
  
-+    tp->old_char = old_char;
-+    tp->old_mod_mask = old_mod_mask;
-+    old_char = -1;
-+
-     tp->save_stuffbuff = stuffbuff;
-     stuffbuff.bh_first.b_next = NULL;
- # ifdef USE_INPUT_BUF
-     tp->save_inputbuf = get_input_buf();
- # endif
-@@ -1342,10 +1349,13 @@ restore_typeahead(tp)
-     {
-       free_typebuf();
-       typebuf = tp->save_typebuf;
-     }
+@@ -1041,23 +1047,23 @@ void workshop_set_option_first(char *nam
+               workshop_set_option(name, value);
+       }
+ }
  
-+    old_char = tp->old_char;
-+    old_mod_mask = tp->old_mod_mask;
-+
-     free_buff(&stuffbuff);
-     stuffbuff = tp->save_stuffbuff;
- # ifdef USE_INPUT_BUF
-     set_input_buf(tp->save_inputbuf);
- # endif
-@@ -1497,21 +1507,18 @@ updatescript(c)
- }
- #define KL_PART_KEY -1                /* keylen value for incomplete key-code */
- #define KL_PART_MAP -2                /* keylen value for incomplete mapping */
  
--static int old_char = -1;     /* character put back by vungetc() */
--static int old_mod_mask;      /* mod_mask for ungotten character */
 -
++#if 0
  /*
-  * Get the next input character.
-  * Can return a special key or a multi-byte character.
-  * Can return NUL when called recursively, use safe_vgetc() if that's not
-  * wanted.
-  * This translates escaped K_SPECIAL and CSI bytes to a K_SPECIAL or CSI byte.
-  * Collects the bytes of a multibyte character into the whole character.
-- * Returns the modifers in the global "mod_mask".
-+ * Returns the modifiers in the global "mod_mask".
+  * Send information to eserve on certain editor events
+  * You must make sure these are called when necessary
   */
-     int
- vgetc()
+-
+ void workshop_file_closed(char *filename)
  {
-     int               c, c2;
-@@ -2380,10 +2387,21 @@ vgetorpeek(advance)
-                   }
-                   /* complete match */
-                   if (keylen >= 0 && keylen <= typebuf.tb_len)
-                   {
-+#ifdef FEAT_EVAL
-+                      int save_m_expr;
-+                      int save_m_noremap;
-+                      int save_m_silent;
-+                      char_u *save_m_keys;
-+                      char_u *save_m_str;
-+#else
-+# define save_m_noremap mp->m_noremap
-+# define save_m_silent mp->m_silent
+       char buffer[2*MAXPATHLEN];
+       vim_snprintf(buffer, sizeof(buffer),
+                       NOCATGETS("deletedFile %s\n"), filename);
+       write(sd, buffer, strlen(buffer));
+ }
 +#endif
-+
-                       /* write chars to script file(s) */
-                       if (keylen > typebuf.tb_maplen)
-                           gotchars(typebuf.tb_buf + typebuf.tb_off
-                                                         + typebuf.tb_maplen,
-                                                 keylen - typebuf.tb_maplen);
-@@ -2422,10 +2440,20 @@ vgetorpeek(advance)
-                                                             0, TRUE, FALSE);
-                       }
- #endif
- #ifdef FEAT_EVAL
-+                      /* Copy the values from *mp that are used, because
-+                       * evaluating the expression may invoke a function
-+                       * that redefines the mapping, thereby making *mp
-+                       * invalid. */
-+                      save_m_expr = mp->m_expr;
-+                      save_m_noremap = mp->m_noremap;
-+                      save_m_silent = mp->m_silent;
-+                      save_m_keys = NULL;  /* only saved when needed */
-+                      save_m_str = NULL;  /* only saved when needed */
-+
-                       /*
-                        * Handle ":map <expr>": evaluate the {rhs} as an
-                        * expression.  Save and restore the typeahead so that
-                        * getchar() can be used.  Also save and restore the
-                        * command line for "normal :".
-@@ -2437,11 +2465,13 @@ vgetorpeek(advance)
  
-                           save_typeahead(&tabuf);
-                           if (tabuf.typebuf_valid)
-                           {
-                               vgetc_busy = 0;
--                              s = eval_map_expr(mp->m_str);
-+                              save_m_keys = vim_strsave(mp->m_keys);
-+                              save_m_str = vim_strsave(mp->m_str);
-+                              s = eval_map_expr(save_m_str, NUL);
-                               vgetc_busy = save_vgetc_busy;
-                           }
-                           else
-                               s = NULL;
-                           restore_typeahead(&tabuf);
-@@ -2460,22 +2490,37 @@ vgetorpeek(advance)
-                        */
-                       if (s == NULL)
-                           i = FAIL;
-                       else
-                       {
--                          i = ins_typebuf(s,
--                                  mp->m_noremap != REMAP_YES
--                                          ? mp->m_noremap
--                                          : STRNCMP(s, mp->m_keys,
--                                                        (size_t)keylen) != 0
--                                                   ? REMAP_YES : REMAP_SKIP,
--                              0, TRUE, cmd_silent || mp->m_silent);
-+                          int noremap;
-+
-+                          if (save_m_noremap != REMAP_YES)
-+                              noremap = save_m_noremap;
-+                          else if (
-+#ifdef FEAT_EVAL
-+                              STRNCMP(s, save_m_keys != NULL
-+                                                 ? save_m_keys : mp->m_keys,
-+                                                       (size_t)keylen)
-+#else
-+                              STRNCMP(s, mp->m_keys, (size_t)keylen)
-+#endif
-+                                 != 0)
-+                              noremap = REMAP_YES;
-+                          else
-+                              noremap = REMAP_SKIP;
-+                          i = ins_typebuf(s, noremap,
-+                                      0, TRUE, cmd_silent || save_m_silent);
- #ifdef FEAT_EVAL
--                          if (mp->m_expr)
-+                          if (save_m_expr)
-                               vim_free(s);
- #endif
-                       }
-+#ifdef FEAT_EVAL
-+                      vim_free(save_m_keys);
-+                      vim_free(save_m_str);
-+#endif
-                       if (i == FAIL)
-                       {
-                           c = -1;
-                           break;
-                       }
-@@ -3311,11 +3356,11 @@ do_map(maptype, arg, mode, abbrev)
-                       if (vim_iswordc(keys[n]) != vim_iswordc(keys[len - 2]))
-                       {
-                           retval = 1;
-                           goto theend;
-                       }
--          /* An abbrevation cannot contain white space. */
-+          /* An abbreviation cannot contain white space. */
-           for (n = 0; n < len; ++n)
-               if (vim_iswhite(keys[n]))
-               {
-                   retval = 1;
-                   goto theend;
-@@ -3699,15 +3744,14 @@ get_map_mode(cmdp, forceit)
+ void workshop_file_closed_lineno(char *filename, int lineno)
+ {
+       char buffer[2*MAXPATHLEN];
+       vim_snprintf(buffer, sizeof(buffer),
+@@ -1084,25 +1090,27 @@ void workshop_file_saved(char *filename)
+       /* Let editor report any moved marks that the eserve client
+        * should deal with (for example, moving location-based breakpoints) */
+       workshop_moved_marks(filename);
+ }
  
- /*
-  * Clear all mappings or abbreviations.
-  * 'abbr' should be FALSE for mappings, TRUE for abbreviations.
-  */
--/*ARGSUSED*/
-     void
- map_clear(cmdp, arg, forceit, abbr)
-     char_u    *cmdp;
--    char_u    *arg;
-+    char_u    *arg UNUSED;
-     int               forceit;
-     int               abbr;
+-void workshop_move_mark(char *filename, int markId, int newLineno)
++#if 0
++void workshop_file_modified(char *filename)
  {
-     int               mode;
- #ifdef FEAT_LOCALMAP
-@@ -3732,17 +3776,16 @@ map_clear(cmdp, arg, forceit, abbr)
+       char buffer[2*MAXPATHLEN];
+       vim_snprintf(buffer, sizeof(buffer),
+-                      NOCATGETS("moveMark %s %d %d\n"), filename, markId, newLineno);
++                      NOCATGETS("modifiedFile %s\n"), filename);
+       write(sd, buffer, strlen(buffer));
  }
  
- /*
-  * Clear all mappings in "mode".
-  */
--/*ARGSUSED*/
-     void
- map_clear_int(buf, mode, local, abbr)
--    buf_T     *buf;       /* buffer for local mappings */
--    int               mode;       /* mode in which to delete */
--    int               local;      /* TRUE for buffer-local mappings */
--    int               abbr;       /* TRUE for abbreviations */
-+    buf_T     *buf UNUSED;    /* buffer for local mappings */
-+    int               mode;           /* mode in which to delete */
-+    int               local UNUSED;   /* TRUE for buffer-local mappings */
-+    int               abbr;           /* TRUE for abbreviations */
+-void workshop_file_modified(char *filename)
++void workshop_move_mark(char *filename, int markId, int newLineno)
  {
-     mapblock_T        *mp, **mpp;
-     int               hash;
-     int               new_hash;
+       char buffer[2*MAXPATHLEN];
+       vim_snprintf(buffer, sizeof(buffer),
+-                      NOCATGETS("modifiedFile %s\n"), filename);
++             NOCATGETS("moveMark %s %d %d\n"), filename, markId, newLineno);
+       write(sd, buffer, strlen(buffer));
+ }
++#endif
  
-@@ -3814,11 +3857,15 @@ showmap(mp, local)
-     int               local;      /* TRUE for buffer-local map */
+ void workshop_frame_moved(int new_x, int new_y, int new_w, int new_h)
  {
-     int len = 1;
+       char buffer[200];
  
-     if (msg_didout || msg_silent != 0)
-+    {
-       msg_putchar('\n');
-+      if (got_int)        /* 'q' typed at MORE prompt */
-+          return;
-+    }
-     if ((mp->m_mode & (INSERT + CMDLINE)) == INSERT + CMDLINE)
-       msg_putchar('!');                       /* :map! */
-     else if (mp->m_mode & INSERT)
-       msg_putchar('i');                       /* :imap */
-     else if (mp->m_mode & LANGMAP)
-@@ -4261,11 +4308,11 @@ check_abbr(c, ptr, col, mincol)
-       /* no remapping implies no abbreviation */
-       return FALSE;
+@@ -1177,14 +1185,16 @@ void workshop_perform_verb(char *verb, v
+               }
+       }
+ }
  
-     /*
-      * Check for word before the cursor: If it ends in a keyword char all
--     * chars before it must be al keyword chars or non-keyword chars, but not
-+     * chars before it must be keyword chars or non-keyword chars, but not
-      * white space. If it ends in a non-keyword char we accept any characters
-      * before it except white space.
-      */
-     if (col == 0)                             /* cannot be an abbr. */
-       return FALSE;
-@@ -4356,13 +4403,13 @@ check_abbr(c, ptr, col, mincol)
-            *
-            * Character CTRL-] is treated specially - it completes the
-            * abbreviation, but is not inserted into the input stream.
-            */
-           j = 0;
--                                      /* special key code, split up */
-           if (c != Ctrl_RSB)
-           {
-+                                      /* special key code, split up */
-               if (IS_SPECIAL(c) || c == K_SPECIAL)
-               {
-                   tb[j++] = K_SPECIAL;
-                   tb[j++] = K_SECOND(c);
-                   tb[j++] = K_THIRD(c);
-@@ -4387,11 +4434,11 @@ check_abbr(c, ptr, col, mincol)
-                                       /* insert the last typed char */
-               (void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent);
-           }
- #ifdef FEAT_EVAL
-           if (mp->m_expr)
--              s = eval_map_expr(mp->m_str);
-+              s = eval_map_expr(mp->m_str, c);
-           else
- #endif
-               s = mp->m_str;
-           if (s != NULL)
-           {
-@@ -4423,12 +4470,13 @@ check_abbr(c, ptr, col, mincol)
- /*
-  * Evaluate the RHS of a mapping or abbreviations and take care of escaping
-  * special characters.
-  */
-     static char_u *
--eval_map_expr(str)
-+eval_map_expr(str, c)
-     char_u    *str;
-+    int               c;          /* NUL or typed character for abbreviation */
+ /* Send a message to eserve */
++#if defined(NOHANDS_SUPPORT_FUNCTIONS) || defined(FEAT_BEVAL)
+ void workshop_send_message(char *buf)
  {
-     char_u    *res;
-     char_u    *p;
-     char_u    *save_cmd;
-     pos_T     save_cursor;
-@@ -4441,10 +4489,11 @@ eval_map_expr(str)
-      * effects.  Also restore the cursor position. */
-     ++textlock;
- #ifdef FEAT_EX_EXTRA
-     ++ex_normal_lock;
- #endif
-+    set_vim_var_char(c);  /* set v:char to the typed character */
-     save_cursor = curwin->w_cursor;
-     p = eval_to_string(str, NULL, FALSE);
-     --textlock;
- #ifdef FEAT_EX_EXTRA
-     --ex_normal_lock;
-@@ -4700,11 +4749,11 @@ makemap(fd, buf)
-                   }
-                   if (c1 && putc(c1, fd) < 0)
-                       return FAIL;
-                   if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0)
-                       return FAIL;
--                  if (fprintf(fd, cmd) < 0)
-+                  if (fputs(cmd, fd) < 0)
-                       return FAIL;
-                   if (buf != NULL && fputs(" <buffer>", fd) < 0)
-                       return FAIL;
-                   if (mp->m_silent && fputs(" <silent>", fd) < 0)
-                       return FAIL;
-@@ -4799,11 +4848,11 @@ put_escstr(fd, strstart, what)
-               c = TO_SPECIAL(str[1], str[2]);
-               str += 2;
-           }
-           if (IS_SPECIAL(c) || modifiers)     /* special key */
-           {
--              if (fprintf(fd, (char *)get_special_key_name(c, modifiers)) < 0)
-+              if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0)
-                   return FAIL;
-               continue;
-           }
-       }
+       write(sd, buf, strlen(buf));
+ }
++#endif
  
---- vim72.orig/src/diff.c
-+++ vim72/src/diff.c
-@@ -6,11 +6,11 @@
-  * Do ":help credits" in Vim to see a list of people who contributed.
-  * See README.txt for an overview of the Vim source code.
+ /* Some methods, like currentFile, cursorPos, etc. are missing here.
+  * But it looks like these are used for NoHands testing only so we
+  * won't bother requiring editors to implement these
   */
+--- vim72.orig/src/macros.h
++++ vim72/src/macros.h
+@@ -125,19 +125,35 @@
+ #define CHARSIZE(c)   (chartab[c] & CT_CELL_MASK)
  
+ #ifdef FEAT_LANGMAP
  /*
-- * diff.c: code for diff'ing two or three buffers.
-+ * diff.c: code for diff'ing two, three or four buffers.
+  * Adjust chars in a language according to 'langmap' option.
+- * NOTE that there is NO overhead if 'langmap' is not set; but even
+- * when set we only have to do 2 ifs and an array lookup.
++ * NOTE that there is no noticeable overhead if 'langmap' is not set.
++ * When set the overhead for characters < 256 is small.
+  * Don't apply 'langmap' if the character comes from the Stuff buffer.
+  * The do-while is just to ignore a ';' after the macro.
   */
+-# define LANGMAP_ADJUST(c, condition) do { \
+-      if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \
+-          c = langmap_mapchar[c]; \
++# ifdef FEAT_MBYTE
++#  define LANGMAP_ADJUST(c, condition) \
++    do { \
++        if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0) \
++      { \
++          if ((c) < 256) \
++              c = langmap_mapchar[c]; \
++          else \
++              c = langmap_adjust_mb(c); \
++      } \
+     } while (0)
++# else
++#  define LANGMAP_ADJUST(c, condition) \
++    do { \
++        if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \
++            c = langmap_mapchar[c]; \
++    } while (0)
++# endif
++#else
++# define LANGMAP_ADJUST(c, condition) /* nop */
+ #endif
  
- #include "vim.h"
+ /*
+  * vim_isbreak() is used very often if 'linebreak' is set, use a macro to make
+  * it work fast.
+@@ -225,11 +241,11 @@
+ # define ZDECODE(c)   update_keys(c ^= decrypt_byte())
  
- #if defined(FEAT_DIFF) || defined(PROTO)
-@@ -71,10 +71,12 @@ diff_buf_delete(buf)
-       i = diff_buf_idx_tp(buf, tp);
-       if (i != DB_COUNT)
-       {
-           tp->tp_diffbuf[i] = NULL;
-           tp->tp_diff_invalid = TRUE;
-+          if (tp == curtab)
-+              diff_redraw(TRUE);
-       }
-     }
- }
+ #endif
  
- /*
-@@ -100,10 +102,11 @@ diff_buf_adjust(win)
-           i = diff_buf_idx(win->w_buffer);
-           if (i != DB_COUNT)
-           {
-               curtab->tp_diffbuf[i] = NULL;
-               curtab->tp_diff_invalid = TRUE;
-+              diff_redraw(TRUE);
-           }
-       }
-     }
-     else
-       diff_buf_add(win->w_buffer);
-@@ -111,11 +114,11 @@ diff_buf_adjust(win)
+ #ifdef STARTUPTIME
+-# define TIME_MSG(s) time_msg(s, NULL)
++# define TIME_MSG(s) { if (time_fd != NULL) time_msg(s, NULL); }
+ #else
+ # define TIME_MSG(s)
+ #endif
  
- /*
-  * Add a buffer to make diffs for.
-  * Call this when a new buffer is being edited in the current window where
-  * 'diff' is set.
-- * Marks the current buffer as being part of the diff and requireing updating.
-+ * Marks the current buffer as being part of the diff and requiring updating.
-  * This must be done before any autocmd, because a command may use info
-  * about the screen contents.
-  */
-     void
- diff_buf_add(buf)
-@@ -129,10 +132,11 @@ diff_buf_add(buf)
-     for (i = 0; i < DB_COUNT; ++i)
-       if (curtab->tp_diffbuf[i] == NULL)
-       {
-           curtab->tp_diffbuf[i] = buf;
-           curtab->tp_diff_invalid = TRUE;
-+          diff_redraw(TRUE);
-           return;
-       }
+ #ifdef FEAT_VREPLACE
+@@ -266,11 +282,11 @@
+ # define mb_ptr_back(s, p)  p -= has_mbyte ? ((*mb_head_off)(s, p - 1) + 1) : 1
+ /* get length of multi-byte char, not including composing chars */
+ # define mb_cptr2len(p)           (enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p))
  
-     EMSGN(_("E96: Can not diff more than %ld buffers"), DB_COUNT);
- }
-@@ -646,23 +650,23 @@ diff_write(buf, fname)
-  * Completely update the diffs for the buffers involved.
-  * This uses the ordinary "diff" command.
-  * The buffers are written to a file, also for unmodified buffers (the file
-  * could have been produced by autocommands, e.g. the netrw plugin).
+ # define MB_COPY_CHAR(f, t) if (has_mbyte) mb_copy_char(&f, &t); else *t++ = *f++
+-# define MB_CHARLEN(p)            (has_mbyte ? mb_charlen(p) : STRLEN(p))
++# define MB_CHARLEN(p)            (has_mbyte ? mb_charlen(p) : (int)STRLEN(p))
+ # define PTR2CHAR(p)      (has_mbyte ? mb_ptr2char(p) : (int)*(p))
+ #else
+ # define mb_ptr_adv(p)                ++p
+ # define mb_cptr_adv(p)               ++p
+ # define mb_ptr_back(s, p)    --p
+--- vim72.orig/src/main.c
++++ vim72/src/main.c
+@@ -128,14 +128,10 @@ static void prepare_server __ARGS((mparm
+ static void cmdsrv_main __ARGS((int *argc, char **argv, char_u *serverName_arg, char_u **serverStr));
+ static char_u *serverMakeName __ARGS((char_u *arg, char *cmd));
+ #endif
+-#ifdef STARTUPTIME
+-static FILE *time_fd = NULL;
+-#endif
+-
+ /*
+  * Different types of error messages.
   */
--/*ARGSUSED*/
-     void
- ex_diffupdate(eap)
--    exarg_T   *eap;       /* can be NULL, it's not used */
-+    exarg_T   *eap UNUSED;        /* can be NULL */
+ static char *(main_errors[]) =
  {
-     buf_T     *buf;
-     int               idx_orig;
-     int               idx_new;
-     char_u    *tmp_orig;
-     char_u    *tmp_new;
-     char_u    *tmp_diff;
-     FILE      *fd;
-     int               ok;
-+    int               io_error = FALSE;
-     /* Delete all diffblocks. */
-     diff_clear(curtab);
-     curtab->tp_diff_invalid = FALSE;
+@@ -171,10 +167,13 @@ main
+     char      **argv;
+ {
+     char_u    *fname = NULL;          /* file name from command line */
+     mparm_T   params;                 /* various parameters passed between
+                                        * main() and other functions. */
++#ifdef STARTUPTIME
++    int               i;
++#endif
  
-@@ -695,22 +699,30 @@ ex_diffupdate(eap)
+     /*
+      * Do any system-specific initialisations.  These can NOT use IObuff or
+      * NameBuff.  Thus emsg2() cannot be called!
       */
-     for (;;)
-     {
-       ok = FALSE;
-       fd = mch_fopen((char *)tmp_orig, "w");
--      if (fd != NULL)
-+      if (fd == NULL)
-+          io_error = TRUE;
-+      else
-       {
--          fwrite("line1\n", (size_t)6, (size_t)1, fd);
-+          if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1)
-+              io_error = TRUE;
-           fclose(fd);
-           fd = mch_fopen((char *)tmp_new, "w");
--          if (fd != NULL)
-+          if (fd == NULL)
-+              io_error = TRUE;
-+          else
-           {
--              fwrite("line2\n", (size_t)6, (size_t)1, fd);
-+              if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1)
-+                  io_error = TRUE;
-               fclose(fd);
-               diff_file(tmp_orig, tmp_new, tmp_diff);
-               fd = mch_fopen((char *)tmp_diff, "r");
--              if (fd != NULL)
-+              if (fd == NULL)
-+                  io_error = TRUE;
-+              else
-               {
-                   char_u      linebuf[LBUFLEN];
-                   for (;;)
-                   {
-@@ -759,10 +771,12 @@ ex_diffupdate(eap)
-       if (ok)
-           break;
-     }
-     if (!ok)
-     {
-+      if (io_error)
-+          EMSG(_("E810: Cannot read or write temp files"));
-       EMSG(_("E97: Cannot create diffs"));
-       diff_a_works = MAYBE;
- #if defined(MSWIN) || defined(MSDOS)
-       diff_bin_works = MAYBE;
+@@ -201,12 +200,19 @@ main
+ #ifdef MEM_PROFILE
+     atexit(vim_mem_profile_dump);
  #endif
-@@ -810,40 +824,42 @@ diff_file(tmp_orig, tmp_new, tmp_diff)
-     char_u    *tmp_orig;
-     char_u    *tmp_new;
-     char_u    *tmp_diff;
- {
-     char_u    *cmd;
-+    size_t    len;
  
- #ifdef FEAT_EVAL
-     if (*p_dex != NUL)
-       /* Use 'diffexpr' to generate the diff file. */
-       eval_diff(tmp_orig, tmp_new, tmp_diff);
-     else
+ #ifdef STARTUPTIME
+-    time_fd = mch_fopen(STARTUPTIME, "a");
+-    TIME_MSG("--- VIM STARTING ---");
++    for (i = 1; i < argc; ++i)
++    {
++      if (STRICMP(argv[i], "--startuptime") == 0 && i + 1 < argc)
++      {
++          time_fd = mch_fopen(argv[i + 1], "a");
++          TIME_MSG("--- VIM STARTING ---");
++          break;
++      }
++    }
  #endif
+     starttime = time(NULL);
+ #ifdef __EMX__
+     _wildcard(&params.argc, &params.argv);
+@@ -358,18 +364,25 @@ main
+ # if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
+     /*
+      * Check if the GUI can be started.  Reset gui.starting if not.
+      * Don't know about other systems, stay on the safe side and don't check.
+      */
+-    if (gui.starting && gui_init_check() == FAIL)
++    if (gui.starting)
      {
--      cmd = alloc((unsigned)(STRLEN(tmp_orig) + STRLEN(tmp_new)
--                              + STRLEN(tmp_diff) + STRLEN(p_srr) + 27));
-+      len = STRLEN(tmp_orig) + STRLEN(tmp_new)
-+                                    + STRLEN(tmp_diff) + STRLEN(p_srr) + 27;
-+      cmd = alloc((unsigned)len);
-       if (cmd != NULL)
-       {
-           /* We don't want $DIFF_OPTIONS to get in the way. */
-           if (getenv("DIFF_OPTIONS"))
-               vim_setenv((char_u *)"DIFF_OPTIONS", (char_u *)"");
+-      gui.starting = FALSE;
++      if (gui_init_check() == FAIL)
++      {
++          gui.starting = FALSE;
  
-           /* Build the diff command and execute it.  Always use -a, binary
-            * differences are of no use.  Ignore errors, diff returns
-            * non-zero when differences have been found. */
--          sprintf((char *)cmd, "diff %s%s%s%s%s %s",
-+          vim_snprintf((char *)cmd, len, "diff %s%s%s%s%s %s",
-                   diff_a_works == FALSE ? "" : "-a ",
- #if defined(MSWIN) || defined(MSDOS)
-                   diff_bin_works == TRUE ? "--binary " : "",
- #else
-                   "",
- #endif
-                   (diff_flags & DIFF_IWHITE) ? "-b " : "",
-                   (diff_flags & DIFF_ICASE) ? "-i " : "",
-                   tmp_orig, tmp_new);
--          append_redir(cmd, p_srr, tmp_diff);
-+          append_redir(cmd, (int)len, p_srr, tmp_diff);
- #ifdef FEAT_AUTOCMD
-           block_autocmds();   /* Avoid ShellCmdPost stuff */
- #endif
-           (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT);
- #ifdef FEAT_AUTOCMD
-@@ -864,20 +880,22 @@ ex_diffpatch(eap)
-     exarg_T   *eap;
- {
-     char_u    *tmp_orig;      /* name of original temp file */
-     char_u    *tmp_new;       /* name of patched temp file */
-     char_u    *buf = NULL;
-+    size_t    buflen;
-     win_T     *old_curwin = curwin;
-     char_u    *newname = NULL;        /* name of patched file buffer */
- #ifdef UNIX
-     char_u    dirbuf[MAXPATHL];
-     char_u    *fullname = NULL;
- #endif
- #ifdef FEAT_BROWSE
-     char_u    *browseFile = NULL;
-     int               browse_flag = cmdmod.browse;
+-      /* When running "evim" or "gvim -y" we need the menus, exit if we
+-       * don't have them. */
+-      if (params.evim_mode)
+-          mch_exit(1);
++          /* When running "evim" or "gvim -y" we need the menus, exit if we
++           * don't have them. */
++          if (params.evim_mode)
++              mch_exit(1);
++      }
++#  if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
++      /* Re-initialize locale, it may have been altered by gui_init_check() */
++      init_locale();
++#  endif
+     }
+ # endif
  #endif
-+    struct stat st;
- #ifdef FEAT_BROWSE
-     if (cmdmod.browse)
-     {
-       browseFile = do_browse(0, (char_u *)_("Patch file"),
-@@ -903,34 +921,35 @@ ex_diffpatch(eap)
  
- #ifdef UNIX
-     /* Get the absolute path of the patchfile, changing directory below. */
-     fullname = FullName_save(eap->arg, FALSE);
+     if (GARGCOUNT > 0)
+@@ -643,15 +656,16 @@ main
+     init_SPAWNO("", SWAP_ANY);
  #endif
--    buf = alloc((unsigned)(STRLEN(tmp_orig) + (
-+    buflen = STRLEN(tmp_orig) + (
- # ifdef UNIX
-                   fullname != NULL ? STRLEN(fullname) :
- # endif
--                  STRLEN(eap->arg)) + STRLEN(tmp_new) + 16));
-+                  STRLEN(eap->arg)) + STRLEN(tmp_new) + 16;
-+    buf = alloc((unsigned)buflen);
-     if (buf == NULL)
-       goto theend;
  
- #ifdef UNIX
--    /* Temporaraly chdir to /tmp, to avoid patching files in the current
-+    /* Temporarily chdir to /tmp, to avoid patching files in the current
-      * directory when the patch file contains more than one patch.  When we
-      * have our own temp dir use that instead, it will be cleaned up when we
-      * exit (any .rej files created).  Don't change directory if we can't
-      * return to the current. */
-     if (mch_dirname(dirbuf, MAXPATHL) != OK || mch_chdir((char *)dirbuf) != 0)
-       dirbuf[0] = NUL;
-     else
+ #ifdef FEAT_VIMINFO
+     /*
+-     * Read in registers, history etc, but not marks, from the viminfo file
++     * Read in registers, history etc, but not marks, from the viminfo file.
++     * This is where v:oldfiles gets filled.
+      */
+     if (*p_viminfo != NUL)
      {
- # ifdef TEMPDIRNAMES
-       if (vim_tempdir != NULL)
--          mch_chdir((char *)vim_tempdir);
-+          ignored = mch_chdir((char *)vim_tempdir);
-       else
- # endif
--          mch_chdir("/tmp");
-+          ignored = mch_chdir("/tmp");
-       shorten_fnames(TRUE);
+-      read_viminfo(NULL, TRUE, FALSE, FALSE);
++      read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES);
+       TIME_MSG("reading viminfo");
      }
  #endif
  
- #ifdef FEAT_EVAL
-@@ -944,11 +963,12 @@ ex_diffpatch(eap)
-     else
- #endif
-     {
-       /* Build the patch command and execute it.  Ignore errors.  Switch to
-        * cooked mode to allow the user to respond to prompts. */
--      sprintf((char *)buf, "patch -o %s %s < \"%s\"", tmp_new, tmp_orig,
-+      vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"",
-+              tmp_new, tmp_orig,
- # ifdef UNIX
-               fullname != NULL ? fullname :
- # endif
-               eap->arg);
- #ifdef FEAT_AUTOCMD
-@@ -978,48 +998,55 @@ ex_diffpatch(eap)
-     mch_remove(buf);
-     STRCPY(buf, tmp_new);
-     STRCAT(buf, ".rej");
-     mch_remove(buf);
+ #ifdef FEAT_QUICKFIX
+@@ -932,12 +946,18 @@ main
  
--    if (curbuf->b_fname != NULL)
-+    /* Only continue if the output file was created. */
-+    if (mch_stat((char *)tmp_new, &st) < 0 || st.st_size == 0)
-+      EMSG(_("E816: Cannot read patch output"));
-+    else
-     {
--      newname = vim_strnsave(curbuf->b_fname,
-+      if (curbuf->b_fname != NULL)
-+      {
-+          newname = vim_strnsave(curbuf->b_fname,
-                                         (int)(STRLEN(curbuf->b_fname) + 4));
--      if (newname != NULL)
--          STRCAT(newname, ".new");
--    }
-+          if (newname != NULL)
-+              STRCAT(newname, ".new");
-+      }
+     TIME_MSG("before starting main loop");
+     /*
+      * Call the main command loop.  This never returns.
++     * For embedded MzScheme the main_loop will be called by Scheme
++     * for proper stack tracking
+      */
++#ifndef FEAT_MZSCHEME
+     main_loop(FALSE, FALSE);
++#else
++    mzscheme_main();
++#endif
  
+     return 0;
+ }
+ #endif /* PROTO */
+@@ -1141,10 +1161,22 @@ main_loop(cmdwin, noexmode)
+           setcursor();
+           cursor_on();
+           do_redraw = FALSE;
++
++#ifdef STARTUPTIME
++          /* Now that we have drawn the first screen all the startup stuff
++           * has been done, close any file for startup messages. */
++          if (time_fd != NULL)
++          {
++              TIME_MSG("first screen update");
++              TIME_MSG("--- VIM STARTED ---");
++              fclose(time_fd);
++              time_fd = NULL;
++          }
++#endif
+       }
  #ifdef FEAT_GUI
--    need_mouse_correct = TRUE;
-+      need_mouse_correct = TRUE;
+       if (need_mouse_correct)
+           gui_mouse_correct();
  #endif
--    /* don't use a new tab page, each tab page has its own diffs */
--    cmdmod.tab = 0;
--
--    if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
--    {
--      /* Pretend it was a ":split fname" command */
--      eap->cmdidx = CMD_split;
--      eap->arg = tmp_new;
--      do_exedit(eap, old_curwin);
-+      /* don't use a new tab page, each tab page has its own diffs */
-+      cmdmod.tab = 0;
+@@ -1455,11 +1487,12 @@ parse_command_name(parmp)
+ #endif
+       parmp->evim_mode = TRUE;
+       ++initstr;
+     }
  
--      if (curwin != old_curwin)               /* split must have worked */
-+      if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
-       {
--          /* Set 'diff', 'scrollbind' on and 'wrap' off. */
--          diff_win_options(curwin, TRUE);
--          diff_win_options(old_curwin, TRUE);
-+          /* Pretend it was a ":split fname" command */
-+          eap->cmdidx = CMD_split;
-+          eap->arg = tmp_new;
-+          do_exedit(eap, old_curwin);
+-    if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k')
++    /* "gvim" starts the GUI.  Also accept "Gvim" for MS-Windows. */
++    if (TOLOWER_ASC(initstr[0]) == 'g')
+     {
+       main_start_gui();
+ #ifdef FEAT_GUI
+       ++initstr;
+ #endif
+@@ -1501,16 +1534,16 @@ parse_command_name(parmp)
+  * Get the name of the display, before gui_prepare() removes it from
+  * argv[].  Used for the xterm-clipboard display.
+  *
+  * Also find the --server... arguments and --socketid and --windowid
+  */
+-/*ARGSUSED*/
+     static void
+ early_arg_scan(parmp)
+-    mparm_T   *parmp;
++    mparm_T   *parmp UNUSED;
+ {
+-#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER)
++#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) \
++      || !defined(FEAT_NETBEANS_INTG)
+     int               argc = parmp->argc;
+     char      **argv = parmp->argv;
+     int               i;
  
--          if (newname != NULL)
-+          /* check that split worked and editing tmp_new */
-+          if (curwin != old_curwin && win_valid(old_curwin))
-           {
--              /* do a ":file filename.new" on the patched buffer */
--              eap->arg = newname;
--              ex_file(eap);
-+              /* Set 'diff', 'scrollbind' on and 'wrap' off. */
-+              diff_win_options(curwin, TRUE);
-+              diff_win_options(old_curwin, TRUE);
+     for (i = 1; i < argc; i++)
+@@ -1578,10 +1611,18 @@ early_arg_scan(parmp)
+ # endif
+ # ifdef FEAT_GUI_GTK
+       else if (STRICMP(argv[i], "--echo-wid") == 0)
+           echo_wid_arg = TRUE;
+ # endif
++# ifndef FEAT_NETBEANS_INTG
++      else if (strncmp(argv[i], "-nb", (size_t)3) == 0)
++        {
++            mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n"));
++            mch_exit(2);
++        }
++# endif
 +
-+              if (newname != NULL)
-+              {
-+                  /* do a ":file filename.new" on the patched buffer */
-+                  eap->arg = newname;
-+                  ex_file(eap);
- #ifdef FEAT_AUTOCMD
--              /* Do filetype detection with the new name. */
--              if (au_has_group((char_u *)"filetypedetect"))
--                  do_cmdline_cmd((char_u *)":doau filetypedetect BufRead");
-+                  /* Do filetype detection with the new name. */
-+                  if (au_has_group((char_u *)"filetypedetect"))
-+                      do_cmdline_cmd((char_u *)":doau filetypedetect BufRead");
+     }
  #endif
+ }
+ /*
+@@ -1690,10 +1731,15 @@ command_line_scan(parmp)
+               else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0)
+               {
+                   want_argument = TRUE;
+                   argv_idx += 3;
+               }
++              else if (STRNICMP(argv[0] + argv_idx, "startuptime", 11) == 0)
++              {
++                  want_argument = TRUE;
++                  argv_idx += 11;
 +              }
-           }
-       }
-     }
+ #ifdef FEAT_CLIENTSERVER
+               else if (STRNICMP(argv[0] + argv_idx, "serverlist", 10) == 0)
+                   ; /* already processed -- no arg */
+               else if (STRNICMP(argv[0] + argv_idx, "servername", 10) == 0
+                      || STRNICMP(argv[0] + argv_idx, "serversend", 10) == 0)
+@@ -2021,11 +2067,11 @@ command_line_scan(parmp)
+                */
+               if (argv[0][argv_idx] != NUL)
+                   mainerr(ME_GARBAGE, (char_u *)argv[0]);
  
- theend:
-@@ -1072,14 +1099,13 @@ ex_diffsplit(eap)
+               --argc;
+-              if (argc < 1 && c != 'S')
++              if (argc < 1 && c != 'S')  /* -S has an optional argument */
+                   mainerr_arg_missing((char_u *)argv[0]);
+               ++argv;
+               argv_idx = -1;
+               switch (c)
+@@ -2062,15 +2108,20 @@ command_line_scan(parmp)
+                   else
+                       parmp->commands[parmp->n_commands++] =
+                                                           (char_u *)argv[0];
+                   break;
+-              case '-':       /* "--cmd {command}" execute command */
+-                  if (parmp->n_pre_commands >= MAX_ARG_CMDS)
+-                      mainerr(ME_EXTRA_CMD, NULL);
+-                  parmp->pre_commands[parmp->n_pre_commands++] =
++              case '-':
++                  if (argv[-1][2] == 'c')
++                  {
++                      /* "--cmd {command}" execute command */
++                      if (parmp->n_pre_commands >= MAX_ARG_CMDS)
++                          mainerr(ME_EXTRA_CMD, NULL);
++                      parmp->pre_commands[parmp->n_pre_commands++] =
+                                                           (char_u *)argv[0];
++                  }
++                  /* "--startuptime <file>" already handled */
+                   break;
+           /*  case 'd':   -d {device} is handled in mch_check_win() for the
+            *              Amiga */
+@@ -2359,22 +2410,21 @@ read_stdin()
+      * Close stdin and dup it from stderr.  Required for GPM to work
+      * properly, and for running external commands.
+      * Is there any other system that cannot do this?
+      */
+     close(0);
+-    dup(2);
++    ignored = dup(2);
+ #endif
  }
  
  /*
-  * Set options to show difs for the current window.
+  * Create the requested number of windows and edit buffers in them.
+  * Also does recovery if "recoverymode" set.
   */
 -/*ARGSUSED*/
-     void
ex_diffthis(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+     static void
create_windows(parmp)
+-    mparm_T   *parmp;
++    mparm_T   *parmp UNUSED;
  {
-     /* Set 'diff', 'scrollbind' on and 'wrap' off. */
-     diff_win_options(curwin, TRUE);
- }
+ #ifdef FEAT_WINDOWS
+     int               dorewind;
+     int               done = 0;
  
-@@ -1089,30 +1115,35 @@ ex_diffthis(eap)
-     void
- diff_win_options(wp, addbuf)
-     win_T     *wp;
-     int               addbuf;         /* Add buffer to diff. */
- {
-+# ifdef FEAT_FOLDING
-+    win_T *old_curwin = curwin;
-+
-+    /* close the manually opened folds */
-+    curwin = wp;
-+    newFoldLevel();
-+    curwin = old_curwin;
-+# endif
-+
-     wp->w_p_diff = TRUE;
-     wp->w_p_scb = TRUE;
-     wp->w_p_wrap = FALSE;
- # ifdef FEAT_FOLDING
--    {
--      win_T       *old_curwin = curwin;
--
--      curwin = wp;
--      curbuf = curwin->w_buffer;
--      set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
-+    curwin = wp;
-+    curbuf = curwin->w_buffer;
-+    set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
-                                                      OPT_LOCAL|OPT_FREE, 0);
--      curwin = old_curwin;
--      curbuf = curwin->w_buffer;
--      wp->w_p_fdc = diff_foldcolumn;
--      wp->w_p_fen = TRUE;
--      wp->w_p_fdl = 0;
--      foldUpdateAll(wp);
--      /* make sure topline is not halfway a fold */
--      changed_window_setting_win(wp);
--    }
-+    curwin = old_curwin;
-+    curbuf = curwin->w_buffer;
-+    wp->w_p_fdc = diff_foldcolumn;
-+    wp->w_p_fen = TRUE;
-+    wp->w_p_fdl = 0;
-+    foldUpdateAll(wp);
-+    /* make sure topline is not halfway a fold */
-+    changed_window_setting_win(wp);
+@@ -2584,11 +2634,11 @@ edit_buffers(parmp)
+ # ifdef HAS_SWAP_EXISTS_ACTION
+           swap_exists_did_quit = FALSE;
  # endif
- #ifdef FEAT_SCROLLBIND
-     if (vim_strchr(p_sbo, 'h') == NULL)
-       do_cmdline_cmd((char_u *)"set sbo+=hor");
- #endif
-@@ -1136,11 +1167,11 @@ ex_diffoff(eap)
-     int               diffwin = FALSE;
+           (void)do_ecmd(0, arg_idx < GARGCOUNT
+                         ? alist_name(&GARGLIST[arg_idx]) : NULL,
+-                        NULL, NULL, ECMD_LASTL, ECMD_HIDE);
++                        NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin);
+ # ifdef HAS_SWAP_EXISTS_ACTION
+           if (swap_exists_did_quit)
+           {
+               /* abort or quit selected */
+               if (got_int || only_one_window())
+@@ -3105,10 +3155,13 @@ usage()
+     main_msg(_("--remote-send <keys>\tSend <keys> to a Vim server and exit"));
+     main_msg(_("--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"));
+     main_msg(_("--serverlist\t\tList available Vim server names and exit"));
+     main_msg(_("--servername <name>\tSend to/become the Vim server <name>"));
  #endif
-     for (wp = firstwin; wp != NULL; wp = wp->w_next)
-     {
--      if (wp == curwin || eap->forceit)
-+      if (wp == curwin || (eap->forceit && wp->w_p_diff))
-       {
-           /* Set 'diff', 'scrollbind' off and 'wrap' on. */
-           wp->w_p_diff = FALSE;
-           wp->w_p_scb = FALSE;
-           wp->w_p_wrap = TRUE;
-@@ -2112,10 +2143,12 @@ ex_diffgetput(eap)
-       if (buf == NULL)
-       {
-           EMSG2(_("E102: Can't find buffer \"%s\""), eap->arg);
-           return;
-       }
-+      if (buf == curbuf)
-+          return;             /* nothing to do */
-       idx_other = diff_buf_idx(buf);
-       if (idx_other == DB_COUNT)
-       {
-           EMSG2(_("E103: Buffer \"%s\" is not in diff mode"), eap->arg);
-           return;
---- vim72.orig/src/fold.c
-+++ vim72/src/fold.c
-@@ -46,11 +46,11 @@ typedef struct
- static void newFoldLevelWin __ARGS((win_T *wp));
- static int checkCloseRec __ARGS((garray_T *gap, linenr_T lnum, int level));
- static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp));
- static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum));
- static void checkupdate __ARGS((win_T *wp));
--static void setFoldRepeat __ARGS((linenr_T lnum, long count, int open));
-+static void setFoldRepeat __ARGS((linenr_T lnum, long count, int do_open));
- static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep));
- static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep));
- static void foldOpenNested __ARGS((fold_T *fpr));
- static void deleteFoldEntry __ARGS((garray_T *gap, int idx, int recursive));
- static void foldMarkAdjustRecurse __ARGS((garray_T *gap, linenr_T line1, linenr_T line2, long amount, long amount_after));
-@@ -738,11 +738,11 @@ deleteFold(start, end, recursive, had_vi
-     garray_T  *gap;
-     fold_T    *fp;
-     garray_T  *found_ga;
-     fold_T    *found_fp = NULL;
-     linenr_T  found_off = 0;
--    int               use_level = FALSE;
-+    int               use_level;
-     int               maybe_small = FALSE;
-     int               level = 0;
-     linenr_T  lnum = start;
-     linenr_T  lnum_off;
-     int               did_one = FALSE;
-@@ -755,10 +755,11 @@ deleteFold(start, end, recursive, had_vi
-     {
-       /* Find the deepest fold for "start". */
-       gap = &curwin->w_folds;
-       found_ga = NULL;
-       lnum_off = 0;
-+      use_level = FALSE;
-       for (;;)
-       {
-           if (!foldFind(gap, lnum - lnum_off, &fp))
-               break;
-           /* lnum is inside this fold, remember info */
-@@ -781,24 +782,25 @@ deleteFold(start, end, recursive, had_vi
-           ++lnum;
-       }
-       else
-       {
-           lnum = found_fp->fd_top + found_fp->fd_len + found_off;
--          did_one = TRUE;
-           if (foldmethodIsManual(curwin))
-               deleteFoldEntry(found_ga,
-                   (int)(found_fp - (fold_T *)found_ga->ga_data), recursive);
-           else
-           {
--              if (found_fp->fd_top + found_off < first_lnum)
--                  first_lnum = found_fp->fd_top;
--              if (lnum > last_lnum)
-+              if (first_lnum > found_fp->fd_top + found_off)
-+                  first_lnum = found_fp->fd_top + found_off;
-+              if (last_lnum < lnum)
-                   last_lnum = lnum;
--              parseMarker(curwin);
-+              if (!did_one)
-+                  parseMarker(curwin);
-               deleteFoldMarkers(found_fp, recursive, found_off);
-           }
-+          did_one = TRUE;
-           /* redraw window */
-           changed_window_setting();
-       }
-     }
-@@ -809,10 +811,14 @@ deleteFold(start, end, recursive, had_vi
-       /* Force a redraw to remove the Visual highlighting. */
-       if (had_visual)
-           redraw_curbuf_later(INVERTED);
++#ifdef STARTUPTIME
++    main_msg(_("--startuptime <file>\tWrite startup timing messages to <file>"));
++#endif
+ #ifdef FEAT_VIMINFO
+     main_msg(_("-i <viminfo>\t\tUse <viminfo> instead of .viminfo"));
  #endif
-     }
-+    else
-+      /* Deleting markers may make cursor column invalid. */
-+      check_cursor_col();
-+
-     if (last_lnum > 0)
-       changed_lines(first_lnum, (colnr_T)0, last_lnum, 0L);
- }
+     main_msg(_("-h  or  --help\tPrint Help (this message) and exit"));
+     main_msg(_("--version\t\tPrint version information and exit"));
+@@ -3194,10 +3247,24 @@ check_swap_exists_action()
+ #if defined(STARTUPTIME) || defined(PROTO)
+ static void time_diff __ARGS((struct timeval *then, struct timeval *now));
  
- /* clearFolding() {{{2 */
-@@ -841,11 +847,11 @@ foldUpdate(wp, top, bot)
-     linenr_T  bot;
- {
-     fold_T    *fp;
+ static struct timeval prev_timeval;
  
-     /* Mark all folds from top to bot as maybe-small. */
--    (void)foldFind(&curwin->w_folds, curwin->w_cursor.lnum, &fp);
-+    (void)foldFind(&curwin->w_folds, top, &fp);
-     while (fp < (fold_T *)curwin->w_folds.ga_data + curwin->w_folds.ga_len
-           && fp->fd_top < bot)
-     {
-       fp->fd_small = MAYBE;
-       ++fp;
-@@ -1239,22 +1245,22 @@ checkupdate(wp)
++# ifdef WIN3264
++/*
++ * Windows doesn't have gettimeofday(), although it does have struct timeval.
++ */
++    static int
++gettimeofday(struct timeval *tv, char *dummy)
++{
++    long t = clock();
++    tv->tv_sec = t / CLOCKS_PER_SEC;
++    tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC;
++    return 0;
++}
++# endif
++
  /*
-  * Open or close fold for current window at line "lnum".
-  * Repeat "count" times.
+  * Save the previous time before doing something that could nest.
+  * set "*tv_rel" to the time elapsed so far.
   */
-     static void
--setFoldRepeat(lnum, count, open)
-+setFoldRepeat(lnum, count, do_open)
-     linenr_T  lnum;
-     long      count;
--    int               open;
-+    int               do_open;
- {
-     int               done;
-     long      n;
-     for (n = 0; n < count; ++n)
-     {
-       done = DONE_NOTHING;
--      (void)setManualFold(lnum, open, FALSE, &done);
-+      (void)setManualFold(lnum, do_open, FALSE, &done);
-       if (!(done & DONE_ACTION))
-       {
-           /* Only give an error message when no fold could be opened. */
-           if (n == 0 && !(done & DONE_FOLD))
-               EMSG(_(e_nofold));
-@@ -1599,15 +1605,15 @@ foldMarkAdjustRecurse(gap, line1, line2,
-               else
-                   fp->fd_top += amount;
-           }
-           else
-           {
--              /* 2, 3, or 5: need to correct nested folds too */
--              foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
--                                line2 - fp->fd_top, amount, amount_after);
-               if (fp->fd_top < top)
-               {
-+                  /* 2 or 3: need to correct nested folds too */
-+                  foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
-+                                line2 - fp->fd_top, amount, amount_after);
-                   if (last <= line2)
-                   {
-                       /* 2. fold contains line1, line2 is below fold */
-                       if (amount == MAXLNUM)
-                           fp->fd_len = line1 - fp->fd_top;
-@@ -1620,11 +1626,15 @@ foldMarkAdjustRecurse(gap, line1, line2,
-                       fp->fd_len += amount_after;
-                   }
-               }
-               else
-               {
--                  /* 5. fold is below line1 and contains line2 */
-+                  /* 5. fold is below line1 and contains line2; need to
-+                   * correct nested folds too */
-+                  foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
-+                                line2 - fp->fd_top, amount,
-+                                amount_after + (fp->fd_top - top));
-                   if (amount == MAXLNUM)
-                   {
-                       fp->fd_len -= line2 - fp->fd_top + 1;
-                       fp->fd_top = line1;
-                   }
-@@ -1920,11 +1930,11 @@ get_foldtext(wp, lnum, lnume, foldinfo,
-     char_u    *text = NULL;
+     void
+@@ -3282,24 +3349,10 @@ time_msg(msg, tv_start)
+       prev_timeval = now;
+       fprintf(time_fd, ": %s\n", msg);
+     }
+ }
  
- #ifdef FEAT_EVAL
-     if (*wp->w_p_fdt != NUL)
-     {
--      char_u  dashes[51];
-+      char_u  dashes[MAX_LEVEL + 2];
-       win_T   *save_curwin;
-       int     level;
-       char_u  *p;
+-# ifdef WIN3264
+-/*
+- * Windows doesn't have gettimeofday(), although it does have struct timeval.
+- */
+-    int
+-gettimeofday(struct timeval *tv, char *dummy)
+-{
+-    long t = clock();
+-    tv->tv_sec = t / CLOCKS_PER_SEC;
+-    tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC;
+-    return 0;
+-}
+-# endif
+-
+ #endif
  
-       /* Set "v:foldstart" and "v:foldend". */
-@@ -1932,12 +1942,12 @@ get_foldtext(wp, lnum, lnume, foldinfo,
-       set_vim_var_nr(VV_FOLDEND, lnume);
+ #if defined(FEAT_CLIENTSERVER) || defined(PROTO)
  
-       /* Set "v:folddashes" to a string of "level" dashes. */
-       /* Set "v:foldlevel" to "level". */
-       level = foldinfo->fi_level;
--      if (level > 50)
--          level = 50;
-+      if (level > (int)sizeof(dashes) - 1)
-+          level = (int)sizeof(dashes) - 1;
-       vim_memset(dashes, '-', (size_t)level);
-       dashes[level] = NUL;
-       set_vim_var_string(VV_FOLDDASHES, dashes, -1);
-       set_vim_var_nr(VV_FOLDLEVEL, (long)level);
-       save_curwin = curwin;
-@@ -2244,10 +2254,44 @@ foldUpdateIEMS(wp, top, bot)
-           if (fline.lvl >= 0)
-               break;
+ /*
+@@ -3637,11 +3690,11 @@ cmdsrv_main(argc, argv, serverName_arg,
+           if (called_emsg)
+               mch_errmsg("\n");
        }
-     }
-+    /*
-+     * If folding is defined by the syntax, it is possible that a change in
-+     * one line will cause all sub-folds of the current fold to change (e.g.,
-+     * closing a C-style comment can cause folds in the subsequent lines to
-+     * appear). To take that into account we should adjust the value of "bot"
-+     * to point to the end of the current fold:
-+     */
-+    if (foldlevelSyntax == getlevel)
-+    {
-+      garray_T *gap = &wp->w_folds;
-+      fold_T   *fp = NULL;
-+      int       current_fdl = 0;
-+      linenr_T  fold_start_lnum = 0;
-+      linenr_T  lnum_rel = fline.lnum;
-+
-+      while (current_fdl < fline.lvl)
-+      {
-+          if (!foldFind(gap, lnum_rel, &fp))
-+              break;
-+          ++current_fdl;
-+
-+          fold_start_lnum += fp->fd_top;
-+          gap = &fp->fd_nested;
-+          lnum_rel -= fp->fd_top;
-+      }
-+      if (fp != NULL && current_fdl == fline.lvl)
-+      {
-+          linenr_T fold_end_lnum = fold_start_lnum + fp->fd_len;
-+
-+          if (fold_end_lnum > bot)
-+              bot = fold_end_lnum;
-+      }
-+    }
-+
-     start = fline.lnum;
-     end = bot;
-     /* Do at least one line. */
-     if (start > end && end < wp->w_buffer->b_ml.ml_line_count)
-       end = start;
-@@ -2805,10 +2849,12 @@ foldSplit(gap, i, top, bot)
-       return;
-     fp = (fold_T *)gap->ga_data + i;
-     fp[1].fd_top = bot + 1;
-     fp[1].fd_len = fp->fd_len - (fp[1].fd_top - fp->fd_top);
-     fp[1].fd_flags = fp->fd_flags;
-+    fp[1].fd_small = MAYBE;
-+    fp->fd_small = MAYBE;
-     /* Move nested folds below bot to new fold.  There can't be
-      * any between top and bot, they have been removed by the caller. */
-     gap1 = &fp->fd_nested;
-     gap2 = &fp[1].fd_nested;
-@@ -3191,12 +3237,12 @@ foldlevelMarker(flp)
-               if (n > 0)
-               {
-                   flp->lvl = n;
-                   flp->lvl_next = n - 1;
-                   /* never start a fold with an end marker */
--                  if (flp->lvl_next > flp->lvl)
--                      flp->lvl_next = flp->lvl;
-+                  if (flp->lvl_next > start_lvl)
-+                      flp->lvl_next = start_lvl;
-               }
-           }
-           else
-               --flp->lvl_next;
+       else if (STRICMP(argv[i], "--servername") == 0)
+       {
+-          /* Alredy processed. Take it out of the command line */
++          /* Already processed. Take it out of the command line */
+           i++;
+           continue;
        }
---- vim72.orig/src/gui.c
-+++ vim72/src/gui.c
-@@ -137,11 +137,11 @@ gui_start()
-           else
-           {
-               /* The read returns when the child closes the pipe (or when
-                * the child dies for some reason). */
-               close(pipefd[1]);
--              (void)read(pipefd[0], &dummy, (size_t)1);
-+              ignored = (int)read(pipefd[0], &dummy, (size_t)1);
-               close(pipefd[0]);
-           }
-           /* When swapping screens we may need to go to the next line, e.g.,
-            * after a hit-enter prompt and using ":gui". */
-@@ -676,15 +676,14 @@ gui_shell_closed()
-  * font.
-  * If "fontset" is TRUE, the "font_list" is used as one name for the fontset.
-  * Return OK when able to set the font.  When it failed FAIL is returned and
-  * the fonts are unchanged.
+       else
+       {
+@@ -3838,14 +3891,13 @@ eval_client_expr_to_string(expr)
+ /*
+  * If conversion is needed, convert "data" from "client_enc" to 'encoding' and
+  * return an allocated string.  Otherwise return "data".
+  * "*tofree" is set to the result when it needs to be freed later.
   */
 -/*ARGSUSED*/
-     int
- gui_init_font(font_list, fontset)
-     char_u    *font_list;
--    int               fontset;
-+    int               fontset UNUSED;
+     char_u *
+ serverConvert(client_enc, data, tofree)
+-    char_u *client_enc;
++    char_u *client_enc UNUSED;
+     char_u *data;
+     char_u **tofree;
  {
- #define FONTLEN 320
-     char_u    font_name[FONTLEN];
-     int               font_list_empty = FALSE;
-     int               ret = FAIL;
-@@ -958,11 +957,11 @@ gui_update_cursor(force, clear_selection
-           {
-               static int iid;
-               guicolor_T fg, bg;
+     char_u    *res = data;
  
-               if (
--# ifdef HAVE_GTK2
-+# if defined(HAVE_GTK2) && !defined(FEAT_HANGULIN)
-                       preedit_get_status()
- # else
-                       im_get_status()
- # endif
-                       )
-@@ -1136,14 +1135,13 @@ gui_position_menu()
+--- vim72.orig/src/mark.c
++++ vim72/src/mark.c
+@@ -882,14 +882,13 @@ ex_delmarks(eap)
  
+ #if defined(FEAT_JUMPLIST) || defined(PROTO)
  /*
-  * Position the various GUI components (text area, menu).  The vertical
-  * scrollbars are NOT handled here.  See gui_update_scrollbars().
+  * print the jumplist
   */
 -/*ARGSUSED*/
-     static void
gui_position_components(total_width)
--    int           total_width;
-+    int           total_width UNUSED;
+     void
ex_jumps(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
-     int           text_area_x;
-     int           text_area_y;
-     int           text_area_width;
-     int           text_area_height;
-@@ -1372,14 +1370,13 @@ gui_get_shellsize()
+     int               i;
+     char_u    *name;
+     cleanup_jumplist();
+@@ -931,14 +930,13 @@ ex_jumps(eap)
+ }
  /*
-  * Set the size of the Vim shell according to Rows and Columns.
-  * If "fit_to_display" is TRUE then the size may be reduced to fit the window
-  * on the screen.
+  * print the changelist
   */
 -/*ARGSUSED*/
      void
- gui_set_shellsize(mustset, fit_to_display, direction)
--    int               mustset;                /* set by the user */
-+    int               mustset UNUSED;         /* set by the user */
-     int               fit_to_display;
-     int               direction;              /* RESIZE_HOR, RESIZE_VER */
+ ex_changes(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
-     int               base_width;
-     int               base_height;
-@@ -1387,10 +1384,15 @@ gui_set_shellsize(mustset, fit_to_displa
-     int               height;
-     int               min_width;
-     int               min_height;
-     int               screen_w;
-     int               screen_h;
-+#ifdef HAVE_GTK2
-+    int               un_maximize = mustset;
-+    int         did_adjust = 0;
+     int               i;
+     char_u    *name;
+     /* Highlight title */
+@@ -1021,10 +1019,13 @@ mark_adjust(line1, line2, amount, amount
+ {
+     int               i;
+     int               fnum = curbuf->b_fnum;
+     linenr_T  *lp;
+     win_T     *win;
++#ifdef FEAT_WINDOWS
++    tabpage_T *tab;
 +#endif
-+    int               x = -1, y = -1;
  
-     if (!gui.shell_created)
+     if (line2 < line1 && amount_after == 0L)      /* nothing to do */
        return;
  
- #ifdef MSWIN
-@@ -1403,10 +1405,14 @@ gui_set_shellsize(mustset, fit_to_displa
-     }
+     if (!cmdmod.lockmarks)
+@@ -1062,11 +1063,11 @@ mark_adjust(line1, line2, amount, amount
+ #ifdef FEAT_QUICKFIX
+       /* quickfix marks */
+       qf_mark_adjust(NULL, line1, line2, amount, amount_after);
+       /* location lists */
+-      FOR_ALL_WINDOWS(win)
++      FOR_ALL_TAB_WINDOWS(tab, win)
+           qf_mark_adjust(win, line1, line2, amount, amount_after);
  #endif
  
-     base_width = gui_get_base_width();
-     base_height = gui_get_base_height();
-+    if (fit_to_display)
-+      /* Remember the original window position. */
-+      gui_mch_get_winpos(&x, &y);
-+
- #ifdef USE_SUN_WORKSHOP
-     if (!mustset && usingSunWorkShop
-                               && workshop_get_width_height(&width, &height))
-     {
-       Columns = (width - base_width + gui.char_width - 1) / gui.char_width;
-@@ -1426,34 +1432,60 @@ gui_set_shellsize(mustset, fit_to_displa
-       {
-           Columns = (screen_w - base_width) / gui.char_width;
-           if (Columns < MIN_COLUMNS)
-               Columns = MIN_COLUMNS;
-           width = Columns * gui.char_width + base_width;
-+#ifdef HAVE_GTK2
-+          ++did_adjust;
-+#endif
-       }
-       if ((direction & RESIZE_VERT) && height > screen_h)
-       {
-           Rows = (screen_h - base_height) / gui.char_height;
-           check_shellsize();
-           height = Rows * gui.char_height + base_height;
-+#ifdef HAVE_GTK2
-+          ++did_adjust;
-+#endif
-       }
-+#ifdef HAVE_GTK2
-+      if (did_adjust == 2 || (width + gui.char_width >= screen_w
-+                                   && height + gui.char_height >= screen_h))
-+          /* don't unmaximize if at maximum size */
-+          un_maximize = FALSE;
-+#endif
-     }
-     gui.num_cols = Columns;
-     gui.num_rows = Rows;
+ #ifdef FEAT_SIGNS
+       sign_mark_adjust(line1, line2, amount, amount_after);
+@@ -1084,11 +1085,11 @@ mark_adjust(line1, line2, amount, amount
+       one_adjust_nodel(&(saved_cursor.lnum));
  
-     min_width = base_width + MIN_COLUMNS * gui.char_width;
-     min_height = base_height + MIN_LINES * gui.char_height;
--# ifdef FEAT_WINDOWS
-+#ifdef FEAT_WINDOWS
-     min_height += tabline_height() * gui.char_height;
--# endif
-+#endif
-+
-+#ifdef HAVE_GTK2
-+    if (un_maximize)
-+    {
-+      /* If the window size is smaller than the screen unmaximize the
-+       * window, otherwise resizing won't work. */
-+      gui_mch_get_screen_dimensions(&screen_w, &screen_h);
-+      if ((width + gui.char_width < screen_w
-+                                 || height + gui.char_height * 2 < screen_h)
-+              && gui_mch_maximized())
-+          gui_mch_unmaximize();
-+    }
-+#endif
-     gui_mch_set_shellsize(width, height, min_width, min_height,
-                                         base_width, base_height, direction);
--    if (fit_to_display)
--    {
--      int         x, y;
--      /* Some window managers put the Vim window left of/above the screen. */
-+    if (fit_to_display && x >= 0 && y >= 0)
-+    {
-+      /* Some window managers put the Vim window left of/above the screen.
-+       * Only change the position if it wasn't already negative before
-+       * (happens on MS-Windows with a secondary monitor). */
-       gui_mch_update();
-       if (gui_mch_get_winpos(&x, &y) == OK && (x < 0 || y < 0))
-           gui_mch_set_winpos(x < 0 ? 0 : x, y < 0 ? 0 : y);
-     }
+     /*
+      * Adjust items in all windows related to the current buffer.
+      */
+-    FOR_ALL_WINDOWS(win)
++    FOR_ALL_TAB_WINDOWS(tab, win)
+     {
+ #ifdef FEAT_JUMPLIST
+       if (!cmdmod.lockmarks)
+           /* Marks in the jumplist.  When deleting lines, this may create
+            * duplicate marks in the jumplist, they will be removed later. */
+@@ -1625,19 +1626,21 @@ write_one_mark(fp_out, c, pos)
+       fprintf(fp_out, "\t%c\t%ld\t%d\n", c, (long)pos->lnum, (int)pos->col);
+ }
  
-@@ -3118,14 +3150,13 @@ static int     prev_which_scrollbars[3];
  /*
-  * Set which components are present.
-  * If "oldval" is not NULL, "oldval" is the previous value, the new value is
-  * in p_go.
+  * Handle marks in the viminfo file:
+- * fp_out == NULL   read marks for current buffer only
+- * fp_out != NULL   copy marks for buffers not in buffer list
++ * fp_out != NULL: copy marks for buffers not in buffer list
++ * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only
++ * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles
   */
--/*ARGSUSED*/
      void
- gui_init_which_components(oldval)
--    char_u    *oldval;
-+    char_u    *oldval UNUSED;
+-copy_viminfo_marks(virp, fp_out, count, eof)
++copy_viminfo_marks(virp, fp_out, count, eof, flags)
+     vir_T     *virp;
+     FILE      *fp_out;
+     int               count;
+     int               eof;
++    int               flags;
  {
- #ifdef FEAT_MENU
-     static int        prev_menu_is_active = -1;
- #endif
- #ifdef FEAT_TOOLBAR
-@@ -3239,11 +3270,11 @@ gui_init_which_components(oldval)
-           /* We don't want a resize event change "Rows" here, save and
-            * restore it.  Resizing is handled below. */
-           i = Rows;
-           gui_update_tabline();
-           Rows = i;
--          need_set_size = RESIZE_VERT;
-+          need_set_size |= RESIZE_VERT;
-           if (using_tabline)
-               fix_size = TRUE;
-           if (!gui_use_tabline())
-               redraw_tabline = TRUE;    /* may draw non-GUI tab line */
-       }
-@@ -3273,13 +3304,13 @@ gui_init_which_components(oldval)
-                   }
-               }
-               if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
-               {
-                   if (i == SBAR_BOTTOM)
--                      need_set_size = RESIZE_VERT;
-+                      need_set_size |= RESIZE_VERT;
-                   else
--                      need_set_size = RESIZE_HOR;
-+                      need_set_size |= RESIZE_HOR;
-                   if (gui.which_scrollbars[i])
-                       fix_size = TRUE;
-               }
-           }
- #ifdef FEAT_WINDOWS
-@@ -3295,32 +3326,32 @@ gui_init_which_components(oldval)
-            * restore it.  Resizing is handled below. */
-           i = Rows;
-           gui_mch_enable_menu(gui.menu_is_active);
-           Rows = i;
-           prev_menu_is_active = gui.menu_is_active;
--          need_set_size = RESIZE_VERT;
-+          need_set_size |= RESIZE_VERT;
-           if (gui.menu_is_active)
-               fix_size = TRUE;
-       }
- #endif
+     char_u    *line = virp->vir_line;
+     buf_T     *buf;
+     int               num_marked_files;
+     int               load_marks;
+@@ -1645,14 +1648,27 @@ copy_viminfo_marks(virp, fp_out, count,
+     char_u    *str;
+     int               i;
+     char_u    *p;
+     char_u    *name_buf;
+     pos_T     pos;
++#ifdef FEAT_EVAL
++    list_T    *list = NULL;
++#endif
  
- #ifdef FEAT_TOOLBAR
-       if (using_toolbar != prev_toolbar)
-       {
-           gui_mch_show_toolbar(using_toolbar);
-           prev_toolbar = using_toolbar;
--          need_set_size = RESIZE_VERT;
-+          need_set_size |= RESIZE_VERT;
-           if (using_toolbar)
-               fix_size = TRUE;
-       }
- #endif
- #ifdef FEAT_FOOTER
-       if (using_footer != prev_footer)
-       {
-           gui_mch_enable_footer(using_footer);
-           prev_footer = using_footer;
--          need_set_size = RESIZE_VERT;
-+          need_set_size |= RESIZE_VERT;
-           if (using_footer)
-               fix_size = TRUE;
-       }
- #endif
- #if defined(FEAT_MENU) && !defined(WIN16) && !(defined(WIN3264) && !defined(FEAT_TEAROFF))
-@@ -3328,14 +3359,15 @@ gui_init_which_components(oldval)
+     if ((name_buf = alloc(LSIZE)) == NULL)
+       return;
+     *name_buf = NUL;
++
++#ifdef FEAT_EVAL
++    if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT)))
++    {
++      list = list_alloc();
++      if (list != NULL)
++          set_vim_var_list(VV_OLDFILES, list);
++    }
++#endif
++
+     num_marked_files = get_viminfo_parameter('\'');
+     while (!eof && (count < num_marked_files || fp_out == NULL))
+     {
+       if (line[0] != '>')
        {
-           gui_mch_toggle_tearoffs(using_tearoff);
-           prev_tearoff = using_tearoff;
-       }
- #endif
--      if (need_set_size)
-+      if (need_set_size != 0)
+@@ -1679,18 +1695,23 @@ copy_viminfo_marks(virp, fp_out, count,
+           p--;
+       if (*p)
+           p++;
+       *p = NUL;
++#ifdef FEAT_EVAL
++      if (list != NULL)
++          list_append_string(list, str, -1);
++#endif
++
+       /*
+        * If fp_out == NULL, load marks for current buffer.
+        * If fp_out != NULL, copy marks for buffers not in buflist.
+        */
+       load_marks = copy_marks_out = FALSE;
+       if (fp_out == NULL)
        {
- #ifdef FEAT_GUI_GTK
--          long    c = Columns;
-+          long    prev_Columns = Columns;
-+          long    prev_Rows = Rows;
- #endif
-           /* Adjust the size of the window to make the text area keep the
-            * same size and to avoid that part of our window is off-screen
-            * and a scrollbar can't be used, for example. */
-           gui_set_shellsize(FALSE, fix_size, need_set_size);
-@@ -3347,15 +3379,18 @@ gui_init_which_components(oldval)
-            * change Columns and Rows when we don't want it.  Wait for a
-            * character here to avoid this effect.
-            * If you remove this, please test this command for resizing
-            * effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q".
-            * Don't do this while starting up though.
--           * And don't change Rows, it may have be reduced intentionally
--           * when adding menu/toolbar/tabline. */
--          if (!gui.starting)
-+           * Don't change Rows when adding menu/toolbar/tabline.
-+           * Don't change Columns when adding vertical toolbar. */
-+          if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR))
-               (void)char_avail();
--          Columns = c;
-+          if ((need_set_size & RESIZE_VERT) == 0)
-+              Rows = prev_Rows;
-+          if ((need_set_size & RESIZE_HOR) == 0)
-+              Columns = prev_Columns;
- #endif
-       }
- #ifdef FEAT_WINDOWS
-       /* When the console tabline appears or disappears the window positions
-        * change. */
-@@ -3877,10 +3912,25 @@ gui_drag_scrollbar(sb, value, still_drag
+-          if (curbuf->b_ffname != NULL)
++          if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL)
+           {
+               if (*name_buf == NUL)       /* only need to do this once */
+                   home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE);
+               if (fnamecmp(str, name_buf) == 0)
+                   load_marks = TRUE;
+--- vim72.orig/src/mbyte.c
++++ vim72/src/mbyte.c
+@@ -24,11 +24,11 @@
+  *                The cell width on the display needs to be determined from
+  *                the character value.
+  *                Recognizing bytes is easy: 0xxx.xxxx is a single-byte
+  *                char, 10xx.xxxx is a trailing byte, 11xx.xxxx is a leading
+  *                byte of a multi-byte character.
+- *                To make things complicated, up to two composing characters
++ *                To make things complicated, up to six composing characters
+  *                are allowed.  These are drawn on top of the first char.
+  *                For most editing the sequence of bytes with composing
+  *                characters included is considered to be one character.
+  * "enc_unicode"    When 2 use 16-bit Unicode characters (or UTF-16).
+  *                When 4 use 32-but Unicode characters.
+@@ -125,29 +125,50 @@
  
- /*
-  * Scrollbar stuff:
-  */
+ static int enc_canon_search __ARGS((char_u *name));
+ static int dbcs_char2len __ARGS((int c));
+ static int dbcs_char2bytes __ARGS((int c, char_u *buf));
+ static int dbcs_ptr2len __ARGS((char_u *p));
++static int dbcs_ptr2len_len __ARGS((char_u *p, int size));
++static int utf_ptr2cells_len __ARGS((char_u *p, int size));
+ static int dbcs_char2cells __ARGS((int c));
++static int dbcs_ptr2cells_len __ARGS((char_u *p, int size));
+ static int dbcs_ptr2char __ARGS((char_u *p));
  
+-/* Lookup table to quickly get the length in bytes of a UTF-8 character from
+- * the first byte of a UTF-8 string.  Bytes which are illegal when used as the
+- * first byte have a one, because these will be used separately. */
 +/*
-+ * Called when something in the window layout has changed.
++ * Lookup table to quickly get the length in bytes of a UTF-8 character from
++ * the first byte of a UTF-8 string.
++ * Bytes which are illegal when used as the first byte have a 1.
++ * The NUL byte has length 1.
 + */
-+    void
-+gui_may_update_scrollbars()
-+{
-+    if (gui.in_use && starting == 0)
-+    {
-+      out_flush();
-+      gui_init_which_components(NULL);
-+      gui_update_scrollbars(TRUE);
-+    }
-+    need_mouse_correct = TRUE;
-+}
-+
-     void
- gui_update_scrollbars(force)
-     int               force;      /* Force all scrollbars to get updated */
- {
-     win_T     *wp;
-@@ -4405,11 +4455,11 @@ gui_do_horiz_scroll()
+ static char utf8len_tab[256] =
  {
-     /* no wrapping, no scrolling */
-     if (curwin->w_p_wrap)
-       return FALSE;
--    if (curwin->w_leftcol == scrollbar_value)
-+    if ((long_u)curwin->w_leftcol == scrollbar_value)
-       return FALSE;
-     curwin->w_leftcol = (colnr_T)scrollbar_value;
+     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+-    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/
+-    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/
++    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
++    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+     2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1,
+ };
  
-     /* When the line of the cursor is too short, move the cursor to the
-@@ -4418,11 +4468,11 @@ gui_do_horiz_scroll()
-     if (vim_strchr(p_go, GO_HORSCROLL) == NULL
-           && longest_lnum >= curwin->w_topline
-           && longest_lnum < curwin->w_botline
-           && !virtual_active())
+ /*
++ * Like utf8len_tab above, but using a zero for illegal lead bytes.
++ */
++static char utf8len_tab_zero[256] =
++{
++    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
++    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
++    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
++    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
++    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
++    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0,
++};
++
++/*
+  * XIM often causes trouble.  Define XIM_DEBUG to get a log of XIM callbacks
+  * in the "xim.log" file.
+  */
+ /* #define XIM_DEBUG */
+ #ifdef XIM_DEBUG
+@@ -604,35 +625,41 @@ codepage_invalid:
+      * Set the function pointers.
+      */
+     if (enc_utf8)
      {
--      if (scrollbar_value > scroll_line_len(curwin->w_cursor.lnum))
-+      if (scrollbar_value > (long_u)scroll_line_len(curwin->w_cursor.lnum))
-       {
-           curwin->w_cursor.lnum = longest_lnum;
-           curwin->w_cursor.col = 0;
-       }
+       mb_ptr2len = utfc_ptr2len;
++      mb_ptr2len_len = utfc_ptr2len_len;
+       mb_char2len = utf_char2len;
+       mb_char2bytes = utf_char2bytes;
+       mb_ptr2cells = utf_ptr2cells;
++      mb_ptr2cells_len = utf_ptr2cells_len;
+       mb_char2cells = utf_char2cells;
+       mb_off2cells = utf_off2cells;
+       mb_ptr2char = utf_ptr2char;
+       mb_head_off = utf_head_off;
      }
-@@ -4664,15 +4714,14 @@ gui_mouse_correct()
+     else if (enc_dbcs != 0)
+     {
+       mb_ptr2len = dbcs_ptr2len;
++      mb_ptr2len_len = dbcs_ptr2len_len;
+       mb_char2len = dbcs_char2len;
+       mb_char2bytes = dbcs_char2bytes;
+       mb_ptr2cells = dbcs_ptr2cells;
++      mb_ptr2cells_len = dbcs_ptr2cells_len;
+       mb_char2cells = dbcs_char2cells;
+       mb_off2cells = dbcs_off2cells;
+       mb_ptr2char = dbcs_ptr2char;
+       mb_head_off = dbcs_head_off;
+     }
+     else
+     {
+       mb_ptr2len = latin_ptr2len;
++      mb_ptr2len_len = latin_ptr2len_len;
+       mb_char2len = latin_char2len;
+       mb_char2bytes = latin_char2bytes;
+       mb_ptr2cells = latin_ptr2cells;
++      mb_ptr2cells_len = latin_ptr2cells_len;
+       mb_char2cells = latin_char2cells;
+       mb_off2cells = latin_off2cells;
+       mb_ptr2char = latin_ptr2char;
+       mb_head_off = latin_head_off;
+     }
+@@ -715,11 +742,11 @@ codepage_invalid:
+                    * mblen() should return -1 for invalid (means the leading
+                    * multibyte) character.  However there are some platforms
+                    * where mblen() returns 0 for invalid character.
+                    * Therefore, following condition includes 0.
+                    */
+-                  (void)mblen(NULL, 0);       /* First reset the state. */
++                  ignored = mblen(NULL, 0);   /* First reset the state. */
+                   if (mblen(buf, (size_t)1) <= 0)
+                       n = 2;
+                   else
+                       n = 1;
+               }
+@@ -1013,14 +1040,13 @@ dbcs_class(lead, trail)
+ /*
+  * mb_char2len() function pointer.
+  * Return length in bytes of character "c".
+  * Returns 1 for a single-byte character.
+  */
+-/* ARGSUSED */
+     int
+ latin_char2len(c)
+-    int               c;
++    int               c UNUSED;
+ {
+     return 1;
  }
  
+     static int
+@@ -1068,11 +1094,10 @@ dbcs_char2bytes(c, buf)
  /*
-  * Find window where the mouse pointer "y" coordinate is in.
+  * mb_ptr2len() function pointer.
+  * Get byte length of character at "*p" but stop at a NUL.
+  * For UTF-8 this includes following composing characters.
+  * Returns 0 when *p is NUL.
+- *
   */
--/*ARGSUSED*/
-     static win_T *
- xy2win(x, y)
--    int               x;
--    int               y;
-+    int               x UNUSED;
-+    int               y UNUSED;
- {
- #ifdef FEAT_WINDOWS
-     int               row;
-     int               col;
-     win_T     *wp;
-@@ -4988,10 +5037,23 @@ gui_do_findrepl(flags, find_text, repl_t
-     int               i;
-     int               type = (flags & FRD_TYPE_MASK);
+     int
+ latin_ptr2len(p)
      char_u    *p;
-     regmatch_T        regmatch;
-     int               save_did_emsg = did_emsg;
-+    static int  busy = FALSE;
+ {
+@@ -1090,14 +1115,48 @@ dbcs_ptr2len(p)
+     if (len == 2 && p[1] == NUL)
+       len = 1;
+     return len;
+ }
++/*
++ * mb_ptr2len_len() function pointer.
++ * Like mb_ptr2len(), but limit to read "size" bytes.
++ * Returns 0 for an empty string.
++ * Returns 1 for an illegal char or an incomplete byte sequence.
++ */
++    int
++latin_ptr2len_len(p, size)
++    char_u    *p;
++    int               size;
++{
++    if (size < 1 || *p == NUL)
++      return 0;
++    return 1;
++}
 +
-+    /* When the screen is being updated we should not change buffers and
-+     * windows structures, it may cause freed memory to be used.  Also don't
-+     * do this recursively (pressing "Find" quickly several times. */
-+    if (updating_screen || busy)
-+      return FALSE;
++    static int
++dbcs_ptr2len_len(p, size)
++    char_u    *p;
++    int               size;
++{
++    int               len;
 +
-+    /* refuse replace when text cannot be changed */
-+    if ((type == FRD_REPLACE || type == FRD_REPLACEALL) && text_locked())
-+      return FALSE;
++    if (size < 1 || *p == NUL)
++      return 0;
++    if (size == 1)
++      return 1;
++    /* Check that second byte is not missing. */
++    len = MB_BYTE2LEN(*p);
++    if (len == 2 && p[1] == NUL)
++      len = 1;
++    return len;
++}
 +
-+    busy = TRUE;
-     ga_init2(&ga, 1, 100);
-     if (type == FRD_REPLACEALL)
-       ga_concat(&ga, (char_u *)"%s/");
-@@ -5078,10 +5140,11 @@ gui_do_findrepl(flags, find_text, repl_t
-       msg_didout = 0;                 /* overwrite any message */
-       need_wait_return = FALSE;       /* don't wait for return */
-     }
-     vim_free(ga.ga_data);
-+    busy = FALSE;
-     return (ga.ga_len > 0);
- }
- #endif
+ struct interval
+ {
+-    unsigned short first;
+-    unsigned short last;
++    long first;
++    long last;
+ };
+ static int intable __ARGS((struct interval *table, size_t size, int c));
  
-@@ -5118,15 +5181,14 @@ gui_wingoto_xy(x, y)
-  * Process file drop.  Mouse cursor position, key modifiers, name of files
-  * and count of files are given.  Argument "fnames[count]" has full pathnames
-  * of dropped files, they will be freed in this function, and caller can't use
-  * fnames after call this function.
+ /*
+  * Return TRUE if "c" is in "table[size / sizeof(struct interval)]".
+@@ -1139,66 +1198,238 @@ intable(table, size, c)
   */
--/*ARGSUSED*/
-     void
- gui_handle_drop(x, y, modifiers, fnames, count)
--    int               x;
--    int               y;
-+    int               x UNUSED;
-+    int               y UNUSED;
-     int_u     modifiers;
-     char_u    **fnames;
-     int               count;
+     int
+ utf_char2cells(c)
+     int               c;
  {
-     int               i;
---- vim72.orig/src/gui_at_sb.c
-+++ vim72/src/gui_at_sb.c
-@@ -196,14 +196,17 @@ ScrollbarClassRec vim_scrollbarClassRec
-     /* query_geometry */  XtInheritQueryGeometry,
-     /* display_accelerator*/  XtInheritDisplayAccelerator,
-     /* extension      */  NULL
-   },
-   { /* simple fields */
--    /* change_sensitive       */  XtInheritChangeSensitive
-+    /* change_sensitive       */  XtInheritChangeSensitive,
-+#ifndef OLDXAW
-+    /* extension */       NULL
-+#endif
-   },
-   { /* scrollbar fields */
--    /* ignore     */  0
-+    /* empty      */      0
-   }
- };
- WidgetClass vim_scrollbarWidgetClass = (WidgetClass)&vim_scrollbarClassRec;
-@@ -239,11 +242,12 @@ FillArea(sbw, top, bottom, fill, draw_sh
-     int sw, margin, floor;
-     int lx, ly, lw, lh;
-     if (bottom <= 0 || bottom <= top)
-       return;
--    if ((sw = sbw->scrollbar.shadow_width) < 0)
-+    sw = sbw->scrollbar.shadow_width;
-+    if (sw < 0)
-       sw = 0;
-     margin = MARGIN (sbw);
-     floor = sbw->scrollbar.length - margin + 2;
+-    /* sorted list of non-overlapping intervals of East Asian Ambiguous
+-     * characters, generated with:
+-     * "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
+-    static struct interval ambiguous[] = {
+-      {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8},
+-      {0x00AA, 0x00AA}, {0x00AE, 0x00AE}, {0x00B0, 0x00B4},
+-      {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6},
+-      {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1},
+-      {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED},
+-      {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA},
+-      {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101},
+-      {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B},
+-      {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133},
+-      {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144},
+-      {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153},
+-      {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE},
+-      {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4},
+-      {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA},
+-      {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261},
+-      {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB},
+-      {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB},
+-      {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0391, 0x03A1},
+-      {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, {0x03C3, 0x03C9},
+-      {0x0401, 0x0401}, {0x0410, 0x044F}, {0x0451, 0x0451},
+-      {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019},
+-      {0x201C, 0x201D}, {0x2020, 0x2022}, {0x2024, 0x2027},
+-      {0x2030, 0x2030}, {0x2032, 0x2033}, {0x2035, 0x2035},
+-      {0x203B, 0x203B}, {0x203E, 0x203E}, {0x2074, 0x2074},
+-      {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC},
+-      {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109},
+-      {0x2113, 0x2113}, {0x2116, 0x2116}, {0x2121, 0x2122},
+-      {0x2126, 0x2126}, {0x212B, 0x212B}, {0x2153, 0x2154},
+-      {0x215B, 0x215E}, {0x2160, 0x216B}, {0x2170, 0x2179},
+-      {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2},
+-      {0x21D4, 0x21D4}, {0x21E7, 0x21E7}, {0x2200, 0x2200},
+-      {0x2202, 0x2203}, {0x2207, 0x2208}, {0x220B, 0x220B},
+-      {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215},
+-      {0x221A, 0x221A}, {0x221D, 0x2220}, {0x2223, 0x2223},
+-      {0x2225, 0x2225}, {0x2227, 0x222C}, {0x222E, 0x222E},
+-      {0x2234, 0x2237}, {0x223C, 0x223D}, {0x2248, 0x2248},
+-      {0x224C, 0x224C}, {0x2252, 0x2252}, {0x2260, 0x2261},
+-      {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F},
+-      {0x2282, 0x2283}, {0x2286, 0x2287}, {0x2295, 0x2295},
+-      {0x2299, 0x2299}, {0x22A5, 0x22A5}, {0x22BF, 0x22BF},
+-      {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B},
+-      {0x2550, 0x2573}, {0x2580, 0x258F}, {0x2592, 0x2595},
+-      {0x25A0, 0x25A1}, {0x25A3, 0x25A9}, {0x25B2, 0x25B3},
+-      {0x25B6, 0x25B7}, {0x25BC, 0x25BD}, {0x25C0, 0x25C1},
+-      {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1},
+-      {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606},
+-      {0x2609, 0x2609}, {0x260E, 0x260F}, {0x2614, 0x2615},
+-      {0x261C, 0x261C}, {0x261E, 0x261E}, {0x2640, 0x2640},
+-      {0x2642, 0x2642}, {0x2660, 0x2661}, {0x2663, 0x2665},
+-      {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F},
+-      {0x273D, 0x273D}, {0x2776, 0x277F}, {0xE000, 0xF8FF},
+-      {0xFFFD, 0xFFFD}, /* {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD} */
++    /* Sorted list of non-overlapping intervals of East Asian double width
++     * characters, generated with ../runtime/tools/unicode.vim. */
++    static struct interval doublewidth[] =
++    {
++      {0x1100, 0x115f},
++      {0x11a3, 0x11a7},
++      {0x11fa, 0x11ff},
++      {0x2329, 0x232a},
++      {0x2e80, 0x2e99},
++      {0x2e9b, 0x2ef3},
++      {0x2f00, 0x2fd5},
++      {0x2ff0, 0x2ffb},
++      {0x3000, 0x3029},
++      {0x3030, 0x303e},
++      {0x3041, 0x3096},
++      {0x309b, 0x30ff},
++      {0x3105, 0x312d},
++      {0x3131, 0x318e},
++      {0x3190, 0x31b7},
++      {0x31c0, 0x31e3},
++      {0x31f0, 0x321e},
++      {0x3220, 0x3247},
++      {0x3250, 0x32fe},
++      {0x3300, 0x4dbf},
++      {0x4e00, 0xa48c},
++      {0xa490, 0xa4c6},
++      {0xa960, 0xa97c},
++      {0xac00, 0xd7a3},
++      {0xd7b0, 0xd7c6},
++      {0xd7cb, 0xd7fb},
++      {0xf900, 0xfaff},
++      {0xfe10, 0xfe19},
++      {0xfe30, 0xfe52},
++      {0xfe54, 0xfe66},
++      {0xfe68, 0xfe6b},
++      {0xff01, 0xff60},
++      {0xffe0, 0xffe6},
++      {0x1f200, 0x1f200},
++      {0x1f210, 0x1f231},
++      {0x1f240, 0x1f248},
++      {0x20000, 0x2fffd},
++      {0x30000, 0x3fffd}
++    };
++    /* Sorted list of non-overlapping intervals of East Asian Ambiguous
++     * characters, generated with ../runtime/tools/unicode.vim. */
++    static struct interval ambiguous[] =
++    {
++      {0x00a1, 0x00a1},
++      {0x00a4, 0x00a4},
++      {0x00a7, 0x00a8},
++      {0x00aa, 0x00aa},
++      {0x00ad, 0x00ae},
++      {0x00b0, 0x00b4},
++      {0x00b6, 0x00ba},
++      {0x00bc, 0x00bf},
++      {0x00c6, 0x00c6},
++      {0x00d0, 0x00d0},
++      {0x00d7, 0x00d8},
++      {0x00de, 0x00e1},
++      {0x00e6, 0x00e6},
++      {0x00e8, 0x00ea},
++      {0x00ec, 0x00ed},
++      {0x00f0, 0x00f0},
++      {0x00f2, 0x00f3},
++      {0x00f7, 0x00fa},
++      {0x00fc, 0x00fc},
++      {0x00fe, 0x00fe},
++      {0x0101, 0x0101},
++      {0x0111, 0x0111},
++      {0x0113, 0x0113},
++      {0x011b, 0x011b},
++      {0x0126, 0x0127},
++      {0x012b, 0x012b},
++      {0x0131, 0x0133},
++      {0x0138, 0x0138},
++      {0x013f, 0x0142},
++      {0x0144, 0x0144},
++      {0x0148, 0x014b},
++      {0x014d, 0x014d},
++      {0x0152, 0x0153},
++      {0x0166, 0x0167},
++      {0x016b, 0x016b},
++      {0x01ce, 0x01ce},
++      {0x01d0, 0x01d0},
++      {0x01d2, 0x01d2},
++      {0x01d4, 0x01d4},
++      {0x01d6, 0x01d6},
++      {0x01d8, 0x01d8},
++      {0x01da, 0x01da},
++      {0x01dc, 0x01dc},
++      {0x0251, 0x0251},
++      {0x0261, 0x0261},
++      {0x02c4, 0x02c4},
++      {0x02c7, 0x02c7},
++      {0x02c9, 0x02cb},
++      {0x02cd, 0x02cd},
++      {0x02d0, 0x02d0},
++      {0x02d8, 0x02db},
++      {0x02dd, 0x02dd},
++      {0x02df, 0x02df},
++      {0x0391, 0x03a1},
++      {0x03a3, 0x03a9},
++      {0x03b1, 0x03c1},
++      {0x03c3, 0x03c9},
++      {0x0401, 0x0401},
++      {0x0410, 0x044f},
++      {0x0451, 0x0451},
++      {0x2010, 0x2010},
++      {0x2013, 0x2016},
++      {0x2018, 0x2019},
++      {0x201c, 0x201d},
++      {0x2020, 0x2022},
++      {0x2024, 0x2027},
++      {0x2030, 0x2030},
++      {0x2032, 0x2033},
++      {0x2035, 0x2035},
++      {0x203b, 0x203b},
++      {0x203e, 0x203e},
++      {0x2074, 0x2074},
++      {0x207f, 0x207f},
++      {0x2081, 0x2084},
++      {0x20ac, 0x20ac},
++      {0x2103, 0x2103},
++      {0x2105, 0x2105},
++      {0x2109, 0x2109},
++      {0x2113, 0x2113},
++      {0x2116, 0x2116},
++      {0x2121, 0x2122},
++      {0x2126, 0x2126},
++      {0x212b, 0x212b},
++      {0x2153, 0x2154},
++      {0x215b, 0x215e},
++      {0x2160, 0x216b},
++      {0x2170, 0x2179},
++      {0x2189, 0x2189},
++      {0x2190, 0x2199},
++      {0x21b8, 0x21b9},
++      {0x21d2, 0x21d2},
++      {0x21d4, 0x21d4},
++      {0x21e7, 0x21e7},
++      {0x2200, 0x2200},
++      {0x2202, 0x2203},
++      {0x2207, 0x2208},
++      {0x220b, 0x220b},
++      {0x220f, 0x220f},
++      {0x2211, 0x2211},
++      {0x2215, 0x2215},
++      {0x221a, 0x221a},
++      {0x221d, 0x2220},
++      {0x2223, 0x2223},
++      {0x2225, 0x2225},
++      {0x2227, 0x222c},
++      {0x222e, 0x222e},
++      {0x2234, 0x2237},
++      {0x223c, 0x223d},
++      {0x2248, 0x2248},
++      {0x224c, 0x224c},
++      {0x2252, 0x2252},
++      {0x2260, 0x2261},
++      {0x2264, 0x2267},
++      {0x226a, 0x226b},
++      {0x226e, 0x226f},
++      {0x2282, 0x2283},
++      {0x2286, 0x2287},
++      {0x2295, 0x2295},
++      {0x2299, 0x2299},
++      {0x22a5, 0x22a5},
++      {0x22bf, 0x22bf},
++      {0x2312, 0x2312},
++      {0x2460, 0x24e9},
++      {0x24eb, 0x254b},
++      {0x2550, 0x2573},
++      {0x2580, 0x258f},
++      {0x2592, 0x2595},
++      {0x25a0, 0x25a1},
++      {0x25a3, 0x25a9},
++      {0x25b2, 0x25b3},
++      {0x25b6, 0x25b7},
++      {0x25bc, 0x25bd},
++      {0x25c0, 0x25c1},
++      {0x25c6, 0x25c8},
++      {0x25cb, 0x25cb},
++      {0x25ce, 0x25d1},
++      {0x25e2, 0x25e5},
++      {0x25ef, 0x25ef},
++      {0x2605, 0x2606},
++      {0x2609, 0x2609},
++      {0x260e, 0x260f},
++      {0x2614, 0x2615},
++      {0x261c, 0x261c},
++      {0x261e, 0x261e},
++      {0x2640, 0x2640},
++      {0x2642, 0x2642},
++      {0x2660, 0x2661},
++      {0x2663, 0x2665},
++      {0x2667, 0x266a},
++      {0x266c, 0x266d},
++      {0x266f, 0x266f},
++      {0x269e, 0x269f},
++      {0x26be, 0x26bf},
++      {0x26c4, 0x26cd},
++      {0x26cf, 0x26e1},
++      {0x26e3, 0x26e3},
++      {0x26e8, 0x26ff},
++      {0x273d, 0x273d},
++      {0x2757, 0x2757},
++      {0x2776, 0x277f},
++      {0x2b55, 0x2b59},
++      {0x3248, 0x324f},
++      {0xe000, 0xf8ff},
++      {0xfffd, 0xfffd},
++      {0x1f100, 0x1f10a},
++      {0x1f110, 0x1f12d},
++      {0x1f131, 0x1f131},
++      {0x1f13d, 0x1f13d},
++      {0x1f13f, 0x1f13f},
++      {0x1f142, 0x1f142},
++      {0x1f146, 0x1f146},
++      {0x1f14a, 0x1f14e},
++      {0x1f157, 0x1f157},
++      {0x1f15f, 0x1f15f},
++      {0x1f179, 0x1f179},
++      {0x1f17b, 0x1f17c},
++      {0x1f17f, 0x1f17f},
++      {0x1f18a, 0x1f18d},
++      {0x1f190, 0x1f190},
++      {0xf0000, 0xffffd},
++      {0x100000, 0x10fffd}
+     };
  
-     if (sbw->scrollbar.orientation == XtorientHorizontal)
-@@ -514,17 +518,16 @@ SetDimensions(sbw)
-       sbw->scrollbar.length = sbw->core.width;
-       sbw->scrollbar.thickness = sbw->core.height;
+     if (c >= 0x100)
+     {
+ #ifdef USE_WCHAR_FUNCTIONS
+@@ -1213,24 +1444,11 @@ utf_char2cells(c)
+       if (n > 1)
+           return n;
+ #else
+       if (!utf_printable(c))
+           return 6;           /* unprintable, displays <xxxx> */
+-      if (c >= 0x1100
+-          && (c <= 0x115f                     /* Hangul Jamo */
+-              || c == 0x2329
+-              || c == 0x232a
+-              || (c >= 0x2e80 && c <= 0xa4cf
+-                  && c != 0x303f)             /* CJK ... Yi */
+-              || (c >= 0xac00 && c <= 0xd7a3) /* Hangul Syllables */
+-              || (c >= 0xf900 && c <= 0xfaff) /* CJK Compatibility
+-                                                 Ideographs */
+-              || (c >= 0xfe30 && c <= 0xfe6f) /* CJK Compatibility Forms */
+-              || (c >= 0xff00 && c <= 0xff60) /* Fullwidth Forms */
+-              || (c >= 0xffe0 && c <= 0xffe6)
+-              || (c >= 0x20000 && c <= 0x2fffd)
+-              || (c >= 0x30000 && c <= 0x3fffd)))
++      if (intable(doublewidth, sizeof(doublewidth), c))
+           return 2;
+ #endif
      }
- }
  
--/* ARGSUSED */
-     static void
- Initialize(request, new, args, num_args)
--    Widget    request;        /* what the client asked for */
-+    Widget    request UNUSED; /* what the client asked for */
-     Widget    new;            /* what we're going to give him */
--    ArgList   args;
--    Cardinal  *num_args;
-+    ArgList   args UNUSED;
-+    Cardinal  *num_args UNUSED;
+     /* Characters below 0x100 are influenced by 'isprint' option */
+@@ -1246,14 +1464,13 @@ utf_char2cells(c)
+ /*
+  * mb_ptr2cells() function pointer.
+  * Return the number of display cells character at "*p" occupies.
+  * This doesn't take care of unprintable characters, use ptr2cells() for that.
+  */
+-/*ARGSUSED*/
+     int
+ latin_ptr2cells(p)
+-    char_u    *p;
++    char_u    *p UNUSED;
  {
-     ScrollbarWidget sbw = (ScrollbarWidget) new;
+     return 1;
+ }
  
-     CreateGC(new);
-     AllocTopShadowGC(new);
-@@ -554,18 +557,17 @@ Realize(w, valueMask, attributes)
-     /* The Simple widget actually stuffs the value in the valuemask. */
-     (*vim_scrollbarWidgetClass->core_class.superclass->core_class.realize)
-       (w, valueMask, attributes);
+     int
+@@ -1287,18 +1504,66 @@ dbcs_ptr2cells(p)
+       return 1;
+     return MB_BYTE2LEN(*p);
  }
  
--/* ARGSUSED */
-     static Boolean
- SetValues(current, request, desired, args, num_args)
--    Widget  current,      /* what I am */
--          request,        /* what he wants me to be */
--          desired;        /* what I will become */
--    ArgList args;
--    Cardinal *num_args;
-+    Widget  current;      /* what I am */
-+    Widget  request UNUSED; /* what he wants me to be */
-+    Widget  desired;      /* what I will become */
-+    ArgList args UNUSED;
-+    Cardinal *num_args UNUSED;
+ /*
++ * mb_ptr2cells_len() function pointer.
++ * Like mb_ptr2cells(), but limit string length to "size".
++ * For an empty string or truncated character returns 1.
++ */
++    int
++latin_ptr2cells_len(p, size)
++    char_u    *p UNUSED;
++    int               size UNUSED;
++{
++    return 1;
++}
++
++    static int
++utf_ptr2cells_len(p, size)
++    char_u    *p;
++    int               size;
++{
++    int               c;
++
++    /* Need to convert to a wide character. */
++    if (size > 0 && *p >= 0x80)
++    {
++      if (utf_ptr2len_len(p, size) < utf8len_tab[*p])
++          return 1;  /* truncated */
++      c = utf_ptr2char(p);
++      /* An illegal byte is displayed as <xx>. */
++      if (utf_ptr2len(p) == 1 || c == NUL)
++          return 4;
++      /* If the char is ASCII it must be an overlong sequence. */
++      if (c < 0x80)
++          return char2cells(c);
++      return utf_char2cells(c);
++    }
++    return 1;
++}
++
++    static int
++dbcs_ptr2cells_len(p, size)
++    char_u    *p;
++    int               size;
++{
++    /* Number of cells is equal to number of bytes, except for euc-jp when
++     * the first byte is 0x8e. */
++    if (size <= 1 || (enc_dbcs == DBCS_JPNU && *p == 0x8e))
++      return 1;
++    return MB_BYTE2LEN(*p);
++}
++
++/*
+  * mb_char2cells() function pointer.
+  * Return the number of display cells character "c" occupies.
+  * Only takes care of multi-byte chars, not "^C" and such.
+  */
+-/*ARGSUSED*/
+     int
+ latin_char2cells(c)
+-    int               c;
++    int               c UNUSED;
  {
-     ScrollbarWidget   sbw = (ScrollbarWidget) current;
-     ScrollbarWidget   dsbw = (ScrollbarWidget) desired;
-     Boolean           redraw = FALSE;
+     return 1;
+ }
  
-@@ -607,11 +609,10 @@ Resize(w)
-     SetDimensions ((ScrollbarWidget) w);
-     Redisplay(w, (XEvent*) NULL, (Region)NULL);
+     static int
+@@ -1316,15 +1581,14 @@ dbcs_char2cells(c)
+ /*
+  * mb_off2cells() function pointer.
+  * Return number of display cells for char at ScreenLines[off].
+  * We make sure that the offset used is less than "max_off".
+  */
+-/*ARGSUSED*/
+     int
+ latin_off2cells(off, max_off)
+-    unsigned  off;
+-    unsigned  max_off;
++    unsigned  off UNUSED;
++    unsigned  max_off UNUSED;
+ {
+     return 1;
  }
  
+     int
+@@ -1384,11 +1648,11 @@ utf_ptr2char(p)
+     int               len;
  
--/* ARGSUSED */
-     static void
- Redisplay(w, event, region)
-     Widget w;
-     XEvent *event;
-     Region region;
-@@ -787,15 +788,14 @@ HandleThumb(w, event, params, num_params
-       XtCallActionProc(w, "MoveThumb", event, params, *num_params);
-       XtCallActionProc(w, "NotifyThumb", event, params, *num_params);
-     }
- }
+     if (p[0] < 0x80)  /* be quick for ASCII */
+       return p[0];
  
--/* ARGSUSED */
-     static void
- RepeatNotify(client_data, idp)
-     XtPointer client_data;
--    XtIntervalId *idp;
-+    XtIntervalId *idp UNUSED;
- {
-     ScrollbarWidget sbw = (ScrollbarWidget) client_data;
-     int                   call_data;
-     char          mode = sbw->scrollbar.scroll_mode;
-     unsigned long   rep;
-@@ -837,50 +837,46 @@ FloatInRange(num, small, big)
-     float num, small, big;
- {
-     return (num < small) ? small : ((num > big) ? big : num);
+-    len = utf8len_tab[p[0]];
++    len = utf8len_tab_zero[p[0]];
+     if (len > 1 && (p[1] & 0xc0) == 0x80)
+     {
+       if (len == 2)
+           return ((p[0] & 0x1f) << 6) + (p[1] & 0x3f);
+       if ((p[2] & 0xc0) == 0x80)
+@@ -1634,10 +1898,11 @@ utf_ptr2len(p)
  }
  
--/* ARGSUSED */
-     static void
- ScrollOneLineUp(w, event, params, num_params)
-     Widget    w;
-     XEvent    *event;
--    String    *params;
--    Cardinal  *num_params;
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
+ /*
+  * Return length of UTF-8 character, obtained from the first byte.
+  * "b" must be between 0 and 255!
++ * Returns 1 for an invalid first byte value.
+  */
+     int
+ utf_byte2len(b)
+     int               b;
  {
-     ScrollSome(w, event, -ONE_LINE_DATA);
- }
--/* ARGSUSED */
-     static void
- ScrollOneLineDown(w, event, params, num_params)
-     Widget    w;
-     XEvent    *event;
--    String    *params;
--    Cardinal  *num_params;
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
+@@ -1648,25 +1913,28 @@ utf_byte2len(b)
+  * Get the length of UTF-8 byte sequence "p[size]".  Does not include any
+  * following composing characters.
+  * Returns 1 for "".
+  * Returns 1 for an illegal byte sequence (also in incomplete byte seq.).
+  * Returns number > "size" for an incomplete byte sequence.
++ * Never returns zero.
+  */
+     int
+ utf_ptr2len_len(p, size)
+     char_u    *p;
+     int               size;
  {
-     ScrollSome(w, event, ONE_LINE_DATA);
- }
+     int               len;
+     int               i;
+     int               m;
  
--/* ARGSUSED */
-     static void
- ScrollPageDown(w, event, params, num_params)
-     Widget    w;
-     XEvent    *event;
--    String    *params;
--    Cardinal  *num_params;
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
- {
-     ScrollSome(w, event, ONE_PAGE_DATA);
+-    if (*p == NUL)
+-      return 1;
+-    m = len = utf8len_tab[*p];
++    len = utf8len_tab[*p];
++    if (len == 1)
++      return 1;       /* NUL, ascii or illegal lead byte */
+     if (len > size)
+       m = size;       /* incomplete byte sequence. */
++    else
++      m = len;
+     for (i = 1; i < m; ++i)
+       if ((p[i] & 0xc0) != 0x80)
+           return 1;
+     return len;
  }
+@@ -1696,11 +1964,11 @@ utfc_ptr2len(p)
+     /* Check for illegal byte. */
+     if (len == 1 && b0 >= 0x80)
+       return 1;
  
--/* ARGSUSED */
-     static void
- ScrollPageUp(w, event, params, num_params)
-     Widget    w;
-     XEvent    *event;
--    String    *params;
--    Cardinal  *num_params;
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
- {
-     ScrollSome(w, event, -ONE_PAGE_DATA);
+     /*
+-     * Check for composing characters.  We can handle only the first two, but
++     * Check for composing characters.  We can handle only the first six, but
+      * skip all of them (otherwise the cursor would get stuck).
+      */
+ #ifdef FEAT_ARABIC
+     prevlen = 0;
+ #endif
+@@ -1718,10 +1986,11 @@ utfc_ptr2len(p)
  }
  
-     static void
-@@ -899,17 +895,16 @@ ScrollSome(w, event, call_data)
+ /*
+  * Return the number of bytes the UTF-8 encoding of the character at "p[size]"
+  * takes.  This includes following composing characters.
++ * Returns 0 for an empty string.
+  * Returns 1 for an illegal char or an incomplete byte sequence.
+  */
+     int
+ utfc_ptr2len_len(p, size)
+     char_u    *p;
+@@ -1730,11 +1999,11 @@ utfc_ptr2len_len(p, size)
+     int               len;
+ #ifdef FEAT_ARABIC
+     int               prevlen;
+ #endif
  
-     sbw->scrollbar.scroll_mode = SMODE_LINE_UP;
-     XtCallCallbacks(w, XtNscrollProc, (XtPointer)call_data);
- }
+-    if (*p == NUL)
++    if (size < 1 || *p == NUL)
+       return 0;
+     if (p[0] < 0x80 && (size == 1 || p[1] < 0x80)) /* be quick for ASCII */
+       return 1;
  
--/* ARGSUSED */
-     static void
- NotifyScroll(w, event, params, num_params)
-     Widget    w;
-     XEvent    *event;
--    String    *params;
--    Cardinal  *num_params;
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
- {
-     ScrollbarWidget sbw = (ScrollbarWidget) w;
-     Position      x, y, loc;
-     Dimension     arrow_size;
-     unsigned long   delay = 0;
-@@ -989,17 +984,16 @@ NotifyScroll(w, event, params, num_param
-       sbw->scrollbar.timer_id =
-           XtAppAddTimeOut(XtWidgetToApplicationContext(w),
-                                          delay, RepeatNotify, (XtPointer)w);
- }
+     /* Skip over first UTF-8 char, stopping at a NUL byte. */
+@@ -1743,11 +2012,11 @@ utfc_ptr2len_len(p, size)
+     /* Check for illegal byte and incomplete byte sequence. */
+     if ((len == 1 && p[0] >= 0x80) || len > size)
+       return 1;
  
--/* ARGSUSED */
-     static void
- EndScroll(w, event, params, num_params)
-     Widget w;
--    XEvent *event;    /* unused */
--    String *params;   /* unused */
--    Cardinal *num_params;   /* unused */
-+    XEvent *event UNUSED;
-+    String *params UNUSED;
-+    Cardinal *num_params UNUSED;
+     /*
+-     * Check for composing characters.  We can handle only the first two, but
++     * Check for composing characters.  We can handle only the first six, but
+      * skip all of them (otherwise the cursor would get stuck).
+      */
+ #ifdef FEAT_ARABIC
+     prevlen = 0;
+ #endif
+@@ -1861,42 +2130,202 @@ utf_char2bytes(c, buf)
+  */
+     int
+ utf_iscomposing(c)
+     int               c;
  {
-     ScrollbarWidget sbw = (ScrollbarWidget) w;
-     sbw->scrollbar.scroll_mode = SMODE_NONE;
-     /* no need to remove any autoscroll timeout; it will no-op */
-@@ -1021,17 +1015,16 @@ FractionLoc(sbw, x, y)
-     height = (float)sbw->core.height - 2 * margin;
-     width = (float)sbw->core.width - 2 * margin;
-     return PICKLENGTH(sbw, x / width, y / height);
- }
+-    /* sorted list of non-overlapping intervals */
++    /* Sorted list of non-overlapping intervals.
++     * Generated by ../runtime/tools/unicode.vim. */
+     static struct interval combining[] =
+     {
+-      {0x0300, 0x034f}, {0x0360, 0x036f}, {0x0483, 0x0486}, {0x0488, 0x0489},
+-      {0x0591, 0x05a1}, {0x05a3, 0x05b9}, {0x05bb, 0x05bd}, {0x05bf, 0x05bf},
+-      {0x05c1, 0x05c2}, {0x05c4, 0x05c4}, {0x0610, 0x0615}, {0x064b, 0x0658},
+-      {0x0670, 0x0670}, {0x06d6, 0x06dc}, {0x06de, 0x06e4}, {0x06e7, 0x06e8},
+-      {0x06ea, 0x06ed}, {0x0711, 0x0711}, {0x0730, 0x074a}, {0x07a6, 0x07b0},
+-      {0x0901, 0x0903}, {0x093c, 0x093c}, {0x093e, 0x094d}, {0x0951, 0x0954},
+-      {0x0962, 0x0963}, {0x0981, 0x0983}, {0x09bc, 0x09bc}, {0x09be, 0x09c4},
+-      {0x09c7, 0x09c8}, {0x09cb, 0x09cd}, {0x09d7, 0x09d7}, {0x09e2, 0x09e3},
+-      {0x0a01, 0x0a03}, {0x0a3c, 0x0a3c}, {0x0a3e, 0x0a42}, {0x0a47, 0x0a48},
+-      {0x0a4b, 0x0a4d}, {0x0a70, 0x0a71}, {0x0a81, 0x0a83}, {0x0abc, 0x0abc},
+-      {0x0abe, 0x0ac5}, {0x0ac7, 0x0ac9}, {0x0acb, 0x0acd}, {0x0ae2, 0x0ae3},
+-      {0x0b01, 0x0b03}, {0x0b3c, 0x0b3c}, {0x0b3e, 0x0b43}, {0x0b47, 0x0b48},
+-      {0x0b4b, 0x0b4d}, {0x0b56, 0x0b57}, {0x0b82, 0x0b82}, {0x0bbe, 0x0bc2},
+-      {0x0bc6, 0x0bc8}, {0x0bca, 0x0bcd}, {0x0bd7, 0x0bd7}, {0x0c01, 0x0c03},
+-      {0x0c3e, 0x0c44}, {0x0c46, 0x0c48}, {0x0c4a, 0x0c4d}, {0x0c55, 0x0c56},
+-      {0x0c82, 0x0c83}, {0x0cbc, 0x0cbc}, {0x0cbe, 0x0cc4}, {0x0cc6, 0x0cc8},
+-      {0x0cca, 0x0ccd}, {0x0cd5, 0x0cd6}, {0x0d02, 0x0d03}, {0x0d3e, 0x0d43},
+-      {0x0d46, 0x0d48}, {0x0d4a, 0x0d4d}, {0x0d57, 0x0d57}, {0x0d82, 0x0d83},
+-      {0x0dca, 0x0dca}, {0x0dcf, 0x0dd4}, {0x0dd6, 0x0dd6}, {0x0dd8, 0x0ddf},
+-      {0x0df2, 0x0df3}, {0x0e31, 0x0e31}, {0x0e34, 0x0e3a}, {0x0e47, 0x0e4e},
+-      {0x0eb1, 0x0eb1}, {0x0eb4, 0x0eb9}, {0x0ebb, 0x0ebc}, {0x0ec8, 0x0ecd},
+-      {0x0f18, 0x0f19}, {0x0f35, 0x0f35}, {0x0f37, 0x0f37}, {0x0f39, 0x0f39},
+-      {0x0f3e, 0x0f3f}, {0x0f71, 0x0f84}, {0x0f86, 0x0f87}, {0x0f90, 0x0f97},
+-      {0x0f99, 0x0fbc}, {0x0fc6, 0x0fc6}, {0x102c, 0x1032}, {0x1036, 0x1039},
+-      {0x1056, 0x1059}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753},
+-      {0x1772, 0x1773}, {0x17b6, 0x17d3}, {0x17dd, 0x17dd}, {0x180b, 0x180d},
+-      {0x18a9, 0x18a9}, {0x1920, 0x192b}, {0x1930, 0x193b}, {0x20d0, 0x20ea},
+-      {0x302a, 0x302f}, {0x3099, 0x309a}, {0xfb1e, 0xfb1e}, {0xfe00, 0xfe0f},
+-      {0xfe20, 0xfe23},
++      {0x0300, 0x036f},
++      {0x0483, 0x0489},
++      {0x0591, 0x05bd},
++      {0x05bf, 0x05bf},
++      {0x05c1, 0x05c2},
++      {0x05c4, 0x05c5},
++      {0x05c7, 0x05c7},
++      {0x0610, 0x061a},
++      {0x064b, 0x065e},
++      {0x0670, 0x0670},
++      {0x06d6, 0x06dc},
++      {0x06de, 0x06e4},
++      {0x06e7, 0x06e8},
++      {0x06ea, 0x06ed},
++      {0x0711, 0x0711},
++      {0x0730, 0x074a},
++      {0x07a6, 0x07b0},
++      {0x07eb, 0x07f3},
++      {0x0816, 0x0819},
++      {0x081b, 0x0823},
++      {0x0825, 0x0827},
++      {0x0829, 0x082d},
++      {0x0900, 0x0903},
++      {0x093c, 0x093c},
++      {0x093e, 0x094e},
++      {0x0951, 0x0955},
++      {0x0962, 0x0963},
++      {0x0981, 0x0983},
++      {0x09bc, 0x09bc},
++      {0x09be, 0x09c4},
++      {0x09c7, 0x09c8},
++      {0x09cb, 0x09cd},
++      {0x09d7, 0x09d7},
++      {0x09e2, 0x09e3},
++      {0x0a01, 0x0a03},
++      {0x0a3c, 0x0a3c},
++      {0x0a3e, 0x0a42},
++      {0x0a47, 0x0a48},
++      {0x0a4b, 0x0a4d},
++      {0x0a51, 0x0a51},
++      {0x0a70, 0x0a71},
++      {0x0a75, 0x0a75},
++      {0x0a81, 0x0a83},
++      {0x0abc, 0x0abc},
++      {0x0abe, 0x0ac5},
++      {0x0ac7, 0x0ac9},
++      {0x0acb, 0x0acd},
++      {0x0ae2, 0x0ae3},
++      {0x0b01, 0x0b03},
++      {0x0b3c, 0x0b3c},
++      {0x0b3e, 0x0b44},
++      {0x0b47, 0x0b48},
++      {0x0b4b, 0x0b4d},
++      {0x0b56, 0x0b57},
++      {0x0b62, 0x0b63},
++      {0x0b82, 0x0b82},
++      {0x0bbe, 0x0bc2},
++      {0x0bc6, 0x0bc8},
++      {0x0bca, 0x0bcd},
++      {0x0bd7, 0x0bd7},
++      {0x0c01, 0x0c03},
++      {0x0c3e, 0x0c44},
++      {0x0c46, 0x0c48},
++      {0x0c4a, 0x0c4d},
++      {0x0c55, 0x0c56},
++      {0x0c62, 0x0c63},
++      {0x0c82, 0x0c83},
++      {0x0cbc, 0x0cbc},
++      {0x0cbe, 0x0cc4},
++      {0x0cc6, 0x0cc8},
++      {0x0cca, 0x0ccd},
++      {0x0cd5, 0x0cd6},
++      {0x0ce2, 0x0ce3},
++      {0x0d02, 0x0d03},
++      {0x0d3e, 0x0d44},
++      {0x0d46, 0x0d48},
++      {0x0d4a, 0x0d4d},
++      {0x0d57, 0x0d57},
++      {0x0d62, 0x0d63},
++      {0x0d82, 0x0d83},
++      {0x0dca, 0x0dca},
++      {0x0dcf, 0x0dd4},
++      {0x0dd6, 0x0dd6},
++      {0x0dd8, 0x0ddf},
++      {0x0df2, 0x0df3},
++      {0x0e31, 0x0e31},
++      {0x0e34, 0x0e3a},
++      {0x0e47, 0x0e4e},
++      {0x0eb1, 0x0eb1},
++      {0x0eb4, 0x0eb9},
++      {0x0ebb, 0x0ebc},
++      {0x0ec8, 0x0ecd},
++      {0x0f18, 0x0f19},
++      {0x0f35, 0x0f35},
++      {0x0f37, 0x0f37},
++      {0x0f39, 0x0f39},
++      {0x0f3e, 0x0f3f},
++      {0x0f71, 0x0f84},
++      {0x0f86, 0x0f87},
++      {0x0f90, 0x0f97},
++      {0x0f99, 0x0fbc},
++      {0x0fc6, 0x0fc6},
++      {0x102b, 0x103e},
++      {0x1056, 0x1059},
++      {0x105e, 0x1060},
++      {0x1062, 0x1064},
++      {0x1067, 0x106d},
++      {0x1071, 0x1074},
++      {0x1082, 0x108d},
++      {0x108f, 0x108f},
++      {0x109a, 0x109d},
++      {0x135f, 0x135f},
++      {0x1712, 0x1714},
++      {0x1732, 0x1734},
++      {0x1752, 0x1753},
++      {0x1772, 0x1773},
++      {0x17b6, 0x17d3},
++      {0x17dd, 0x17dd},
++      {0x180b, 0x180d},
++      {0x18a9, 0x18a9},
++      {0x1920, 0x192b},
++      {0x1930, 0x193b},
++      {0x19b0, 0x19c0},
++      {0x19c8, 0x19c9},
++      {0x1a17, 0x1a1b},
++      {0x1a55, 0x1a5e},
++      {0x1a60, 0x1a7c},
++      {0x1a7f, 0x1a7f},
++      {0x1b00, 0x1b04},
++      {0x1b34, 0x1b44},
++      {0x1b6b, 0x1b73},
++      {0x1b80, 0x1b82},
++      {0x1ba1, 0x1baa},
++      {0x1c24, 0x1c37},
++      {0x1cd0, 0x1cd2},
++      {0x1cd4, 0x1ce8},
++      {0x1ced, 0x1ced},
++      {0x1cf2, 0x1cf2},
++      {0x1dc0, 0x1de6},
++      {0x1dfd, 0x1dff},
++      {0x20d0, 0x20f0},
++      {0x2cef, 0x2cf1},
++      {0x2de0, 0x2dff},
++      {0x302a, 0x302f},
++      {0x3099, 0x309a},
++      {0xa66f, 0xa672},
++      {0xa67c, 0xa67d},
++      {0xa6f0, 0xa6f1},
++      {0xa802, 0xa802},
++      {0xa806, 0xa806},
++      {0xa80b, 0xa80b},
++      {0xa823, 0xa827},
++      {0xa880, 0xa881},
++      {0xa8b4, 0xa8c4},
++      {0xa8e0, 0xa8f1},
++      {0xa926, 0xa92d},
++      {0xa947, 0xa953},
++      {0xa980, 0xa983},
++      {0xa9b3, 0xa9c0},
++      {0xaa29, 0xaa36},
++      {0xaa43, 0xaa43},
++      {0xaa4c, 0xaa4d},
++      {0xaa7b, 0xaa7b},
++      {0xaab0, 0xaab0},
++      {0xaab2, 0xaab4},
++      {0xaab7, 0xaab8},
++      {0xaabe, 0xaabf},
++      {0xaac1, 0xaac1},
++      {0xabe3, 0xabea},
++      {0xabec, 0xabed},
++      {0xfb1e, 0xfb1e},
++      {0xfe00, 0xfe0f},
++      {0xfe20, 0xfe26},
++      {0x101fd, 0x101fd},
++      {0x10a01, 0x10a03},
++      {0x10a05, 0x10a06},
++      {0x10a0c, 0x10a0f},
++      {0x10a38, 0x10a3a},
++      {0x10a3f, 0x10a3f},
++      {0x11080, 0x11082},
++      {0x110b0, 0x110ba},
++      {0x1d165, 0x1d169},
++      {0x1d16d, 0x1d172},
++      {0x1d17b, 0x1d182},
++      {0x1d185, 0x1d18b},
++      {0x1d1aa, 0x1d1ad},
++      {0x1d242, 0x1d244},
++      {0xe0100, 0xe01ef}
+     };
  
--/* ARGSUSED */
-     static void
- MoveThumb(w, event, params, num_params)
-     Widget    w;
-     XEvent    *event;
--    String    *params;        /* unused */
--    Cardinal  *num_params;    /* unused */
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
- {
-     ScrollbarWidget   sbw = (ScrollbarWidget)w;
-     Position          x, y;
-     float             top;
-     char              old_mode = sbw->scrollbar.scroll_mode;
-@@ -1067,31 +1060,36 @@ MoveThumb(w, event, params, num_params)
-     PaintThumb(sbw);
-     XFlush(XtDisplay(w));   /* re-draw it before Notifying */
+     return intable(combining, sizeof(combining), c);
  }
  
+@@ -2040,64 +2469,185 @@ utf_class(c)
  
--/* ARGSUSED */
-     static void
- NotifyThumb(w, event, params, num_params)
-     Widget    w;
-     XEvent    *event;
--    String    *params;        /* unused */
--    Cardinal  *num_params;    /* unused */
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
- {
-     ScrollbarWidget sbw = (ScrollbarWidget)w;
-+    /* Use a union to avoid a warning for the weird conversion from float to
-+     * XtPointer.  Comes from Xaw/Scrollbar.c. */
-+    union {
-+      XtPointer xtp;
-+      float xtf;
-+    } xtpf;
-     if (LookAhead(w, event))
-       return;
-     /* thumbProc is not pretty, but is necessary for backwards
-        compatibility on those architectures for which it work{s,ed};
-        the intent is to pass a (truncated) float by value. */
--    XtCallCallbacks(w, XtNthumbProc, *(XtPointer*)&sbw->scrollbar.top);
-+    xtpf.xtf = sbw->scrollbar.top;
-+    XtCallCallbacks(w, XtNthumbProc, xtpf.xtp);
-     XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top);
- }
+ /*
+  * Code for Unicode case-dependent operations.  Based on notes in
+  * http://www.unicode.org/Public/UNIDATA/CaseFolding.txt
+  * This code uses simple case folding, not full case folding.
++ * Last updated for Unicode 5.2.
+  */
  
--/* ARGSUSED */
-     static void
- AllocTopShadowGC(w)
-     Widget w;
+ /*
+- * The following table is built by foldExtract.pl < CaseFolding.txt .
+- * It must be in numeric order, because we use binary search on it.
+- * An entry such as {0x41,0x5a,1,32} means that UCS-4 characters in the range
+- * from 0x41 to 0x5a inclusive, stepping by 1, are folded by adding 32.
++ * The following tables are built by ../runtime/tools/unicode.vim.
++ * They must be in numeric order, because we use binary search.
++ * An entry such as {0x41,0x5a,1,32} means that Unicode characters in the
++ * range from 0x41 to 0x5a inclusive, stepping by 1, are changed to
++ * folded/upper/lower by adding 32.
+  */
+-
+ typedef struct
  {
-     ScrollbarWidget sbw = (ScrollbarWidget) w;
-@@ -1101,11 +1099,10 @@ AllocTopShadowGC(w)
-     valuemask = GCForeground;
-     myXGCV.foreground = sbw->scrollbar.top_shadow_pixel;
-     sbw->scrollbar.top_shadow_GC = XtGetGC(w, valuemask, &myXGCV);
- }
+     int rangeStart;
+     int rangeEnd;
+     int step;
+     int offset;
+ } convertStruct;
  
--/* ARGSUSED */
-     static void
- AllocBotShadowGC(w)
-     Widget w;
+ static convertStruct foldCase[] =
  {
-     ScrollbarWidget sbw = (ScrollbarWidget) w;
-@@ -1115,15 +1112,14 @@ AllocBotShadowGC(w)
-     valuemask = GCForeground;
-     myXGCV.foreground = sbw->scrollbar.bot_shadow_pixel;
-     sbw->scrollbar.bot_shadow_GC = XtGetGC(w, valuemask, &myXGCV);
- }
--/* ARGSUSED */
-     static void
- _Xaw3dDrawShadows(gw, event, region, out)
-     Widget  gw;
--    XEvent  *event;
-+    XEvent  *event UNUSED;
-     Region  region;
-     int           out;
- {
-     XPoint  pt[6];
-     ScrollbarWidget sbw = (ScrollbarWidget) gw;
---- vim72.orig/src/gui_gtk_x11.c
-+++ vim72/src/gui_gtk_x11.c
-@@ -105,10 +105,11 @@ enum
- {
-     TARGET_TYPE_NONE,
-     TARGET_UTF8_STRING,
-     TARGET_STRING,
-     TARGET_COMPOUND_TEXT,
-+    TARGET_HTML,
-     TARGET_TEXT,
-     TARGET_TEXT_URI_LIST,
-     TARGET_TEXT_PLAIN,
-     TARGET_VIM,
-     TARGET_VIMENC
-@@ -121,10 +122,11 @@ enum
- static const GtkTargetEntry selection_targets[] =
- {
-     {VIMENC_ATOM_NAME,        0, TARGET_VIMENC},
-     {VIM_ATOM_NAME,   0, TARGET_VIM},
- #ifdef FEAT_MBYTE
-+    {"text/html",     0, TARGET_HTML},
-     {"UTF8_STRING",   0, TARGET_UTF8_STRING},
- #endif
-     {"COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT},
-     {"TEXT",          0, TARGET_TEXT},
-     {"STRING",                0, TARGET_STRING}
-@@ -138,10 +140,11 @@ static const GtkTargetEntry selection_ta
-  */
- static const GtkTargetEntry dnd_targets[] =
- {
-     {"text/uri-list", 0, TARGET_TEXT_URI_LIST},
- # ifdef FEAT_MBYTE
-+    {"text/html",     0, TARGET_HTML},
-     {"UTF8_STRING",   0, TARGET_UTF8_STRING},
- # endif
-     {"STRING",                0, TARGET_STRING},
-     {"text/plain",    0, TARGET_TEXT_PLAIN}
+-      {0x41,0x5a,1,32}, {0xc0,0xd6,1,32}, {0xd8,0xde,1,32},
+-      {0x100,0x12e,2,1}, {0x130,0x130,-1,-199}, {0x132,0x136,2,1},
+-      {0x139,0x147,2,1}, {0x14a,0x176,2,1}, {0x178,0x178,-1,-121},
+-      {0x179,0x17d,2,1}, {0x181,0x181,-1,210}, {0x182,0x184,2,1},
+-      {0x186,0x186,-1,206}, {0x187,0x187,-1,1}, {0x189,0x18a,1,205},
+-      {0x18b,0x18b,-1,1}, {0x18e,0x18e,-1,79}, {0x18f,0x18f,-1,202},
+-      {0x190,0x190,-1,203}, {0x191,0x191,-1,1}, {0x193,0x193,-1,205},
+-      {0x194,0x194,-1,207}, {0x196,0x196,-1,211}, {0x197,0x197,-1,209},
+-      {0x198,0x198,-1,1}, {0x19c,0x19c,-1,211}, {0x19d,0x19d,-1,213},
+-      {0x19f,0x19f,-1,214}, {0x1a0,0x1a4,2,1}, {0x1a6,0x1a6,-1,218},
+-      {0x1a7,0x1a7,-1,1}, {0x1a9,0x1a9,-1,218}, {0x1ac,0x1ac,-1,1},
+-      {0x1ae,0x1ae,-1,218}, {0x1af,0x1af,-1,1}, {0x1b1,0x1b2,1,217},
+-      {0x1b3,0x1b5,2,1}, {0x1b7,0x1b7,-1,219}, {0x1b8,0x1bc,4,1},
+-      {0x1c4,0x1c4,-1,2}, {0x1c5,0x1c5,-1,1}, {0x1c7,0x1c7,-1,2},
+-      {0x1c8,0x1c8,-1,1}, {0x1ca,0x1ca,-1,2}, {0x1cb,0x1db,2,1},
+-      {0x1de,0x1ee,2,1}, {0x1f1,0x1f1,-1,2}, {0x1f2,0x1f4,2,1},
+-      {0x1f6,0x1f6,-1,-97}, {0x1f7,0x1f7,-1,-56}, {0x1f8,0x21e,2,1},
+-      {0x220,0x220,-1,-130}, {0x222,0x232,2,1}, {0x386,0x386,-1,38},
+-      {0x388,0x38a,1,37}, {0x38c,0x38c,-1,64}, {0x38e,0x38f,1,63},
+-      {0x391,0x3a1,1,32}, {0x3a3,0x3ab,1,32}, {0x3d8,0x3ee,2,1},
+-      {0x3f4,0x3f4,-1,-60}, {0x3f7,0x3f7,-1,1}, {0x3f9,0x3f9,-1,-7},
+-      {0x3fa,0x3fa,-1,1}, {0x400,0x40f,1,80}, {0x410,0x42f,1,32},
+-      {0x460,0x480,2,1}, {0x48a,0x4be,2,1}, {0x4c1,0x4cd,2,1},
+-      {0x4d0,0x4f4,2,1}, {0x4f8,0x500,8,1}, {0x502,0x50e,2,1},
+-      {0x531,0x556,1,48}, {0x1e00,0x1e94,2,1}, {0x1ea0,0x1ef8,2,1},
+-      {0x1f08,0x1f0f,1,-8}, {0x1f18,0x1f1d,1,-8}, {0x1f28,0x1f2f,1,-8},
+-      {0x1f38,0x1f3f,1,-8}, {0x1f48,0x1f4d,1,-8}, {0x1f59,0x1f5f,2,-8},
+-      {0x1f68,0x1f6f,1,-8}, {0x1f88,0x1f8f,1,-8}, {0x1f98,0x1f9f,1,-8},
+-      {0x1fa8,0x1faf,1,-8}, {0x1fb8,0x1fb9,1,-8}, {0x1fba,0x1fbb,1,-74},
+-      {0x1fbc,0x1fbc,-1,-9}, {0x1fc8,0x1fcb,1,-86}, {0x1fcc,0x1fcc,-1,-9},
+-      {0x1fd8,0x1fd9,1,-8}, {0x1fda,0x1fdb,1,-100}, {0x1fe8,0x1fe9,1,-8},
+-      {0x1fea,0x1feb,1,-112}, {0x1fec,0x1fec,-1,-7}, {0x1ff8,0x1ff9,1,-128},
+-      {0x1ffa,0x1ffb,1,-126}, {0x1ffc,0x1ffc,-1,-9}, {0x2126,0x2126,-1,-7517},
+-      {0x212a,0x212a,-1,-8383}, {0x212b,0x212b,-1,-8262},
+-      {0x2160,0x216f,1,16}, {0x24b6,0x24cf,1,26}, {0xff21,0xff3a,1,32},
++      {0x41,0x5a,1,32},
++      {0xb5,0xb5,-1,775},
++      {0xc0,0xd6,1,32},
++      {0xd8,0xde,1,32},
++      {0x100,0x12e,2,1},
++      {0x132,0x136,2,1},
++      {0x139,0x147,2,1},
++      {0x14a,0x176,2,1},
++      {0x178,0x178,-1,-121},
++      {0x179,0x17d,2,1},
++      {0x17f,0x17f,-1,-268},
++      {0x181,0x181,-1,210},
++      {0x182,0x184,2,1},
++      {0x186,0x186,-1,206},
++      {0x187,0x187,-1,1},
++      {0x189,0x18a,1,205},
++      {0x18b,0x18b,-1,1},
++      {0x18e,0x18e,-1,79},
++      {0x18f,0x18f,-1,202},
++      {0x190,0x190,-1,203},
++      {0x191,0x191,-1,1},
++      {0x193,0x193,-1,205},
++      {0x194,0x194,-1,207},
++      {0x196,0x196,-1,211},
++      {0x197,0x197,-1,209},
++      {0x198,0x198,-1,1},
++      {0x19c,0x19c,-1,211},
++      {0x19d,0x19d,-1,213},
++      {0x19f,0x19f,-1,214},
++      {0x1a0,0x1a4,2,1},
++      {0x1a6,0x1a6,-1,218},
++      {0x1a7,0x1a7,-1,1},
++      {0x1a9,0x1a9,-1,218},
++      {0x1ac,0x1ac,-1,1},
++      {0x1ae,0x1ae,-1,218},
++      {0x1af,0x1af,-1,1},
++      {0x1b1,0x1b2,1,217},
++      {0x1b3,0x1b5,2,1},
++      {0x1b7,0x1b7,-1,219},
++      {0x1b8,0x1bc,4,1},
++      {0x1c4,0x1c4,-1,2},
++      {0x1c5,0x1c5,-1,1},
++      {0x1c7,0x1c7,-1,2},
++      {0x1c8,0x1c8,-1,1},
++      {0x1ca,0x1ca,-1,2},
++      {0x1cb,0x1db,2,1},
++      {0x1de,0x1ee,2,1},
++      {0x1f1,0x1f1,-1,2},
++      {0x1f2,0x1f4,2,1},
++      {0x1f6,0x1f6,-1,-97},
++      {0x1f7,0x1f7,-1,-56},
++      {0x1f8,0x21e,2,1},
++      {0x220,0x220,-1,-130},
++      {0x222,0x232,2,1},
++      {0x23a,0x23a,-1,10795},
++      {0x23b,0x23b,-1,1},
++      {0x23d,0x23d,-1,-163},
++      {0x23e,0x23e,-1,10792},
++      {0x241,0x241,-1,1},
++      {0x243,0x243,-1,-195},
++      {0x244,0x244,-1,69},
++      {0x245,0x245,-1,71},
++      {0x246,0x24e,2,1},
++      {0x345,0x345,-1,116},
++      {0x370,0x372,2,1},
++      {0x376,0x376,-1,1},
++      {0x386,0x386,-1,38},
++      {0x388,0x38a,1,37},
++      {0x38c,0x38c,-1,64},
++      {0x38e,0x38f,1,63},
++      {0x391,0x3a1,1,32},
++      {0x3a3,0x3ab,1,32},
++      {0x3c2,0x3c2,-1,1},
++      {0x3cf,0x3cf,-1,8},
++      {0x3d0,0x3d0,-1,-30},
++      {0x3d1,0x3d1,-1,-25},
++      {0x3d5,0x3d5,-1,-15},
++      {0x3d6,0x3d6,-1,-22},
++      {0x3d8,0x3ee,2,1},
++      {0x3f0,0x3f0,-1,-54},
++      {0x3f1,0x3f1,-1,-48},
++      {0x3f4,0x3f4,-1,-60},
++      {0x3f5,0x3f5,-1,-64},
++      {0x3f7,0x3f7,-1,1},
++      {0x3f9,0x3f9,-1,-7},
++      {0x3fa,0x3fa,-1,1},
++      {0x3fd,0x3ff,1,-130},
++      {0x400,0x40f,1,80},
++      {0x410,0x42f,1,32},
++      {0x460,0x480,2,1},
++      {0x48a,0x4be,2,1},
++      {0x4c0,0x4c0,-1,15},
++      {0x4c1,0x4cd,2,1},
++      {0x4d0,0x524,2,1},
++      {0x531,0x556,1,48},
++      {0x10a0,0x10c5,1,7264},
++      {0x1e00,0x1e94,2,1},
++      {0x1e9b,0x1e9b,-1,-58},
++      {0x1e9e,0x1e9e,-1,-7615},
++      {0x1ea0,0x1efe,2,1},
++      {0x1f08,0x1f0f,1,-8},
++      {0x1f18,0x1f1d,1,-8},
++      {0x1f28,0x1f2f,1,-8},
++      {0x1f38,0x1f3f,1,-8},
++      {0x1f48,0x1f4d,1,-8},
++      {0x1f59,0x1f5f,2,-8},
++      {0x1f68,0x1f6f,1,-8},
++      {0x1f88,0x1f8f,1,-8},
++      {0x1f98,0x1f9f,1,-8},
++      {0x1fa8,0x1faf,1,-8},
++      {0x1fb8,0x1fb9,1,-8},
++      {0x1fba,0x1fbb,1,-74},
++      {0x1fbc,0x1fbc,-1,-9},
++      {0x1fbe,0x1fbe,-1,-7173},
++      {0x1fc8,0x1fcb,1,-86},
++      {0x1fcc,0x1fcc,-1,-9},
++      {0x1fd8,0x1fd9,1,-8},
++      {0x1fda,0x1fdb,1,-100},
++      {0x1fe8,0x1fe9,1,-8},
++      {0x1fea,0x1feb,1,-112},
++      {0x1fec,0x1fec,-1,-7},
++      {0x1ff8,0x1ff9,1,-128},
++      {0x1ffa,0x1ffb,1,-126},
++      {0x1ffc,0x1ffc,-1,-9},
++      {0x2126,0x2126,-1,-7517},
++      {0x212a,0x212a,-1,-8383},
++      {0x212b,0x212b,-1,-8262},
++      {0x2132,0x2132,-1,28},
++      {0x2160,0x216f,1,16},
++      {0x2183,0x2183,-1,1},
++      {0x24b6,0x24cf,1,26},
++      {0x2c00,0x2c2e,1,48},
++      {0x2c60,0x2c60,-1,1},
++      {0x2c62,0x2c62,-1,-10743},
++      {0x2c63,0x2c63,-1,-3814},
++      {0x2c64,0x2c64,-1,-10727},
++      {0x2c67,0x2c6b,2,1},
++      {0x2c6d,0x2c6d,-1,-10780},
++      {0x2c6e,0x2c6e,-1,-10749},
++      {0x2c6f,0x2c6f,-1,-10783},
++      {0x2c70,0x2c70,-1,-10782},
++      {0x2c72,0x2c75,3,1},
++      {0x2c7e,0x2c7f,1,-10815},
++      {0x2c80,0x2ce2,2,1},
++      {0x2ceb,0x2ced,2,1},
++      {0xa640,0xa65e,2,1},
++      {0xa662,0xa66c,2,1},
++      {0xa680,0xa696,2,1},
++      {0xa722,0xa72e,2,1},
++      {0xa732,0xa76e,2,1},
++      {0xa779,0xa77b,2,1},
++      {0xa77d,0xa77d,-1,-35332},
++      {0xa77e,0xa786,2,1},
++      {0xa78b,0xa78b,-1,1},
++      {0xff21,0xff3a,1,32},
+       {0x10400,0x10427,1,40}
  };
-@@ -176,10 +179,11 @@ static GdkAtom save_yourself_atom = GDK_
- /*
-  * Atoms used to control/reference X11 selections.
-  */
- #ifdef FEAT_MBYTE
-+static GdkAtom html_atom = GDK_NONE;
- static GdkAtom utf8_string_atom = GDK_NONE;
- #endif
- #ifndef HAVE_GTK2
- static GdkAtom compound_text_atom = GDK_NONE;
- static GdkAtom text_atom = GDK_NONE;
-@@ -410,10 +414,11 @@ static char **gui_argv = NULL;
- #ifdef HAVE_GTK2
- static const char *role_argument = NULL;
- #endif
- #if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION)
- static const char *restart_command = NULL;
-+static       char *abs_restart_command = NULL;
- #endif
- static int found_iconic_arg = FALSE;
  
- #ifdef FEAT_GUI_GNOME
- /*
-@@ -447,12 +452,14 @@ gui_mch_prepare(int *argc, char **argv)
-     if (strchr(argv[0], G_DIR_SEPARATOR) != NULL)
-     {
-       char_u buf[MAXPATHL];
-       if (mch_FullName((char_u *)argv[0], buf, (int)sizeof(buf), TRUE) == OK)
--          /* Tiny leak; doesn't matter, and usually we don't even get here */
--          restart_command = (char *)vim_strsave(buf);
-+      {
-+          abs_restart_command = (char *)vim_strsave(buf);
-+          restart_command = abs_restart_command;
-+      }
-     }
- #endif
+ static int utf_convert(int a, convertStruct table[], int tableSize);
  
-     /*
-      * Move all the entries in argv which are relevant to GTK+ and GNOME
-@@ -609,21 +616,25 @@ gui_mch_prepare(int *argc, char **argv)
- #if defined(EXITFREE) || defined(PROTO)
-     void
- gui_mch_free_all()
+@@ -2141,89 +2691,310 @@ utf_fold(a)
+     int               a;
  {
-     vim_free(gui_argv);
-+#if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION)
-+    vim_free(abs_restart_command);
-+#endif
+     return utf_convert(a, foldCase, sizeof(foldCase));
  }
- #endif
  
- /*
-  * This should be maybe completely removed.
-  * Doesn't seem possible, since check_copy_area() relies on
-  * this information.  --danielk
-  */
--/*ARGSUSED*/
-     static gint
--visibility_event(GtkWidget *widget, GdkEventVisibility *event, gpointer data)
-+visibility_event(GtkWidget *widget UNUSED,
-+               GdkEventVisibility *event,
-+               gpointer data UNUSED)
+-/*
+- * The following tables are built by upperLowerExtract.pl < UnicodeData.txt .
+- * They must be in numeric order, because we use binary search on them.
+- * An entry such as {0x41,0x5a,1,32} means that UCS-4 characters in the range
+- * from 0x41 to 0x5a inclusive, stepping by 1, are switched to lower (for
+- * example) by adding 32.
+- */
+ static convertStruct toLower[] =
  {
-     gui.visibility = event->state;
-     /*
-      * When we do an gdk_window_copy_area(), and the window is partially
-      * obscured, we want to receive an event to tell us whether it worked
-@@ -636,13 +647,14 @@ visibility_event(GtkWidget *widget, GdkE
- }
+-      {0x41,0x5a,1,32}, {0xc0,0xd6,1,32}, {0xd8,0xde,1,32},
+-      {0x100,0x12e,2,1}, {0x130,0x130,-1,-199}, {0x132,0x136,2,1},
+-      {0x139,0x147,2,1}, {0x14a,0x176,2,1}, {0x178,0x178,-1,-121},
+-      {0x179,0x17d,2,1}, {0x181,0x181,-1,210}, {0x182,0x184,2,1},
+-      {0x186,0x186,-1,206}, {0x187,0x187,-1,1}, {0x189,0x18a,1,205},
+-      {0x18b,0x18b,-1,1}, {0x18e,0x18e,-1,79}, {0x18f,0x18f,-1,202},
+-      {0x190,0x190,-1,203}, {0x191,0x191,-1,1}, {0x193,0x193,-1,205},
+-      {0x194,0x194,-1,207}, {0x196,0x196,-1,211}, {0x197,0x197,-1,209},
+-      {0x198,0x198,-1,1}, {0x19c,0x19c,-1,211}, {0x19d,0x19d,-1,213},
+-      {0x19f,0x19f,-1,214}, {0x1a0,0x1a4,2,1}, {0x1a6,0x1a6,-1,218},
+-      {0x1a7,0x1a7,-1,1}, {0x1a9,0x1a9,-1,218}, {0x1ac,0x1ac,-1,1},
+-      {0x1ae,0x1ae,-1,218}, {0x1af,0x1af,-1,1}, {0x1b1,0x1b2,1,217},
+-      {0x1b3,0x1b5,2,1}, {0x1b7,0x1b7,-1,219}, {0x1b8,0x1bc,4,1},
+-      {0x1c4,0x1ca,3,2}, {0x1cd,0x1db,2,1}, {0x1de,0x1ee,2,1},
+-      {0x1f1,0x1f1,-1,2}, {0x1f4,0x1f4,-1,1}, {0x1f6,0x1f6,-1,-97},
+-      {0x1f7,0x1f7,-1,-56}, {0x1f8,0x21e,2,1}, {0x220,0x220,-1,-130},
+-      {0x222,0x232,2,1}, {0x386,0x386,-1,38}, {0x388,0x38a,1,37},
+-      {0x38c,0x38c,-1,64}, {0x38e,0x38f,1,63}, {0x391,0x3a1,1,32},
+-      {0x3a3,0x3ab,1,32}, {0x3d8,0x3ee,2,1}, {0x3f4,0x3f4,-1,-60},
+-      {0x3f7,0x3f7,-1,1}, {0x3f9,0x3f9,-1,-7}, {0x3fa,0x3fa,-1,1},
+-      {0x400,0x40f,1,80}, {0x410,0x42f,1,32}, {0x460,0x480,2,1},
+-      {0x48a,0x4be,2,1}, {0x4c1,0x4cd,2,1}, {0x4d0,0x4f4,2,1},
+-      {0x4f8,0x500,8,1}, {0x502,0x50e,2,1}, {0x531,0x556,1,48},
+-      {0x1e00,0x1e94,2,1}, {0x1ea0,0x1ef8,2,1}, {0x1f08,0x1f0f,1,-8},
+-      {0x1f18,0x1f1d,1,-8}, {0x1f28,0x1f2f,1,-8}, {0x1f38,0x1f3f,1,-8},
+-      {0x1f48,0x1f4d,1,-8}, {0x1f59,0x1f5f,2,-8}, {0x1f68,0x1f6f,1,-8},
+-      {0x1fb8,0x1fb9,1,-8}, {0x1fba,0x1fbb,1,-74}, {0x1fc8,0x1fcb,1,-86},
+-      {0x1fd8,0x1fd9,1,-8}, {0x1fda,0x1fdb,1,-100}, {0x1fe8,0x1fe9,1,-8},
+-      {0x1fea,0x1feb,1,-112}, {0x1fec,0x1fec,-1,-7}, {0x1ff8,0x1ff9,1,-128},
+-      {0x1ffa,0x1ffb,1,-126}, {0x2126,0x2126,-1,-7517}, {0x212a,0x212a,-1,-8383},
+-      {0x212b,0x212b,-1,-8262}, {0xff21,0xff3a,1,32}, {0x10400,0x10427,1,40}
++      {0x41,0x5a,1,32},
++      {0xc0,0xd6,1,32},
++      {0xd8,0xde,1,32},
++      {0x100,0x12e,2,1},
++      {0x130,0x130,-1,-199},
++      {0x132,0x136,2,1},
++      {0x139,0x147,2,1},
++      {0x14a,0x176,2,1},
++      {0x178,0x178,-1,-121},
++      {0x179,0x17d,2,1},
++      {0x181,0x181,-1,210},
++      {0x182,0x184,2,1},
++      {0x186,0x186,-1,206},
++      {0x187,0x187,-1,1},
++      {0x189,0x18a,1,205},
++      {0x18b,0x18b,-1,1},
++      {0x18e,0x18e,-1,79},
++      {0x18f,0x18f,-1,202},
++      {0x190,0x190,-1,203},
++      {0x191,0x191,-1,1},
++      {0x193,0x193,-1,205},
++      {0x194,0x194,-1,207},
++      {0x196,0x196,-1,211},
++      {0x197,0x197,-1,209},
++      {0x198,0x198,-1,1},
++      {0x19c,0x19c,-1,211},
++      {0x19d,0x19d,-1,213},
++      {0x19f,0x19f,-1,214},
++      {0x1a0,0x1a4,2,1},
++      {0x1a6,0x1a6,-1,218},
++      {0x1a7,0x1a7,-1,1},
++      {0x1a9,0x1a9,-1,218},
++      {0x1ac,0x1ac,-1,1},
++      {0x1ae,0x1ae,-1,218},
++      {0x1af,0x1af,-1,1},
++      {0x1b1,0x1b2,1,217},
++      {0x1b3,0x1b5,2,1},
++      {0x1b7,0x1b7,-1,219},
++      {0x1b8,0x1bc,4,1},
++      {0x1c4,0x1c4,-1,2},
++      {0x1c5,0x1c5,-1,1},
++      {0x1c7,0x1c7,-1,2},
++      {0x1c8,0x1c8,-1,1},
++      {0x1ca,0x1ca,-1,2},
++      {0x1cb,0x1db,2,1},
++      {0x1de,0x1ee,2,1},
++      {0x1f1,0x1f1,-1,2},
++      {0x1f2,0x1f4,2,1},
++      {0x1f6,0x1f6,-1,-97},
++      {0x1f7,0x1f7,-1,-56},
++      {0x1f8,0x21e,2,1},
++      {0x220,0x220,-1,-130},
++      {0x222,0x232,2,1},
++      {0x23a,0x23a,-1,10795},
++      {0x23b,0x23b,-1,1},
++      {0x23d,0x23d,-1,-163},
++      {0x23e,0x23e,-1,10792},
++      {0x241,0x241,-1,1},
++      {0x243,0x243,-1,-195},
++      {0x244,0x244,-1,69},
++      {0x245,0x245,-1,71},
++      {0x246,0x24e,2,1},
++      {0x370,0x372,2,1},
++      {0x376,0x376,-1,1},
++      {0x386,0x386,-1,38},
++      {0x388,0x38a,1,37},
++      {0x38c,0x38c,-1,64},
++      {0x38e,0x38f,1,63},
++      {0x391,0x3a1,1,32},
++      {0x3a3,0x3ab,1,32},
++      {0x3cf,0x3cf,-1,8},
++      {0x3d8,0x3ee,2,1},
++      {0x3f4,0x3f4,-1,-60},
++      {0x3f7,0x3f7,-1,1},
++      {0x3f9,0x3f9,-1,-7},
++      {0x3fa,0x3fa,-1,1},
++      {0x3fd,0x3ff,1,-130},
++      {0x400,0x40f,1,80},
++      {0x410,0x42f,1,32},
++      {0x460,0x480,2,1},
++      {0x48a,0x4be,2,1},
++      {0x4c0,0x4c0,-1,15},
++      {0x4c1,0x4cd,2,1},
++      {0x4d0,0x524,2,1},
++      {0x531,0x556,1,48},
++      {0x10a0,0x10c5,1,7264},
++      {0x1e00,0x1e94,2,1},
++      {0x1e9e,0x1e9e,-1,-7615},
++      {0x1ea0,0x1efe,2,1},
++      {0x1f08,0x1f0f,1,-8},
++      {0x1f18,0x1f1d,1,-8},
++      {0x1f28,0x1f2f,1,-8},
++      {0x1f38,0x1f3f,1,-8},
++      {0x1f48,0x1f4d,1,-8},
++      {0x1f59,0x1f5f,2,-8},
++      {0x1f68,0x1f6f,1,-8},
++      {0x1f88,0x1f8f,1,-8},
++      {0x1f98,0x1f9f,1,-8},
++      {0x1fa8,0x1faf,1,-8},
++      {0x1fb8,0x1fb9,1,-8},
++      {0x1fba,0x1fbb,1,-74},
++      {0x1fbc,0x1fbc,-1,-9},
++      {0x1fc8,0x1fcb,1,-86},
++      {0x1fcc,0x1fcc,-1,-9},
++      {0x1fd8,0x1fd9,1,-8},
++      {0x1fda,0x1fdb,1,-100},
++      {0x1fe8,0x1fe9,1,-8},
++      {0x1fea,0x1feb,1,-112},
++      {0x1fec,0x1fec,-1,-7},
++      {0x1ff8,0x1ff9,1,-128},
++      {0x1ffa,0x1ffb,1,-126},
++      {0x1ffc,0x1ffc,-1,-9},
++      {0x2126,0x2126,-1,-7517},
++      {0x212a,0x212a,-1,-8383},
++      {0x212b,0x212b,-1,-8262},
++      {0x2132,0x2132,-1,28},
++      {0x2160,0x216f,1,16},
++      {0x2183,0x2183,-1,1},
++      {0x24b6,0x24cf,1,26},
++      {0x2c00,0x2c2e,1,48},
++      {0x2c60,0x2c60,-1,1},
++      {0x2c62,0x2c62,-1,-10743},
++      {0x2c63,0x2c63,-1,-3814},
++      {0x2c64,0x2c64,-1,-10727},
++      {0x2c67,0x2c6b,2,1},
++      {0x2c6d,0x2c6d,-1,-10780},
++      {0x2c6e,0x2c6e,-1,-10749},
++      {0x2c6f,0x2c6f,-1,-10783},
++      {0x2c70,0x2c70,-1,-10782},
++      {0x2c72,0x2c75,3,1},
++      {0x2c7e,0x2c7f,1,-10815},
++      {0x2c80,0x2ce2,2,1},
++      {0x2ceb,0x2ced,2,1},
++      {0xa640,0xa65e,2,1},
++      {0xa662,0xa66c,2,1},
++      {0xa680,0xa696,2,1},
++      {0xa722,0xa72e,2,1},
++      {0xa732,0xa76e,2,1},
++      {0xa779,0xa77b,2,1},
++      {0xa77d,0xa77d,-1,-35332},
++      {0xa77e,0xa786,2,1},
++      {0xa78b,0xa78b,-1,1},
++      {0xff21,0xff3a,1,32},
++      {0x10400,0x10427,1,40}
+ };
  
- /*
-  * Redraw the corresponding portions of the screen.
-  */
--/*ARGSUSED*/
-     static gint
--expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
-+expose_event(GtkWidget *widget UNUSED,
-+           GdkEventExpose *event,
-+           gpointer data UNUSED)
+ static convertStruct toUpper[] =
  {
-     /* Skip this when the GUI isn't set up yet, will redraw later. */
-     if (gui.starting)
-       return FALSE;
-@@ -666,13 +678,14 @@ expose_event(GtkWidget *widget, GdkEvent
- #ifdef FEAT_CLIENTSERVER
- /*
-  * Handle changes to the "Comm" property
-  */
--/*ARGSUSED2*/
-     static gint
--property_event(GtkWidget *widget, GdkEventProperty *event, gpointer data)
-+property_event(GtkWidget *widget,
-+             GdkEventProperty *event,
-+             gpointer data UNUSED)
- {
-     if (event->type == GDK_PROPERTY_NOTIFY
-           && event->state == (int)GDK_PROPERTY_NEW_VALUE
-           && GDK_WINDOW_XWINDOW(event->window) == commWindow
-           && GET_X_ATOM(event->atom) == commProperty)
-@@ -738,13 +751,12 @@ gui_mch_stop_blink(void)
-     if (blink_state == BLINK_OFF)
-       gui_update_cursor(TRUE, FALSE);
-     blink_state = BLINK_NONE;
+-      {0x61,0x7a,1,-32}, {0xb5,0xb5,-1,743}, {0xe0,0xf6,1,-32},
+-      {0xf8,0xfe,1,-32}, {0xff,0xff,-1,121}, {0x101,0x12f,2,-1},
+-      {0x131,0x131,-1,-232}, {0x133,0x137,2,-1}, {0x13a,0x148,2,-1},
+-      {0x14b,0x177,2,-1}, {0x17a,0x17e,2,-1}, {0x17f,0x17f,-1,-300},
+-      {0x183,0x185,2,-1}, {0x188,0x18c,4,-1}, {0x192,0x192,-1,-1},
+-      {0x195,0x195,-1,97}, {0x199,0x199,-1,-1}, {0x19e,0x19e,-1,130},
+-      {0x1a1,0x1a5,2,-1}, {0x1a8,0x1ad,5,-1}, {0x1b0,0x1b4,4,-1},
+-      {0x1b6,0x1b9,3,-1}, {0x1bd,0x1bd,-1,-1}, {0x1bf,0x1bf,-1,56},
+-      {0x1c5,0x1c6,1,-1}, {0x1c8,0x1c9,1,-1}, {0x1cb,0x1cc,1,-1},
+-      {0x1ce,0x1dc,2,-1}, {0x1dd,0x1dd,-1,-79}, {0x1df,0x1ef,2,-1},
+-      {0x1f2,0x1f3,1,-1}, {0x1f5,0x1f9,4,-1}, {0x1fb,0x21f,2,-1},
+-      {0x223,0x233,2,-1}, {0x253,0x253,-1,-210}, {0x254,0x254,-1,-206},
+-      {0x256,0x257,1,-205}, {0x259,0x259,-1,-202}, {0x25b,0x25b,-1,-203},
+-      {0x260,0x260,-1,-205}, {0x263,0x263,-1,-207}, {0x268,0x268,-1,-209},
+-      {0x269,0x26f,6,-211}, {0x272,0x272,-1,-213}, {0x275,0x275,-1,-214},
+-      {0x280,0x283,3,-218}, {0x288,0x288,-1,-218}, {0x28a,0x28b,1,-217},
+-      {0x292,0x292,-1,-219}, {0x3ac,0x3ac,-1,-38}, {0x3ad,0x3af,1,-37},
+-      {0x3b1,0x3c1,1,-32}, {0x3c2,0x3c2,-1,-31}, {0x3c3,0x3cb,1,-32},
+-      {0x3cc,0x3cc,-1,-64}, {0x3cd,0x3ce,1,-63}, {0x3d0,0x3d0,-1,-62},
+-      {0x3d1,0x3d1,-1,-57}, {0x3d5,0x3d5,-1,-47}, {0x3d6,0x3d6,-1,-54},
+-      {0x3d9,0x3ef,2,-1}, {0x3f0,0x3f0,-1,-86}, {0x3f1,0x3f1,-1,-80},
+-      {0x3f2,0x3f2,-1,7}, {0x3f5,0x3f5,-1,-96}, {0x3f8,0x3fb,3,-1},
+-      {0x430,0x44f,1,-32}, {0x450,0x45f,1,-80}, {0x461,0x481,2,-1},
+-      {0x48b,0x4bf,2,-1}, {0x4c2,0x4ce,2,-1}, {0x4d1,0x4f5,2,-1},
+-      {0x4f9,0x501,8,-1}, {0x503,0x50f,2,-1}, {0x561,0x586,1,-48},
+-      {0x1e01,0x1e95,2,-1}, {0x1e9b,0x1e9b,-1,-59}, {0x1ea1,0x1ef9,2,-1},
+-      {0x1f00,0x1f07,1,8}, {0x1f10,0x1f15,1,8}, {0x1f20,0x1f27,1,8},
+-      {0x1f30,0x1f37,1,8}, {0x1f40,0x1f45,1,8}, {0x1f51,0x1f57,2,8},
+-      {0x1f60,0x1f67,1,8}, {0x1f70,0x1f71,1,74}, {0x1f72,0x1f75,1,86},
+-      {0x1f76,0x1f77,1,100}, {0x1f78,0x1f79,1,128}, {0x1f7a,0x1f7b,1,112},
+-      {0x1f7c,0x1f7d,1,126}, {0x1f80,0x1f87,1,8}, {0x1f90,0x1f97,1,8},
+-      {0x1fa0,0x1fa7,1,8}, {0x1fb0,0x1fb1,1,8}, {0x1fb3,0x1fb3,-1,9},
+-      {0x1fbe,0x1fbe,-1,-7205}, {0x1fc3,0x1fc3,-1,9}, {0x1fd0,0x1fd1,1,8},
+-      {0x1fe0,0x1fe1,1,8}, {0x1fe5,0x1fe5,-1,7}, {0x1ff3,0x1ff3,-1,9},
+-      {0xff41,0xff5a,1,-32}, {0x10428,0x1044f,1,-40}
++      {0x61,0x7a,1,-32},
++      {0xb5,0xb5,-1,743},
++      {0xe0,0xf6,1,-32},
++      {0xf8,0xfe,1,-32},
++      {0xff,0xff,-1,121},
++      {0x101,0x12f,2,-1},
++      {0x131,0x131,-1,-232},
++      {0x133,0x137,2,-1},
++      {0x13a,0x148,2,-1},
++      {0x14b,0x177,2,-1},
++      {0x17a,0x17e,2,-1},
++      {0x17f,0x17f,-1,-300},
++      {0x180,0x180,-1,195},
++      {0x183,0x185,2,-1},
++      {0x188,0x18c,4,-1},
++      {0x192,0x192,-1,-1},
++      {0x195,0x195,-1,97},
++      {0x199,0x199,-1,-1},
++      {0x19a,0x19a,-1,163},
++      {0x19e,0x19e,-1,130},
++      {0x1a1,0x1a5,2,-1},
++      {0x1a8,0x1ad,5,-1},
++      {0x1b0,0x1b4,4,-1},
++      {0x1b6,0x1b9,3,-1},
++      {0x1bd,0x1bd,-1,-1},
++      {0x1bf,0x1bf,-1,56},
++      {0x1c5,0x1c5,-1,-1},
++      {0x1c6,0x1c6,-1,-2},
++      {0x1c8,0x1c8,-1,-1},
++      {0x1c9,0x1c9,-1,-2},
++      {0x1cb,0x1cb,-1,-1},
++      {0x1cc,0x1cc,-1,-2},
++      {0x1ce,0x1dc,2,-1},
++      {0x1dd,0x1dd,-1,-79},
++      {0x1df,0x1ef,2,-1},
++      {0x1f2,0x1f2,-1,-1},
++      {0x1f3,0x1f3,-1,-2},
++      {0x1f5,0x1f9,4,-1},
++      {0x1fb,0x21f,2,-1},
++      {0x223,0x233,2,-1},
++      {0x23c,0x23c,-1,-1},
++      {0x23f,0x240,1,10815},
++      {0x242,0x247,5,-1},
++      {0x249,0x24f,2,-1},
++      {0x250,0x250,-1,10783},
++      {0x251,0x251,-1,10780},
++      {0x252,0x252,-1,10782},
++      {0x253,0x253,-1,-210},
++      {0x254,0x254,-1,-206},
++      {0x256,0x257,1,-205},
++      {0x259,0x259,-1,-202},
++      {0x25b,0x25b,-1,-203},
++      {0x260,0x260,-1,-205},
++      {0x263,0x263,-1,-207},
++      {0x268,0x268,-1,-209},
++      {0x269,0x269,-1,-211},
++      {0x26b,0x26b,-1,10743},
++      {0x26f,0x26f,-1,-211},
++      {0x271,0x271,-1,10749},
++      {0x272,0x272,-1,-213},
++      {0x275,0x275,-1,-214},
++      {0x27d,0x27d,-1,10727},
++      {0x280,0x283,3,-218},
++      {0x288,0x288,-1,-218},
++      {0x289,0x289,-1,-69},
++      {0x28a,0x28b,1,-217},
++      {0x28c,0x28c,-1,-71},
++      {0x292,0x292,-1,-219},
++      {0x345,0x345,-1,84},
++      {0x371,0x373,2,-1},
++      {0x377,0x377,-1,-1},
++      {0x37b,0x37d,1,130},
++      {0x3ac,0x3ac,-1,-38},
++      {0x3ad,0x3af,1,-37},
++      {0x3b1,0x3c1,1,-32},
++      {0x3c2,0x3c2,-1,-31},
++      {0x3c3,0x3cb,1,-32},
++      {0x3cc,0x3cc,-1,-64},
++      {0x3cd,0x3ce,1,-63},
++      {0x3d0,0x3d0,-1,-62},
++      {0x3d1,0x3d1,-1,-57},
++      {0x3d5,0x3d5,-1,-47},
++      {0x3d6,0x3d6,-1,-54},
++      {0x3d7,0x3d7,-1,-8},
++      {0x3d9,0x3ef,2,-1},
++      {0x3f0,0x3f0,-1,-86},
++      {0x3f1,0x3f1,-1,-80},
++      {0x3f2,0x3f2,-1,7},
++      {0x3f5,0x3f5,-1,-96},
++      {0x3f8,0x3fb,3,-1},
++      {0x430,0x44f,1,-32},
++      {0x450,0x45f,1,-80},
++      {0x461,0x481,2,-1},
++      {0x48b,0x4bf,2,-1},
++      {0x4c2,0x4ce,2,-1},
++      {0x4cf,0x4cf,-1,-15},
++      {0x4d1,0x525,2,-1},
++      {0x561,0x586,1,-48},
++      {0x1d79,0x1d79,-1,35332},
++      {0x1d7d,0x1d7d,-1,3814},
++      {0x1e01,0x1e95,2,-1},
++      {0x1e9b,0x1e9b,-1,-59},
++      {0x1ea1,0x1eff,2,-1},
++      {0x1f00,0x1f07,1,8},
++      {0x1f10,0x1f15,1,8},
++      {0x1f20,0x1f27,1,8},
++      {0x1f30,0x1f37,1,8},
++      {0x1f40,0x1f45,1,8},
++      {0x1f51,0x1f57,2,8},
++      {0x1f60,0x1f67,1,8},
++      {0x1f70,0x1f71,1,74},
++      {0x1f72,0x1f75,1,86},
++      {0x1f76,0x1f77,1,100},
++      {0x1f78,0x1f79,1,128},
++      {0x1f7a,0x1f7b,1,112},
++      {0x1f7c,0x1f7d,1,126},
++      {0x1f80,0x1f87,1,8},
++      {0x1f90,0x1f97,1,8},
++      {0x1fa0,0x1fa7,1,8},
++      {0x1fb0,0x1fb1,1,8},
++      {0x1fb3,0x1fb3,-1,9},
++      {0x1fbe,0x1fbe,-1,-7205},
++      {0x1fc3,0x1fc3,-1,9},
++      {0x1fd0,0x1fd1,1,8},
++      {0x1fe0,0x1fe1,1,8},
++      {0x1fe5,0x1fe5,-1,7},
++      {0x1ff3,0x1ff3,-1,9},
++      {0x214e,0x214e,-1,-28},
++      {0x2170,0x217f,1,-16},
++      {0x2184,0x2184,-1,-1},
++      {0x24d0,0x24e9,1,-26},
++      {0x2c30,0x2c5e,1,-48},
++      {0x2c61,0x2c61,-1,-1},
++      {0x2c65,0x2c65,-1,-10795},
++      {0x2c66,0x2c66,-1,-10792},
++      {0x2c68,0x2c6c,2,-1},
++      {0x2c73,0x2c76,3,-1},
++      {0x2c81,0x2ce3,2,-1},
++      {0x2cec,0x2cee,2,-1},
++      {0x2d00,0x2d25,1,-7264},
++      {0xa641,0xa65f,2,-1},
++      {0xa663,0xa66d,2,-1},
++      {0xa681,0xa697,2,-1},
++      {0xa723,0xa72f,2,-1},
++      {0xa733,0xa76f,2,-1},
++      {0xa77a,0xa77c,2,-1},
++      {0xa77f,0xa787,2,-1},
++      {0xa78c,0xa78c,-1,-1},
++      {0xff41,0xff5a,1,-32},
++      {0x10428,0x1044f,1,-40}
+ };
+ /*
+  * Return the upper-case equivalent of "a", which is a UCS-4 character.  Use
+  * simple case folding.
+@@ -2415,17 +3186,17 @@ show_utf8()
  }
  
+ /*
+  * mb_head_off() function pointer.
+  * Return offset from "p" to the first byte of the character it points into.
++ * If "p" points to the NUL at the end of the string return 0.
+  * Returns 0 when already at the first byte of a character.
+  */
 -/*ARGSUSED*/
-     static gint
--blink_cb(gpointer data)
-+blink_cb(gpointer data UNUSED)
+     int
+ latin_head_off(base, p)
+-    char_u    *base;
+-    char_u    *p;
++    char_u    *base UNUSED;
++    char_u    *p UNUSED;
  {
-     if (blink_state == BLINK_ON)
-     {
-       gui_undraw_cursor();
-       blink_state = BLINK_OFF;
-@@ -779,13 +791,14 @@ gui_mch_start_blink(void)
-       blink_state = BLINK_ON;
-       gui_update_cursor(TRUE, FALSE);
-     }
+     return 0;
  }
  
--/*ARGSUSED*/
-     static gint
--enter_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
-+enter_notify_event(GtkWidget *widget UNUSED,
-+                 GdkEventCrossing *event UNUSED,
-+                 gpointer data UNUSED)
+     int
+@@ -2435,11 +3206,11 @@ dbcs_head_off(base, p)
  {
-     if (blink_state == BLINK_NONE)
-       gui_mch_start_blink();
+     char_u    *q;
  
-     /* make sure keyboard input goes there */
-@@ -793,23 +806,25 @@ enter_notify_event(GtkWidget *widget, Gd
-       gtk_widget_grab_focus(gui.drawarea);
+     /* It can't be a trailing byte when not using DBCS, at the start of the
+      * string or the previous byte can't start a double-byte. */
+-    if (p <= base || MB_BYTE2LEN(p[-1]) == 1)
++    if (p <= base || MB_BYTE2LEN(p[-1]) == 1 || *p == NUL)
+       return 0;
  
-     return FALSE;
- }
+     /* This is slow: need to start at the base and go forward until the
+      * byte we are looking for.  Return 1 when we went past it, 0 otherwise. */
+     q = base;
+@@ -2463,11 +3234,12 @@ dbcs_screen_head_off(base, p)
+      * string or the previous byte can't start a double-byte.
+      * For euc-jp an 0x8e byte in the previous cell always means we have a
+      * lead byte in the current cell. */
+     if (p <= base
+           || (enc_dbcs == DBCS_JPNU && p[-1] == 0x8e)
+-          || MB_BYTE2LEN(p[-1]) == 1)
++          || MB_BYTE2LEN(p[-1]) == 1
++          || *p == NUL)
+       return 0;
  
--/*ARGSUSED*/
-     static gint
--leave_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
-+leave_notify_event(GtkWidget *widget UNUSED,
-+                 GdkEventCrossing *event UNUSED,
-+                 gpointer data UNUSED)
+     /* This is slow: need to start at the base and go forward until the
+      * byte we are looking for.  Return 1 when we went past it, 0 otherwise.
+      * For DBCS_JPNU look out for 0x8e, which means the second byte is not
+@@ -2489,10 +3261,11 @@ utf_head_off(base, p)
+     char_u    *p;
  {
-     if (blink_state != BLINK_NONE)
-       gui_mch_stop_blink();
+     char_u    *q;
+     char_u    *s;
+     int               c;
++    int               len;
+ #ifdef FEAT_ARABIC
+     char_u    *j;
+ #endif
  
-     return FALSE;
- }
+     if (*p < 0x80)            /* be quick for ASCII */
+@@ -2508,12 +3281,12 @@ utf_head_off(base, p)
+       /* Move q to the first byte of this char. */
+       while (q > base && (*q & 0xc0) == 0x80)
+           --q;
+       /* Check for illegal sequence. Do allow an illegal byte after where we
+        * started. */
+-      if (utf8len_tab[*q] != (int)(s - q + 1)
+-                                     && utf8len_tab[*q] != (int)(p - q + 1))
++      len = utf8len_tab[*q];
++      if (len != (int)(s - q + 1) && len != (int)(p - q + 1))
+           return 0;
  
--/*ARGSUSED*/
-     static gint
--focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
-+focus_in_event(GtkWidget *widget,
-+             GdkEventFocus *event UNUSED,
-+             gpointer data UNUSED)
- {
-     gui_focus_change(TRUE);
+       if (q <= base)
+           break;
  
-     if (blink_state == BLINK_NONE)
-       gui_mch_start_blink();
-@@ -824,13 +839,14 @@ focus_in_event(GtkWidget *widget, GdkEve
-       gtk_main_quit();
+@@ -2538,11 +3311,10 @@ utf_head_off(base, p)
+     }
  
-     return TRUE;
+     return (int)(p - q);
  }
  
--/*ARGSUSED*/
-     static gint
--focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
-+focus_out_event(GtkWidget *widget UNUSED,
-+              GdkEventFocus *event UNUSED,
-+              gpointer data UNUSED)
- {
-     gui_focus_change(FALSE);
+-#if defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * Copy a character from "*fp" to "*tp" and advance the pointers.
+  */
+     void
+ mb_copy_char(fp, tp)
+@@ -2553,11 +3325,10 @@ mb_copy_char(fp, tp)
  
-     if (blink_state != BLINK_NONE)
-       gui_mch_stop_blink();
-@@ -954,13 +970,14 @@ modifiers_gdk2mouse(guint state)
+     mch_memmove(*tp, *fp, (size_t)l);
+     *tp += l;
+     *fp += l;
  }
+-#endif
  
  /*
-  * Main keyboard handler:
+  * Return the offset from "p" to the first byte of a character.  When "p" is
+  * at the start of a character 0 is returned, otherwise the offset to the next
+  * character.  Can start anywhere in a stream of bytes.
+@@ -2723,13 +3494,13 @@ utf_valid_string(s, end)
+     int               l;
+     char_u    *p = s;
+     while (end == NULL ? *p != NUL : p < end)
+     {
+-      if ((*p & 0xc0) == 0x80)
++      l = utf8len_tab_zero[*p];
++      if (l == 0)
+           return FALSE;       /* invalid lead byte */
+-      l = utf8len_tab[*p];
+       if (end != NULL && p + l > end)
+           return FALSE;       /* incomplete byte sequence */
+       ++p;
+       while (--l > 0)
+           if ((*p++ & 0xc0) != 0x80)
+@@ -3131,11 +3902,11 @@ enc_locale()
+           s = buf + 10;
+       }
+       else
+           s = p + 1;
+     }
+-    for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i)
++    for (i = 0; s[i] != NUL && i < (int)sizeof(buf) - 1; ++i)
+     {
+       if (s[i] == '_' || s[i] == '-')
+           buf[i] = '-';
+       else if (isalnum((int)s[i]))
+           buf[i] = TOLOWER_ASC(s[i]);
+@@ -3178,11 +3949,11 @@ encname2codepage(name)
+ }
+ #endif
+ # if defined(USE_ICONV) || defined(PROTO)
+-static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp));
++static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp, int *resultlenp));
+ /*
+  * Call iconv_open() with a check if iconv() works properly (there are broken
+  * versions).
+  * Returns (void *)-1 if failed.
+@@ -3239,17 +4010,19 @@ my_iconv_open(to, from)
+ /*
+  * Convert the string "str[slen]" with iconv().
+  * If "unconvlenp" is not NULL handle the string ending in an incomplete
+  * sequence and set "*unconvlenp" to the length of it.
+  * Returns the converted string in allocated memory.  NULL for an error.
++ * If resultlenp is not NULL, sets it to the result length in bytes.
   */
--/*ARGSUSED*/
-     static gint
--key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
-+key_press_event(GtkWidget *widget UNUSED,
-+              GdkEventKey *event,
-+              gpointer data UNUSED)
+     static char_u *
+-iconv_string(vcp, str, slen, unconvlenp)
++iconv_string(vcp, str, slen, unconvlenp, resultlenp)
+     vimconv_T *vcp;
+     char_u    *str;
+     int               slen;
+     int               *unconvlenp;
++    int               *resultlenp;
  {
- #ifdef HAVE_GTK2
-     /* 256 bytes is way over the top, but for safety let's reduce it only
-      * for GTK+ 2 where we know for sure how large the string might get.
-      * (That is, up to 6 bytes + NUL + CSI escapes + safety measure.) */
-@@ -1223,13 +1240,14 @@ key_press_event(GtkWidget *widget, GdkEv
-     return TRUE;
+     const char        *from;
+     size_t    fromlen;
+     char      *to;
+     size_t    tolen;
+@@ -3331,10 +4104,13 @@ iconv_string(vcp, str, slen, unconvlenp)
+           break;
+       }
+       /* Not enough room or skipping illegal sequence. */
+       done = to - (char *)result;
+     }
++
++    if (resultlenp != NULL)
++      *resultlenp = (int)(to - (char *)result);
+     return result;
  }
  
- #if defined(FEAT_XIM) && defined(HAVE_GTK2)
+ #  if defined(DYNAMIC_ICONV) || defined(PROTO)
+ /*
+@@ -3582,13 +4358,14 @@ im_show_info(void)
+ /*
+  * Callback invoked when the user finished preediting.
+  * Put the final string into the input buffer.
+  */
 -/*ARGSUSED0*/
-     static gboolean
--key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
-+key_release_event(GtkWidget *widget UNUSED,
-+                GdkEventKey *event,
-+                gpointer data UNUSED)
+     static void
+-im_commit_cb(GtkIMContext *context, const gchar *str, gpointer data)
++im_commit_cb(GtkIMContext *context UNUSED,
++           const gchar *str,
++           gpointer data UNUSED)
  {
-     /*
-      * GTK+ 2 input methods may do fancy stuff on key release events too.
-      * With the default IM for instance, you can enter any UCS code point
-      * by holding down CTRL-SHIFT and typing hexadecimal digits.
-@@ -1241,15 +1259,14 @@ key_release_event(GtkWidget *widget, Gdk
+     int       slen = (int)STRLEN(str);
+     int       add_to_input = TRUE;
+     int       clen;
+     int       len = slen;
+@@ -3670,13 +4447,12 @@ im_commit_cb(GtkIMContext *context, cons
+ }
  
- /****************************************************************************
-  * Selection handlers:
+ /*
+  * Callback invoked after start to the preedit.
   */
 -/*ARGSUSED*/
-     static gint
--selection_clear_event(GtkWidget               *widget,
-+selection_clear_event(GtkWidget               *widget UNUSED,
-                     GdkEventSelection *event,
--                    gpointer          user_data)
-+                    gpointer          user_data UNUSED)
+     static void
+-im_preedit_start_cb(GtkIMContext *context, gpointer data)
++im_preedit_start_cb(GtkIMContext *context UNUSED, gpointer data UNUSED)
  {
-     if (event->selection == clip_plus.gtk_sel_atom)
-       clip_lose_selection(&clip_plus);
-     else
-       clip_lose_selection(&clip_star);
-@@ -1263,16 +1280,15 @@ selection_clear_event(GtkWidget                *widget
- #define RS_NONE       0       /* selection_received_cb() not called yet */
- #define RS_OK 1       /* selection_received_cb() called and OK */
- #define RS_FAIL       2       /* selection_received_cb() called and failed */
- static int received_selection = RS_NONE;
+ #ifdef XIM_DEBUG
+     xim_log("im_preedit_start_cb()\n");
+ #endif
+@@ -3687,13 +4463,12 @@ im_preedit_start_cb(GtkIMContext *contex
+ }
  
+ /*
+  * Callback invoked after end to the preedit.
+  */
 -/*ARGSUSED*/
      static void
--selection_received_cb(GtkWidget               *widget,
-+selection_received_cb(GtkWidget               *widget UNUSED,
-                     GtkSelectionData  *data,
--                    guint             time_,
--                    gpointer          user_data)
-+                    guint             time_ UNUSED,
-+                    gpointer          user_data UNUSED)
+-im_preedit_end_cb(GtkIMContext *context, gpointer data)
++im_preedit_end_cb(GtkIMContext *context UNUSED, gpointer data UNUSED)
  {
-     VimClipboard    *cbd;
-     char_u        *text;
-     char_u        *tmpbuf = NULL;
- #ifdef HAVE_GTK2
-@@ -1350,10 +1366,28 @@ selection_received_cb(GtkWidget                *widget
-                   text = tmpbuf;
-           }
-           else
-               text = tmpbuf_utf8;
-       }
-+      else if (len >= 2 && text[0] == 0xff && text[1] == 0xfe)
-+      {
-+          vimconv_T conv;
-+
-+          /* UTF-16, we get this for HTML */
-+          conv.vc_type = CONV_NONE;
-+          convert_setup_ext(&conv, (char_u *)"utf-16le", FALSE, p_enc, TRUE);
-+
-+          if (conv.vc_type != CONV_NONE)
-+          {
-+              text += 2;
-+              len -= 2;
-+              tmpbuf = string_convert(&conv, text, &len);
-+              convert_setup(&conv, NULL, NULL);
-+          }
-+          if (tmpbuf != NULL)
-+              text = tmpbuf;
-+      }
-     }
- #else /* !HAVE_GTK2 */
- # ifdef FEAT_MBYTE
-     else if (data->type == utf8_string_atom)
-     {
-@@ -1412,17 +1446,16 @@ selection_received_cb(GtkWidget                *widget
- /*
-  * Prepare our selection data for passing it to the external selection
-  * client.
+ #ifdef XIM_DEBUG
+     xim_log("im_preedit_end_cb()\n");
+ #endif
+     im_delete_preedit();
+@@ -3748,13 +4523,12 @@ im_preedit_end_cb(GtkIMContext *context,
+  * at the receiving end of the queue.  This, however, would have a rather large
+  * impact on the code base.  If there is an easy way to force processing of all
+  * remaining input from within the "retrieve_surrounding" signal handler, this
+  * might not be necessary.  Gotta ask on vim-dev for opinions.
   */
--/*ARGSUSED*/
+-/*ARGSUSED1*/
      static void
--selection_get_cb(GtkWidget        *widget,
-+selection_get_cb(GtkWidget        *widget UNUSED,
-                GtkSelectionData   *selection_data,
-                guint              info,
--               guint              time_,
--               gpointer           user_data)
-+               guint              time_ UNUSED,
-+               gpointer           user_data UNUSED)
+-im_preedit_changed_cb(GtkIMContext *context, gpointer data)
++im_preedit_changed_cb(GtkIMContext *context, gpointer data UNUSED)
  {
-     char_u        *string;
-     char_u        *tmpbuf;
-     long_u        tmplen;
-     int                   length;
-@@ -1438,10 +1471,11 @@ selection_get_cb(GtkWidget         *widget,
-     if (!cbd->owned)
-       return;                 /* Shouldn't ever happen */
-     if (info != (guint)TARGET_STRING
- #ifdef FEAT_MBYTE
-+          && (!clip_html || info != (guint)TARGET_HTML)
-           && info != (guint)TARGET_UTF8_STRING
-           && info != (guint)TARGET_VIMENC
+     char    *preedit_string = NULL;
+     int           cursor_index    = 0;
+     int           num_move_back   = 0;
+     char_u  *str;
+@@ -4616,15 +5390,14 @@ xim_set_focus(focus)
  #endif
-           && info != (guint)TARGET_VIM
-           && info != (guint)TARGET_COMPOUND_TEXT
-@@ -1473,10 +1507,44 @@ selection_get_cb(GtkWidget         *widget,
-       string = tmpbuf;
-       type = vim_atom;
+       }
      }
- #ifdef FEAT_MBYTE
-+    else if (info == (guint)TARGET_HTML)
-+    {
-+      vimconv_T conv;
-+
-+      /* Since we get utf-16, we probably should set it as well. */
-+      conv.vc_type = CONV_NONE;
-+      convert_setup_ext(&conv, p_enc, TRUE, (char_u *)"utf-16le", FALSE);
-+      if (conv.vc_type != CONV_NONE)
-+      {
-+          tmpbuf = string_convert(&conv, string, &length);
-+          convert_setup(&conv, NULL, NULL);
-+          vim_free(string);
-+          string = tmpbuf;
-+      }
-+
-+      /* Prepend the BOM: "fffe" */
-+      if (string != NULL)
-+      {
-+          tmpbuf = alloc(length + 2);
-+          tmpbuf[0] = 0xff;
-+          tmpbuf[1] = 0xfe;
-+          mch_memmove(tmpbuf + 2, string, (size_t)length);
-+          vim_free(string);
-+          string = tmpbuf;
-+          length += 2;
-+
-+          selection_data->type = selection_data->target;
-+          selection_data->format = 16;        /* 16 bits per char */
-+          gtk_selection_data_set(selection_data, html_atom, 16,
-+                                                            string, length);
-+          vim_free(string);
-+      }
-+      return;
-+    }
-     else if (info == (guint)TARGET_VIMENC)
-     {
-       int l = STRLEN(p_enc);
-       /* contents: motion_type 'encoding' NUL text */
-@@ -1676,11 +1744,11 @@ process_motion_notify(int x, int y, GdkM
-       dx = x < 0 ? -x : x - gui.drawarea->allocation.width;
-       dy = y < 0 ? -y : y - gui.drawarea->allocation.height;
-       offshoot = dx > dy ? dx : dy;
--      /* Make a linearly declaying timer delay with a threshold of 5 at a
-+      /* Make a linearly decaying timer delay with a threshold of 5 at a
-        * distance of 127 pixels from the main window.
-        *
-        * One could think endlessly about the most ergonomic variant here.
-        * For example it could make sense to calculate the distance from the
-        * drags start instead...
-@@ -1705,13 +1773,12 @@ process_motion_notify(int x, int y, GdkM
  }
  
- /*
-  * Timer used to recognize multiple clicks of the mouse button.
-  */
--/*ARGSUSED0*/
-     static gint
--motion_repeat_timer_cb(gpointer data)
-+motion_repeat_timer_cb(gpointer data UNUSED)
+-/*ARGSUSED*/
+     void
+ im_set_position(row, col)
+-    int               row;
+-    int               col;
++    int               row UNUSED;
++    int               col UNUSED;
  {
-     int                   x;
-     int                   y;
-     GdkModifierType state;
-@@ -1747,13 +1814,14 @@ motion_repeat_timer_cb(gpointer data)
-     /* Don't happen again.  We will get reinstalled in the synthetic event
-      * if needed -- thus repeating should still work. */
-     return FALSE;
+     xim_set_preedit();
  }
  
--/*ARGSUSED2*/
-     static gint
--motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
-+motion_notify_event(GtkWidget *widget,
-+                  GdkEventMotion *event,
-+                  gpointer data UNUSED)
- {
-     if (event->is_hint)
-     {
-       int             x;
-       int             y;
-@@ -1775,13 +1843,14 @@ motion_notify_event(GtkWidget *widget, G
- /*
-  * Mouse button handling.  Note please that we are capturing multiple click's
-  * by our own timeout mechanism instead of the one provided by GTK+ itself.
-  * This is due to the way the generic VIM code is recognizing multiple clicks.
-  */
--/*ARGSUSED2*/
-     static gint
--button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
-+button_press_event(GtkWidget *widget,
-+                 GdkEventButton *event,
-+                 gpointer data UNUSED)
- {
-     int button;
-     int repeated_click = FALSE;
-     int x, y;
-     int_u vim_modifiers;
-@@ -1853,13 +1922,14 @@ button_press_event(GtkWidget *widget, Gd
- #ifdef HAVE_GTK2
  /*
-  * GTK+ 2 doesn't handle mouse buttons 4, 5, 6 and 7 the same way as GTK+ 1.
-  * Instead, it abstracts scrolling via the new GdkEventScroll.
-  */
--/*ARGSUSED2*/
-     static gboolean
--scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer data)
-+scroll_event(GtkWidget *widget,
-+           GdkEventScroll *event,
-+           gpointer data UNUSED)
- {
-     int           button;
-     int_u   vim_modifiers;
-     if (gtk_socket_id != 0 && !GTK_WIDGET_HAS_FOCUS(widget))
-@@ -1894,13 +1964,14 @@ scroll_event(GtkWidget *widget, GdkEvent
-     return TRUE;
- }
- #endif /* HAVE_GTK2 */
+@@ -4927,16 +5700,15 @@ static int xim_real_init __ARGS((Window
  
+ #ifdef USE_X11R6_XIM
+ static void xim_instantiate_cb __ARGS((Display *display, XPointer client_data, XPointer       call_data));
+ static void xim_destroy_cb __ARGS((XIM im, XPointer client_data, XPointer call_data));
  
 -/*ARGSUSED*/
-     static gint
--button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
-+button_release_event(GtkWidget *widget UNUSED,
-+                   GdkEventButton *event,
-+                   gpointer data UNUSED)
- {
-     int x, y;
-     int_u vim_modifiers;
-     /* Remove any motion "machine gun" timers used for automatic further
-@@ -2098,20 +2169,19 @@ drag_handle_text(GdkDragContext            *con
- }
- /*
-  * DND receiver.
-  */
--/*ARGSUSED2*/
      static void
- drag_data_received_cb(GtkWidget               *widget,
-                     GdkDragContext    *context,
-                     gint              x,
-                     gint              y,
-                     GtkSelectionData  *data,
-                     guint             info,
-                     guint             time_,
--                    gpointer          user_data)
-+                    gpointer          user_data UNUSED)
+ xim_instantiate_cb(display, client_data, call_data)
+     Display   *display;
+-    XPointer  client_data;
+-    XPointer  call_data;
++    XPointer  client_data UNUSED;
++    XPointer  call_data UNUSED;
  {
-     GdkModifierType state;
+     Window    x11_window;
+     Display   *x11_display;
  
-     /* Guard against trash */
-     if (data->data == NULL
-@@ -2141,11 +2211,10 @@ drag_data_received_cb(GtkWidget                *widget
- /*
-  * GnomeClient interact callback.  Check for unsaved buffers that cannot
-  * be abandoned and pop up a dialog asking the user for confirmation if
-  * necessary.
-  */
--/*ARGSUSED0*/
-     static void
- sm_client_check_changed_any(GnomeClient           *client,
-                           gint            key,
-                           GnomeDialogType type,
-                           gpointer        data)
-@@ -2249,11 +2318,10 @@ write_session_file(char_u *filename)
- /*
-  * "save_yourself" signal handler.  Initiate an interaction to ask the user
-  * for confirmation if necessary.  Save the current editing session and tell
-  * the session manager how to restart Vim.
-  */
--/*ARGSUSED1*/
-     static gboolean
- sm_client_save_yourself(GnomeClient       *client,
-                       gint                phase,
-                       GnomeSaveStyle      save_style,
-                       gboolean            shutdown,
-@@ -2337,11 +2405,10 @@ sm_client_save_yourself(GnomeClient
- /*
-  * Called when the session manager wants us to die.  There isn't much to save
-  * here since "save_yourself" has been emitted before (unless serious trouble
-  * is happening).
-  */
--/*ARGSUSED0*/
-     static void
- sm_client_die(GnomeClient *client, gpointer data)
- {
-     /* Don't write messages to the GUI anymore */
-     full_screen = FALSE;
-@@ -2377,14 +2444,13 @@ setup_save_yourself(void)
+ #ifdef XIM_DEBUG
+@@ -4952,16 +5724,15 @@ xim_instantiate_cb(display, client_data,
+     if (xic != NULL)
+       XUnregisterIMInstantiateCallback(x11_display, NULL, NULL, NULL,
+                                        xim_instantiate_cb, NULL);
+ }
  
- # ifdef USE_XSMP
- /*
-  * GTK tells us that XSMP needs attention
-  */
 -/*ARGSUSED*/
-     static gboolean
- local_xsmp_handle_requests(source, condition, data)
--    GIOChannel                *source;
-+    GIOChannel                *source UNUSED;
-     GIOCondition      condition;
-     gpointer          data;
- {
-     if (condition == G_IO_IN)
-     {
-@@ -2478,20 +2544,22 @@ setup_save_yourself(void)
-  *
-  * The GNOME session support is much cooler anyway.  Unlike this ugly
-  * WM_SAVE_YOURSELF hack it actually stores the session...  And yes,
-  * it should work with KDE as well.
-  */
--/*ARGSUSED1*/
-     static GdkFilterReturn
--global_event_filter(GdkXEvent *xev, GdkEvent *event, gpointer data)
-+global_event_filter(GdkXEvent *xev,
-+                  GdkEvent *event UNUSED,
-+                  gpointer data UNUSED)
- {
-     XEvent *xevent = (XEvent *)xev;
-     if (xevent != NULL
-           && xevent->type == ClientMessage
-           && xevent->xclient.message_type == GET_X_ATOM(wm_protocols_atom)
--          && xevent->xclient.data.l[0] == GET_X_ATOM(save_yourself_atom))
-+          && (long_u)xevent->xclient.data.l[0]
-+                                          == GET_X_ATOM(save_yourself_atom))
-     {
-       out_flush();
-       ml_sync_all(FALSE, FALSE); /* preserve all swap files */
-       /*
-        * Set the window's WM_COMMAND property, to let the window manager
-@@ -2510,11 +2578,10 @@ global_event_filter(GdkXEvent *xev, GdkE
- # else /* !HAVE_GTK2 */
- /*
-  * GDK handler for X ClientMessage events.
-  */
--/*ARGSUSED2*/
-     static GdkFilterReturn
- gdk_wm_protocols_filter(GdkXEvent *xev, GdkEvent *event, gpointer data)
+     static void
+ xim_destroy_cb(im, client_data, call_data)
+-    XIM               im;
+-    XPointer  client_data;
+-    XPointer  call_data;
++    XIM               im UNUSED;
++    XPointer  client_data UNUSED;
++    XPointer  call_data UNUSED;
  {
-     /* From example in gdkevents.c/gdk_wm_protocols_filter */
-     XEvent *xevent = (XEvent *)xev;
-@@ -2556,13 +2623,12 @@ gdk_wm_protocols_filter(GdkXEvent *xev,
+     Window    x11_window;
+     Display   *x11_display;
  
+ #ifdef XIM_DEBUG
+@@ -5276,13 +6047,14 @@ xim_decide_input_style()
+           supported_style &= ~(int)GDK_IM_STATUS_AREA;
+       xim_input_style = (int)gdk_im_decide_style((GdkIMStyle)supported_style);
+     }
+ }
  
- /*
-  * Setup the window icon & xcmdsrv comm after the main window has been realized.
-  */
 -/*ARGSUSED*/
      static void
--mainwin_realize(GtkWidget *widget, gpointer data)
-+mainwin_realize(GtkWidget *widget UNUSED, gpointer data UNUSED)
+-preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data)
++preedit_start_cbproc(XIC thexic UNUSED,
++                   XPointer client_data UNUSED,
++                   XPointer call_data UNUSED)
  {
- /* If you get an error message here, you still need to unpack the runtime
-  * archive! */
- #ifdef magick
- # undef magick
-@@ -2710,15 +2776,14 @@ create_blank_pointer(void)
+ #ifdef XIM_DEBUG
+     xim_log("xim_decide_input_style()\n");
+ #endif
  
-     return cursor;
+@@ -5310,13 +6082,14 @@ xim_back_delete(int n)
  }
  
- #ifdef HAVE_GTK_MULTIHEAD
--/*ARGSUSED1*/
-     static void
- mainwin_screen_changed_cb(GtkWidget  *widget,
--                        GdkScreen  *previous_screen,
--                        gpointer   data)
-+                        GdkScreen  *previous_screen UNUSED,
-+                        gpointer   data UNUSED)
- {
-     if (!gtk_widget_has_screen(widget))
-       return;
+ static GSList *key_press_event_queue = NULL;
+ static gboolean processing_queued_event = FALSE;
  
-     /*
-@@ -2755,13 +2820,12 @@ mainwin_screen_changed_cb(GtkWidget  *wi
-  * dummy blank cursor.
-  *
-  * Don't try to set any VIM scrollbar sizes anywhere here. I'm relying on the
-  * fact that the main VIM engine doesn't take them into account anywhere.
-  */
--/*ARGSUSED1*/
+-/*ARGSUSED*/
      static void
--drawarea_realize_cb(GtkWidget *widget, gpointer data)
-+drawarea_realize_cb(GtkWidget *widget, gpointer data UNUSED)
+-preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data)
++preedit_draw_cbproc(XIC thexic UNUSED,
++                  XPointer client_data UNUSED,
++                  XPointer call_data)
  {
-     GtkWidget *sbar;
+     XIMPreeditDrawCallbackStruct *draw_data;
+     XIMText   *text;
+     char      *src;
+     GSList    *event_queue;
+@@ -5384,11 +6157,11 @@ preedit_draw_cbproc(XIC xic, XPointer cl
+               {
+                   if (draw_feedback == NULL)
+                       draw_feedback = (char *)alloc(draw_data->chg_first
+                                                             + text->length);
+                   else
+-                      draw_feedback = realloc(draw_feedback,
++                      draw_feedback = vim_realloc(draw_feedback,
+                                        draw_data->chg_first + text->length);
+                   if (draw_feedback != NULL)
+                   {
+                       draw_feedback[nfeedback + draw_data->chg_first]
+                                      = draw_data->text->feedback[nfeedback];
+@@ -5451,22 +6224,24 @@ im_get_feedback_attr(int col)
+     }
  
- #ifdef FEAT_XIM
-     xim_init();
-@@ -2787,13 +2851,12 @@ drawarea_realize_cb(GtkWidget *widget, g
+     return -1;
  }
  
- /*
-  * Properly clean up on shutdown.
-  */
--/*ARGSUSED0*/
+-/*ARGSUSED*/
      static void
--drawarea_unrealize_cb(GtkWidget *widget, gpointer data)
-+drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED)
+-preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data)
++preedit_caret_cbproc(XIC thexic UNUSED,
++                   XPointer client_data UNUSED,
++                   XPointer call_data UNUSED)
  {
-     /* Don't write messages to the GUI anymore */
-     full_screen = FALSE;
- #ifdef FEAT_XIM
-@@ -2825,26 +2888,26 @@ drawarea_unrealize_cb(GtkWidget *widget,
-     gdk_cursor_destroy(gui.blank_pointer);
-     gui.blank_pointer = NULL;
+ #ifdef XIM_DEBUG
+     xim_log("preedit_caret_cbproc()\n");
  #endif
  }
  
--/*ARGSUSED0*/
+-/*ARGSUSED*/
      static void
--drawarea_style_set_cb(GtkWidget       *widget,
--                    GtkStyle  *previous_style,
--                    gpointer  data)
-+drawarea_style_set_cb(GtkWidget       *widget UNUSED,
-+                    GtkStyle  *previous_style UNUSED,
-+                    gpointer  data UNUSED)
+-preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data)
++preedit_done_cbproc(XIC thexic UNUSED,
++                  XPointer client_data UNUSED,
++                  XPointer call_data UNUSED)
  {
-     gui_mch_new_colors();
+ #ifdef XIM_DEBUG
+     xim_log("preedit_done_cbproc()\n");
+ #endif
+@@ -5501,13 +6276,12 @@ xim_reset(void)
+       if (text != NULL)
+           XFree(text);
+     }
  }
  
- /*
-  * Callback routine for the "delete_event" signal on the toplevel window.
-  * Tries to vim gracefully, or refuses to exit with changed buffers.
-  */
 -/*ARGSUSED*/
-     static gint
--delete_event_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
-+delete_event_cb(GtkWidget *widget UNUSED,
-+              GdkEventAny *event UNUSED,
-+              gpointer data UNUSED)
+     int
+-xim_queue_key_press_event(GdkEventKey *event, int down)
++xim_queue_key_press_event(GdkEventKey *event, int down UNUSED)
  {
-     gui_shell_closed();
+ #ifdef XIM_DEBUG
+     xim_log("xim_queue_key_press_event()\n");
+ #endif
+@@ -5519,13 +6293,12 @@ xim_queue_key_press_event(GdkEventKey *e
+     key_press_event_queue = g_slist_append(key_press_event_queue,
+                                          gdk_event_copy((GdkEvent *)event));
      return TRUE;
  }
  
-@@ -2962,11 +3025,11 @@ update_window_manager_hints(int force_wi
-     int min_width;
-     int min_height;
-     /* At start-up, don't try to set the hints until the initial
-      * values have been used (those that dictate our initial size)
--     * Let forced (i.e., correct) values thruogh always.
-+     * Let forced (i.e., correct) values through always.
-      */
-     if (!(force_width && force_height)  &&  init_window_hints_state > 0)
-     {
-       /* Don't do it! */
-       init_window_hints_state = 2;
-@@ -3140,13 +3203,12 @@ static GtkTooltips *tabline_tooltip;
- static int clicked_page;          /* page clicked in tab line */
- /*
-  * Handle selecting an item in the tab line popup menu.
-  */
 -/*ARGSUSED*/
      static void
--tabline_menu_handler(GtkMenuItem *item, gpointer user_data)
-+tabline_menu_handler(GtkMenuItem *item UNUSED, gpointer user_data)
+-preedit_callback_setup(GdkIC *ic)
++preedit_callback_setup(GdkIC *ic UNUSED)
  {
-     /* Add the string cmd into input buffer */
-     send_tabline_menu_event(clicked_page, (int)(long)user_data);
-     if (gtk_main_level() > 0)
-@@ -3242,17 +3304,16 @@ on_tabline_menu(GtkWidget *widget, GdkEv
+     XIC xxic;
+     XVaNestedList preedit_attr;
+     XIMCallback preedit_start_cb;
+     XIMCallback preedit_draw_cb;
+@@ -5546,13 +6319,12 @@ preedit_callback_setup(GdkIC *ic)
+                              NULL);
+     XSetICValues(xxic, XNPreeditAttributes, preedit_attr, NULL);
+     XFree(preedit_attr);
  }
  
- /*
-  * Handle selecting one of the tabs.
-  */
 -/*ARGSUSED*/
      static void
- on_select_tab(
--      GtkNotebook     *notebook,
--      GtkNotebookPage *page,
-+      GtkNotebook     *notebook UNUSED,
-+      GtkNotebookPage *page UNUSED,
-       gint            idx,
--      gpointer        data)
-+      gpointer        data UNUSED)
+-reset_state_setup(GdkIC *ic)
++reset_state_setup(GdkIC *ic UNUSED)
  {
-     if (!ignore_tabline_evt)
-     {
-       if (send_tabline_event(idx + 1) && gtk_main_level() > 0)
-           gtk_main_quit();
-@@ -3458,10 +3519,11 @@ gui_mch_init(void)
-     /* LINTED: avoid warning: conversion to 'unsigned long' */
-     gui.spcolor = g_new0(GdkColor, 1);
+ #ifdef USE_X11R6_XIM
+     /* don't change the input context when we call reset */
+     XSetICValues(((GdkICPrivate *)ic)->xic, XNResetState, XIMPreserveState,
+                                                                       NULL);
+@@ -5754,12 +6526,29 @@ im_is_preediting()
+ convert_setup(vcp, from, to)
+     vimconv_T *vcp;
+     char_u    *from;
+     char_u    *to;
+ {
++    return convert_setup_ext(vcp, from, TRUE, to, TRUE);
++}
++
++/*
++ * As convert_setup(), but only when from_unicode_is_utf8 is TRUE will all
++ * "from" unicode charsets be considered utf-8.  Same for "to".
++ */
++    int
++convert_setup_ext(vcp, from, from_unicode_is_utf8, to, to_unicode_is_utf8)
++    vimconv_T *vcp;
++    char_u    *from;
++    int               from_unicode_is_utf8;
++    char_u    *to;
++    int               to_unicode_is_utf8;
++{
+     int               from_prop;
+     int               to_prop;
++    int               from_is_utf8;
++    int               to_is_utf8;
  
-     /* Initialise atoms */
- #ifdef FEAT_MBYTE
-+    html_atom = gdk_atom_intern("text/html", FALSE);
-     utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
+     /* Reset to no conversion. */
+ # ifdef USE_ICONV
+     if (vcp->vc_type == CONV_ICONV && vcp->vc_fd != (iconv_t)-1)
+       iconv_close(vcp->vc_fd);
+@@ -5773,69 +6562,78 @@ convert_setup(vcp, from, to)
+                                                    || STRCMP(from, to) == 0)
+       return OK;
+     from_prop = enc_canon_props(from);
+     to_prop = enc_canon_props(to);
+-    if ((from_prop & ENC_LATIN1) && (to_prop & ENC_UNICODE))
++    if (from_unicode_is_utf8)
++      from_is_utf8 = from_prop & ENC_UNICODE;
++    else
++      from_is_utf8 = from_prop == ENC_UNICODE;
++    if (to_unicode_is_utf8)
++      to_is_utf8 = to_prop & ENC_UNICODE;
++    else
++      to_is_utf8 = to_prop == ENC_UNICODE;
++
++    if ((from_prop & ENC_LATIN1) && to_is_utf8)
+     {
+       /* Internal latin1 -> utf-8 conversion. */
+       vcp->vc_type = CONV_TO_UTF8;
+       vcp->vc_factor = 2;     /* up to twice as long */
+     }
+-    else if ((from_prop & ENC_LATIN9) && (to_prop & ENC_UNICODE))
++    else if ((from_prop & ENC_LATIN9) && to_is_utf8)
+     {
+       /* Internal latin9 -> utf-8 conversion. */
+       vcp->vc_type = CONV_9_TO_UTF8;
+       vcp->vc_factor = 3;     /* up to three as long (euro sign) */
+     }
+-    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN1))
++    else if (from_is_utf8 && (to_prop & ENC_LATIN1))
+     {
+       /* Internal utf-8 -> latin1 conversion. */
+       vcp->vc_type = CONV_TO_LATIN1;
+     }
+-    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN9))
++    else if (from_is_utf8 && (to_prop & ENC_LATIN9))
+     {
+       /* Internal utf-8 -> latin9 conversion. */
+       vcp->vc_type = CONV_TO_LATIN9;
+     }
+ #ifdef WIN3264
+     /* Win32-specific codepage <-> codepage conversion without iconv. */
+-    else if (((from_prop & ENC_UNICODE) || encname2codepage(from) > 0)
+-          && ((to_prop & ENC_UNICODE) || encname2codepage(to) > 0))
++    else if ((from_is_utf8 || encname2codepage(from) > 0)
++          && (to_is_utf8 || encname2codepage(to) > 0))
+     {
+       vcp->vc_type = CONV_CODEPAGE;
+       vcp->vc_factor = 2;     /* up to twice as long */
+-      vcp->vc_cpfrom = (from_prop & ENC_UNICODE) ? 0 : encname2codepage(from);
+-      vcp->vc_cpto = (to_prop & ENC_UNICODE) ? 0 : encname2codepage(to);
++      vcp->vc_cpfrom = from_is_utf8 ? 0 : encname2codepage(from);
++      vcp->vc_cpto = to_is_utf8 ? 0 : encname2codepage(to);
+     }
  #endif
- #ifndef HAVE_GTK2
-     compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE);
-     text_atom = gdk_atom_intern("TEXT", FALSE);
-@@ -3782,11 +3844,11 @@ gui_mch_init(void)
-     wm_protocols_atom = gdk_atom_intern("WM_PROTOCOLS", FALSE);
-     save_yourself_atom = gdk_atom_intern("WM_SAVE_YOURSELF", FALSE);
+ #ifdef MACOS_X
+     else if ((from_prop & ENC_MACROMAN) && (to_prop & ENC_LATIN1))
+     {
+       vcp->vc_type = CONV_MAC_LATIN1;
+     }
+-    else if ((from_prop & ENC_MACROMAN) && (to_prop & ENC_UNICODE))
++    else if ((from_prop & ENC_MACROMAN) && to_is_utf8)
+     {
+       vcp->vc_type = CONV_MAC_UTF8;
+       vcp->vc_factor = 2;     /* up to twice as long */
+     }
+     else if ((from_prop & ENC_LATIN1) && (to_prop & ENC_MACROMAN))
+     {
+       vcp->vc_type = CONV_LATIN1_MAC;
+     }
+-    else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_MACROMAN))
++    else if (from_is_utf8 && (to_prop & ENC_MACROMAN))
+     {
+       vcp->vc_type = CONV_UTF8_MAC;
+     }
  #endif
+ # ifdef USE_ICONV
+     else
+     {
+       /* Use iconv() for conversion. */
+       vcp->vc_fd = (iconv_t)my_iconv_open(
+-              (to_prop & ENC_UNICODE) ? (char_u *)"utf-8" : to,
+-              (from_prop & ENC_UNICODE) ? (char_u *)"utf-8" : from);
++              to_is_utf8 ? (char_u *)"utf-8" : to,
++              from_is_utf8 ? (char_u *)"utf-8" : from);
+       if (vcp->vc_fd != (iconv_t)-1)
+       {
+           vcp->vc_type = CONV_ICONV;
+           vcp->vc_factor = 4; /* could be longer too... */
+       }
+@@ -6003,16 +6801,24 @@ string_convert_ext(vcp, ptr, lenp, uncon
+           if (retval == NULL)
+               break;
+           d = retval;
+           for (i = 0; i < len; ++i)
+           {
+-              l = utf_ptr2len(ptr + i);
++              l = utf_ptr2len_len(ptr + i, len - i);
+               if (l == 0)
+                   *d++ = NUL;
+               else if (l == 1)
+               {
+-                  if (unconvlenp != NULL && utf8len_tab[ptr[i]] > len - i)
++                  int l_w = utf8len_tab_zero[ptr[i]];
++
++                  if (l_w == 0)
++                  {
++                      /* Illegal utf-8 byte cannot be converted */
++                      vim_free(retval);
++                      return NULL;
++                  }
++                  if (unconvlenp != NULL && l_w > len - i)
+                   {
+                       /* Incomplete sequence at the end. */
+                       *unconvlenp = len - i;
+                       break;
+                   }
+@@ -6087,13 +6893,11 @@ string_convert_ext(vcp, ptr, lenp, uncon
+           break;
+ # endif
  
-     if (gtk_socket_id != 0)
--      /* make sure keybord input can go to the drawarea */
-+      /* make sure keyboard input can go to the drawarea */
-       GTK_WIDGET_SET_FLAGS(gui.drawarea, GTK_CAN_FOCUS);
-     /*
-      * Set clipboard specific atoms
-      */
-@@ -3920,14 +3982,14 @@ gui_mch_new_colors(void)
- }
- /*
-  * This signal informs us about the need to rearrange our sub-widgets.
-  */
--/*ARGSUSED*/
-     static gint
--form_configure_event(GtkWidget *widget, GdkEventConfigure *event,
--                   gpointer data)
-+form_configure_event(GtkWidget *widget UNUSED,
-+                   GdkEventConfigure *event,
-+                   gpointer data UNUSED)
- {
-     int usable_height = event->height;
+ # ifdef USE_ICONV
+       case CONV_ICONV:        /* conversion with output_conv.vc_fd */
+-          retval = iconv_string(vcp, ptr, len, unconvlenp);
+-          if (retval != NULL && lenp != NULL)
+-              *lenp = (int)STRLEN(retval);
++          retval = iconv_string(vcp, ptr, len, unconvlenp, lenp);
+           break;
+ # endif
+ # ifdef WIN3264
+       case CONV_CODEPAGE:             /* codepage -> codepage */
+       {
+@@ -6101,33 +6905,33 @@ string_convert_ext(vcp, ptr, lenp, uncon
+           int         tmp_len;
+           short_u     *tmp;
  
-     /* When in a GtkPlug, we can't guarantee valid heights (as a round
-      * no. of char-heights), so we have to manually sanitise them.
-@@ -3946,13 +4008,12 @@ form_configure_event(GtkWidget *widget,
- /*
-  * Function called when window already closed.
-  * We can't do much more here than to trying to preserve what had been done,
-  * since the window is already inevitably going away.
-  */
--/*ARGSUSED0*/
-     static void
--mainwin_destroy_cb(GtkObject *object, gpointer data)
-+mainwin_destroy_cb(GtkObject *object UNUSED, gpointer data UNUSED)
- {
-     /* Don't write messages to the GUI anymore */
-     full_screen = FALSE;
+           /* 1. codepage/UTF-8  ->  ucs-2. */
+           if (vcp->vc_cpfrom == 0)
+-              tmp_len = utf8_to_ucs2(ptr, len, NULL, NULL);
++              tmp_len = utf8_to_utf16(ptr, len, NULL, NULL);
+           else
+               tmp_len = MultiByteToWideChar(vcp->vc_cpfrom, 0,
+                                                             ptr, len, 0, 0);
+           tmp = (short_u *)alloc(sizeof(short_u) * tmp_len);
+           if (tmp == NULL)
+               break;
+           if (vcp->vc_cpfrom == 0)
+-              utf8_to_ucs2(ptr, len, tmp, unconvlenp);
++              utf8_to_utf16(ptr, len, tmp, unconvlenp);
+           else
+               MultiByteToWideChar(vcp->vc_cpfrom, 0, ptr, len, tmp, tmp_len);
  
-     gui.mainwin  = NULL;
-@@ -3978,13 +4039,12 @@ mainwin_destroy_cb(GtkObject *object, gp
-  * Thus set hints at start-up to ensure correct init. size, then a
-  * second after the final attempt to reset the real minimum hinst (done by
-  * scrollbar init.), actually do the standard hinst and stop the timer.
-  * We'll not let the default hints be set while this timer's active.
-  */
--/*ARGSUSED*/
-     static gboolean
--check_startup_plug_hints(gpointer data)
-+check_startup_plug_hints(gpointer data UNUSED)
- {
-     if (init_window_hints_state == 1)
+           /* 2. ucs-2  ->  codepage/UTF-8. */
+           if (vcp->vc_cpto == 0)
+-              retlen = ucs2_to_utf8(tmp, tmp_len, NULL);
++              retlen = utf16_to_utf8(tmp, tmp_len, NULL);
+           else
+               retlen = WideCharToMultiByte(vcp->vc_cpto, 0,
+                                                   tmp, tmp_len, 0, 0, 0, 0);
+           retval = alloc(retlen + 1);
+           if (retval != NULL)
+           {
+               if (vcp->vc_cpto == 0)
+-                  ucs2_to_utf8(tmp, tmp_len, retval);
++                  utf16_to_utf8(tmp, tmp_len, retval);
+               else
+                   WideCharToMultiByte(vcp->vc_cpto, 0,
+                                         tmp, tmp_len, retval, retlen, 0, 0);
+               retval[retlen] = NUL;
+               if (lenp != NULL)
+--- vim72.orig/src/memfile.c
++++ vim72/src/memfile.c
+@@ -1341,10 +1341,15 @@ mf_do_open(mfp, fname, flags)
+       mfp->mf_fname = NULL;
+       mfp->mf_ffname = NULL;
+     }
+     else
      {
-       /* Safe to use normal hints now */
-       init_window_hints_state = 0;
-@@ -4004,10 +4064,12 @@ check_startup_plug_hints(gpointer data)
-     int
- gui_mch_open(void)
- {
-     guicolor_T fg_pixel = INVALCOLOR;
-     guicolor_T bg_pixel = INVALCOLOR;
-+    guint             pixel_width;
-+    guint             pixel_height;
++#ifdef HAVE_FD_CLOEXEC
++      int fdflags = fcntl(mfp->mf_fd, F_GETFD);
++      if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
++          fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC);
++#endif
+ #ifdef HAVE_SELINUX
+       mch_copy_sec(fname, mfp->mf_fname);
+ #endif
+       mch_hide(mfp->mf_fname);    /* try setting the 'hidden' flag */
+     }
+--- vim72.orig/src/memline.c
++++ vim72/src/memline.c
+@@ -380,11 +380,11 @@ ml_open(buf)
  
- #ifdef HAVE_GTK2
-     /*
-      * Allow setting a window role on the command line, or invent one
-      * if none was specified.  This is mainly useful for GNOME session
-@@ -4044,20 +4106,18 @@ gui_mch_open(void)
-     {
-       int             mask;
-       unsigned int    w, h;
-       int             x = 0;
-       int             y = 0;
--      guint           pixel_width;
--      guint           pixel_height;
+     dp = (DATA_BL *)(hp->bh_data);
+     dp->db_index[0] = --dp->db_txt_start;     /* at end of block */
+     dp->db_free -= 1 + INDEX_SIZE;
+     dp->db_line_count = 1;
+-    *((char_u *)dp + dp->db_txt_start) = NUL; /* emtpy line */
++    *((char_u *)dp + dp->db_txt_start) = NUL; /* empty line */
  
-       mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h);
+     return OK;
  
-       if (mask & WidthValue)
-           Columns = w;
-       if (mask & HeightValue)
+ error:
+     if (mfp != NULL)
+@@ -488,10 +488,17 @@ ml_setname(buf)
        {
--          if (p_window > h - 1 || !option_was_set((char_u *)"window"))
-+          if (p_window > (long)h - 1 || !option_was_set((char_u *)"window"))
-               p_window = h - 1;
-           Rows = h;
+           /* could not (re)open the swap file, what can we do???? */
+           EMSG(_("E301: Oops, lost the swap file!!!"));
+           return;
        }
++#ifdef HAVE_FD_CLOEXEC
++      {
++          int fdflags = fcntl(mfp->mf_fd, F_GETFD);
++          if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
++              fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC);
++      }
++#endif
+     }
+     if (!success)
+       EMSG(_("E302: Could not rename swap file"));
+ }
  
-       pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width);
-@@ -4068,18 +4128,18 @@ gui_mch_open(void)
-       pixel_height += get_menu_tool_height();
- #endif
+@@ -862,25 +869,28 @@ ml_recover()
+     int               attr;
  
-       if (mask & (XValue | YValue))
-       {
--          int w, h;
--          gui_mch_get_screen_dimensions(&w, &h);
--          h += p_ghr + get_menu_tool_height();
--          w += get_menu_tool_width();
-+          int ww, hh;
-+          gui_mch_get_screen_dimensions(&ww, &hh);
-+          hh += p_ghr + get_menu_tool_height();
-+          ww += get_menu_tool_width();
-           if (mask & XNegative)
--              x += w - pixel_width;
-+              x += ww - pixel_width;
-           if (mask & YNegative)
--              y += h - pixel_height;
-+              y += hh - pixel_height;
- #ifdef HAVE_GTK2
-           gtk_window_move(GTK_WINDOW(gui.mainwin), x, y);
+     recoverymode = TRUE;
+     called_from_main = (curbuf->b_ml.ml_mfp == NULL);
+     attr = hl_attr(HLF_E);
+-/*
+- * If the file name ends in ".sw?" we use it directly.
+- * Otherwise a search is done to find the swap file(s).
+- */
++
++    /*
++     * If the file name ends in ".s[uvw][a-z]" we assume this is the swap file.
++     * Otherwise a search is done to find the swap file(s).
++     */
+     fname = curbuf->b_fname;
+     if (fname == NULL)                    /* When there is no file name */
+       fname = (char_u *)"";
+     len = (int)STRLEN(fname);
+     if (len >= 4 &&
+ #if defined(VMS) || defined(RISCOS)
+-          STRNICMP(fname + len - 4, "_sw" , 3)
++          STRNICMP(fname + len - 4, "_s" , 2)
  #else
-           gtk_widget_set_uposition(gui.mainwin, x, y);
+-          STRNICMP(fname + len - 4, ".sw" , 3)
++          STRNICMP(fname + len - 4, ".s" , 2)
  #endif
-@@ -4098,13 +4158,20 @@ gui_mch_open(void)
-           init_window_hints_state = 1;
-           g_timeout_add(1000, check_startup_plug_hints, NULL);
-       }
+-              == 0)
++              == 0
++              && vim_strchr((char_u *)"UVWuvw", fname[len - 2]) != NULL
++              && ASCII_ISALPHA(fname[len - 1]))
+     {
+       directly = TRUE;
+       fname = vim_strsave(fname); /* make a copy for mf_open() */
      }
+     else
+@@ -1280,22 +1290,23 @@ ml_recover()
+                   }
  
--    gtk_form_set_size(GTK_FORM(gui.formwin),
--          (guint)(gui_get_base_width() + Columns * gui.char_width),
--          (guint)(gui_get_base_height() + Rows * gui.char_height));
-+    pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width);
-+    pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height);
-+#ifdef HAVE_GTK2
-+    /* For GTK2 changing the size of the form widget doesn't cause window
-+     * resizing. */
-+    if (gtk_socket_id == 0)
-+      gtk_window_resize(GTK_WINDOW(gui.mainwin), pixel_width, pixel_height);
-+#else
-+    gtk_form_set_size(GTK_FORM(gui.formwin), pixel_width, pixel_height);
-+#endif
-     update_window_manager_hints(0, 0);
+                   for (i = 0; i < dp->db_line_count; ++i)
+                   {
+                       txt_start = (dp->db_index[i] & DB_INDEX_MASK);
+-                      if (txt_start <= HEADER_SIZE
++                      if (txt_start <= (int)HEADER_SIZE
+                                         || txt_start >= (int)dp->db_txt_end)
+                       {
+                           p = (char_u *)"???";
+                           ++error;
+                       }
+                       else
+                           p = (char_u *)dp + txt_start;
+                       ml_append(lnum++, p, (colnr_T)0, TRUE);
+                   }
+                   if (has_error)
+-                      ml_append(lnum++, (char_u *)_("???END"), (colnr_T)0, TRUE);
++                      ml_append(lnum++, (char_u *)_("???END"),
++                                                          (colnr_T)0, TRUE);
+               }
+           }
+       }
  
-     if (foreground_argument != NULL)
-       fg_pixel = gui_get_color((char_u *)foreground_argument);
-     if (fg_pixel == INVALCOLOR)
-@@ -4227,13 +4294,12 @@ gui_mch_open(void)
+       if (buf->b_ml.ml_stack_top == 0)        /* finished */
+@@ -1552,14 +1563,19 @@ recover_names(fname, list, nr)
+                              && (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL)
+       {
+           for (i = 0; i < num_files; ++i)
+               if (fullpathcmp(p, files[i], TRUE) & FPC_SAME)
+               {
++                  /* Remove the name from files[i].  Move further entries
++                   * down.  When the array becomes empty free it here, since
++                   * FreeWild() won't be called below. */
+                   vim_free(files[i]);
+-                  --num_files;
+-                  for ( ; i < num_files; ++i)
+-                      files[i] = files[i + 1];
++                  if (--num_files == 0)
++                      vim_free(files);
++                  else
++                      for ( ; i < num_files; ++i)
++                          files[i] = files[i + 1];
+               }
+       }
+       if (nr > 0)
+       {
+           file_count += num_files;
+@@ -2095,16 +2111,16 @@ errorret:
+       lnum = 1;
  
-     return OK;
- }
+     if (buf->b_ml.ml_mfp == NULL)     /* there are no lines */
+       return (char_u *)"";
  
+-/*
+- * See if it is the same line as requested last time.
+- * Otherwise may need to flush last used line.
+- * Don't use the last used line when 'swapfile' is reset, need to load all
+- * blocks.
+- */
++    /*
++     * See if it is the same line as requested last time.
++     * Otherwise may need to flush last used line.
++     * Don't use the last used line when 'swapfile' is reset, need to load all
++     * blocks.
++     */
+     if (buf->b_ml.ml_line_lnum != lnum || mf_dont_release)
+     {
+       ml_flush_line(buf);
  
--/*ARGSUSED0*/
-     void
--gui_mch_exit(int rc)
-+gui_mch_exit(int rc UNUSED)
- {
-     if (gui.mainwin != NULL)
-       gtk_widget_destroy(gui.mainwin);
+       /*
+@@ -3069,16 +3085,23 @@ ml_flush_line(buf)
+     int               extra;
+     int               idx;
+     int               start;
+     int               count;
+     int               i;
++    static int  entered = FALSE;
  
-     if (gtk_main_level() > 0)
-@@ -4284,11 +4350,10 @@ static int resize_idle_installed = FALSE
-  * DISABLED: When doing ":set lines+=1" this function would first invoke
-  * gui_resize_shell() with the old size, then the normal callback would
-  * report the new size through form_configure_event().  That caused the window
-  * layout to be messed up.
-  */
--/*ARGSUSED0*/
-     static gboolean
- force_shell_resize_idle(gpointer data)
- {
-     if (gui.mainwin != NULL
-           && GTK_WIDGET_REALIZED(gui.mainwin)
-@@ -4309,19 +4374,41 @@ force_shell_resize_idle(gpointer data)
-     return FALSE; /* don't call me again */
- }
- #endif
- #endif /* HAVE_GTK2 */
+     if (buf->b_ml.ml_line_lnum == 0 || buf->b_ml.ml_mfp == NULL)
+       return;         /* nothing to do */
  
-+#if defined(HAVE_GTK2) || defined(PROTO)
-+/*
-+ * Return TRUE if the main window is maximized.
-+ */
-+    int
-+gui_mch_maximized()
-+{
-+    return (gui.mainwin != NULL && gui.mainwin->window != NULL
-+          && (gdk_window_get_state(gui.mainwin->window)
-+                                             & GDK_WINDOW_STATE_MAXIMIZED));
-+}
-+
-+/*
-+ * Unmaximize the main window
-+ */
-+    void
-+gui_mch_unmaximize()
-+{
-+    if (gui.mainwin != NULL)
-+      gtk_window_unmaximize(GTK_WINDOW(gui.mainwin));
-+}
-+#endif
+     if (buf->b_ml.ml_flags & ML_LINE_DIRTY)
+     {
++      /* This code doesn't work recursively, but Netbeans may call back here
++       * when obtaining the cursor position. */
++      if (entered)
++          return;
++      entered = TRUE;
 +
- /*
-  * Set the windows size.
-  */
--/*ARGSUSED2*/
-     void
- gui_mch_set_shellsize(int width, int height,
--                    int min_width,  int min_height,
--                    int base_width, int base_height,
--                    int direction)
-+                    int min_width UNUSED,  int min_height UNUSED,
-+                    int base_width UNUSED, int base_height UNUSED,
-+                    int direction UNUSED)
- {
- #ifndef HAVE_GTK2
-     /* Hack: When the form already is at the desired size, the window might
-      * have been resized with the mouse.  Force a resize by setting a
-      * different size first. */
-@@ -4411,13 +4498,12 @@ gui_mch_get_screen_dimensions(int *scree
-     *screen_w -= get_menu_tool_width();
-     *screen_h -= get_menu_tool_height();
- }
- #if defined(FEAT_TITLE) || defined(PROTO)
--/*ARGSUSED*/
-     void
--gui_mch_settitle(char_u *title, char_u *icon)
-+gui_mch_settitle(char_u *title, char_u *icon UNUSED)
- {
- # ifdef HAVE_GTK2
-     if (title != NULL && output_conv.vc_type != CONV_NONE)
-       title = string_convert(&output_conv, title, NULL);
- # endif
-@@ -4491,11 +4577,10 @@ gui_mch_show_toolbar(int showit)
- #ifndef HAVE_GTK2
- /*
-  * Get a font structure for highlighting.
-  * "cbdata" is a pointer to the global gui structure.
-  */
--/*ARGSUSED*/
-     static void
- font_sel_ok(GtkWidget *wgt, gpointer cbdata)
- {
-     gui_T *vw = (gui_T *)cbdata;
-     GtkFontSelectionDialog *fs = (GtkFontSelectionDialog *)vw->fontdlg;
-@@ -4507,22 +4592,20 @@ font_sel_ok(GtkWidget *wgt, gpointer cbd
-     gtk_widget_hide(vw->fontdlg);
-     if (gtk_main_level() > 0)
-       gtk_main_quit();
- }
+       lnum = buf->b_ml.ml_line_lnum;
+       new_line = buf->b_ml.ml_line_ptr;
  
--/*ARGSUSED*/
-     static void
- font_sel_cancel(GtkWidget *wgt, gpointer cbdata)
- {
-     gui_T *vw = (gui_T *)cbdata;
+       hp = ml_find_line(buf, lnum, ML_FIND);
+       if (hp == NULL)
+@@ -3142,10 +3165,12 @@ ml_flush_line(buf)
+                                            (dp->db_index[idx] & DB_MARKED));
+               (void)ml_delete_int(buf, lnum, FALSE);
+           }
+       }
+       vim_free(new_line);
++
++      entered = FALSE;
+     }
  
-     gtk_widget_hide(vw->fontdlg);
-     if (gtk_main_level() > 0)
-       gtk_main_quit();
+     buf->b_ml.ml_line_lnum = 0;
  }
  
--/*ARGSUSED*/
-     static void
- font_sel_destroy(GtkWidget *wgt, gpointer cbdata)
- {
-     gui_T *vw = (gui_T *)cbdata;
+@@ -3520,11 +3545,11 @@ resolve_symlink(fname, buf)
+       if (ret <= 0)
+       {
+           if (errno == EINVAL || errno == ENOENT)
+           {
+               /* Found non-symlink or not existing file, stop here.
+-               * When at the first level use the unmodifed name, skip the
++               * When at the first level use the unmodified name, skip the
+                * call to vim_FullName(). */
+               if (depth == 1)
+                   return FAIL;
  
-@@ -4618,11 +4701,10 @@ gui_mch_adjust_charheight(void)
+               /* Use the resolved name in tmp[]. */
+@@ -3566,15 +3591,14 @@ resolve_symlink(fname, buf)
  
- #if defined(FEAT_XFONTSET) || defined(PROTO)
  /*
-  * Try to load the requested fontset.
+  * Make swap file name out of the file name and a directory name.
+  * Returns pointer to allocated memory or NULL.
   */
--/*ARGSUSED2*/
-     GuiFontset
- gui_mch_get_fontset(char_u *name, int report_error, int fixed_width)
+-/*ARGSUSED*/
+     char_u *
+ makeswapname(fname, ffname, buf, dir_name)
+     char_u    *fname;
+-    char_u    *ffname;
++    char_u    *ffname UNUSED;
+     buf_T     *buf;
+     char_u    *dir_name;
  {
-     GdkFont *font;
+     char_u    *r, *s;
+ #ifdef HAVE_READLINK
+@@ -3764,12 +3788,14 @@ do_swapexists(buf, fname)
+ {
+     set_vim_var_string(VV_SWAPNAME, fname, -1);
+     set_vim_var_string(VV_SWAPCHOICE, NULL, -1);
  
-@@ -4675,10 +4757,13 @@ gui_mch_font_dialog(char_u *oldval)
-     }
+     /* Trigger SwapExists autocommands with <afile> set to the file being
+-     * edited. */
++     * edited.  Disallow changing directory here. */
++    ++allbuf_lock;
+     apply_autocmds(EVENT_SWAPEXISTS, buf->b_fname, NULL, FALSE, NULL);
++    --allbuf_lock;
  
-     if (oldval != NULL && *oldval != NUL)
-       gtk_font_selection_dialog_set_font_name(
-               GTK_FONT_SELECTION_DIALOG(gui.fontdlg), (char *)oldval);
-+    else
-+      gtk_font_selection_dialog_set_font_name(
-+              GTK_FONT_SELECTION_DIALOG(gui.fontdlg), DEFAULT_FONT);
+     set_vim_var_string(VV_SWAPNAME, NULL, -1);
  
-     if (gui.fontname)
+     switch (*get_vim_var_str(VV_SWAPCHOICE))
      {
-       g_free(gui.fontname);
-       gui.fontname = NULL;
-@@ -4762,10 +4847,13 @@ gui_mch_font_dialog(char_u *oldval)
-               GTK_FONT_SELECTION_DIALOG(dialog), (const char *)oldname);
+@@ -3791,10 +3817,11 @@ do_swapexists(buf, fname)
+  * Several names are tried to find one that does not exist
+  * Returns the name in allocated memory or NULL.
+  *
+  * Note: If BASENAMELEN is not correct, you will get error messages for
+  *     not being able to open the swapfile
++ * Note: May trigger SwapExists autocmd, pointers may change!
+  */
+     static char_u *
+ findswapname(buf, dirp, old_fname)
+     buf_T     *buf;
+     char_u    **dirp;         /* pointer to list of directories */
+@@ -4558,11 +4585,11 @@ ml_updatechunk(buf, line, len, updtype)
  
-       if (oldname != oldval)
-           vim_free(oldname);
+           mch_memmove(buf->b_ml.ml_chunksize + curix + 1,
+                       buf->b_ml.ml_chunksize + curix,
+                       (buf->b_ml.ml_usedchunks - curix) *
+                       sizeof(chunksize_T));
+-          /* Compute length of first half of lines in the splitted chunk */
++          /* Compute length of first half of lines in the split chunk */
+           size = 0;
+           linecnt = 0;
+           while (curline < buf->b_ml.ml_line_count
+                       && linecnt < MLCS_MINL)
+           {
+--- vim72.orig/src/menu.c
++++ vim72/src/menu.c
+@@ -229,19 +229,19 @@ ex_menu(eap)
+           if (STRNCMP(menu_path, "BuiltIn", 7) == 0)
+           {
+               if (skipdigits(menu_path + 7) == p)
+               {
+                   menuarg.iconidx = atoi((char *)menu_path + 7);
+-                  if (menuarg.iconidx >= TOOLBAR_NAME_COUNT)
++                  if (menuarg.iconidx >= (int)TOOLBAR_NAME_COUNT)
+                       menuarg.iconidx = -1;
+                   else
+                       menuarg.icon_builtin = TRUE;
+               }
+           }
+           else
+           {
+-              for (i = 0; i < TOOLBAR_NAME_COUNT; ++i)
++              for (i = 0; i < (int)TOOLBAR_NAME_COUNT; ++i)
+                   if (STRNCMP(toolbar_names[i], menu_path, p - menu_path)
+                                                                        == 0)
+                   {
+                       menuarg.iconidx = i;
+                       break;
+@@ -1118,10 +1118,11 @@ show_menus(path_name, modes)
+       }
+       name = p;
+       parent = menu;
+       menu = menu->children;
      }
-+    else
-+      gtk_font_selection_dialog_set_font_name(
-+              GTK_FONT_SELECTION_DIALOG(dialog), DEFAULT_FONT);
-     response = gtk_dialog_run(GTK_DIALOG(dialog));
-     if (response == GTK_RESPONSE_OK)
-     {
-@@ -4861,11 +4949,11 @@ get_styled_font_variants(char_u * font_n
++    vim_free(path_name);
  
-     styled_font[0] = &gui.bold_font;
-     styled_font[1] = &gui.ital_font;
-     styled_font[2] = &gui.boldital_font;
+     /* Now we have found the matching menu, and we list the mappings */
+                                                   /* Highlight title */
+     MSG_PUTS_TITLE(_("\n--- Menus ---"));
  
--    /* First free whatever was freviously there. */
-+    /* First free whatever was previously there. */
-     for (i = 0; i < 3; ++i)
-       if (*styled_font[i])
-       {
-           gdk_font_unref(*styled_font[i]);
-           *styled_font[i] = NULL;
-@@ -5010,13 +5098,12 @@ ascii_glyph_table_init(void)
+@@ -1338,14 +1339,13 @@ set_context_in_menu_cmd(xp, cmd, arg, fo
  
  /*
-  * Initialize Vim to use the font or fontset with the given name.
-  * Return FAIL if the font could not be loaded, OK otherwise.
+  * Function given to ExpandGeneric() to obtain the list of (sub)menus (not
+  * entries).
   */
--/*ARGSUSED1*/
-     int
--gui_mch_init_font(char_u *font_name, int fontset)
-+gui_mch_init_font(char_u *font_name, int fontset UNUSED)
+-/*ARGSUSED*/
+     char_u *
+ get_menu_name(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
  {
- #ifdef HAVE_GTK2
-     PangoFontDescription    *font_desc;
-     PangoLayout                   *layout;
-     int                           width;
-@@ -5178,12 +5265,28 @@ gui_mch_init_font(char_u *font_name, int
-       gtk_widget_show(alignment);
-     }
- # endif
- #endif /* !HAVE_GTK2 */
--    /* Preserve the logical dimensions of the screen. */
--    update_window_manager_hints(0, 0);
-+#ifdef HAVE_GTK2
-+    if (gui_mch_maximized())
-+    {
-+      int w, h;
-+
-+      /* Update lines and columns in accordance with the new font, keep the
-+       * window maximized. */
-+      gtk_window_get_size(GTK_WINDOW(gui.mainwin), &w, &h);
-+      w -= get_menu_tool_width();
-+      h -= get_menu_tool_height();
-+      gui_resize_shell(w, h);
-+    }
-+    else
-+#endif
-+    {
-+      /* Preserve the logical dimensions of the screen. */
-+      update_window_manager_hints(0, 0);
-+    }
-     return OK;
- }
+     static vimmenu_T  *menu = NULL;
+     char_u            *str;
  
- /*
-@@ -5324,13 +5427,12 @@ gui_mch_get_font(char_u *name, int repor
+@@ -1375,14 +1375,13 @@ get_menu_name(xp, idx)
  
- #if defined(FEAT_EVAL) || defined(PROTO)
  /*
-  * Return the name of font "font" in allocated memory.
+  * Function given to ExpandGeneric() to obtain the list of menus and menu
+  * entries.
   */
 -/*ARGSUSED*/
      char_u *
--gui_mch_get_fontname(GuiFont font, char_u *name)
-+gui_mch_get_fontname(GuiFont font, char_u *name UNUSED)
+ get_menu_names(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
  {
- # ifdef HAVE_GTK2
-     if (font != NOFONT)
-     {
-       char    *pangoname = pango_font_description_to_string(font);
-@@ -5730,11 +5832,11 @@ draw_glyph_string(int row, int col, int
-     static void
- draw_under(int flags, int row, int col, int cells)
+     static vimmenu_T  *menu = NULL;
+     static char_u     tbuffer[256]; /*hack*/
+     char_u            *str;
+@@ -1736,14 +1735,13 @@ menu_is_hidden(name)
+ #if defined(FEAT_CMDL_COMPL) \
+       || (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF))
+ /*
+  * Return TRUE if the menu is the tearoff menu.
+  */
+-/*ARGSUSED*/
+     static int
+ menu_is_tearoff(name)
+-    char_u *name;
++    char_u *name UNUSED;
  {
-     int                       i;
-     int                       offset;
--    const static int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
-+    static const int  val[8] = {1, 0, 0, 0, 1, 2, 2, 2 };
-     int                       y = FILL_Y(row + 1) - 1;
-     /* Undercurl: draw curl at the bottom of the character cell. */
-     if (flags & DRAW_UNDERC)
-     {
-@@ -6083,16 +6185,19 @@ gui_mch_draw_string(int row, int col, ch
-       while (p < s + len)
-       {
- # ifdef FEAT_MBYTE
-           if (enc_utf8)
-           {
--              c = utf_ptr2char(p);
-+              int pcc[MAX_MCO];
-+
-+              /* TODO: use the composing characters */
-+              c = utfc_ptr2char_len(p, pcc, len - (p - s));
-               if (c >= 0x10000)       /* show chars > 0xffff as ? */
-                   c = 0xbf;
-               buf[textlen].byte1 = c >> 8;
-               buf[textlen].byte2 = c;
--              p += utf_ptr2len(p);
-+              p += utfc_ptr2len_len(p, len - (p - s));
-               width += utf_char2cells(c);
-           }
-           else
- # endif
-           {
-@@ -6112,12 +6217,12 @@ gui_mch_draw_string(int row, int col, ch
-       textlen = len;
- # ifdef FEAT_MBYTE
-       if (has_mbyte)
-       {
-           width = 0;
--          for (p = s; p < s + len; p += (*mb_ptr2len)(p))
--              width += (*mb_ptr2cells)(p);
-+          for (p = s; p < s + len; p += (*mb_ptr2len_len)(p, len - (p - s)))
-+              width += (*mb_ptr2cells_len)(p, len - (p - s));
-       }
-       else
- # endif
-           width = len;
-     }
-@@ -6400,11 +6505,10 @@ input_timer_cb(gpointer data)
- #ifdef FEAT_SNIFF
+ #ifdef FEAT_GUI
+     return (STRCMP(name, TEAR_STRING) == 0);
+ #else
+     return FALSE;
+@@ -2340,14 +2338,13 @@ static garray_T menutrans_ga = {0, 0, 0,
  /*
-  * Callback function, used when data is available on the SNiFF connection.
+  * ":menutrans".
+  * This function is also defined without the +multi_lang feature, in which
+  * case the commands are ignored.
   */
--/* ARGSUSED */
-     static void
- sniff_request_cb(
-     gpointer  data,
-     gint      source_fd,
-     GdkInputCondition condition)
-@@ -6663,16 +6767,18 @@ gui_mch_insert_lines(int row, int num_li
+-/*ARGSUSED*/
      void
- clip_mch_request_selection(VimClipboard *cbd)
+ ex_menutranslate(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
-     GdkAtom   target;
-     unsigned  i;
--    int               nbytes;
--    char_u    *buffer;
-     time_t    start;
-     for (i = 0; i < N_SELECTION_TARGETS; ++i)
-     {
-+#ifdef FEAT_MBYTE
-+      if (!clip_html && selection_targets[i].info == TARGET_HTML)
-+          continue;
-+#endif
-       received_selection = RS_NONE;
-       target = gdk_atom_intern(selection_targets[i].target, FALSE);
-       gtk_selection_convert(gui.drawarea,
-                             cbd->gtk_sel_atom, target,
-@@ -6688,34 +6794,18 @@ clip_mch_request_selection(VimClipboard
-       if (received_selection != RS_FAIL)
-           return;
-     }
-     /* Final fallback position - use the X CUT_BUFFER0 store */
--    nbytes = 0;
--    buffer = (char_u *)XFetchBuffer(GDK_WINDOW_XDISPLAY(gui.mainwin->window),
--                                  &nbytes, 0);
--    if (nbytes > 0)
--    {
--      /* Got something */
--      clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
--      if (p_verbose > 0)
--      {
--          verbose_enter();
--          smsg((char_u *)_("Used CUT_BUFFER0 instead of empty selection"));
--          verbose_leave();
--      }
--    }
--    if (buffer != NULL)
--      XFree(buffer);
-+    yank_cut_buffer0(GDK_WINDOW_XDISPLAY(gui.mainwin->window), cbd);
+ #ifdef FEAT_MULTI_LANG
+     char_u            *arg = eap->arg;
+     menutrans_T               *tp;
+     int                       i;
+--- vim72.orig/src/message.c
++++ vim72/src/message.c
+@@ -105,11 +105,11 @@ msg(s)
+ {
+     return msg_attr_keep(s, 0, FALSE);
  }
  
+ #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \
+-    || defined(PROTO)
++    || defined(FEAT_GUI_GTK) || defined(PROTO)
  /*
-  * Disown the selection.
+  * Like msg() but keep it silent when 'verbosefile' is set.
   */
--/*ARGSUSED*/
-     void
--clip_mch_lose_selection(VimClipboard *cbd)
-+clip_mch_lose_selection(VimClipboard *cbd UNUSED)
- {
-     /* WEIRD: when using NULL to actually disown the selection, we lose the
-      * selection the first time we own it. */
-     /*
-     gtk_selection_owner_set(NULL, cbd->gtk_sel_atom, (guint32)GDK_CURRENT_TIME);
-@@ -6739,13 +6829,12 @@ clip_mch_own_selection(VimClipboard *cbd
+     int
+ verb_msg(s)
+@@ -816,14 +816,13 @@ delete_first_msg()
+ }
  
  /*
-  * Send the current selection to the clipboard.  Do nothing for X because we
-  * will fill in the selection only when requested by another app.
+  * ":messages" command.
   */
 -/*ARGSUSED*/
      void
--clip_mch_set_selection(VimClipboard *cbd)
-+clip_mch_set_selection(VimClipboard *cbd UNUSED)
+ ex_messages(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
  {
- }
+     struct msg_hist *p;
+     char_u        *s;
  
+     msg_hist_off = TRUE;
+@@ -974,11 +973,11 @@ wait_return(redraw)
+                       c = K_IGNORE;
+                       hit_return_msg();
+                   }
+               }
+               else if (msg_scrolled > Rows - 2
+-                                   && (c == 'j' || c == K_DOWN || c == 'd'))
++                       && (c == 'j' || c == K_DOWN || c == 'd' || c == 'f'))
+                   c = K_IGNORE;
+           }
+       } while ((had_got_int && c == Ctrl_C)
+                               || c == K_IGNORE
+ #ifdef FEAT_GUI
+@@ -2502,23 +2501,24 @@ do_more_prompt(typed_char)
+       case K_DOWN:
+           scroll = 1;
+           break;
  
- #if defined(FEAT_MENU) || defined(PROTO)
-@@ -6948,11 +7037,11 @@ mch_set_mouse_shape(int shape)
-           if (id >= GDK_LAST_CURSOR)
-               id = GDK_LEFT_PTR;
-           else
-               id &= ~1;       /* they are always even (why?) */
-       }
--      else if (shape < sizeof(mshape_ids) / sizeof(int))
-+      else if (shape < (int)(sizeof(mshape_ids) / sizeof(int)))
-           id = mshape_ids[shape];
-       else
-           return;
- # ifdef HAVE_GTK_MULTIHEAD
-       c = gdk_cursor_new_for_display(
---- vim72.orig/src/gui_xmdlg.c
-+++ vim72/src/gui_xmdlg.c
-@@ -8,11 +8,11 @@
-  */
- /*
-  * (C) 2001,2005 by Marcin Dalecki <martin@dalecki.de>
-  *
-- * Implementation of dialogue functions for the Motif GUI variant.
-+ * Implementation of dialog functions for the Motif GUI variant.
-  *
-  * Note about Lesstif: Apparently lesstif doesn't get the widget layout right,
-  * when using a dynamic scrollbar policy.
-  */
-@@ -367,14 +367,14 @@ fill_lists(enum ListSpecifier fix, Share
-     char      *list[NONE][MAX_ENTRIES_IN_LIST];
-     int               count[NONE];
-     char      buf[TEMP_BUF_SIZE];
-     XmString  items[MAX_ENTRIES_IN_LIST];
-     int               i;
--    int               index;
-+    int               idx;
+       case 'u':               /* Up half a page */
+-      case K_PAGEUP:
+           scroll = -(Rows / 2);
+           break;
  
--    for (index = (int)ENCODING; index < (int)NONE; ++index)
--      count[index] = 0;
-+    for (idx = (int)ENCODING; idx < (int)NONE; ++idx)
-+      count[idx] = 0;
+       case 'd':               /* Down half a page */
+           scroll = Rows / 2;
+           break;
  
-     /* First we insert the wild char into every single list. */
-     if (fix != ENCODING)
-       add_to_list(list[ENCODING], wild, &count[ENCODING]);
-     if (fix != NAME)
-@@ -446,11 +446,11 @@ fill_lists(enum ListSpecifier fix, Share
-       {
-           Widget button;
+       case 'b':               /* one page back */
++      case K_PAGEUP:
+           scroll = -(Rows - 1);
+           break;
  
-           items[i] = XmStringCreateLocalized(list[ENCODING][i]);
+       case ' ':               /* one extra page */
++      case 'f':
+       case K_PAGEDOWN:
+       case K_LEFTMOUSE:
+           scroll = Rows - 1;
+           break;
  
--          if (i < n_items)
-+          if (i < (int)n_items)
+@@ -2550,18 +2550,20 @@ do_more_prompt(typed_char)
+ #ifdef FEAT_CON_DIALOG
+           if (confirm_msg_used)
            {
-               /* recycle old button */
-               XtVaSetValues(children[i],
-                       XmNlabelString, items[i],
-                       XmNuserData, i,
-@@ -479,11 +479,11 @@ fill_lists(enum ListSpecifier fix, Share
-           XtFree(list[ENCODING][i]);
-       }
-       /* Destroy all the outstanding menu items.
-        */
--      for (i = count[ENCODING]; i < n_items; ++i)
-+      for (i = count[ENCODING]; i < (int)n_items; ++i)
-       {
-           XtUnmanageChild(children[i]);
-           XtDestroyWidget(children[i]);
-       }
-@@ -501,18 +501,18 @@ fill_lists(enum ListSpecifier fix, Share
-     }
+               /* Jump to the choices of the dialog. */
+               retval = TRUE;
+-              lines_left = Rows - 1;
+           }
+           else
+ #endif
+           {
+               got_int = TRUE;
+               quit_more = TRUE;
+           }
++          /* When there is some more output (wrapping line) display that
++           * without another prompt. */
++          lines_left = Rows - 1;
+           break;
  
-     /*
-      * Now loop trough the remaining lists and set them up.
+ #ifdef FEAT_CLIPBOARD
+       case Ctrl_Y:
+           /* Strange way to allow copying (yanking) a modeless
+@@ -3018,15 +3020,11 @@ redir_write(str, maxlen)
+      * Must come before the rest because of updating "msg_col".
       */
--    for (index = (int)NAME; index < (int)NONE; ++index)
-+    for (idx = (int)NAME; idx < (int)NONE; ++idx)
-     {
-       Widget w;
--      if (fix == (enum ListSpecifier)index)
-+      if (fix == (enum ListSpecifier)idx)
-           continue;
--      switch ((enum ListSpecifier)index)
-+      switch ((enum ListSpecifier)idx)
-       {
-           case NAME:
-               w = data->list[NAME];
-               break;
-           case STYLE:
-@@ -523,32 +523,31 @@ fill_lists(enum ListSpecifier fix, Share
-               break;
-           default:
-               w = (Widget)0;  /* for lint */
-       }
+     if (*p_vfile != NUL)
+       verbose_write(s, maxlen);
  
--      for (i = 0; i < count[index]; ++i)
-+      for (i = 0; i < count[idx]; ++i)
-       {
--          items[i] = XmStringCreateLocalized(list[index][i]);
--          XtFree(list[index][i]);
-+          items[i] = XmStringCreateLocalized(list[idx][i]);
-+          XtFree(list[idx][i]);
-       }
-       XmListDeleteAllItems(w);
--      XmListAddItems(w, items, count[index], 1);
--      if (data->sel[index])
-+      XmListAddItems(w, items, count[idx], 1);
-+      if (data->sel[idx])
+-    if (redir_fd != NULL
+-#ifdef FEAT_EVAL
+-                        || redir_reg || redir_vname
+-#endif
+-                                     )
++    if (redirecting())
+     {
+       /* If the string doesn't start with CR or NL, go to msg_col */
+       if (*s != '\n' && *s != '\r')
        {
-           XmStringFree(items[0]);
--          items[0] = XmStringCreateLocalized(data->sel[index]);
-+          items[0] = XmStringCreateLocalized(data->sel[idx]);
-           XmListSelectItem(w, items[0], False);
-           XmListSetBottomItem(w, items[0]);
-       }
--      for (i = 0; i < count[index]; ++i)
-+      for (i = 0; i < count[idx]; ++i)
-           XmStringFree(items[i]);
+           while (cur_col < msg_col)
+@@ -3069,10 +3067,20 @@ redir_write(str, maxlen)
+       if (msg_silent != 0)    /* should update msg_col */
+           msg_col = cur_col;
      }
  }
  
--/*ARGSUSED*/
-     static void
--stoggle_callback(Widget w,
-+stoggle_callback(Widget w UNUSED,
-       SharedFontSelData *data,
-       XmToggleButtonCallbackStruct *call_data)
++    int
++redirecting()
++{
++    return redir_fd != NULL
++#ifdef FEAT_EVAL
++                        || redir_reg || redir_vname
++#endif
++                                     ;
++}
++
+ /*
+  * Before giving verbose message.
+  * Must always be called paired with verbose_leave()!
+  */
+     void
+@@ -3279,19 +3287,19 @@ msg_advance(col)
+  * The second button should be the 'Cancel' button
+  * Other buttons- use your imagination!
+  * A '&' in a button name becomes a shortcut, so each '&' should be before a
+  * different letter.
+  */
+-/* ARGSUSED */
+     int
+ do_dialog(type, title, message, buttons, dfltbutton, textfield)
+-    int               type;
+-    char_u    *title;
++    int               type UNUSED;
++    char_u    *title UNUSED;
+     char_u    *message;
+     char_u    *buttons;
+     int               dfltbutton;
+-    char_u    *textfield;     /* IObuff for inputdialog(), NULL otherwise */
++    char_u    *textfield UNUSED;      /* IObuff for inputdialog(), NULL
++                                         otherwise */
  {
-     int               i, do_sel;
-     char      newSize[TEMP_BUF_SIZE];
-@@ -632,20 +631,23 @@ do_choice(Widget w,
-     if (!data->sel[which])
-       data->sel[which] = XtNewString(sel);
-     else
+     int               oldState;
+     int               retval = 0;
+     char_u    *hotkeys;
+     int               c;
+@@ -3307,11 +3315,14 @@ do_dialog(type, title, message, buttons,
+     /* When GUI is running and 'c' not in 'guioptions', use the GUI dialog */
+     if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL)
      {
--      XtFree(data->sel[which]);
-       if (!strcmp(data->sel[which], sel))
-       {
-           /* unselecting current selection */
-+          XtFree(data->sel[which]);
-           data->sel[which] = NULL;
-           if (w)
-               XmListDeselectItem(w, call_data->item);
-       }
-       else
-+      {
-+          XtFree(data->sel[which]);
-           data->sel[which] = XtNewString(sel);
-+      }
-     }
-     XtFree(sel);
-     fill_lists(which, data);
+       c = gui_mch_dialog(type, title, message, buttons, dfltbutton,
+                                                                  textfield);
+-      msg_end_prompt();
++      /* avoid a hit-enter prompt without clearing the cmdline */
++      need_wait_return = FALSE;
++      emsg_on_display = FALSE;
++      cmdline_row = msg_row;
  
-@@ -693,29 +695,28 @@ do_choice(Widget w,
-     else
+       /* Flush output to avoid that further messages and redrawing is done
+        * in the wrong order. */
+       out_flush();
+       gui_mch_update();
+@@ -4007,11 +4018,11 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+     while (*p != NUL)
      {
-       int         n;
-       XmString    str;
-       Arg         args[4];
--      char        *msg = _("no specific match");
-+      char        *nomatch_msg = _("no specific match");
-       n = 0;
--      str = XmStringCreateLocalized(msg);
-+      str = XmStringCreateLocalized(nomatch_msg);
-       XtSetArg(args[n], XmNlabelString, str); ++n;
-       XtSetValues(data->sample, args, n);
-       apply_fontlist(data->sample);
--      XmTextSetString(data->name, msg);
-+      XmTextSetString(data->name, nomatch_msg);
-       XmStringFree(str);
+       if (*p != '%')
+       {
+           char    *q = strchr(p + 1, '%');
+-          size_t  n = (q == NULL) ? STRLEN(p) : (q - p);
++          size_t  n = (q == NULL) ? STRLEN(p) : (size_t)(q - p);
  
-       return False;
-     }
- }
+           /* Copy up to the next '%' or NUL without any changes. */
+           if (str_l < str_m)
+           {
+               size_t avail = str_m - str_l;
+@@ -4254,11 +4265,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                       /* memchr on HP does not like n > 2^31  !!! */
+                       char *q = memchr(str_arg, '\0',
+                                 precision <= (size_t)0x7fffffffL ? precision
+                                                      : (size_t)0x7fffffffL);
+ #endif
+-                      str_arg_l = (q == NULL) ? precision : q - str_arg;
++                      str_arg_l = (q == NULL) ? precision
++                                                    : (size_t)(q - str_arg);
+                   }
+                   break;
  
--/*ARGSUSED*/
-     static void
- encoding_callback(Widget w,
-       SharedFontSelData *data,
--      XtPointer dummy)
-+      XtPointer dummy UNUSED)
- {
-     XmString str;
-     XmListCallbackStruct fake_data;
+               default:
+                   break;
+@@ -4354,11 +4366,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                               uint_arg =
+ #ifndef HAVE_STDARG_H
+                                           get_a_arg(arg_idx);
+ #else
+ # if defined(FEAT_EVAL)
+-                                          tvs != NULL ? tv_nr(tvs, &arg_idx) :
++                                          tvs != NULL ? (unsigned)
++                                                      tv_nr(tvs, &arg_idx) :
+ # endif
+                                               va_arg(ap, unsigned int);
+ #endif
+                               if (uint_arg != 0)
+                                   arg_sign = 1;
+@@ -4367,11 +4380,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                               ulong_arg =
+ #ifndef HAVE_STDARG_H
+                                           get_a_arg(arg_idx);
+ #else
+ # if defined(FEAT_EVAL)
+-                                          tvs != NULL ? tv_nr(tvs, &arg_idx) :
++                                          tvs != NULL ? (unsigned long)
++                                                      tv_nr(tvs, &arg_idx) :
+ # endif
+                                               va_arg(ap, unsigned long int);
+ #endif
+                               if (ulong_arg != 0)
+                                   arg_sign = 1;
+@@ -4554,11 +4568,17 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                       else
+                           fmt_spec = fmt_spec == 'g' ? 'e' : 'E';
+                       remove_trailing_zeroes = TRUE;
+                   }
  
-     XtVaGetValues(w, XmNlabelString, &str, NULL);
-@@ -750,15 +751,14 @@ size_callback(Widget w,
-       XmListCallbackStruct *call_data)
- {
-     do_choice(w, data, call_data, SIZE);
- }
+-                  if (fmt_spec == 'f' && abs_f > 1.0e307)
++                  if (fmt_spec == 'f' &&
++#ifdef VAX
++                          abs_f > 1.0e38
++#else
++                          abs_f > 1.0e307
++#endif
++                          )
+                   {
+                       /* Avoid a buffer overflow */
+                       strcpy(tmp, "inf");
+                       str_arg_l = 3;
+                   }
+@@ -4583,65 +4603,66 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                       str_arg_l = sprintf(tmp, format, f);
  
--/*ARGSUSED*/
-     static void
--cancel_callback(Widget w,
-+cancel_callback(Widget w UNUSED,
-       SharedFontSelData *data,
--      XmListCallbackStruct *call_data)
-+      XmListCallbackStruct *call_data UNUSED)
- {
-     if (data->sel[ENCODING])
-     {
-       XtFree(data->sel[ENCODING]);
-       data->sel[ENCODING] = NULL;
-@@ -787,15 +787,14 @@ cancel_callback(Widget w,
-     XFreeFontNames(data->names);
-     data->names = NULL;
-     data->exit = True;
- }
+                       if (remove_trailing_zeroes)
+                       {
+                           int i;
+-                          char *p;
++                          char *tp;
  
--/*ARGSUSED*/
-     static void
--ok_callback(Widget w,
-+ok_callback(Widget w UNUSED,
-       SharedFontSelData *data,
--      XmPushButtonCallbackStruct *call_data)
-+      XmPushButtonCallbackStruct *call_data UNUSED)
- {
-     char    *pattern;
-     char    **name;
-     int           i;
+                           /* Using %g or %G: remove superfluous zeroes. */
+                           if (fmt_spec == 'f')
+-                              p = tmp + str_arg_l - 1;
++                              tp = tmp + str_arg_l - 1;
+                           else
+                           {
+-                              p = (char *)vim_strchr((char_u *)tmp,
++                              tp = (char *)vim_strchr((char_u *)tmp,
+                                                fmt_spec == 'e' ? 'e' : 'E');
+-                              if (p != NULL)
++                              if (tp != NULL)
+                               {
+                                   /* Remove superfluous '+' and leading
+                                    * zeroes from the exponent. */
+-                                  if (p[1] == '+')
++                                  if (tp[1] == '+')
+                                   {
+                                       /* Change "1.0e+07" to "1.0e07" */
+-                                      STRMOVE(p + 1, p + 2);
++                                      STRMOVE(tp + 1, tp + 2);
+                                       --str_arg_l;
+                                   }
+-                                  i = (p[1] == '-') ? 2 : 1;
+-                                  while (p[i] == '0')
++                                  i = (tp[1] == '-') ? 2 : 1;
++                                  while (tp[i] == '0')
+                                   {
+                                       /* Change "1.0e07" to "1.0e7" */
+-                                      STRMOVE(p + i, p + i + 1);
++                                      STRMOVE(tp + i, tp + i + 1);
+                                       --str_arg_l;
+                                   }
+-                                  --p;
++                                  --tp;
+                               }
+                           }
  
-@@ -884,25 +883,25 @@ gui_xm_select_font(char_u *current)
-      */
+-                          if (p != NULL && !precision_specified)
++                          if (tp != NULL && !precision_specified)
+                               /* Remove trailing zeroes, but keep the one
+                                * just after a dot. */
+-                              while (p > tmp + 2 && *p == '0' && p[-1] != '.')
++                              while (tp > tmp + 2 && *tp == '0'
++                                                           && tp[-1] != '.')
+                               {
+-                                  STRMOVE(p, p + 1);
+-                                  --p;
++                                  STRMOVE(tp, tp + 1);
++                                  --tp;
+                                   --str_arg_l;
+                               }
+                       }
+                       else
+                       {
+-                          char *p;
++                          char *tp;
  
-     {
-       int     i;
-       int     max;
--      int     index = 0;
-+      int     idx = 0;
-       int     size;
--      char    str[128];
-+      char    buf[128];
+                           /* Be consistent: some printf("%e") use 1.0e+12
+                            * and some 1.0e+012.  Remove one zero in the last
+                            * case. */
+-                          p = (char *)vim_strchr((char_u *)tmp,
++                          tp = (char *)vim_strchr((char_u *)tmp,
+                                                fmt_spec == 'e' ? 'e' : 'E');
+-                          if (p != NULL && (p[1] == '+' || p[1] == '-')
+-                                        && p[2] == '0'
+-                                        && vim_isdigit(p[3])
+-                                        && vim_isdigit(p[4]))
++                          if (tp != NULL && (tp[1] == '+' || tp[1] == '-')
++                                        && tp[2] == '0'
++                                        && vim_isdigit(tp[3])
++                                        && vim_isdigit(tp[4]))
+                           {
+-                              STRMOVE(p + 2, p + 3);
++                              STRMOVE(tp + 2, tp + 3);
+                               --str_arg_l;
+                           }
+                       }
+                   }
+                   str_arg = tmp;
+@@ -4683,11 +4704,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                   if (str_l < str_m)
+                   {
+                       size_t avail = str_m - str_l;
  
-       for (i = 0, max = 0; i < data->num; i++)
-       {
--          get_part(fn(data, i), 7, str);
--          size = atoi(str);
-+          get_part(fn(data, i), 7, buf);
-+          size = atoi(buf);
-           if ((size > max) && (size < MAX_DISPLAY_SIZE))
-           {
--              index = i;
-+              idx = i;
-               max = size;
+                       vim_memset(str + str_l, zero_padding ? '0' : ' ',
+-                                           (size_t)pn > avail ? avail : pn);
++                                           (size_t)pn > avail ? avail
++                                                              : (size_t)pn);
+                   }
+                   str_l += pn;
+               }
            }
-       }
--      strcpy(big_font, fn(data, index));
-+      strcpy(big_font, fn(data, idx));
-     }
-     data->old = XLoadQueryFont(XtDisplay(parent), big_font);
-     data->old_list = gui_motif_create_fontlist(data->old);
  
-     /* Set the title of the Dialog window. */
-@@ -1215,32 +1214,32 @@ gui_xm_select_font(char_u *current)
+@@ -4710,11 +4732,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                   if (str_l < str_m)
+                   {
+                       size_t avail = str_m - str_l;
  
-       names = XListFonts(XtDisplay(form), (char *) current, 1, &i);
-       if (i != 0)
-       {
--          char name[TEMP_BUF_SIZE];
--          char style[TEMP_BUF_SIZE];
--          char size[TEMP_BUF_SIZE];
--          char encoding[TEMP_BUF_SIZE];
-+          char namebuf[TEMP_BUF_SIZE];
-+          char stylebuf[TEMP_BUF_SIZE];
-+          char sizebuf[TEMP_BUF_SIZE];
-+          char encodingbuf[TEMP_BUF_SIZE];
-           char *found;
+                       mch_memmove(str + str_l, str_arg,
+-                                           (size_t)zn > avail ? avail : zn);
++                                           (size_t)zn > avail ? avail
++                                                              : (size_t)zn);
+                   }
+                   str_l += zn;
+               }
  
-           found = names[0];
+               /* insert zero padding as requested by the precision or min
+@@ -4725,11 +4748,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                   if (str_l < str_m)
+                   {
+                       size_t avail = str_m-str_l;
  
--          name_part(found, name);
--          style_part(found, style);
--          size_part(found, size, data->in_pixels);
--          encoding_part(found, encoding);
--
--          if (strlen(name) > 0
--                  && strlen(style) > 0
--                  && strlen(size) > 0
--                  && strlen(encoding) > 0)
-+          name_part(found, namebuf);
-+          style_part(found, stylebuf);
-+          size_part(found, sizebuf, data->in_pixels);
-+          encoding_part(found, encodingbuf);
-+
-+          if (strlen(namebuf) > 0
-+                  && strlen(stylebuf) > 0
-+                  && strlen(sizebuf) > 0
-+                  && strlen(encodingbuf) > 0)
-           {
--              data->sel[NAME] = XtNewString(name);
--              data->sel[STYLE] = XtNewString(style);
--              data->sel[SIZE] = XtNewString(size);
--              data->sel[ENCODING] = XtNewString(encoding);
-+              data->sel[NAME] = XtNewString(namebuf);
-+              data->sel[STYLE] = XtNewString(stylebuf);
-+              data->sel[SIZE] = XtNewString(sizebuf);
-+              data->sel[ENCODING] = XtNewString(encodingbuf);
-               data->font_name = XtNewString(names[0]);
-               display_sample(data);
-               XmTextSetString(data->name, data->font_name);
+                       vim_memset(str + str_l, '0',
+-                                           (size_t)zn > avail ? avail : zn);
++                                           (size_t)zn > avail ? avail
++                                                              : (size_t)zn);
+                   }
+                   str_l += zn;
+               }
            }
-           else
-@@ -1273,17 +1272,16 @@ gui_xm_select_font(char_u *current)
-     /* modal event loop */
-     while (!data->exit)
-       XtAppProcessEvent(XtWidgetToApplicationContext(data->dialog),
-                                                       (XtInputMask)XtIMAll);
  
--    XtDestroyWidget(data->dialog);
--
-     if (data->old)
-     {
-       XFreeFont(XtDisplay(data->dialog),  data->old);
-       XmFontListFree(data->old_list);
-     }
-+    XtDestroyWidget(data->dialog);
+@@ -4744,11 +4768,11 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                   {
+                       size_t avail = str_m - str_l;
  
-     gui_motif_synch_fonts();
+                       mch_memmove(str + str_l,
+                               str_arg + zero_padding_insertion_ind,
+-                              (size_t)sn > avail ? avail : sn);
++                              (size_t)sn > avail ? avail : (size_t)sn);
+                   }
+                   str_l += sn;
+               }
+           }
  
-     return (char_u *) data->font_name;
- }
---- vim72.orig/src/gui_xmebw.c
-+++ vim72/src/gui_xmebw.c
-@@ -233,17 +233,16 @@ bump_color(unsigned short value)
-     int tmp = 2 * (((int) value - 65535) / 3) + 65535;
+@@ -4764,11 +4788,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
+                   if (str_l < str_m)
+                   {
+                       size_t avail = str_m - str_l;
  
-     return tmp;
- }
+                       vim_memset(str + str_l, ' ',
+-                                           (size_t)pn > avail ? avail : pn);
++                                           (size_t)pn > avail ? avail
++                                                              : (size_t)pn);
+                   }
+                   str_l += pn;
+               }
+           }
+       }
+--- vim72.orig/src/misc1.c
++++ vim72/src/misc1.c
+@@ -1024,16 +1024,18 @@ open_line(dir, flags, old_indent)
+               if (lead_repl != NULL)
+               {
+                   int         c = 0;
+                   int         off = 0;
  
+-                  for (p = lead_flags; *p && *p != ':'; ++p)
++                  for (p = lead_flags; *p != NUL && *p != ':'; )
+                   {
+                       if (*p == COM_RIGHT || *p == COM_LEFT)
+-                          c = *p;
++                          c = *p++;
+                       else if (VIM_ISDIGIT(*p) || *p == '-')
+                           off = getdigits(&p);
++                      else
++                          ++p;
+                   }
+                   if (c == COM_RIGHT)    /* right adjusted leader */
+                   {
+                       /* find last non-white in the leader to line up with */
+                       for (p = leader + lead_len - 1; p > leader
+@@ -1117,11 +1119,11 @@ open_line(dir, flags, old_indent)
+                                   break;
+                           }
+                           if (i != lead_repl_len)
+                           {
+                               mch_memmove(p + lead_repl_len, p + i,
+-                                     (size_t)(lead_len - i - (leader - p)));
++                                     (size_t)(lead_len - i - (p - leader)));
+                               lead_len += lead_repl_len - i;
+                           }
+                       }
+ #endif
+                       mch_memmove(p, lead_repl, (size_t)lead_repl_len);
+@@ -2186,16 +2188,15 @@ del_chars(count, fixpos)
+  * If "fixpos" is TRUE, don't leave the cursor on the NUL after the line.
+  * Caller must have prepared for undo.
+  *
+  * return FAIL for failure, OK otherwise
+  */
 -/*ARGSUSED*/
-     static int
- alloc_color(Display   *display,
-       Colormap        colormap,
-       char            *colorname,
-       XColor          *xcolor,
--      void            *closure)
-+      void            *closure UNUSED)
+     int
+ del_bytes(count, fixpos_arg, use_delcombine)
+     long      count;
+     int               fixpos_arg;
+-    int               use_delcombine;     /* 'delcombine' option applies */
++    int               use_delcombine UNUSED;      /* 'delcombine' option applies */
  {
-     int status;
-     if (colorname)
-       if (!XParseColor(display, colormap, colorname, xcolor))
-@@ -593,13 +592,14 @@ draw_unhighlight(XmEnhancedButtonWidget
-     else
-       XmeClearBorder(XtDisplay(eb), XtWindow(eb), 0, 0, XtWidth(eb),
-                      XtHeight(eb), eb->primitive.highlight_thickness);
- }
--/*ARGSUSED*/
-     static void
--draw_pixmap(XmEnhancedButtonWidget eb, XEvent *event, Region region)
-+draw_pixmap(XmEnhancedButtonWidget eb,
-+          XEvent *event UNUSED,
-+          Region region UNUSED)
+     char_u    *oldp, *newp;
+     colnr_T   oldlen;
+     linenr_T  lnum = curwin->w_cursor.lnum;
+     colnr_T   col = curwin->w_cursor.col;
+@@ -2344,35 +2345,39 @@ truncate_line(fixpos)
+ del_lines(nlines, undo)
+     long      nlines;         /* number of lines to delete */
+     int               undo;           /* if TRUE, prepare for undo */
  {
-     Pixmap    pix;
-     GC                gc = eb->label.normal_GC;
-     int               depth;
-     Cardinal  width;
-@@ -639,11 +639,11 @@ draw_pixmap(XmEnhancedButtonWidget eb, X
-     if (w < width)
-       width = w;
-     height = eb->core.height - 2 * y;
-     if (h < height)
-       height = h;
--    if (depth == eb->core.depth)
-+    if (depth == (int)eb->core.depth)
-       XCopyArea(XtDisplay(eb), pix, XtWindow(eb), gc, 0, 0,
-               width, height, x, y);
-     else if (depth == 1)
-       XCopyPlane(XtDisplay(eb), pix, XtWindow(eb), gc, 0, 0,
-               width, height, x, y, (unsigned long)1);
-@@ -729,13 +729,15 @@ draw_label(XmEnhancedButtonWidget eb, XE
-     if (replaceGC)
-       eb->label.normal_GC = tmp_gc;
- }
+     long      n;
++    linenr_T  first = curwin->w_cursor.lnum;
  
--/*ARGSUSED*/
-     static void
--Enter(Widget wid, XEvent *event, String *params, Cardinal *num_params)
-+Enter(Widget wid,
-+      XEvent *event,
-+      String *params UNUSED,
-+      Cardinal *num_params UNUSED)
- {
-     XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget) wid;
-     XmPushButtonCallbackStruct call_value;
+     if (nlines <= 0)
+       return;
  
-     if (Lab_IsMenupane(eb))
-@@ -816,13 +818,15 @@ Enter(Widget wid, XEvent *event, String
-       draw_shadows(eb);
-       draw_pixmap(eb, event, NULL);
-     }
- }
+     /* save the deleted lines for undo */
+-    if (undo && u_savedel(curwin->w_cursor.lnum, nlines) == FAIL)
++    if (undo && u_savedel(first, nlines) == FAIL)
+       return;
  
--/*ARGSUSED*/
-     static void
--Leave(Widget wid, XEvent *event, String *params, Cardinal *num_params)
-+Leave(Widget wid,
-+      XEvent *event,
-+      String *params UNUSED,
-+      Cardinal *num_params UNUSED)
- {
-     XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget)wid;
-     XmPushButtonCallbackStruct call_value;
+     for (n = 0; n < nlines; )
+     {
+       if (curbuf->b_ml.ml_flags & ML_EMPTY)       /* nothing to delete */
+           break;
  
-     if (Lab_IsMenupane(eb))
-@@ -974,13 +978,12 @@ set_size(XmEnhancedButtonWidget newtb)
+-      ml_delete(curwin->w_cursor.lnum, TRUE);
++      ml_delete(first, TRUE);
+       ++n;
  
-       (* resize) ((Widget) newtb);
+       /* If we delete the last line in the file, stop */
+-      if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
++      if (first > curbuf->b_ml.ml_line_count)
+           break;
      }
- }
--/*ARGSUSED*/
-     static void
--Initialize(Widget rq, Widget ebw, ArgList args, Cardinal *n)
-+Initialize(Widget rq, Widget ebw, ArgList args UNUSED, Cardinal *n UNUSED)
- {
-     XmEnhancedButtonWidget  request = (XmEnhancedButtonWidget)rq;
-     XmEnhancedButtonWidget  eb = (XmEnhancedButtonWidget)ebw;
-     XtWidgetProc          resize;
+-    /* adjust marks, mark the buffer as changed and prepare for displaying */
+-    deleted_lines_mark(curwin->w_cursor.lnum, n);
  
-@@ -1054,13 +1057,16 @@ Destroy(Widget w)
-       return;
++    /* Correct the cursor position before calling deleted_lines_mark(), it may
++     * trigger a callback to display the cursor. */
+     curwin->w_cursor.col = 0;
+     check_cursor_lnum();
++
++    /* adjust marks, mark the buffer as changed and prepare for displaying */
++    deleted_lines_mark(first, n);
+ }
  
-     free_pixmaps((XmEnhancedButtonWidget)w);
+     int
+ gchar_pos(pos)
+     pos_T *pos;
+@@ -2620,10 +2625,12 @@ deleted_lines(lnum, count)
+     changed_lines(lnum, 0, lnum + count, -count);
  }
  
--/*ARGSUSED*/
-     static Boolean
--SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *n)
-+SetValues(Widget current,
-+        Widget request UNUSED,
-+        Widget new,
-+        ArgList args UNUSED,
-+        Cardinal *n UNUSED)
+ /*
+  * Like deleted_lines(), but adjust marks first.
++ * Make sure the cursor is on a valid line before calling, a GUI callback may
++ * be triggered to display the cursor.
+  */
+     void
+ deleted_lines_mark(lnum, count)
+     linenr_T  lnum;
+     long      count;
+@@ -2715,10 +2722,13 @@ changed_common(lnum, col, lnume, xtra)
+     colnr_T   col;
+     linenr_T  lnume;
+     long      xtra;
  {
-     XmEnhancedButtonWidget  cur = (XmEnhancedButtonWidget) current;
-     XmEnhancedButtonWidget  eb = (XmEnhancedButtonWidget) new;
-     Boolean               redraw = False;
-     Boolean               change = True;
-@@ -1106,11 +1112,11 @@ SetValues(Widget current, Widget request
-           if (root == root_q)
-           {
-               if ((win_x < 0) || (win_y < 0))
-                   return False;
+     win_T     *wp;
++#ifdef FEAT_WINDOWS
++    tabpage_T *tp;
++#endif
+     int               i;
+ #ifdef FEAT_JUMPLIST
+     int               cols;
+     pos_T     *p;
+     int               add;
+@@ -2767,19 +2777,19 @@ changed_common(lnum, col, lnume, xtra)
+               {
+                   /* changelist is full: remove oldest entry */
+                   curbuf->b_changelistlen = JUMPLISTSIZE - 1;
+                   mch_memmove(curbuf->b_changelist, curbuf->b_changelist + 1,
+                                         sizeof(pos_T) * (JUMPLISTSIZE - 1));
+-                  FOR_ALL_WINDOWS(wp)
++                  FOR_ALL_TAB_WINDOWS(tp, wp)
+                   {
+                       /* Correct position in changelist for other windows on
+                        * this buffer. */
+                       if (wp->w_buffer == curbuf && wp->w_changelistidx > 0)
+                           --wp->w_changelistidx;
+                   }
+               }
+-              FOR_ALL_WINDOWS(wp)
++              FOR_ALL_TAB_WINDOWS(tp, wp)
+               {
+                   /* For other windows, if the position in the changelist is
+                    * at the end it stays at the end. */
+                   if (wp->w_buffer == curbuf
+                           && wp->w_changelistidx == curbuf->b_changelistlen)
+@@ -2794,11 +2804,11 @@ changed_common(lnum, col, lnume, xtra)
+        * takes you back to it. */
+       curwin->w_changelistidx = curbuf->b_changelistlen;
+ #endif
+     }
  
--              if ((win_x > r_width) || (win_y > r_height))
-+              if ((win_x > (int)r_width) || (win_y > (int)r_height))
-                   return False;
-               draw_highlight(eb);
-               draw_shadows(eb);
-           }
+-    FOR_ALL_WINDOWS(wp)
++    FOR_ALL_TAB_WINDOWS(tp, wp)
+     {
+       if (wp->w_buffer == curbuf)
+       {
+           /* Mark this window to be redrawn later. */
+           if (wp->w_redr_type < VALID)
+@@ -2876,10 +2886,17 @@ changed_common(lnum, col, lnume, xtra)
+                        * may need to be redrawn */
+                       wp->w_lines[i].wl_valid = FALSE;
+                   }
+ #endif
+               }
++
++#ifdef FEAT_FOLDING
++          /* Take care of side effects for setting w_topline when folds have
++           * changed.  Esp. when the buffer was changed in another window. */
++          if (hasAnyFolding(wp))
++              set_topline(wp, wp->w_topline);
++#endif
        }
-@@ -1254,11 +1260,11 @@ Redisplay(Widget w, XEvent *event, Regio
-              ->primitive_class.border_highlight))(w);
-       draw_pixmap(eb, event, region);
      }
-     else
-     {
--      int adjust = 0;
-+      adjust = 0;
  
- #if !defined(LESSTIF_VERSION) && (XmVersion > 1002)
-       /*
-        *  NOTE: PushButton has two types of shadows: primitive-shadow and
-        *  default-button-shadow.  If pushbutton is in a menu only primitive
-@@ -1266,16 +1272,15 @@ Redisplay(Widget w, XEvent *event, Regio
+     /* Call update_screen() later, which checks out what needs to be redrawn,
+      * since it notices b_mod_set and then uses b_mod_*. */
+@@ -2953,10 +2970,12 @@ check_status(buf)
+     void
+ change_warning(col)
+     int           col;                /* column for message; non-zero when in insert
+                                  mode and 'showmode' is on */
+ {
++    static char *w_readonly = N_("W10: Warning: Changing a readonly file");
++
+     if (curbuf->b_did_warn == FALSE
+           && curbufIsChanged() == 0
+ #ifdef FEAT_AUTOCMD
+           && !autocmd_busy
+ #endif
+@@ -2975,12 +2994,14 @@ change_warning(col)
         */
-       switch (default_button_emphasis)
+       msg_start();
+       if (msg_row == Rows - 1)
+           msg_col = col;
+       msg_source(hl_attr(HLF_W));
+-      MSG_PUTS_ATTR(_("W10: Warning: Changing a readonly file"),
+-                                                 hl_attr(HLF_W) | MSG_HIST);
++      MSG_PUTS_ATTR(_(w_readonly), hl_attr(HLF_W) | MSG_HIST);
++#ifdef FEAT_EVAL
++      set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_readonly), -1);
++#endif
+       msg_clr_eos();
+       (void)msg_end();
+       if (msg_silent == 0 && !silent_mode)
        {
-           case XmEXTERNAL_HIGHLIGHT:
-               adjust = (eb->primitive.highlight_thickness -
--                      (eb->pushbutton.default_button_shadow_thickness ?
--                       Xm3D_ENHANCE_PIXEL : 0));
-+                       (eb->pushbutton.default_button_shadow_thickness
-+                        ?  Xm3D_ENHANCE_PIXEL : 0));
-               break;
+           out_flush();
+@@ -3243,13 +3264,13 @@ prompt_for_number(mouse_used)
+     int               save_cmdline_row;
+     int               save_State;
  
-           case XmINTERNAL_HIGHLIGHT:
--              adjust = 0;
-               break;
+     /* When using ":silent" assume that <CR> was entered. */
+     if (mouse_used != NULL)
+-      MSG_PUTS(_("Type number or click with mouse (<Enter> cancels): "));
++      MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): "));
+     else
+-      MSG_PUTS(_("Choice number (<Enter> cancels): "));
++      MSG_PUTS(_("Type number and <Enter> (empty cancels): "));
  
-           default:
-               assert(FALSE);
-               return;
---- vim72.orig/src/message.c
-+++ vim72/src/message.c
-@@ -105,11 +105,11 @@ msg(s)
- {
-     return msg_attr_keep(s, 0, FALSE);
- }
+     /* Set the state such that text can be selected/copied/pasted and we still
+      * get mouse events. */
+     save_cmdline_row = cmdline_row;
+     cmdline_row = 0;
+@@ -3262,10 +3283,11 @@ prompt_for_number(mouse_used)
+       /* don't call wait_return() now */
+       /* msg_putchar('\n'); */
+       cmdline_row = msg_row - 1;
+       need_wait_return = FALSE;
+       msg_didany = FALSE;
++      msg_didout = FALSE;
+     }
+     else
+       cmdline_row = save_cmdline_row;
+     State = save_State;
  
- #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \
--    || defined(PROTO)
-+    || defined(FEAT_GUI_GTK) || defined(PROTO)
+@@ -3446,11 +3468,13 @@ init_homedir()
+     {
+       char_u *homedrive, *homepath;
+       homedrive = mch_getenv((char_u *)"HOMEDRIVE");
+       homepath = mch_getenv((char_u *)"HOMEPATH");
+-      if (homedrive != NULL && homepath != NULL
++      if (homepath == NULL || *homepath == NUL)
++          homepath = "\\";
++      if (homedrive != NULL
+                          && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL)
+       {
+           sprintf((char *)NameBuff, "%s%s", homedrive, homepath);
+           if (NameBuff[0] != NUL)
+           {
+@@ -4139,14 +4163,13 @@ vim_setenv(name, val)
+ #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
  /*
-  * Like msg() but keep it silent when 'verbosefile' is set.
+  * Function given to ExpandGeneric() to obtain an environment variable name.
   */
-     int
- verb_msg(s)
-@@ -816,14 +816,13 @@ delete_first_msg()
+-/*ARGSUSED*/
+     char_u *
+ get_env_name(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+ # if defined(AMIGA) || defined(__MRC__) || defined(__SC__)
+     /*
+      * No environ[] on the Amiga and on the Mac (using MPW).
+@@ -4643,11 +4666,10 @@ concat_fnames(fname1, fname2, sep)
+       STRCAT(dest, fname2);
+     }
+     return dest;
  }
  
+-#if defined(FEAT_EVAL) || defined(FEAT_GETTEXT) || defined(PROTO)
  /*
-  * ":messages" command.
+  * Concatenate two strings and return the result in allocated memory.
+  * Returns NULL when out of memory.
   */
--/*ARGSUSED*/
-     void
- ex_messages(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     struct msg_hist *p;
-     char_u        *s;
-     msg_hist_off = TRUE;
-@@ -974,11 +973,11 @@ wait_return(redraw)
-                       c = K_IGNORE;
-                       hit_return_msg();
-                   }
-               }
-               else if (msg_scrolled > Rows - 2
--                                   && (c == 'j' || c == K_DOWN || c == 'd'))
-+                       && (c == 'j' || c == K_DOWN || c == 'd' || c == 'f'))
-                   c = K_IGNORE;
-           }
-       } while ((had_got_int && c == Ctrl_C)
-                               || c == K_IGNORE
- #ifdef FEAT_GUI
-@@ -2502,23 +2501,24 @@ do_more_prompt(typed_char)
-       case K_DOWN:
-           scroll = 1;
-           break;
-       case 'u':               /* Up half a page */
--      case K_PAGEUP:
-           scroll = -(Rows / 2);
-           break;
+     char_u  *
+@@ -4664,11 +4686,10 @@ concat_str(str1, str2)
+       STRCPY(dest, str1);
+       STRCPY(dest + l, str2);
+     }
+     return dest;
+ }
+-#endif
  
-       case 'd':               /* Down half a page */
-           scroll = Rows / 2;
+ /*
+  * Add a path separator to a file name, unless it already ends in a path
+  * separator.
+  */
+@@ -4734,13 +4755,13 @@ find_start_comment(ind_maxcomment)         /
+       /*
+        * Check if the comment start we found is inside a string.
+        * If it is then restrict the search to below this line and try again.
+        */
+       line = ml_get(pos->lnum);
+-      for (p = line; *p && (unsigned)(p - line) < pos->col; ++p)
++      for (p = line; *p && (colnr_T)(p - line) < pos->col; ++p)
+           p = skip_string(p);
+-      if ((unsigned)(p - line) <= pos->col)
++      if ((colnr_T)(p - line) <= pos->col)
            break;
+       cur_maxcomment = curwin->w_cursor.lnum - pos->lnum - 1;
+       if (cur_maxcomment <= 0)
+       {
+           pos = NULL;
+@@ -6247,10 +6268,12 @@ get_c_indent()
+           case 'h': ind_scopedecl_code = n; break;
+           case 'j': ind_java = n; break;
+           case 'l': ind_keep_case_label = n; break;
+           case '#': ind_hash_comment = n; break;
+       }
++      if (*options == ',')
++          ++options;
+     }
  
-       case 'b':               /* one page back */
-+      case K_PAGEUP:
-           scroll = -(Rows - 1);
-           break;
+     /* remember where the cursor was when we started */
+     cur_curpos = curwin->w_cursor;
  
-       case ' ':               /* one extra page */
-+      case 'f':
-       case K_PAGEDOWN:
-       case K_LEFTMOUSE:
-           scroll = Rows - 1;
-           break;
+@@ -6267,11 +6290,11 @@ get_c_indent()
+      * inserting new stuff.
+      * For unknown reasons the cursor might be past the end of the line, thus
+      * check for that.
+      */
+     if ((State & INSERT)
+-          && curwin->w_cursor.col < STRLEN(linecopy)
++          && curwin->w_cursor.col < (colnr_T)STRLEN(linecopy)
+           && linecopy[curwin->w_cursor.col] == ')')
+       linecopy[curwin->w_cursor.col] = NUL;
  
-@@ -2550,18 +2550,20 @@ do_more_prompt(typed_char)
- #ifdef FEAT_CON_DIALOG
-           if (confirm_msg_used)
-           {
-               /* Jump to the choices of the dialog. */
-               retval = TRUE;
--              lines_left = Rows - 1;
-           }
-           else
- #endif
-           {
-               got_int = TRUE;
-               quit_more = TRUE;
-           }
-+          /* When there is some more output (wrapping line) display that
-+           * without another prompt. */
-+          lines_left = Rows - 1;
-           break;
+     theline = skipwhite(linecopy);
  
- #ifdef FEAT_CLIPBOARD
-       case Ctrl_Y:
-           /* Strange way to allow copying (yanking) a modeless
-@@ -3018,15 +3020,11 @@ redir_write(str, maxlen)
-      * Must come before the rest because of updating "msg_col".
-      */
-     if (*p_vfile != NUL)
-       verbose_write(s, maxlen);
+@@ -7704,15 +7727,18 @@ term_again:
+       }
  
--    if (redir_fd != NULL
--#ifdef FEAT_EVAL
--                        || redir_reg || redir_vname
--#endif
--                                     )
-+    if (redirecting())
-     {
-       /* If the string doesn't start with CR or NL, go to msg_col */
-       if (*s != '\n' && *s != '\r')
+       /*
+        * If the NEXT line is a function declaration, the current
+        * line needs to be indented as a function type spec.
+-       * Don't do this if the current line looks like a comment
+-       * or if the current line is terminated, ie. ends in ';'.
++       * Don't do this if the current line looks like a comment or if the
++       * current line is terminated, ie. ends in ';', or if the current line
++       * contains { or }: "void f() {\n if (1)"
+        */
+       else if (cur_curpos.lnum < curbuf->b_ml.ml_line_count
+               && !cin_nocode(theline)
++              && vim_strchr(theline, '{') == NULL
++              && vim_strchr(theline, '}') == NULL
+               && !cin_ends_in(theline, (char_u *)":", NULL)
+               && !cin_ends_in(theline, (char_u *)",", NULL)
+               && cin_isfuncdecl(NULL, cur_curpos.lnum + 1)
+               && !cin_isterminated(theline, FALSE, TRUE))
        {
-           while (cur_col < msg_col)
-@@ -3069,10 +3067,20 @@ redir_write(str, maxlen)
-       if (msg_silent != 0)    /* should update msg_col */
-           msg_col = cur_col;
+@@ -8424,10 +8450,50 @@ fast_breakcheck()
+       ui_breakcheck();
      }
  }
  
+ /*
++ * Invoke expand_wildcards() for one pattern.
++ * Expand items like "%:h" before the expansion.
++ * Returns OK or FAIL.
++ */
 +    int
-+redirecting()
++expand_wildcards_eval(pat, num_file, file, flags)
++    char_u     **pat;         /* pointer to input pattern */
++    int                 *num_file;    /* resulting number of files */
++    char_u    ***file;        /* array of resulting files */
++    int                  flags;       /* EW_DIR, etc. */
 +{
-+    return redir_fd != NULL
-+#ifdef FEAT_EVAL
-+                        || redir_reg || redir_vname
-+#endif
-+                                     ;
++    int               ret = FAIL;
++    char_u    *eval_pat = NULL;
++    char_u    *exp_pat = *pat;
++    char_u      *ignored_msg;
++    int               usedlen;
++
++    if (*exp_pat == '%' || *exp_pat == '#' || *exp_pat == '<')
++    {
++      ++emsg_off;
++      eval_pat = eval_vars(exp_pat, exp_pat, &usedlen,
++                                                  NULL, &ignored_msg, NULL);
++      --emsg_off;
++      if (eval_pat != NULL)
++          exp_pat = concat_str(eval_pat, exp_pat + usedlen);
++    }
++
++    if (exp_pat != NULL)
++      ret = expand_wildcards(1, &exp_pat, num_file, file, flags);
++
++    if (eval_pat != NULL)
++    {
++      vim_free(exp_pat);
++      vim_free(eval_pat);
++    }
++
++    return ret;
 +}
 +
- /*
-  * Before giving verbose message.
-  * Must always be called paired with verbose_leave()!
-  */
-     void
-@@ -3279,19 +3287,19 @@ msg_advance(col)
-  * The second button should be the 'Cancel' button
-  * Other buttons- use your imagination!
-  * A '&' in a button name becomes a shortcut, so each '&' should be before a
-  * different letter.
++/*
+  * Expand wildcards.  Calls gen_expand_wildcards() and removes files matching
+  * 'wildignore'.
+  * Returns OK or FAIL.
   */
--/* ARGSUSED */
      int
- do_dialog(type, title, message, buttons, dfltbutton, textfield)
--    int               type;
--    char_u    *title;
-+    int               type UNUSED;
-+    char_u    *title UNUSED;
-     char_u    *message;
-     char_u    *buttons;
-     int               dfltbutton;
--    char_u    *textfield;     /* IObuff for inputdialog(), NULL otherwise */
-+    char_u    *textfield UNUSED;      /* IObuff for inputdialog(), NULL
-+                                         otherwise */
- {
-     int               oldState;
-     int               retval = 0;
-     char_u    *hotkeys;
-     int               c;
-@@ -3307,11 +3315,14 @@ do_dialog(type, title, message, buttons,
-     /* When GUI is running and 'c' not in 'guioptions', use the GUI dialog */
-     if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL)
+@@ -8520,15 +8586,29 @@ match_suffix(fname)
+     fnamelen = (int)STRLEN(fname);
+     setsuflen = 0;
+     for (setsuf = p_su; *setsuf; )
      {
-       c = gui_mch_dialog(type, title, message, buttons, dfltbutton,
-                                                                  textfield);
--      msg_end_prompt();
-+      /* avoid a hit-enter prompt without clearing the cmdline */
-+      need_wait_return = FALSE;
-+      emsg_on_display = FALSE;
-+      cmdline_row = msg_row;
+       setsuflen = copy_option_part(&setsuf, suf_buf, MAXSUFLEN, ".,");
+-      if (fnamelen >= setsuflen
+-              && fnamencmp(suf_buf, fname + fnamelen - setsuflen,
+-                                            (size_t)setsuflen) == 0)
+-          break;
+-      setsuflen = 0;
++      if (setsuflen == 0)
++      {
++          char_u *tail = gettail(fname);
++
++          /* empty entry: match name without a '.' */
++          if (vim_strchr(tail, '.') == NULL)
++          {
++              setsuflen = 1;
++              break;
++          }
++      }
++      else
++      {
++          if (fnamelen >= setsuflen
++                  && fnamencmp(suf_buf, fname + fnamelen - setsuflen,
++                                                (size_t)setsuflen) == 0)
++              break;
++          setsuflen = 0;
++      }
+     }
+     return (setsuflen != 0);
+ }
  
-       /* Flush output to avoid that further messages and redrawing is done
-        * in the wrong order. */
-       out_flush();
-       gui_mch_update();
-@@ -4007,11 +4018,11 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-     while (*p != NUL)
+ #if !defined(NO_EXPANDPATH) || defined(PROTO)
+@@ -8726,11 +8806,11 @@ dos_expandpath(
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
      {
-       if (*p != '%')
+       /* The active codepage differs from 'encoding'.  Attempt using the
+        * wide function.  If it fails because it is not implemented fall back
+        * to the non-wide version (for Windows 98) */
+-      wn = enc_to_ucs2(buf, NULL);
++      wn = enc_to_utf16(buf, NULL);
+       if (wn != NULL)
        {
-           char    *q = strchr(p + 1, '%');
--          size_t  n = (q == NULL) ? STRLEN(p) : (q - p);
-+          size_t  n = (q == NULL) ? STRLEN(p) : (size_t)(q - p);
-           /* Copy up to the next '%' or NUL without any changes. */
-           if (str_l < str_m)
+           hFind = FindFirstFileW(wn, &wfb);
+           if (hFind == INVALID_HANDLE_VALUE
+                             && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
+@@ -8754,11 +8834,11 @@ dos_expandpath(
+     while (ok)
+     {
+ #ifdef WIN3264
+ # ifdef FEAT_MBYTE
+       if (wn != NULL)
+-          p = ucs2_to_enc(wfb.cFileName, NULL);   /* p is allocated here */
++          p = utf16_to_enc(wfb.cFileName, NULL);   /* p is allocated here */
+       else
+ # endif
+           p = (char_u *)fb.cFileName;
+ #else
+       p = (char_u *)fb.ff_name;
+@@ -8828,11 +8908,11 @@ dos_expandpath(
+           FindClose(hFind);
+ # ifdef FEAT_MBYTE
+           if (wn != NULL)
            {
-               size_t avail = str_m - str_l;
-@@ -4254,11 +4265,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                       /* memchr on HP does not like n > 2^31  !!! */
-                       char *q = memchr(str_arg, '\0',
-                                 precision <= (size_t)0x7fffffffL ? precision
-                                                      : (size_t)0x7fffffffL);
+               vim_free(wn);
+-              wn = enc_to_ucs2(buf, NULL);
++              wn = enc_to_utf16(buf, NULL);
+               if (wn != NULL)
+                   hFind = FindFirstFileW(wn, &wfb);
+           }
+           if (wn == NULL)
+ # endif
+@@ -9186,11 +9266,11 @@ gen_expand_wildcards(num_pat, pat, num_f
+                * found file names and start all over again.
+                */
+               else if (vim_strpbrk(p, (char_u *)"$~") != NULL)
+               {
+                   vim_free(p);
+-                  ga_clear(&ga);
++                  ga_clear_strings(&ga);
+                   i = mch_expand_wildcards(num_pat, pat, num_file, file,
+                                                                      flags);
+                   recursive = FALSE;
+                   return i;
+               }
+--- vim72.orig/src/misc2.c
++++ vim72/src/misc2.c
+@@ -154,11 +154,11 @@ coladvance2(pos, addspaces, finetune, wc
  #endif
--                      str_arg_l = (q == NULL) ? precision : q - str_arg;
-+                      str_arg_l = (q == NULL) ? precision
-+                                                    : (size_t)(q - str_arg);
-                   }
-                   break;
+ #ifdef FEAT_VIRTUALEDIT
+                   || ((ve_flags & VE_ONEMORE) && wcol < MAXCOL)
+ #endif
+                   ;
+-    line = ml_get_curline();
++    line = ml_get_buf(curbuf, pos->lnum, FALSE);
  
-               default:
-                   break;
-@@ -4354,11 +4366,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                               uint_arg =
- #ifndef HAVE_STDARG_H
-                                           get_a_arg(arg_idx);
- #else
- # if defined(FEAT_EVAL)
--                                          tvs != NULL ? tv_nr(tvs, &arg_idx) :
-+                                          tvs != NULL ? (unsigned)
-+                                                      tv_nr(tvs, &arg_idx) :
- # endif
-                                               va_arg(ap, unsigned int);
+     if (wcol >= MAXCOL)
+     {
+           idx = (int)STRLEN(line) - 1 + one_more;
+           col = wcol;
+@@ -330,13 +330,13 @@ coladvance2(pos, addspaces, finetune, wc
+       }
+     }
  #endif
-                               if (uint_arg != 0)
-                                   arg_sign = 1;
-@@ -4367,11 +4380,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                               ulong_arg =
- #ifndef HAVE_STDARG_H
-                                           get_a_arg(arg_idx);
- #else
- # if defined(FEAT_EVAL)
--                                          tvs != NULL ? tv_nr(tvs, &arg_idx) :
-+                                          tvs != NULL ? (unsigned long)
-+                                                      tv_nr(tvs, &arg_idx) :
- # endif
-                                               va_arg(ap, unsigned long int);
+ #ifdef FEAT_MBYTE
+-    /* prevent cursor from moving on the trail byte */
++    /* prevent from moving onto a trail byte */
+     if (has_mbyte)
+-      mb_adjust_cursor();
++      mb_adjustpos(pos);
  #endif
-                               if (ulong_arg != 0)
-                                   arg_sign = 1;
-@@ -4554,11 +4568,17 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                       else
-                           fmt_spec = fmt_spec == 'g' ? 'e' : 'E';
-                       remove_trailing_zeroes = TRUE;
-                   }
  
--                  if (fmt_spec == 'f' && abs_f > 1.0e307)
-+                  if (fmt_spec == 'f' &&
-+#ifdef VAX
-+                          abs_f > 1.0e38
-+#else
-+                          abs_f > 1.0e307
-+#endif
-+                          )
-                   {
-                       /* Avoid a buffer overflow */
-                       strcpy(tmp, "inf");
-                       str_arg_l = 3;
-                   }
-@@ -4583,65 +4603,66 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                       str_arg_l = sprintf(tmp, format, f);
+     if (col < wcol)
+       return FAIL;
+     return OK;
+@@ -494,11 +494,12 @@ check_cursor_lnum()
+     void
+ check_cursor_col()
+ {
+     colnr_T len;
+ #ifdef FEAT_VIRTUALEDIT
+-    colnr_T oldcol = curwin->w_cursor.col + curwin->w_cursor.coladd;
++    colnr_T oldcol = curwin->w_cursor.col;
++    colnr_T oldcoladd = curwin->w_cursor.col + curwin->w_cursor.coladd;
+ #endif
  
-                       if (remove_trailing_zeroes)
-                       {
-                           int i;
--                          char *p;
-+                          char *tp;
+     len = (colnr_T)STRLEN(ml_get_curline());
+     if (len == 0)
+       curwin->w_cursor.col = 0;
+@@ -525,19 +526,27 @@ check_cursor_col()
+           if (has_mbyte)
+               mb_adjust_cursor();
+ #endif
+       }
+     }
++    else if (curwin->w_cursor.col < 0)
++      curwin->w_cursor.col = 0;
  
-                           /* Using %g or %G: remove superfluous zeroes. */
-                           if (fmt_spec == 'f')
--                              p = tmp + str_arg_l - 1;
-+                              tp = tmp + str_arg_l - 1;
-                           else
-                           {
--                              p = (char *)vim_strchr((char_u *)tmp,
-+                              tp = (char *)vim_strchr((char_u *)tmp,
-                                                fmt_spec == 'e' ? 'e' : 'E');
--                              if (p != NULL)
-+                              if (tp != NULL)
-                               {
-                                   /* Remove superfluous '+' and leading
-                                    * zeroes from the exponent. */
--                                  if (p[1] == '+')
-+                                  if (tp[1] == '+')
-                                   {
-                                       /* Change "1.0e+07" to "1.0e07" */
--                                      STRMOVE(p + 1, p + 2);
-+                                      STRMOVE(tp + 1, tp + 2);
-                                       --str_arg_l;
-                                   }
--                                  i = (p[1] == '-') ? 2 : 1;
--                                  while (p[i] == '0')
-+                                  i = (tp[1] == '-') ? 2 : 1;
-+                                  while (tp[i] == '0')
-                                   {
-                                       /* Change "1.0e07" to "1.0e7" */
--                                      STRMOVE(p + i, p + i + 1);
-+                                      STRMOVE(tp + i, tp + i + 1);
-                                       --str_arg_l;
-                                   }
--                                  --p;
-+                                  --tp;
-                               }
-                           }
+ #ifdef FEAT_VIRTUALEDIT
+     /* If virtual editing is on, we can leave the cursor on the old position,
+      * only we must set it to virtual.  But don't do it when at the end of the
+      * line. */
+     if (oldcol == MAXCOL)
+       curwin->w_cursor.coladd = 0;
+     else if (ve_flags == VE_ALL)
+-      curwin->w_cursor.coladd = oldcol - curwin->w_cursor.col;
++    {
++      if (oldcoladd > curwin->w_cursor.col)
++          curwin->w_cursor.coladd = oldcoladd - curwin->w_cursor.col;
++      else
++          /* avoid weird number when there is a miscalculation or overflow */
++          curwin->w_cursor.coladd = 0;
++    }
+ #endif
+ }
  
--                          if (p != NULL && !precision_specified)
-+                          if (tp != NULL && !precision_specified)
-                               /* Remove trailing zeroes, but keep the one
-                                * just after a dot. */
--                              while (p > tmp + 2 && *p == '0' && p[-1] != '.')
-+                              while (tp > tmp + 2 && *tp == '0'
-+                                                           && tp[-1] != '.')
-                               {
--                                  STRMOVE(p, p + 1);
--                                  --p;
-+                                  STRMOVE(tp, tp + 1);
-+                                  --tp;
-                                   --str_arg_l;
-                               }
-                       }
-                       else
-                       {
--                          char *p;
-+                          char *tp;
+ /*
+  * make sure curwin->w_cursor in on a valid character
+@@ -871,11 +880,11 @@ lalloc(size, message)
+           allocated = 0;
+ # endif
+           /* 3. check for available memory: call mch_avail_mem() */
+           if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing)
+           {
+-              vim_free((char *)p);    /* System is low... no go! */
++              free((char *)p);        /* System is low... no go! */
+               p = NULL;
+           }
+           else
+               goto theend;
+ #endif
+@@ -996,22 +1005,30 @@ free_all_mem()
+ # endif
  
-                           /* Be consistent: some printf("%e") use 1.0e+12
-                            * and some 1.0e+012.  Remove one zero in the last
-                            * case. */
--                          p = (char *)vim_strchr((char_u *)tmp,
-+                          tp = (char *)vim_strchr((char_u *)tmp,
-                                                fmt_spec == 'e' ? 'e' : 'E');
--                          if (p != NULL && (p[1] == '+' || p[1] == '-')
--                                        && p[2] == '0'
--                                        && vim_isdigit(p[3])
--                                        && vim_isdigit(p[4]))
-+                          if (tp != NULL && (tp[1] == '+' || tp[1] == '-')
-+                                        && tp[2] == '0'
-+                                        && vim_isdigit(tp[3])
-+                                        && vim_isdigit(tp[4]))
-                           {
--                              STRMOVE(p + 2, p + 3);
-+                              STRMOVE(tp + 2, tp + 3);
-                               --str_arg_l;
-                           }
-                       }
-                   }
-                   str_arg = tmp;
-@@ -4683,11 +4704,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                   if (str_l < str_m)
-                   {
-                       size_t avail = str_m - str_l;
+ # ifdef FEAT_MENU
+     /* Clear menus. */
+     do_cmdline_cmd((char_u *)"aunmenu *");
++#  ifdef FEAT_MULTI_LANG
++    do_cmdline_cmd((char_u *)"menutranslate clear");
++#  endif
+ # endif
  
-                       vim_memset(str + str_l, zero_padding ? '0' : ' ',
--                                           (size_t)pn > avail ? avail : pn);
-+                                           (size_t)pn > avail ? avail
-+                                                              : (size_t)pn);
-                   }
-                   str_l += pn;
-               }
-           }
+     /* Clear mappings, abbreviations, breakpoints. */
++    do_cmdline_cmd((char_u *)"lmapclear");
++    do_cmdline_cmd((char_u *)"xmapclear");
+     do_cmdline_cmd((char_u *)"mapclear");
+     do_cmdline_cmd((char_u *)"mapclear!");
+     do_cmdline_cmd((char_u *)"abclear");
+ # if defined(FEAT_EVAL)
+     do_cmdline_cmd((char_u *)"breakdel *");
+ # endif
+ # if defined(FEAT_PROFILE)
+     do_cmdline_cmd((char_u *)"profdel *");
+ # endif
++# if defined(FEAT_KEYMAP)
++    do_cmdline_cmd((char_u *)"set keymap=");
++#endif
  
-@@ -4710,11 +4732,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                   if (str_l < str_m)
-                   {
-                       size_t avail = str_m - str_l;
+ # ifdef FEAT_TITLE
+     free_titles();
+ # endif
+ # if defined(FEAT_SEARCHPATH)
+@@ -1032,10 +1049,13 @@ free_all_mem()
+     free_last_insert();
+     free_prev_shellcmd();
+     free_regexp_stuff();
+     free_tag_stuff();
+     free_cd_dir();
++# ifdef FEAT_SIGNS
++    free_signs();
++# endif
+ # ifdef FEAT_EVAL
+     set_expr_line(NULL);
+ # endif
+ # ifdef FEAT_DIFF
+     diff_clear(curtab);
+@@ -1060,15 +1080,16 @@ free_all_mem()
+     init_history();
+ # endif
  
-                       mch_memmove(str + str_l, str_arg,
--                                           (size_t)zn > avail ? avail : zn);
-+                                           (size_t)zn > avail ? avail
-+                                                              : (size_t)zn);
-                   }
-                   str_l += zn;
-               }
+ #ifdef FEAT_QUICKFIX
+     {
+-      win_T   *win;
++      win_T       *win;
++      tabpage_T   *tab;
  
-               /* insert zero padding as requested by the precision or min
-@@ -4725,11 +4748,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                   if (str_l < str_m)
-                   {
-                       size_t avail = str_m-str_l;
+       qf_free_all(NULL);
+       /* Free all location lists */
+-      FOR_ALL_WINDOWS(win)
++      FOR_ALL_TAB_WINDOWS(tab, win)
+           qf_free_all(win);
+     }
+ #endif
  
-                       vim_memset(str + str_l, '0',
--                                           (size_t)zn > avail ? avail : zn);
-+                                           (size_t)zn > avail ? avail
-+                                                              : (size_t)zn);
-                   }
-                   str_l += zn;
-               }
-           }
+     /* Close all script inputs. */
+@@ -1255,25 +1276,22 @@ vim_strsave_escaped_ext(string, esc_char
+       *p2 = NUL;
+     }
+     return escaped_string;
+ }
  
-@@ -4744,11 +4768,11 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                   {
-                       size_t avail = str_m - str_l;
+-#if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * Return TRUE when 'shell' has "csh" in the tail.
+  */
+     int
+ csh_like_shell()
+ {
+     return (strstr((char *)gettail(p_sh), "csh") != NULL);
+ }
+-#endif
  
-                       mch_memmove(str + str_l,
-                               str_arg + zero_padding_insertion_ind,
--                              (size_t)sn > avail ? avail : sn);
-+                              (size_t)sn > avail ? avail : (size_t)sn);
-                   }
-                   str_l += sn;
-               }
+-#if defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * Escape "string" for use as a shell argument with system().
+- * This uses single quotes, except when we know we need to use double qoutes
++ * This uses single quotes, except when we know we need to use double quotes
+  * (MS-DOS and MS-Windows without 'shellslash' set).
+  * Escape a newline, depending on the 'shell' option.
+  * When "do_special" is TRUE also replace "!", "%", "#" and things starting
+  * with "<" like "<cfile>".
+  * Returns the result in allocated memory, NULL if we have run out.
+@@ -1372,10 +1390,11 @@ vim_strsave_shellescape(string, do_speci
+           if (do_special && find_cmdline_var(p, &l) >= 0)
+           {
+               *d++ = '\\';            /* insert backslash */
+               while (--l >= 0)        /* copy the var */
+                   *d++ = *p++;
++              continue;
            }
  
-@@ -4764,11 +4788,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
-                   if (str_l < str_m)
-                   {
-                       size_t avail = str_m - str_l;
-                       vim_memset(str + str_l, ' ',
--                                           (size_t)pn > avail ? avail : pn);
-+                                           (size_t)pn > avail ? avail
-+                                                              : (size_t)pn);
-                   }
-                   str_l += pn;
-               }
-           }
+           MB_COPY_CHAR(p, d);
        }
---- vim72.orig/runtime/doc/spell.txt
-+++ vim72/runtime/doc/spell.txt
-@@ -1,6 +1,6 @@
--*spell.txt*   For Vim version 7.2.  Last change: 2008 Jun 21
-+*spell.txt*   For Vim version 7.2.  Last change: 2008 Nov 30
  
+@@ -1389,11 +1408,10 @@ vim_strsave_shellescape(string, do_speci
+       *d = NUL;
+     }
  
-                 VIM REFERENCE MANUAL    by Bram Moolenaar
+     return escaped_string;
+ }
+-#endif
  
+ /*
+  * Like vim_strsave(), but make all characters uppercase.
+  * This uses ASCII lower-to-upper case translation, language independent.
+  */
+@@ -1525,11 +1543,11 @@ copy_spaces(ptr, count)
+ }
  
-@@ -829,12 +829,15 @@ AFFIX FILE FORMAT                        *spell-aff-format* *
-                                                       *spell-affix-comment*
- Comment lines in the .aff file start with a '#':
+ #if defined(FEAT_VISUALEXTRA) || defined(PROTO)
+ /*
+  * Copy a character a number of times.
+- * Does not work for multi-byte charactes!
++ * Does not work for multi-byte characters!
+  */
+     void
+ copy_chars(ptr, count, c)
+     char_u    *ptr;
+     size_t    count;
+@@ -2563,11 +2581,11 @@ trans_special(srcp, dst, keycode)
+ {
+     int               modifiers = 0;
+     int               key;
+     int               dlen = 0;
  
-       # comment line ~
+-    key = find_special_key(srcp, &modifiers, keycode);
++    key = find_special_key(srcp, &modifiers, keycode, FALSE);
+     if (key == 0)
+       return 0;
  
--With some items it's also possible to put a comment after it, but this isn't
--supported in general.
-+Items with a fixed number of arguments can be followed by a comment.  But only
-+if none of the arguments can contain white space.  The comment must start with
-+a "#" character.  Example:
-+
-+      KEEPCASE =  # fix case for words with this flag ~
+     /* Put the appropriate modifier in a string */
+     if (modifiers != 0)
+@@ -2599,14 +2617,15 @@ trans_special(srcp, dst, keycode)
+  * Try translating a <> name at (*srcp)[], return the key and modifiers.
+  * srcp is advanced to after the <> name.
+  * returns 0 if there is no match.
+  */
+     int
+-find_special_key(srcp, modp, keycode)
++find_special_key(srcp, modp, keycode, keep_x_key)
+     char_u    **srcp;
+     int               *modp;
+-    int               keycode; /* prefer key code, e.g. K_DEL instead of DEL */
++    int               keycode;     /* prefer key code, e.g. K_DEL instead of DEL */
++    int               keep_x_key;  /* don't translate xHome to Home key */
+ {
+     char_u    *last_dash;
+     char_u    *end_of_name;
+     char_u    *src;
+     char_u    *bp;
+@@ -2670,11 +2689,12 @@ find_special_key(srcp, modp, keycode)
+           if (modifiers != 0 && last_dash[2] == '>')
+               key = last_dash[1];
+           else
+           {
+               key = get_special_key_code(last_dash + 1);
+-              key = handle_x_keys(key);
++              if (!keep_x_key)
++                  key = handle_x_keys(key);
+           }
  
+           /*
+            * get_special_key_code() may return NUL for invalid
+            * special key name.
+@@ -2827,11 +2847,11 @@ get_special_key_code(name)
+ #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
+     char_u *
+ get_key_name(i)
+     int           i;
+ {
+-    if (i >= KEY_NAMES_TABLE_LEN)
++    if (i >= (int)KEY_NAMES_TABLE_LEN)
+       return NULL;
+     return  key_names_table[i].name;
+ }
+ #endif
  
- ENCODING                                                      *spell-SET*
+@@ -3855,11 +3875,12 @@ typedef struct ff_visited
+ #endif
+     /* for unix use inode etc for comparison (needed because of links), else
+      * use filename.
+      */
+ #ifdef UNIX
+-    int                       ffv_dev;        /* device number (-1 if not set) */
++    int                       ffv_dev_valid;  /* ffv_dev and ffv_ino were set */
++    dev_t             ffv_dev;        /* device number */
+     ino_t             ffv_ino;        /* inode number */
+ #endif
+     /* The memory for this struct is allocated according to the length of
+      * ffv_fname.
+      */
+@@ -4045,17 +4066,16 @@ vim_findnext()
+  * must be NULL.
+  *
+  * This function silently ignores a few errors, vim_findfile() will have
+  * limited functionality then.
+  */
+-/*ARGSUSED*/
+     void *
+ vim_findfile_init(path, filename, stopdirs, level, free_visited, find_what,
+                                          search_ctx_arg, tagfile, rel_fname)
+     char_u    *path;
+     char_u    *filename;
+-    char_u    *stopdirs;
++    char_u    *stopdirs UNUSED;
+     int               level;
+     int               free_visited;
+     int               find_what;
+     void      *search_ctx_arg;
+     int               tagfile;
+@@ -4246,11 +4266,11 @@ vim_findfile_init(path, filename, stopdi
+        * The octet after a '**' is used as a (binary) counter.
+        * So '**3' is transposed to '**^C' ('^C' is ASCII value 3)
+        * or '**76' is transposed to '**N'( 'N' is ASCII value 76).
+        * For EBCDIC you get different character values.
+        * If no restrict is given after '**' the default is used.
+-       * Due to this technic the path looks awful if you print it as a
++       * Due to this technique the path looks awful if you print it as a
+        * string.
+        */
+       len = 0;
+       while (*wc_part != NUL)
+       {
+@@ -4635,11 +4655,11 @@ vim_findfile(search_ctx_arg)
+                   {
+                       if (!path_with_url(stackp->ffs_filearray[i])
+                                     && !mch_isdir(stackp->ffs_filearray[i]))
+                           continue;   /* not a directory */
  
- The affix file can be in any encoding that is supported by "iconv".  However,
-@@ -963,10 +966,13 @@ When using "caplong" the two-character f
- "B1", "BB", etc.  This is useful to use one-character flags for the most
- common items and two-character flags for uncommon items.
+-                      /* prepare the filename to be checked for existance
++                      /* prepare the filename to be checked for existence
+                        * below */
+                       STRCPY(file_path, stackp->ffs_filearray[i]);
+                       add_pathsep(file_path);
+                       STRCAT(file_path, search_ctx->ffsc_file_to_search);
  
- Note: When using utf-8 only characters up to 65000 may be used for flags.
+@@ -4696,11 +4716,12 @@ vim_findfile(search_ctx_arg)
  
-+Note: even when using "num" or "long" the number of flags available to
-+compounding and prefixes is limited to about 250.
-+
+                               /* push dir to examine rest of subdirs later */
+                               stackp->ffs_filearray_cur = i + 1;
+                               ff_push(search_ctx, stackp);
  
- AFFIXES
-                                           *spell-PFX* *spell-SFX*
- The usual PFX (prefix) and SFX (suffix) lines are supported (see the Myspell
- documentation or the Aspell manual:
-@@ -1176,10 +1182,13 @@ Once a word has been marked as bad it wo
- word as good.
+-                              simplify_filename(file_path);
++                              if (!path_with_url(file_path))
++                                  simplify_filename(file_path);
+                               if (mch_dirname(ff_expand_buffer, MAXPATHL)
+                                                                       == OK)
+                               {
+                                   p = shorten_fname(file_path,
+                                                           ff_expand_buffer);
+@@ -5048,14 +5069,13 @@ ff_check_visited(visited_list, fname
+     /* check against list of already visited files */
+     for (vp = *visited_list; vp != NULL; vp = vp->ffv_next)
+     {
+       if (
+ #ifdef UNIX
+-              !url
+-                  ? (vp->ffv_dev == st.st_dev
+-                      && vp->ffv_ino == st.st_ino)
+-                  :
++              !url ? (vp->ffv_dev_valid && vp->ffv_dev == st.st_dev
++                                                && vp->ffv_ino == st.st_ino)
++                   :
+ #endif
+               fnamecmp(vp->ffv_fname, ff_expand_buffer) == 0
+          )
+       {
+ #ifdef FEAT_PATH_EXTRA
+@@ -5076,18 +5096,18 @@ ff_check_visited(visited_list, fname
+     if (vp != NULL)
+     {
+ #ifdef UNIX
+       if (!url)
+       {
++          vp->ffv_dev_valid = TRUE;
+           vp->ffv_ino = st.st_ino;
+           vp->ffv_dev = st.st_dev;
+           vp->ffv_fname[0] = NUL;
+       }
+       else
+       {
+-          vp->ffv_ino = 0;
+-          vp->ffv_dev = -1;
++          vp->ffv_dev_valid = FALSE;
+ #endif
+           STRCPY(vp->ffv_fname, ff_expand_buffer);
+ #ifdef UNIX
+       }
+ #endif
+@@ -5424,11 +5444,11 @@ find_file_in_path_option(ptr, len, optio
+           /* "..", "../path", "." and "./path": don't use the path_option */
+           || rel_to_curdir
+ #if defined(MSWIN) || defined(MSDOS) || defined(OS2)
+           /* handle "\tmp" as absolute path */
+           || vim_ispathsep(ff_file_to_find[0])
+-          /* handle "c:name" as absulute path */
++          /* handle "c:name" as absolute path */
+           || (ff_file_to_find[0] != NUL && ff_file_to_find[1] == ':')
+ #endif
+ #ifdef AMIGA
+           /* handle ":tmp" as absolute path */
+           || ff_file_to_find[0] == ':'
+@@ -5667,11 +5687,11 @@ qsort(base, elm_count, elm_size, cmp)
+               /* Compare the elements. */
+               p1 = (char_u *)base + j * elm_size;
+               p2 = (char_u *)base + (j + gap) * elm_size;
+               if ((*cmp)((void *)p1, (void *)p2) <= 0)
+                   break;
+-              /* Exchange the elemets. */
++              /* Exchange the elements. */
+               mch_memmove(buf, p1, elm_size);
+               mch_memmove(p1, p2, elm_size);
+               mch_memmove(p2, buf, elm_size);
+           }
  
- The flag also applies to the word with affixes, thus this can be used to mark
- a whole bunch of related words as bad.
+--- vim72.orig/src/move.c
++++ vim72/src/move.c
+@@ -181,13 +181,10 @@ update_topline()
+     if (bufempty())           /* special case - file is empty */
+     {
+       if (curwin->w_topline != 1)
+           redraw_later(NOT_VALID);
+       curwin->w_topline = 1;
+-#ifdef FEAT_DIFF
+-      curwin->w_topfill = 0;
+-#endif
+       curwin->w_botline = 2;
+       curwin->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP;
+ #ifdef FEAT_SCROLLBIND
+       curwin->w_scbind_pos = 1;
+ #endif
+@@ -278,22 +275,24 @@ update_topline()
+       if (!(curwin->w_valid & VALID_BOTLINE_AP))
+           validate_botline();
  
-+                                                      *spell-FORBIDDENWORD*
-+FORBIDDENWORD can be used just like BAD.  For compatibility with Hunspell.
-+
-                                                       *spell-NEEDAFFIX*
- The NEEDAFFIX flag is used to require that a word is used with an affix.  The
- word itself is not a good word (unless there is an empty affix).  Example:
+       if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
+       {
+-          if (curwin->w_cursor.lnum < curwin->w_botline
+-                  && ((long)curwin->w_cursor.lnum
++          if (curwin->w_cursor.lnum < curwin->w_botline)
++          {
++            if (((long)curwin->w_cursor.lnum
+                                            >= (long)curwin->w_botline - p_so
+ #ifdef FEAT_FOLDING
+                       || hasAnyFolding(curwin)
+ #endif
+                       ))
+-          {
++            {
+               lineoff_T       loff;
  
-       NEEDAFFIX + ~
-@@ -1266,10 +1275,14 @@ on the inside of a compound word.  This
- The NEEDCOMPOUND flag is used to require that a word is used as part of a
- compound word.  The word itself is not a good word.  Example:
+-              /* Cursor is above botline, check if there are 'scrolloff'
+-               * window lines below the cursor.  If not, need to scroll. */
++              /* Cursor is (a few lines) above botline, check if there are
++               * 'scrolloff' window lines below the cursor.  If not, need to
++               * scroll. */
+               n = curwin->w_empty_rows;
+               loff.lnum = curwin->w_cursor.lnum;
+ #ifdef FEAT_FOLDING
+               /* In a fold go to its last line. */
+               (void)hasFolding(loff.lnum, NULL, &loff.lnum);
+@@ -315,10 +314,14 @@ update_topline()
+                   botline_forw(&loff);
+               }
+               if (n >= p_so)
+                   /* sufficient context, no need to scroll */
+                   check_botline = FALSE;
++            }
++            else
++                /* sufficient context, no need to scroll */
++                check_botline = FALSE;
+           }
+           if (check_botline)
+           {
+ #ifdef FEAT_FOLDING
+               if (hasAnyFolding(curwin))
+@@ -507,10 +510,13 @@ set_topline(wp, lnum)
+     (void)hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
+ #endif
+     /* Approximate the value of w_botline */
+     wp->w_botline += lnum - wp->w_topline;
+     wp->w_topline = lnum;
++#ifdef FEAT_AUTOCMD
++    wp->w_topline_was_set = TRUE;
++#endif
+ #ifdef FEAT_DIFF
+     wp->w_topfill = 0;
+ #endif
+     wp->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_TOPLINE);
+     /* Don't set VALID_TOPLINE here, 'scrolloff' needs to be checked. */
+@@ -881,26 +887,26 @@ validate_cheight()
+     void
+ validate_cursor_col()
+ {
+     colnr_T off;
+     colnr_T col;
++    int     width;
  
-       NEEDCOMPOUND & ~
+     validate_virtcol();
+     if (!(curwin->w_valid & VALID_WCOL))
+     {
+       col = curwin->w_virtcol;
+       off = curwin_col_off();
+       col += off;
++      width = W_WIDTH(curwin) - off + curwin_col_off2();
  
-+                                                      *spell-ONLYINCOMPOUND*
-+The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND.  Supported for
-+compatiblity with Hunspell.
-+
-                                                       *spell-COMPOUNDMIN*
- The minimal character length of a word used for compounding is specified with
- COMPOUNDMIN.  Example:
-       COMPOUNDMIN 5 ~
+       /* long line wrapping, adjust curwin->w_wrow */
+       if (curwin->w_p_wrap
+               && col >= (colnr_T)W_WIDTH(curwin)
+-              && W_WIDTH(curwin) - off + curwin_col_off2() > 0)
+-      {
+-          col -= W_WIDTH(curwin);
+-          col = col % (W_WIDTH(curwin) - off + curwin_col_off2());
+-      }
++              && width > 0)
++          /* use same formula as what is used in curs_columns() */
++          col -= ((col - W_WIDTH(curwin)) / width + 1) * width;
+       if (col > (int)curwin->w_leftcol)
+           col -= curwin->w_leftcol;
+       else
+           col = 0;
+       curwin->w_wcol = col;
+@@ -1033,10 +1039,11 @@ curs_columns(scroll)
+       width = textwidth + curwin_col_off2();
  
-@@ -1326,10 +1339,24 @@ Note: this doesn't work for postponed pr
- The COMPOUNDROOT flag is used for words in the dictionary that are already a
- compound.  This means it counts for two words when checking the compounding
- rules.  Can also be used for an affix to count the affix as a compounding
- word.
+       /* long line wrapping, adjust curwin->w_wrow */
+       if (curwin->w_wcol >= W_WIDTH(curwin))
+       {
++          /* this same formula is used in validate_cursor_col() */
+           n = (curwin->w_wcol - W_WIDTH(curwin)) / width + 1;
+           curwin->w_wcol -= n * width;
+           curwin->w_wrow += n;
  
-+                                              *spell-CHECKCOMPOUNDPATTERN*
-+CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the
-+position where two words are compounded together forbids the compound.
-+For example:
-+      CHECKCOMPOUNDPATTERN o e ~
-+
-+This forbids compounding if the first word ends in "o" and the second word
-+starts with "e".
-+
-+The arguments must be plain text, no patterns are actually supported, despite
-+the item name.  Case is always ignored.
-+
-+The Hunspell feature to use three arguments and flags is not supported.
-+
-                                                       *spell-SYLLABLE*
- The SYLLABLE item defines characters or character sequences that are used to
- count the number of syllables in a word.  Example:
-       SYLLABLE aáeéiíoóöõuúüûy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui ~
+ #ifdef FEAT_LINEBREAK
+@@ -1227,15 +1234,14 @@ curs_columns(scroll)
+ }
  
-@@ -1494,10 +1521,14 @@ These items appear in the affix file of
- ignored, not supported or defined in another way.
+ /*
+  * Scroll the current window down by "line_count" logical lines.  "CTRL-Y"
+  */
+-/*ARGSUSED*/
+     void
+ scrolldown(line_count, byfold)
+     long      line_count;
+-    int               byfold;         /* TRUE: count a closed fold as one line */
++    int               byfold UNUSED;  /* TRUE: count a closed fold as one line */
+ {
+     long      done = 0;       /* total # of physical lines done */
+     int               wrow;
+     int               moved = FALSE;
  
- ACCENT                (Hunspell)                              *spell-ACCENT*
-               Use MAP instead. |spell-MAP|
+@@ -1247,11 +1253,12 @@ scrolldown(line_count, byfold)
+ #endif
+     validate_cursor();                /* w_wrow needs to be valid */
+     while (line_count-- > 0)
+     {
+ #ifdef FEAT_DIFF
+-      if (curwin->w_topfill < diff_check(curwin, curwin->w_topline))
++      if (curwin->w_topfill < diff_check(curwin, curwin->w_topline)
++              && curwin->w_topfill < curwin->w_height - 1)
+       {
+           ++curwin->w_topfill;
+           ++done;
+       }
+       else
+@@ -1338,15 +1345,14 @@ scrolldown(line_count, byfold)
+ }
  
-+BREAK         (Hunspell)                              *spell-BREAK*
-+              Define break points.  Unclear how it works exactly.
-+              Not supported.
-+
- CHECKCOMPOUNDCASE  (Hunspell)                 *spell-CHECKCOMPOUNDCASE*
-               Disallow uppercase letters at compound word boundaries.
-               Not supported.
+ /*
+  * Scroll the current window up by "line_count" logical lines.  "CTRL-E"
+  */
+-/*ARGSUSED*/
+     void
+ scrollup(line_count, byfold)
+     long      line_count;
+-    int               byfold;         /* TRUE: count a closed fold as one line */
++    int               byfold UNUSED;  /* TRUE: count a closed fold as one line */
+ {
+ #if defined(FEAT_FOLDING) || defined(FEAT_DIFF)
+     linenr_T  lnum;
  
- CHECKCOMPOUNDDUP  (Hunspell)                  *spell-CHECKCOMPOUNDDUP*
-@@ -1510,13 +1541,10 @@ CHECKCOMPOUNDREP  (Hunspell)                   *spell-CH
+     if (
+@@ -1602,11 +1608,11 @@ scrollup_clamp()
  
- CHECKCOMPOUNDTRIPLE  (Hunspell)                       *spell-CHECKCOMPOUNDTRIPLE*
-               Forbid three identical characters when compounding.  Not
-               supported.
+ /*
+  * Add one line above "lp->lnum".  This can be a filler line, a closed fold or
+  * a (wrapped) text line.  Uses and sets "lp->fill".
+  * Returns the height of the added line in "lp->height".
+- * Lines above the first one are incredibly high.
++ * Lines above the first one are incredibly high: MAXCOL.
+  */
+     static void
+ topline_back(lp)
+     lineoff_T *lp;
+ {
+@@ -1934,11 +1940,11 @@ scroll_cursor_bot(min_scroll, set_topbot
+               curwin->w_topline > 1;
+               curwin->w_topline = loff.lnum)
+       {
+           loff.lnum = curwin->w_topline;
+           topline_back(&loff);
+-          if (used + loff.height > curwin->w_height)
++          if (loff.height == MAXCOL || used + loff.height > curwin->w_height)
+               break;
+           used += loff.height;
+ #ifdef FEAT_DIFF
+           curwin->w_topfill = loff.fill;
+ #endif
+@@ -2013,11 +2019,14 @@ scroll_cursor_bot(min_scroll, set_topbot
+               )
+           break;
  
--CHECKCOMPOUNDPATTERN  (Hunspell)              *spell-CHECKCOMPOUNDPATTERN*
--              Forbid compounding when patterns match.  Not supported.
--
- COMPLEXPREFIXES  (Hunspell)                           *spell-COMPLEXPREFIXES*
-               Enables using two prefixes.  Not supported.
+       /* Add one line above */
+       topline_back(&loff);
+-      used += loff.height;
++      if (loff.height == MAXCOL)
++          used = MAXCOL;
++      else
++          used += loff.height;
+       if (used > curwin->w_height)
+           break;
+       if (loff.lnum >= curwin->w_botline
+ #ifdef FEAT_DIFF
+               && (loff.lnum > curwin->w_botline
+@@ -2167,11 +2176,14 @@ scroll_cursor_halfway(atend)
+       }
  
- COMPOUND      (Hunspell)                              *spell-COMPOUND*
-               This is one line with the count of COMPOUND items, followed by
-@@ -1534,16 +1562,21 @@ COMPOUNDEND    (Hunspell)                              *spell-COMPOUN
-               Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+       if (below > above)          /* add a line above the cursor */
+       {
+           topline_back(&loff);
+-          used += loff.height;
++          if (loff.height == MAXCOL)
++              used = MAXCOL;
++          else
++              used += loff.height;
+           if (used > curwin->w_height)
+               break;
+           above += loff.height;
+           topline = loff.lnum;
+ #ifdef FEAT_DIFF
+@@ -2464,13 +2476,16 @@ onepage(dir, count)
+            * at the bottom of the window. */
+           n = 0;
+           while (n <= curwin->w_height && loff.lnum >= 1)
+           {
+               topline_back(&loff);
+-              n += loff.height;
++              if (loff.height == MAXCOL)
++                  n = MAXCOL;
++              else
++                  n += loff.height;
+           }
+-          if (n <= curwin->w_height)              /* at begin of file */
++          if (loff.lnum < 1)                  /* at begin of file */
+           {
+               curwin->w_topline = 1;
+ #ifdef FEAT_DIFF
+               max_topfill();
+ #endif
+--- vim72.orig/src/msvc2008.bat
++++ vim72/src/msvc2008.bat
+@@ -1,5 +1,7 @@
++@echo off
+ rem To be used on MS-Windows for Visual C++ 2008 Express Edition
+ rem   aka Microsoft Visual Studio 9.0.
+ rem See INSTALLpc.txt for information.
++@echo on
  
- COMPOUNDMIDDLE        (Hunspell)                              *spell-COMPOUNDMIDDLE*
-               Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+ call "%VS90COMNTOOLS%%vsvars32.bat"
+--- vim72.orig/src/nbdebug.c
++++ vim72/src/nbdebug.c
+@@ -31,11 +31,10 @@
  
-+COMPOUNDRULES (Hunspell)                              *spell-COMPOUNDRULES*
-+              Number of COMPOUNDRULE lines following.  Ignored, but the
-+              argument must be a number.
-+
- COMPOUNDSYLLABLE  (Hunspell)                  *spell-COMPOUNDSYLLABLE*
-               Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE|
-               |spell-COMPOUNDSYLMAX|
+ FILE          *nb_debug = NULL;
+ u_int          nb_dlevel = 0;         /* nb_debug verbosity level */
  
--FORBIDDENWORD (Hunspell)                              *spell-FORBIDDENWORD*
--              Use BAD instead. |spell-BAD|
-+KEY           (Hunspell)                              *spell-KEY*
-+              Define characters that are close together on the keyboard.
-+              Used to give better suggestions.  Not supported.
+ void           nbdb(char *, ...);
+-void           nbtrace(char *, ...);
  
- LANG          (Hunspell)                              *spell-LANG*
-               This specifies language-specific behavior.  This actually
-               moves part of the language knowledge into the program,
-               therefore Vim does not support it.  Each language property
-@@ -1551,14 +1584,11 @@ LANG           (Hunspell)                              *spell-LANG*
+ static int     lookup(char *);
+ #ifdef USE_NB_ERRORHANDLER
+ static int     errorHandler(Display *, XErrorEvent *);
+ #endif
+@@ -98,29 +97,10 @@ nbdebug_log_init(
+       }
+ }    /* end nbdebug_log_init */
  
- LEMMA_PRESENT (Hunspell)                              *spell-LEMMA_PRESENT*
-               Only needed for morphological analysis.
  
- MAXNGRAMSUGS  (Hunspell)                              *spell-MAXNGRAMSUGS*
--              Not supported.
 -
--ONLYINCOMPOUND        (Hunspell)                              *spell-ONLYINCOMPOUND*
--              Use NEEDCOMPOUND instead. |spell-NEEDCOMPOUND|
-+              Set number of n-gram suggestions.  Not supported.
+-
+-void
+-nbtrace(
+-      char            *fmt,
+-      ...)
+-{
+-      va_list          ap;
+-
+-      if (nb_debug!= NULL && (nb_dlevel & (NB_TRACE | NB_TRACE_VERBOSE))) {
+-              va_start(ap, fmt);
+-              vfprintf(nb_debug, fmt, ap);
+-              va_end(ap);
+-              fflush(nb_debug);
+-      }
+-
+-}    /* end nbtrace */
+-
+-
+ void
+ nbdbg(
+       char            *fmt,
+       ...)
+ {
+@@ -134,27 +114,10 @@ nbdbg(
+       }
  
- PSEUDOROOT    (Hunspell)                              *spell-PSEUDOROOT*
-               Use NEEDAFFIX instead. |spell-NEEDAFFIX|
+ }    /* end nbdbg */
  
- SUGSWITHDOTS  (Hunspell)                              *spell-SUGSWITHDOTS*
---- vim72.orig/src/ops.c
-+++ vim72/src/ops.c
-@@ -70,15 +70,15 @@ static struct yankreg      *y_previous = NULL
-  * structure used by block_prep, op_delete and op_yank for blockwise operators
-  * also op_change, op_shift, op_insert, op_replace - AKelly
-  */
- struct block_def
+-void
+-nbprt(
+-      char            *fmt,
+-      ...)
+-{
+-      va_list          ap;
+-
+-      if (nb_debug != NULL && nb_dlevel & NB_PRINT) {
+-              va_start(ap, fmt);
+-              vfprintf(nb_debug, fmt, ap);
+-              va_end(ap);
+-              fflush(nb_debug);
+-      }
+-
+-}    /* end nbprt */
+-
+-
+ static int
+ lookup(
+       char            *file)
  {
--    int               startspaces;    /* 'extra' cols of first char */
--    int               endspaces;      /* 'extra' cols of first char */
-+    int               startspaces;    /* 'extra' cols before first char */
-+    int               endspaces;      /* 'extra' cols after last char */
-     int               textlen;        /* chars in block */
--    char_u    *textstart;     /* pointer to 1st char in block */
--    colnr_T   textcol;        /* cols of chars (at least part.) in block */
-+    char_u    *textstart;     /* pointer to 1st char (partially) in block */
-+    colnr_T   textcol;        /* index of chars (partially) in block */
-     colnr_T   start_vcol;     /* start col of 1st char wholly inside block */
-     colnr_T   end_vcol;       /* start col of 1st char wholly after block */
- #ifdef FEAT_VISUALEXTRA
-     int               is_short;       /* TRUE if line is too short to fit in block */
-     int               is_MAX;         /* TRUE if curswant==MAXCOL when starting */
-@@ -380,22 +380,20 @@ shift_block(oap, amount)
-     oparg_T   *oap;
-     int               amount;
+       char             buf[BUFSIZ];
+--- vim72.orig/src/nbdebug.h
++++ vim72/src/nbdebug.h
+@@ -41,12 +41,10 @@ typedef enum {
+               WT_STOP                 /* look for ~/.gvimstop if set */
+ } WtWait;
+ void           nbdbg(char *, ...);
+-void           nbprt(char *, ...);
+-void           nbtrace(char *, ...);
+ void nbdebug_wait __ARGS((u_int wait_flags, char *wait_var, u_int wait_secs));
+ void nbdebug_log_init __ARGS((char *log_var, char *level_var));
+ extern FILE   *nb_debug;
+@@ -68,21 +66,7 @@ nbdbg(
+       char            *fmt,
+       ...)
  {
-     int                       left = (oap->op_type == OP_LSHIFT);
-     int                       oldstate = State;
--    int                       total, split;
--    char_u            *newp, *oldp, *midp, *ptr;
-+    int                       total;
-+    char_u            *newp, *oldp;
-     int                       oldcol = curwin->w_cursor.col;
-     int                       p_sw = (int)curbuf->b_p_sw;
-     int                       p_ts = (int)curbuf->b_p_ts;
-     struct block_def  bd;
--    int                       internal = 0;
-     int                       incr;
--    colnr_T           vcol, col = 0, ws_vcol;
-+    colnr_T           ws_vcol;
-     int                       i = 0, j = 0;
-     int                       len;
+ }
+-void
+-nbprt(
+-      char            *fmt,
+-      ...)
+-{
+-}
 -
- #ifdef FEAT_RIGHTLEFT
-     int                       old_p_ri = p_ri;
+-void
+-nbtrace(
+-      char            *fmt,
+-      ...)
+-{
+-}
+-
+ #endif /* NBDEBUG */
+ #endif /* NBDEBUG_H */
+--- vim72.orig/src/netbeans.c
++++ vim72/src/netbeans.c
+@@ -30,10 +30,11 @@
+ #  include <tchar.h>  /* for _T definition for TRACEn macros */
+ # endif
+ /* WinSock API is separated from C API, thus we can't use read(), write(),
+  * errno... */
+ # define sock_errno WSAGetLastError()
++# undef ECONNREFUSED
+ # define ECONNREFUSED WSAECONNREFUSED
+ # ifdef EINTR
+ #  undef EINTR
+ # endif
+ # define EINTR WSAEINTR
+@@ -67,11 +68,12 @@ static char *ExtEdProtocolVersion = "2.4
  
-     p_ri = 0;                 /* don't want revins in ident */
- #endif
-@@ -422,12 +420,13 @@ shift_block(oap, amount)
-       if (bd.startspaces)
-       {
- #ifdef FEAT_MBYTE
-           if (has_mbyte)
-               bd.textstart += (*mb_ptr2len)(bd.textstart);
-+          else
- #endif
--          ++bd.textstart;
-+              ++bd.textstart;
-       }
-       for ( ; vim_iswhite(*bd.textstart); )
-       {
-           incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol));
-           total += incr;
-@@ -454,71 +453,94 @@ shift_block(oap, amount)
-       /* the end */
-       mch_memmove(newp + bd.textcol + i + j, bd.textstart, (size_t)len);
-     }
-     else /* left */
-     {
--      vcol = oap->start_vcol;
--      /* walk vcol past ws to be removed */
--      for (midp = oldp + bd.textcol;
--            vcol < (oap->start_vcol + total) && vim_iswhite(*midp); )
--      {
--          incr = lbr_chartabsize_adv(&midp, (colnr_T)vcol);
--          vcol += incr;
--      }
--      /* internal is the block-internal ws replacing a split TAB */
--      if (vcol > (oap->start_vcol + total))
--      {
--          /* we have to split the TAB *(midp-1) */
--          internal = vcol - (oap->start_vcol + total);
--      }
--      /* if 'expandtab' is not set, use TABs */
-+      colnr_T     destination_col;    /* column to which text in block will
-+                                         be shifted */
-+      char_u      *verbatim_copy_end; /* end of the part of the line which is
-+                                         copied verbatim */
-+      colnr_T     verbatim_copy_width;/* the (displayed) width of this part
-+                                         of line */
-+      unsigned    fill;               /* nr of spaces that replace a TAB */
-+      unsigned    new_line_len;       /* the length of the line after the
-+                                         block shift */
-+      size_t      block_space_width;
-+      size_t      shift_amount;
-+      char_u      *non_white = bd.textstart;
-+      colnr_T     non_white_col;
+ static long pos2off __ARGS((buf_T *, pos_T *));
+ static pos_T *off2pos __ARGS((buf_T *, long));
+ static pos_T *get_off_or_lnum __ARGS((buf_T *buf, char_u **argp));
+ static long get_buf_size __ARGS((buf_T *));
+-static void netbeans_keystring __ARGS((int key, char *keystr));
++static int netbeans_keystring __ARGS((char_u *keystr));
++static void postpone_keycommand __ARGS((char_u *keystr));
+ static void special_keys __ARGS((char_u *args));
  
--      split = bd.startspaces + internal;
--      if (split > 0)
--      {
--          if (!curbuf->b_p_et)
--          {
--              for (ptr = oldp, col = 0; ptr < oldp+bd.textcol; )
--                  col += lbr_chartabsize_adv(&ptr, (colnr_T)col);
-+      /*
-+       * Firstly, let's find the first non-whitespace character that is
-+       * displayed after the block's start column and the character's column
-+       * number. Also, let's calculate the width of all the whitespace
-+       * characters that are displayed in the block and precede the searched
-+       * non-whitespace character.
-+       */
+ static void netbeans_connect __ARGS((void));
+ static int getConnInfo __ARGS((char *file, char **host, char **port, char **password));
  
--              /* col+1 now equals the start col of the first char of the
--               * block (may be < oap.start_vcol if we're splitting a TAB) */
--              i = ((col % p_ts) + split) / p_ts; /* number of tabs */
--          }
--          if (i)
--              j = ((col % p_ts) + split) % p_ts; /* number of spp */
--          else
--              j = split;
--      }
-+      /* If "bd.startspaces" is set, "bd.textstart" points to the character,
-+       * the part of which is displayed at the block's beginning. Let's start
-+       * searching from the next character. */
-+      if (bd.startspaces)
-+          mb_ptr_adv(non_white);
+@@ -499,11 +501,11 @@ getConnInfo(char *file, char **host, cha
+ }
  
--      newp = alloc_check(bd.textcol + i + j + (unsigned)STRLEN(midp) + 1);
--      if (newp == NULL)
--          return;
--      vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + STRLEN(midp) + 1));
-+      /* The character's column is in "bd.start_vcol".  */
-+      non_white_col = bd.start_vcol;
  
--      /* copy first part we want to keep */
--      mch_memmove(newp, oldp, (size_t)bd.textcol);
--      /* Now copy any TABS and spp to ensure correct alignment! */
--      while (vim_iswhite(*midp))
-+      while (vim_iswhite(*non_white))
-       {
--          if (*midp == TAB)
--              i++;
--          else /*space */
--              j++;
--          midp++;
-+          incr = lbr_chartabsize_adv(&non_white, non_white_col);
-+          non_white_col += incr;
-       }
--      /* We might have an extra TAB worth of spp now! */
--      if (j / p_ts && !curbuf->b_p_et)
-+
-+      block_space_width = non_white_col - oap->start_vcol;
-+      /* We will shift by "total" or "block_space_width", whichever is less.
-+       */
-+      shift_amount = (block_space_width < (size_t)total
-+                                       ? block_space_width : (size_t)total);
-+
-+      /* The column to which we will shift the text.  */
-+      destination_col = (colnr_T)(non_white_col - shift_amount);
-+
-+      /* Now let's find out how much of the beginning of the line we can
-+       * reuse without modification.  */
-+      verbatim_copy_end = bd.textstart;
-+      verbatim_copy_width = bd.start_vcol;
-+
-+      /* If "bd.startspaces" is set, "bd.textstart" points to the character
-+       * preceding the block. We have to subtract its width to obtain its
-+       * column number.  */
-+      if (bd.startspaces)
-+          verbatim_copy_width -= bd.start_char_vcols;
-+      while (verbatim_copy_width < destination_col)
-       {
--          i++;
--          j -= p_ts;
-+          incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width);
-+          if (verbatim_copy_width + incr > destination_col)
-+              break;
-+          verbatim_copy_width += incr;
-+          mb_ptr_adv(verbatim_copy_end);
-       }
--      copy_chars(newp + bd.textcol, (size_t)i, TAB);
--      copy_spaces(newp + bd.textcol + i, (size_t)j);
+ struct keyqueue
+ {
+-    int                    key;
++    char_u        *keystr;
+     struct keyqueue *next;
+     struct keyqueue *prev;
+ };
+ typedef struct keyqueue keyQ_T;
+@@ -511,17 +513,21 @@ typedef struct keyqueue keyQ_T;
+ static keyQ_T keyHead; /* dummy node, header for circular queue */
  
--      /* the end */
--      STRMOVE(newp + STRLEN(newp), midp);
-+      /* If "destination_col" is different from the width of the initial
-+       * part of the line that will be copied, it means we encountered a tab
-+       * character, which we will have to partly replace with spaces.  */
-+      fill = destination_col - verbatim_copy_width;
-+
-+      /* The replacement line will consist of:
-+       * - the beginning of the original line up to "verbatim_copy_end",
-+       * - "fill" number of spaces,
-+       * - the rest of the line, pointed to by non_white.  */
-+      new_line_len = (unsigned)(verbatim_copy_end - oldp)
-+                     + fill
-+                     + (unsigned)STRLEN(non_white) + 1;
-+
-+      newp = alloc_check(new_line_len);
-+      if (newp == NULL)
-+          return;
-+      mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp));
-+      copy_spaces(newp + (verbatim_copy_end - oldp), (size_t)fill);
-+      STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white);
-     }
-     /* replace the line */
-     ml_replace(curwin->w_cursor.lnum, newp, FALSE);
-     changed_bytes(curwin->w_cursor.lnum, (colnr_T)bd.textcol);
-     State = oldstate;
-@@ -1120,10 +1142,12 @@ stuff_yank(regname, p)
-       y_current->y_type = MCHAR;  /* used to be MLINE, why? */
-     }
-     return OK;
- }
  
-+static int execreg_lastc = NUL;
-+
  /*
-  * execute a yank register: copy it into the stuff buffer
-  *
-  * return FAIL for failure, OK otherwise
+  * Queue up key commands sent from netbeans.
++ * We store the string, because it may depend on the global mod_mask and
++ * :nbkey doesn't have a key number.
   */
-@@ -1132,32 +1156,31 @@ do_execreg(regname, colon, addcr, silent
-     int           regname;
-     int           colon;              /* insert ':' before each line */
-     int           addcr;              /* always add '\n' to end of line */
-     int           silent;             /* set "silent" flag in typeahead buffer */
+     static void
+-postpone_keycommand(int key)
++postpone_keycommand(char_u *keystr)
  {
--    static int        lastc = NUL;
-     long      i;
-     char_u    *p;
-     int               retval = OK;
-     int               remap;
+     keyQ_T *node;
  
-     if (regname == '@')                       /* repeat previous one */
+     node = (keyQ_T *)alloc(sizeof(keyQ_T));
++    if (node == NULL)
++      return;  /* out of memory, drop the key */
+     if (keyHead.next == NULL) /* initialize circular queue */
      {
--      if (lastc == NUL)
-+      if (execreg_lastc == NUL)
-       {
-           EMSG(_("E748: No previously used register"));
-           return FAIL;
-       }
--      regname = lastc;
-+      regname = execreg_lastc;
-     }
-                                       /* check for valid regname */
-     if (regname == '%' || regname == '#' || !valid_yank_reg(regname, FALSE))
+       keyHead.next = &keyHead;
+       keyHead.prev = &keyHead;
+@@ -531,28 +537,33 @@ postpone_keycommand(int key)
+     node->next = &keyHead;
+     node->prev = keyHead.prev;
+     keyHead.prev->next = node;
+     keyHead.prev = node;
+-    node->key = key;
++    node->keystr = vim_strsave(keystr);
+ }
+ /*
+  * Handle any queued-up NetBeans keycommands to be send.
+  */
+     static void
+ handle_key_queue(void)
+ {
+-    while (keyHead.next && keyHead.next != &keyHead)
++    int postponed = FALSE;
++
++    while (!postponed && keyHead.next && keyHead.next != &keyHead)
      {
-       emsg_invreg(regname);
-       return FAIL;
-     }
--    lastc = regname;
-+    execreg_lastc = regname;
+       /* first, unlink the node */
+       keyQ_T *node = keyHead.next;
+       keyHead.next = node->next;
+       node->next->prev = node->prev;
  
- #ifdef FEAT_CLIPBOARD
-     regname = may_get_selection(regname);
- #endif
+-      /* now, send the keycommand */
+-      netbeans_keycommand(node->key);
++      /* Now, send the keycommand.  This may cause it to be postponed again
++       * and change keyHead. */
++      if (node->keystr != NULL)
++          postponed = !netbeans_keystring(node->keystr);
++      vim_free(node->keystr);
  
-@@ -1276,22 +1299,28 @@ put_reedit_in_typebuf(silent)
-       if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
-           restart_edit = NUL;
+       /* Finally, dispose of the node */
+       vim_free(node);
      }
  }
+@@ -698,33 +709,43 @@ netbeans_parse_messages(void)
+ #define MAXMSGSIZE 4096
  
-+/*
-+ * Insert register contents "s" into the typeahead buffer, so that it will be
-+ * executed again.
-+ * When "esc" is TRUE it is to be taken literally: Escape CSI characters and
-+ * no remapping.
-+ */
-     static int
- put_in_typebuf(s, esc, colon, silent)
-     char_u    *s;
--    int               esc;        /* Escape CSI characters */
-+    int               esc;
-     int               colon;      /* add ':' before the line */
-     int               silent;
+ /*
+  * Read and process a command from netbeans.
+  */
+-/*ARGSUSED*/
+ #if defined(FEAT_GUI_W32) || defined(PROTO)
+ /* Use this one when generating prototypes, the others are static. */
+     void
+ messageFromNetbeansW32()
+ #else
+ # ifdef FEAT_GUI_MOTIF
+     static void
+-messageFromNetbeans(XtPointer clientData, int *unused1, XtInputId *unused2)
++messageFromNetbeans(XtPointer clientData UNUSED,
++                  int *unused1 UNUSED,
++                  XtInputId *unused2 UNUSED)
+ # endif
+ # ifdef FEAT_GUI_GTK
+     static void
+-messageFromNetbeans(gpointer clientData, gint unused1,
+-                                                  GdkInputCondition unused2)
++messageFromNetbeans(gpointer clientData UNUSED,
++                  gint unused1 UNUSED,
++                  GdkInputCondition unused2 UNUSED)
+ # endif
+ #endif
  {
-     int               retval = OK;
+     static char_u     *buf = NULL;
+     int                       len;
+     int                       readlen = 0;
+ #ifndef FEAT_GUI_GTK
+     static int                level = 0;
+ #endif
++#ifdef HAVE_SELECT
++    struct timeval    tval;
++    fd_set            rfds;
++#else
++# ifdef HAVE_POLL
++    struct pollfd     fds;
++# endif
++#endif
  
-     put_reedit_in_typebuf(silent);
-     if (colon)
--      retval = ins_typebuf((char_u *)"\n", REMAP_YES, 0, TRUE, silent);
-+      retval = ins_typebuf((char_u *)"\n", REMAP_NONE, 0, TRUE, silent);
-     if (retval == OK)
+     if (sd < 0)
      {
-       char_u  *p;
+       nbdebug(("messageFromNetbeans() called without a socket\n"));
+       return;
+@@ -740,13 +761,30 @@ messageFromNetbeans(gpointer clientData,
+       buf = alloc(MAXMSGSIZE);
+       if (buf == NULL)
+           return;     /* out of memory! */
+     }
  
-       if (esc)
-@@ -1299,16 +1328,17 @@ put_in_typebuf(s, esc, colon, silent)
-       else
-           p = s;
-       if (p == NULL)
-           retval = FAIL;
-       else
--          retval = ins_typebuf(p, REMAP_YES, 0, TRUE, silent);
-+          retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES,
-+                                                           0, TRUE, silent);
-       if (esc)
-           vim_free(p);
+-    /* Keep on reading for as long as there is something to read. */
++    /* Keep on reading for as long as there is something to read.
++     * Use select() or poll() to avoid blocking on a message that is exactly
++     * MAXMSGSIZE long. */
+     for (;;)
+     {
++#ifdef HAVE_SELECT
++      FD_ZERO(&rfds);
++        FD_SET(sd, &rfds);
++        tval.tv_sec = 0;
++        tval.tv_usec = 0;
++        if (select(sd + 1, &rfds, NULL, NULL, &tval) <= 0)
++            break;
++#else
++# ifdef HAVE_POLL
++      fds.fd = sd;
++      fds.events = POLLIN;
++        if (poll(&fds, 1, 0) <= 0)
++            break;
++# endif
++#endif
+       len = sock_read(sd, buf, MAXMSGSIZE);
+       if (len <= 0)
+           break;      /* error or nothing more to read */
+       /* Store the read message in the queue. */
+@@ -767,15 +805,18 @@ messageFromNetbeans(gpointer clientData,
+           PERROR(_("read from Netbeans socket"));
+       }
+       return; /* don't try to parse it */
+     }
+-#ifdef FEAT_GUI_GTK
++#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32)
++    /* Let the main loop handle messages. */
++# ifdef FEAT_GUI_GTK
+     if (gtk_main_level() > 0)
+       gtk_main_quit();
++# endif
+ #else
+-    /* Parse the messages, but avoid recursion. */
++    /* Parse the messages now, but avoid recursion. */
+     if (level == 1)
+       netbeans_parse_messages();
+     --level;
+ #endif
+@@ -865,11 +906,11 @@ nb_parse_cmd(char_u *cmd)
+     if (nb_do_cmd(bufno, (char_u *)verb, isfunc, r_cmdno, (char_u *)q) == FAIL)
+     {
+ #ifdef NBDEBUG
+       /*
+-       * This happens because the ExtEd can send a cammand or 2 after
++       * This happens because the ExtEd can send a command or 2 after
+        * doing a stopDocumentListen command. It doesn't harm anything
+        * so I'm disabling it except for debugging.
+        */
+       nbdebug(("nb_parse_cmd: Command error for \"%s\"\n", cmd));
+       EMSG("E629: bad return from nb_do_cmd");
+@@ -1041,11 +1082,11 @@ netbeans_end(void)
+       }
+       sprintf(buf, "%d:killed=%d\n", i, r_cmdno);
+       nbdebug(("EVT: %s", buf));
+ /*    nb_send(buf, "netbeans_end");    avoid "write failed" messages */
+       if (sd >= 0)
+-          sock_write(sd, buf, (int)STRLEN(buf));  /* ignore errors */
++          ignored = sock_write(sd, buf, (int)STRLEN(buf));
      }
-     if (colon && retval == OK)
--      retval = ins_typebuf((char_u *)":", REMAP_YES, 0, TRUE, silent);
-+      retval = ins_typebuf((char_u *)":", REMAP_NONE, 0, TRUE, silent);
-     return retval;
  }
  
  /*
-  * Insert a yank register: copy it into the Read buffer.
-@@ -1996,10 +2026,11 @@ op_replace(oap, c)
-     if (oap->block_mode)
-     {
-       bd.is_MAX = (curwin->w_curswant == MAXCOL);
-       for ( ; curwin->w_cursor.lnum <= oap->end.lnum; ++curwin->w_cursor.lnum)
-       {
-+          curwin->w_cursor.col = 0;  /* make sure cursor position is valid */
-           block_prep(oap, &bd, curwin->w_cursor.lnum, TRUE);
-           if (bd.textlen == 0 && (!virtual_op || bd.is_MAX))
-               continue;           /* nothing to replace */
+  * Send a message to netbeans.
+@@ -1166,11 +1207,11 @@ nb_quote(char_u *txt)
+           default:
+               *q++ = *p;
+               break;
+       }
+     }
+-    *q++ = '\0';
++    *q = '\0';
  
-           /* n == number of extra chars required
-@@ -2011,10 +2042,11 @@ op_replace(oap, c)
-            * coladd offset as part of "startspaces" */
-           if (virtual_op && bd.is_short && *bd.textstart == NUL)
-           {
-               pos_T vpos;
+     return buf;
+ }
  
-+              vpos.lnum = curwin->w_cursor.lnum;
-               getvpos(&vpos, oap->start_vcol);
-               bd.startspaces += vpos.coladd;
-               n = bd.startspaces;
-           }
-           else
-@@ -2207,16 +2239,19 @@ op_tilde(oap)
- #ifdef FEAT_VISUAL
-     if (oap->block_mode)                  /* Visual block mode */
-     {
-       for (; pos.lnum <= oap->end.lnum; ++pos.lnum)
-       {
-+          int one_change;
-+
-           block_prep(oap, &bd, pos.lnum, FALSE);
-           pos.col = bd.textcol;
--          did_change = swapchars(oap->op_type, &pos, bd.textlen);
-+          one_change = swapchars(oap->op_type, &pos, bd.textlen);
-+          did_change |= one_change;
  
- # ifdef FEAT_NETBEANS_INTG
--          if (usingNetbeans && did_change)
-+          if (usingNetbeans && one_change)
-           {
-               char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE);
+@@ -1491,33 +1532,36 @@ nb_do_cmd(
+                   netbeansFireChanges = oldFire;
+                   netbeansSuppressNoLines = oldSuppress;
+                   return FAIL;
+               }
+               first = *pos;
+-              nbdebug(("    FIRST POS: line %d, col %d\n", first.lnum, first.col));
++              nbdebug(("    FIRST POS: line %d, col %d\n",
++                                                    first.lnum, first.col));
+               pos = off2pos(buf->bufp, off+count-1);
+               if (!pos)
+               {
+                   nbdebug(("    !bad count\n"));
+                   nb_reply_text(cmdno, (char_u *)"!bad count");
+                   netbeansFireChanges = oldFire;
+                   netbeansSuppressNoLines = oldSuppress;
+                   return FAIL;
+               }
+               last = *pos;
+-              nbdebug(("    LAST POS: line %d, col %d\n", last.lnum, last.col));
++              nbdebug(("    LAST POS: line %d, col %d\n",
++                                                      last.lnum, last.col));
+               del_from_lnum = first.lnum;
+               del_to_lnum = last.lnum;
+               doupdate = 1;
  
-               netbeans_removed(curbuf, pos.lnum, bd.textcol,
-                                                           (long)bd.textlen);
-@@ -2666,15 +2701,12 @@ op_change(oap)
+               /* Get the position of the first byte after the deleted
+                * section.  "next" is NULL when deleting to the end of the
+                * file. */
+               next = off2pos(buf->bufp, off + count);
  
-                       /* If the block starts in virtual space, count the
-                        * initial coladd offset as part of "startspaces" */
-                       if (bd.is_short)
+               /* Remove part of the first line. */
+-              if (first.col != 0 || (next != NULL && first.lnum == next->lnum))
++              if (first.col != 0
++                              || (next != NULL && first.lnum == next->lnum))
+               {
+                   if (first.lnum != last.lnum
+                           || (next != NULL && first.lnum != next->lnum))
+                   {
+                       /* remove to the end of the first line */
+@@ -1576,18 +1620,22 @@ nb_do_cmd(
+                   for (i = del_from_lnum; i <= del_to_lnum; i++)
+                   {
+                       int id = buf_findsign_id(buf->bufp, (linenr_T)i);
+                       if (id > 0)
                        {
--                          linenr_T lnum = curwin->w_cursor.lnum;
--
--                          curwin->w_cursor.lnum = linenr;
-+                          vpos.lnum = linenr;
-                           (void)getvpos(&vpos, oap->start_vcol);
--                          curwin->w_cursor.lnum = lnum;
+-                          nbdebug(("    Deleting sign %d on line %d\n", id, i));
++                          nbdebug(("    Deleting sign %d on line %d\n",
++                                                                    id, i));
+                           buf_delsign(buf->bufp, id);
                        }
                        else
-                           vpos.coladd = 0;
- # endif
-                       oldp = ml_get(linenr);
-@@ -3964,10 +3996,18 @@ ex_display(eap)
-           else
-               yb = &(y_regs[0]);
-       }
-       else
-           yb = &(y_regs[i]);
-+
-+#ifdef FEAT_EVAL
-+      if (name == MB_TOLOWER(redir_reg)
-+              || (redir_reg == '"' && yb == y_previous))
-+          continue;       /* do not list register being written to, the
-+                           * pointer can be freed */
-+#endif
-+
-       if (yb->y_array != NULL)
-       {
-           msg_putchar('\n');
-           msg_putchar('"');
-           msg_putchar(name);
-@@ -4446,33 +4486,18 @@ fex_format(lnum, count, c)
-     int               c;      /* character to be inserted */
- {
-     int               use_sandbox = was_set_insecurely((char_u *)"formatexpr",
-                                                                  OPT_LOCAL);
-     int               r;
--#ifdef FEAT_MBYTE
--    char_u    buf[MB_MAXBYTES];
--#else
--    char_u    buf[2];
--#endif
++                      {
+                           nbdebug(("    No sign on line %d\n", i));
++                      }
+                   }
  
-     /*
-      * Set v:lnum to the first line number and v:count to the number of lines.
-      * Set v:char to the character to be inserted (can be NUL).
-      */
-     set_vim_var_nr(VV_LNUM, lnum);
-     set_vim_var_nr(VV_COUNT, count);
--
--#ifdef FEAT_MBYTE
--    if (has_mbyte)
--      buf[(*mb_char2bytes)(c, buf)] = NUL;
--    else
--#endif
--    {
--      buf[0] = c;
--      buf[1] = NUL;
--    }
--    set_vim_var_string(VV_CHAR, buf, -1);
-+    set_vim_var_char(c);
+-                  nbdebug(("    Deleting lines %d through %d\n", del_from_lnum, del_to_lnum));
++                  nbdebug(("    Deleting lines %d through %d\n",
++                                               del_from_lnum, del_to_lnum));
+                   curwin->w_cursor.lnum = del_from_lnum;
+                   curwin->w_cursor.col = 0;
+                   del_lines(del_to_lnum - del_from_lnum + 1, FALSE);
+               }
  
-     /*
-      * Evaluate the function.
-      */
-     if (use_sandbox)
-@@ -4846,11 +4871,12 @@ paragraph_start(lnum)
-  *
-  * for delete:
-  * - textlen includes the first/last char to be (partly) deleted
-  * - start/endspaces is the number of columns that are taken by the
-  *   first/last deleted char minus the number of columns that have to be
-- *   deleted.  for yank and tilde:
-+ *   deleted.
-+ * for yank and tilde:
-  * - textlen includes the first/last char to be wholly yanked
-  * - start/endspaces is the number of columns of the first/last yanked char
-  *   that are to be yanked.
-  */
-     static void
-@@ -5310,34 +5336,45 @@ read_viminfo_register(virp, force)
-     char_u    *str;
-     char_u    **array = NULL;
+@@ -1793,11 +1841,11 @@ nb_do_cmd(
+           }
+           vim_free(buf->displayname);
+           buf->displayname = NULL;
  
-     /* We only get here (hopefully) if line[0] == '"' */
-     str = virp->vir_line + 1;
-+
-+    /* If the line starts with "" this is the y_previous register. */
-     if (*str == '"')
-     {
-       set_prev = TRUE;
-       str++;
-     }
-+
-     if (!ASCII_ISALNUM(*str) && *str != '-')
-     {
-       if (viminfo_error("E577: ", _("Illegal register name"), virp->vir_line))
-           return TRUE;        /* too many errors, pretend end-of-file */
-       do_it = FALSE;
-     }
-     get_yank_register(*str++, FALSE);
-     if (!force && y_current->y_array != NULL)
-       do_it = FALSE;
-+
-+    if (*str == '@')
-+    {
-+      /* "x@: register x used for @@ */
-+      if (force || execreg_lastc == NUL)
-+          execreg_lastc = str[-1];
-+    }
-+
-     size = 0;
-     limit = 100;      /* Optimized for registers containing <= 100 lines */
-     if (do_it)
-     {
-       if (set_prev)
-           y_previous = y_current;
-       vim_free(y_current->y_array);
-       array = y_current->y_array =
-                      (char_u **)alloc((unsigned)(limit * sizeof(char_u *)));
--      str = skipwhite(str);
-+      str = skipwhite(skiptowhite(str));
-       if (STRNCMP(str, "CHAR", 4) == 0)
-           y_current->y_type = MCHAR;
- #ifdef FEAT_VISUAL
-       else if (STRNCMP(str, "BLOCK", 5) == 0)
-           y_current->y_type = MBLOCK;
-@@ -5416,10 +5453,11 @@ write_viminfo_registers(fp)
-     if (max_num_lines == 0)
-       return;
-     max_kbyte = get_viminfo_parameter('s');
-     if (max_kbyte == 0)
-       return;
-+
-     for (i = 0; i < NUM_REGISTERS; i++)
-     {
-       if (y_regs[i].y_array == NULL)
-           continue;
- #ifdef FEAT_CLIPBOARD
-@@ -5470,11 +5508,14 @@ write_viminfo_registers(fp)
-               break;
-       }
-       if (y_previous == &y_regs[i])
-           fprintf(fp, "\"");
-       c = get_register_name(i);
--      fprintf(fp, "\"%c\t%s\t%d\n", c, type,
-+      fprintf(fp, "\"%c", c);
-+      if (c == execreg_lastc)
-+          fprintf(fp, "@");
-+      fprintf(fp, "\t%s\t%d\n", type,
- #ifdef FEAT_VISUAL
-                   (int)y_regs[i].y_width
- #else
-                   0
- #endif
-@@ -5548,10 +5589,36 @@ x11_export_final_selection()
+           netbeansReadFile = 0; /* don't try to open disk file */
+-          do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF);
++          do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF, curwin);
+           netbeansReadFile = 1;
+           buf->bufp = curbuf;
+           maketitle();
+           buf->insertDone = FALSE;
+           gui_update_menus(0);
+@@ -1919,11 +1967,11 @@ nb_do_cmd(
+               return FAIL;
+           bufp = buflist_findname(path);
+           vim_free(path);
+           if (bufp == NULL)
+           {
+-              nbdebug(("    File %s not found in setBufferNumber\n", args));
++              nbdebug(("    File %s not found in setBufferNumber\n", args));
+               EMSG2("E642: File %s not found in setBufferNumber", args);
+               return FAIL;
+           }
+           buf->bufp = bufp;
+           buf->nbbuf_number = bufp->b_fnum;
+@@ -1958,11 +2006,11 @@ nb_do_cmd(
+           vim_free(buf->displayname);
+           buf->displayname = nb_unquote(args, NULL);
  
-     /* Check it's OK */
-     if (dpy != NULL && str != NULL && motion_type >= 0
-                                              && len < 1024*1024 && len > 0)
-     {
-+#ifdef FEAT_MBYTE
-+      /* The CUT_BUFFER0 is supposed to always contain latin1.  Convert from
-+       * 'enc' when it is a multi-byte encoding.  When 'enc' is an 8-bit
-+       * encoding conversion usually doesn't work, so keep the text as-is.
-+       */
-+      if (has_mbyte)
-+      {
-+          vimconv_T   vc;
-+
-+          vc.vc_type = CONV_NONE;
-+          if (convert_setup(&vc, p_enc, (char_u *)"latin1") == OK)
+           netbeansReadFile = 0; /* don't try to open disk file */
+           do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE,
+-                                                   ECMD_HIDE + ECMD_OLDBUF);
++                                           ECMD_HIDE + ECMD_OLDBUF, curwin);
+           netbeansReadFile = 1;
+           buf->bufp = curbuf;
+           maketitle();
+           gui_update_menus(0);
+ /* =====================================================================*/
+@@ -1977,11 +2025,11 @@ nb_do_cmd(
+           }
+           /* Edit a file: like create + setFullName + read the file. */
+           vim_free(buf->displayname);
+           buf->displayname = nb_unquote(args, NULL);
+           do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE,
+-                                                   ECMD_HIDE + ECMD_OLDBUF);
++                                           ECMD_HIDE + ECMD_OLDBUF, curwin);
+           buf->bufp = curbuf;
+           buf->initDone = TRUE;
+           doupdate = 1;
+ #if defined(FEAT_TITLE)
+           maketitle();
+@@ -2139,11 +2187,13 @@ nb_do_cmd(
+ #ifdef FEAT_FOLDING
+               foldOpenCursor();
+ #endif
+           }
+           else
 +          {
-+              int     intlen = len;
-+              char_u  *conv_str;
-+
-+              conv_str = string_convert(&vc, str, &intlen);
-+              len = intlen;
-+              if (conv_str != NULL)
-+              {
-+                  vim_free(str);
-+                  str = conv_str;
-+              }
-+              convert_setup(&vc, NULL, NULL);
+               nbdebug(("    BAD POSITION in setDot: %s\n", s));
 +          }
-+      }
-+#endif
-       XStoreBuffer(dpy, (char *)str, (int)len, 0);
-       XFlush(dpy);
-     }
  
-     vim_free(str);
-@@ -6039,11 +6106,11 @@ str_to_reg(y_ptr, type, str, len, blockl
-     char_u    **pp;
- #ifdef FEAT_VISUAL
-     long      maxlen;
- #endif
+           /* gui_update_cursor(TRUE, FALSE); */
+           /* update_curbuf(NOT_VALID); */
+           update_topline();           /* scroll to show the line */
+           update_screen(VALID);
+@@ -2275,13 +2325,10 @@ nb_do_cmd(
+       {
+ #ifdef FEAT_SIGNS
+           int serNum;
+           int localTypeNum;
+           int typeNum;
+-# ifdef NBDEBUG
+-          int len;
+-# endif
+           pos_T *pos;
  
--    if (y_ptr->y_array == NULL)               /* NULL means emtpy register */
-+    if (y_ptr->y_array == NULL)               /* NULL means empty register */
-       y_ptr->y_size = 0;
+           if (buf == NULL || buf->bufp == NULL)
+           {
+               nbdebug(("    invalid buffer identifier in addAnno\n"));
+@@ -2301,17 +2348,14 @@ nb_do_cmd(
+           typeNum = mapsigntype(buf, localTypeNum);
  
-     /*
-      * Count the number of lines within the string
-      */
-@@ -6256,15 +6323,24 @@ cursor_pos_info()
-           if (*p_sel == 'e' && max_pos.col > 0)
-               --max_pos.col;
+           pos = get_off_or_lnum(buf->bufp, &args);
  
-           if (VIsual_mode == Ctrl_V)
+           cp = (char *)args;
+-# ifdef NBDEBUG
+-          len =
+-# endif
+-              strtol(cp, &cp, 10);
++          ignored = (int)strtol(cp, &cp, 10);
+           args = (char_u *)cp;
+ # ifdef NBDEBUG
+-          if (len != -1)
++          if (ignored != -1)
            {
-+#ifdef FEAT_LINEBREAK
-+              char_u * saved_sbr = p_sbr;
-+
-+              /* Make 'sbr' empty for a moment to get the correct size. */
-+              p_sbr = empty_option;
-+#endif
-               oparg.is_VIsual = 1;
-               oparg.block_mode = TRUE;
-               oparg.op_type = OP_NOP;
-               getvcols(curwin, &min_pos, &max_pos,
-                                         &oparg.start_vcol, &oparg.end_vcol);
-+#ifdef FEAT_LINEBREAK
-+              p_sbr = saved_sbr;
-+#endif
-               if (curwin->w_curswant == MAXCOL)
-                   oparg.end_vcol = MAXCOL;
-               /* Swap the start, end vcol if needed */
-               if (oparg.end_vcol < oparg.start_vcol)
-               {
-@@ -6364,25 +6440,27 @@ cursor_pos_info()
-       {
-           if (VIsual_mode == Ctrl_V && curwin->w_curswant < MAXCOL)
+               nbdebug(("    partial line annotation -- Not Yet Implemented!\n"));
+           }
+ # endif
+           if (serNum >= GUARDEDOFFSET)
+@@ -2319,11 +2363,11 @@ nb_do_cmd(
+               nbdebug(("    too many annotations! ignoring...\n"));
+               return FAIL;
+           }
+           if (pos)
            {
-               getvcols(curwin, &min_pos, &max_pos, &min_pos.col,
-                                                               &max_pos.col);
--              sprintf((char *)buf1, _("%ld Cols; "),
-+              vim_snprintf((char *)buf1, sizeof(buf1), _("%ld Cols; "),
-                       (long)(oparg.end_vcol - oparg.start_vcol + 1));
+-              coloncmd(":sign place %d line=%d name=%d buffer=%d",
++              coloncmd(":sign place %d line=%ld name=%d buffer=%d",
+                          serNum, pos->lnum, typeNum, buf->bufp->b_fnum);
+               if (typeNum == curPCtype)
+                   coloncmd(":sign jump %d buffer=%d", serNum,
+                                                      buf->bufp->b_fnum);
            }
-           else
-               buf1[0] = NUL;
-           if (char_count_cursor == byte_count_cursor
-                                                 && char_count == byte_count)
--              sprintf((char *)IObuff, _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"),
-+              vim_snprintf((char *)IObuff, IOSIZE,
-+                      _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"),
-                       buf1, line_count_selected,
-                       (long)curbuf->b_ml.ml_line_count,
-                       word_count_cursor, word_count,
-                       byte_count_cursor, byte_count);
-           else
--              sprintf((char *)IObuff, _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Chars; %ld of %ld Bytes"),
-+              vim_snprintf((char *)IObuff, IOSIZE,
-+                      _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Chars; %ld of %ld Bytes"),
-                       buf1, line_count_selected,
-                       (long)curbuf->b_ml.ml_line_count,
-                       word_count_cursor, word_count,
-                       char_count_cursor, char_count,
-                       byte_count_cursor, byte_count);
-@@ -6390,24 +6468,26 @@ cursor_pos_info()
-       else
+@@ -2423,11 +2467,11 @@ nb_do_cmd(
+                       {
+                           if (buf_findsigntype_id(buf->bufp, lnum,
+                               GUARDED) == 0)
+                           {
+                               coloncmd(
+-                                  ":sign place %d line=%d name=%d buffer=%d",
++                                  ":sign place %d line=%ld name=%d buffer=%d",
+                                    guardId++, lnum, GUARDED,
+                                    buf->bufp->b_fnum);
+                           }
+                       }
+                   }
+@@ -2484,11 +2528,11 @@ nb_do_cmd(
  #endif
-       {
-           p = ml_get_curline();
-           validate_virtcol();
--          col_print(buf1, (int)curwin->w_cursor.col + 1,
-+          col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1,
-                   (int)curwin->w_virtcol + 1);
--          col_print(buf2, (int)STRLEN(p), linetabsize(p));
-+          col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p));
-           if (char_count_cursor == byte_count_cursor
-                   && char_count == byte_count)
--              sprintf((char *)IObuff, _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld"),
-+              vim_snprintf((char *)IObuff, IOSIZE,
-+                  _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld"),
-                   (char *)buf1, (char *)buf2,
-                   (long)curwin->w_cursor.lnum,
-                   (long)curbuf->b_ml.ml_line_count,
-                   word_count_cursor, word_count,
-                   byte_count_cursor, byte_count);
+               }
+           }
            else
--              sprintf((char *)IObuff, _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld of %ld; Byte %ld of %ld"),
-+              vim_snprintf((char *)IObuff, IOSIZE,
-+                  _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld of %ld; Byte %ld of %ld"),
-                   (char *)buf1, (char *)buf2,
-                   (long)curwin->w_cursor.lnum,
-                   (long)curbuf->b_ml.ml_line_count,
-                   word_count_cursor, word_count,
-                   char_count_cursor, char_count,
---- vim72.orig/src/tag.c
-+++ vim72/src/tag.c
-@@ -88,21 +88,22 @@ static char_u *topmsg = (char_u *)N_("E5
- static char_u *tagmatchname = NULL;   /* name of last used tag */
- /*
-  * We use ftello() here, if available.  It returns off_t instead of long,
-  * which helps if long is 32 bit and off_t is 64 bit.
-+ * We assume that when fseeko() is available then ftello() is too.
-  */
--#ifdef HAVE_FTELLO
-+#ifdef HAVE_FSEEKO
- # define ftell ftello
- #endif
- #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
- /*
-  * Tag for preview window is remembered separately, to avoid messing up the
-  * normal tagstack.
-  */
--static taggy_T ptag_entry = {NULL};
-+static taggy_T ptag_entry = {NULL, {INIT_POS_T(0, 0, 0), 0}, 0, 0};
- #endif
- /*
-  * Jump to tag; handling of tag commands and tag stack
-  *
-@@ -513,11 +514,11 @@ do_tag(tag, type, count, forceit, verbos
+           {
+-              nbdebug(("    Buffer has no changes!\n"));
++              nbdebug(("    Buffer has no changes!\n"));
+           }
+ /* =====================================================================*/
+       }
+       else if (streq((char *)cmd, "netbeansBuffer"))
+       {
+@@ -2580,11 +2624,11 @@ coloncmd(char *cmd, ...)
+ {
+     char buf[1024];
+     va_list ap;
  
-           /*
-            * If a count is supplied to the ":tag <name>" command, then
-            * jump to count'th matching tag.
-            */
--          if (type == DT_TAG && count > 0)
-+          if (type == DT_TAG && *tag != NUL && count > 0)
-               cur_match = count - 1;
+     va_start(ap, cmd);
+-    vsprintf(buf, cmd, ap);
++    vim_vsnprintf(buf, sizeof(buf), cmd, ap, NULL);
+     va_end(ap);
  
-           if (type == DT_SELECT || type == DT_JUMP
- #if defined(FEAT_QUICKFIX)
-               || type == DT_LTAG
-@@ -616,11 +617,11 @@ do_tag(tag, type, count, forceit, verbos
-               MSG_PUTS_ATTR(_("  # pri kind tag"), hl_attr(HLF_T));
-               msg_clr_eos();
-               taglen_advance(taglen);
-               MSG_PUTS_ATTR(_("file\n"), hl_attr(HLF_T));
+     nbdebug(("    COLONCMD %s\n", buf));
  
--              for (i = 0; i < num_matches; ++i)
-+              for (i = 0; i < num_matches && !got_int; ++i)
-               {
-                   parse_match(matches[i], &tagp);
-                   if (!new_tag && (
- #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
-                               (g_do_tagpreview
-@@ -653,10 +654,12 @@ do_tag(tag, type, count, forceit, verbos
-                       msg_puts_long_attr(p, hl_attr(HLF_D));
-                       vim_free(p);
-                   }
-                   if (msg_col > 0)
-                       msg_putchar('\n');
-+                  if (got_int)
-+                      break;
-                   msg_advance(15);
+ /*     ALT_INPUT_LOCK_ON; */
+@@ -2647,11 +2691,11 @@ special_keys(char_u *args)
  
-                   /* print any extra fields */
-                   command_end = tagp.command_end;
-                   if (command_end != NULL)
-@@ -687,10 +690,12 @@ do_tag(tag, type, count, forceit, verbos
-                           while (*p && *p != '\r' && *p != '\n')
-                           {
-                               if (msg_col + ptr2cells(p) >= Columns)
-                               {
-                                   msg_putchar('\n');
-+                                  if (got_int)
-+                                      break;
-                                   msg_advance(15);
-                               }
-                               p = msg_outtrans_one(p, attr);
-                               if (*p == TAB)
-                               {
-@@ -702,10 +707,12 @@ do_tag(tag, type, count, forceit, verbos
-                           }
-                       }
-                       if (msg_col > 15)
-                       {
-                           msg_putchar('\n');
-+                          if (got_int)
-+                              break;
-                           msg_advance(15);
-                       }
-                   }
-                   else
-                   {
-@@ -732,10 +739,12 @@ do_tag(tag, type, count, forceit, verbos
+     void
+ ex_nbkey(eap)
+     exarg_T   *eap;
+ {
+-    netbeans_keystring(0, (char *)eap->arg);
++    (void)netbeans_keystring(eap->arg);
+ }
  
-                   while (p != command_end)
-                   {
-                       if (msg_col + (*p == TAB ? 1 : ptr2cells(p)) > Columns)
-                           msg_putchar('\n');
-+                      if (got_int)
-+                          break;
-                       msg_advance(15);
  
-                       /* skip backslash used for escaping command char */
-                       if (*p == '\\' && *(p + 1) == *tagp.command)
-                           ++p;
-@@ -758,16 +767,13 @@ do_tag(tag, type, count, forceit, verbos
-                           break;
-                   }
-                   if (msg_col)
-                       msg_putchar('\n');
-                   ui_breakcheck();
--                  if (got_int)
--                  {
--                      got_int = FALSE;        /* only stop the listing */
--                      break;
--                  }
-               }
-+              if (got_int)
-+                  got_int = FALSE;    /* only stop the listing */
-               ask_for_selection = TRUE;
-           }
- #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL)
-           else if (type == DT_LTAG)
-           {
-@@ -1098,14 +1104,13 @@ taglen_advance(l)
+ /*
+  * Initialize highlights and signs for use by netbeans  (mostly obsolete)
+@@ -2669,11 +2713,11 @@ nb_init_graphics(void)
+       did_init = TRUE;
+     }
  }
  
  /*
-  * Print the tag stack
+- * Convert key to netbeans name.
++ * Convert key to netbeans name.  This uses the global "mod_mask".
   */
--/*ARGSUSED*/
-     void
- do_tags(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
+     static void
+ netbeans_keyname(int key, char *buf)
  {
-     int               i;
-     char_u    *name;
-     taggy_T   *tagstack = curwin->w_tagstack;
-     int               tagstackidx = curwin->w_tagstackidx;
-@@ -2523,15 +2528,14 @@ static void found_tagfile_cb __ARGS((cha
+     char *name = 0;
+@@ -2745,15 +2789,14 @@ netbeans_keyname(int key, char *buf)
  /*
-  * Callback function for finding all "tags" and "tags-??" files in
-  * 'runtimepath' doc directories.
+  * Function to be called for balloon evaluation.  Grabs the text under the
+  * cursor and sends it to the debugger for evaluation.  The debugger should
+  * respond with a showBalloon command when there is a useful result.
   */
 -/*ARGSUSED*/
-     static void
- found_tagfile_cb(fname, cookie)
-     char_u    *fname;
--    void      *cookie;
-+    void      *cookie UNUSED;
- {
-     if (ga_grow(&tag_fnames, 1) == OK)
-       ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] =
-                                                          vim_strsave(fname);
- }
-@@ -2540,10 +2544,19 @@ found_tagfile_cb(fname, cookie)
      void
- free_tag_stuff()
+ netbeans_beval_cb(
+       BalloonEval     *beval,
+-      int              state)
++      int              state UNUSED)
  {
-     ga_clear_strings(&tag_fnames);
-     do_tag(NULL, DT_FREE, 0, 0, 0);
-+    tag_freematch();
-+
-+# if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
-+    if (ptag_entry.tagname)
-+    {
-+        vim_free(ptag_entry.tagname);
-+        ptag_entry.tagname = NULL;
-+    }
-+# endif
+     win_T     *wp;
+     char_u    *text;
+     linenr_T  lnum;
+     int               col;
+@@ -2922,48 +2965,30 @@ netbeans_file_opened(buf_T *bufp)
+     if (p_acd && vim_chdirfile(bufp->b_ffname) == OK)
+       shorten_fnames(TRUE);
  }
- #endif
  
  /*
-  * Get the next name of a tag file from the tag file list.
-@@ -2723,21 +2736,38 @@ parse_tag_line(lbuf,
-        * 1:  struct EnvBase ^?EnvBase^A139,4627
-        * 2: #define   ARPB_WILD_WORLD ^?153,5194
-        */
-       p_7f = vim_strchr(lbuf, 0x7f);
-       if (p_7f == NULL)
-+      {
-+etag_fail:
-+          if (vim_strchr(lbuf, '\n') == NULL)
-+          {
-+              /* Truncated line.  Ignore it. */
-+              if (p_verbose >= 5)
-+              {
-+                  verbose_enter();
-+                  MSG(_("Ignoring long line in tags file"));
-+                  verbose_leave();
-+              }
-+              tagp->command = lbuf;
-+              tagp->tagname = lbuf;
-+              tagp->tagname_end = lbuf;
-+              return OK;
-+          }
-           return FAIL;
-+      }
-       /* Find ^A.  If not found the line number is after the 0x7f */
-       p = vim_strchr(p_7f, Ctrl_A);
-       if (p == NULL)
-           p = p_7f + 1;
-       else
-           ++p;
+- * Tell netbeans a file was closed.
++ * Tell netbeans that a file was deleted or wiped out.
+  */
+     void
+-netbeans_file_closed(buf_T *bufp)
++netbeans_file_killed(buf_T *bufp)
+ {
+     int               bufno = nb_getbufno(bufp);
+     nbbuf_T   *nbbuf = nb_get_buf(bufno);
+     char      buffer[2*MAXPATHL];
  
-       if (!VIM_ISDIGIT(*p))       /* check for start of line number */
--          return FAIL;
-+          goto etag_fail;
-       tagp->command = p;
+-    if (!haveConnection || bufno < 0)
++    if (!haveConnection || bufno == -1)
+       return;
  
+-    if (!netbeansCloseFile)
+-    {
+-      nbdebug(("Ignoring file_closed for %s. File was closed from IDE\n",
+-                  bufp->b_ffname));
+-      return;
+-    }
+-
+-    nbdebug(("netbeans_file_closed:\n"));
+-    nbdebug(("    Closing bufno: %d", bufno));
+-    if (curbuf != NULL && curbuf != bufp)
+-    {
+-      nbdebug(("    Curbuf bufno:  %d\n", nb_getbufno(curbuf)));
+-    }
+-    else if (curbuf == bufp)
+-    {
+-      nbdebug(("    curbuf == bufp\n"));
+-    }
+-
+-    if (bufno <= 0)
+-      return;
++    nbdebug(("netbeans_file_killed:\n"));
++    nbdebug(("    Killing bufno: %d", bufno));
  
-       if (p[-1] == Ctrl_A)        /* first format: explicit tagname given */
-       {
-@@ -2747,11 +2777,11 @@ parse_tag_line(lbuf,
-       else                        /* second format: isolate tagname */
-       {
-           /* find end of tagname */
-           for (p = p_7f - 1; !vim_iswordc(*p); --p)
-               if (p == lbuf)
--                  return FAIL;
-+                  goto etag_fail;
-           tagp->tagname_end = p + 1;
-           while (p >= lbuf && vim_iswordc(*p))
-               --p;
-           tagp->tagname = p + 1;
-       }
-@@ -3760,11 +3790,11 @@ add_tag_field(dict, field_name, start, e
-           end = start + STRLEN(start);
-           while (end > start && (end[-1] == '\r' || end[-1] == '\n'))
-               --end;
-       }
-       len = (int)(end - start);
--      if (len > sizeof(buf) - 1)
-+      if (len > (int)sizeof(buf) - 1)
-           len = sizeof(buf) - 1;
-       vim_strncpy(buf, start, len);
-     }
-     buf[len] = NUL;
-     return dict_add_nr_str(dict, field_name, 0L, buf);
---- vim72.orig/src/proto/misc2.pro
-+++ vim72/src/proto/misc2.pro
-@@ -57,11 +57,11 @@ void ga_append __ARGS((garray_T *gap, in
- int name_to_mod_mask __ARGS((int c));
- int simplify_key __ARGS((int key, int *modifiers));
- int handle_x_keys __ARGS((int key));
- char_u *get_special_key_name __ARGS((int c, int modifiers));
- int trans_special __ARGS((char_u **srcp, char_u *dst, int keycode));
--int find_special_key __ARGS((char_u **srcp, int *modp, int keycode));
-+int find_special_key __ARGS((char_u **srcp, int *modp, int keycode, int keep_x_key));
- int extract_modifiers __ARGS((int key, int *modp));
- int find_special_key_in_table __ARGS((int c));
- int get_special_key_code __ARGS((char_u *name));
- char_u *get_key_name __ARGS((int i));
- int get_mouse_button __ARGS((int code, int *is_click, int *is_drag));
---- vim72.orig/src/gui_mac.c
-+++ vim72/src/gui_mac.c
-@@ -4964,11 +4964,11 @@ gui_mch_add_menu_item(vimmenu_T *menu, i
-       int         key = 0;
-       int         modifiers = 0;
-       char_u      *p_actext;
+     sprintf(buffer, "%d:killed=%d\n", bufno, r_cmdno);
  
-       p_actext = menu->actext;
--      key = find_special_key(&p_actext, &modifiers, /*keycode=*/0);
-+      key = find_special_key(&p_actext, &modifiers, FALSE, FALSE);
-       if (*p_actext != 0)
-           key = 0; /* error: trailing text */
-       /* find_special_key() returns a keycode with as many of the
-        * specified modifiers as appropriate already applied (e.g., for
-        * "<D-C-x>" it returns Ctrl-X as the keycode and MOD_MASK_CMD
---- vim72.orig/runtime/doc/netbeans.txt
-+++ vim72/runtime/doc/netbeans.txt
-@@ -1,6 +1,6 @@
--*netbeans.txt*  For Vim version 7.2.  Last change: 2008 Jun 28
-+*netbeans.txt*  For Vim version 7.2.  Last change: 2009 Jan 06
+     nbdebug(("EVT: %s", buffer));
  
+-    nb_send(buffer, "netbeans_file_closed");
++    nb_send(buffer, "netbeans_file_killed");
  
-                 VIM REFERENCE MANUAL    by Gordon Prieur et al.
+     if (nbbuf != NULL)
+       nbbuf->bufp = NULL;
+ }
  
+@@ -3078,15 +3103,14 @@ netbeans_removed(
+     nbdebug(("EVT: %s", buf));
+     nb_send((char *)buf, "netbeans_removed");
+ }
  
-@@ -720,12 +720,14 @@ keyCommand keyName
- keyAtPos keyName lnum/col
-               Like "keyCommand" and also report the line number and column
-               of the cursor.
-               New in version 2.1.
+ /*
+- * Send netbeans an unmodufied command.
++ * Send netbeans an unmodified command.
+  */
+-/*ARGSUSED*/
+     void
+-netbeans_unmodified(buf_T *bufp)
++netbeans_unmodified(buf_T *bufp UNUSED)
+ {
+ #if 0
+     char_u    buf[128];
+     int               bufno;
+     nbbuf_T   *nbbuf;
+@@ -3136,56 +3160,59 @@ netbeans_button_release(int button)
  
--killed                A file was closed by the user.  Only for files that have been
--              assigned a number by the IDE.
-+killed                A file was deleted or wiped out by the user and the buffer
-+              annotations have been removed.  The bufID number for this
-+              buffer has become invalid.  Only for files that have been
-+              assigned a bufID number by the IDE.
  
- newDotAndMark off off
-               Reports the position of the cursor being at "off" bytes into
-               the buffer.  Only sent just before a "keyCommand" event.
+ /*
+  * Send a keypress event back to netbeans. This usually simulates some
+  * kind of function key press. This function operates on a key code.
++ * Return TRUE when the key was sent, FALSE when the command has been
++ * postponed.
+  */
+-    void
++    int
+ netbeans_keycommand(int key)
+ {
+     char      keyName[60];
  
---- vim72.orig/src/proto/netbeans.pro
-+++ vim72/src/proto/netbeans.pro
-@@ -9,16 +9,16 @@ void netbeans_beval_cb __ARGS((BalloonEv
- void netbeans_startup_done __ARGS((void));
- void netbeans_send_disconnect __ARGS((void));
- void netbeans_frame_moved __ARGS((int new_x, int new_y));
- void netbeans_file_activated __ARGS((buf_T *bufp));
- void netbeans_file_opened __ARGS((buf_T *bufp));
--void netbeans_file_closed __ARGS((buf_T *bufp));
-+void netbeans_file_killed __ARGS((buf_T *bufp));
- void netbeans_inserted __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, char_u *txt, int newlen));
- void netbeans_removed __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, long len));
- void netbeans_unmodified __ARGS((buf_T *bufp));
- void netbeans_button_release __ARGS((int button));
--void netbeans_keycommand __ARGS((int key));
-+int netbeans_keycommand __ARGS((int key));
- void netbeans_save_buffer __ARGS((buf_T *bufp));
- void netbeans_deleted_all_lines __ARGS((buf_T *bufp));
- int netbeans_is_guarded __ARGS((linenr_T top, linenr_T bot));
- void netbeans_draw_multisign_indicator __ARGS((int row));
- void netbeans_draw_multisign_indicator __ARGS((int row));
---- vim72.orig/src/edit.c
-+++ vim72/src/edit.c
-@@ -55,11 +55,11 @@ static char *ctrl_x_msgs[] =
-     N_(" Omni completion (^O^N^P)"),
-     N_(" Spelling suggestion (s^N^P)"),
-     N_(" Keyword Local completion (^N^P)"),
- };
+     netbeans_keyname(key, keyName);
+-    netbeans_keystring(key, keyName);
++    return netbeans_keystring((char_u *)keyName);
+ }
  
--static char_u e_hitend[] = N_("Hit end of paragraph");
-+static char e_hitend[] = N_("Hit end of paragraph");
  
  /*
-  * Structure used to store one match for insert completion.
+  * Send a keypress event back to netbeans. This usually simulates some
+  * kind of function key press. This function operates on a key string.
++ * Return TRUE when the key was sent, FALSE when the command has been
++ * postponed.
   */
- typedef struct compl_S compl_T;
-@@ -112,10 +112,14 @@ static int         compl_restarting = FALSE;     /
+-    static void
+-netbeans_keystring(int key, char *keyName)
++    static int
++netbeans_keystring(char_u *keyName)
+ {
+     char      buf[2*MAXPATHL];
+     int               bufno = nb_getbufno(curbuf);
+     long      off;
+     char_u    *q;
  
- /* When the first completion is done "compl_started" is set.  When it's
-  * FALSE the word to be completed must be located. */
- static int      compl_started = FALSE;
+     if (!haveConnection)
+-      return;
++      return TRUE;
  
-+/* Set when doing something for completion that may call edit() recursively,
-+ * which is not allowed. */
-+static int      compl_busy = FALSE;
-+
- static int      compl_matches = 0;
- static char_u   *compl_pattern = NULL;
- static int      compl_direction = FORWARD;
- static int      compl_shows_dir = FORWARD;
- static int      compl_pending = 0;        /* > 1 for postponed CTRL-N */
-@@ -145,10 +149,11 @@ static char_u *find_line_end __ARGS((cha
- static void ins_compl_free __ARGS((void));
- static void ins_compl_clear __ARGS((void));
- static int  ins_compl_bs __ARGS((void));
- static void ins_compl_new_leader __ARGS((void));
- static void ins_compl_addleader __ARGS((int c));
-+static int ins_compl_len __ARGS((void));
- static void ins_compl_restart __ARGS((void));
- static void ins_compl_set_original_text __ARGS((char_u *str));
- static void ins_compl_addfrommatch __ARGS((void));
- static int  ins_compl_prep __ARGS((int c));
- static buf_T *ins_compl_next_buf __ARGS((buf_T *buf, int flag));
-@@ -162,11 +167,11 @@ static int  ins_compl_next __ARGS((int a
- static int  ins_compl_key2dir __ARGS((int c));
- static int  ins_compl_pum_key __ARGS((int c));
- static int  ins_compl_key2count __ARGS((int c));
- static int  ins_compl_use_match __ARGS((int c));
- static int  ins_complete __ARGS((int c));
--static int  quote_meta __ARGS((char_u *dest, char_u *str, int len));
-+static unsigned  quote_meta __ARGS((char_u *dest, char_u *str, int len));
- #endif /* FEAT_INS_EXPAND */
  
- #define BACKSPACE_CHAR                    1
- #define BACKSPACE_WORD                    2
- #define BACKSPACE_WORD_NOT_SPACE    3
-@@ -174,11 +179,11 @@ static int  quote_meta __ARGS((char_u *d
+     if (bufno == -1)
+     {
+       nbdebug(("got keycommand for non-NetBeans buffer, opening...\n"));
+       q = curbuf->b_ffname == NULL ? (char_u *)""
+                                                : nb_quote(curbuf->b_ffname);
+       if (q == NULL)
+-          return;
++          return TRUE;
+       vim_snprintf(buf, sizeof(buf), "0:fileOpened=%d \"%s\" %s %s\n", 0,
+               q,
+               "T",  /* open in NetBeans */
+               "F"); /* modified */
+       if (curbuf->b_ffname != NULL)
+           vim_free(q);
+       nbdebug(("EVT: %s", buf));
+       nb_send(buf, "netbeans_keycommand");
  
- static void ins_redraw __ARGS((int ready));
- static void ins_ctrl_v __ARGS((void));
- static void undisplay_dollar __ARGS((void));
- static void insert_special __ARGS((int, int, int));
--static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only));
-+static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only, int c));
- static void check_auto_format __ARGS((int));
- static void redo_literal __ARGS((int c));
- static void start_arrow __ARGS((pos_T *end_insert_pos));
- #ifdef FEAT_SPELL
- static void check_spell_redraw __ARGS((void));
-@@ -195,11 +200,12 @@ static void replace_join __ARGS((int off
- static void replace_pop_ins __ARGS((void));
- #ifdef FEAT_MBYTE
- static void mb_replace_pop_ins __ARGS((int cc));
- #endif
- static void replace_flush __ARGS((void));
--static void replace_do_bs __ARGS((void));
-+static void replace_do_bs __ARGS((int limit_col));
-+static int del_char_after_col __ARGS((int limit_col));
- #ifdef FEAT_CINDENT
- static int cindent_on __ARGS((void));
- #endif
- static void ins_reg __ARGS((void));
- static void ins_ctrl_g __ARGS((void));
-@@ -302,11 +308,11 @@ edit(cmdchar, startln, count)
-     long      count;
- {
-     int               c = 0;
-     char_u    *ptr;
-     int               lastc;
--    colnr_T   mincol;
-+    int               mincol;
-     static linenr_T o_lnum = 0;
-     int               i;
-     int               did_backspace = TRUE;       /* previous char was backspace */
- #ifdef FEAT_CINDENT
-     int               line_is_white = FALSE;      /* line is empty before insert */
-@@ -342,11 +348,11 @@ edit(cmdchar, startln, count)
-       return FALSE;
+-      if (key > 0)
+-          postpone_keycommand(key);
+-      return;
++      postpone_keycommand(keyName);
++      return FALSE;
      }
  
- #ifdef FEAT_INS_EXPAND
-     /* Don't allow recursive insert mode when busy with completion. */
--    if (compl_started || pum_visible())
-+    if (compl_started || compl_busy || pum_visible())
-     {
-       EMSG(_(e_secure));
-       return FALSE;
-     }
-     ins_compl_clear();            /* clear stuff for CTRL-X mode */
-@@ -383,11 +389,11 @@ edit(cmdchar, startln, count)
-     {
-       Insstart = curwin->w_cursor;
-       if (startln)
-           Insstart.col = 0;
-     }
--    Insstart_textlen = linetabsize(ml_get_curline());
-+    Insstart_textlen = (colnr_T)linetabsize(ml_get_curline());
-     Insstart_blank_vcol = MAXCOL;
-     if (!did_ai)
-       ai_col = 0;
+     /* sync the cursor position */
+     off = pos2off(curbuf, &curwin->w_cursor);
+     sprintf(buf, "%d:newDotAndMark=%d %ld %ld\n", bufno, r_cmdno, off, off);
+@@ -3207,10 +3234,11 @@ netbeans_keystring(int key, char *keyNam
+     vim_snprintf(buf, sizeof(buf), "%d:keyAtPos=%d \"%s\" %ld %ld/%ld\n",
+           bufno, r_cmdno, keyName,
+               off, (long)curwin->w_cursor.lnum, (long)curwin->w_cursor.col);
+     nbdebug(("EVT: %s", buf));
+     nb_send(buf, "netbeans_keycommand");
++    return TRUE;
+ }
  
-     if (cmdchar != NUL && restart_edit == 0)
-@@ -649,11 +655,11 @@ edit(cmdchar, startln, count)
-               )
-       {
-           mincol = curwin->w_wcol;
-           validate_cursor_col();
  
--          if ((int)curwin->w_wcol < (int)mincol - curbuf->b_p_ts
-+          if ((int)curwin->w_wcol < mincol - curbuf->b_p_ts
-                   && curwin->w_wrow == W_WINROW(curwin)
-                                                + curwin->w_height - 1 - p_so
-                   && (curwin->w_cursor.lnum != curwin->w_topline
- #ifdef FEAT_DIFF
-                       || curwin->w_topfill > 0
-@@ -749,11 +755,11 @@ edit(cmdchar, startln, count)
-               /* CTRL-L: Add one character from the current match to
-                * "compl_leader".  Except when at the original match and
-                * there is nothing to add, CTRL-L works like CTRL-P then. */
-               if (c == Ctrl_L
-                       && (ctrl_x_mode != CTRL_X_WHOLE_LINE
--                          || STRLEN(compl_shown_match->cp_str)
-+                          || (int)STRLEN(compl_shown_match->cp_str)
-                                         > curwin->w_cursor.col - compl_col))
-               {
-                   ins_compl_addfrommatch();
-                   continue;
-               }
-@@ -1336,12 +1342,14 @@ doESCkey:
-                   && ctrl_x_mode != 0
-                   && !(compl_cont_status & CONT_LOCAL))
-               goto normalchar;
+ /*
+  * Send a save event to netbeans.
+@@ -3375,11 +3403,11 @@ netbeans_gutter_click(linenr_T lnum)
+     }
+ }
  
- docomplete:
-+          compl_busy = TRUE;
-           if (ins_complete(c) == FAIL)
-               compl_cont_status = 0;
-+          compl_busy = FALSE;
-           break;
- #endif /* FEAT_INS_EXPAND */
  
-       case Ctrl_Y:    /* copy from previous line or scroll down */
-       case Ctrl_E:    /* copy from next line     or scroll up */
-@@ -1439,14 +1447,13 @@ force_cindent:
-  * This is postponed until getting the next character to make '$' in the 'cpo'
-  * option work correctly.
-  * Only redraw when there are no characters available.  This speeds up
-  * inserting sequences of characters (e.g., for CTRL-R).
+ /*
+- * Add a sign of the reqested type at the requested location.
++ * Add a sign of the requested type at the requested location.
+  *
+  * Reverse engineering:
+  * Apparently an annotation is defined the first time it is used in a buffer.
+  * When the same annotation is used in two buffers, the second time we do not
+  * need to define a new sign name but reuse the existing one.  But since the
+@@ -3389,17 +3417,16 @@ netbeans_gutter_click(linenr_T lnum)
+  *
+  * globalsignmap[]    stores the signs that have been defined globally.
+  * buf->signmapused[] maps buffer-local annotation IDs to an index in
+  *                    globalsignmap[].
   */
 -/*ARGSUSED*/
      static void
- ins_redraw(ready)
--    int               ready;      /* not busy with something */
-+    int               ready UNUSED;       /* not busy with something */
- {
-     if (!char_avail())
-     {
- #ifdef FEAT_AUTOCMD
-       /* Trigger CursorMoved if the cursor moved.  Not when the popup menu is
-@@ -1769,11 +1776,11 @@ change_indent(type, amount, round, repla
-     {
-       /*
-        * Compute the screen column where the cursor should be.
-        */
-       vcol = get_indent() - vcol;
--      curwin->w_virtcol = (vcol < 0) ? 0 : vcol;
-+      curwin->w_virtcol = (colnr_T)((vcol < 0) ? 0 : vcol);
-       /*
-        * Advance the cursor until we reach the right screen column.
-        */
-       vcol = last_vcol = 0;
-@@ -1796,13 +1803,13 @@ change_indent(type, amount, round, repla
-        * May need to insert spaces to be able to position the cursor on
-        * the right screen column.
-        */
-       if (vcol != (int)curwin->w_virtcol)
+ addsigntype(
+     nbbuf_T   *buf,
+     int               typeNum,
+     char_u    *typeName,
+-    char_u    *tooltip,
++    char_u    *tooltip UNUSED,
+     char_u    *glyphFile,
+     int               use_fg,
+     int               fg,
+     int               use_bg,
+     int               bg)
+@@ -3529,11 +3556,12 @@ get_buf_size(buf_T *bufp)
+           eol_size = 2;
+       else
+           eol_size = 1;
+       for (lnum = 1; lnum <= bufp->b_ml.ml_line_count; ++lnum)
        {
--          curwin->w_cursor.col = new_cursor_col;
-+          curwin->w_cursor.col = (colnr_T)new_cursor_col;
-           i = (int)curwin->w_virtcol - vcol;
--          ptr = alloc(i + 1);
-+          ptr = alloc((unsigned)(i + 1));
-           if (ptr != NULL)
+-          char_count += (long)STRLEN(ml_get(lnum)) + eol_size;
++          char_count += (long)STRLEN(ml_get_buf(bufp, lnum, FALSE))
++                                                                 + eol_size;
+           /* Check for a CTRL-C every 100000 characters */
+           if (char_count > last_check)
            {
-               new_cursor_col += i;
-               ptr[i] = NUL;
-               while (--i >= 0)
-@@ -1822,11 +1829,11 @@ change_indent(type, amount, round, repla
-     curwin->w_p_list = save_p_list;
-     if (new_cursor_col <= 0)
-       curwin->w_cursor.col = 0;
-     else
--      curwin->w_cursor.col = new_cursor_col;
-+      curwin->w_cursor.col = (colnr_T)new_cursor_col;
-     curwin->w_set_curswant = TRUE;
-     changed_cline_bef_curs();
+               ui_breakcheck();
+               if (got_int)
+--- vim72.orig/src/normal.c
++++ vim72/src/normal.c
+@@ -181,10 +181,12 @@ static void      nv_drop __ARGS((cmdarg_T *ca
+ #endif
+ #ifdef FEAT_AUTOCMD
+ static void   nv_cursorhold __ARGS((cmdarg_T *cap));
+ #endif
  
-     /*
-      * May have to adjust the start of the insert.
-@@ -1931,26 +1938,64 @@ truncate_spaces(line)
- #if defined(FEAT_VREPLACE) || defined(FEAT_INS_EXPAND) \
-       || defined(FEAT_COMMENTS) || defined(PROTO)
++static char *e_noident = N_("E349: No identifier under cursor");
++
  /*
-  * Backspace the cursor until the given column.  Handles REPLACE and VREPLACE
-  * modes correctly.  May also be used when not in insert mode at all.
-+ * Will attempt not to go before "col" even when there is a composing
-+ * character.
+  * Function to be called for a Normal or Visual mode command.
+  * The argument is a cmdarg_T.
   */
-     void
- backspace_until_column(col)
-     int           col;
+ typedef void (*nv_func_T) __ARGS((cmdarg_T *cap));
+@@ -489,18 +491,18 @@ nv_compare(s1, s2)
+ init_normal_cmds()
  {
-     while ((int)curwin->w_cursor.col > col)
-     {
-       curwin->w_cursor.col--;
-       if (State & REPLACE_FLAG)
--          replace_do_bs();
--      else
--          (void)del_char(FALSE);
-+          replace_do_bs(col);
-+      else if (!del_char_after_col(col))
-+          break;
-     }
+     int               i;
+     /* Fill the index table with a one to one relation. */
+-    for (i = 0; i < NV_CMDS_SIZE; ++i)
++    for (i = 0; i < (int)NV_CMDS_SIZE; ++i)
+       nv_cmd_idx[i] = i;
+     /* Sort the commands by the command character.  */
+     qsort((void *)&nv_cmd_idx, (size_t)NV_CMDS_SIZE, sizeof(short), nv_compare);
+     /* Find the first entry that can't be indexed by the command character. */
+-    for (i = 0; i < NV_CMDS_SIZE; ++i)
++    for (i = 0; i < (int)NV_CMDS_SIZE; ++i)
+       if (i != nv_cmds[nv_cmd_idx[i]].cmd_char)
+           break;
+     nv_max_linear = i - 1;
+ }
+@@ -557,15 +559,14 @@ find_command(cmdchar)
  }
+ /*
+  * Execute a command in Normal mode.
+  */
+-/*ARGSUSED*/
+     void
+ normal_cmd(oap, toplevel)
+     oparg_T   *oap;
+-    int               toplevel;               /* TRUE when called from main() */
++    int               toplevel UNUSED;        /* TRUE when called from main() */
+ {
+     cmdarg_T  ca;                     /* command arguments */
+     int               c;
+     int               ctrl_w = FALSE;         /* got CTRL-W command */
+     int               old_col = curwin->w_curswant;
+@@ -576,10 +577,13 @@ normal_cmd(oap, toplevel)
+     pos_T     old_pos;                /* cursor position before command */
+     int               mapped_len;
+     static int        old_mapped_len = 0;
  #endif
+     int               idx;
++#ifdef FEAT_EVAL
++    int               set_prevcount = FALSE;
++#endif
  
-+/*
-+ * Like del_char(), but make sure not to go before column "limit_col".
-+ * Only matters when there are composing characters.
-+ * Return TRUE when something was deleted.
-+ */
-+   static int
-+del_char_after_col(limit_col)
-+    int limit_col UNUSED;
-+{
-+#ifdef FEAT_MBYTE
-+    if (enc_utf8 && limit_col >= 0)
+     vim_memset(&ca, 0, sizeof(ca));   /* also resets ca.retval */
+     ca.oap = oap;
+     /* Use a count remembered from before entering an operator.  After typing
+@@ -611,11 +615,16 @@ normal_cmd(oap, toplevel)
+ #endif
+     /* When not finishing an operator and no register name typed, reset the
+      * count. */
+     if (!finish_op && !oap->regname)
 +    {
-+      colnr_T ecol = curwin->w_cursor.col + 1;
-+
-+      /* Make sure the cursor is at the start of a character, but
-+       * skip forward again when going too far back because of a
-+       * composing character. */
-+      mb_adjust_cursor();
-+      while (curwin->w_cursor.col < (colnr_T)limit_col)
-+      {
-+          int l = utf_ptr2len(ml_get_cursor());
-+
-+          if (l == 0)  /* end of line */
-+              break;
-+          curwin->w_cursor.col += l;
-+      }
-+      if (*ml_get_cursor() == NUL || curwin->w_cursor.col == ecol)
-+          return FALSE;
-+      del_bytes((long)((int)ecol - curwin->w_cursor.col), FALSE, TRUE);
-+    }
-+    else
+       ca.opcount = 0;
++#ifdef FEAT_EVAL
++      set_prevcount = TRUE;
 +#endif
-+      (void)del_char(FALSE);
-+    return TRUE;
-+}
++    }
+ #ifdef FEAT_AUTOCMD
+     /* Restore counts from before receiving K_CURSORHOLD.  This means after
+      * typing "3", handling K_CURSORHOLD and then typing "2" we get "32", not
+      * "3 * 2". */
+@@ -639,14 +648,11 @@ normal_cmd(oap, toplevel)
+     /*
+      * Get the command character from the user.
+      */
+     c = safe_vgetc();
+-
+-#ifdef FEAT_LANGMAP
+     LANGMAP_ADJUST(c, TRUE);
+-#endif
+ #ifdef FEAT_VISUAL
+     /*
+      * If a mapping was started in Visual or Select mode, remember the length
+      * of the mapping.  This is used below to not return to Insert mode for as
+@@ -715,22 +721,28 @@ getcount:
+ #ifdef FEAT_EVAL
+           /* Set v:count here, when called from main() and not a stuffed
+            * command, so that v:count can be used in an expression mapping
+            * right after the count. */
+           if (toplevel && stuff_empty())
+-              set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0);
++          {
++              long count = ca.count0;
 +
- #if defined(FEAT_INS_EXPAND) || defined(PROTO)
- /*
-  * CTRL-X pressed in Insert mode.
-  */
-     static void
-@@ -2117,11 +2162,11 @@ ins_compl_add_infercase(str, len, icase,
- {
-     char_u    *p;
-     int               i, c;
-     int               actual_len;             /* Take multi-byte characters */
-     int               actual_compl_length;    /* into account. */
--    int               *wca;                   /* Wide character array. */
-+    int               *wca;                   /* Wide character array. */
-     int               has_lower = FALSE;
-     int               was_letter = FALSE;
++              /* multiply with ca.opcount the same way as below */
++              if (ca.opcount != 0)
++                  count = ca.opcount * (count == 0 ? 1 : count);
++              set_vcount(count, count == 0 ? 1 : count, set_prevcount);
++              set_prevcount = FALSE;  /* only set v:prevcount once */
++          }
+ #endif
+           if (ctrl_w)
+           {
+               ++no_mapping;
+               ++allow_keys;           /* no mapping for nchar, but keys */
+           }
+           ++no_zero_mapping;          /* don't map zero here */
+           c = plain_vgetc();
+-#ifdef FEAT_LANGMAP
+           LANGMAP_ADJUST(c, TRUE);
+-#endif
+           --no_zero_mapping;
+           if (ctrl_w)
+           {
+               --no_mapping;
+               --allow_keys;
+@@ -749,13 +761,11 @@ getcount:
+           ca.opcount = ca.count0;     /* remember first count */
+           ca.count0 = 0;
+           ++no_mapping;
+           ++allow_keys;               /* no mapping for nchar, but keys */
+           c = plain_vgetc();          /* get next character */
+-#ifdef FEAT_LANGMAP
+           LANGMAP_ADJUST(c, TRUE);
+-#endif
+           --no_mapping;
+           --allow_keys;
+ #ifdef FEAT_CMDL_INFO
+           need_flushbuf |= add_to_showcmd(c);
+ #endif
+@@ -802,11 +812,11 @@ getcount:
+ #ifdef FEAT_EVAL
+     /*
+      * Only set v:count when called from main() and not a stuffed command.
+      */
+     if (toplevel && stuff_empty())
+-      set_vcount(ca.count0, ca.count1);
++      set_vcount(ca.count0, ca.count1, set_prevcount);
+ #endif
  
-     if (p_ic && curbuf->b_p_inf && len > 0)
-     {
-@@ -2158,11 +2203,11 @@ ins_compl_add_infercase(str, len, icase,
-       else
+     /*
+      * Find the command character in the table of commands.
+      * For CTRL-W we already got nchar when looking for a count.
+@@ -939,13 +949,11 @@ getcount:
+           /*
+            * For 'g' get the next character now, so that we can check for
+            * "gr", "g'" and "g`".
+            */
+           ca.nchar = plain_vgetc();
+-#ifdef FEAT_LANGMAP
+           LANGMAP_ADJUST(ca.nchar, TRUE);
+-#endif
+ #ifdef FEAT_CMDL_INFO
+           need_flushbuf |= add_to_showcmd(ca.nchar);
+ #endif
+           if (ca.nchar == 'r' || ca.nchar == '\'' || ca.nchar == '`'
+                                                     || ca.nchar == Ctrl_BSL)
+@@ -1042,14 +1050,12 @@ getcount:
+ # endif
+                   }
+               }
  #endif
-           actual_compl_length = compl_length;
  
-       /* Allocate wide character array for the completion and fill it. */
--      wca = (int *)alloc(actual_len * sizeof(int));
-+      wca = (int *)alloc((unsigned)(actual_len * sizeof(int)));
-       if (wca != NULL)
-       {
-           p = str;
-           for (i = 0; i < actual_len; ++i)
- #ifdef FEAT_MBYTE
-@@ -2416,11 +2461,11 @@ ins_compl_longest_match(match)
-       compl_leader = vim_strsave(match->cp_str);
-       if (compl_leader != NULL)
-       {
-           had_match = (curwin->w_cursor.col > compl_col);
-           ins_compl_delete();
--          ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
-+          ins_bytes(compl_leader + ins_compl_len());
-           ins_redraw(FALSE);
+-#ifdef FEAT_LANGMAP
+               /* adjust chars > 127, except after "tTfFr" commands */
+               LANGMAP_ADJUST(*cp, !lang);
+-#endif
+ #ifdef FEAT_RIGHTLEFT
+               /* adjust Hebrew mapped char */
+               if (p_hkmap && lang && KeyTyped)
+                   *cp = hkmap(*cp);
+ # ifdef FEAT_FKMAP
+@@ -1130,11 +1136,12 @@ getcount:
+      */
+     if (need_flushbuf)
+       out_flush();
+ #endif
+ #ifdef FEAT_AUTOCMD
+-    did_cursorhold = FALSE;
++    if (ca.cmdchar != K_IGNORE)
++      did_cursorhold = FALSE;
+ #endif
  
-           /* When the match isn't there (to avoid matching itself) remove it
-            * again after redrawing. */
-           if (!had_match)
-@@ -2468,11 +2513,11 @@ ins_compl_longest_match(match)
-       {
-           /* Leader was shortened, need to change the inserted text. */
-           *p = NUL;
-           had_match = (curwin->w_cursor.col > compl_col);
-           ins_compl_delete();
--          ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
-+          ins_bytes(compl_leader + ins_compl_len());
-           ins_redraw(FALSE);
+     State = NORMAL;
  
-           /* When the match isn't there (to avoid matching itself) remove it
-            * again after redrawing. */
-           if (!had_match)
-@@ -2537,25 +2582,25 @@ ins_compl_make_cyclic()
-  * "startcol" is where the matched text starts (1 is first column).
-  * "list" is the list of matches.
+     if (ca.nchar == ESC)
+@@ -2178,14 +2185,13 @@ op_colon(oap)
+ }
+ /*
+  * Handle the "g@" operator: call 'operatorfunc'.
   */
-     void
- set_completion(startcol, list)
--    int           startcol;
-+    colnr_T startcol;
-     list_T  *list;
+-/*ARGSUSED*/
+     static void
+ op_function(oap)
+-    oparg_T   *oap;
++    oparg_T   *oap UNUSED;
  {
-     /* If already doing completions stop it. */
-     if (ctrl_x_mode != 0)
-       ins_compl_prep(' ');
-     ins_compl_clear();
+ #ifdef FEAT_EVAL
+     char_u    *(argv[1]);
  
-     if (stop_arrow() == FAIL)
-       return;
+     if (*p_opfunc == NUL)
+@@ -3507,11 +3513,11 @@ find_ident_at_pos(wp, lnum, startcol, st
+        * didn't find an identifier or string
+        */
+       if (find_type & FIND_STRING)
+           EMSG(_("E348: No string under cursor"));
+       else
+-          EMSG(_("E349: No identifier under cursor"));
++          EMSG(_(e_noident));
+       return 0;
+     }
+     ptr += col;
+     *string = ptr;
  
--    if (startcol > (int)curwin->w_cursor.col)
-+    if (startcol > curwin->w_cursor.col)
-       startcol = curwin->w_cursor.col;
-     compl_col = startcol;
--    compl_length = curwin->w_cursor.col - startcol;
-+    compl_length = (int)curwin->w_cursor.col - (int)startcol;
-     /* compl_pattern doesn't need to be set */
-     compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length);
-     if (compl_orig_text == NULL || ins_compl_add(compl_orig_text,
-                       -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE) != OK)
+@@ -3699,17 +3705,17 @@ clear_showcmd()
        return;
-@@ -2817,11 +2862,10 @@ ins_compl_dictionaries(dict_start, pat,
-     char_u    *ptr;
-     char_u    *buf;
-     regmatch_T        regmatch;
-     char_u    **files;
-     int               count;
--    int               i;
-     int               save_p_scs;
-     int               dir = compl_direction;
  
-     if (*dict == NUL)
-     {
-@@ -2849,21 +2893,22 @@ ins_compl_dictionaries(dict_start, pat,
-      * to only match at the start of a line.  Otherwise just match the
-      * pattern. Also need to double backslashes. */
-     if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
+ #ifdef FEAT_VISUAL
+     if (VIsual_active && !char_avail())
      {
-       char_u *pat_esc = vim_strsave_escaped(pat, (char_u *)"\\");
-+      size_t len;
+-      int             i = lt(VIsual, curwin->w_cursor);
++      int             cursor_bot = lt(VIsual, curwin->w_cursor);
+       long            lines;
+       colnr_T         leftcol, rightcol;
+       linenr_T        top, bot;
  
-       if (pat_esc == NULL)
-           goto theend;
--      i = (int)STRLEN(pat_esc) + 10;
--      ptr = alloc(i);
-+      len = STRLEN(pat_esc) + 10;
-+      ptr = alloc((unsigned)len);
-       if (ptr == NULL)
-       {
-           vim_free(pat_esc);
-           goto theend;
-       }
--      vim_snprintf((char *)ptr, i, "^\\s*\\zs\\V%s", pat_esc);
-+      vim_snprintf((char *)ptr, len, "^\\s*\\zs\\V%s", pat_esc);
-       regmatch.regprog = vim_regcomp(ptr, RE_MAGIC);
-       vim_free(pat_esc);
-       vim_free(ptr);
-     }
-     else
-@@ -2950,11 +2995,11 @@ ins_compl_files(count, files, thesaurus,
-       fp = mch_fopen((char *)files[i], "r");  /* open dictionary file */
-       if (flags != DICT_EXACT)
+       /* Show the size of the Visual area. */
+-      if (i)
++      if (cursor_bot)
        {
-           vim_snprintf((char *)IObuff, IOSIZE,
-                             _("Scanning dictionary: %s"), (char *)files[i]);
--          msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
-+          (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
+           top = VIsual.lnum;
+           bot = curwin->w_cursor.lnum;
        }
+       else
+@@ -3724,18 +3730,27 @@ clear_showcmd()
+ # endif
+       lines = bot - top + 1;
  
-       if (fp != NULL)
+       if (VIsual_mode == Ctrl_V)
        {
-           /*
-@@ -3131,10 +3176,11 @@ ins_compl_free()
-       for (i = 0; i < CPT_COUNT; ++i)
-           vim_free(match->cp_text[i]);
-       vim_free(match);
-     } while (compl_curr_match != NULL && compl_curr_match != compl_first_match);
-     compl_first_match = compl_curr_match = NULL;
-+    compl_shown_match = NULL;
- }
++#ifdef FEAT_LINEBREAK
++          char_u *saved_sbr = p_sbr;
++
++          /* Make 'sbr' empty for a moment to get the correct size. */
++          p_sbr = empty_option;
++#endif
+           getvcols(curwin, &curwin->w_cursor, &VIsual, &leftcol, &rightcol);
++#ifdef FEAT_LINEBREAK
++          p_sbr = saved_sbr;
++#endif
+           sprintf((char *)showcmd_buf, "%ldx%ld", lines,
+                                             (long)(rightcol - leftcol + 1));
+       }
+       else if (VIsual_mode == 'V' || VIsual.lnum != curwin->w_cursor.lnum)
+           sprintf((char *)showcmd_buf, "%ld", lines);
+       else
+-          sprintf((char *)showcmd_buf, "%ld", (long)(i
++          sprintf((char *)showcmd_buf, "%ld", (long)(cursor_bot
+                   ? curwin->w_cursor.col - VIsual.col
+                   : VIsual.col - curwin->w_cursor.col) + (*p_sel != 'e'));
+       showcmd_buf[SHOWCMD_COLS] = NUL;        /* truncate */
+       showcmd_visual = TRUE;
+     }
+@@ -4081,14 +4096,13 @@ nv_ignore(cap)
  
+ /*
+  * Command character that doesn't do anything, but unlike nv_ignore() does
+  * start edit().  Used for "startinsert" executed while starting up.
+  */
+-/*ARGSUSED */
      static void
- ins_compl_clear()
- {
-@@ -3207,11 +3253,11 @@ ins_compl_bs()
-     static void
- ins_compl_new_leader()
+ nv_nop(cap)
+-    cmdarg_T  *cap;
++    cmdarg_T  *cap UNUSED;
  {
-     ins_compl_del_pum();
-     ins_compl_delete();
--    ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
-+    ins_bytes(compl_leader + ins_compl_len());
-     compl_used_match = FALSE;
-     if (compl_started)
-       ins_compl_set_original_text(compl_leader);
-     else
-@@ -3262,10 +3308,24 @@ ins_compl_new_leader()
-     if (compl_match_array == NULL)
-       compl_enter_selects = FALSE;
  }
  
  /*
-+ * Return the length of the completion, from the completion start column to
-+ * the cursor column.  Making sure it never goes below zero.
-+ */
-+    static int
-+ins_compl_len()
-+{
-+    int off = (int)curwin->w_cursor.col - (int)compl_col;
-+
-+    if (off < 0)
-+      return 0;
-+    return off;
-+}
-+
-+/*
-  * Append one character to the match leader.  May reduce the number of
-  * matches.
-  */
-     static void
- ins_compl_addleader(c)
-@@ -3290,11 +3350,11 @@ ins_compl_addleader(c)
-     if (compl_was_interrupted)
-       ins_compl_restart();
-     vim_free(compl_leader);
-     compl_leader = vim_strnsave(ml_get_curline() + compl_col,
--                                          curwin->w_cursor.col - compl_col);
-+                                   (int)(curwin->w_cursor.col - compl_col));
-     if (compl_leader != NULL)
-       ins_compl_new_leader();
+  * Command character doesn't exist.
+@@ -4609,13 +4623,11 @@ nv_zet(cap)
+           dont_scroll = TRUE;         /* disallow scrolling here */
+ #endif
+           ++no_mapping;
+           ++allow_keys;   /* no mapping for nchar, but allow key codes */
+           nchar = plain_vgetc();
+-#ifdef FEAT_LANGMAP
+           LANGMAP_ADJUST(nchar, TRUE);
+-#endif
+           --no_mapping;
+           --allow_keys;
+ #ifdef FEAT_CMDL_INFO
+           (void)add_to_showcmd(nchar);
+ #endif
+@@ -4967,13 +4979,11 @@ dozet:
+ #ifdef FEAT_SPELL
+     case 'u': /* "zug" and "zuw": undo "zg" and "zw" */
+               ++no_mapping;
+               ++allow_keys;   /* no mapping for nchar, but allow key codes */
+               nchar = plain_vgetc();
+-#ifdef FEAT_LANGMAP
+               LANGMAP_ADJUST(nchar, TRUE);
+-#endif
+               --no_mapping;
+               --allow_keys;
+ #ifdef FEAT_CMDL_INFO
+               (void)add_to_showcmd(nchar);
+ #endif
+@@ -5226,11 +5236,11 @@ nv_colon(cap)
+       /* The start of the operator may have become invalid by the Ex
+        * command. */
+       if (cap->oap->op_type != OP_NOP
+               && (cap->oap->start.lnum > curbuf->b_ml.ml_line_count
+                   || cap->oap->start.col >
+-                                       STRLEN(ml_get(cap->oap->start.lnum))))
++                             (colnr_T)STRLEN(ml_get(cap->oap->start.lnum))))
+           clearopbeep(cap->oap);
+     }
  }
  
  /*
-@@ -3338,11 +3398,11 @@ ins_compl_set_original_text(str)
-  */
-     static void
- ins_compl_addfrommatch()
- {
-     char_u    *p;
--    int               len = curwin->w_cursor.col - compl_col;
-+    int               len = (int)curwin->w_cursor.col - (int)compl_col;
-     int               c;
-     compl_T   *cp;
+@@ -5394,10 +5404,11 @@ nv_ident(cap)
+     char_u    *kp;            /* value of 'keywordprg' */
+     int               kp_help;        /* 'keywordprg' is ":help" */
+     int               n = 0;          /* init for GCC */
+     int               cmdchar;
+     int               g_cmd;          /* "g" command */
++    int               tag_cmd = FALSE;
+     char_u    *aux_ptr;
+     int               isman;
+     int               isman_s;
  
-     p = compl_shown_match->cp_str;
-     if ((int)STRLEN(p) <= len)   /* the match is too short */
-@@ -3619,14 +3679,13 @@ ins_compl_prep(c)
-           /* CTRL-E means completion is Ended, go back to the typed text. */
-           if (c == Ctrl_E)
+     if (cap->cmdchar == 'g')  /* "g*", "g#", "g]" and "gCTRL-]" */
+@@ -5467,10 +5478,24 @@ nv_ident(cap)
+       case 'K':
+           if (kp_help)
+               STRCPY(buf, "he! ");
+           else
            {
-               ins_compl_delete();
-               if (compl_leader != NULL)
--                  ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
-+                  ins_bytes(compl_leader + ins_compl_len());
-               else if (compl_first_match != NULL)
--                  ins_bytes(compl_orig_text
--                                        + curwin->w_cursor.col - compl_col);
-+                  ins_bytes(compl_orig_text + ins_compl_len());
-               retval = TRUE;
++              /* An external command will probably use an argument starting
++               * with "-" as an option.  To avoid trouble we skip the "-". */
++              while (*ptr == '-' && n > 0)
++              {
++                  ++ptr;
++                  --n;
++              }
++              if (n == 0)
++              {
++                  EMSG(_(e_noident));  /* found dashes only */
++                  vim_free(buf);
++                  return;
++              }
++
+               /* When a count is given, turn it into a range.  Is this
+                * really what we want? */
+               isman = (STRCMP(kp, "man") == 0);
+               isman_s = (STRCMP(kp, "man -s") == 0);
+               if (cap->count0 != 0 && !(isman || isman_s))
+@@ -5489,61 +5514,90 @@ nv_ident(cap)
+               }
            }
+           break;
  
-           auto_format(FALSE, TRUE);
-@@ -3905,11 +3964,11 @@ ins_compl_get_exp(ini)
-                       ins_buf->b_fname == NULL
-                           ? buf_spname(ins_buf)
-                           : ins_buf->b_sfname == NULL
-                               ? (char *)ins_buf->b_fname
-                               : (char *)ins_buf->b_sfname);
--              msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
-+              (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
-           }
-           else if (*e_cpt == NUL)
-               break;
+       case ']':
++          tag_cmd = TRUE;
+ #ifdef FEAT_CSCOPE
+           if (p_cst)
+               STRCPY(buf, "cstag ");
            else
-           {
-@@ -3934,12 +3993,12 @@ ins_compl_get_exp(ini)
-                   type = CTRL_X_PATH_DEFINES;
  #endif
-               else if (*e_cpt == ']' || *e_cpt == 't')
-               {
-                   type = CTRL_X_TAGS;
--                  sprintf((char*)IObuff, _("Scanning tags."));
--                  msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
-+                  vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags."));
-+                  (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R));
-               }
-               else
-                   type = -1;
+               STRCPY(buf, "ts ");
+           break;
  
-               /* in any case e_cpt is advanced to the next entry */
-@@ -3987,11 +4046,11 @@ ins_compl_get_exp(ini)
-       case CTRL_X_TAGS:
-           /* set p_ic according to p_ic, p_scs and pat for find_tags(). */
-           save_p_ic = p_ic;
-           p_ic = ignorecase(compl_pattern);
+       default:
++          tag_cmd = TRUE;
+           if (curbuf->b_help)
+               STRCPY(buf, "he! ");
+-          else if (g_cmd)
+-              STRCPY(buf, "tj ");
+           else
+-              sprintf((char *)buf, "%ldta ", cap->count0);
++          {
++              if (g_cmd)
++                  STRCPY(buf, "tj ");
++              else
++                  sprintf((char *)buf, "%ldta ", cap->count0);
++          }
+     }
  
--          /* Find up to TAG_MANY matches.  Avoids that an enourmous number
-+          /* Find up to TAG_MANY matches.  Avoids that an enormous number
-            * of matches is found when compl_pattern is empty */
-           if (find_tags(compl_pattern, &num_matches, &matches,
-                   TAG_REGEXP | TAG_NAMES | TAG_NOIC |
-                   TAG_INS_COMP | (ctrl_x_mode ? TAG_VERBOSE : 0),
-                   TAG_MANY, curbuf->b_ffname) == OK && num_matches > 0)
-@@ -4033,11 +4092,11 @@ ins_compl_get_exp(ini)
+     /*
+      * Now grab the chars in the identifier
+      */
+-    if (cmdchar == '*')
+-      aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
+-    else if (cmdchar == '#')
+-      aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
+-    else if (cmdchar == 'K' && !kp_help)
+-      aux_ptr = (char_u *)" \t\\\"|!";
+-    else
+-      /* Don't escape spaces and Tabs in a tag with a backslash */
+-      aux_ptr = (char_u *)"\\|\"";
+-
+-    p = buf + STRLEN(buf);
+-    while (n-- > 0)
+-    {
+-      /* put a backslash before \ and some others */
+-      if (vim_strchr(aux_ptr, *ptr) != NULL)
+-          *p++ = '\\';
+-#ifdef FEAT_MBYTE
+-      /* When current byte is a part of multibyte character, copy all bytes
+-       * of that character. */
+-      if (has_mbyte)
++    if (cmdchar == 'K' && !kp_help)
++    {
++      /* Escape the argument properly for a shell command */
++      ptr = vim_strnsave(ptr, n);
++      p = vim_strsave_shellescape(ptr, TRUE);
++      vim_free(ptr);
++      if (p == NULL)
+       {
+-          int i;
+-          int len = (*mb_ptr2len)(ptr) - 1;
+-
+-          for (i = 0; i < len && n >= 1; ++i, --n)
+-              *p++ = *ptr++;
++          vim_free(buf);
++          return;
++      }
++      buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1);
++      if (buf == NULL)
++      {
++          vim_free(buf);
++          vim_free(p);
++          return;
+       }
++      STRCAT(buf, p);
++      vim_free(p);
++    }
++    else
++    {
++      if (cmdchar == '*')
++          aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
++      else if (cmdchar == '#')
++          aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
++      else if (tag_cmd)
++          /* Don't escape spaces and Tabs in a tag with a backslash */
++          aux_ptr = (char_u *)"\\|\"\n[";
++      else
++          aux_ptr = (char_u *)"\\|\"\n*?[";
++
++      p = buf + STRLEN(buf);
++      while (n-- > 0)
++      {
++          /* put a backslash before \ and some others */
++          if (vim_strchr(aux_ptr, *ptr) != NULL)
++              *p++ = '\\';
++#ifdef FEAT_MBYTE
++          /* When current byte is a part of multibyte character, copy all
++           * bytes of that character. */
++          if (has_mbyte)
++          {
++              int i;
++              int len = (*mb_ptr2len)(ptr) - 1;
++
++              for (i = 0; i < len && n >= 1; ++i, --n)
++                  *p++ = *ptr++;
++          }
  #endif
+-      *p++ = *ptr++;
++          *p++ = *ptr++;
++      }
++      *p = NUL;
+     }
+-    *p = NUL;
  
-       case CTRL_X_SPELL:
- #ifdef FEAT_SPELL
-           num_matches = expand_spelling(first_match_pos.lnum,
--                               first_match_pos.col, compl_pattern, &matches);
-+                                                   compl_pattern, &matches);
-           if (num_matches > 0)
-               ins_compl_add_matches(num_matches, matches, p_ic);
+     /*
+      * Execute the command.
+      */
+     if (cmdchar == '*' || cmdchar == '#')
+@@ -5554,10 +5608,11 @@ nv_ident(cap)
  #endif
-           break;
-@@ -4158,11 +4217,11 @@ ins_compl_get_exp(ini)
-                                                                      == NULL
-                                               && (IObuff[len - 2] == '?'
-                                                || IObuff[len - 2] == '!'))))
-                                       IObuff[len++] = ' ';
-                               }
--                              /* copy as much as posible of the new word */
-+                              /* copy as much as possible of the new word */
-                               if (tmp_ptr - ptr >= IOSIZE - len)
-                                   tmp_ptr = ptr + IOSIZE - len - 1;
-                               STRNCPY(IObuff + len, ptr, tmp_ptr - ptr);
-                               len += (int)(tmp_ptr - ptr);
-                               flags |= CONT_S_IPOS;
-@@ -4185,11 +4244,11 @@ ins_compl_get_exp(ini)
-           p_scs = save_p_scs;
-           p_ws = save_p_ws;
-       }
-       /* check if compl_curr_match has changed, (e.g. other type of
--       * expansion added somenthing) */
-+       * expansion added something) */
-       if (type != 0 && compl_curr_match != old_match)
-           found_new_match = OK;
-       /* break the loop for specialized modes (use 'complete' just for the
-        * generic ctrl_x_mode == 0) or when we've found a new match */
-@@ -4254,11 +4313,11 @@ ins_compl_delete()
- /* Insert the new text being completed. */
-     static void
- ins_compl_insert()
- {
--    ins_bytes(compl_shown_match->cp_str + curwin->w_cursor.col - compl_col);
-+    ins_bytes(compl_shown_match->cp_str + ins_compl_len());
-     if (compl_shown_match->cp_flags & ORIGINAL_TEXT)
-       compl_used_match = FALSE;
-     else
-       compl_used_match = TRUE;
- }
-@@ -4423,11 +4482,11 @@ ins_compl_next(allow_get_expansion, coun
-     if (insert_match)
-     {
-       if (!compl_get_longest || compl_used_match)
-           ins_compl_insert();
-       else
--          ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);
-+          ins_bytes(compl_leader + ins_compl_len());
+               vim_iswordc(ptr[-1])))
+           STRCAT(buf, "\\>");
+ #ifdef FEAT_CMDHIST
+       /* put pattern in search history */
++      init_history();
+       add_to_history(HIST_SEARCH, buf, TRUE, NUL);
+ #endif
+       normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0);
      }
      else
-       compl_used_match = FALSE;
-     if (!allow_get_expansion)
-@@ -4623,10 +4682,11 @@ ins_complete(c)
- {
-     char_u    *line;
-     int               startcol = 0;       /* column where searched text starts */
-     colnr_T   curs_col;           /* cursor column */
-     int               n;
-+    int               save_w_wrow;
+@@ -5765,11 +5820,14 @@ nv_right(cap)
+ #endif
  
-     compl_direction = ins_compl_key2dir(c);
-     if (!compl_started)
+     for (n = cap->count1; n > 0; --n)
      {
-       /* First time we hit ^N or ^P (in a row, I mean) */
-@@ -4686,11 +4746,11 @@ ins_complete(c)
-                   }
-                   compl_col = compl_startpos.col;
-               }
-               compl_length = curwin->w_cursor.col - (int)compl_col;
-               /* IObuff is used to add a "word from the next line" would we
--               * have enough space?  just being paranoic */
-+               * have enough space?  just being paranoid */
- #define       MIN_SPACE 75
-               if (compl_length > (IOSIZE - MIN_SPACE))
-               {
-                   compl_cont_status &= ~CONT_SOL;
-                   compl_length = (IOSIZE - MIN_SPACE);
-@@ -4743,14 +4803,13 @@ ins_complete(c)
-           }
-           else if (compl_cont_status & CONT_ADDING)
-           {
-               char_u      *prefix = (char_u *)"\\<";
--              /* we need 3 extra chars, 1 for the NUL and
--               * 2 >= strlen(prefix)  -- Acevedo */
-+              /* we need up to 2 extra chars for the prefix */
-               compl_pattern = alloc(quote_meta(NULL, line + compl_col,
--                                                         compl_length) + 3);
-+                                                         compl_length) + 2);
-               if (compl_pattern == NULL)
-                   return FAIL;
-               if (!vim_iswordp(line + compl_col)
-                       || (compl_col > 0
-                           && (
-@@ -4821,11 +4880,11 @@ ins_complete(c)
-                   STRCAT((char *)compl_pattern, "\\k");
-               }
-               else
-               {
-                   compl_pattern = alloc(quote_meta(NULL, line + compl_col,
--                                                         compl_length) + 3);
-+                                                         compl_length) + 2);
-                   if (compl_pattern == NULL)
-                       return FAIL;
-                   STRCPY((char *)compl_pattern, "\\<");
-                   (void)quote_meta(compl_pattern + 2, line + compl_col,
-                                                               compl_length);
-@@ -4903,11 +4962,11 @@ ins_complete(c)
-           curwin->w_cursor = pos;     /* restore the cursor position */
-           if (col < 0)
-               col = curs_col;
-           compl_col = col;
--          if ((colnr_T)compl_col > curs_col)
-+          if (compl_col > curs_col)
-               compl_col = curs_col;
-           /* Setup variables for completion.  Need to obtain "line" again,
-            * it may have become invalid. */
-           line = ml_get(curwin->w_cursor.lnum);
-@@ -5007,10 +5066,11 @@ ins_complete(c)
-     compl_shows_dir = compl_direction;
-     /*
-      * Find next match (and following matches).
-      */
-+    save_w_wrow = curwin->w_wrow;
-     n = ins_compl_next(TRUE, ins_compl_key2count(c), ins_compl_use_match(c));
-     /* may undisplay the popup menu */
-     ins_compl_upd_pum();
+       if ((!PAST_LINE && oneright() == FAIL)
+-              || (PAST_LINE && *ml_get_cursor() == NUL))
++#ifdef FEAT_VISUAL
++              || (PAST_LINE && *ml_get_cursor() == NUL)
++#endif
++              )
+       {
+           /*
+            *    <Space> wraps to next line if 'whichwrap' has 's'.
+            *        'l' wraps to next line if 'whichwrap' has 'l'.
+            * CURS_RIGHT wraps to next line if 'whichwrap' has '>'.
+@@ -6009,11 +6067,11 @@ nv_gotofile(cap)
+       /* do autowrite if necessary */
+       if (curbufIsChanged() && curbuf->b_nwindows <= 1 && !P_HID(curbuf))
+           autowrite(curbuf, FALSE);
+       setpcmark();
+       (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST,
+-                                             P_HID(curbuf) ? ECMD_HIDE : 0);
++                                     P_HID(curbuf) ? ECMD_HIDE : 0, curwin);
+       if (cap->nchar == 'F' && lnum >= 0)
+       {
+           curwin->w_cursor.lnum = lnum;
+           check_cursor_lnum();
+           beginline(BL_SOL | BL_FIX);
+@@ -6726,10 +6784,12 @@ nv_replace(cap)
  
-@@ -5160,10 +5220,16 @@ ins_complete(c)
-     if (!compl_interrupted)
+ #ifdef FEAT_VISUAL
+     /* Visual mode "r" */
+     if (VIsual_active)
      {
-       /* RedrawingDisabled may be set when invoked through complete(). */
-       n = RedrawingDisabled;
-       RedrawingDisabled = 0;
-+
-+      /* If the cursor moved we need to remove the pum first. */
-+      setcursor();
-+      if (save_w_wrow != curwin->w_wrow)
-+          ins_compl_del_pum();
-+
-       ins_compl_show_pum();
-       setcursor();
-       RedrawingDisabled = n;
++      if (got_int)
++          reset_VIsual();
+       nv_operator(cap);
+       return;
      }
-     compl_was_interrupted = compl_interrupted;
-@@ -5176,19 +5242,19 @@ ins_complete(c)
-  * Looks in the first "len" chars. of "src" for search-metachars.
-  * If dest is not NULL the chars. are copied there quoting (with
-  * a backslash) the metachars, and dest would be NUL terminated.
-  * Returns the length (needed) of dest
-  */
--    static int
-+    static unsigned
- quote_meta(dest, src, len)
-     char_u    *dest;
-     char_u    *src;
-     int               len;
- {
--    int       m;
-+    unsigned  m = (unsigned)len + 1;  /* one extra for the NUL */
+ #endif
  
--    for (m = len; --len >= 0; src++)
-+    for ( ; --len >= 0; src++)
-     {
-       switch (*src)
-       {
-           case '.':
-           case '*':
-@@ -5498,11 +5564,11 @@ insertchar(c, flags, second_indent)
-            * was called. */
-           ins_need_undo = TRUE;
+@@ -7782,11 +7842,11 @@ nv_g_cmd(cap)
+               i = (curwin->w_virtcol - width1) / width2 * width2 + width1;
        }
-       if (do_internal)
+       else
+           i = curwin->w_leftcol;
+       /* Go to the middle of the screen line.  When 'number' is on and lines
+-       * are wrapping the middle can be more to the left.*/
++       * are wrapping the middle can be more to the left. */
+       if (cap->nchar == 'm')
+           i += (W_WIDTH(curwin) - curwin_col_off()
+                   + ((curwin->w_p_wrap && i > 0)
+                       ? curwin_col_off2() : 0)) / 2;
+       coladvance((colnr_T)i);
+@@ -7819,10 +7879,13 @@ nv_g_cmd(cap)
+           /* Decrease the cursor column until it's on a non-blank. */
+           while (curwin->w_cursor.col > 0
+                                   && vim_iswhite(ptr[curwin->w_cursor.col]))
+               --curwin->w_cursor.col;
+           curwin->w_set_curswant = TRUE;
++#ifdef FEAT_VISUAL
++          adjust_for_sel(cap);
++#endif
+       }
+       break;
+     case '$':
+     case K_END:
+@@ -9190,14 +9253,13 @@ nv_open(cap)
  #endif
--          internal_format(textwidth, second_indent, flags, c == NUL);
-+          internal_format(textwidth, second_indent, flags, c == NUL, c);
-     }
+       n_opencmd(cap);
+ }
  
-     if (c == NUL)         /* only formatting was wanted */
-       return;
+ #ifdef FEAT_SNIFF
+-/*ARGSUSED*/
+     static void
+ nv_sniff(cap)
+-    cmdarg_T  *cap;
++    cmdarg_T  *cap UNUSED;
+ {
+     ProcessSniffRequests();
+ }
+ #endif
  
-@@ -5678,15 +5744,16 @@ insertchar(c, flags, second_indent)
+@@ -9209,14 +9271,13 @@ nv_nbcmd(cap)
+     netbeans_keycommand(cap->nchar);
+ }
+ #endif
+ #ifdef FEAT_DND
+-/*ARGSUSED*/
+     static void
+ nv_drop(cap)
+-    cmdarg_T  *cap;
++    cmdarg_T  *cap UNUSED;
+ {
+     do_put('~', BACKWARD, 1L, PUT_CURSEND);
+ }
+ #endif
  
+@@ -9224,11 +9285,10 @@ nv_drop(cap)
  /*
-  * Format text at the current insert position.
+  * Trigger CursorHold event.
+  * When waiting for a character for 'updatetime' K_CURSORHOLD is put in the
+  * input buffer.  "did_cursorhold" is set to avoid retriggering.
   */
+-/*ARGSUSED*/
      static void
--internal_format(textwidth, second_indent, flags, format_only)
-+internal_format(textwidth, second_indent, flags, format_only, c)
-     int               textwidth;
-     int               second_indent;
-     int               flags;
-     int               format_only;
-+    int               c; /* character to be inserted (can be NUL) */
+ nv_cursorhold(cap)
+     cmdarg_T  *cap;
  {
-     int               cc;
-     int               save_char = NUL;
-     int               haveto_redraw = FALSE;
-     int               fo_ins_blank = has_format_option(FO_INS_BLANK);
-@@ -5703,11 +5770,15 @@ internal_format(textwidth, second_indent
-     /*
-      * When 'ai' is off we don't want a space under the cursor to be
-      * deleted.  Replace it with an 'x' temporarily.
-      */
--    if (!curbuf->b_p_ai)
-+    if (!curbuf->b_p_ai
-+#ifdef FEAT_VREPLACE
-+          && !(State & VREPLACE_FLAG)
-+#endif
-+          )
-     {
-       cc = gchar_cursor();
-       if (vim_iswhite(cc))
-       {
-           save_char = cc;
-@@ -5729,13 +5800,15 @@ internal_format(textwidth, second_indent
- #ifdef FEAT_VREPLACE
-       int     orig_col = 0;
-       char_u  *saved_text = NULL;
- #endif
-       colnr_T col;
-+      colnr_T end_col;
--      virtcol = get_nolist_virtcol();
--      if (virtcol < (colnr_T)textwidth)
-+      virtcol = get_nolist_virtcol()
-+              + char2cells(c != NUL ? c : gchar_cursor());
-+      if (virtcol <= (colnr_T)textwidth)
-           break;
+     apply_autocmds(EVENT_CURSORHOLD, NULL, NULL, FALSE, curbuf);
+--- vim72.orig/src/ops.c
++++ vim72/src/ops.c
+@@ -70,15 +70,15 @@ static struct yankreg      *y_previous = NULL
+  * structure used by block_prep, op_delete and op_yank for blockwise operators
+  * also op_change, op_shift, op_insert, op_replace - AKelly
+  */
+ struct block_def
+ {
+-    int               startspaces;    /* 'extra' cols of first char */
+-    int               endspaces;      /* 'extra' cols of first char */
++    int               startspaces;    /* 'extra' cols before first char */
++    int               endspaces;      /* 'extra' cols after last char */
+     int               textlen;        /* chars in block */
+-    char_u    *textstart;     /* pointer to 1st char in block */
+-    colnr_T   textcol;        /* cols of chars (at least part.) in block */
++    char_u    *textstart;     /* pointer to 1st char (partially) in block */
++    colnr_T   textcol;        /* index of chars (partially) in block */
+     colnr_T   start_vcol;     /* start col of 1st char wholly inside block */
+     colnr_T   end_vcol;       /* start col of 1st char wholly after block */
+ #ifdef FEAT_VISUALEXTRA
+     int               is_short;       /* TRUE if line is too short to fit in block */
+     int               is_MAX;         /* TRUE if curswant==MAXCOL when starting */
+@@ -380,22 +380,20 @@ shift_block(oap, amount)
+     oparg_T   *oap;
+     int               amount;
+ {
+     int                       left = (oap->op_type == OP_LSHIFT);
+     int                       oldstate = State;
+-    int                       total, split;
+-    char_u            *newp, *oldp, *midp, *ptr;
++    int                       total;
++    char_u            *newp, *oldp;
+     int                       oldcol = curwin->w_cursor.col;
+     int                       p_sw = (int)curbuf->b_p_sw;
+     int                       p_ts = (int)curbuf->b_p_ts;
+     struct block_def  bd;
+-    int                       internal = 0;
+     int                       incr;
+-    colnr_T           vcol, col = 0, ws_vcol;
++    colnr_T           ws_vcol;
+     int                       i = 0, j = 0;
+     int                       len;
+-
+ #ifdef FEAT_RIGHTLEFT
+     int                       old_p_ri = p_ri;
  
- #ifdef FEAT_COMMENTS
-       if (no_leader)
-           do_comments = FALSE;
-@@ -5760,42 +5833,37 @@ internal_format(textwidth, second_indent
- #ifdef FEAT_COMMENTS
-               && leader_len == 0
+     p_ri = 0;                 /* don't want revins in ident */
  #endif
-               && !has_format_option(FO_WRAP))
+@@ -422,12 +420,13 @@ shift_block(oap, amount)
+       if (bd.startspaces)
+       {
+ #ifdef FEAT_MBYTE
+           if (has_mbyte)
+               bd.textstart += (*mb_ptr2len)(bd.textstart);
++          else
+ #endif
+-          ++bd.textstart;
++              ++bd.textstart;
+       }
+       for ( ; vim_iswhite(*bd.textstart); )
+       {
+           incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol));
+           total += incr;
+@@ -454,71 +453,94 @@ shift_block(oap, amount)
+       /* the end */
+       mch_memmove(newp + bd.textcol + i + j, bd.textstart, (size_t)len);
+     }
+     else /* left */
+     {
+-      vcol = oap->start_vcol;
+-      /* walk vcol past ws to be removed */
+-      for (midp = oldp + bd.textcol;
+-            vcol < (oap->start_vcol + total) && vim_iswhite(*midp); )
 -      {
--          textwidth = 0;
-           break;
+-          incr = lbr_chartabsize_adv(&midp, (colnr_T)vcol);
+-          vcol += incr;
 -      }
-       if ((startcol = curwin->w_cursor.col) == 0)
-           break;
-       /* find column of textwidth border */
-       coladvance((colnr_T)textwidth);
-       wantcol = curwin->w_cursor.col;
+-      /* internal is the block-internal ws replacing a split TAB */
+-      if (vcol > (oap->start_vcol + total))
+-      {
+-          /* we have to split the TAB *(midp-1) */
+-          internal = vcol - (oap->start_vcol + total);
+-      }
+-      /* if 'expandtab' is not set, use TABs */
++      colnr_T     destination_col;    /* column to which text in block will
++                                         be shifted */
++      char_u      *verbatim_copy_end; /* end of the part of the line which is
++                                         copied verbatim */
++      colnr_T     verbatim_copy_width;/* the (displayed) width of this part
++                                         of line */
++      unsigned    fill;               /* nr of spaces that replace a TAB */
++      unsigned    new_line_len;       /* the length of the line after the
++                                         block shift */
++      size_t      block_space_width;
++      size_t      shift_amount;
++      char_u      *non_white = bd.textstart;
++      colnr_T     non_white_col;
  
--      curwin->w_cursor.col = startcol - 1;
--#ifdef FEAT_MBYTE
--      /* Correct cursor for multi-byte character. */
--      if (has_mbyte)
--          mb_adjust_cursor();
--#endif
-+      curwin->w_cursor.col = startcol;
-       foundcol = 0;
+-      split = bd.startspaces + internal;
+-      if (split > 0)
+-      {
+-          if (!curbuf->b_p_et)
+-          {
+-              for (ptr = oldp, col = 0; ptr < oldp+bd.textcol; )
+-                  col += lbr_chartabsize_adv(&ptr, (colnr_T)col);
++      /*
++       * Firstly, let's find the first non-whitespace character that is
++       * displayed after the block's start column and the character's column
++       * number. Also, let's calculate the width of all the whitespace
++       * characters that are displayed in the block and precede the searched
++       * non-whitespace character.
++       */
  
-       /*
-        * Find position to break at.
-        * Stop at first entered white when 'formatoptions' has 'v'
-        */
-       while ((!fo_ins_blank && !has_format_option(FO_INS_VI))
-                   || curwin->w_cursor.lnum != Insstart.lnum
-                   || curwin->w_cursor.col >= Insstart.col)
-       {
--          cc = gchar_cursor();
-+          if (curwin->w_cursor.col == startcol && c != NUL)
-+              cc = c;
-+          else
-+              cc = gchar_cursor();
-           if (WHITECHAR(cc))
-           {
-               /* remember position of blank just before text */
--              end_foundcol = curwin->w_cursor.col;
-+              end_col = curwin->w_cursor.col;
+-              /* col+1 now equals the start col of the first char of the
+-               * block (may be < oap.start_vcol if we're splitting a TAB) */
+-              i = ((col % p_ts) + split) / p_ts; /* number of tabs */
+-          }
+-          if (i)
+-              j = ((col % p_ts) + split) % p_ts; /* number of spp */
+-          else
+-              j = split;
+-      }
++      /* If "bd.startspaces" is set, "bd.textstart" points to the character,
++       * the part of which is displayed at the block's beginning. Let's start
++       * searching from the next character. */
++      if (bd.startspaces)
++          mb_ptr_adv(non_white);
  
-               /* find start of sequence of blanks */
-               while (curwin->w_cursor.col > 0 && WHITECHAR(cc))
-               {
-                   dec_cursor();
-@@ -5811,39 +5879,77 @@ internal_format(textwidth, second_indent
-               if (has_format_option(FO_ONE_LETTER))
-               {
-                   /* do not break after one-letter words */
-                   if (curwin->w_cursor.col == 0)
-                       break;  /* one-letter word at begin */
--
-+#ifdef FEAT_COMMENTS
-+                  /* do not break "#a b" when 'tw' is 2 */
-+                  if (curwin->w_cursor.col <= leader_len)
-+                      break;
-+#endif
-                   col = curwin->w_cursor.col;
-                   dec_cursor();
-                   cc = gchar_cursor();
+-      newp = alloc_check(bd.textcol + i + j + (unsigned)STRLEN(midp) + 1);
+-      if (newp == NULL)
+-          return;
+-      vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + STRLEN(midp) + 1));
++      /* The character's column is in "bd.start_vcol".  */
++      non_white_col = bd.start_vcol;
  
-                   if (WHITECHAR(cc))
-                       continue;       /* one-letter, continue */
-                   curwin->w_cursor.col = col;
-               }
--#ifdef FEAT_MBYTE
--              if (has_mbyte)
--                  foundcol = curwin->w_cursor.col
--                                       + (*mb_ptr2len)(ml_get_cursor());
--              else
--#endif
--                  foundcol = curwin->w_cursor.col + 1;
--              if (curwin->w_cursor.col < (colnr_T)wantcol)
-+
-+              inc_cursor();
+-      /* copy first part we want to keep */
+-      mch_memmove(newp, oldp, (size_t)bd.textcol);
+-      /* Now copy any TABS and spp to ensure correct alignment! */
+-      while (vim_iswhite(*midp))
++      while (vim_iswhite(*non_white))
+       {
+-          if (*midp == TAB)
+-              i++;
+-          else /*space */
+-              j++;
+-          midp++;
++          incr = lbr_chartabsize_adv(&non_white, non_white_col);
++          non_white_col += incr;
+       }
+-      /* We might have an extra TAB worth of spp now! */
+-      if (j / p_ts && !curbuf->b_p_et)
 +
-+              end_foundcol = end_col + 1;
-+              foundcol = curwin->w_cursor.col;
-+              if (curwin->w_cursor.col <= (colnr_T)wantcol)
-                   break;
-           }
- #ifdef FEAT_MBYTE
--          else if (cc >= 0x100 && fo_multibyte
--                            && curwin->w_cursor.col <= (colnr_T)wantcol)
-+          else if (cc >= 0x100 && fo_multibyte)
-           {
-               /* Break after or before a multi-byte character. */
-+              if (curwin->w_cursor.col != startcol)
-+              {
-+#ifdef FEAT_COMMENTS
-+                  /* Don't break until after the comment leader */
-+                  if (curwin->w_cursor.col < leader_len)
-+                      break;
-+#endif
-+                  col = curwin->w_cursor.col;
-+                  inc_cursor();
-+                  /* Don't change end_foundcol if already set. */
-+                  if (foundcol != curwin->w_cursor.col)
-+                  {
-+                      foundcol = curwin->w_cursor.col;
-+                      end_foundcol = foundcol;
-+                      if (curwin->w_cursor.col <= (colnr_T)wantcol)
-+                          break;
-+                  }
-+                  curwin->w_cursor.col = col;
-+              }
++      block_space_width = non_white_col - oap->start_vcol;
++      /* We will shift by "total" or "block_space_width", whichever is less.
++       */
++      shift_amount = (block_space_width < (size_t)total
++                                       ? block_space_width : (size_t)total);
 +
-+              if (curwin->w_cursor.col == 0)
-+                  break;
++      /* The column to which we will shift the text.  */
++      destination_col = (colnr_T)(non_white_col - shift_amount);
 +
-+              col = curwin->w_cursor.col;
++      /* Now let's find out how much of the beginning of the line we can
++       * reuse without modification.  */
++      verbatim_copy_end = bd.textstart;
++      verbatim_copy_width = bd.start_vcol;
 +
-+              dec_cursor();
-+              cc = gchar_cursor();
++      /* If "bd.startspaces" is set, "bd.textstart" points to the character
++       * preceding the block. We have to subtract its width to obtain its
++       * column number.  */
++      if (bd.startspaces)
++          verbatim_copy_width -= bd.start_char_vcols;
++      while (verbatim_copy_width < destination_col)
+       {
+-          i++;
+-          j -= p_ts;
++          incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width);
++          if (verbatim_copy_width + incr > destination_col)
++              break;
++          verbatim_copy_width += incr;
++          mb_ptr_adv(verbatim_copy_end);
+       }
+-      copy_chars(newp + bd.textcol, (size_t)i, TAB);
+-      copy_spaces(newp + bd.textcol + i, (size_t)j);
+-      /* the end */
+-      STRMOVE(newp + STRLEN(newp), midp);
++      /* If "destination_col" is different from the width of the initial
++       * part of the line that will be copied, it means we encountered a tab
++       * character, which we will have to partly replace with spaces.  */
++      fill = destination_col - verbatim_copy_width;
 +
-+              if (WHITECHAR(cc))
-+                  continue;           /* break with space */
-+#ifdef FEAT_COMMENTS
-+              /* Don't break until after the comment leader */
-+              if (curwin->w_cursor.col < leader_len)
-+                  break;
-+#endif
++      /* The replacement line will consist of:
++       * - the beginning of the original line up to "verbatim_copy_end",
++       * - "fill" number of spaces,
++       * - the rest of the line, pointed to by non_white.  */
++      new_line_len = (unsigned)(verbatim_copy_end - oldp)
++                     + fill
++                     + (unsigned)STRLEN(non_white) + 1;
 +
-+              curwin->w_cursor.col = col;
++      newp = alloc_check(new_line_len);
++      if (newp == NULL)
++          return;
++      mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp));
++      copy_spaces(newp + (verbatim_copy_end - oldp), (size_t)fill);
++      STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white);
+     }
+     /* replace the line */
+     ml_replace(curwin->w_cursor.lnum, newp, FALSE);
+     changed_bytes(curwin->w_cursor.lnum, (colnr_T)bd.textcol);
+     State = oldstate;
+@@ -1120,10 +1142,12 @@ stuff_yank(regname, p)
+       y_current->y_type = MCHAR;  /* used to be MLINE, why? */
+     }
+     return OK;
+ }
++static int execreg_lastc = NUL;
 +
-               foundcol = curwin->w_cursor.col;
--              if (curwin->w_cursor.col < (colnr_T)wantcol)
--                  foundcol += (*mb_char2len)(cc);
-               end_foundcol = foundcol;
--              break;
-+              if (curwin->w_cursor.col <= (colnr_T)wantcol)
-+                  break;
-           }
- #endif
-           if (curwin->w_cursor.col == 0)
-               break;
-           dec_cursor();
-@@ -5866,18 +5972,19 @@ internal_format(textwidth, second_indent
- #ifdef FEAT_VREPLACE
-       if (State & VREPLACE_FLAG)
-           orig_col = startcol;        /* Will start backspacing from here */
-       else
+ /*
+  * execute a yank register: copy it into the stuff buffer
+  *
+  * return FAIL for failure, OK otherwise
+  */
+@@ -1132,32 +1156,31 @@ do_execreg(regname, colon, addcr, silent
+     int           regname;
+     int           colon;              /* insert ':' before each line */
+     int           addcr;              /* always add '\n' to end of line */
+     int           silent;             /* set "silent" flag in typeahead buffer */
+ {
+-    static int        lastc = NUL;
+     long      i;
+     char_u    *p;
+     int               retval = OK;
+     int               remap;
+     if (regname == '@')                       /* repeat previous one */
+     {
+-      if (lastc == NUL)
++      if (execreg_lastc == NUL)
+       {
+           EMSG(_("E748: No previously used register"));
+           return FAIL;
+       }
+-      regname = lastc;
++      regname = execreg_lastc;
+     }
+                                       /* check for valid regname */
+     if (regname == '%' || regname == '#' || !valid_yank_reg(regname, FALSE))
+     {
+       emsg_invreg(regname);
+       return FAIL;
+     }
+-    lastc = regname;
++    execreg_lastc = regname;
+ #ifdef FEAT_CLIPBOARD
+     regname = may_get_selection(regname);
  #endif
--          replace_offset = startcol - end_foundcol - 1;
-+          replace_offset = startcol - end_foundcol;
  
-       /*
-        * adjust startcol for spaces that will be deleted and
-        * characters that will remain on top line
-        */
-       curwin->w_cursor.col = foundcol;
--      while (cc = gchar_cursor(), WHITECHAR(cc))
-+      while ((cc = gchar_cursor(), WHITECHAR(cc))
-+                  && (!fo_white_par || curwin->w_cursor.col < startcol))
-           inc_cursor();
-       startcol -= curwin->w_cursor.col;
-       if (startcol < 0)
-           startcol = 0;
+@@ -1276,22 +1299,28 @@ put_reedit_in_typebuf(silent)
+       if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
+           restart_edit = NUL;
+     }
+ }
  
-@@ -6013,11 +6120,11 @@ auto_format(trailblank, prev_line)
-     /* Don't format in Insert mode when the cursor is on a trailing blank, the
-      * user might insert normal text next.  Also skip formatting when "1" is
-      * in 'formatoptions' and there is a single character before the cursor.
-      * Otherwise the line would be broken and when typing another non-white
-      * next they are not joined back together. */
--    wasatend = (pos.col == STRLEN(old));
-+    wasatend = (pos.col == (colnr_T)STRLEN(old));
-     if (*old != NUL && !trailblank && wasatend)
-     {
-       dec_cursor();
-       cc = gchar_cursor();
-       if (!WHITECHAR(cc) && curwin->w_cursor.col > 0
-@@ -6190,11 +6297,11 @@ redo_literal(c)
++/*
++ * Insert register contents "s" into the typeahead buffer, so that it will be
++ * executed again.
++ * When "esc" is TRUE it is to be taken literally: Escape CSI characters and
++ * no remapping.
++ */
+     static int
+ put_in_typebuf(s, esc, colon, silent)
+     char_u    *s;
+-    int               esc;        /* Escape CSI characters */
++    int               esc;
+     int               colon;      /* add ':' before the line */
+     int               silent;
+ {
+     int               retval = OK;
  
-     /* Only digits need special treatment.  Translate them into a string of
-      * three digits. */
-     if (VIM_ISDIGIT(c))
+     put_reedit_in_typebuf(silent);
+     if (colon)
+-      retval = ins_typebuf((char_u *)"\n", REMAP_YES, 0, TRUE, silent);
++      retval = ins_typebuf((char_u *)"\n", REMAP_NONE, 0, TRUE, silent);
+     if (retval == OK)
      {
--      sprintf((char *)buf, "%03d", c);
-+      vim_snprintf((char *)buf, sizeof(buf), "%03d", c);
-       AppendToRedobuff(buf);
+       char_u  *p;
+       if (esc)
+@@ -1299,16 +1328,17 @@ put_in_typebuf(s, esc, colon, silent)
+       else
+           p = s;
+       if (p == NULL)
+           retval = FAIL;
+       else
+-          retval = ins_typebuf(p, REMAP_YES, 0, TRUE, silent);
++          retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES,
++                                                           0, TRUE, silent);
+       if (esc)
+           vim_free(p);
      }
-     else
-       AppendCharToRedobuff(c);
+     if (colon && retval == OK)
+-      retval = ins_typebuf((char_u *)":", REMAP_YES, 0, TRUE, silent);
++      retval = ins_typebuf((char_u *)":", REMAP_NONE, 0, TRUE, silent);
+     return retval;
  }
-@@ -6264,11 +6371,11 @@ stop_arrow()
-       {
-           arrow_used = FALSE;
-           ins_need_undo = FALSE;
-       }
-       Insstart = curwin->w_cursor;    /* new insertion starts here */
--      Insstart_textlen = linetabsize(ml_get_curline());
-+      Insstart_textlen = (colnr_T)linetabsize(ml_get_curline());
-       ai_col = 0;
- #ifdef FEAT_VREPLACE
-       if (State & VREPLACE_FLAG)
+ /*
+  * Insert a yank register: copy it into the Read buffer.
+@@ -1996,10 +2026,11 @@ op_replace(oap, c)
+     if (oap->block_mode)
+     {
+       bd.is_MAX = (curwin->w_curswant == MAXCOL);
+       for ( ; curwin->w_cursor.lnum <= oap->end.lnum; ++curwin->w_cursor.lnum)
        {
-           orig_line_count = curbuf->b_ml.ml_line_count;
-@@ -6367,25 +6474,30 @@ stop_insert(end_insert_pos, esc)
-       /* If a space was inserted for auto-formatting, remove it now. */
-       check_auto_format(TRUE);
++          curwin->w_cursor.col = 0;  /* make sure cursor position is valid */
+           block_prep(oap, &bd, curwin->w_cursor.lnum, TRUE);
+           if (bd.textlen == 0 && (!virtual_op || bd.is_MAX))
+               continue;           /* nothing to replace */
  
-       /* If we just did an auto-indent, remove the white space from the end
-        * of the line, and put the cursor back.
--       * Do this when ESC was used or moving the cursor up/down. */
-+       * Do this when ESC was used or moving the cursor up/down.
-+       * Check for the old position still being valid, just in case the text
-+       * got changed unexpectedly. */
-       if (did_ai && (esc || (vim_strchr(p_cpo, CPO_INDENT) == NULL
--                      && curwin->w_cursor.lnum != end_insert_pos->lnum)))
-+                      && curwin->w_cursor.lnum != end_insert_pos->lnum))
-+              && end_insert_pos->lnum <= curbuf->b_ml.ml_line_count)
-       {
-           pos_T       tpos = curwin->w_cursor;
-           curwin->w_cursor = *end_insert_pos;
-+          check_cursor_col();  /* make sure it is not past the line */
-           for (;;)
+           /* n == number of extra chars required
+@@ -2011,10 +2042,11 @@ op_replace(oap, c)
+            * coladd offset as part of "startspaces" */
+           if (virtual_op && bd.is_short && *bd.textstart == NUL)
            {
-               if (gchar_cursor() == NUL && curwin->w_cursor.col > 0)
-                   --curwin->w_cursor.col;
-               cc = gchar_cursor();
-               if (!vim_iswhite(cc))
-                   break;
--              (void)del_char(TRUE);
-+              if (del_char(TRUE) == FAIL)
-+                  break;  /* should not happen */
+               pos_T vpos;
++              vpos.lnum = curwin->w_cursor.lnum;
+               getvpos(&vpos, oap->start_vcol);
+               bd.startspaces += vpos.coladd;
+               n = bd.startspaces;
            }
-           if (curwin->w_cursor.lnum != tpos.lnum)
-               curwin->w_cursor = tpos;
-           else if (cc != NUL)
-               ++curwin->w_cursor.col; /* put cursor back on the NUL */
-@@ -6393,14 +6505,15 @@ stop_insert(end_insert_pos, esc)
+           else
+@@ -2207,16 +2239,19 @@ op_tilde(oap)
  #ifdef FEAT_VISUAL
-           /* <C-S-Right> may have started Visual mode, adjust the position for
-            * deleted characters. */
-           if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum)
-           {
--              cc = (int)STRLEN(ml_get_curline());
--              if (VIsual.col > (colnr_T)cc)
-+              int len = (int)STRLEN(ml_get_curline());
-+
-+              if (VIsual.col > len)
-               {
--                  VIsual.col = cc;
-+                  VIsual.col = len;
- # ifdef FEAT_VIRTUALEDIT
-                   VIsual.coladd = 0;
- # endif
-               }
-           }
-@@ -7121,13 +7234,16 @@ replace_flush()
-  * Handle doing a BS for one character.
-  * cc < 0: replace stack empty, just move cursor
-  * cc == 0: character was inserted, delete it
-  * cc > 0: character was replaced, put cc (first byte of original char) back
-  * and check for more characters to be put back
-+ * When "limit_col" is >= 0, don't delete before this column.  Matters when
-+ * using composing characters, use del_char_after_col() instead of del_char().
-  */
-     static void
--replace_do_bs()
-+replace_do_bs(limit_col)
-+    int               limit_col;
- {
-     int               cc;
- #ifdef FEAT_VREPLACE
-     int               orig_len = 0;
-     int               ins_len;
-@@ -7151,11 +7267,11 @@ replace_do_bs()
-       }
- #endif
- #ifdef FEAT_MBYTE
-       if (has_mbyte)
+     if (oap->block_mode)                  /* Visual block mode */
+     {
+       for (; pos.lnum <= oap->end.lnum; ++pos.lnum)
        {
--          del_char(FALSE);
-+          (void)del_char_after_col(limit_col);
- # ifdef FEAT_VREPLACE
-           if (State & VREPLACE_FLAG)
-               orig_len = (int)STRLEN(ml_get_cursor());
- # endif
-           replace_push(cc);
-@@ -7201,11 +7317,11 @@ replace_do_bs()
++          int one_change;
++
+           block_prep(oap, &bd, pos.lnum, FALSE);
+           pos.col = bd.textcol;
+-          did_change = swapchars(oap->op_type, &pos, bd.textlen);
++          one_change = swapchars(oap->op_type, &pos, bd.textlen);
++          did_change |= one_change;
  
-       /* mark the buffer as changed and prepare for displaying */
-       changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
-     }
-     else if (cc == 0)
--      (void)del_char(FALSE);
-+      (void)del_char_after_col(limit_col);
- }
+ # ifdef FEAT_NETBEANS_INTG
+-          if (usingNetbeans && did_change)
++          if (usingNetbeans && one_change)
+           {
+               char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE);
  
- #ifdef FEAT_CINDENT
- /*
-  * Return TRUE if C-indenting is on.
-@@ -7284,10 +7400,14 @@ in_cinkeys(keytyped, when, line_is_empty
-     char_u    *p;
-     char_u    *line;
-     int               icase;
-     int               i;
+               netbeans_removed(curbuf, pos.lnum, bd.textcol,
+                                                           (long)bd.textlen);
+@@ -2666,15 +2701,12 @@ op_change(oap)
  
-+    if (keytyped == NUL)
-+      /* Can happen with CTRL-Y and CTRL-E on a short line. */
-+      return FALSE;
+                       /* If the block starts in virtual space, count the
+                        * initial coladd offset as part of "startspaces" */
+                       if (bd.is_short)
+                       {
+-                          linenr_T lnum = curwin->w_cursor.lnum;
+-
+-                          curwin->w_cursor.lnum = linenr;
++                          vpos.lnum = linenr;
+                           (void)getvpos(&vpos, oap->start_vcol);
+-                          curwin->w_cursor.lnum = lnum;
+                       }
+                       else
+                           vpos.coladd = 0;
+ # endif
+                       oldp = ml_get(linenr);
+@@ -3964,10 +3996,18 @@ ex_display(eap)
+           else
+               yb = &(y_regs[0]);
+       }
+       else
+           yb = &(y_regs[i]);
 +
- #ifdef FEAT_EVAL
-     if (*curbuf->b_p_inde != NUL)
-       look = curbuf->b_p_indk;        /* 'indentexpr' set: use 'indentkeys' */
-     else
- #endif
-@@ -7644,24 +7764,20 @@ ins_reg()
-      * Don't map the register name. This also prevents the mode message to be
-      * deleted when ESC is hit.
-      */
-     ++no_mapping;
-     regname = plain_vgetc();
--#ifdef FEAT_LANGMAP
-     LANGMAP_ADJUST(regname, TRUE);
--#endif
-     if (regname == Ctrl_R || regname == Ctrl_O || regname == Ctrl_P)
-     {
-       /* Get a third key for literal register insertion */
-       literally = regname;
- #ifdef FEAT_CMDL_INFO
-       add_to_showcmd_c(literally);
- #endif
-       regname = plain_vgetc();
--#ifdef FEAT_LANGMAP
-       LANGMAP_ADJUST(regname, TRUE);
++#ifdef FEAT_EVAL
++      if (name == MB_TOLOWER(redir_reg)
++              || (redir_reg == '"' && yb == y_previous))
++          continue;       /* do not list register being written to, the
++                           * pointer can be freed */
++#endif
++
+       if (yb->y_array != NULL)
+       {
+           msg_putchar('\n');
+           msg_putchar('"');
+           msg_putchar(name);
+@@ -4446,33 +4486,18 @@ fex_format(lnum, count, c)
+     int               c;      /* character to be inserted */
+ {
+     int               use_sandbox = was_set_insecurely((char_u *)"formatexpr",
+                                                                  OPT_LOCAL);
+     int               r;
+-#ifdef FEAT_MBYTE
+-    char_u    buf[MB_MAXBYTES];
+-#else
+-    char_u    buf[2];
 -#endif
-     }
-     --no_mapping;
  
- #ifdef FEAT_EVAL
      /*
-@@ -8148,11 +8264,11 @@ ins_ctrl_o()
- }
+      * Set v:lnum to the first line number and v:count to the number of lines.
+      * Set v:char to the character to be inserted (can be NUL).
+      */
+     set_vim_var_nr(VV_LNUM, lnum);
+     set_vim_var_nr(VV_COUNT, count);
+-
+-#ifdef FEAT_MBYTE
+-    if (has_mbyte)
+-      buf[(*mb_char2bytes)(c, buf)] = NUL;
+-    else
+-#endif
+-    {
+-      buf[0] = c;
+-      buf[1] = NUL;
+-    }
+-    set_vim_var_string(VV_CHAR, buf, -1);
++    set_vim_var_char(c);
  
- /*
-  * If the cursor is on an indent, ^T/^D insert/delete one
-  * shiftwidth.        Otherwise ^T/^D behave like a "<<" or ">>".
-- * Always round the indent to 'shiftwith', this is compatible
-+ * Always round the indent to 'shiftwidth', this is compatible
-  * with vi.  But vi only supports ^T and ^D after an
-  * autoindent, we support it everywhere.
+     /*
+      * Evaluate the function.
+      */
+     if (use_sandbox)
+@@ -4846,11 +4871,12 @@ paragraph_start(lnum)
+  *
+  * for delete:
+  * - textlen includes the first/last char to be (partly) deleted
+  * - start/endspaces is the number of columns that are taken by the
+  *   first/last deleted char minus the number of columns that have to be
+- *   deleted.  for yank and tilde:
++ *   deleted.
++ * for yank and tilde:
+  * - textlen includes the first/last char to be wholly yanked
+  * - start/endspaces is the number of columns of the first/last yanked char
+  *   that are to be yanked.
   */
      static void
- ins_shift(c, lastc)
-@@ -8237,11 +8353,11 @@ ins_bs_one(vcolp)
-     {
-       /* Don't delete characters before the insert point when in
-        * Replace mode */
-       if (curwin->w_cursor.lnum != Insstart.lnum
-               || curwin->w_cursor.col >= Insstart.col)
--          replace_do_bs();
-+          replace_do_bs(-1);
-     }
-     else
-       (void)del_char(FALSE);
- }
-@@ -8256,10 +8372,11 @@ ins_bs(c, mode, inserted_space_p)
-     int               *inserted_space_p;
- {
-     linenr_T  lnum;
-     int               cc;
-     int               temp = 0;           /* init for GCC */
-+    colnr_T   save_col;
-     colnr_T   mincol;
-     int               did_backspace = FALSE;
-     int               in_indent;
-     int               oldState;
- #ifdef FEAT_MBYTE
-@@ -8413,17 +8530,17 @@ ins_bs(c, mode, inserted_space_p)
-               /*
-                * restore characters (blanks) deleted after cursor
-                */
-               while (cc > 0)
-               {
--                  temp = curwin->w_cursor.col;
-+                  save_col = curwin->w_cursor.col;
- #ifdef FEAT_MBYTE
-                   mb_replace_pop_ins(cc);
- #else
-                   ins_char(cc);
- #endif
--                  curwin->w_cursor.col = temp;
-+                  curwin->w_cursor.col = save_col;
-                   cc = replace_pop();
-               }
-               /* restore the characters that NL replaced */
-               replace_pop_ins();
-               State = oldState;
-@@ -8443,23 +8560,23 @@ ins_bs(c, mode, inserted_space_p)
-       mincol = 0;
-                                               /* keep indent */
-       if (mode == BACKSPACE_LINE
-               && (curbuf->b_p_ai
- #ifdef FEAT_CINDENT
--                    || cindent_on()
-+                  || cindent_on()
- #endif
-                  )
- #ifdef FEAT_RIGHTLEFT
-               && !revins_on
- #endif
-                           )
-       {
--          temp = curwin->w_cursor.col;
-+          save_col = curwin->w_cursor.col;
-           beginline(BL_WHITE);
--          if (curwin->w_cursor.col < (colnr_T)temp)
-+          if (curwin->w_cursor.col < save_col)
-               mincol = curwin->w_cursor.col;
--          curwin->w_cursor.col = temp;
-+          curwin->w_cursor.col = save_col;
-       }
+@@ -5310,34 +5336,45 @@ read_viminfo_register(virp, force)
+     char_u    *str;
+     char_u    **array = NULL;
  
-       /*
-        * Handle deleting one 'shiftwidth' or 'softtabstop'.
-        */
-@@ -8554,11 +8671,11 @@ ins_bs(c, mode, inserted_space_p)
-                   dec_cursor();
- #endif
-               break;
-           }
-           if (State & REPLACE_FLAG)
--              replace_do_bs();
-+              replace_do_bs(-1);
-           else
-           {
- #ifdef FEAT_MBYTE
-               if (enc_utf8 && p_deco)
-                   (void)utfc_ptr2char(ml_get_cursor(), cpc);
-@@ -8929,11 +9046,14 @@ ins_right()
- #ifdef FEAT_FOLDING
-     if ((fdo_flags & FDO_HOR) && KeyTyped)
-       foldOpenCursor();
- #endif
-     undisplay_dollar();
--    if (gchar_cursor() != NUL || virtual_active()
-+    if (gchar_cursor() != NUL
-+#ifdef FEAT_VIRTUALEDIT
-+          || virtual_active()
-+#endif
-           )
+     /* We only get here (hopefully) if line[0] == '"' */
+     str = virp->vir_line + 1;
++
++    /* If the line starts with "" this is the y_previous register. */
+     if (*str == '"')
      {
-       start_arrow(&curwin->w_cursor);
-       curwin->w_set_curswant = TRUE;
- #ifdef FEAT_VIRTUALEDIT
---- vim72.orig/src/term.c
-+++ vim72/src/term.c
-@@ -2879,11 +2879,11 @@ ttest(pairs)
-           T_CAF = empty_option;
-       }
-       /* if 'Sb' and 'AB' are not defined, reset "Co" */
-       if (*T_CSB == NUL && *T_CAB == NUL)
--          T_CCO = empty_option;
-+          free_one_termoption(T_CCO);
-       /* Set 'weirdinvert' according to value of 't_xs' */
-       p_wiv = (*T_XS != NUL);
+       set_prev = TRUE;
+       str++;
      }
-     need_gather = TRUE;
-@@ -2904,11 +2904,11 @@ add_long_to_buf(val, dst)
-     char_u  *dst;
- {
-     int           i;
-     int           shift;
--    for (i = 1; i <= sizeof(long_u); i++)
-+    for (i = 1; i <= (int)sizeof(long_u); i++)
++
+     if (!ASCII_ISALNUM(*str) && *str != '-')
      {
-       shift = 8 * (sizeof(long_u) - i);
-       dst[i - 1] = (char_u) ((val >> shift) & 0xff);
+       if (viminfo_error("E577: ", _("Illegal register name"), virp->vir_line))
+           return TRUE;        /* too many errors, pretend end-of-file */
+       do_it = FALSE;
      }
- }
-@@ -2935,11 +2935,11 @@ get_long_from_buf(buf, val)
-     *val = 0;
-     len = get_bytes_from_buf(buf, bytes, (int)sizeof(long_u));
-     if (len != -1)
+     get_yank_register(*str++, FALSE);
+     if (!force && y_current->y_array != NULL)
+       do_it = FALSE;
++
++    if (*str == '@')
++    {
++      /* "x@: register x used for @@ */
++      if (force || execreg_lastc == NUL)
++          execreg_lastc = str[-1];
++    }
++
+     size = 0;
+     limit = 100;      /* Optimized for registers containing <= 100 lines */
+     if (do_it)
      {
--      for (i = 0; i < sizeof(long_u); i++)
-+      for (i = 0; i < (int)sizeof(long_u); i++)
-       {
-           shift = 8 * (sizeof(long_u) - 1 - i);
-           *val += (long_u)bytes[i] << shift;
+       if (set_prev)
+           y_previous = y_current;
+       vim_free(y_current->y_array);
+       array = y_current->y_array =
+                      (char_u **)alloc((unsigned)(limit * sizeof(char_u *)));
+-      str = skipwhite(str);
++      str = skipwhite(skiptowhite(str));
+       if (STRNCMP(str, "CHAR", 4) == 0)
+           y_current->y_type = MCHAR;
+ #ifdef FEAT_VISUAL
+       else if (STRNCMP(str, "BLOCK", 5) == 0)
+           y_current->y_type = MBLOCK;
+@@ -5416,10 +5453,11 @@ write_viminfo_registers(fp)
+     if (max_num_lines == 0)
+       return;
+     max_kbyte = get_viminfo_parameter('s');
+     if (max_kbyte == 0)
+       return;
++
+     for (i = 0; i < NUM_REGISTERS; i++)
+     {
+       if (y_regs[i].y_array == NULL)
+           continue;
+ #ifdef FEAT_CLIPBOARD
+@@ -5470,11 +5508,14 @@ write_viminfo_registers(fp)
+               break;
        }
-     }
-@@ -4918,11 +4918,19 @@ check_termcode(max_offset, buf, buflen)
+       if (y_previous == &y_regs[i])
+           fprintf(fp, "\"");
+       c = get_register_name(i);
+-      fprintf(fp, "\"%c\t%s\t%d\n", c, type,
++      fprintf(fp, "\"%c", c);
++      if (c == execreg_lastc)
++          fprintf(fp, "@");
++      fprintf(fp, "\t%s\t%d\n", type,
+ #ifdef FEAT_VISUAL
+                   (int)y_regs[i].y_width
+ #else
+                   0
+ #endif
+@@ -5548,10 +5589,36 @@ x11_export_final_selection()
  
-       /* Finally, add the special key code to our string */
-       key_name[0] = KEY2TERMCAP0(key);
-       key_name[1] = KEY2TERMCAP1(key);
-       if (key_name[0] == KS_KEY)
--          string[new_slen++] = key_name[1];   /* from ":set <M-b>=xx" */
-+      {
-+          /* from ":set <M-b>=xx" */
+     /* Check it's OK */
+     if (dpy != NULL && str != NULL && motion_type >= 0
+                                              && len < 1024*1024 && len > 0)
+     {
 +#ifdef FEAT_MBYTE
-+          if (has_mbyte)
-+              new_slen += (*mb_char2bytes)(key_name[1], string + new_slen);
-+          else
-+#endif
-+              string[new_slen++] = key_name[1];
++      /* The CUT_BUFFER0 is supposed to always contain latin1.  Convert from
++       * 'enc' when it is a multi-byte encoding.  When 'enc' is an 8-bit
++       * encoding conversion usually doesn't work, so keep the text as-is.
++       */
++      if (has_mbyte)
++      {
++          vimconv_T   vc;
++
++          vc.vc_type = CONV_NONE;
++          if (convert_setup(&vc, p_enc, (char_u *)"latin1") == OK)
++          {
++              int     intlen = len;
++              char_u  *conv_str;
++
++              conv_str = string_convert(&vc, str, &intlen);
++              len = intlen;
++              if (conv_str != NULL)
++              {
++                  vim_free(str);
++                  str = conv_str;
++              }
++              convert_setup(&vc, NULL, NULL);
++          }
 +      }
-       else
-       {
-           string[new_slen++] = K_SPECIAL;
-           string[new_slen++] = key_name[0];
-           string[new_slen++] = key_name[1];
-@@ -5545,11 +5553,11 @@ check_for_codes_from_term()
-  * Translate an internal mapping/abbreviation representation into the
-  * corresponding external one recognized by :map/:abbrev commands;
-  * respects the current B/k/< settings of 'cpoption'.
-  *
-  * This function is called when expanding mappings/abbreviations on the
-- * command-line, and for building the "Ambiguous mapping..." error messæge.
-+ * command-line, and for building the "Ambiguous mapping..." error message.
-  *
-  * It uses a growarray to build the translation string since the
-  * latter can be wider than the original description. The caller has to
-  * free the string afterwards.
-  *
---- vim72.orig/src/if_ole.cpp
-+++ vim72/src/if_ole.cpp
-@@ -351,13 +351,17 @@ CVim::SendKeys(BSTR keys)
-       vim_free(str);
-       return E_INVALIDARG;
++#endif
+       XStoreBuffer(dpy, (char *)str, (int)len, 0);
+       XFlush(dpy);
      }
  
-     /* Pass the string to the main input loop. The memory will be freed when
--     * the message is processed.
-+     * the message is processed.  Except for an empty message, we don't need
-+     * to post it then.
-      */
--    PostMessage(NULL, WM_OLE, 0, (LPARAM)str);
-+    if (*str == NUL)
-+      vim_free(str);
-+    else
-+      PostMessage(NULL, WM_OLE, 0, (LPARAM)str);
-     return S_OK;
- }
- STDMETHODIMP
---- vim72.orig/src/Make_mvc.mak
-+++ vim72/src/Make_mvc.mak
-@@ -1,20 +1,20 @@
- # Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me)
- # and Win64, using the Microsoft Visual C++ compilers. Known to work with
- # VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005),
--# and VC9 (VS2008).
-+# VC9 (VS2008), and VC10 (VS2010).
- #
- # To build using other Windows compilers, see INSTALLpc.txt
- #
- # This makefile can build the console, GUI, OLE-enable, Perl-enabled and
--# Python-enabled versions of vim for Win32 platforms.
-+# Python-enabled versions of Vim for Win32 platforms.
- #
--# The basic command line to build vim is:
-+# The basic command line to build Vim is:
- #
- #     nmake -f Make_mvc.mak
- #
--# This will build the console version of vim with no additional interfaces.
-+# This will build the console version of Vim with no additional interfaces.
- # To add features, define any of the following:
- #
- #     !!!!  After changing features do "nmake clean" first  !!!!
- #
- #       Feature Set: FEATURES=[TINY, SMALL, NORMAL, BIG, HUGE] (default is BIG)
-@@ -32,10 +32,11 @@
- #
- #     MzScheme interface:
- #       MZSCHEME=[Path to MzScheme directory]
- #       DYNAMIC_MZSCHEME=yes (to load the MzScheme DLLs dynamically)
- #       MZSCHEME_VER=[version, 205_000, ...]
-+#       MZSCHEME_DEBUG=no
- #
- #     Perl interface:
- #       PERL=[Path to Perl directory]
- #       DYNAMIC_PERL=yes (to load the Perl DLL dynamically)
- #       PERL_VER=[Perl version, in the form 55 (5.005), 56 (5.6.x), etc]
-@@ -352,10 +353,19 @@ MSVCVER = 8.0
- MSVCVER = 9.0
- !endif
- !if "$(_NMAKE_VER)" == "9.00.21022.08"
- MSVCVER = 9.0
- !endif
-+!if "$(_NMAKE_VER)" == "9.00.30729.01"
-+MSVCVER = 9.0
-+!endif
-+!if "$(_NMAKE_VER)" == "10.00.20506.01"
-+MSVCVER = 10.0
-+!endif
-+!if "$(_NMAKE_VER)" == "10.00.30128.01"
-+MSVCVER = 10.0
-+!endif
- !endif
- # Abort bulding VIM if version of VC is unrecognised.
- !ifndef MSVCVER
- !message *** ERROR
-@@ -366,11 +376,11 @@ MSVCVER = 9.0
- !message to handle the new value for _NMAKE_VER, "$(_NMAKE_VER)".
- !error Make aborted.
- !endif
- # Convert processor ID to MVC-compatible number
--!if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0")
-+!if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0") && ("$(MSVCVER)" != "10.0")
- !if "$(CPUNR)" == "i386"
- CPUARG = /G3
- !elseif "$(CPUNR)" == "i486"
- CPUARG = /G4
- !elseif "$(CPUNR)" == "i586"
-@@ -399,11 +409,11 @@ OPTFLAG = /O1
- !elseif "$(OPTIMIZE)" == "SPEED"
- OPTFLAG = /O2
- !else # MAXSPEED
- OPTFLAG = /Ox
- !endif
--!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0")
-+!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") || ("$(MSVCVER)" == "10.0")
- # Use link time code generation if not worried about size
- !if "$(OPTIMIZE)" != "SPACE"
- OPTFLAG = $(OPTFLAG) /GL
- !endif
- !endif
-@@ -616,19 +626,41 @@ PYTHON_LIB = $(PYTHON)\libs\python$(PYTH
- !message MzScheme requested - root dir is "$(MZSCHEME)"
- !ifndef MZSCHEME_VER
- MZSCHEME_VER = 205_000
- !endif
- CFLAGS = $(CFLAGS) -DFEAT_MZSCHEME -I $(MZSCHEME)\include
-+!if EXIST("$(MZSCHEME)\collects\scheme\base.ss")
-+# for MzScheme 4.x we need to include byte code for basic Scheme stuff
-+MZSCHEME_EXTRA_DEP = mzscheme_base.c
-+CFLAGS = $(CFLAGS) -DINCLUDE_MZSCHEME_BASE
-+!endif
-+!if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib") \
-+      && !EXIST("$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib")
-+!message Building with Precise GC
-+MZSCHEME_PRECISE_GC = yes
-+CFLAGS = $(CFLAGS) -DMZ_PRECISE_GC
-+!endif
- !if "$(DYNAMIC_MZSCHEME)" == "yes"
-+!if "$(MZSCHEME_PRECISE_GC)" == "yes"
-+!error MzScheme with Precise GC cannot be loaded dynamically
-+!endif
- !message MzScheme DLLs will be loaded dynamically
- CFLAGS = $(CFLAGS) -DDYNAMIC_MZSCHEME \
-               -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" \
-               -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
- !else
-+!if "$(MZSCHEME_DEBUG)" == "yes"
-+CFLAGS = $(CFLAGS) -DMZSCHEME_FORCE_GC
-+!endif
-+!if "$(MZSCHEME_PRECISE_GC)" == "yes"
-+# Precise GC does not use separate dll
-+MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
-+!else
- MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib \
-               $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
- !endif
-+!endif
- MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj
- !endif
- # Perl interface
- !ifdef PERL
-@@ -765,11 +797,11 @@ LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(LIBC
-               $(MZSCHEME_LIB) $(PERL_LIB) $(PYTHON_LIB) $(RUBY_LIB) \
-               $(TCL_LIB) $(NETBEANS_LIB) $(XPM_LIB) $(LINK_PDB)
- # Report link time code generation progress if used. 
- !ifdef NODEBUG
--!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0")
-+!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") || ("$(MSVCVER)" == "10.0")
- !if "$(OPTIMIZE)" != "SPACE"
- LINKARGS1 = $(LINKARGS1) /LTCG:STATUS
- !endif
- !endif
- !endif
-@@ -834,10 +866,11 @@ clean:
-       - if exist if_perl.c del if_perl.c
-       - if exist dimm.h del dimm.h
-       - if exist dimm_i.c del dimm_i.c
-       - if exist dimm.tlb del dimm.tlb
-       - if exist dosinst.exe del dosinst.exe
-+      - if exist mzscheme_base.c del mzscheme_base.c
-       cd xxd
-       $(MAKE) /NOLOGO -f Make_mvc.mak clean
-       cd ..
-       cd GvimExt
-       $(MAKE) /NOLOGO -f Makefile clean
-@@ -925,13 +958,15 @@ $(OUTDIR)/if_perl.obj: $(OUTDIR) if_perl
-       $(CC) $(CFLAGS) $(PERL_INC) if_perl.c
- $(OUTDIR)/if_perlsfio.obj: $(OUTDIR) if_perlsfio.c  $(INCL)
-       $(CC) $(CFLAGS) $(PERL_INC) if_perlsfio.c
--$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c  $(INCL)
-+$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c  $(INCL) $(MZSCHEME_EXTRA_DEP)
-       $(CC) $(CFLAGS) if_mzsch.c \
-               -DMZSCHEME_COLLECTS=\"$(MZSCHEME:\=\\)\\collects\"
-+mzscheme_base.c:
-+      $(MZSCHEME)\mzc --c-mods mzscheme_base.c ++lib scheme/base
- $(OUTDIR)/if_python.obj: $(OUTDIR) if_python.c  $(INCL)
-       $(CC) $(CFLAGS) $(PYTHON_INC) if_python.c
+     vim_free(str);
+@@ -6039,11 +6106,11 @@ str_to_reg(y_ptr, type, str, len, blockl
+     char_u    **pp;
+ #ifdef FEAT_VISUAL
+     long      maxlen;
+ #endif
  
- $(OUTDIR)/if_ole.obj: $(OUTDIR) if_ole.cpp  $(INCL) if_ole.h
-@@ -1007,11 +1042,11 @@ $(OUTDIR)/undo.obj:    $(OUTDIR) undo.c  $(
- $(OUTDIR)/window.obj: $(OUTDIR) window.c  $(INCL)
+-    if (y_ptr->y_array == NULL)               /* NULL means emtpy register */
++    if (y_ptr->y_array == NULL)               /* NULL means empty register */
+       y_ptr->y_size = 0;
  
- $(OUTDIR)/xpm_w32.obj: $(OUTDIR) xpm_w32.c
-       $(CC) $(CFLAGS) $(XPM_INC) xpm_w32.c
+     /*
+      * Count the number of lines within the string
+      */
+@@ -6256,15 +6323,24 @@ cursor_pos_info()
+           if (*p_sel == 'e' && max_pos.col > 0)
+               --max_pos.col;
  
--$(OUTDIR)/vim.res:    $(OUTDIR) vim.rc version.h tools.bmp tearoff.bmp \
-+$(OUTDIR)/vim.res:    $(OUTDIR) vim.rc gvim.exe.mnf version.h tools.bmp tearoff.bmp \
-               vim.ico vim_error.ico vim_alert.ico vim_info.ico vim_quest.ico
-       $(RC) /l 0x409 /Fo$(OUTDIR)/vim.res $(RCFLAGS) vim.rc
+           if (VIsual_mode == Ctrl_V)
+           {
++#ifdef FEAT_LINEBREAK
++              char_u * saved_sbr = p_sbr;
++
++              /* Make 'sbr' empty for a moment to get the correct size. */
++              p_sbr = empty_option;
++#endif
+               oparg.is_VIsual = 1;
+               oparg.block_mode = TRUE;
+               oparg.op_type = OP_NOP;
+               getvcols(curwin, &min_pos, &max_pos,
+                                         &oparg.start_vcol, &oparg.end_vcol);
++#ifdef FEAT_LINEBREAK
++              p_sbr = saved_sbr;
++#endif
+               if (curwin->w_curswant == MAXCOL)
+                   oparg.end_vcol = MAXCOL;
+               /* Swap the start, end vcol if needed */
+               if (oparg.end_vcol < oparg.start_vcol)
+               {
+@@ -6364,25 +6440,27 @@ cursor_pos_info()
+       {
+           if (VIsual_mode == Ctrl_V && curwin->w_curswant < MAXCOL)
+           {
+               getvcols(curwin, &min_pos, &max_pos, &min_pos.col,
+                                                               &max_pos.col);
+-              sprintf((char *)buf1, _("%ld Cols; "),
++              vim_snprintf((char *)buf1, sizeof(buf1), _("%ld Cols; "),
+                       (long)(oparg.end_vcol - oparg.start_vcol + 1));
+           }
+           else
+               buf1[0] = NUL;
  
- iid_ole.c if_ole.h vim.tlb: if_ole.idl
-       midl /nologo /error none /proxy nul /iid iid_ole.c /tlb vim.tlb \
---- vim72.orig/src/macros.h
-+++ vim72/src/macros.h
-@@ -125,19 +125,35 @@
- #define CHARSIZE(c)   (chartab[c] & CT_CELL_MASK)
+           if (char_count_cursor == byte_count_cursor
+                                                 && char_count == byte_count)
+-              sprintf((char *)IObuff, _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"),
++              vim_snprintf((char *)IObuff, IOSIZE,
++                      _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"),
+                       buf1, line_count_selected,
+                       (long)curbuf->b_ml.ml_line_count,
+                       word_count_cursor, word_count,
+                       byte_count_cursor, byte_count);
+           else
+-              sprintf((char *)IObuff, _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Chars; %ld of %ld Bytes"),
++              vim_snprintf((char *)IObuff, IOSIZE,
++                      _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Chars; %ld of %ld Bytes"),
+                       buf1, line_count_selected,
+                       (long)curbuf->b_ml.ml_line_count,
+                       word_count_cursor, word_count,
+                       char_count_cursor, char_count,
+                       byte_count_cursor, byte_count);
+@@ -6390,24 +6468,26 @@ cursor_pos_info()
+       else
+ #endif
+       {
+           p = ml_get_curline();
+           validate_virtcol();
+-          col_print(buf1, (int)curwin->w_cursor.col + 1,
++          col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1,
+                   (int)curwin->w_virtcol + 1);
+-          col_print(buf2, (int)STRLEN(p), linetabsize(p));
++          col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p));
  
- #ifdef FEAT_LANGMAP
- /*
-  * Adjust chars in a language according to 'langmap' option.
-- * NOTE that there is NO overhead if 'langmap' is not set; but even
-- * when set we only have to do 2 ifs and an array lookup.
-+ * NOTE that there is no noticeable overhead if 'langmap' is not set.
-+ * When set the overhead for characters < 256 is small.
-  * Don't apply 'langmap' if the character comes from the Stuff buffer.
-  * The do-while is just to ignore a ';' after the macro.
-  */
--# define LANGMAP_ADJUST(c, condition) do { \
--      if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \
--          c = langmap_mapchar[c]; \
-+# ifdef FEAT_MBYTE
-+#  define LANGMAP_ADJUST(c, condition) \
-+    do { \
-+        if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0) \
-+      { \
-+          if ((c) < 256) \
-+              c = langmap_mapchar[c]; \
-+          else \
-+              c = langmap_adjust_mb(c); \
-+      } \
-     } while (0)
-+# else
-+#  define LANGMAP_ADJUST(c, condition) \
-+    do { \
-+        if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \
-+            c = langmap_mapchar[c]; \
-+    } while (0)
-+# endif
+           if (char_count_cursor == byte_count_cursor
+                   && char_count == byte_count)
+-              sprintf((char *)IObuff, _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld"),
++              vim_snprintf((char *)IObuff, IOSIZE,
++                  _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld"),
+                   (char *)buf1, (char *)buf2,
+                   (long)curwin->w_cursor.lnum,
+                   (long)curbuf->b_ml.ml_line_count,
+                   word_count_cursor, word_count,
+                   byte_count_cursor, byte_count);
+           else
+-              sprintf((char *)IObuff, _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld of %ld; Byte %ld of %ld"),
++              vim_snprintf((char *)IObuff, IOSIZE,
++                  _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld of %ld; Byte %ld of %ld"),
+                   (char *)buf1, (char *)buf2,
+                   (long)curwin->w_cursor.lnum,
+                   (long)curbuf->b_ml.ml_line_count,
+                   word_count_cursor, word_count,
+                   char_count_cursor, char_count,
+--- vim72.orig/src/option.c
++++ vim72/src/option.c
+@@ -385,10 +385,13 @@ struct vimoption
+     idopt_T   indir;          /* global option: PV_NONE;
+                                * local option: indirect option index */
+     char_u    *def_val[2];    /* default values for variable (vi and vim) */
+ #ifdef FEAT_EVAL
+     scid_T    scriptID;       /* script in which the option was last set */
++# define SCRIPTID_INIT , 0
 +#else
-+# define LANGMAP_ADJUST(c, condition) /* nop */
++# define SCRIPTID_INIT
  #endif
+ };
  
- /*
-  * vim_isbreak() is used very often if 'linebreak' is set, use a macro to make
-  * it work fast.
-@@ -225,11 +241,11 @@
- # define ZDECODE(c)   update_keys(c ^= decrypt_byte())
+ #define VI_DEFAULT  0     /* def_val[VI_DEFAULT] is Vi default value */
+ #define VIM_DEFAULT 1     /* def_val[VIM_DEFAULT] is Vim default value */
+@@ -398,12 +401,13 @@ struct vimoption
+  */
+ #define P_BOOL                0x01    /* the option is boolean */
+ #define P_NUM         0x02    /* the option is numeric */
+ #define P_STRING      0x04    /* the option is a string */
+ #define P_ALLOCED     0x08    /* the string option is in allocated memory,
+-                                  must use vim_free() when assigning new
+-                                  value. Not set if default is the same. */
++                                 must use free_string_option() when
++                                 assigning new value. Not set if default is
++                                 the same. */
+ #define P_EXPAND      0x10    /* environment expansion.  NOTE: P_EXPAND can
+                                  never be used for local or hidden options! */
+ #define P_NODEFAULT   0x40    /* don't set to default value */
+ #define P_DEF_ALLOCED 0x80    /* default value is in allocated memory, must
+                                   use vim_free() when assigning new value */
+@@ -475,263 +479,263 @@ static struct vimoption
+ #if (defined(MSDOS) || defined(WIN3264) || defined(OS2)) && !defined(FEAT_GUI_W32)
+                           (char_u *)128L,
+ #else
+                           (char_u *)224L,
  #endif
- #ifdef STARTUPTIME
--# define TIME_MSG(s) time_msg(s, NULL)
-+# define TIME_MSG(s) { if (time_fd != NULL) time_msg(s, NULL); }
+-                                          (char_u *)0L}},
++                                          (char_u *)0L} SCRIPTID_INIT},
+     {"antialias",   "anti", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
+ #if defined(FEAT_GUI) && defined(MACOS_X)
+                           (char_u *)&p_antialias, PV_NONE,
+                           {(char_u *)FALSE, (char_u *)FALSE}
  #else
- # define TIME_MSG(s)
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)FALSE, (char_u *)FALSE}
  #endif
- #ifdef FEAT_VREPLACE
-@@ -266,11 +282,11 @@
- # define mb_ptr_back(s, p)  p -= has_mbyte ? ((*mb_head_off)(s, p - 1) + 1) : 1
- /* get length of multi-byte char, not including composing chars */
- # define mb_cptr2len(p)           (enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p))
- # define MB_COPY_CHAR(f, t) if (has_mbyte) mb_copy_char(&f, &t); else *t++ = *f++
--# define MB_CHARLEN(p)            (has_mbyte ? mb_charlen(p) : STRLEN(p))
-+# define MB_CHARLEN(p)            (has_mbyte ? mb_charlen(p) : (int)STRLEN(p))
- # define PTR2CHAR(p)      (has_mbyte ? mb_ptr2char(p) : (int)*(p))
+-                          },
++                          SCRIPTID_INIT},
+     {"arabic",            "arab", P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_ARABIC
+                           (char_u *)VAR_WIN, PV_ARAB,
  #else
- # define mb_ptr_adv(p)                ++p
- # define mb_cptr_adv(p)               ++p
- # define mb_ptr_back(s, p)    --p
---- vim72.orig/src/proto/option.pro
-+++ vim72/src/proto/option.pro
-@@ -27,10 +27,11 @@ char_u *get_highlight_default __ARGS((vo
- char_u *get_encoding_default __ARGS((void));
- int makeset __ARGS((FILE *fd, int opt_flags, int local_only));
- int makefoldset __ARGS((FILE *fd));
- void clear_termoptions __ARGS((void));
- void free_termoptions __ARGS((void));
-+void free_one_termoption __ARGS((char_u *var));
- void set_term_defaults __ARGS((void));
- void comp_col __ARGS((void));
- char_u *get_equalprg __ARGS((void));
- void win_copy_options __ARGS((win_T *wp_from, win_T *wp_to));
- void copy_winopt __ARGS((winopt_T *from, winopt_T *to));
-@@ -42,10 +43,11 @@ void reset_modifiable __ARGS((void));
- void set_iminsert_global __ARGS((void));
- void set_imsearch_global __ARGS((void));
- void set_context_in_set_cmd __ARGS((expand_T *xp, char_u *arg, int opt_flags));
- int ExpandSettings __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file));
- int ExpandOldSetting __ARGS((int *num_file, char_u ***file));
-+int langmap_adjust_mb __ARGS((int c));
- int has_format_option __ARGS((int x));
- int shortmess __ARGS((int x));
- void vimrc_found __ARGS((char_u *fname, char_u *envname));
- void change_compatible __ARGS((int on));
- int option_was_set __ARGS((char_u *name));
---- vim72.orig/src/regexp.c
-+++ vim72/src/regexp.c
-@@ -469,11 +469,11 @@ get_char_class(pp)
- #define CLASS_NONE 99
-     int i;
-     if ((*pp)[1] == ':')
-     {
--      for (i = 0; i < sizeof(class_names) / sizeof(*class_names); ++i)
-+      for (i = 0; i < (int)(sizeof(class_names) / sizeof(*class_names)); ++i)
-           if (STRNCMP(*pp + 2, class_names[i], STRLEN(class_names[i])) == 0)
-           {
-               *pp += STRLEN(class_names[i]) + 2;
-               return i;
-           }
-@@ -581,10 +581,11 @@ static int       regnpar;        /* () count. */
- static int    regnzpar;       /* \z() count. */
- static int    re_has_z;       /* \z item detected */
+                           (char_u *)NULL, PV_NONE,
  #endif
- static char_u *regcode;       /* Code-emit pointer, or JUST_CALC_SIZE */
- static long   regsize;        /* Code size. */
-+static int    reg_toolong;    /* TRUE when offset out of range */
- static char_u had_endbrace[NSUBEXP];  /* flags, TRUE if end of () found */
- static unsigned       regflags;       /* RF_ flags for prog */
- static long   brace_min[10];  /* Minimums for complex brace repeats */
- static long   brace_max[10];  /* Maximums for complex brace repeats */
- static int    brace_count[10]; /* Current counts for complex brace repeats */
-@@ -1026,13 +1027,15 @@ vim_regcomp(expr, re_flags)
-      * Second pass: emit code.
-      */
-     regcomp_start(expr, re_flags);
-     regcode = r->program;
-     regc(REGMAGIC);
--    if (reg(REG_NOPAREN, &flags) == NULL)
-+    if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong)
-     {
-       vim_free(r);
-+      if (reg_toolong)
-+          EMSG_RET_NULL(_("E339: Pattern too long"));
-       return NULL;
-     }
-     /* Dig out information for optimizations. */
-     r->regstart = NUL;                /* Worst-case defaults. */
-@@ -1139,10 +1142,11 @@ regcomp_start(expr, re_flags)
- #ifdef FEAT_SYN_HL
-     regnzpar = 1;
-     re_has_z = 0;
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"arabicshape", "arshape", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
+ #ifdef FEAT_ARABIC
+                           (char_u *)&p_arshape, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-     regsize = 0L;
-+    reg_toolong = FALSE;
-     regflags = 0;
- #if defined(FEAT_SYN_HL) || defined(PROTO)
-     had_eol = FALSE;
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"allowrevins", "ari",  P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_RIGHTLEFT
+                           (char_u *)&p_ari, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
- }
-@@ -1226,11 +1230,11 @@ reg(paren, flagp)
-     *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
-     while (peekchr() == Magic('|'))
-     {
-       skipchr();
-       br = regbranch(&flags);
--      if (br == NULL)
-+      if (br == NULL || reg_toolong)
-           return NULL;
-       regtail(ret, br);       /* BRANCH -> BRANCH. */
-       if (!(flags & HASWIDTH))
-           *flagp &= ~HASWIDTH;
-       *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
-@@ -1311,10 +1315,12 @@ regbranch(flagp)
-           regtail(chain, latest);
-       if (peekchr() != Magic('&'))
-           break;
-       skipchr();
-       regtail(latest, regnode(END)); /* operand ends */
-+      if (reg_toolong)
-+          break;
-       reginsert(MATCH, latest);
-       chain = latest;
-     }
-     return ret;
-@@ -1380,11 +1386,11 @@ regconcat(flagp)
-                           skipchr_keepstart();
-                           curchr = -1;
-                           break;
-           default:
-                           latest = regpiece(&flags);
--                          if (latest == NULL)
-+                          if (latest == NULL || reg_toolong)
-                               return NULL;
-                           *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH);
-                           if (chain == NULL)  /* First piece. */
-                               *flagp |= flags & SPSTART;
-                           else
-@@ -2538,12 +2544,20 @@ regtail(p, val)
-     if (OP(scan) == BACK)
-       offset = (int)(scan - val);
-     else
-       offset = (int)(val - scan);
--    *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
--    *(scan + 2) = (char_u) (offset & 0377);
-+    /* When the offset uses more than 16 bits it can no longer fit in the two
-+     * bytes avaliable.  Use a global flag to avoid having to check return
-+     * values in too many places. */
-+    if (offset > 0xffff)
-+      reg_toolong = TRUE;
-+    else
-+    {
-+      *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
-+      *(scan + 2) = (char_u) (offset & 0377);
-+    }
- }
- /*
-  * regoptail - regtail on item after a BRANCH; nop if none
-  */
-@@ -3360,16 +3374,15 @@ vim_regexec_multi(rmp, win, buf, lnum, c
- /*
-  * Match a regexp against a string ("line" points to the string) or multiple
-  * lines ("line" is NULL, use reg_getline()).
-  */
--/*ARGSUSED*/
-     static long
- vim_regexec_both(line, col, tm)
-     char_u    *line;
-     colnr_T   col;            /* column to start looking for match */
--    proftime_T        *tm;            /* timeout limit or NULL */
-+    proftime_T        *tm UNUSED;     /* timeout limit or NULL */
- {
-     regprog_T *prog;
-     char_u    *s;
-     long      retval = 0L;
-@@ -4530,11 +4543,11 @@ regmatch(scan)
-               no = op - BACKREF;
-               cleanup_subexpr();
-               if (!REG_MULTI)         /* Single-line regexp */
-               {
--                  if (reg_endp[no] == NULL)
-+                  if (reg_startp[no] == NULL || reg_endp[no] == NULL)
-                   {
-                       /* Backref was not set: Match an empty string. */
-                       len = 0;
-                   }
-                   else
-@@ -4546,11 +4559,11 @@ regmatch(scan)
-                           status = RA_NOMATCH;
-                   }
-               }
-               else                            /* Multi-line regexp */
-               {
--                  if (reg_endpos[no].lnum < 0)
-+                  if (reg_startpos[no].lnum < 0 || reg_endpos[no].lnum < 0)
-                   {
-                       /* Backref was not set: Match an empty string. */
-                       len = 0;
-                   }
-                   else
-@@ -5763,18 +5776,20 @@ do_class:
-     return (int)count;
- }
- /*
-  * regnext - dig the "next" pointer out of a node
-+ * Returns NULL when calculating size, when there is no next item and when
-+ * there is an error.
-  */
-     static char_u *
- regnext(p)
-     char_u  *p;
- {
-     int           offset;
--    if (p == JUST_CALC_SIZE)
-+    if (p == JUST_CALC_SIZE || reg_toolong)
-       return NULL;
-     offset = NEXT(p);
-     if (offset == 0)
-       return NULL;
-@@ -6811,10 +6826,12 @@ static int can_f_submatch = FALSE;     /* TR
- /* These pointers are used instead of reg_match and reg_mmatch for
-  * reg_submatch().  Needed for when the substitution string is an expression
-  * that contains a call to substitute() and submatch(). */
- static regmatch_T     *submatch_match;
- static regmmatch_T    *submatch_mmatch;
-+static linenr_T               submatch_firstlnum;
-+static linenr_T               submatch_maxline;
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"altkeymap",   "akm",  P_BOOL|P_VI_DEF,
+ #ifdef FEAT_FKMAP
+                           (char_u *)&p_altkeymap, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
- #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO)
- /*
-  * vim_regsub() - perform substitutions after a vim_regexec() or
-@@ -6924,11 +6941,10 @@ vim_regsub_both(source, dest, copy, magi
-               eval_result = NULL;
-           }
-       }
-       else
-       {
--          linenr_T    save_reg_maxline;
-           win_T       *save_reg_win;
-           int         save_ireg_ic;
-           vim_free(eval_result);
-@@ -6936,11 +6952,12 @@ vim_regsub_both(source, dest, copy, magi
-            * recursively.  Make sure submatch() gets the text from the first
-            * level.  Don't need to save "reg_buf", because
-            * vim_regexec_multi() can't be called recursively. */
-           submatch_match = reg_match;
-           submatch_mmatch = reg_mmatch;
--          save_reg_maxline = reg_maxline;
-+          submatch_firstlnum = reg_firstlnum;
-+          submatch_maxline = reg_maxline;
-           save_reg_win = reg_win;
-           save_ireg_ic = ireg_ic;
-           can_f_submatch = TRUE;
-           eval_result = eval_to_string(source + 2, NULL, TRUE);
-@@ -6959,11 +6976,12 @@ vim_regsub_both(source, dest, copy, magi
-               dst += STRLEN(eval_result);
-           }
-           reg_match = submatch_match;
-           reg_mmatch = submatch_mmatch;
--          reg_maxline = save_reg_maxline;
-+          reg_firstlnum = submatch_firstlnum;
-+          reg_maxline = submatch_maxline;
-           reg_win = save_reg_win;
-           ireg_ic = save_ireg_ic;
-           can_f_submatch = FALSE;
-       }
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"ambiwidth",  "ambw",  P_STRING|P_VI_DEF|P_RCLR,
+ #if defined(FEAT_MBYTE)
+                           (char_u *)&p_ambw, PV_NONE,
+                           {(char_u *)"single", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-@@ -7194,10 +7212,35 @@ vim_regsub_both(source, dest, copy, magi
- exit:
-     return (int)((dst - dest) + 1);
- }
- #ifdef FEAT_EVAL
-+static char_u *reg_getline_submatch __ARGS((linenr_T lnum));
-+
-+/*
-+ * Call reg_getline() with the line numbers from the submatch.  If a
-+ * substitute() was used the reg_maxline and other values have been
-+ * overwritten.
-+ */
-+    static char_u *
-+reg_getline_submatch(lnum)
-+    linenr_T  lnum;
-+{
-+    char_u *s;
-+    linenr_T save_first = reg_firstlnum;
-+    linenr_T save_max = reg_maxline;
-+
-+    reg_firstlnum = submatch_firstlnum;
-+    reg_maxline = submatch_maxline;
-+
-+    s = reg_getline(lnum);
-+
-+    reg_firstlnum = save_first;
-+    reg_maxline = save_max;
-+    return s;
-+}
-+
- /*
-  * Used for the submatch() function: get the string from the n'th submatch in
-  * allocated memory.
-  * Returns NULL when not in a ":s" command and for a non-existing submatch.
-  */
-@@ -7224,11 +7267,11 @@ reg_submatch(no)
-       {
-           lnum = submatch_mmatch->startpos[no].lnum;
-           if (lnum < 0 || submatch_mmatch->endpos[no].lnum < 0)
-               return NULL;
--          s = reg_getline(lnum) + submatch_mmatch->startpos[no].col;
-+          s = reg_getline_submatch(lnum) + submatch_mmatch->startpos[no].col;
-           if (s == NULL)  /* anti-crash check, cannot happen? */
-               break;
-           if (submatch_mmatch->endpos[no].lnum == lnum)
-           {
-               /* Within one line: take form start to end col. */
-@@ -7250,20 +7293,20 @@ reg_submatch(no)
-               }
-               ++len;
-               ++lnum;
-               while (lnum < submatch_mmatch->endpos[no].lnum)
-               {
--                  s = reg_getline(lnum++);
-+                  s = reg_getline_submatch(lnum++);
-                   if (round == 2)
-                       STRCPY(retval + len, s);
-                   len += (int)STRLEN(s);
-                   if (round == 2)
-                       retval[len] = '\n';
-                   ++len;
-               }
-               if (round == 2)
--                  STRNCPY(retval + len, reg_getline(lnum),
-+                  STRNCPY(retval + len, reg_getline_submatch(lnum),
-                                            submatch_mmatch->endpos[no].col);
-               len += submatch_mmatch->endpos[no].col;
-               if (round == 2)
-                   retval[len] = NUL;
-               ++len;
-@@ -7277,17 +7320,15 @@ reg_submatch(no)
-           }
-       }
-     }
-     else
-     {
--      if (submatch_match->endp[no] == NULL)
-+      s = submatch_match->startp[no];
-+      if (s == NULL || submatch_match->endp[no] == NULL)
-           retval = NULL;
-       else
--      {
--          s = submatch_match->startp[no];
-           retval = vim_strnsave(s, (int)(submatch_match->endp[no] - s));
--      }
-     }
-     return retval;
- }
+-                          },
++                          SCRIPTID_INIT},
+ #ifdef FEAT_AUTOCHDIR
+     {"autochdir",  "acd",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_acd, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
  #endif
---- vim72.orig/src/nbdebug.c
-+++ vim72/src/nbdebug.c
-@@ -31,11 +31,10 @@
- FILE          *nb_debug = NULL;
- u_int          nb_dlevel = 0;         /* nb_debug verbosity level */
- void           nbdb(char *, ...);
--void           nbtrace(char *, ...);
- static int     lookup(char *);
- #ifdef USE_NB_ERRORHANDLER
- static int     errorHandler(Display *, XErrorEvent *);
+     {"autoindent",  "ai",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_ai, PV_AI,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"autoprint",   "ap",   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"autoread",    "ar",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_ar, PV_AR,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"autowrite",   "aw",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_aw, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"autowriteall","awa",  P_BOOL|P_VI_DEF,
+                           (char_u *)&p_awa, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"background",  "bg",   P_STRING|P_VI_DEF|P_RCLR,
+                           (char_u *)&p_bg, PV_NONE,
+                           {
+ #if (defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI)
+                           (char_u *)"dark",
+ #else
+                           (char_u *)"light",
  #endif
-@@ -98,29 +97,10 @@ nbdebug_log_init(
-       }
- }    /* end nbdebug_log_init */
--
--
--void
--nbtrace(
--      char            *fmt,
--      ...)
--{
--      va_list          ap;
--
--      if (nb_debug!= NULL && (nb_dlevel & (NB_TRACE | NB_TRACE_VERBOSE))) {
--              va_start(ap, fmt);
--              vfprintf(nb_debug, fmt, ap);
--              va_end(ap);
--              fflush(nb_debug);
--      }
--
--}    /* end nbtrace */
--
--
- void
- nbdbg(
-       char            *fmt,
-       ...)
- {
-@@ -134,27 +114,10 @@ nbdbg(
-       }
- }    /* end nbdbg */
--void
--nbprt(
--      char            *fmt,
--      ...)
--{
--      va_list          ap;
--
--      if (nb_debug != NULL && nb_dlevel & NB_PRINT) {
--              va_start(ap, fmt);
--              vfprintf(nb_debug, fmt, ap);
--              va_end(ap);
--              fflush(nb_debug);
--      }
--
--}    /* end nbprt */
--
--
- static int
- lookup(
-       char            *file)
- {
-       char             buf[BUFSIZ];
---- vim72.orig/src/nbdebug.h
-+++ vim72/src/nbdebug.h
-@@ -41,12 +41,10 @@ typedef enum {
-               WT_STOP                 /* look for ~/.gvimstop if set */
- } WtWait;
- void           nbdbg(char *, ...);
--void           nbprt(char *, ...);
--void           nbtrace(char *, ...);
- void nbdebug_wait __ARGS((u_int wait_flags, char *wait_var, u_int wait_secs));
- void nbdebug_log_init __ARGS((char *log_var, char *level_var));
- extern FILE   *nb_debug;
-@@ -68,21 +66,7 @@ nbdbg(
-       char            *fmt,
-       ...)
- {
- }
--void
--nbprt(
--      char            *fmt,
--      ...)
--{
--}
--
--void
--nbtrace(
--      char            *fmt,
--      ...)
--{
--}
--
- #endif /* NBDEBUG */
- #endif /* NBDEBUG_H */
---- vim72.orig/src/config.h.in
-+++ vim72/src/config.h.in
-@@ -28,16 +28,22 @@
- #undef HAVE_OUTFUNTYPE
- /* Define when __DATE__ " " __TIME__ can be used */
- #undef HAVE_DATE_TIME
-+/* Define when __attribute__((unused)) can be used */
-+#undef HAVE_ATTRIBUTE_UNUSED
-+
- /* defined always when using configure */
- #undef UNIX
- /* Defined to the size of an int */
- #undef SIZEOF_INT
-+/* Define when wchar_t is only 2 bytes. */
-+#undef SMALL_WCHAR_T
-+
- /*
-  * If we cannot trust one of the following from the libraries, we use our
-  * own safe but probably slower vim_memmove().
-  */
- #undef USEBCOPY
-@@ -48,10 +54,13 @@
- #undef USEMAN_S
- /* Define to empty if the keyword does not work.  */
- #undef const
-+/* Define to empty if the keyword does not work.  */
-+#undef volatile
-+
- /* Define to `int' if <sys/types.h> doesn't define.  */
- #undef mode_t
- /* Define to `long' if <sys/types.h> doesn't define.  */
- #undef off_t
-@@ -133,11 +142,10 @@
- #undef HAVE_BCMP
- #undef HAVE_FCHDIR
- #undef HAVE_FCHOWN
- #undef HAVE_FSEEKO
- #undef HAVE_FSYNC
--#undef HAVE_FTELLO
- #undef HAVE_GETCWD
- #undef HAVE_GETPSEUDOTTY
- #undef HAVE_GETPWNAM
- #undef HAVE_GETPWUID
- #undef HAVE_GETRLIMIT
-@@ -146,10 +154,11 @@
- #undef HAVE_ICONV
- #undef HAVE_NL_LANGINFO_CODESET
- #undef HAVE_LSTAT
- #undef HAVE_MEMCMP
- #undef HAVE_MEMSET
-+#undef HAVE_MKDTEMP
- #undef HAVE_NANOSLEEP
- #undef HAVE_OPENDIR
- #undef HAVE_FLOAT_FUNCS
- #undef HAVE_PUTENV
- #undef HAVE_QSORT
-@@ -376,5 +385,8 @@
- /* Define name of who modified a released Vim */
- #undef MODIFIED_BY
- /* Define if you want XSMP interaction as well as vanilla swapfile safety */
- #undef USE_XSMP_INTERACT
-+
-+/* Define if fcntl()'s F_SETFD command knows about FD_CLOEXEC */
-+#undef HAVE_FD_CLOEXEC
---- /dev/null
-+++ vim72/src/testdir/test66.in
-@@ -0,0 +1,25 @@
-+
-+Test for visual block shift and tab characters.
-+
-+STARTTEST
-+:so small.vim
-+/^abcdefgh
-+\164jI    \ej<<11|D
-+7|a           \e
-+7|a              \e
-+7|a           \e4k13|\164j<
-+:$-4,$w! test.out
-+:$-4,$s/\s\+//g
-+\164kI    \ej<<
-+7|a           \e
-+7|a                                   \e
-+7|a                   \e4k13|\164j3<
-+:$-4,$w >> test.out
-+:qa!
-+ENDTEST
-+
-+abcdefghijklmnopqrstuvwxyz
-+abcdefghijklmnopqrstuvwxyz
-+abcdefghijklmnopqrstuvwxyz
-+abcdefghijklmnopqrstuvwxyz
-+abcdefghijklmnopqrstuvwxyz
---- /dev/null
-+++ vim72/src/testdir/test66.ok
-@@ -0,0 +1,10 @@
-+    abcdefghijklmnopqrstuvwxyz
-+abcdefghij
-+    abc           defghijklmnopqrstuvwxyz
-+    abc           defghijklmnopqrstuvwxyz
-+    abc           defghijklmnopqrstuvwxyz
-+    abcdefghijklmnopqrstuvwxyz
-+abcdefghij
-+    abc           defghijklmnopqrstuvwxyz
-+    abc               defghijklmnopqrstuvwxyz
-+    abc           defghijklmnopqrstuvwxyz
---- vim72.orig/src/testdir/Make_amiga.mak
-+++ vim72/src/testdir/Make_amiga.mak
-@@ -23,11 +23,12 @@ SCRIPTS = test1.out test3.out test4.out
-               test33.out test34.out test35.out test36.out test37.out \
-               test38.out test39.out test40.out test41.out test42.out \
-               test43.out test44.out test45.out test46.out test47.out \
-               test48.out test51.out test53.out test54.out test55.out \
-               test56.out test57.out test58.out test59.out test60.out \
--              test61.out test62.out test63.out test64.out test65.out
-+              test61.out test62.out test63.out test64.out test65.out \
-+              test66.out test67.out test68.out test69.out
- .SUFFIXES: .in .out
- nongui:       /tmp $(SCRIPTS)
-       csh -c echo ALL DONE
-@@ -108,5 +109,9 @@ test60.out: test60.in
- test61.out: test61.in
- test62.out: test62.in
- test63.out: test63.in
- test64.out: test64.in
- test65.out: test65.in
-+test66.out: test66.in
-+test67.out: test67.in
-+test68.out: test68.in
-+test69.out: test69.in
---- vim72.orig/src/testdir/Make_dos.mak
-+++ vim72/src/testdir/Make_dos.mak
-@@ -24,13 +24,14 @@ SCRIPTS16 =        test1.out test19.out test20.
- SCRIPTS =     test3.out test4.out test5.out test6.out test7.out \
-               test8.out test9.out test11.out test13.out test14.out \
-               test15.out test17.out test18.out test21.out test26.out \
-               test30.out test31.out test32.out test33.out test34.out \
-               test37.out test38.out test39.out test40.out test41.out \
--              test42.out test52.out test65.out
-+              test42.out test52.out test65.out test66.out test67.out \
-+              test68.out test69.out
--SCRIPTS32 =   test50.out
-+SCRIPTS32 =   test50.out test70.out
- SCRIPTS_GUI = test16.out
- .SUFFIXES: .in .out
-@@ -53,10 +54,11 @@ clean:
-       -del *.out
-       -if exist test.ok del test.ok
-       -if exist small.vim del small.vim
-       -if exist tiny.vim del tiny.vim
-       -if exist mbyte.vim del mbyte.vim
-+      -if exist mzscheme.vim del mzscheme.vim
-       -del X*
-       -if exist viminfo del viminfo
- .in.out:
-       copy $*.ok test.ok
---- vim72.orig/src/testdir/Make_os2.mak
-+++ vim72/src/testdir/Make_os2.mak
-@@ -23,11 +23,12 @@ SCRIPTS = test1.out test3.out test4.out
-               test33.out test34.out test35.out test36.out test37.out \
-               test38.out test39.out test40.out test41.out test42.out \
-               test43.out test44.out test45.out test46.out test47.out \
-               test48.out test51.out test53.out test54.out test55.out \
-               test56.out test57.out test58.out test59.out test60.out \
--              test61.out test62.out test63.out test64.out test65.out
-+              test61.out test62.out test63.out test64.out test65.out \
-+              test66.out test67.out test68.out test69.out
- .SUFFIXES: .in .out
- all:  /tmp $(SCRIPTS)
-       @echo ALL DONE
---- vim72.orig/src/gui_beval.c
-+++ vim72/src/gui_beval.c
-@@ -13,15 +13,14 @@
- #if defined(FEAT_BEVAL) || defined(PROTO)
- /*
-  * Common code, invoked when the mouse is resting for a moment.
-  */
--/*ARGSUSED*/
-     void
- general_beval_cb(beval, state)
-     BalloonEval *beval;
--    int state;
-+    int               state UNUSED;
- {
-     win_T     *wp;
-     int               col;
-     int               use_sandbox;
-     linenr_T  lnum;
-@@ -549,13 +548,12 @@ target_event_cb(GtkWidget *widget, GdkEv
-     }
-     return FALSE; /* continue emission */
- }
--/*ARGSUSED*/
-     static gint
--mainwin_event_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
-+mainwin_event_cb(GtkWidget *widget UNUSED, GdkEvent *event, gpointer data)
- {
-     BalloonEval *beval = (BalloonEval *)data;
-     switch (event->type)
-     {
-@@ -661,24 +659,24 @@ timeout_cb(gpointer data)
-     requestBalloon(beval);
-     return FALSE; /* don't call me again */
- }
--/*ARGSUSED2*/
-     static gint
--balloon_expose_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
-+balloon_expose_event_cb(GtkWidget *widget,
-+                      GdkEventExpose *event,
-+                      gpointer data UNUSED)
- {
-     gtk_paint_flat_box(widget->style, widget->window,
-                      GTK_STATE_NORMAL, GTK_SHADOW_OUT,
-                      &event->area, widget, "tooltip",
-                      0, 0, -1, -1);
-     return FALSE; /* continue emission */
- }
- # ifndef HAVE_GTK2
--/*ARGSUSED2*/
-     static void
- balloon_draw_cb(GtkWidget *widget, GdkRectangle *area, gpointer data)
- {
-     GtkWidget     *child;
-     GdkRectangle    child_area;
-@@ -724,17 +722,16 @@ removeEventHandler(beval)
- /*
-  * The X event handler. All it does is call the real event handler.
-  */
--/*ARGSUSED*/
-     static void
- pointerEventEH(w, client_data, event, unused)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
-     XEvent    *event;
--    Boolean   *unused;
-+    Boolean   *unused UNUSED;
- {
-     BalloonEval *beval = (BalloonEval *)client_data;
-     pointerEvent(beval, event);
- }
-@@ -875,15 +872,14 @@ pointerEvent(beval, event)
-       default:
-           break;
-     }
- }
--/*ARGSUSED*/
-     static void
- timerRoutine(dx, id)
-     XtPointer     dx;
--    XtIntervalId    *id;
-+    XtIntervalId    *id UNUSED;
- {
-     BalloonEval *beval = (BalloonEval *)dx;
-     beval->timerID = (XtIntervalId)NULL;
-@@ -1289,10 +1285,27 @@ drawBalloon(beval)
-       XtVaSetValues(beval->balloonShell,
-               XtNx, tx,
-               XtNy, ty,
-               NULL);
+-                                          (char_u *)0L}},
++                                          (char_u *)0L} SCRIPTID_INIT},
+     {"backspace",   "bs",   P_STRING|P_VI_DEF|P_VIM|P_COMMA|P_NODUP,
+                           (char_u *)&p_bs, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"backup",            "bk",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_bk, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"backupcopy",  "bkc",  P_STRING|P_VIM|P_COMMA|P_NODUP,
+                           (char_u *)&p_bkc, PV_NONE,
+ #ifdef UNIX
+                           {(char_u *)"yes", (char_u *)"auto"}
+ #else
+                           {(char_u *)"auto", (char_u *)"auto"}
  #endif
-+      /* Set tooltip colors */
-+      {
-+          Arg args[2];
-+
-+#ifdef FEAT_GUI_MOTIF
-+          args[0].name = XmNbackground;
-+          args[0].value = gui.tooltip_bg_pixel;
-+          args[1].name = XmNforeground;
-+          args[1].value = gui.tooltip_fg_pixel;
-+#else /* Athena */
-+          args[0].name = XtNbackground;
-+          args[0].value = gui.tooltip_bg_pixel;
-+          args[1].name = XtNforeground;
-+          args[1].value = gui.tooltip_fg_pixel;
-+#endif
-+          XtSetValues(beval->balloonLabel, &args[0], XtNumber(args));
-+      }
-       XtPopup(beval->balloonShell, XtGrabNone);
-       beval->showState = ShS_SHOWING;
---- vim72.orig/src/proto/if_cscope.pro
-+++ vim72/src/proto/if_cscope.pro
-@@ -1,6 +1,8 @@
- /* if_cscope.c */
-+char_u *get_cscope_name __ARGS((expand_T *xp, int idx));
-+void set_context_in_cscope_cmd __ARGS((expand_T *xp, char_u *arg, cmdidx_T cmdidx));
- void do_cscope __ARGS((exarg_T *eap));
- void do_scscope __ARGS((exarg_T *eap));
- void do_cstag __ARGS((exarg_T *eap));
- int cs_fgets __ARGS((char_u *buf, int size));
- void cs_free_tags __ARGS((void));
---- vim72.orig/runtime/doc/if_cscop.txt
-+++ vim72/runtime/doc/if_cscop.txt
-@@ -1,6 +1,6 @@
--*if_cscop.txt*  For Vim version 7.2.  Last change: 2005 Mar 29
-+*if_cscop.txt*  For Vim version 7.2.  Last change: 2009 Mar 18
-                 VIM REFERENCE MANUAL    by Andy Kahn
-                                                       *cscope* *Cscope*
-@@ -129,15 +129,26 @@ The available subcommands are:
-               4 or t: Find this text string
-               6 or e: Find this egrep pattern
-               7 or f: Find this file
-               8 or i: Find files #including this file
-+      For all types, except 4 and 6, leading white space for {name} is
-+      removed.  For 4 and 6 there is exactly one space between {querytype}
-+      and {name}.  Further white space is included in {name}.
-+
-       EXAMPLES >
-           :cscope find c vim_free
--          :cscope find 3 vim_free
-+          :cscope find 3  vim_free
-+<
-+          These two examples perform the same query: functions calling
-+          "vim_free". >
-+
-+          :cscope find t initOnce
-+          :cscope find t  initOnce
- <
--          These two examples perform the same query. >
-+          The first one searches for the text "initOnce", the second one for
-+          " initOnce". >
-           :cscope find 0 DEFAULT_TERM
- <
-           Executing this example on the source code for Vim 5.1 produces the
-           following output:
-@@ -342,17 +353,12 @@ cscope version for Win32 see:
-       http://iamphet.nm.ru/cscope/index.html
- The DJGPP-built version from http://cscope.sourceforge.net is known to not
- work with Vim.
--There are a couple of hard-coded limitations:
--
--    1. The maximum number of cscope connections allowed is 8.  Do you
--    really need more?
--
--    2. Doing a |:tjump| when |:cstag| searches the tag files is not
--    configurable (e.g., you can't do a tselect instead).
-+Hard-coded limitation: doing a |:tjump| when |:cstag| searches the tag files
-+is not configurable (e.g., you can't do a tselect instead).
- ==============================================================================
- 6. Suggested usage                                    *cscope-suggestions*
- Put these entries in your .vimrc (adjust the pathname accordingly to your
-@@ -473,11 +479,12 @@ The cscope interface/support for Vim was
- Andy Kahn <ackahn@netapp.com>.  The original structure (as well as a tiny
- bit of code) was adapted from the cscope interface in nvi.  Please report
- any problems, suggestions, patches, et al., you have for the usage of
- cscope within Vim to him.
-                                                       *cscope-win32*
--For a cscope version for Win32 see: http://iamphet.nm.ru/cscope/index.html
-+For a cscope version for Win32 see:
-+      http://code.google.com/p/cscope-win32/
- Win32 support was added by Sergey Khorev <sergey.khorev@gmail.com>.  Contact
- him if you have Win32-specific issues.
-  vim:tw=78:ts=8:ft=help:norl:
---- vim72.orig/src/VisVim/Commands.cpp
-+++ vim72/src/VisVim/Commands.cpp
-@@ -18,100 +18,103 @@ static char THIS_FILE[] = __FILE__;
- #define CD_NONE                       2       // No cd
- static BOOL g_bEnableVim = TRUE;      // Vim enabled
- static BOOL g_bDevStudioEditor = FALSE;       // Open file in Dev Studio editor simultaneously
-+static BOOL g_bNewTabs = FALSE;
- static int g_ChangeDir = CD_NONE;     // CD after file open?
--static void VimSetEnableState (BOOL bEnableState);
--static BOOL VimOpenFile (BSTR& FileName, long LineNr);
--static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method);
--static void VimErrDiag (COleAutomationControl& VimOle);
--static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName);
--static void DebugMsg (char* Msg, char* Arg = NULL);
-+static void VimSetEnableState(BOOL bEnableState);
-+static BOOL VimOpenFile(BSTR& FileName, long LineNr);
-+static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method);
-+static void VimErrDiag(COleAutomationControl& VimOle);
-+static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName);
-+static void DebugMsg(char* Msg, char* Arg = NULL);
- /////////////////////////////////////////////////////////////////////////////
- // CCommands
--CCommands::CCommands ()
-+CCommands::CCommands()
- {
-       // m_pApplication == NULL; M$ Code generation bug!!!
-       m_pApplication = NULL;
-       m_pApplicationEventsObj = NULL;
-       m_pDebuggerEventsObj = NULL;
- }
--CCommands::~CCommands ()
-+CCommands::~CCommands()
- {
--      ASSERT (m_pApplication != NULL);
-+      ASSERT(m_pApplication != NULL);
-       if (m_pApplication)
-       {
--              m_pApplication->Release ();
-+              m_pApplication->Release();
-               m_pApplication = NULL;
-       }
- }
--void CCommands::SetApplicationObject (IApplication * pApplication)
-+void CCommands::SetApplicationObject(IApplication * pApplication)
- {
-       // This function assumes pApplication has already been AddRef'd
-       // for us, which CDSAddIn did in it's QueryInterface call
-       // just before it called us.
-       m_pApplication = pApplication;
-       if (! m_pApplication)
-               return;
-       // Create Application event handlers
--      XApplicationEventsObj::CreateInstance (&m_pApplicationEventsObj);
-+      XApplicationEventsObj::CreateInstance(&m_pApplicationEventsObj);
-       if (! m_pApplicationEventsObj)
-       {
--              ReportInternalError ("XApplicationEventsObj::CreateInstance");
-+              ReportInternalError("XApplicationEventsObj::CreateInstance");
-               return;
-       }
--      m_pApplicationEventsObj->AddRef ();
--      m_pApplicationEventsObj->Connect (m_pApplication);
-+      m_pApplicationEventsObj->AddRef();
-+      m_pApplicationEventsObj->Connect(m_pApplication);
-       m_pApplicationEventsObj->m_pCommands = this;
- #ifdef NEVER
-       // Create Debugger event handler
-       CComPtr < IDispatch > pDebugger;
--      if (SUCCEEDED (m_pApplication->get_Debugger (&pDebugger))
-+      if (SUCCEEDED(m_pApplication->get_Debugger(&pDebugger))
-           && pDebugger != NULL)
-       {
--              XDebuggerEventsObj::CreateInstance (&m_pDebuggerEventsObj);
--              m_pDebuggerEventsObj->AddRef ();
--              m_pDebuggerEventsObj->Connect (pDebugger);
-+              XDebuggerEventsObj::CreateInstance(&m_pDebuggerEventsObj);
-+              m_pDebuggerEventsObj->AddRef();
-+              m_pDebuggerEventsObj->Connect(pDebugger);
-               m_pDebuggerEventsObj->m_pCommands = this;
-       }
+-                          },
++                          SCRIPTID_INIT},
+     {"backupdir",   "bdir", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP|P_SECURE,
+                           (char_u *)&p_bdir, PV_NONE,
+-                          {(char_u *)DFLT_BDIR, (char_u *)0L}},
++                          {(char_u *)DFLT_BDIR, (char_u *)0L} SCRIPTID_INIT},
+     {"backupext",   "bex",  P_STRING|P_VI_DEF|P_NFNAME,
+                           (char_u *)&p_bex, PV_NONE,
+                           {
+ #ifdef VMS
+                           (char_u *)"_",
+ #else
+                           (char_u *)"~",
  #endif
-       // Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim
--      HKEY hAppKey = GetAppKey ("Vim");
-+      HKEY hAppKey = GetAppKey("Vim");
-       if (hAppKey)
-       {
--              HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
-+              HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
-               if (hSectionKey)
-               {
--                      g_bEnableVim = GetRegistryInt (hSectionKey, "EnableVim",
-+                      g_bEnableVim = GetRegistryInt(hSectionKey, "EnableVim",
-                                                      g_bEnableVim);
--                      g_bDevStudioEditor = GetRegistryInt(hSectionKey,"DevStudioEditor",
--                                                          g_bDevStudioEditor);
--                      g_ChangeDir = GetRegistryInt (hSectionKey, "ChangeDir",
-+                      g_bDevStudioEditor = GetRegistryInt(hSectionKey,
-+                                      "DevStudioEditor", g_bDevStudioEditor);
-+                      g_bNewTabs = GetRegistryInt(hSectionKey, "NewTabs",
-+                                                  g_bNewTabs);
-+                      g_ChangeDir = GetRegistryInt(hSectionKey, "ChangeDir",
-                                                     g_ChangeDir);
--                      RegCloseKey (hSectionKey);
-+                      RegCloseKey(hSectionKey);
-               }
--              RegCloseKey (hAppKey);
-+              RegCloseKey(hAppKey);
-       }
- }
--void CCommands::UnadviseFromEvents ()
-+void CCommands::UnadviseFromEvents()
- {
--      ASSERT (m_pApplicationEventsObj != NULL);
-+      ASSERT(m_pApplicationEventsObj != NULL);
-       if (m_pApplicationEventsObj)
-       {
--              m_pApplicationEventsObj->Disconnect (m_pApplication);
--              m_pApplicationEventsObj->Release ();
-+              m_pApplicationEventsObj->Disconnect(m_pApplication);
-+              m_pApplicationEventsObj->Release();
-               m_pApplicationEventsObj = NULL;
-       }
- #ifdef NEVER
-       if (m_pDebuggerEventsObj)
-@@ -119,14 +122,14 @@ void CCommands::UnadviseFromEvents ()
-               // Since we were able to connect to the Debugger events, we
-               // should be able to access the Debugger object again to
-               // unadvise from its events (thus the VERIFY_OK below--see
-               // stdafx.h).
-               CComPtr < IDispatch > pDebugger;
--              VERIFY_OK (m_pApplication->get_Debugger (&pDebugger));
--              ASSERT (pDebugger != NULL);
--              m_pDebuggerEventsObj->Disconnect (pDebugger);
--              m_pDebuggerEventsObj->Release ();
-+              VERIFY_OK(m_pApplication->get_Debugger(&pDebugger));
-+              ASSERT(pDebugger != NULL);
-+              m_pDebuggerEventsObj->Disconnect(pDebugger);
-+              m_pDebuggerEventsObj->Release();
-               m_pDebuggerEventsObj = NULL;
-       }
+-                                          (char_u *)0L}},
++                                          (char_u *)0L} SCRIPTID_INIT},
+     {"backupskip",  "bsk",  P_STRING|P_VI_DEF|P_COMMA,
+ #ifdef FEAT_WILDIGN
+                           (char_u *)&p_bsk, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
- }
-@@ -134,365 +137,372 @@ void CCommands::UnadviseFromEvents ()
- /////////////////////////////////////////////////////////////////////////////
- // Event handlers
- // Application events
--HRESULT CCommands::XApplicationEvents::BeforeBuildStart ()
-+HRESULT CCommands::XApplicationEvents::BeforeBuildStart()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::BuildFinish (long nNumErrors, long nNumWarnings)
-+HRESULT CCommands::XApplicationEvents::BuildFinish(long nNumErrors, long nNumWarnings)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown ()
-+HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
- // The open document event handle is the place where the real interface work
- // is done.
- // Vim gets called from here.
- //
--HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument)
-+HRESULT CCommands::XApplicationEvents::DocumentOpen(IDispatch * theDocument)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       if (! g_bEnableVim)
-               // Vim not enabled or empty command line entered
-               return S_OK;
-       // First get the current file name and line number
-       // Get the document object
--      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument);
-+      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument);
-       if (! pDoc)
-               return S_OK;
-       BSTR FileName;
-       long LineNr = -1;
-       // Get the document name
--      if (FAILED (pDoc->get_FullName (&FileName)))
-+      if (FAILED(pDoc->get_FullName(&FileName)))
-               return S_OK;
-       LPDISPATCH pDispSel;
-       // Get a selection object dispatch pointer
--      if (SUCCEEDED (pDoc->get_Selection (&pDispSel)))
-+      if (SUCCEEDED(pDoc->get_Selection(&pDispSel)))
-       {
-               // Get the selection object
--              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel);
-+              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel);
-               if (pSel)
-                       // Get the selection line number
--                      pSel->get_CurrentLine (&LineNr);
-+                      pSel->get_CurrentLine(&LineNr);
--              pDispSel->Release ();
-+              pDispSel->Release();
-       }
-       // Open the file in Vim and position to the current line
--      if (VimOpenFile (FileName, LineNr))
-+      if (VimOpenFile(FileName, LineNr))
-       {
-               if (! g_bDevStudioEditor)
-               {
-                       // Close the document in developer studio
-                       CComVariant vSaveChanges = dsSaveChangesPrompt;
-                       DsSaveStatus Saved;
--                      pDoc->Close (vSaveChanges, &Saved);
-+                      pDoc->Close(vSaveChanges, &Saved);
-               }
-       }
-       // We're done here
--      SysFreeString (FileName);
-+      SysFreeString(FileName);
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::BeforeDocumentClose (IDispatch * theDocument)
-+HRESULT CCommands::XApplicationEvents::BeforeDocumentClose(IDispatch * theDocument)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::DocumentSave (IDispatch * theDocument)
-+HRESULT CCommands::XApplicationEvents::DocumentSave(IDispatch * theDocument)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument)
-+HRESULT CCommands::XApplicationEvents::NewDocument(IDispatch * theDocument)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       if (! g_bEnableVim)
-               // Vim not enabled or empty command line entered
-               return S_OK;
-       // First get the current file name and line number
--      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument);
-+      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument);
-       if (! pDoc)
-               return S_OK;
-       BSTR FileName;
-       HRESULT hr;
--      hr = pDoc->get_FullName (&FileName);
--      if (FAILED (hr))
-+      hr = pDoc->get_FullName(&FileName);
-+      if (FAILED(hr))
-               return S_OK;
-       // Open the file in Vim and position to the current line
--      if (VimOpenFile (FileName, 0))
-+      if (VimOpenFile(FileName, 0))
-       {
-               if (! g_bDevStudioEditor)
-               {
-                       // Close the document in developer studio
-                       CComVariant vSaveChanges = dsSaveChangesPrompt;
-                       DsSaveStatus Saved;
--                      pDoc->Close (vSaveChanges, &Saved);
-+                      pDoc->Close(vSaveChanges, &Saved);
-               }
-       }
--      SysFreeString (FileName);
-+      SysFreeString(FileName);
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::WindowActivate (IDispatch * theWindow)
-+HRESULT CCommands::XApplicationEvents::WindowActivate(IDispatch * theWindow)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::WindowDeactivate (IDispatch * theWindow)
-+HRESULT CCommands::XApplicationEvents::WindowDeactivate(IDispatch * theWindow)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::WorkspaceOpen ()
-+HRESULT CCommands::XApplicationEvents::WorkspaceOpen()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::WorkspaceClose ()
-+HRESULT CCommands::XApplicationEvents::WorkspaceClose()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
--HRESULT CCommands::XApplicationEvents::NewWorkspace ()
-+HRESULT CCommands::XApplicationEvents::NewWorkspace()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
- // Debugger event
--HRESULT CCommands::XDebuggerEvents::BreakpointHit (IDispatch * pBreakpoint)
-+HRESULT CCommands::XDebuggerEvents::BreakpointHit(IDispatch * pBreakpoint)
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       return S_OK;
- }
- /////////////////////////////////////////////////////////////////////////////
- // VisVim dialog
- class CMainDialog : public CDialog
- {
-     public:
--      CMainDialog (CWnd * pParent = NULL);    // Standard constructor
-+      CMainDialog(CWnd * pParent = NULL);     // Standard constructor
-       //{{AFX_DATA(CMainDialog)
-       enum { IDD = IDD_ADDINMAIN };
-       int     m_ChangeDir;
-       BOOL    m_bDevStudioEditor;
-+      BOOL    m_bNewTabs;
-       //}}AFX_DATA
-       //{{AFX_VIRTUAL(CMainDialog)
-     protected:
--      virtual void DoDataExchange (CDataExchange * pDX);      // DDX/DDV support
-+      virtual void DoDataExchange(CDataExchange * pDX);       // DDX/DDV support
-       //}}AFX_VIRTUAL
-     protected:
-       //{{AFX_MSG(CMainDialog)
-       afx_msg void OnEnable();
-       afx_msg void OnDisable();
-       //}}AFX_MSG
--      DECLARE_MESSAGE_MAP ()
-+      DECLARE_MESSAGE_MAP()
- };
--CMainDialog::CMainDialog (CWnd * pParent /* =NULL */ )
--      : CDialog (CMainDialog::IDD, pParent)
-+CMainDialog::CMainDialog(CWnd * pParent /* =NULL */ )
-+      : CDialog(CMainDialog::IDD, pParent)
- {
-       //{{AFX_DATA_INIT(CMainDialog)
-       m_ChangeDir = -1;
-       m_bDevStudioEditor = FALSE;
-+      m_bNewTabs = FALSE;
-       //}}AFX_DATA_INIT
- }
--void CMainDialog::DoDataExchange (CDataExchange * pDX)
-+void CMainDialog::DoDataExchange(CDataExchange * pDX)
- {
--      CDialog::DoDataExchange (pDX);
-+      CDialog::DoDataExchange(pDX);
-       //{{AFX_DATA_MAP(CMainDialog)
-       DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir);
--      DDX_Check (pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor);
-+      DDX_Check(pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor);
-+      DDX_Check(pDX, IDC_NEW_TABS, m_bNewTabs);
-       //}}AFX_DATA_MAP
- }
--BEGIN_MESSAGE_MAP (CMainDialog, CDialog)
-+BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
-       //{{AFX_MSG_MAP(CMainDialog)
-       //}}AFX_MSG_MAP
--END_MESSAGE_MAP ()
-+END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CCommands methods
--STDMETHODIMP CCommands::VisVimDialog ()
-+STDMETHODIMP CCommands::VisVimDialog()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       // Use m_pApplication to access the Developer Studio Application
-       // object,
-       // and VERIFY_OK to see error strings in DEBUG builds of your add-in
-       // (see stdafx.h)
--      VERIFY_OK (m_pApplication->EnableModeless (VARIANT_FALSE));
-+      VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE));
-       CMainDialog Dlg;
-       Dlg.m_bDevStudioEditor = g_bDevStudioEditor;
-+      Dlg.m_bNewTabs = g_bNewTabs;
-       Dlg.m_ChangeDir = g_ChangeDir;
--      if (Dlg.DoModal () == IDOK)
-+      if (Dlg.DoModal() == IDOK)
-       {
-               g_bDevStudioEditor = Dlg.m_bDevStudioEditor;
-+              g_bNewTabs = Dlg.m_bNewTabs;
-               g_ChangeDir = Dlg.m_ChangeDir;
-               // Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim
--              HKEY hAppKey = GetAppKey ("Vim");
-+              HKEY hAppKey = GetAppKey("Vim");
-               if (hAppKey)
-               {
--                      HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
-+                      HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
-                       if (hSectionKey)
-                       {
--                              WriteRegistryInt (hSectionKey, "DevStudioEditor",
-+                              WriteRegistryInt(hSectionKey, "DevStudioEditor",
-                                                 g_bDevStudioEditor);
--                              WriteRegistryInt (hSectionKey, "ChangeDir", g_ChangeDir);
--                              RegCloseKey (hSectionKey);
-+                              WriteRegistryInt(hSectionKey, "NewTabs",
-+                                                g_bNewTabs);
-+                              WriteRegistryInt(hSectionKey, "ChangeDir", g_ChangeDir);
-+                              RegCloseKey(hSectionKey);
-                       }
--                      RegCloseKey (hAppKey);
-+                      RegCloseKey(hAppKey);
-               }
-       }
--      VERIFY_OK (m_pApplication->EnableModeless (VARIANT_TRUE));
-+      VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE));
-       return S_OK;
- }
--STDMETHODIMP CCommands::VisVimEnable ()
-+STDMETHODIMP CCommands::VisVimEnable()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
--      VimSetEnableState (true);
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-+      VimSetEnableState(true);
-       return S_OK;
- }
--STDMETHODIMP CCommands::VisVimDisable ()
-+STDMETHODIMP CCommands::VisVimDisable()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
--      VimSetEnableState (false);
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-+      VimSetEnableState(false);
-       return S_OK;
- }
--STDMETHODIMP CCommands::VisVimToggle ()
-+STDMETHODIMP CCommands::VisVimToggle()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
--      VimSetEnableState (! g_bEnableVim);
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-+      VimSetEnableState(! g_bEnableVim);
-       return S_OK;
- }
--STDMETHODIMP CCommands::VisVimLoad ()
-+STDMETHODIMP CCommands::VisVimLoad()
- {
--      AFX_MANAGE_STATE (AfxGetStaticModuleState ());
-+      AFX_MANAGE_STATE(AfxGetStaticModuleState());
-       // Use m_pApplication to access the Developer Studio Application object,
-       // and VERIFY_OK to see error strings in DEBUG builds of your add-in
-       // (see stdafx.h)
-       CComBSTR bStr;
-       // Define dispatch pointers for document and selection objects
-       CComPtr < IDispatch > pDispDoc, pDispSel;
-       // Get a document object dispatch pointer
--      VERIFY_OK (m_pApplication->get_ActiveDocument (&pDispDoc));
-+      VERIFY_OK(m_pApplication->get_ActiveDocument(&pDispDoc));
-       if (! pDispDoc)
-               return S_OK;
-       BSTR FileName;
-       long LineNr = -1;
-       // Get the document object
--      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (pDispDoc);
-+      CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(pDispDoc);
-       if (! pDoc)
-               return S_OK;
-       // Get the document name
--      if (FAILED (pDoc->get_FullName (&FileName)))
-+      if (FAILED(pDoc->get_FullName(&FileName)))
-               return S_OK;
-       // Get a selection object dispatch pointer
--      if (SUCCEEDED (pDoc->get_Selection (&pDispSel)))
-+      if (SUCCEEDED(pDoc->get_Selection(&pDispSel)))
-       {
-               // Get the selection object
--              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel);
-+              CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel);
-               if (pSel)
-                       // Get the selection line number
--                      pSel->get_CurrentLine (&LineNr);
-+                      pSel->get_CurrentLine(&LineNr);
-       }
-       // Open the file in Vim
--      VimOpenFile (FileName, LineNr);
-+      VimOpenFile(FileName, LineNr);
--      SysFreeString (FileName);
-+      SysFreeString(FileName);
-       return S_OK;
- }
- //
- // Here we do the actual processing and communication with Vim
- //
- // Set the enable state and save to registry
- //
--static void VimSetEnableState (BOOL bEnableState)
-+static void VimSetEnableState(BOOL bEnableState)
- {
-       g_bEnableVim = bEnableState;
--      HKEY hAppKey = GetAppKey ("Vim");
-+      HKEY hAppKey = GetAppKey("Vim");
-       if (hAppKey)
-       {
--              HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
-+              HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim");
-               if (hSectionKey)
--                      WriteRegistryInt (hSectionKey, "EnableVim", g_bEnableVim);
--              RegCloseKey (hAppKey);
-+                      WriteRegistryInt(hSectionKey, "EnableVim", g_bEnableVim);
-+              RegCloseKey(hAppKey);
-       }
- }
- // Open the file 'FileName' in Vim and goto line 'LineNr'
- // 'FileName' is expected to contain an absolute DOS path including the drive
- // letter.
- // 'LineNr' must contain a valid line number or 0, e. g. for a new file
- //
--static BOOL VimOpenFile (BSTR& FileName, long LineNr)
-+static BOOL VimOpenFile(BSTR& FileName, long LineNr)
- {
-       // OLE automation object for com. with Vim
-       // When the object goes out of scope, it's destructor destroys the OLE
-       // connection;
-@@ -505,11 +515,11 @@ static BOOL VimOpenFile (BSTR& FileName,
-       // :cd D:/Src2/VisVim/
-       //
-       // Get a dispatch id for the SendKeys method of Vim;
-       // enables connection to Vim if necessary
-       DISPID DispatchId;
--      DispatchId = VimGetDispatchId (VimOle, "SendKeys");
-+      DispatchId = VimGetDispatchId(VimOle, "SendKeys");
-       if (! DispatchId)
-               // OLE error, can't obtain dispatch id
-               goto OleError;
-       OLECHAR Buf[MAX_OLE_STR];
-@@ -523,24 +533,32 @@ static BOOL VimOpenFile (BSTR& FileName,
-       VimCmd[2] = 0;
- #ifdef SINGLE_WINDOW
-       // Update the current file in Vim if it has been modified.
-       // Disabled, because it could write the file when you don't want to.
--      sprintf (VimCmd + 2, ":up\n");
-+      sprintf(VimCmd + 2, ":up\n");
+-                          },
++                          SCRIPTID_INIT},
+ #ifdef FEAT_BEVAL
+     {"balloondelay","bdlay",P_NUM|P_VI_DEF,
+                           (char_u *)&p_bdlay, PV_NONE,
+-                          {(char_u *)600L, (char_u *)0L}},
++                          {(char_u *)600L, (char_u *)0L} SCRIPTID_INIT},
+     {"ballooneval", "beval",P_BOOL|P_VI_DEF|P_NO_MKRC,
+                           (char_u *)&p_beval, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+ # ifdef FEAT_EVAL
+     {"balloonexpr", "bexpr", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
+                           (char_u *)&p_bexpr, PV_BEXPR,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+ # endif
  #endif
--      if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
-+      if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
-               goto OleError;
-       // Change Vim working directory to where the file is if desired
-       if (g_ChangeDir != CD_NONE)
--              VimChangeDir (VimOle, DispatchId, FileName);
-+              VimChangeDir(VimOle, DispatchId, FileName);
-       // Make Vim open the file.
-       // In the filename convert all \ to /, put a \ before a space.
--      sprintf(VimCmd, ":drop ");
-+      if (g_bNewTabs)
-+      {
-+              sprintf(VimCmd, ":tab drop ");
-+              s = VimCmd + 11;
-+      }
-+      else
-+      {
-+              sprintf(VimCmd, ":drop ");
-+              s = VimCmd + 6;
-+      }
-       sprintf(FileNameTmp, "%S", (char *)FileName);
--      s = VimCmd + 6;
-       for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4;
-                                                                         ++p)
-               if (*p == '\\')
-                       *s++ = '/';
-               else
-@@ -550,51 +568,51 @@ static BOOL VimOpenFile (BSTR& FileName,
-                       *s++ = *p;
-               }
-       *s++ = '\n';
-       *s = '\0';
--      if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
-+      if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
-               goto OleError;
-       if (LineNr > 0)
-       {
-               // Goto line
--              sprintf (VimCmd, ":%d\n", LineNr);
--              if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
-+              sprintf(VimCmd, ":%d\n", LineNr);
-+              if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)))
-                       goto OleError;
-       }
-       // Make Vim come to the foreground
--      if (! VimOle.Method ("SetForeground"))
--              VimOle.ErrDiag ();
-+      if (! VimOle.Method("SetForeground"))
-+              VimOle.ErrDiag();
-       // We're done
-       return true;
-     OleError:
-       // There was an OLE error
-       // Check if it's the "unknown class string" error
--      VimErrDiag (VimOle);
-+      VimErrDiag(VimOle);
-       return false;
- }
- // Return the dispatch id for the Vim method 'Method'
- // Create the Vim OLE object if necessary
- // Returns a valid dispatch id or null on error
- //
--static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method)
-+static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method)
- {
-       // Initialize Vim OLE connection if not already done
--      if (! VimOle.IsCreated ())
-+      if (! VimOle.IsCreated())
-       {
--              if (! VimOle.CreateObject ("Vim.Application"))
-+              if (! VimOle.CreateObject("Vim.Application"))
-                       return NULL;
-       }
-       // Get the dispatch id for the SendKeys method.
-       // By doing this, we are checking if Vim is still there...
--      DISPID DispatchId = VimOle.GetDispatchId ("SendKeys");
-+      DISPID DispatchId = VimOle.GetDispatchId("SendKeys");
-       if (! DispatchId)
-       {
-               // We can't get a dispatch id.
-               // This means that probably Vim has been terminated.
-               // Don't issue an error message here, instead
-@@ -602,62 +620,62 @@ static DISPID VimGetDispatchId (COleAuto
-               //
-               // In fact, this should never happen, because the OLE aut. object
-               // should not be kept long enough to allow the user to terminate Vim
-               // to avoid memory corruption (why the heck is there no system garbage
-               // collection for those damned OLE memory chunks???).
--              VimOle.DeleteObject ();
--              if (! VimOle.CreateObject ("Vim.Application"))
-+              VimOle.DeleteObject();
-+              if (! VimOle.CreateObject("Vim.Application"))
-                       // If this create fails, it's time for an error msg
-                       return NULL;
--              if (! (DispatchId = VimOle.GetDispatchId ("SendKeys")))
-+              if (! (DispatchId = VimOle.GetDispatchId("SendKeys")))
-                       // There is something wrong...
-                       return NULL;
-       }
-       return DispatchId;
- }
- // Output an error message for an OLE error
- // Check on the classstring error, which probably means Vim wasn't registered.
- //
--static void VimErrDiag (COleAutomationControl& VimOle)
-+static void VimErrDiag(COleAutomationControl& VimOle)
- {
--      SCODE sc = GetScode (VimOle.GetResult ());
-+      SCODE sc = GetScode(VimOle.GetResult());
-       if (sc == CO_E_CLASSSTRING)
-       {
-               char Buf[256];
--              sprintf (Buf, "There is no registered OLE automation server named "
-+              sprintf(Buf, "There is no registered OLE automation server named "
-                        "\"Vim.Application\".\n"
-                        "Use the OLE-enabled version of Vim with VisVim and "
-                        "make sure to register Vim by running \"vim -register\".");
--              MessageBox (NULL, Buf, "OLE Error", MB_OK);
-+              MessageBox(NULL, Buf, "OLE Error", MB_OK);
-       }
-       else
--              VimOle.ErrDiag ();
-+              VimOle.ErrDiag();
- }
- // Change directory to the directory the file 'FileName' is in or it's parent
- // directory according to the setting of the global 'g_ChangeDir':
- // 'FileName' is expected to contain an absolute DOS path including the drive
- // letter.
- //    CD_NONE
- //    CD_SOURCE_PATH
- //    CD_SOURCE_PARENT
- //
--static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName)
-+static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName)
- {
-       // Do a :cd first
-       // Get the path name of the file ("dir/")
-       CString StrFileName = FileName;
-       char Drive[_MAX_DRIVE];
-       char Dir[_MAX_DIR];
-       char DirUnix[_MAX_DIR * 2];
-       char *s, *t;
--      _splitpath (StrFileName, Drive, Dir, NULL, NULL);
-+      _splitpath(StrFileName, Drive, Dir, NULL, NULL);
-       // Convert to Unix path name format, escape spaces.
-       t = DirUnix;
-       for (s = Dir; *s; ++s)
-               if (*s == '\\')
-@@ -674,21 +692,20 @@ static void VimChangeDir (COleAutomation
-       // Construct the cd command; append /.. if cd to parent
-       // directory and not in root directory
-       OLECHAR Buf[MAX_OLE_STR];
-       char VimCmd[MAX_OLE_STR];
--      sprintf (VimCmd, ":cd %s%s%s\n", Drive, DirUnix,
-+      sprintf(VimCmd, ":cd %s%s%s\n", Drive, DirUnix,
-                g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : "");
--      VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf));
-+      VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf));
- }
- #ifdef _DEBUG
- // Print out a debug message
- //
--static void DebugMsg (char* Msg, char* Arg)
-+static void DebugMsg(char* Msg, char* Arg)
- {
-       char Buf[400];
--      sprintf (Buf, Msg, Arg);
--      AfxMessageBox (Buf);
-+      sprintf(Buf, Msg, Arg);
-+      AfxMessageBox(Buf);
- }
- #endif
--
---- vim72.orig/src/VisVim/Resource.h
-+++ vim72/src/VisVim/Resource.h
-@@ -14,10 +14,11 @@
- #define IDD_ADDINMAIN                 130
- #define IDC_DEVSTUDIO_EDITOR          1000
- #define IDC_CD_SOURCE_PATH            1001
- #define IDC_CD_SOURCE_PARENT          1002
- #define IDC_CD_NONE                   1003
-+#define IDC_NEW_TABS                  1004
- // Next default values for new objects
- //
- #ifdef APSTUDIO_INVOKED
- #ifndef APSTUDIO_READONLY_SYMBOLS
---- vim72.orig/src/VisVim/VisVim.rc
-+++ vim72/src/VisVim/VisVim.rc
-@@ -120,10 +120,13 @@ CAPTION "Vim Add-In 1.4"
- FONT 8, "MS Sans Serif"
- BEGIN
-     CONTROL         "&Open file in DevStudio editor simultaneously",
-                     IDC_DEVSTUDIO_EDITOR,"Button",BS_AUTOCHECKBOX | WS_GROUP | 
-                     WS_TABSTOP,7,7,153,10
-+    CONTROL         "Open files in new tabs",
-+                    IDC_NEW_TABS,"Button",BS_AUTOCHECKBOX | WS_GROUP |
-+                    WS_TABSTOP,7,21,153,10
-     GROUPBOX        "Current directory",IDC_STATIC,7,35,164,58,WS_GROUP
-     CONTROL         "Set to &source file path",IDC_CD_SOURCE_PATH,"Button",
-                     BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,17,49,85,10
-     CONTROL         "Set to &parent directory of source file path",
-                     IDC_CD_SOURCE_PARENT,"Button",BS_AUTORADIOBUTTON,17,63,
---- vim72.orig/src/proto/message.pro
-+++ vim72/src/proto/message.pro
-@@ -52,10 +52,11 @@ void repeat_message __ARGS((void));
- void msg_clr_eos __ARGS((void));
- void msg_clr_eos_force __ARGS((void));
- void msg_clr_cmdline __ARGS((void));
- int msg_end __ARGS((void));
- void msg_check __ARGS((void));
-+int redirecting __ARGS((void));
- void verbose_enter __ARGS((void));
- void verbose_leave __ARGS((void));
- void verbose_enter_scroll __ARGS((void));
- void verbose_leave_scroll __ARGS((void));
- void verbose_stop __ARGS((void));
---- vim72.orig/src/memline.c
-+++ vim72/src/memline.c
-@@ -380,11 +380,11 @@ ml_open(buf)
-     dp = (DATA_BL *)(hp->bh_data);
-     dp->db_index[0] = --dp->db_txt_start;     /* at end of block */
-     dp->db_free -= 1 + INDEX_SIZE;
-     dp->db_line_count = 1;
--    *((char_u *)dp + dp->db_txt_start) = NUL; /* emtpy line */
-+    *((char_u *)dp + dp->db_txt_start) = NUL; /* empty line */
-     return OK;
- error:
-     if (mfp != NULL)
-@@ -488,10 +488,17 @@ ml_setname(buf)
-       {
-           /* could not (re)open the swap file, what can we do???? */
-           EMSG(_("E301: Oops, lost the swap file!!!"));
-           return;
-       }
-+#ifdef HAVE_FD_CLOEXEC
-+      {
-+          int fdflags = fcntl(mfp->mf_fd, F_GETFD);
-+          if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
-+              fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC);
-+      }
-+#endif
-     }
-     if (!success)
-       EMSG(_("E302: Could not rename swap file"));
- }
-@@ -862,25 +869,28 @@ ml_recover()
-     int               attr;
-     recoverymode = TRUE;
-     called_from_main = (curbuf->b_ml.ml_mfp == NULL);
-     attr = hl_attr(HLF_E);
--/*
-- * If the file name ends in ".sw?" we use it directly.
-- * Otherwise a search is done to find the swap file(s).
-- */
-+
-+    /*
-+     * If the file name ends in ".s[uvw][a-z]" we assume this is the swap file.
-+     * Otherwise a search is done to find the swap file(s).
-+     */
-     fname = curbuf->b_fname;
-     if (fname == NULL)                    /* When there is no file name */
-       fname = (char_u *)"";
-     len = (int)STRLEN(fname);
-     if (len >= 4 &&
- #if defined(VMS) || defined(RISCOS)
--          STRNICMP(fname + len - 4, "_sw" , 3)
-+          STRNICMP(fname + len - 4, "_s" , 2)
+     {"beautify",    "bf",   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"binary",            "bin",  P_BOOL|P_VI_DEF|P_RSTAT,
+                           (char_u *)&p_bin, PV_BIN,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"bioskey",           "biosk",P_BOOL|P_VI_DEF,
+ #ifdef MSDOS
+                           (char_u *)&p_biosk, PV_NONE,
  #else
--          STRNICMP(fname + len - 4, ".sw" , 3)
-+          STRNICMP(fname + len - 4, ".s" , 2)
+                           (char_u *)NULL, PV_NONE,
  #endif
--              == 0)
-+              == 0
-+              && vim_strchr((char_u *)"UVWuvw", fname[len - 2]) != NULL
-+              && ASCII_ISALPHA(fname[len - 1]))
-     {
-       directly = TRUE;
-       fname = vim_strsave(fname); /* make a copy for mf_open() */
-     }
-     else
-@@ -1280,22 +1290,23 @@ ml_recover()
-                   }
-                   for (i = 0; i < dp->db_line_count; ++i)
-                   {
-                       txt_start = (dp->db_index[i] & DB_INDEX_MASK);
--                      if (txt_start <= HEADER_SIZE
-+                      if (txt_start <= (int)HEADER_SIZE
-                                         || txt_start >= (int)dp->db_txt_end)
-                       {
-                           p = (char_u *)"???";
-                           ++error;
-                       }
-                       else
-                           p = (char_u *)dp + txt_start;
-                       ml_append(lnum++, p, (colnr_T)0, TRUE);
-                   }
-                   if (has_error)
--                      ml_append(lnum++, (char_u *)_("???END"), (colnr_T)0, TRUE);
-+                      ml_append(lnum++, (char_u *)_("???END"),
-+                                                          (colnr_T)0, TRUE);
-               }
-           }
-       }
-       if (buf->b_ml.ml_stack_top == 0)        /* finished */
-@@ -1552,14 +1563,19 @@ recover_names(fname, list, nr)
-                              && (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL)
-       {
-           for (i = 0; i < num_files; ++i)
-               if (fullpathcmp(p, files[i], TRUE) & FPC_SAME)
-               {
-+                  /* Remove the name from files[i].  Move further entries
-+                   * down.  When the array becomes empty free it here, since
-+                   * FreeWild() won't be called below. */
-                   vim_free(files[i]);
--                  --num_files;
--                  for ( ; i < num_files; ++i)
--                      files[i] = files[i + 1];
-+                  if (--num_files == 0)
-+                      vim_free(files);
-+                  else
-+                      for ( ; i < num_files; ++i)
-+                          files[i] = files[i + 1];
-               }
-       }
-       if (nr > 0)
-       {
-           file_count += num_files;
-@@ -2095,16 +2111,16 @@ errorret:
-       lnum = 1;
-     if (buf->b_ml.ml_mfp == NULL)     /* there are no lines */
-       return (char_u *)"";
--/*
-- * See if it is the same line as requested last time.
-- * Otherwise may need to flush last used line.
-- * Don't use the last used line when 'swapfile' is reset, need to load all
-- * blocks.
-- */
-+    /*
-+     * See if it is the same line as requested last time.
-+     * Otherwise may need to flush last used line.
-+     * Don't use the last used line when 'swapfile' is reset, need to load all
-+     * blocks.
-+     */
-     if (buf->b_ml.ml_line_lnum != lnum || mf_dont_release)
-     {
-       ml_flush_line(buf);
-       /*
-@@ -3069,16 +3085,23 @@ ml_flush_line(buf)
-     int               extra;
-     int               idx;
-     int               start;
-     int               count;
-     int               i;
-+    static int  entered = FALSE;
-     if (buf->b_ml.ml_line_lnum == 0 || buf->b_ml.ml_mfp == NULL)
-       return;         /* nothing to do */
-     if (buf->b_ml.ml_flags & ML_LINE_DIRTY)
-     {
-+      /* This code doesn't work recursively, but Netbeans may call back here
-+       * when obtaining the cursor position. */
-+      if (entered)
-+          return;
-+      entered = TRUE;
-+
-       lnum = buf->b_ml.ml_line_lnum;
-       new_line = buf->b_ml.ml_line_ptr;
-       hp = ml_find_line(buf, lnum, ML_FIND);
-       if (hp == NULL)
-@@ -3142,10 +3165,12 @@ ml_flush_line(buf)
-                                            (dp->db_index[idx] & DB_MARKED));
-               (void)ml_delete_int(buf, lnum, FALSE);
-           }
-       }
-       vim_free(new_line);
-+
-+      entered = FALSE;
-     }
-     buf->b_ml.ml_line_lnum = 0;
- }
-@@ -3520,11 +3545,11 @@ resolve_symlink(fname, buf)
-       if (ret <= 0)
-       {
-           if (errno == EINVAL || errno == ENOENT)
-           {
-               /* Found non-symlink or not existing file, stop here.
--               * When at the first level use the unmodifed name, skip the
-+               * When at the first level use the unmodified name, skip the
-                * call to vim_FullName(). */
-               if (depth == 1)
-                   return FAIL;
-               /* Use the resolved name in tmp[]. */
-@@ -3566,15 +3591,14 @@ resolve_symlink(fname, buf)
- /*
-  * Make swap file name out of the file name and a directory name.
-  * Returns pointer to allocated memory or NULL.
-  */
--/*ARGSUSED*/
-     char_u *
- makeswapname(fname, ffname, buf, dir_name)
-     char_u    *fname;
--    char_u    *ffname;
-+    char_u    *ffname UNUSED;
-     buf_T     *buf;
-     char_u    *dir_name;
- {
-     char_u    *r, *s;
- #ifdef HAVE_READLINK
-@@ -3764,12 +3788,14 @@ do_swapexists(buf, fname)
- {
-     set_vim_var_string(VV_SWAPNAME, fname, -1);
-     set_vim_var_string(VV_SWAPCHOICE, NULL, -1);
-     /* Trigger SwapExists autocommands with <afile> set to the file being
--     * edited. */
-+     * edited.  Disallow changing directory here. */
-+    ++allbuf_lock;
-     apply_autocmds(EVENT_SWAPEXISTS, buf->b_fname, NULL, FALSE, NULL);
-+    --allbuf_lock;
-     set_vim_var_string(VV_SWAPNAME, NULL, -1);
-     switch (*get_vim_var_str(VV_SWAPCHOICE))
-     {
-@@ -3791,10 +3817,11 @@ do_swapexists(buf, fname)
-  * Several names are tried to find one that does not exist
-  * Returns the name in allocated memory or NULL.
-  *
-  * Note: If BASENAMELEN is not correct, you will get error messages for
-  *     not being able to open the swapfile
-+ * Note: May trigger SwapExists autocmd, pointers may change!
-  */
-     static char_u *
- findswapname(buf, dirp, old_fname)
-     buf_T     *buf;
-     char_u    **dirp;         /* pointer to list of directories */
-@@ -4558,11 +4585,11 @@ ml_updatechunk(buf, line, len, updtype)
-           mch_memmove(buf->b_ml.ml_chunksize + curix + 1,
-                       buf->b_ml.ml_chunksize + curix,
-                       (buf->b_ml.ml_usedchunks - curix) *
-                       sizeof(chunksize_T));
--          /* Compute length of first half of lines in the splitted chunk */
-+          /* Compute length of first half of lines in the split chunk */
-           size = 0;
-           linecnt = 0;
-           while (curline < buf->b_ml.ml_line_count
-                       && linecnt < MLCS_MINL)
-           {
---- vim72.orig/src/search.c
-+++ vim72/src/search.c
-@@ -343,10 +343,19 @@ restore_search_patterns()
-     void
- free_search_patterns()
- {
-     vim_free(spats[0].pat);
-     vim_free(spats[1].pat);
-+
-+# ifdef FEAT_RIGHTLEFT
-+    if (mr_pattern_alloced)
-+    {
-+        vim_free(mr_pattern);
-+        mr_pattern_alloced = FALSE;
-+        mr_pattern = NULL;
-+    }
-+# endif
- }
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"bomb",      NULL,   P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
+ #ifdef FEAT_MBYTE
+                           (char_u *)&p_bomb, PV_BOMB,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
- /*
-  * Return TRUE when case should be ignored for search pattern "pat".
-@@ -511,11 +520,10 @@ last_pat_prog(regmatch)
-  *
-  * Return FAIL (zero) for failure, non-zero for success.
-  * When FEAT_EVAL is defined, returns the index of the first matching
-  * subpattern plus one; one if there was none.
-  */
--/*ARGSUSED*/
-     int
- searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm)
-     win_T     *win;           /* window to search in; can be NULL for a
-                                  buffer without a window! */
-     buf_T     *buf;
-@@ -524,11 +532,11 @@ searchit(win, buf, pos, dir, pat, count,
-     char_u    *pat;
-     long      count;
-     int               options;
-     int               pat_use;        /* which pattern to use when "pat" is empty */
-     linenr_T  stop_lnum;      /* stop after this line number when != 0 */
--    proftime_T        *tm;            /* timeout limit or NULL */
-+    proftime_T        *tm UNUSED;     /* timeout limit or NULL */
- {
-     int               found;
-     linenr_T  lnum;           /* no init to shut up Apollo cc */
-     regmmatch_T       regmatch;
-     char_u    *ptr;
-@@ -543,12 +551,10 @@ searchit(win, buf, pos, dir, pat, count,
-     long      nmatched;
-     int               submatch = 0;
-     int               save_called_emsg = called_emsg;
- #ifdef FEAT_SEARCH_EXTRA
-     int               break_loop = FALSE;
--#else
--# define break_loop FALSE
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"breakat",           "brk",  P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST,
+ #ifdef FEAT_LINEBREAK
+                           (char_u *)&p_breakat, PV_NONE,
+                           {(char_u *)" \t!@*-+;:,./?", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-     if (search_regcomp(pat, RE_SEARCH, pat_use,
-                  (options & (SEARCH_HIS + SEARCH_KEEP)), &regmatch) == FAIL)
-     {
-@@ -929,11 +935,14 @@ searchit(win, buf, pos, dir, pat, count,
-            * Stop the search if wrapscan isn't set, "stop_lnum" is
-            * specified, after an interrupt, after a match and after looping
-            * twice.
-            */
-           if (!p_ws || stop_lnum != 0 || got_int || called_emsg
--                                             || break_loop || found || loop)
-+#ifdef FEAT_SEARCH_EXTRA
-+                                             || break_loop
-+#endif
-+                                             || found || loop)
-               break;
-           /*
-            * If 'wrapscan' is set we continue at the other end of the file.
-            * If 'shortmess' does not contain 's', we give a message.
-@@ -947,11 +956,15 @@ searchit(win, buf, pos, dir, pat, count,
-               lnum = 1;
-           if (!shortmess(SHM_SEARCH) && (options & SEARCH_MSG))
-               give_warning((char_u *)_(dir == BACKWARD
-                                         ? top_bot_msg : bot_top_msg), TRUE);
-       }
--      if (got_int || called_emsg || break_loop)
-+      if (got_int || called_emsg
-+#ifdef FEAT_SEARCH_EXTRA
-+              || break_loop
-+#endif
-+              )
-           break;
-     }
-     while (--count > 0 && found);   /* stop after count matches or no match */
-     vim_free(regmatch.regprog);
-@@ -2325,12 +2338,12 @@ findmatchlimit(oap, initc, flags, maxtra
-               if (!cpo_bsl)
-               {
-                   for (col = pos.col; check_prevcol(linep, col, '\\', &col);)
-                       bslcnt++;
-               }
--              /* Only accept a match when 'M' is in 'cpo' or when ecaping is
--               * what we expect. */
-+              /* Only accept a match when 'M' is in 'cpo' or when escaping
-+               * is what we expect. */
-               if (cpo_bsl || (bslcnt & 1) == match_escaped)
-               {
-                   if (c == initc)
-                       count++;
-                   else
-@@ -4512,16 +4525,15 @@ linewhite(lnum)
- #if defined(FEAT_FIND_ID) || defined(PROTO)
- /*
-  * Find identifiers or defines in included files.
-  * if p_ic && (compl_cont_status & CONT_SOL) then ptr must be in lowercase.
-  */
--/*ARGSUSED*/
-     void
- find_pattern_in_path(ptr, dir, len, whole, skip_comments,
-                                   type, count, action, start_lnum, end_lnum)
-     char_u    *ptr;           /* pointer to search pattern */
--    int               dir;            /* direction of expansion */
-+    int               dir UNUSED;     /* direction of expansion */
-     int               len;            /* length of search pattern */
-     int               whole;          /* match whole words only */
-     int               skip_comments;  /* don't match inside comments */
-     int               type;           /* Type of search; are we looking for a type?
-                                  a macro? */
-@@ -4661,11 +4673,11 @@ find_pattern_in_path(ptr, dir, len, whol
-                               action == ACTION_SHOW_ALL && files[i].matched)
-                       {
-                           msg_putchar('\n');      /* cursor below last one */
-                           if (!got_int)           /* don't display if 'q'
-                                                      typed at "--more--"
--                                                     mesage */
-+                                                     message */
-                           {
-                               msg_home_replace_hl(new_fname);
-                               MSG_PUTS(_(" (includes previously listed match)"));
-                               prev_fname = NULL;
-                           }
-@@ -4973,11 +4985,11 @@ search_line:
-                                   || (vim_strchr(p_cpo, CPO_JOINSP) == NULL
-                                       && (IObuff[i-2] == '?'
-                                           || IObuff[i-2] == '!'))))
-                               IObuff[i++] = ' ';
-                       }
--                      /* copy as much as posible of the new word */
-+                      /* copy as much as possible of the new word */
-                       if (p - aux >= IOSIZE - i)
-                           p = aux + IOSIZE - i - 1;
-                       STRNCPY(IObuff + i, aux, p - aux);
-                       i += (int)(p - aux);
-                       reuse |= CONT_S_IPOS;
-@@ -5008,11 +5020,11 @@ search_line:
-               if (curr_fname != prev_fname)
-               {
-                   if (did_show)
-                       msg_putchar('\n');      /* cursor below last one */
-                   if (!got_int)               /* don't display if 'q' typed
--                                                  at "--more--" mesage */
-+                                                  at "--more--" message */
-                       msg_home_replace_hl(curr_fname);
-                   prev_fname = curr_fname;
-               }
-               did_show = TRUE;
-               if (!got_int)
-@@ -5090,11 +5102,11 @@ search_line:
-                       curwin->w_cursor.lnum = files[depth].lnum;
-                   }
-               }
-               if (action != ACTION_SHOW)
-               {
--                  curwin->w_cursor.col = (colnr_T) (startp - line);
-+                  curwin->w_cursor.col = (colnr_T)(startp - line);
-                   curwin->w_set_curswant = TRUE;
-               }
- #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
-               if (g_do_tagpreview != 0
-@@ -5117,11 +5129,12 @@ exit_matched:
-           if (def_regmatch.regprog == NULL
- #ifdef FEAT_INS_EXPAND
-                   && action == ACTION_EXPAND
-                   && !(compl_cont_status & CONT_SOL)
+-                          },
++                          SCRIPTID_INIT},
+     {"browsedir",   "bsdir",P_STRING|P_VI_DEF,
+ #ifdef FEAT_BROWSE
+                           (char_u *)&p_bsdir, PV_NONE,
+                           {(char_u *)"last", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
--                  && *(p = startp + 1))
-+                  && *startp != NUL
-+                  && *(p = startp + 1) != NUL)
-               goto search_line;
-       }
-       line_breakcheck();
- #ifdef FEAT_INS_EXPAND
-       if (action == ACTION_EXPAND)
---- vim72.orig/src/Makefile
-+++ vim72/src/Makefile
-@@ -103,12 +103,12 @@
- #       solution for a non-standard system.
- #
- # 4. "make test"  {{{1
- #     This is optional.  This will run Vim scripts on a number of test
- #     files, and compare the produced output with the expected output.
--#     If all is well, you will get the "ALL DONE" message in the end.  See
--#     below (search for "/^test").
-+#     If all is well, you will get the "ALL DONE" message in the end.  If a
-+#     test fails you get "TEST FAILURE".  See below (search for "/^test").
- #
- # 5. "make install"  {{{1
- #     If the new Vim seems to be working OK you can install it and the
- #     documentation in the appropriate location. The default is
- #     "/usr/local".  Change "prefix" below to change the location.
-@@ -393,11 +393,13 @@ CClink = $(CC)
- #CONF_OPT_TCL = --enable-tclinterp
- #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4
- # RUBY
- # Uncomment this when you want to include the Ruby interface.
--#CONF_OPT_RUBY = --enable-rubyinterp
-+# Note: you need the development package (e.g., ruby1.9.1-dev on Ubuntu).
-+# CONF_OPT_RUBY = --enable-rubyinterp
-+# CONF_OPT_RUBY = --enable-rubyinterp --with-ruby-command=ruby1.9.1
- # MZSCHEME
- # Uncomment this when you want to include the MzScheme interface.
- #CONF_OPT_MZSCHEME = --enable-mzschemeinterp
- # PLT/mrscheme/drscheme Home dir; the PLTHOME environment variable also works
-@@ -531,10 +533,15 @@ CClink = $(CC)
- #CFLAGS = -g -Wall -Wmissing-prototypes
- #CFLAGS = -O6 -fno-strength-reduce -Wall -Wshadow -Wmissing-prototypes
- #CFLAGS = -g -DDEBUG -Wall -Wshadow -Wmissing-prototypes
- #CFLAGS = -g -O2 '-DSTARTUPTIME="vimstartup"' -fno-strength-reduce -Wall -Wmissing-prototypes
-+# Use this with GCC to check for mistakes, unused arguments, etc.
-+#CFLAGS = -g -Wall -Wextra -Wmissing-prototypes -Wunreachable-code
-+#PYTHON_CFLAGS_EXTRA = -Wno-missing-field-initializers
-+#MZSCHEME_CFLAGS_EXTRA = -Wno-unreachable-code -Wno-unused-parameter
-+
- # EFENCE - Electric-Fence malloc debugging: catches memory accesses beyond
- # allocated memory (and makes every malloc()/free() very slow).
- # Electric Fence is free (search ftp sites).
- # You may want to set the EF_PROTECT_BELOW environment variable to check the
- # other side of allocated memory.
-@@ -549,11 +556,17 @@ CClink = $(CC)
- #EXTRA_DEFS = -DNBDEBUG
- # }}}
- # LINT - for running lint
-+#  For standard Unix lint
-+LINT = lint
- LINT_OPTIONS = -beprxzF
-+#  For splint
-+#  It doesn't work well, crashes on include files and non-ascii characters.
-+#LINT = splint
-+#LINT_OPTIONS = +unixlib -weak -macrovarprefixexclude -showfunc -linelen 9999
- # PROFILING - Uncomment the next two lines to do profiling with gcc and gprof.
- # Might not work with GUI or Perl.
- # For unknown reasons adding "-lc" fixes a linking problem with GCC.  That's
- # probably a bug in the "-pg" implementation.
-@@ -1257,20 +1270,20 @@ CPP_DEPEND = $(CC) -I$(srcdir) -M$(CPP_M
- # flags for cproto
- #     This is for cproto 3 patchlevel 8 or below
- #     __inline, __attribute__ and __extension__ are not recognized by cproto
- #     G_IMPLEMENT_INLINES is to avoid functions defined in glib/gutils.h.
--NO_ATTR = -D__inline= -D__inline__= -DG_IMPLEMENT_INLINES \
--        -D"__attribute__\\(x\\)=" -D"__asm__\\(x\\)=" \
--        -D__extension__= -D__restrict="" \
--        -D__gnuc_va_list=char -D__builtin_va_list=char
-+#NO_ATTR = -D__inline= -D__inline__= -DG_IMPLEMENT_INLINES \
-+#       -D"__attribute__\\(x\\)=" -D"__asm__\\(x\\)=" \
-+#       -D__extension__= -D__restrict="" \
-+#       -D__gnuc_va_list=char -D__builtin_va_list=char
- #
--#     This is for cproto 3 patchlevel 9 or above (currently 4.6)
-+#     This is for cproto 3 patchlevel 9 or above (currently 4.6, 4.7g)
- #     __inline and __attribute__ are now recognized by cproto
- #     -D"foo()=" is not supported by all compilers so do not use it
--# NO_ATTR=
-+NO_ATTR=
- #
- #     maybe the "/usr/bin/cc -E" has to be adjusted for some systems
- # This is for cproto 3.5 patchlevel 3:
- # PROTO_FLAGS = -f4 -m__ARGS -d -E"$(CPP)" $(NO_ATTR)
- #
-@@ -1430,10 +1443,11 @@ ALL_SRC = $(BASIC_SRC) $(ALL_GUI_SRC) $(
- # The perl sources also don't work well with lint.
- LINT_SRC = $(BASIC_SRC) $(GUI_SRC) $(HANGULIN_SRC) $(PYTHON_SRC) $(TCL_SRC) \
-       $(SNIFF_SRC) $(WORKSHOP_SRC) $(WSDEBUG_SRC) $(NETBEANS_SRC)
- #LINT_SRC = $(SRC)
- #LINT_SRC = $(ALL_SRC)
-+#LINT_SRC = $(BASIC_SRC)
- OBJ = \
-       objects/buffer.o \
-       objects/charset.o \
-       objects/diff.o \
-@@ -1735,11 +1749,12 @@ types.vim: $(TAGS_SRC) $(TAGS_INCL)
- #
- # This will produce a lot of garbage on your screen, including a few error
- # messages.  Don't worry about that.
- # If there is a real error, there will be a difference between "test.out" and
- # a "test99.ok" file.
--# If everything is alright, the final message will be "ALL DONE".
-+# If everything is alright, the final message will be "ALL DONE".  If not you
-+# get "TEST FAILURE".
- #
- test check:
-       $(MAKE) -f Makefile $(VIMTARGET)
-       -if test -n "$(MAKEMO)" -a -f $(PODIR)/Makefile; then \
-               cd $(PODIR); $(MAKE) -f Makefile check VIM=../$(VIMTARGET); \
-@@ -2185,10 +2200,11 @@ uninstall_runtime:
- clean celan: testclean
-       -rm -f *.o objects/* core $(VIMTARGET).core $(VIMTARGET) vim xxd/*.o
-       -rm -f $(TOOLS) auto/osdef.h auto/pathdef.c auto/if_perl.c
-       -rm -f conftest* *~ auto/link.sed
-       -rm -rf $(APPDIR)
-+      -rm -rf mzscheme_base.c
-       if test -d $(PODIR); then \
-               cd $(PODIR); $(MAKE) prefix=$(DESTDIR)$(prefix) clean; \
-       fi
- # Make a shadow directory for compilation on another system or with different
-@@ -2270,16 +2286,16 @@ depend:
-               sed -e 's+^\([^ ]*\.o\)+objects/\1+' >> tmp_make; done
-       mv tmp_make Makefile
- # Run lint.  Clean up the *.ln files that are sometimes left behind.
- lint:
--      lint $(LINT_OPTIONS) $(LINT_CFLAGS) $(LINT_EXTRA) $(LINT_SRC)
-+      $(LINT) $(LINT_OPTIONS) $(LINT_CFLAGS) $(LINT_EXTRA) $(LINT_SRC)
-       -rm -f *.ln
- # Check dosinst.c with lint.
- lintinstall:
--      lint $(LINT_OPTIONS) -DWIN32 -DUNIX_LINT dosinst.c
-+      $(LINT) $(LINT_OPTIONS) -DWIN32 -DUNIX_LINT dosinst.c
-       -rm -f dosinst.ln
- ###########################################################################
- .c.o:
-@@ -2418,21 +2434,24 @@ objects/if_cscope.o: if_cscope.c
-       $(CCC) -o $@ if_cscope.c
- objects/if_xcmdsrv.o: if_xcmdsrv.c
-       $(CCC) -o $@ if_xcmdsrv.c
--objects/if_mzsch.o: if_mzsch.c
--      $(CCC) -o $@ if_mzsch.c
-+objects/if_mzsch.o: if_mzsch.c $(MZSCHEME_EXTRA)
-+      $(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c
-+
-+mzscheme_base.c:
-+      $(MZSCHEME_MZC) --c-mods mzscheme_base.c ++lib scheme/base
- objects/if_perl.o: auto/if_perl.c
-       $(CCC) -o $@ auto/if_perl.c
- objects/if_perlsfio.o: if_perlsfio.c
-       $(CCC) -o $@ if_perlsfio.c
- objects/if_python.o: if_python.c
--      $(CCC) -o $@ if_python.c
-+      $(CCC) -o $@ $(PYTHON_CFLAGS_EXTRA) if_python.c
- objects/if_ruby.o: if_ruby.c
-       $(CCC) -o $@ if_ruby.c
- objects/if_sniff.o: if_sniff.c
---- vim72.orig/src/charset.c
-+++ vim72/src/charset.c
-@@ -15,11 +15,11 @@ static int win_chartabsize __ARGS((win_T
- #ifdef FEAT_MBYTE
- static int win_nolbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp));
+-                          },
++                          SCRIPTID_INIT},
+     {"bufhidden",   "bh",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB,
+ #if defined(FEAT_QUICKFIX)
+                           (char_u *)&p_bh, PV_BH,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
--static int nr2hex __ARGS((int c));
-+static unsigned nr2hex __ARGS((unsigned c));
- static int    chartab_initialized = FALSE;
- /* b_chartab[] is an array of 32 bytes, each bit representing one of the
-  * characters 0-255. */
-@@ -172,21 +172,31 @@ buf_init_chartab(buf, global)
-               ++p;
-           }
-           if (VIM_ISDIGIT(*p))
-               c = getdigits(&p);
-           else
-+#ifdef FEAT_MBYTE
-+               if (has_mbyte)
-+              c = mb_ptr2char_adv(&p);
-+          else
-+#endif
-               c = *p++;
-           c2 = -1;
-           if (*p == '-' && p[1] != NUL)
-           {
-               ++p;
-               if (VIM_ISDIGIT(*p))
-                   c2 = getdigits(&p);
-               else
-+#ifdef FEAT_MBYTE
-+                   if (has_mbyte)
-+                  c2 = mb_ptr2char_adv(&p);
-+              else
-+#endif
-                   c2 = *p++;
-           }
--          if (c <= 0 || (c2 < c && c2 != -1) || c2 >= 256
-+          if (c <= 0 || c >= 256 || (c2 < c && c2 != -1) || c2 >= 256
-                                                || !(*p == NUL || *p == ','))
-               return FAIL;
-           if (c2 == -1)       /* not a range */
-           {
-@@ -662,23 +672,23 @@ transchar_hex(buf, c)
-       buf[++i] = nr2hex((unsigned)c >> 12);
-       buf[++i] = nr2hex((unsigned)c >> 8);
-     }
+-                          },
++                          SCRIPTID_INIT},
+     {"buflisted",   "bl",   P_BOOL|P_VI_DEF|P_NOGLOB,
+                           (char_u *)&p_bl, PV_BL,
+                           {(char_u *)1L, (char_u *)0L}
+-                          },
++                          SCRIPTID_INIT},
+     {"buftype",           "bt",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB,
+ #if defined(FEAT_QUICKFIX)
+                           (char_u *)&p_bt, PV_BT,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-     buf[++i] = nr2hex((unsigned)c >> 4);
--    buf[++i] = nr2hex(c);
-+    buf[++i] = nr2hex((unsigned)c);
-     buf[++i] = '>';
-     buf[++i] = NUL;
- }
- /*
-  * Convert the lower 4 bits of byte "c" to its hex character.
-  * Lower case letters are used to avoid the confusion of <F1> being 0xf1 or
-  * function key 1.
-  */
--    static int
-+    static unsigned
- nr2hex(c)
--    int               c;
-+    unsigned  c;
- {
-     if ((c & 0xf) <= 9)
-       return (c & 0xf) + '0';
-     return (c & 0xf) - 10 + 'a';
- }
-@@ -882,11 +892,11 @@ vim_iswordc(c)
- {
+-                          },
++                          SCRIPTID_INIT},
+     {"casemap",           "cmp",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
  #ifdef FEAT_MBYTE
-     if (c >= 0x100)
-     {
-       if (enc_dbcs != 0)
--          return dbcs_class((unsigned)c >> 8, c & 0xff) >= 2;
-+          return dbcs_class((unsigned)c >> 8, (unsigned)(c & 0xff)) >= 2;
-       if (enc_utf8)
-           return utf_class(c) >= 2;
-     }
+                           (char_u *)&p_cmp, PV_NONE,
+                           {(char_u *)"internal,keepascii", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-     return (c > 0 && c < 0x100 && GET_CHARTAB(curbuf, c) != 0);
-@@ -1024,17 +1034,16 @@ lbr_chartabsize_adv(s, col)
-  *
-  * If "headp" not NULL, set *headp to the size of what we for 'showbreak'
-  * string at start of line.  Warning: *headp is only set if it's a non-zero
-  * value, init to 0 before calling.
-  */
--/*ARGSUSED*/
-     int
- win_lbr_chartabsize(wp, s, col, headp)
-     win_T     *wp;
-     char_u    *s;
-     colnr_T   col;
--    int               *headp;
-+    int               *headp UNUSED;
- {
- #ifdef FEAT_LINEBREAK
-     int               c;
-     int               size;
-     colnr_T   col2;
-@@ -1088,11 +1097,11 @@ win_lbr_chartabsize(wp, s, col, headp)
-        * Count all characters from first non-blank after a blank up to next
-        * non-blank after a blank.
-        */
-       numberextra = win_col_off(wp);
-       col2 = col;
--      colmax = W_WIDTH(wp) - numberextra;
-+      colmax = (colnr_T)(W_WIDTH(wp) - numberextra);
-       if (col >= colmax)
-       {
-           n = colmax + win_col_off2(wp);
-           if (n > 0)
-               colmax += (((col - colmax) / n) + 1) * n;
-@@ -1199,23 +1208,25 @@ win_nolbr_chartabsize(wp, s, col, headp)
-     int
- in_win_border(wp, vcol)
-     win_T     *wp;
-     colnr_T   vcol;
- {
--    colnr_T   width1;         /* width of first line (after line number) */
--    colnr_T   width2;         /* width of further lines */
-+    int               width1;         /* width of first line (after line number) */
-+    int               width2;         /* width of further lines */
- #ifdef FEAT_VERTSPLIT
-     if (wp->w_width == 0)     /* there is no border */
-       return FALSE;
+-                          },
++                          SCRIPTID_INIT},
+     {"cdpath",            "cd",   P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_SEARCHPATH
+                           (char_u *)&p_cdpath, PV_NONE,
+                           {(char_u *)",,", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-     width1 = W_WIDTH(wp) - win_col_off(wp);
--    if (vcol < width1 - 1)
-+    if ((int)vcol < width1 - 1)
-       return FALSE;
--    if (vcol == width1 - 1)
-+    if ((int)vcol == width1 - 1)
-       return TRUE;
-     width2 = width1 + win_col_off2(wp);
-+    if (width2 <= 0)
-+      return FALSE;
-     return ((vcol - width1) % width2 == width2 - 1);
- }
- #endif /* FEAT_MBYTE */
- /*
-@@ -1242,11 +1253,14 @@ getvcol(wp, pos, start, cursor, end)
-     int               ts = wp->w_buffer->b_p_ts;
-     int               c;
-     vcol = 0;
-     ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE);
--    posptr = ptr + pos->col;
-+    if (pos->col == MAXCOL)
-+      posptr = NULL;  /* continue until the NUL */
-+    else
-+      posptr = ptr + pos->col;
-     /*
-      * This function is used very often, do some speed optimizations.
-      * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop.
-      * Also use this when 'list' is set but tabs take their normal size.
-@@ -1300,11 +1314,11 @@ getvcol(wp, pos, start, cursor, end)
-               else
+-                          },
++                          SCRIPTID_INIT},
+     {"cedit",     NULL,   P_STRING,
+ #ifdef FEAT_CMDWIN
+                           (char_u *)&p_cedit, PV_NONE,
+                           {(char_u *)"", (char_u *)CTRL_F_STR}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-                   incr = CHARSIZE(c);
-           }
--          if (ptr >= posptr)  /* character at pos->col */
-+          if (posptr != NULL && ptr >= posptr) /* character at pos->col */
-               break;
-           vcol += incr;
-           mb_ptr_adv(ptr);
-       }
-@@ -1321,11 +1335,11 @@ getvcol(wp, pos, start, cursor, end)
-           {
-               incr = 1;       /* NUL at end of line only takes one column */
-               break;
-           }
--          if (ptr >= posptr)  /* character at pos->col */
-+          if (posptr != NULL && ptr >= posptr) /* character at pos->col */
-               break;
-           vcol += incr;
-           mb_ptr_adv(ptr);
-       }
-@@ -1394,17 +1408,17 @@ getvvcol(wp, pos, start, cursor, end)
-       coladd = pos->coladd;
-       endadd = 0;
- # ifdef FEAT_MBYTE
-       /* Cannot put the cursor on part of a wide character. */
-       ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE);
--      if (pos->col < STRLEN(ptr))
-+      if (pos->col < (colnr_T)STRLEN(ptr))
-       {
-           int c = (*mb_ptr2char)(ptr + pos->col);
-           if (c != TAB && vim_isprintc(c))
-           {
--              endadd = char2cells(c) - 1;
-+              endadd = (colnr_T)(char2cells(c) - 1);
-               if (coladd > endadd)    /* past end of line */
-                   endadd = 0;
-               else
-                   coladd = 0;
-           }
---- vim72.orig/src/digraph.c
-+++ vim72/src/digraph.c
-@@ -30,11 +30,11 @@ typedef struct digraph
- static int getexactdigraph __ARGS((int, int, int));
- static void printdigraph __ARGS((digr_T *));
- /* digraphs added by the user */
--static garray_T       user_digraphs = {0, 0, sizeof(digr_T), 10, NULL};
-+static garray_T       user_digraphs = {0, 0, (int)sizeof(digr_T), 10, NULL};
- /*
-  * Note: Characters marked with XX are not included literally, because some
-  * compilers cannot handle them (Amiga SAS/C is the most picky one).
-  */
-@@ -2369,14 +2369,14 @@ printdigraph(dp)
-               *p++ = ' ';
-           p += (*mb_char2bytes)(dp->result, p);
-       }
-       else
+-                          },
++                          SCRIPTID_INIT},
+     {"charconvert",  "ccv", P_STRING|P_VI_DEF|P_SECURE,
+ #if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
+                           (char_u *)&p_ccv, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
--          *p++ = dp->result;
-+          *p++ = (char_u)dp->result;
-       if (char2cells(dp->result) == 1)
-           *p++ = ' ';
--      sprintf((char *)p, " %3d", dp->result);
-+      vim_snprintf((char *)p, sizeof(buf) - (p - buf), " %3d", dp->result);
-       msg_outtrans(buf);
-     }
- }
- #endif /* FEAT_DIGRAPHS */
-@@ -2393,11 +2393,14 @@ typedef struct
- #define KMAP_MAXLEN 20            /* maximum length of "from" or "to" */
- static void keymap_unload __ARGS((void));
- /*
-- * Set up key mapping tables for the 'keymap' option
-+ * Set up key mapping tables for the 'keymap' option.
-+ * Returns NULL if OK, an error message for failure.  This only needs to be
-+ * used when setting the option, not later when the value has already been
-+ * checked.
-  */
-     char_u *
- keymap_init()
- {
-     curbuf->b_kmap_state &= ~KEYMAP_INIT;
-@@ -2410,29 +2413,33 @@ keymap_init()
-       do_cmdline_cmd((char_u *)"unlet! b:keymap_name");
-     }
-     else
-     {
-       char_u  *buf;
-+      size_t  buflen;
-       /* Source the keymap file.  It will contain a ":loadkeymap" command
-        * which will call ex_loadkeymap() below. */
--      buf = alloc((unsigned)(STRLEN(curbuf->b_p_keymap)
-+      buflen = STRLEN(curbuf->b_p_keymap)
- # ifdef FEAT_MBYTE
--                                                     + STRLEN(p_enc)
-+                                         + STRLEN(p_enc)
- # endif
--                                                     + 14));
-+                                                     + 14;
-+      buf = alloc((unsigned)buflen);
-       if (buf == NULL)
-           return e_outofmem;
- # ifdef FEAT_MBYTE
-       /* try finding "keymap/'keymap'_'encoding'.vim"  in 'runtimepath' */
--      sprintf((char *)buf, "keymap/%s_%s.vim", curbuf->b_p_keymap, p_enc);
-+      vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim",
-+                                                 curbuf->b_p_keymap, p_enc);
-       if (source_runtime(buf, FALSE) == FAIL)
- # endif
-       {
-           /* try finding "keymap/'keymap'.vim" in 'runtimepath'  */
--          sprintf((char *)buf, "keymap/%s.vim", curbuf->b_p_keymap);
-+          vim_snprintf((char *)buf, buflen, "keymap/%s.vim",
-+                                                        curbuf->b_p_keymap);
-           if (source_runtime(buf, FALSE) == FAIL)
-           {
-               vim_free(buf);
-               return (char_u *)N_("E544: Keymap file not found");
-           }
---- vim72.orig/src/os_unix.h
-+++ vim72/src/os_unix.h
-@@ -122,11 +122,11 @@
- #  define SIGPROTOARG (int, int, struct sigcontext *)
- #  define SIGDEFARG(s)        (s, sig2, scont) int s, sig2; struct sigcontext *scont;
- #  define SIGDUMMYARG 0, 0, (struct sigcontext *)0
- # else
- #  define SIGPROTOARG (int)
--#  define SIGDEFARG(s)        (s) int s;
-+#  define SIGDEFARG(s)        (s) int s UNUSED;
- #  define SIGDUMMYARG 0
- # endif
+-                          },
++                          SCRIPTID_INIT},
+     {"cindent",           "cin",  P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_CINDENT
+                           (char_u *)&p_cin, PV_CIN,
  #else
- # define SIGPROTOARG   (void)
- # define SIGDEFARG(s)  ()
-@@ -480,15 +480,10 @@ typedef struct dsc$descriptor   DESC;
- # ifdef HAVE_RENAME
- #  define mch_rename(src, dst) rename(src, dst)
- # else
- int mch_rename __ARGS((const char *src, const char *dest));
- # endif
--# ifdef VMS
--#  define mch_chdir(s) chdir(vms_fixfilename(s))
--# else
--#  define mch_chdir(s) chdir(s)
--# endif
- # ifndef VMS
- #  ifdef __MVS__
-   /* on OS390 Unix getenv() doesn't return a pointer to persistent
-    * storage -> use __getenv() */
- #   define mch_getenv(x) (char_u *)__getenv((char *)(x))
---- vim72.orig/src/proto/edit.pro
-+++ vim72/src/proto/edit.pro
-@@ -6,11 +6,11 @@ void display_dollar __ARGS((colnr_T col)
- void change_indent __ARGS((int type, int amount, int round, int replaced, int call_changed_bytes));
- void truncate_spaces __ARGS((char_u *line));
- void backspace_until_column __ARGS((int col));
- int vim_is_ctrl_x_key __ARGS((int c));
- int ins_compl_add_infercase __ARGS((char_u *str, int len, int icase, char_u *fname, int dir, int flags));
--void set_completion __ARGS((int startcol, list_T *list));
-+void set_completion __ARGS((colnr_T startcol, list_T *list));
- void ins_compl_show_pum __ARGS((void));
- char_u *find_word_start __ARGS((char_u *ptr));
- char_u *find_word_end __ARGS((char_u *ptr));
- int ins_compl_active __ARGS((void));
- int ins_compl_add_tv __ARGS((typval_T *tv, int dir));
---- vim72.orig/src/proto/spell.pro
-+++ vim72/src/proto/spell.pro
-@@ -20,7 +20,7 @@ void ex_spellinfo __ARGS((exarg_T *eap))
- void ex_spelldump __ARGS((exarg_T *eap));
- void spell_dump_compl __ARGS((buf_T *buf, char_u *pat, int ic, int *dir, int dumpflags_arg));
- char_u *spell_to_word_end __ARGS((char_u *start, buf_T *buf));
- int spell_word_start __ARGS((int startcol));
- void spell_expand_check_cap __ARGS((colnr_T col));
--int expand_spelling __ARGS((linenr_T lnum, int col, char_u *pat, char_u ***matchp));
-+int expand_spelling __ARGS((linenr_T lnum, char_u *pat, char_u ***matchp));
- /* vim: set ft=c : */
---- vim72.orig/src/ex_eval.c
-+++ vim72/src/ex_eval.c
-@@ -58,11 +58,13 @@ static char_u      *get_end_emsg __ARGS((stru
- # define THROW_ON_INTERRUPT   (!eval_to_number("$VIMNOINTTHROW"))
- # define THROW_TEST
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"cinkeys",           "cink", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_CINDENT
+                           (char_u *)&p_cink, PV_CINK,
+                           {(char_u *)"0{,0},0),:,0#,!^F,o,O,e", (char_u *)0L}
  #else
- /* Values used for the Vim release. */
- # define THROW_ON_ERROR               TRUE
-+# define THROW_ON_ERROR_TRUE
- # define THROW_ON_INTERRUPT   TRUE
-+# define THROW_ON_INTERRUPT_TRUE
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
- static void   catch_exception __ARGS((except_T *excp));
- static void   finish_exception __ARGS((except_T *excp));
- static void   discard_exception __ARGS((except_T *excp, int was_finished));
-@@ -1318,20 +1320,24 @@ do_throw(cstack)
-      * if a previous error or interrupt has not been converted to an exception,
-      * inactivate the try conditional, too, as if the conversion had been done,
-      * and reset the did_emsg or got_int flag, so this won't happen again at
-      * the next surrounding try conditional.
-      */
-+#ifndef THROW_ON_ERROR_TRUE
-     if (did_emsg && !THROW_ON_ERROR)
-     {
-       inactivate_try = TRUE;
-       did_emsg = FALSE;
-     }
-+#endif
-+#ifndef THROW_ON_INTERRUPT_TRUE
-     if (got_int && !THROW_ON_INTERRUPT)
-     {
-       inactivate_try = TRUE;
-       got_int = FALSE;
-     }
-+#endif
-     idx = cleanup_conditionals(cstack, 0, inactivate_try);
-     if (idx >= 0)
-     {
-       /*
-        * If this try conditional is active and we are before its first
-@@ -2252,14 +2258,13 @@ rewind_conditionals(cstack, idx, cond_ty
- }
- /*
-  * ":endfunction" when not after a ":function"
-  */
--/*ARGSUSED*/
-     void
- ex_endfunction(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     EMSG(_("E193: :endfunction not inside a function"));
- }
- /*
---- vim72.orig/src/farsi.c
-+++ vim72/src/farsi.c
-@@ -101,11 +101,12 @@ toF_Xor_X_(c)
-       case IE_:
-               return _IE;
-       case F_HE:
-               tempc = _HE;
--              if (p_ri && (curwin->w_cursor.col+1 < STRLEN(ml_get_curline())))
-+              if (p_ri && (curwin->w_cursor.col + 1
-+                                       < (colnr_T)STRLEN(ml_get_curline())))
-               {
-                   inc_cursor();
-                   if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-                       tempc = _HE_;
-@@ -342,11 +343,11 @@ put_curr_and_l_to_X(c)
-     int       tempc;
-     if (curwin->w_p_rl && p_ri)
-       return;
--    if ( (curwin->w_cursor.col < STRLEN(ml_get_curline())))
-+    if ((curwin->w_cursor.col < (colnr_T)STRLEN(ml_get_curline())))
-     {
-       if ((p_ri && curwin->w_cursor.col) || !p_ri)
-       {
-           if (p_ri)
-               dec_cursor();
-@@ -563,11 +564,11 @@ chg_c_to_X_or_X ()
- {
-     int       tempc;
-     tempc = gchar_cursor();
--    if (curwin->w_cursor.col+1 < STRLEN(ml_get_curline()))
-+    if (curwin->w_cursor.col + 1 < (colnr_T)STRLEN(ml_get_curline()))
-     {
-       inc_cursor();
-       if ((tempc == F_HE) && (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)))
-       {
-@@ -592,12 +593,12 @@ chg_c_to_X_or_X ()
-     static void
- chg_l_to_X_orX_ ()
- {
-     int       tempc;
--    if (!curwin->w_cursor.col &&
--      (curwin->w_cursor.col+1 == STRLEN(ml_get_curline())))
-+    if (curwin->w_cursor.col != 0 &&
-+      (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
-       return;
-     if (!curwin->w_cursor.col && p_ri)
-       return;
-@@ -661,12 +662,12 @@ chg_l_to_X_orX_ ()
-     static void
- chg_l_toXor_X ()
- {
-     int       tempc;
--    if (!curwin->w_cursor.col &&
--      (curwin->w_cursor.col+1 == STRLEN(ml_get_curline())))
-+    if (curwin->w_cursor.col != 0 &&
-+      (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
-       return;
-     if (!curwin->w_cursor.col && p_ri)
-       return;
---- vim72.orig/src/hardcopy.c
-+++ vim72/src/hardcopy.c
-@@ -440,16 +440,15 @@ prt_get_unit(idx)
- }
- /*
-  * Print the page header.
-  */
--/*ARGSUSED*/
-     static void
- prt_header(psettings, pagenum, lnum)
-     prt_settings_T  *psettings;
-     int               pagenum;
--    linenr_T  lnum;
-+    linenr_T  lnum UNUSED;
- {
-     int               width = psettings->chars_per_line;
-     int               page_line;
-     char_u    *tbuf;
-     char_u    *p;
-@@ -1879,11 +1878,11 @@ prt_next_dsc(p_dsc_line)
-     /* DSC comments always start %% */
-     if (prt_resfile_strncmp(0, "%%", 2) != 0)
-       return FALSE;
-     /* Find type of DSC comment */
--    for (comment = 0; comment < NUM_ELEMENTS(prt_dsc_table); comment++)
-+    for (comment = 0; comment < (int)NUM_ELEMENTS(prt_dsc_table); comment++)
-       if (prt_resfile_strncmp(0, prt_dsc_table[comment].string,
-                                           prt_dsc_table[comment].len) == 0)
-           break;
-     if (comment != NUM_ELEMENTS(prt_dsc_table))
-@@ -2452,16 +2451,15 @@ prt_match_charset(p_charset, p_cmap, pp_
-     }
-     return FALSE;
- }
+-                          },
++                          SCRIPTID_INIT},
+     {"cinoptions",  "cino", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_CINDENT
+                           (char_u *)&p_cino, PV_CINO,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
--/*ARGSUSED*/
-     int
- mch_print_init(psettings, jobname, forceit)
-     prt_settings_T *psettings;
-     char_u    *jobname;
--    int               forceit;
-+    int               forceit UNUSED;
- {
-     int               i;
-     char      *paper_name;
-     int               paper_strlen;
-     int               fontsize;
-@@ -2512,11 +2510,11 @@ mch_print_init(psettings, jobname, force
-     p_mbenc = NULL;
-     props = enc_canon_props(p_encoding);
-     if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE)))
-     {
-       p_mbenc_first = NULL;
--      for (cmap = 0; cmap < NUM_ELEMENTS(prt_ps_mbfonts); cmap++)
-+      for (cmap = 0; cmap < (int)NUM_ELEMENTS(prt_ps_mbfonts); cmap++)
-           if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap],
-                                                                   &p_mbenc))
-           {
-               if (p_mbenc_first == NULL)
-                   p_mbenc_first = p_mbenc;
-@@ -2640,11 +2638,11 @@ mch_print_init(psettings, jobname, force
-     else
-     {
-       paper_name = "A4";
-       paper_strlen = 2;
-     }
--    for (i = 0; i < PRT_MEDIASIZE_LEN; ++i)
-+    for (i = 0; i < (int)PRT_MEDIASIZE_LEN; ++i)
-       if (STRLEN(prt_mediasize[i].name) == (unsigned)paper_strlen
-               && STRNICMP(prt_mediasize[i].name, paper_name,
-                                                          paper_strlen) == 0)
-           break;
-     if (i == PRT_MEDIASIZE_LEN)
-@@ -3306,14 +3304,13 @@ mch_print_end_page()
-     prt_dsc_noarg("PageTrailer");
-     return !prt_file_error;
- }
--/*ARGSUSED*/
-     int
- mch_print_begin_page(str)
--    char_u    *str;
-+    char_u    *str UNUSED;
- {
-     int               page_num[2];
-     prt_page_num++;
-@@ -3377,15 +3374,14 @@ mch_print_start_line(margin, page_line)
- #ifdef FEAT_MBYTE
-     prt_half_width = FALSE;
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"cinwords",    "cinw", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+ #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
+                           (char_u *)&p_cinw, PV_CINW,
+                           {(char_u *)"if,else,while,do,for,switch",
+                               (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
- }
--/*ARGSUSED*/
-     int
- mch_print_text_out(p, len)
-     char_u    *p;
--    int               len;
-+    int               len UNUSED;
- {
-     int               need_break;
-     char_u    ch;
-     char_u      ch_buff[8];
-     float       char_width;
---- vim72.orig/src/syntax.c
-+++ vim72/src/syntax.c
-@@ -204,11 +204,11 @@ typedef struct syn_pattern
-  * The attributes of the syntax item that has been recognized.
-  */
- static int current_attr = 0;      /* attr of current syntax word */
- #ifdef FEAT_EVAL
- static int current_id = 0;        /* ID of current char for syn_get_id() */
--static int current_trans_id = 0;    /* idem, transparancy removed */
-+static int current_trans_id = 0;    /* idem, transparency removed */
+-                          },
++                          SCRIPTID_INIT},
+     {"clipboard",   "cb",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_CLIPBOARD
+                           (char_u *)&p_cb, PV_NONE,
+ # ifdef FEAT_XCLIPBOARD
+                           {(char_u *)"autoselect,exclude:cons\\|linux",
+@@ -741,435 +745,440 @@ static struct vimoption
+ # endif
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
  #endif
- typedef struct syn_cluster_S
- {
-     char_u        *scl_name;      /* syntax cluster name */
-@@ -280,11 +280,11 @@ static int keepend_level = -1;
- typedef struct state_item
- {
-     int               si_idx;                 /* index of syntax pattern or
-                                          KEYWORD_IDX */
-     int               si_id;                  /* highlight group ID for keywords */
--    int               si_trans_id;            /* idem, transparancy removed */
-+    int               si_trans_id;            /* idem, transparency removed */
-     int               si_m_lnum;              /* lnum of the match */
-     int               si_m_startcol;          /* starting column of the match */
-     lpos_T    si_m_endpos;            /* just after end posn of the match */
-     lpos_T    si_h_startpos;          /* start position of the highlighting */
-     lpos_T    si_h_endpos;            /* end position of the highlighting */
-@@ -1272,11 +1272,11 @@ syn_stack_cleanup()
-       dist = 999999;
-     else
-       dist = syn_buf->b_ml.ml_line_count / (syn_buf->b_sst_len - Rows) + 1;
-     /*
--     * Go throught the list to find the "tick" for the oldest entry that can
-+     * Go through the list to find the "tick" for the oldest entry that can
-      * be removed.  Set "above" when the "tick" for the oldest entry is above
-      * "b_sst_lasttick" (the display tick wraps around).
-      */
-     tick = syn_buf->b_sst_lasttick;
-     above = FALSE;
-@@ -2317,11 +2317,11 @@ syn_current_attr(syncing, displaying, ca
-        * ":syn spell toplevel" was used. */
-       *can_spell = syn_buf->b_syn_spell == SYNSPL_DEFAULT
-                   ? (syn_buf->b_spell_cluster_id == 0)
-                   : (syn_buf->b_syn_spell == SYNSPL_TOP);
--    /* nextgroup ends at end of line, unless "skipnl" or "skipemtpy" present */
-+    /* nextgroup ends at end of line, unless "skipnl" or "skipempty" present */
-     if (current_next_list != NULL
-           && syn_getcurline()[current_col + 1] == NUL
-           && !(current_next_flags & (HL_SKIPNL | HL_SKIPEMPTY)))
-       current_next_list = NULL;
-@@ -3084,10 +3084,16 @@ syn_add_start_off(result, regmatch, spp,
-     {
-       result->lnum = regmatch->startpos[0].lnum;
-       col = regmatch->startpos[0].col;
-       off = spp->sp_offsets[idx];
-     }
-+    if (result->lnum > syn_buf->b_ml.ml_line_count)
-+    {
-+      /* a "\n" at the end of the pattern may take us below the last line */
-+      result->lnum = syn_buf->b_ml.ml_line_count;
-+      col = (int)STRLEN(ml_get_buf(syn_buf, result->lnum, FALSE));
-+    }
-     if (off != 0)
-     {
-       base = ml_get_buf(syn_buf, result->lnum, FALSE);
-       p = base + col;
-       if (off > 0)
-@@ -3222,15 +3228,14 @@ check_keyword_id(line, startcol, endcolp
- }
- /*
-  * Handle ":syntax case" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_case(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;            /* not used */
-+    int               syncing UNUSED;
- {
-     char_u    *arg = eap->arg;
-     char_u    *next;
-     eap->nextcmd = find_nextcmd(arg);
-@@ -3247,15 +3252,14 @@ syn_cmd_case(eap, syncing)
- }
- /*
-  * Handle ":syntax spell" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_spell(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;            /* not used */
-+    int               syncing UNUSED;
- {
-     char_u    *arg = eap->arg;
-     char_u    *next;
-     eap->nextcmd = find_nextcmd(arg);
-@@ -3515,41 +3519,38 @@ syn_clear_one(id, syncing)
- }
- /*
-  * Handle ":syntax on" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_on(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;        /* not used */
-+    int               syncing UNUSED;
- {
-     syn_cmd_onoff(eap, "syntax");
- }
- /*
-  * Handle ":syntax enable" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_enable(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;        /* not used */
-+    int               syncing UNUSED;
- {
-     set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"enable");
-     syn_cmd_onoff(eap, "syntax");
-     do_unlet((char_u *)"g:syntax_cmd", TRUE);
- }
- /*
-  * Handle ":syntax reset" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_reset(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;        /* not used */
-+    int               syncing UNUSED;
- {
-     eap->nextcmd = check_nextcmd(eap->arg);
-     if (!eap->skip)
-     {
-       set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"reset");
-@@ -3559,27 +3560,25 @@ syn_cmd_reset(eap, syncing)
- }
- /*
-  * Handle ":syntax manual" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_manual(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;        /* not used */
-+    int               syncing UNUSED;
- {
-     syn_cmd_onoff(eap, "manual");
- }
- /*
-  * Handle ":syntax off" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_off(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;        /* not used */
-+    int               syncing UNUSED;
- {
-     syn_cmd_onoff(eap, "nosyntax");
- }
-     static void
-@@ -4172,11 +4171,10 @@ clear_keywtab(ht)
-     for (hi = ht->ht_array; todo > 0; ++hi)
-     {
-       if (!HASHITEM_EMPTY(hi))
-       {
-           --todo;
--          kp = HI2KE(hi);
-           for (kp = HI2KE(hi); kp != NULL; kp = kp_next)
-           {
-               kp_next = kp->ke_next;
-               vim_free(kp->next_list);
-               vim_free(kp->k_syn.cont_in_list);
-@@ -4459,15 +4457,14 @@ syn_incl_toplevel(id, flagsp)
- }
- /*
-  * Handle ":syntax include [@{group-name}] filename" command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_include(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;            /* not used */
-+    int               syncing UNUSED;
- {
-     char_u    *arg = eap->arg;
-     int               sgl_id = 1;
-     char_u    *group_name_end;
-     char_u    *rest;
-@@ -4530,15 +4527,14 @@ syn_cmd_include(eap, syncing)
- }
- /*
-  * Handle ":syntax keyword {group-name} [{option}] keyword .." command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_keyword(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;            /* not used */
-+    int               syncing UNUSED;
- {
-     char_u    *arg = eap->arg;
-     char_u    *group_name_end;
-     int               syn_id;
-     char_u    *rest;
-@@ -5273,15 +5269,14 @@ syn_add_cluster(name)
- /*
-  * Handle ":syntax cluster {cluster-name} [contains={groupname},..]
-  *            [add={groupname},..] [remove={groupname},..]".
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_cluster(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;            /* not used */
-+    int               syncing UNUSED;
- {
-     char_u    *arg = eap->arg;
-     char_u    *group_name_end;
-     char_u    *rest;
-     int               scl_id;
-@@ -5462,15 +5457,14 @@ get_syn_pattern(arg, ci)
- }
- /*
-  * Handle ":syntax sync .." command.
-  */
--/* ARGSUSED */
-     static void
- syn_cmd_sync(eap, syncing)
-     exarg_T   *eap;
--    int               syncing;            /* not used */
-+    int               syncing UNUSED;
- {
-     char_u    *arg_start = eap->arg;
-     char_u    *arg_end;
-     char_u    *key = NULL;
-     char_u    *next_arg;
-@@ -6097,14 +6091,13 @@ static char *(case_args[]) = {"match", "
- /*
-  * Function given to ExpandGeneric() to obtain the list syntax names for
-  * expansion.
-  */
--/*ARGSUSED*/
-     char_u *
- get_syntax_name(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
- {
-     if (expand_what == EXP_SUBCMD)
-       return (char_u *)subcommands[idx].name;
-     return (char_u *)case_args[idx];
-@@ -6118,11 +6111,11 @@ get_syntax_name(xp, idx)
-     int
- syn_get_id(wp, lnum, col, trans, spellp, keep_state)
-     win_T     *wp;
-     long      lnum;
-     colnr_T   col;
--    int               trans;       /* remove transparancy */
-+    int               trans;       /* remove transparency */
-     int               *spellp;     /* return: can do spell checking */
-     int               keep_state;  /* keep state of char at "col" */
- {
-     /* When the position is not after the current position and in the same
-      * line of the same buffer, need to restart parsing. */
-@@ -7533,11 +7526,11 @@ highlight_clear(idx)
- }
- #if defined(FEAT_GUI) || defined(PROTO)
- /*
-  * Set the normal foreground and background colors according to the "Normal"
-- * highlighighting group.  For X11 also set "Menu", "Scrollbar", and
-+ * highlighting group.  For X11 also set "Menu", "Scrollbar", and
-  * "Tooltip" colors.
-  */
-     void
- set_normal_colors()
- {
-@@ -7742,18 +7735,17 @@ fontset_name2handle(name, fixed_width)
- # endif
- /*
-  * Get the font or fontset for one highlight group.
-  */
--/*ARGSUSED*/
-     static void
- hl_do_font(idx, arg, do_normal, do_menu, do_tooltip)
-     int               idx;
-     char_u    *arg;
--    int               do_normal;      /* set normal font */
--    int               do_menu;        /* set menu font */
--    int               do_tooltip;     /* set tooltip font */
-+    int               do_normal;              /* set normal font */
-+    int               do_menu UNUSED;         /* set menu font */
-+    int               do_tooltip UNUSED;      /* set tooltip font */
- {
- # ifdef FEAT_XFONTSET
-     /* If 'guifontset' is not empty, first try using the name as a
-      * fontset.  If that doesn't work, use it as a font name. */
-     if (*p_guifontset != NUL
-@@ -8332,32 +8324,42 @@ highlight_has_attr(id, flag, modec)
-  * Return color name of highlight group "id".
-  */
-     char_u *
- highlight_color(id, what, modec)
-     int               id;
--    char_u    *what;  /* "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
-+    char_u    *what;  /* "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
-     int               modec;  /* 'g' for GUI, 'c' for cterm, 't' for term */
- {
-     static char_u     name[20];
-     int                       n;
-     int                       fg = FALSE;
- # ifdef FEAT_GUI
-     int                       sp = FALSE;
-+    int                       font = FALSE;
- # endif
-     if (id <= 0 || id > highlight_ga.ga_len)
-       return NULL;
--    if (TOLOWER_ASC(what[0]) == 'f')
-+    if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'g')
-       fg = TRUE;
- # ifdef FEAT_GUI
--    else if (TOLOWER_ASC(what[0]) == 's')
-+    else if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'o'
-+             && TOLOWER_ASC(what[2]) == 'n' && TOLOWER_ASC(what[3]) == 't')
-+      font = TRUE;
-+    else if (TOLOWER_ASC(what[0]) == 's' && TOLOWER_ASC(what[1]) == 'p')
-       sp = TRUE;
-+    else if (!(TOLOWER_ASC(what[0]) == 'b' && TOLOWER_ASC(what[1]) == 'g'))
-+      return NULL;
-     if (modec == 'g')
-     {
-+      /* return font name */
-+      if (font)
-+          return HL_TABLE()[id - 1].sg_font_name;
-+
-       /* return #RRGGBB form (only possible when GUI is running) */
--      if (gui.in_use && what[1] && what[2] == '#')
-+      if (gui.in_use && what[2] == '#')
-       {
-           guicolor_T          color;
-           long_u              rgb;
-           static char_u       buf[10];
-@@ -8380,10 +8382,12 @@ highlight_color(id, what, modec)
-           return (HL_TABLE()[id - 1].sg_gui_fg_name);
-       if (sp)
-           return (HL_TABLE()[id - 1].sg_gui_sp_name);
-       return (HL_TABLE()[id - 1].sg_gui_bg_name);
-     }
-+    if (font || sp)
-+      return NULL;
- # endif
-     if (modec == 'c')
-     {
-       if (fg)
-           n = HL_TABLE()[id - 1].sg_cterm_fg - 1;
-@@ -8658,10 +8662,11 @@ syn_add_group(name)
-     for (p = name; *p != NUL; ++p)
-     {
-       if (!vim_isprintc(*p))
-       {
-           EMSG(_("E669: Unprintable character in group name"));
-+          vim_free(name);
-           return 0;
-       }
-       else if (!ASCII_ISALNUM(*p) && *p != '_')
-       {
-           /* This is an error, but since there previously was no check only
-@@ -9148,14 +9153,13 @@ highlight_list_two(cnt, attr)
-     || defined(FEAT_SIGNS) || defined(PROTO)
- /*
-  * Function given to ExpandGeneric() to obtain the list of group names.
-  * Also used for synIDattr() function.
-  */
--/*ARGSUSED*/
-     char_u *
- get_highlight_name(xp, idx)
--    expand_T  *xp;
-+    expand_T  *xp UNUSED;
-     int               idx;
- {
- #ifdef FEAT_CMDL_COMPL
-     if (idx == highlight_ga.ga_len && include_none != 0)
-       return (char_u *)"none";
---- vim72.orig/src/gui_gtk.c
-+++ vim72/src/gui_gtk.c
-@@ -283,18 +283,18 @@ create_menu_icon(vimmenu_T *menu, GtkIco
-     }
-     return image;
- }
--/*ARGSUSED*/
-     static gint
--toolbar_button_focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
--{
--    /* When we're in a GtkPlug, we don't have window focus events, only widget focus.
--     * To emulate stand-alone gvim, if a button gets focus (e.g., <Tab> into GtkPlug)
--     * immediately pass it to mainwin.
--     */
-+toolbar_button_focus_in_event(GtkWidget *widget UNUSED,
-+                            GdkEventFocus *event UNUSED,
-+                            gpointer data UNUSED)
-+{
-+    /* When we're in a GtkPlug, we don't have window focus events, only widget
-+     * focus.  To emulate stand-alone gvim, if a button gets focus (e.g.,
-+     * <Tab> into GtkPlug) immediately pass it to mainwin. */
-     if (gtk_socket_id != 0)
-       gtk_widget_grab_focus(gui.drawarea);
-     return TRUE;
- }
-@@ -583,13 +583,12 @@ gui_mch_add_menu(vimmenu_T *menu, int id
-     if (vim_strchr(p_go, GO_TEAROFF) != NULL)
-       gtk_widget_show(menu->tearoff_handle);
-     gtk_menu_prepend(GTK_MENU(menu->submenu_id), menu->tearoff_handle);
- }
--/*ARGSUSED*/
-     static void
--menu_item_activate(GtkWidget *widget, gpointer data)
-+menu_item_activate(GtkWidget *widget UNUSED, gpointer data)
- {
-     gui_menu_cb((vimmenu_T *)data);
- # ifndef HAVE_GTK2
-     /* Work around a bug in GTK+ 1: we don't seem to get a focus-in
-@@ -1200,13 +1199,12 @@ gui_mch_destroy_scrollbar(scrollbar_T *s
-  * on just about any event. */
- /* # define USE_FILE_CHOOSER */
- #endif
- #ifndef USE_FILE_CHOOSER
--/*ARGSUSED*/
-     static void
--browse_ok_cb(GtkWidget *widget, gpointer cbdata)
-+browse_ok_cb(GtkWidget *widget UNUSED, gpointer cbdata)
- {
-     gui_T *vw = (gui_T *)cbdata;
-     if (vw->browse_fname != NULL)
-       g_free(vw->browse_fname);
-@@ -1216,13 +1214,12 @@ browse_ok_cb(GtkWidget *widget, gpointer
-     gtk_widget_hide(vw->filedlg);
-     if (gtk_main_level() > 0)
-       gtk_main_quit();
- }
--/*ARGSUSED*/
-     static void
--browse_cancel_cb(GtkWidget *widget, gpointer cbdata)
-+browse_cancel_cb(GtkWidget *widget UNUSED, gpointer cbdata)
- {
-     gui_T *vw = (gui_T *)cbdata;
-     if (vw->browse_fname != NULL)
-     {
-@@ -1232,13 +1229,12 @@ browse_cancel_cb(GtkWidget *widget, gpoi
-     gtk_widget_hide(vw->filedlg);
-     if (gtk_main_level() > 0)
-       gtk_main_quit();
- }
--/*ARGSUSED*/
-     static gboolean
--browse_destroy_cb(GtkWidget * widget)
-+browse_destroy_cb(GtkWidget *widget UNUSED)
- {
-     if (gui.browse_fname != NULL)
-     {
-       g_free(gui.browse_fname);
-       gui.browse_fname = NULL;
-@@ -1260,18 +1256,17 @@ browse_destroy_cb(GtkWidget * widget)
-  * dflt                               default name
-  * ext                                not used (extension added)
-  * initdir                    initial directory, NULL for current dir
-  * filter                     not used (file name filter)
-  */
--/*ARGSUSED*/
-     char_u *
--gui_mch_browse(int saving,
-+gui_mch_browse(int saving UNUSED,
-              char_u *title,
-              char_u *dflt,
--             char_u *ext,
-+             char_u *ext UNUSED,
-              char_u *initdir,
--             char_u *filter)
-+             char_u *filter UNUSED)
- {
- #ifdef USE_FILE_CHOOSER
-     GtkWidget         *fc;
+-                          },
++                          SCRIPTID_INIT},
+     {"cmdheight",   "ch",   P_NUM|P_VI_DEF|P_RALL,
+                           (char_u *)&p_ch, PV_NONE,
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"cmdwinheight", "cwh", P_NUM|P_VI_DEF,
+ #ifdef FEAT_CMDWIN
+                           (char_u *)&p_cwh, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-     char_u            dirbuf[MAXPATHL];
-@@ -1375,11 +1370,10 @@ gui_mch_browse(int saving,
-  * Returns the selected name in allocated memory, or NULL for Cancel.
-  * title                      title for the window
-  * dflt                               default name
-  * initdir                    initial directory, NULL for current dir
-  */
--/*ARGSUSED*/
-     char_u *
- gui_mch_browsedir(
-              char_u *title,
-              char_u *initdir)
- {
-@@ -1458,11 +1452,10 @@ dlg_destroy(GtkWidget *dlg)
-     /* Destroy the dialog, will break the waiting loop. */
-     gtk_widget_destroy(dlg);
- }
- # ifdef FEAT_GUI_GNOME
--/* ARGSUSED */
-     static int
- gui_gnome_dialog( int type,
-               char_u  *title,
-               char_u  *message,
-               char_u  *buttons,
-@@ -1609,22 +1602,20 @@ typedef struct _CancelData
-     int               *status;
-     int               ignore_enter;
-     GtkWidget *dialog;
- } CancelData;
--/* ARGSUSED */
-     static void
- dlg_button_clicked(GtkWidget * widget, ButtonData *data)
- {
-     *(data->status) = data->index + 1;
-     dlg_destroy(data->dialog);
- }
- /*
-  * This makes the Escape key equivalent to the cancel button.
-  */
--/*ARGSUSED*/
-     static int
- dlg_key_press_event(GtkWidget *widget, GdkEventKey *event, CancelData *data)
- {
-     /* Ignore hitting Enter (or Space) when there is no default button. */
-     if (data->ignore_enter && (event->keyval == GDK_Return
-@@ -1653,11 +1644,10 @@ dlg_destroy_cb(int *p)
-     *p = TRUE;                /* set dialog_destroyed to break out of the loop */
-     if (gtk_main_level() > 0)
-       gtk_main_quit();
- }
--/* ARGSUSED */
-     int
- gui_mch_dialog(       int     type,           /* type of dialog */
-               char_u  *title,         /* title of dialog */
-               char_u  *message,       /* message text */
-               char_u  *buttons,       /* names of buttons */
-@@ -2213,11 +2203,10 @@ typedef struct _DialogInfo
-     int               ignore_enter;       /* no default button, ignore "Enter" */
-     int               noalt;              /* accept accelerators without Alt */
-     GtkDialog *dialog;            /* Widget of the dialog */
- } DialogInfo;
--/*ARGSUSED2*/
-     static gboolean
- dialog_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
- {
-     DialogInfo *di = (DialogInfo *)data;
-@@ -2322,23 +2311,10 @@ gui_mch_dialog(int     type,       /* type of
-           CONVERT_FROM_UTF8_FREE(text);
-       }
-       gtk_widget_destroy(dialog);
-     }
--    /* Terrible hack: When the text area still has focus when we remove the
--     * dialog, somehow gvim loses window focus.  This is with "point to type"
--     * in the KDE 3.1 window manager.  Warp the mouse pointer to outside the
--     * window and back to avoid that. */
--    if (!gui.in_focus)
--    {
--      int x, y;
--
--      gdk_window_get_pointer(gui.drawarea->window, &x, &y, NULL);
--      gui_mch_setmouse(-100, -100);
--      gui_mch_setmouse(x, y);
--    }
--
-     return response > 0 ? response : 0;
- }
- #endif /* FEAT_GUI_DIALOG && HAVE_GTK2 */
-@@ -2396,18 +2372,17 @@ static int popup_mouse_pos;
-  * at the current text cursor position.
-  *
-  * Note: The push_in output argument seems to affect scrolling of huge
-  * menus that don't fit on the screen.        Leave it at the default for now.
-  */
--/*ARGSUSED0*/
-     static void
--popup_menu_position_func(GtkMenu *menu,
-+popup_menu_position_func(GtkMenu *menu UNUSED,
-                        gint *x, gint *y,
- # ifdef HAVE_GTK2
--                       gboolean *push_in,
-+                       gboolean *push_in UNUSED,
- # endif
--                       gpointer user_data)
-+                       gpointer user_data UNUSED)
- {
-     gdk_window_get_origin(gui.drawarea->window, x, y);
-     if (popup_mouse_pos)
-     {
-@@ -2462,17 +2437,16 @@ typedef struct _SharedFindReplace
-     GtkWidget *find;  /* 'Find Next' action button */
-     GtkWidget *replace;       /* 'Replace With' action button */
-     GtkWidget *all;   /* 'Replace All' action button */
- } SharedFindReplace;
--static SharedFindReplace find_widgets = { NULL, };
--static SharedFindReplace repl_widgets = { NULL, };
-+static SharedFindReplace find_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
-+static SharedFindReplace repl_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
--/* ARGSUSED */
-     static int
- find_key_press_event(
--              GtkWidget       *widget,
-+              GtkWidget       *widget UNUSED,
-               GdkEventKey     *event,
-               SharedFindReplace *frdp)
- {
-     /* If the user is holding one of the key modifiers we will just bail out,
-      * thus preserving the possibility of normal focus traversal.
-@@ -2960,13 +2934,12 @@ gui_gtk_synch_fonts(void)
- /*
-  * Callback for actions of the find and replace dialogs
-  */
--/*ARGSUSED*/
-     static void
--find_replace_cb(GtkWidget *widget, gpointer data)
-+find_replace_cb(GtkWidget *widget UNUSED, gpointer data)
- {
-     int                       flags;
-     char_u            *find_text;
-     char_u            *repl_text;
-     gboolean          direction_down;
-@@ -3008,13 +2981,12 @@ find_replace_cb(GtkWidget *widget, gpoin
-     if (rc && gtk_main_level() > 0)
-       gtk_main_quit(); /* make sure cmd will be handled immediately */
- }
- /* our usual callback function */
--/*ARGSUSED*/
-     static void
--entry_activate_cb(GtkWidget *widget, gpointer data)
-+entry_activate_cb(GtkWidget *widget UNUSED, gpointer data)
- {
-     gtk_widget_grab_focus(GTK_WIDGET(data));
- }
- /*
-@@ -3053,14 +3025,13 @@ entry_changed_cb(GtkWidget * entry, GtkW
- }
- /*
-  * ":helpfind"
-  */
--/*ARGSUSED*/
-     void
- ex_helpfind(eap)
--    exarg_T   *eap;
-+    exarg_T   *eap UNUSED;
- {
-     /* This will fail when menus are not loaded.  Well, it's only for
-      * backwards compatibility anyway. */
-     do_cmdline_cmd((char_u *)"emenu ToolBar.FindHelp");
- }
---- vim72.orig/src/gui_gtk_f.c
-+++ vim72/src/gui_gtk_f.c
-@@ -225,18 +225,18 @@ gtk_form_get_type(void)
- {
-     static GtkType form_type = 0;
-     if (!form_type)
-     {
--      GtkTypeInfo form_info =
--      {
--          "GtkForm",
--          sizeof(GtkForm),
--          sizeof(GtkFormClass),
--          (GtkClassInitFunc) gtk_form_class_init,
--          (GtkObjectInitFunc) gtk_form_init
--      };
-+      GtkTypeInfo form_info;
-+
-+      vim_memset(&form_info, 0, sizeof(form_info));
-+      form_info.type_name = "GtkForm";
-+      form_info.object_size = sizeof(GtkForm);
-+      form_info.class_size = sizeof(GtkFormClass);
-+      form_info.class_init_func = (GtkClassInitFunc)gtk_form_class_init;
-+      form_info.object_init_func = (GtkObjectInitFunc)gtk_form_init;
-       form_type = gtk_type_unique(GTK_TYPE_CONTAINER, &form_info);
-     }
-     return form_type;
- }
-@@ -609,14 +609,13 @@ gtk_form_remove(GtkContainer *container,
-       g_list_free_1(tmp_list);
-       g_free(child);
-     }
- }
--/*ARGSUSED1*/
-     static void
- gtk_form_forall(GtkContainer  *container,
--              gboolean        include_internals,
-+              gboolean        include_internals UNUSED,
-               GtkCallback     callback,
-               gpointer        callback_data)
- {
-     GtkForm *form;
-     GtkFormChild *child;
-@@ -784,13 +783,12 @@ gtk_form_position_children(GtkForm *form
-  * This routine identifies expose events that are generated when
-  * we've temporarily moved the bin_window_origin, and translates
-  * them or discards them, depending on whether we are obscured
-  * or not.
-  */
--/*ARGSUSED1*/
-     static GdkFilterReturn
--gtk_form_filter(GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
-+gtk_form_filter(GdkXEvent *gdk_xevent, GdkEvent *event UNUSED, gpointer data)
- {
-     XEvent *xevent;
-     GtkForm *form;
-     xevent = (XEvent *) gdk_xevent;
-@@ -819,13 +817,14 @@ gtk_form_filter(GdkXEvent *gdk_xevent, G
- /* Although GDK does have a GDK_VISIBILITY_NOTIFY event,
-  * there is no corresponding event in GTK, so we have
-  * to get the events from a filter
-  */
--/*ARGSUSED1*/
-     static GdkFilterReturn
--gtk_form_main_filter(GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
-+gtk_form_main_filter(GdkXEvent *gdk_xevent,
-+                   GdkEvent *event UNUSED,
-+                   gpointer data)
- {
-     XEvent *xevent;
-     GtkForm *form;
-     xevent = (XEvent *) gdk_xevent;
-@@ -859,15 +858,13 @@ gtk_form_main_filter(GdkXEvent *gdk_xeve
-  */
-     static void
- gtk_form_set_static_gravity(GdkWindow *window, gboolean use_static)
- {
- #ifdef HAVE_GTK2
--    gboolean static_gravity_supported;
--
--    static_gravity_supported = gdk_window_set_static_gravities(window,
--                                                             use_static);
--    g_return_if_fail(static_gravity_supported);
-+    /* We don't check if static gravity is actually supported, because it
-+     * results in an annoying assertion error message. */
-+    gdk_window_set_static_gravities(window, use_static);
+-                          {(char_u *)7L, (char_u *)0L}},
++                          {(char_u *)7L, (char_u *)0L} SCRIPTID_INIT},
+     {"columns",           "co",   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR,
+                           (char_u *)&Columns, PV_NONE,
+-                          {(char_u *)80L, (char_u *)0L}},
++                          {(char_u *)80L, (char_u *)0L} SCRIPTID_INIT},
+     {"comments",    "com",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_COMMENTS
+                           (char_u *)&p_com, PV_COM,
+                           {(char_u *)"s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-",
+                               (char_u *)0L}
  #else
-     XSetWindowAttributes xattributes;
-     xattributes.win_gravity = (use_static) ? StaticGravity : NorthWestGravity;
-     xattributes.bit_gravity = (use_static) ? StaticGravity : NorthWestGravity;
-@@ -909,25 +906,23 @@ gtk_form_send_configure(GtkForm *form)
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"commentstring", "cms", P_STRING|P_ALLOCED|P_VI_DEF,
+ #ifdef FEAT_FOLDING
+                           (char_u *)&p_cms, PV_CMS,
+                           {(char_u *)"/*%s*/", (char_u *)0L}
  #else
-     gtk_widget_event(widget, (GdkEvent*)&event);
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
- }
--/*ARGSUSED0*/
-     static void
--gtk_form_child_map(GtkWidget *widget, gpointer user_data)
-+gtk_form_child_map(GtkWidget *widget UNUSED, gpointer user_data)
- {
-     GtkFormChild *child;
-     child = (GtkFormChild *)user_data;
-     child->mapped = TRUE;
-     gdk_window_show(child->window);
- }
--/*ARGSUSED0*/
-     static void
--gtk_form_child_unmap(GtkWidget *widget, gpointer user_data)
-+gtk_form_child_unmap(GtkWidget *widget UNUSED, gpointer user_data)
- {
-     GtkFormChild *child;
-     child = (GtkFormChild *)user_data;
---- vim72.orig/src/if_mzsch.c
-+++ vim72/src/if_mzsch.c
-@@ -2,10 +2,12 @@
-  *
-  * MzScheme interface by Sergey Khorev <sergey.khorev@gmail.com>
-  * Original work by Brent Fulgham <bfulgham@debian.org>
-  * (Based on lots of help from Matthew Flatt)
-  *
-+ * TODO Convert byte-strings to char strings?
-+ *
-  * This consists of six parts:
-  * 1. MzScheme interpreter main program
-  * 2. Routines that handle the external interface between MzScheme and
-  *    Vim.
-  * 3. MzScheme input/output handlers: writes output via [e]msg().
-@@ -16,37 +18,38 @@
-  * NOTES
-  * 1. Memory, allocated with scheme_malloc*, need not to be freed explicitly,
-  *    garbage collector will do it self
-  * 2. Requires at least NORMAL features. I can't imagine why one may want
-  *    to build with SMALL or TINY features but with MzScheme interface.
-- * 3. I don't use K&R-style functions. Anyway, MzScheme headers are ANSI.
-+ * 3. I don't use K&R-style functions. Anyways, MzScheme headers are ANSI.
-  */
- #include "vim.h"
- #include "if_mzsch.h"
- /* Only do the following when the feature is enabled.  Needed for "make
-  * depend". */
- #if defined(FEAT_MZSCHEME) || defined(PROTO)
-+#include <assert.h>
-+
- /* Base data structures */
- #define SCHEME_VIMBUFFERP(obj)  SAME_TYPE(SCHEME_TYPE(obj), mz_buffer_type)
- #define SCHEME_VIMWINDOWP(obj)  SAME_TYPE(SCHEME_TYPE(obj), mz_window_type)
- typedef struct
- {
--    Scheme_Type           tag;
--    Scheme_Env            *env;
-+    Scheme_Object   so;
-     buf_T         *buf;
- } vim_mz_buffer;
- #define INVALID_BUFFER_VALUE ((buf_T *)(-1))
- typedef struct
- {
--    Scheme_Type           tag;
-+    Scheme_Object   so;
-     win_T         *win;
- } vim_mz_window;
- #define INVALID_WINDOW_VALUE ((win_T *)(-1))
-@@ -65,31 +68,10 @@ typedef struct
- {
-     char          *name;
-     Scheme_Object   *port;
- } Port_Info;
--/* info for closed prim */
--/*
-- * data have different means:
-- * for do_eval it is char*
-- * for do_apply is Apply_Onfo*
-- * for do_load is Port_Info*
-- */
--typedef struct
--{
--    void      *data;
--    Scheme_Env        *env;
--} Cmd_Info;
--
--/* info for do_apply */
--typedef struct
--{
--    Scheme_Object   *proc;
--    int                   argc;
--    Scheme_Object   **argv;
--} Apply_Info;
--
- /*
-  *========================================================================
-  *  Vim-Control Commands
-  *========================================================================
-  */
-@@ -120,11 +102,10 @@ static Scheme_Object *mzscheme_open_buff
- static Scheme_Object *set_buffer_line(void *, int, Scheme_Object **);
- static Scheme_Object *set_buffer_line_list(void *, int, Scheme_Object **);
- static Scheme_Object *insert_buffer_line_list(void *, int, Scheme_Object **);
- static Scheme_Object *get_range_start(void *, int, Scheme_Object **);
- static Scheme_Object *get_range_end(void *, int, Scheme_Object **);
--static Scheme_Object *get_buffer_namespace(void *, int, Scheme_Object **);
- static vim_mz_buffer *get_vim_curr_buffer(void);
- /*  Window-related commands */
- static Scheme_Object *window_new(win_T *win);
- static Scheme_Object *get_curr_win(void *, int, Scheme_Object **);
-@@ -161,34 +142,66 @@ static Scheme_Object *vim_window_validp(
-  */
- static int vim_error_check(void);
- static int do_mzscheme_command(exarg_T *, void *, Scheme_Closed_Prim *what);
- static void startup_mzscheme(void);
- static char *string_to_line(Scheme_Object *obj);
--static int mzscheme_io_init(void);
--static void mzscheme_interface_init(vim_mz_buffer *self);
- static void do_output(char *mesg, long len);
- static void do_printf(char *format, ...);
- static void do_flush(void);
- static Scheme_Object *_apply_thunk_catch_exceptions(
-       Scheme_Object *, Scheme_Object **);
- static Scheme_Object *extract_exn_message(Scheme_Object *v);
- static Scheme_Object *do_eval(void *, int noargc, Scheme_Object **noargv);
- static Scheme_Object *do_load(void *, int noargc, Scheme_Object **noargv);
--static Scheme_Object *do_apply(void *, int noargc, Scheme_Object **noargv);
--static void register_vim_exn(Scheme_Env *env);
-+static void register_vim_exn(void);
- static vim_mz_buffer *get_buffer_arg(const char *fname, int argnum,
-       int argc, Scheme_Object **argv);
- static vim_mz_window *get_window_arg(const char *fname, int argnum,
-       int argc, Scheme_Object **argv);
--static void add_vim_exn(Scheme_Env *env);
- static int line_in_range(linenr_T, buf_T *);
- static void check_line_range(linenr_T, buf_T *);
- static void mz_fix_cursor(int lo, int hi, int extra);
--static int eval_in_namespace(void *, Scheme_Closed_Prim *, Scheme_Env *,
--              Scheme_Object **ret);
--static void make_modules(Scheme_Env *);
-+static int eval_with_exn_handling(void *, Scheme_Closed_Prim *,
-+          Scheme_Object **ret);
-+static void make_modules(void);
-+static void init_exn_catching_apply(void);
-+static int mzscheme_env_main(Scheme_Env *env, int argc, char **argv);
-+static int mzscheme_init(void);
-+#ifdef FEAT_EVAL
-+static Scheme_Object *vim_to_mzscheme(typval_T *vim_value, int depth,
-+      Scheme_Hash_Table *visited);
-+static int mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth,
-+      Scheme_Hash_Table *visited);
-+#endif
-+
-+#ifdef MZ_PRECISE_GC
-+static int buffer_size_proc(void *obj)
-+{
-+    return gcBYTES_TO_WORDS(sizeof(vim_mz_buffer));
-+}
-+static int buffer_mark_proc(void *obj)
-+{
-+    return buffer_size_proc(obj);
-+}
-+static int buffer_fixup_proc(void *obj)
-+{
-+    return buffer_size_proc(obj);
-+}
-+static int window_size_proc(void *obj)
-+{
-+    return gcBYTES_TO_WORDS(sizeof(vim_mz_window));
-+}
-+static int window_mark_proc(void *obj)
-+{
-+    return window_size_proc(obj);
-+}
-+static int window_fixup_proc(void *obj)
-+{
-+    return window_size_proc(obj);
-+}
-+#endif
- #ifdef DYNAMIC_MZSCHEME
- static Scheme_Object *dll_scheme_eof;
- static Scheme_Object *dll_scheme_false;
-@@ -258,12 +271,10 @@ static Scheme_Object *(*dll_scheme_looku
-       Scheme_Env *env);
- static Scheme_Object *(*dll_scheme_make_closed_prim_w_arity)
-     (Scheme_Closed_Prim *prim, void *data, const char *name, mzshort mina,
-      mzshort maxa);
- static Scheme_Object *(*dll_scheme_make_integer_value)(long i);
--static Scheme_Object *(*dll_scheme_make_namespace)(int argc,
--      Scheme_Object *argv[]);
- static Scheme_Object *(*dll_scheme_make_pair)(Scheme_Object *car,
-       Scheme_Object *cdr);
- static Scheme_Object *(*dll_scheme_make_prim_w_arity)(Scheme_Prim *prim,
-       const char *name, mzshort mina, mzshort maxa);
- # if MZSCHEME_VERSION_MAJOR < 299
-@@ -309,10 +320,21 @@ static Scheme_Config *(*dll_scheme_curre
- static Scheme_Object *(*dll_scheme_char_string_to_byte_string)
-     (Scheme_Object *s);
- static Scheme_Object *(*dll_scheme_char_string_to_path)
-     (Scheme_Object *s);
- # endif
-+static Scheme_Hash_Table *(*dll_scheme_make_hash_table)(int type);
-+static void (*dll_scheme_hash_set)(Scheme_Hash_Table *table,
-+      Scheme_Object *key, Scheme_Object *value);
-+static Scheme_Object *(*dll_scheme_hash_get)(Scheme_Hash_Table *table,
-+      Scheme_Object *key);
-+static Scheme_Object *(*dll_scheme_make_double)(double d);
-+# ifdef INCLUDE_MZSCHEME_BASE
-+static Scheme_Object *(*dll_scheme_make_sized_byte_string)(char *chars,
-+      long len, int copy);
-+static Scheme_Object *(*dll_scheme_namespace_require)(Scheme_Object *req);
-+# endif
- /* arrays are imported directly */
- # define scheme_eof dll_scheme_eof
- # define scheme_false dll_scheme_false
- # define scheme_void dll_scheme_void
-@@ -366,11 +388,10 @@ static Scheme_Object *(*dll_scheme_char_
- # endif
- # define scheme_intern_symbol dll_scheme_intern_symbol
- # define scheme_lookup_global dll_scheme_lookup_global
- # define scheme_make_closed_prim_w_arity dll_scheme_make_closed_prim_w_arity
- # define scheme_make_integer_value dll_scheme_make_integer_value
--# define scheme_make_namespace dll_scheme_make_namespace
- # define scheme_make_pair dll_scheme_make_pair
- # define scheme_make_prim_w_arity dll_scheme_make_prim_w_arity
- # if MZSCHEME_VERSION_MAJOR < 299
- #  define scheme_make_string dll_scheme_make_string
- #  define scheme_make_string_output_port dll_scheme_make_string_output_port
-@@ -401,10 +422,18 @@ static Scheme_Object *(*dll_scheme_char_
- #  define scheme_char_string_to_byte_string \
-     dll_scheme_char_string_to_byte_string
- #  define scheme_char_string_to_path \
-     dll_scheme_char_string_to_path
- # endif
-+# define scheme_make_hash_table dll_scheme_make_hash_table
-+# define scheme_hash_set dll_scheme_hash_set
-+# define scheme_hash_get dll_scheme_hash_get
-+# define scheme_make_double dll_scheme_make_double
-+# ifdef INCLUDE_MZSCHEME_BASE
-+#  define scheme_make_sized_byte_string dll_scheme_make_sized_byte_string
-+#  define scheme_namespace_require dll_scheme_namespace_require
-+# endif
- typedef struct
- {
-     char    *name;
-     void    **ptr;
-@@ -466,11 +495,10 @@ static Thunk_Info mzsch_imports[] = {
-     {"scheme_intern_symbol", (void **)&dll_scheme_intern_symbol},
-     {"scheme_lookup_global", (void **)&dll_scheme_lookup_global},
-     {"scheme_make_closed_prim_w_arity",
-       (void **)&dll_scheme_make_closed_prim_w_arity},
-     {"scheme_make_integer_value", (void **)&dll_scheme_make_integer_value},
--    {"scheme_make_namespace", (void **)&dll_scheme_make_namespace},
-     {"scheme_make_pair", (void **)&dll_scheme_make_pair},
-     {"scheme_make_prim_w_arity", (void **)&dll_scheme_make_prim_w_arity},
- # if MZSCHEME_VERSION_MAJOR < 299
-     {"scheme_make_string", (void **)&dll_scheme_make_string},
-     {"scheme_make_string_output_port",
-@@ -500,13 +528,20 @@ static Thunk_Info mzsch_imports[] = {
- # if MZSCHEME_VERSION_MAJOR >= 299
-     {"scheme_set_param", (void **)&dll_scheme_set_param},
-     {"scheme_current_config", (void **)&dll_scheme_current_config},
-     {"scheme_char_string_to_byte_string",
-       (void **)&dll_scheme_char_string_to_byte_string},
--    {"scheme_char_string_to_path",
--      (void **)&dll_scheme_char_string_to_path},
-+    {"scheme_char_string_to_path", (void **)&dll_scheme_char_string_to_path},
- # endif
-+    {"scheme_make_hash_table", (void **)&dll_scheme_make_hash_table},
-+    {"scheme_hash_set", (void **)&dll_scheme_hash_set},
-+    {"scheme_hash_get", (void **)&dll_scheme_hash_get},
-+    {"scheme_make_double", (void **)&dll_scheme_make_double},
-+# ifdef INCLUDE_MZSCHEME_BASE
-+    {"scheme_make_sized_byte_string", (void **)&dll_scheme_make_sized_byte_string},
-+    {"scheme_namespace_require", (void **)&dll_scheme_namespace_require},
-+#endif
-     {NULL, NULL}};
- static HINSTANCE hMzGC = 0;
- static HINSTANCE hMzSch = 0;
-@@ -590,34 +625,42 @@ dynamic_mzscheme_end(void)
-       hMzGC = 0;
-     }
- }
- #endif /* DYNAMIC_MZSCHEME */
-+/* need to put it here for dynamic stuff to work */
-+#if defined(INCLUDE_MZSCHEME_BASE)
-+# include "mzscheme_base.c"
-+#elif MZSCHEME_VERSION_MAJOR >= 400
-+# error MzScheme 4.x must include mzscheme_base.c, for MinGW32 you need to define MZSCHEME_GENERATE_BASE=yes
-+#endif
-+
- /*
-  *========================================================================
-  *  1. MzScheme interpreter startup
-  *========================================================================
-  */
- static Scheme_Type mz_buffer_type;
- static Scheme_Type mz_window_type;
--static int initialized = 0;
-+static int initialized = FALSE;
- /* global environment */
- static Scheme_Env    *environment = NULL;
- /* output/error handlers */
- static Scheme_Object *curout = NULL;
- static Scheme_Object *curerr = NULL;
--/* vim:exn exception */
-+/* exn:vim exception */
- static Scheme_Object *exn_catching_apply = NULL;
- static Scheme_Object *exn_p = NULL;
- static Scheme_Object *exn_message = NULL;
- static Scheme_Object *vim_exn = NULL; /* Vim Error exception */
-- /* values for exn:vim - constructor, predicate, accessors etc */
--static Scheme_Object *vim_exn_names = NULL;
--static Scheme_Object *vim_exn_values = NULL;
-+
-+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
-+static void *stack_base = NULL;
-+#endif
- static long range_start;
- static long range_end;
- /* MzScheme threads scheduling stuff */
-@@ -665,15 +708,13 @@ static void remove_timer(void);
- /* timers are presented in GUI only */
- # if defined(FEAT_GUI_W32)
-     static void CALLBACK
- timer_proc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
- # elif defined(FEAT_GUI_GTK)
--/*ARGSUSED*/
-     static gint
- timer_proc(gpointer data)
- # elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)
--/* ARGSUSED */
-     static void
- timer_proc(XtPointer timed_out, XtIntervalId *interval_id)
- # elif defined(FEAT_GUI_MAC)
-     pascal void
- timer_proc(EventLoopTimerRef theTimer, void *userData)
-@@ -751,203 +792,333 @@ mzscheme_end(void)
- #ifdef DYNAMIC_MZSCHEME
-     dynamic_mzscheme_end();
+-                          },
++                          SCRIPTID_INIT},
+                           /* P_PRI_MKRC isn't needed here, optval_default()
+                            * always returns TRUE for 'compatible' */
+     {"compatible",  "cp",   P_BOOL|P_RALL,
+                           (char_u *)&p_cp, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)FALSE}},
++                          {(char_u *)TRUE, (char_u *)FALSE} SCRIPTID_INIT},
+     {"complete",    "cpt",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_INS_EXPAND
+                           (char_u *)&p_cpt, PV_CPT,
+                           {(char_u *)".,w,b,u,t,i", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
- }
-+    void
-+mzscheme_main(void)
-+{
-+#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400
-+    /* use trampoline for precise GC in MzScheme >= 4.x */
-+    scheme_main_setup(TRUE, mzscheme_env_main, 0, NULL);
-+#else
-+    mzscheme_env_main(NULL, 0, NULL);
-+#endif
-+}
-+
-+    static int
-+mzscheme_env_main(Scheme_Env *env, int argc, char **argv)
-+{
-+    /* neither argument nor return values are used */
-+#ifdef MZ_PRECISE_GC
-+# if MZSCHEME_VERSION_MAJOR < 400
-+    /*
-+     * Starting from version 4.x, embedding applications must use
-+     * scheme_main_setup/scheme_main_stack_setup trampolines
-+     * rather than setting stack base directly with scheme_set_stack_base
-+     */
-+    Scheme_Object   *dummy = NULL;
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, dummy);
-+
-+    stack_base = &__gc_var_stack__;
-+# else
-+    /* environment has been created by us by Scheme */
-+    environment = env;
-+# endif
-+    /*
-+     * In 4.x, all activities must be performed inside trampoline
-+     * so we are forced to initialise GC immediately
-+     * This can be postponed in 3.x but I see no point in implementing
-+     * a feature which will work in older versions only.
-+     * One would better use conservative GC if he needs dynamic MzScheme
-+     */
-+    mzscheme_init();
-+#else
-+    int dummy = 0;
-+    stack_base = (void *)&dummy;
-+#endif
-+    main_loop(FALSE, FALSE);
-+#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR < 400
-+    /* releasing dummy */
-+    MZ_GC_REG();
-+    MZ_GC_UNREG();
-+#endif
-+    return 0;
-+}
-+
-     static void
- startup_mzscheme(void)
- {
--    Scheme_Object *proc_make_security_guard;
--
--    scheme_set_stack_base(NULL, 1);
-+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
-+    scheme_set_stack_base(stack_base, 1);
-+#endif
-     MZ_REGISTER_STATIC(environment);
-     MZ_REGISTER_STATIC(curout);
-     MZ_REGISTER_STATIC(curerr);
-     MZ_REGISTER_STATIC(exn_catching_apply);
-     MZ_REGISTER_STATIC(exn_p);
-     MZ_REGISTER_STATIC(exn_message);
-     MZ_REGISTER_STATIC(vim_exn);
--    MZ_REGISTER_STATIC(vim_exn_names);
--    MZ_REGISTER_STATIC(vim_exn_values);
-+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
-+    /* in newer versions of precise GC the initial env has been created */
-     environment = scheme_basic_env();
-+#endif
-+    MZ_GC_CHECK();
-+
-+#ifdef INCLUDE_MZSCHEME_BASE
-+    {
-+      /*
-+       * versions 4.x do not provide Scheme bindings by default
-+       * we need to add them explicitly
-+       */
-+      Scheme_Object *scheme_base_symbol = NULL;
-+      MZ_GC_DECL_REG(1);
-+      MZ_GC_VAR_IN_REG(0, scheme_base_symbol);
-+      MZ_GC_REG();
-+      /* invoke function from generated and included mzscheme_base.c */
-+      declare_modules(environment);
-+      scheme_base_symbol = scheme_intern_symbol("scheme/base");
-+      MZ_GC_CHECK();
-+      scheme_namespace_require(scheme_base_symbol);
-+      MZ_GC_CHECK();
-+      MZ_GC_UNREG();
-+    }
-+#endif
-+    register_vim_exn();
-+    /* use new environment to initialise exception handling */
-+    init_exn_catching_apply();
-     /* redirect output */
-     scheme_console_output = do_output;
-     scheme_console_printf = do_printf;
- #ifdef MZSCHEME_COLLECTS
-     /* setup 'current-library-collection-paths' parameter */
--    scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS,
--          scheme_make_pair(
- # if MZSCHEME_VERSION_MAJOR >= 299
--              scheme_char_string_to_path(
--                  scheme_byte_string_to_char_string(
--                      scheme_make_byte_string(MZSCHEME_COLLECTS))),
-+    {
-+      Scheme_Object   *coll_byte_string = NULL;
-+      Scheme_Object   *coll_char_string = NULL;
-+      Scheme_Object   *coll_path = NULL;
-+      Scheme_Object   *coll_pair = NULL;
-+      Scheme_Config   *config = NULL;
-+
-+      MZ_GC_DECL_REG(5);
-+      MZ_GC_VAR_IN_REG(0, coll_byte_string);
-+      MZ_GC_VAR_IN_REG(1, coll_char_string);
-+      MZ_GC_VAR_IN_REG(2, coll_path);
-+      MZ_GC_VAR_IN_REG(3, coll_pair);
-+      MZ_GC_VAR_IN_REG(4, config);
-+      MZ_GC_REG();
-+      coll_byte_string = scheme_make_byte_string(MZSCHEME_COLLECTS);
-+      MZ_GC_CHECK();
-+      coll_char_string = scheme_byte_string_to_char_string(coll_byte_string);
-+      MZ_GC_CHECK();
-+      coll_path = scheme_char_string_to_path(coll_char_string);
-+      MZ_GC_CHECK();
-+      coll_pair = scheme_make_pair(coll_path, scheme_null);
-+      MZ_GC_CHECK();
-+      config = scheme_config;
-+      MZ_GC_CHECK();
-+      scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
-+      MZ_GC_CHECK();
-+      MZ_GC_UNREG();
-+    }
- # else
--              scheme_make_string(MZSCHEME_COLLECTS),
-+    {
-+      Scheme_Object   *coll_string = NULL;
-+      Scheme_Object   *coll_pair = NULL;
-+      Scheme_Config   *config = NULL;
-+
-+      MZ_GC_DECL_REG(3);
-+      MZ_GC_VAR_IN_REG(0, coll_string);
-+      MZ_GC_VAR_IN_REG(1, coll_pair);
-+      MZ_GC_VAR_IN_REG(2, config);
-+      MZ_GC_REG();
-+      coll_string = scheme_make_string(MZSCHEME_COLLECTS);
-+      MZ_GC_CHECK();
-+      coll_pair = scheme_make_pair(coll_string, scheme_null);
-+      MZ_GC_CHECK();
-+      config = scheme_config;
-+      MZ_GC_CHECK();
-+      scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
-+      MZ_GC_CHECK();
-+      MZ_GC_UNREG();
-+    }
- # endif
--              scheme_null));
+-                          },
++                          SCRIPTID_INIT},
+     {"completefunc", "cfu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_COMPL_FUNC
+                           (char_u *)&p_cfu, PV_CFU,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
- #ifdef HAVE_SANDBOX
--    /* setup sandbox guards */
--    proc_make_security_guard = scheme_lookup_global(
--          scheme_intern_symbol("make-security-guard"),
--          environment);
--    if (proc_make_security_guard != NULL)
--    {
--      Scheme_Object *args[3];
--      Scheme_Object *guard;
--      args[0] = scheme_get_param(scheme_config, MZCONFIG_SECURITY_GUARD);
--      args[1] = scheme_make_prim_w_arity(sandbox_file_guard,
--              "sandbox-file-guard", 3, 3);
--      args[2] = scheme_make_prim_w_arity(sandbox_network_guard,
--              "sandbox-network-guard", 4, 4);
--      guard = scheme_apply(proc_make_security_guard, 3, args);
--      scheme_set_param(scheme_config, MZCONFIG_SECURITY_GUARD, guard);
-+    {
-+      Scheme_Object   *make_security_guard = NULL;
-+      MZ_GC_DECL_REG(1);
-+      MZ_GC_VAR_IN_REG(0, make_security_guard);
-+      MZ_GC_REG();
-+
-+#if MZSCHEME_VERSION_MAJOR < 400
-+      {
-+          Scheme_Object       *make_security_guard_symbol = NULL;
-+          MZ_GC_DECL_REG(1);
-+          MZ_GC_VAR_IN_REG(0, make_security_guard_symbol);
-+          MZ_GC_REG();
-+          make_security_guard_symbol = scheme_intern_symbol("make-security-guard");
-+          MZ_GC_CHECK();
-+          make_security_guard = scheme_lookup_global(
-+                  make_security_guard_symbol, environment);
-+          MZ_GC_UNREG();
-+      }
-+#else
-+      make_security_guard = scheme_builtin_value("make-security-guard");
-+      MZ_GC_CHECK();
-+#endif
-+
-+      /* setup sandbox guards */
-+      if (make_security_guard != NULL)
-+      {
-+          Scheme_Object   *args[3] = {NULL, NULL, NULL};
-+          Scheme_Object   *guard = NULL;
-+          Scheme_Config   *config = NULL;
-+          MZ_GC_DECL_REG(5);
-+          MZ_GC_ARRAY_VAR_IN_REG(0, args, 3);
-+          MZ_GC_VAR_IN_REG(3, guard);
-+          MZ_GC_VAR_IN_REG(4, config);
-+          MZ_GC_REG();
-+          config = scheme_config;
-+          MZ_GC_CHECK();
-+          args[0] = scheme_get_param(config, MZCONFIG_SECURITY_GUARD);
-+          MZ_GC_CHECK();
-+          args[1] = scheme_make_prim_w_arity(sandbox_file_guard,
-+                  "sandbox-file-guard", 3, 3);
-+          args[2] = scheme_make_prim_w_arity(sandbox_network_guard,
-+                  "sandbox-network-guard", 4, 4);
-+          guard = scheme_apply(make_security_guard, 3, args);
-+          MZ_GC_CHECK();
-+          scheme_set_param(config, MZCONFIG_SECURITY_GUARD, guard);
-+          MZ_GC_CHECK();
-+          MZ_GC_UNREG();
-+      }
-+      MZ_GC_UNREG();
-     }
+-                          },
++                          SCRIPTID_INIT},
+     {"completeopt",   "cot",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_INS_EXPAND
+                           (char_u *)&p_cot, PV_NONE,
+                           {(char_u *)"menu,preview", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-     /* Create buffer and window types for use in Scheme code */
-     mz_buffer_type = scheme_make_type("<vim-buffer>");
-+    MZ_GC_CHECK();
-     mz_window_type = scheme_make_type("<vim-window>");
-+    MZ_GC_CHECK();
-+#ifdef MZ_PRECISE_GC
-+    GC_register_traversers(mz_buffer_type,
-+          buffer_size_proc, buffer_mark_proc, buffer_fixup_proc,
-+          TRUE, TRUE);
-+    GC_register_traversers(mz_window_type,
-+          window_size_proc, window_mark_proc, window_fixup_proc,
-+          TRUE, TRUE);
-+#endif
--    register_vim_exn(environment);
--    make_modules(environment);
-+    make_modules();
-     /*
-      * setup callback to receive notifications
-      * whether thread scheduling is (or not) required
-      */
-     scheme_notify_multithread = notify_multithread;
--    initialized = 1;
- }
- /*
-  * This routine is called for each new invocation of MzScheme
-  * to make sure things are properly initialized.
-  */
-     static int
- mzscheme_init(void)
- {
--    int do_require = FALSE;
--
-     if (!initialized)
-     {
--      do_require = TRUE;
- #ifdef DYNAMIC_MZSCHEME
-       if (!mzscheme_enabled(TRUE))
-       {
--          EMSG(_("???: Sorry, this command is disabled, the MzScheme library could not be loaded."));
-+          EMSG(_("E815: Sorry, this command is disabled, the MzScheme libraries could not be loaded."));
-           return -1;
-       }
+-                          },
++                          SCRIPTID_INIT},
+     {"confirm",     "cf",   P_BOOL|P_VI_DEF,
+ #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
+                           (char_u *)&p_confirm, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-       startup_mzscheme();
--
--      if (mzscheme_io_init())
--          return -1;
--
--    }
--    /* recreate ports each call effectivelly clearing these ones */
--    curout = scheme_make_string_output_port();
--    curerr = scheme_make_string_output_port();
--    scheme_set_param(scheme_config, MZCONFIG_OUTPUT_PORT, curout);
--    scheme_set_param(scheme_config, MZCONFIG_ERROR_PORT, curerr);
--
--    if (do_require)
--    {
--      /* auto-instantiate in basic env */
--      eval_in_namespace("(require (prefix vimext: vimext))", do_eval,
--              environment, NULL);
-+      initialized = TRUE;
-     }
--
--    return 0;
--}
--
--/*
-- * This routine fills the namespace with various important routines that can
-- * be used within MzScheme.
-- */
--    static void
--mzscheme_interface_init(vim_mz_buffer *mzbuff)
--{
--    Scheme_Object   *attach;
--
--    mzbuff->env = (Scheme_Env *)scheme_make_namespace(0, NULL);
--
--    /*
--     * attach instantiated modules from global namespace
--     * so they can be easily instantiated in the buffer namespace
--     */
--    attach = scheme_lookup_global(
--          scheme_intern_symbol("namespace-attach-module"),
--          environment);
--
--    if (attach != NULL)
-     {
--      Scheme_Object   *ret;
--      Scheme_Object   *args[2];
--
--      args[0] = (Scheme_Object *)environment;
--      args[1] = scheme_intern_symbol("vimext");
--
--      ret = (Scheme_Object *)mzvim_apply(attach, 2, args);
-+      Scheme_Config   *config = NULL;
-+      MZ_GC_DECL_REG(1);
-+      MZ_GC_VAR_IN_REG(0, config);
-+      MZ_GC_REG();
-+      config = scheme_config;
-+      MZ_GC_CHECK();
-+      /* recreate ports each call effectively clearing these ones */
-+      curout = scheme_make_string_output_port();
-+      MZ_GC_CHECK();
-+      curerr = scheme_make_string_output_port();
-+      MZ_GC_CHECK();
-+      scheme_set_param(config, MZCONFIG_OUTPUT_PORT, curout);
-+      MZ_GC_CHECK();
-+      scheme_set_param(config, MZCONFIG_ERROR_PORT, curerr);
-+      MZ_GC_CHECK();
-+      MZ_GC_UNREG();
-     }
--    add_vim_exn(mzbuff->env);
-+    return 0;
- }
- /*
-  *========================================================================
-  *  2.  External Interface
-  *========================================================================
-  */
- /*
-- * Evaluate command in namespace with exception handling
-+ * Evaluate command with exception handling
-  */
-     static int
--eval_in_namespace(void *data, Scheme_Closed_Prim *what, Scheme_Env *env,
--              Scheme_Object **ret)
-+eval_with_exn_handling(void *data, Scheme_Closed_Prim *what, Scheme_Object **ret)
- {
--    Scheme_Object   *value;
--    Scheme_Object   *exn;
--    Cmd_Info      info;   /* closure info */
--
--    info.data = data;
--    info.env = env;
--
--    scheme_set_param(scheme_config, MZCONFIG_ENV,
--          (Scheme_Object *) env);
--    /*
--     * ensure all evaluations will be in current buffer namespace,
--     * the second argument to scheme_eval_string isn't enough!
--     */
--    value = _apply_thunk_catch_exceptions(
--          scheme_make_closed_prim_w_arity(what, &info, "mzvim", 0, 0),
--          &exn);
-+    Scheme_Object   *value = NULL;
-+    Scheme_Object   *exn = NULL;
-+    Scheme_Object   *prim = NULL;
-+
-+    MZ_GC_DECL_REG(3);
-+    MZ_GC_VAR_IN_REG(0, value);
-+    MZ_GC_VAR_IN_REG(1, exn);
-+    MZ_GC_VAR_IN_REG(2, prim);
-+    MZ_GC_REG();
-+
-+    prim = scheme_make_closed_prim_w_arity(what, data, "mzvim", 0, 0);
-+    MZ_GC_CHECK();
-+    value = _apply_thunk_catch_exceptions(prim, &exn);
-+    MZ_GC_CHECK();
-     if (!value)
-     {
-       value = extract_exn_message(exn);
-       /* Got an exn? */
-       if (value)
-       {
--          scheme_display(value, curerr);  /*  Send to stderr-vim */
-+          scheme_display(value, curerr);   /*  Send to stderr-vim */
-+          MZ_GC_CHECK();
-           do_flush();
-       }
-+      MZ_GC_UNREG();
-       /* `raise' was called on some arbitrary value */
-       return FAIL;
-     }
-     if (ret != NULL)  /* if pointer to retval supported give it up */
-       *ret = value;
-     /* Print any result, as long as it's not a void */
-     else if (!SCHEME_VOIDP(value))
-+    {
-       scheme_display(value, curout);  /* Send to stdout-vim */
-+      MZ_GC_CHECK();
-+    }
-     do_flush();
-+    MZ_GC_UNREG();
-     return OK;
- }
- /* :mzscheme */
-     static int
-@@ -957,11 +1128,11 @@ do_mzscheme_command(exarg_T *eap, void *
-       return FAIL;
-     range_start = eap->line1;
-     range_end = eap->line2;
--    return eval_in_namespace(data, what, get_vim_curr_buffer()->env, NULL);
-+    return eval_with_exn_handling(data, what, NULL);
- }
- /*
-  * Routine called by VIM when deleting a buffer
-  */
-@@ -974,10 +1145,11 @@ mzscheme_buffer_free(buf_T *buf)
-       bp = buf->b_mzscheme_ref;
-       bp->buf = INVALID_BUFFER_VALUE;
-       buf->b_mzscheme_ref = NULL;
-       scheme_gc_ptr_ok(bp);
-+      MZ_GC_CHECK();
-     }
- }
- /*
-  * Routine called by VIM when deleting a Window
-@@ -990,10 +1162,11 @@ mzscheme_window_free(win_T *win)
-       vim_mz_window *wp;
-       wp = win->w_mzscheme_ref;
-       wp->win = INVALID_WINDOW_VALUE;
-       win->w_mzscheme_ref = NULL;
-       scheme_gc_ptr_ok(wp);
-+      MZ_GC_CHECK();
-     }
- }
- /*
-  * ":mzscheme" (or ":mz")
-@@ -1014,80 +1187,67 @@ ex_mzscheme(exarg_T *eap)
-           vim_free(script);
-       }
-     }
- }
--/* eval MzScheme string */
--    void *
--mzvim_eval_string(char_u *str)
--{
--    Scheme_Object *ret = NULL;
--    if (mzscheme_init())
--      return FAIL;
--
--    eval_in_namespace(str, do_eval, get_vim_curr_buffer()->env, &ret);
--    return ret;
--}
--
--/*
-- * apply MzScheme procedure with arguments,
-- * handling errors
-- */
--    Scheme_Object *
--mzvim_apply(Scheme_Object *proc, int argc, Scheme_Object **argv)
--{
--    Apply_Info        data;
--    Scheme_Object *ret = NULL;
--
--    if (mzscheme_init())
--      return FAIL;
--
--    data.proc = proc;
--    data.argc = argc;
--    data.argv = argv;
--
--    eval_in_namespace(&data, do_apply, get_vim_curr_buffer()->env, &ret);
--    return ret;
--}
--
-     static Scheme_Object *
- do_load(void *data, int noargc, Scheme_Object **noargv)
- {
--    Cmd_Info      *info = (Cmd_Info *)data;
--    Scheme_Object   *result = scheme_void;
--    Scheme_Object   *expr;
--    char_u        *file = scheme_malloc_fail_ok(
--                                        scheme_malloc_atomic, MAXPATHL + 1);
--    Port_Info     *pinfo = (Port_Info *)(info->data);
-+    Scheme_Object   *expr = NULL;
-+    Scheme_Object   *result = NULL;
-+    char          *file = NULL;
-+    Port_Info     *pinfo = (Port_Info *)data;
-+
-+    MZ_GC_DECL_REG(3);
-+    MZ_GC_VAR_IN_REG(0, expr);
-+    MZ_GC_VAR_IN_REG(1, result);
-+    MZ_GC_VAR_IN_REG(2, file);
-+    MZ_GC_REG();
-+
-+    file = (char *)scheme_malloc_fail_ok(scheme_malloc_atomic, MAXPATHL + 1);
-+    MZ_GC_CHECK();
-     /* make Vim expansion */
--    expand_env((char_u *)pinfo->name, file, MAXPATHL);
--    /* scheme_load looks strange working with namespaces and error handling*/
-+    expand_env((char_u *)pinfo->name, (char_u *)file, MAXPATHL);
-     pinfo->port = scheme_open_input_file(file, "mzfile");
--    scheme_count_lines(pinfo->port); /* to get accurate read error location*/
-+    MZ_GC_CHECK();
-+    scheme_count_lines(pinfo->port);  /* to get accurate read error location*/
-+    MZ_GC_CHECK();
-     /* Like REPL but print only last result */
-     while (!SCHEME_EOFP(expr = scheme_read(pinfo->port)))
--      result = scheme_eval(expr, info->env);
-+    {
-+      result = scheme_eval(expr, environment);
-+      MZ_GC_CHECK();
-+    }
--    /* errors will be caught in do_mzscheme_comamnd and ex_mzfile */
-+    /* errors will be caught in do_mzscheme_command and ex_mzfile */
-     scheme_close_input_port(pinfo->port);
-+    MZ_GC_CHECK();
-     pinfo->port = NULL;
-+    MZ_GC_UNREG();
-     return result;
- }
- /* :mzfile */
-     void
- ex_mzfile(exarg_T *eap)
- {
--    Port_Info pinfo;
-+    Port_Info pinfo = {NULL, NULL};
-+
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, pinfo.port);
-+    MZ_GC_REG();
-     pinfo.name = (char *)eap->arg;
--    pinfo.port = NULL;
-     if (do_mzscheme_command(eap, &pinfo, do_load) != OK
-           && pinfo.port != NULL)      /* looks like port was not closed */
-+    {
-       scheme_close_input_port(pinfo.port);
-+      MZ_GC_CHECK();
-+    }
-+    MZ_GC_UNREG();
- }
- /*
-  *========================================================================
-@@ -1103,18 +1263,16 @@ init_exn_catching_apply(void)
-       char *e =
-           "(lambda (thunk) "
-               "(with-handlers ([void (lambda (exn) (cons #f exn))]) "
-               "(cons #t (thunk))))";
--      /* make sure we have a namespace with the standard syntax: */
--      Scheme_Env *env = (Scheme_Env *)scheme_make_namespace(0, NULL);
--      add_vim_exn(env);
--
--      exn_catching_apply = scheme_eval_string(e, env);
--      exn_p = scheme_lookup_global(scheme_intern_symbol("exn?"), env);
--      exn_message = scheme_lookup_global(
--              scheme_intern_symbol("exn-message"), env);
-+      exn_catching_apply = scheme_eval_string(e, environment);
-+      MZ_GC_CHECK();
-+      exn_p = scheme_builtin_value("exn?");
-+      MZ_GC_CHECK();
-+      exn_message = scheme_builtin_value("exn-message");
-+      MZ_GC_CHECK();
-     }
- }
- /*
-  * This function applies a thunk, returning the Scheme value if there's
-@@ -1124,12 +1282,10 @@ init_exn_catching_apply(void)
-     static Scheme_Object *
- _apply_thunk_catch_exceptions(Scheme_Object *f, Scheme_Object **exn)
- {
-     Scheme_Object *v;
--    init_exn_catching_apply();
--
-     v = _scheme_apply(exn_catching_apply, 1, &f);
-     /* v is a pair: (cons #t value) or (cons #f exn) */
-     if (SCHEME_TRUEP(SCHEME_CAR(v)))
-       return SCHEME_CDR(v);
-@@ -1141,32 +1297,20 @@ _apply_thunk_catch_exceptions(Scheme_Obj
- }
-     static Scheme_Object *
- extract_exn_message(Scheme_Object *v)
- {
--    init_exn_catching_apply();
--
-     if (SCHEME_TRUEP(_scheme_apply(exn_p, 1, &v)))
-       return _scheme_apply(exn_message, 1, &v);
-     else
-       return NULL; /* Not an exn structure */
- }
-     static Scheme_Object *
- do_eval(void *s, int noargc, Scheme_Object **noargv)
- {
--    Cmd_Info  *info = (Cmd_Info *)s;
--
--    return scheme_eval_string_all((char *)(info->data), info->env, TRUE);
--}
--
--    static Scheme_Object *
--do_apply(void *a, int noargc, Scheme_Object **noargv)
--{
--    Apply_Info        *info = (Apply_Info *)(((Cmd_Info *)a)->data);
--
--    return scheme_apply(info->proc, info->argc, info->argv);
-+    return scheme_eval_string_all((char *)s, environment, TRUE);
- }
- /*
-  *========================================================================
-  *  3.  MzScheme I/O Handlers
-@@ -1219,28 +1363,23 @@ do_flush(void)
- {
-     char *buff;
-     long length;
-     buff = scheme_get_sized_string_output(curerr, &length);
-+    MZ_GC_CHECK();
-     if (length)
-     {
-       do_err_output(buff, length);
-       return;
-     }
-     buff = scheme_get_sized_string_output(curout, &length);
-+    MZ_GC_CHECK();
-     if (length)
-       do_output(buff, length);
- }
--    static int
--mzscheme_io_init(void)
--{
--    /* Nothing needed so far... */
--    return 0;
--}
--
- /*
-  *========================================================================
-  *  4. Implementation of the Vim Features for MzScheme
-  *========================================================================
-  */
-@@ -1263,26 +1402,34 @@ vim_command(void *data, int argc, Scheme
- /* (eval {expr-string}) */
-     static Scheme_Object *
- vim_eval(void *data, int argc, Scheme_Object **argv)
- {
- #ifdef FEAT_EVAL
--    Vim_Prim      *prim = (Vim_Prim *)data;
--    char          *expr;
--    char          *str;
--    Scheme_Object   *result;
-+    Vim_Prim          *prim = (Vim_Prim *)data;
-+    char              *expr;
-+    Scheme_Object     *result;
-+    /* hash table to store visited values to avoid infinite loops */
-+    Scheme_Hash_Table *visited = NULL;
-+    typval_T          *vim_result;
-+
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, visited);
-+    MZ_GC_REG();
--    expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
-+    visited = scheme_make_hash_table(SCHEME_hash_ptr);
-+    MZ_GC_CHECK();
--    str = (char *)eval_to_string((char_u *)expr, NULL, TRUE);
-+    expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
-+    vim_result = eval_expr((char_u *)expr, NULL);
--    if (str == NULL)
-+    if (vim_result == NULL)
-       raise_vim_exn(_("invalid expression"));
--    result = scheme_make_string(str);
--
--    vim_free(str);
-+    result = vim_to_mzscheme(vim_result, 1, visited);
-+    free_tv(vim_result);
-+    MZ_GC_UNREG();
-     return result;
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"conskey",           "consk",P_BOOL|P_VI_DEF,
+ #ifdef MSDOS
+                           (char_u *)&p_consk, PV_NONE,
  #else
-     raise_vim_exn(_("expressions disabled at compile time"));
-     /* unreachable */
-     return scheme_false;
-@@ -1318,11 +1465,11 @@ static Scheme_Object *M_global = NULL;
- get_option(void *data, int argc, Scheme_Object **argv)
- {
-     Vim_Prim      *prim = (Vim_Prim *)data;
-     char_u        *name;
-     long          value;
--    char_u        *strval;
-+    char          *strval;
-     int                   rc;
-     Scheme_Object   *rval;
-     int                   opt_flags = 0;
-     buf_T         *save_curb = curbuf;
-     win_T         *save_curw = curwin;
-@@ -1333,10 +1480,11 @@ get_option(void *data, int argc, Scheme_
-     {
-       if (M_global == NULL)
-       {
-           MZ_REGISTER_STATIC(M_global);
-           M_global = scheme_intern_symbol("global");
-+          MZ_GC_CHECK();
-       }
-       if (argv[1] == M_global)
-           opt_flags = OPT_GLOBAL;
-       else if (SCHEME_VIMBUFFERP(argv[1]))
-@@ -1354,20 +1502,21 @@ get_option(void *data, int argc, Scheme_
-       }
-       else
-           scheme_wrong_type(prim->name, "vim-buffer/window", 1, argc, argv);
-     }
--    rc = get_option_value(name, &value, &strval, opt_flags);
-+    rc = get_option_value(name, &value, (char_u **)&strval, opt_flags);
-     curbuf = save_curb;
-     curwin = save_curw;
-     switch (rc)
-     {
-     case 1:
-       return scheme_make_integer_value(value);
-     case 0:
-       rval = scheme_make_string(strval);
-+      MZ_GC_CHECK();
-       vim_free(strval);
-       return rval;
-     case -1:
-     case -2:
-       raise_vim_exn(_("hidden option"));
-@@ -1393,10 +1542,11 @@ set_option(void *data, int argc, Scheme_
-     {
-       if (M_global == NULL)
-       {
-           MZ_REGISTER_STATIC(M_global);
-           M_global = scheme_intern_symbol("global");
-+          MZ_GC_CHECK();
-       }
-       if (argv[1] == M_global)
-           opt_flags = OPT_GLOBAL;
-       else if (SCHEME_VIMBUFFERP(argv[1]))
-@@ -1463,19 +1613,26 @@ get_window_list(void *data, int argc, Sc
-     buf = get_buffer_arg(prim->name, 0, argc, argv);
-     list = scheme_null;
-     for (w = firstwin; w != NULL; w = w->w_next)
-       if (w->w_buffer == buf->buf)
-+      {
-           list = scheme_make_pair(window_new(w), list);
-+          MZ_GC_CHECK();
-+      }
-     return list;
- }
-     static Scheme_Object *
- window_new(win_T *win)
- {
--    vim_mz_window *self;
-+    vim_mz_window *self = NULL;
-+
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, self);
-+    MZ_GC_REG();
-     /* We need to handle deletion of windows underneath us.
-      * If we add a "w_mzscheme_ref" field to the win_T structure,
-      * then we can get at it in win_free() in vim.
-      *
-@@ -1485,17 +1642,18 @@ window_new(win_T *win)
-      */
-     if (win->w_mzscheme_ref != NULL)
-       return win->w_mzscheme_ref;
-     self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_window));
--
-     vim_memset(self, 0, sizeof(vim_mz_window));
-     scheme_dont_gc_ptr(self); /* because win isn't visible to GC */
-+    MZ_GC_CHECK();
-     win->w_mzscheme_ref = self;
-     self->win = win;
--    self->tag = mz_window_type;
-+    self->so.type = mz_window_type;
-+    MZ_GC_UNREG();
-     return (Scheme_Object *)(self);
- }
- /* (get-win-num [window]) */
-     static Scheme_Object *
-@@ -1660,27 +1818,26 @@ set_cursor(void *data, int argc, Scheme_
-     return scheme_void;
- }
- /*
-  *===========================================================================
-  *  6. Vim Buffer-related Manipulation Functions
-- *     Note that each buffer should have its own private namespace.
-  *===========================================================================
-  */
- /* (open-buff {filename}) */
-     static Scheme_Object *
- mzscheme_open_buffer(void *data, int argc, Scheme_Object **argv)
- {
-     Vim_Prim      *prim = (Vim_Prim *)data;
--    char          *fname;
-+    char_u        *fname;
-     int                   num = 0;
-     Scheme_Object   *onum;
- #ifdef HAVE_SANDBOX
-     sandbox_check();
+                           (char_u *)NULL, PV_NONE,
  #endif
--    fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
-+    fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
-     /* TODO make open existing file */
-     num = buflist_add(fname, BLN_LISTED | BLN_CURBUF);
-     if (num == 0)
-       raise_vim_exn(_("couldn't open buffer"));
-@@ -1712,11 +1869,11 @@ get_buffer_by_name(void *data, int argc,
- {
-     Vim_Prim  *prim = (Vim_Prim *)data;
-     buf_T     *buf;
-     char_u    *fname;
--    fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
-+    fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0));
-     for (buf = firstbuf; buf; buf = buf->b_next)
-       if (buf->b_ffname == NULL || buf->b_sfname == NULL)
-           /* empty string */
-       {
-@@ -1783,11 +1940,11 @@ get_buffer_count(void *data, int argc, S
- get_buffer_name(void *data, int argc, Scheme_Object **argv)
- {
-     Vim_Prim      *prim = (Vim_Prim *)data;
-     vim_mz_buffer   *buf = get_buffer_arg(prim->name, 0, argc, argv);
--    return scheme_make_string(buf->buf->b_ffname);
-+    return scheme_make_string((char *)buf->buf->b_ffname);
- }
- /* (curr-buff) */
-     static Scheme_Object *
- get_curr_buffer(void *data, int argc, Scheme_Object **argv)
-@@ -1796,29 +1953,32 @@ get_curr_buffer(void *data, int argc, Sc
- }
-     static Scheme_Object *
- buffer_new(buf_T *buf)
- {
--    vim_mz_buffer *self;
-+    vim_mz_buffer *self = NULL;
-+
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, self);
-+    MZ_GC_REG();
-     /* We need to handle deletion of buffers underneath us.
-      * If we add a "b_mzscheme_ref" field to the buf_T structure,
-      * then we can get at it in buf_freeall() in vim.
-      */
-     if (buf->b_mzscheme_ref)
-       return buf->b_mzscheme_ref;
-     self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_buffer));
--
-     vim_memset(self, 0, sizeof(vim_mz_buffer));
--    scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */
-+    scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */
-+    MZ_GC_CHECK();
-     buf->b_mzscheme_ref = self;
-     self->buf = buf;
--    self->tag = mz_buffer_type;
--
--    mzscheme_interface_init(self);    /* Set up namespace */
-+    self->so.type = mz_buffer_type;
-+    MZ_GC_UNREG();
-     return (Scheme_Object *)(self);
- }
- /*
-  * (get-buff-size [buffer])
-@@ -1845,18 +2005,18 @@ get_buffer_size(void *data, int argc, Sc
- get_buffer_line(void *data, int argc, Scheme_Object **argv)
- {
-     Vim_Prim      *prim = (Vim_Prim *)data;
-     vim_mz_buffer   *buf;
-     int                   linenr;
--    char          *line;
-+    char_u        *line;
-     buf = get_buffer_arg(prim->name, 1, argc, argv);
-     linenr = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
-     line = ml_get_buf(buf->buf, (linenr_T)linenr, FALSE);
-     raise_if_error();
--    return scheme_make_string(line);
-+    return scheme_make_string((char *)line);
- }
- /*
-  * (get-buff-line-list {start} {end} [buffer])
-@@ -1869,11 +2029,15 @@ get_buffer_line(void *data, int argc, Sc
- get_buffer_line_list(void *data, int argc, Scheme_Object **argv)
- {
-     Vim_Prim      *prim = (Vim_Prim *)data;
-     vim_mz_buffer   *buf;
-     int                   i, hi, lo, n;
--    Scheme_Object   *list;
-+    Scheme_Object   *list = NULL;
-+
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, list);
-+    MZ_GC_REG();
-     buf = get_buffer_arg(prim->name, 2, argc, argv);
-     list = scheme_null;
-     hi = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 1));
-     lo = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
-@@ -1897,12 +2061,13 @@ get_buffer_line_list(void *data, int arg
-                      (char *)ml_get_buf(buf->buf, (linenr_T)(lo+i), FALSE));
-       raise_if_error();
-       /* Set the list item */
-       list = scheme_make_pair(str, list);
-+      MZ_GC_CHECK();
-     }
--
-+    MZ_GC_UNREG();
-     return list;
- }
- /*
-  * (set-buff-line {linenr} {string/#f} [buffer])
-@@ -1917,23 +2082,26 @@ get_buffer_line_list(void *data, int arg
-  * string changed.
-  */
-     static Scheme_Object *
- set_buffer_line(void *data, int argc, Scheme_Object **argv)
- {
--    /* First of all, we check the the of the supplied MzScheme object.
-+    /* First of all, we check the value of the supplied MzScheme object.
-      * There are three cases:
-      *          1. #f - this is a deletion.
-      *          2. A string      - this is a replacement.
-      *          3. Anything else - this is an error.
-      */
-     Vim_Prim      *prim = (Vim_Prim *)data;
-     vim_mz_buffer   *buf;
--    Scheme_Object   *line;
-+    Scheme_Object   *line = NULL;
-     char          *save;
--    buf_T         *savebuf;
-     int                   n;
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, line);
-+    MZ_GC_REG();
-+
- #ifdef HAVE_SANDBOX
-     sandbox_check();
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"copyindent",  "ci",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_ci, PV_CI,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"cpoptions",   "cpo",  P_STRING|P_VIM|P_RALL|P_FLAGLIST,
+                           (char_u *)&p_cpo, PV_NONE,
+-                          {(char_u *)CPO_VI, (char_u *)CPO_VIM}},
++                          {(char_u *)CPO_VI, (char_u *)CPO_VIM}
++                          SCRIPTID_INIT},
+     {"cscopepathcomp", "cspc", P_NUM|P_VI_DEF|P_VIM,
+ #ifdef FEAT_CSCOPE
+                           (char_u *)&p_cspc, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-     n = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
-     if (!SCHEME_STRINGP(argv[1]) && !SCHEME_FALSEP(argv[1]))
-@@ -1943,11 +2111,12 @@ set_buffer_line(void *data, int argc, Sc
-     check_line_range(n, buf->buf);
-     if (SCHEME_FALSEP(line))
-     {
--      savebuf = curbuf;
-+      buf_T       *savebuf = curbuf;
-+
-       curbuf = buf->buf;
-       if (u_savedel((linenr_T)n, 1L) == FAIL)
-       {
-           curbuf = savebuf;
-@@ -1956,43 +2125,66 @@ set_buffer_line(void *data, int argc, Sc
-       else if (ml_delete((linenr_T)n, FALSE) == FAIL)
-       {
-           curbuf = savebuf;
-           raise_vim_exn(_("cannot delete line"));
-       }
--      deleted_lines_mark((linenr_T)n, 1L);
-       if (buf->buf == curwin->w_buffer)
-           mz_fix_cursor(n, n + 1, -1);
-+      deleted_lines_mark((linenr_T)n, 1L);
-       curbuf = savebuf;
-+      MZ_GC_UNREG();
-       raise_if_error();
-       return scheme_void;
-     }
-+    else
-+    {
-+      /* Otherwise it's a line */
-+      buf_T       *savebuf = curbuf;
--    /* Otherwise it's a line */
--    save = string_to_line(line);
--    savebuf = curbuf;
-+      save = string_to_line(line);
--    curbuf = buf->buf;
-+      curbuf = buf->buf;
-+
-+      if (u_savesub((linenr_T)n) == FAIL)
-+      {
-+          curbuf = savebuf;
-+          vim_free(save);
-+          raise_vim_exn(_("cannot save undo information"));
-+      }
-+      else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL)
-+      {
-+          curbuf = savebuf;
-+          vim_free(save);
-+          raise_vim_exn(_("cannot replace line"));
-+      }
-+      else
-+      {
-+          vim_free(save);
-+          changed_bytes((linenr_T)n, 0);
-+      }
--    if (u_savesub((linenr_T)n) == FAIL)
--    {
--      curbuf = savebuf;
--      raise_vim_exn(_("cannot save undo information"));
--    }
--    else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL)
--    {
-       curbuf = savebuf;
--      raise_vim_exn(_("cannot replace line"));
--    }
--    else
--      changed_bytes((linenr_T)n, 0);
--    curbuf = savebuf;
-+      /* Check that the cursor is not beyond the end of the line now. */
-+      if (buf->buf == curwin->w_buffer)
-+          check_cursor_col();
--    raise_if_error();
--    return scheme_void;
-+      MZ_GC_UNREG();
-+      raise_if_error();
-+      return scheme_void;
-+    }
-+}
-+
-+    static void
-+free_array(char **array)
-+{
-+    char **curr = array;
-+    while (*curr != NULL)
-+      vim_free(*curr++);
-+    vim_free(array);
- }
- /*
-  * (set-buff-line-list {start} {end} {string-list/#f/null} [buffer])
-  *
-@@ -2013,19 +2205,19 @@ set_buffer_line_list(void *data, int arg
-      *          1. #f - this is a deletion.
-      *          2. A list        - this is a replacement.
-      *          3. Anything else - this is an error.
-      */
-     Vim_Prim      *prim = (Vim_Prim *)data;
--    vim_mz_buffer   *buf;
--    Scheme_Object   *line_list;
--    Scheme_Object   *line;
--    Scheme_Object   *rest;
--    char          **array;
--    buf_T         *savebuf;
-+    vim_mz_buffer   *buf = NULL;
-+    Scheme_Object   *line_list = NULL;
-     int                   i, old_len, new_len, hi, lo;
-     long          extra;
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, line_list);
-+    MZ_GC_REG();
-+
- #ifdef HAVE_SANDBOX
-     sandbox_check();
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"cscopeprg",   "csprg", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_CSCOPE
+                           (char_u *)&p_csprg, PV_NONE,
+                           {(char_u *)"cscope", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-     lo = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0));
-     hi = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 1));
-@@ -2047,11 +2239,11 @@ set_buffer_line_list(void *data, int arg
-     check_line_range(lo, buf->buf);       /* inclusive */
-     check_line_range(hi - 1, buf->buf);           /* exclusive */
-     if (SCHEME_FALSEP(line_list) || SCHEME_NULLP(line_list))
-     {
--      savebuf = curbuf;
-+      buf_T   *savebuf = curbuf;
-       curbuf = buf->buf;
-       if (u_savedel((linenr_T)lo, (long)old_len) == FAIL)
-       {
-           curbuf = savebuf;
-@@ -2063,115 +2255,138 @@ set_buffer_line_list(void *data, int arg
-               if (ml_delete((linenr_T)lo, FALSE) == FAIL)
-               {
-                   curbuf = savebuf;
-                   raise_vim_exn(_("cannot delete line"));
-               }
--          deleted_lines_mark((linenr_T)lo, (long)old_len);
-           if (buf->buf == curwin->w_buffer)
-               mz_fix_cursor(lo, hi, -old_len);
-+          deleted_lines_mark((linenr_T)lo, (long)old_len);
-       }
-       curbuf = savebuf;
-+      MZ_GC_UNREG();
-       raise_if_error();
-       return scheme_void;
-     }
-+    else
-+    {
-+      buf_T   *savebuf = curbuf;
--    /* List */
--    new_len = scheme_proper_list_length(line_list);
--    if (new_len < 0)  /* improper or cyclic list */
--      scheme_wrong_type(prim->name, "proper list",
--              2, argc, argv);
-+      /* List */
-+      new_len = scheme_proper_list_length(line_list);
-+      MZ_GC_CHECK();
-+      if (new_len < 0)        /* improper or cyclic list */
-+          scheme_wrong_type(prim->name, "proper list",
-+                  2, argc, argv);
-+      else
-+      {
-+          char                **array = NULL;
-+          Scheme_Object   *line = NULL;
-+          Scheme_Object   *rest = NULL;
-+
-+          MZ_GC_DECL_REG(2);
-+          MZ_GC_VAR_IN_REG(0, line);
-+          MZ_GC_VAR_IN_REG(1, rest);
-+          MZ_GC_REG();
--    /* Using MzScheme allocator, so we don't need to free this and
--     * can safely keep pointers to GC collected strings
--     */
--    array = (char **)scheme_malloc_fail_ok(scheme_malloc,
--              (unsigned)(new_len * sizeof(char *)));
-+          array = (char **)alloc(new_len * sizeof(char *));
-+          vim_memset(array, 0, new_len * sizeof(char *));
--    rest = line_list;
--    for (i = 0; i < new_len; ++i)
--    {
--      line = SCHEME_CAR(rest);
--      rest = SCHEME_CDR(rest);
--      if (!SCHEME_STRINGP(line))
--          scheme_wrong_type(prim->name, "string-list", 2, argc, argv);
--      array[i] = string_to_line(line);
--    }
-+          rest = line_list;
-+          for (i = 0; i < new_len; ++i)
-+          {
-+              line = SCHEME_CAR(rest);
-+              rest = SCHEME_CDR(rest);
-+              if (!SCHEME_STRINGP(line))
-+              {
-+                  free_array(array);
-+                  scheme_wrong_type(prim->name, "string-list", 2, argc, argv);
-+              }
-+              array[i] = string_to_line(line);
-+          }
--    savebuf = curbuf;
--    curbuf = buf->buf;
-+          curbuf = buf->buf;
--    if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
--    {
--      curbuf = savebuf;
--      raise_vim_exn(_("cannot save undo information"));
--    }
-+          if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
-+          {
-+              curbuf = savebuf;
-+              free_array(array);
-+              raise_vim_exn(_("cannot save undo information"));
-+          }
--    /*
--     * If the size of the range is reducing (ie, new_len < old_len) we
--     * need to delete some old_len. We do this at the start, by
--     * repeatedly deleting line "lo".
--     */
--    for (i = 0; i < old_len - new_len; ++i)
--    {
--      if (ml_delete((linenr_T)lo, FALSE) == FAIL)
--      {
--          curbuf = savebuf;
--          raise_vim_exn(_("cannot delete line"));
--      }
--      extra--;
--    }
-+          /*
-+           * If the size of the range is reducing (ie, new_len < old_len) we
-+           * need to delete some old_len. We do this at the start, by
-+           * repeatedly deleting line "lo".
-+           */
-+          for (i = 0; i < old_len - new_len; ++i)
-+          {
-+              if (ml_delete((linenr_T)lo, FALSE) == FAIL)
-+              {
-+                  curbuf = savebuf;
-+                  free_array(array);
-+                  raise_vim_exn(_("cannot delete line"));
-+              }
-+              extra--;
-+          }
--    /*
--     * For as long as possible, replace the existing old_len with the
--     * new old_len. This is a more efficient operation, as it requires
--     * less memory allocation and freeing.
--     */
--    for (i = 0; i < old_len && i < new_len; i++)
--      if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL)
--      {
--          curbuf = savebuf;
--          raise_vim_exn(_("cannot replace line"));
--      }
-+          /*
-+           * For as long as possible, replace the existing old_len with the
-+           * new old_len. This is a more efficient operation, as it requires
-+           * less memory allocation and freeing.
-+           */
-+          for (i = 0; i < old_len && i < new_len; i++)
-+              if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL)
-+              {
-+                  curbuf = savebuf;
-+                  free_array(array);
-+                  raise_vim_exn(_("cannot replace line"));
-+              }
--    /*
--     * Now we may need to insert the remaining new_len.  We don't need to
--     * free the string passed back because MzScheme has control of that
--     * memory.
--     */
--    while (i < new_len)
--    {
--      if (ml_append((linenr_T)(lo + i - 1),
--              (char_u *)array[i], 0, FALSE) == FAIL)
--      {
--          curbuf = savebuf;
--          raise_vim_exn(_("cannot insert line"));
-+          /*
-+           * Now we may need to insert the remaining new_len.  We don't need to
-+           * free the string passed back because MzScheme has control of that
-+           * memory.
-+           */
-+          while (i < new_len)
-+          {
-+              if (ml_append((linenr_T)(lo + i - 1),
-+                          (char_u *)array[i], 0, FALSE) == FAIL)
-+              {
-+                  curbuf = savebuf;
-+                  free_array(array);
-+                  raise_vim_exn(_("cannot insert line"));
-+              }
-+              ++i;
-+              ++extra;
-+          }
-+          MZ_GC_UNREG();
-+          free_array(array);
-       }
--      ++i;
--      ++extra;
--    }
--    /*
--     * Adjust marks. Invalidate any which lie in the
--     * changed range, and move any in the remainder of the buffer.
--     */
--    mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra);
--    changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
-+      /*
-+       * Adjust marks. Invalidate any which lie in the
-+       * changed range, and move any in the remainder of the buffer.
-+       */
-+      mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra);
-+      changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
--    if (buf->buf == curwin->w_buffer)
--      mz_fix_cursor(lo, hi, extra);
--    curbuf = savebuf;
-+      if (buf->buf == curwin->w_buffer)
-+          mz_fix_cursor(lo, hi, extra);
-+      curbuf = savebuf;
--    raise_if_error();
--    return scheme_void;
-+      MZ_GC_UNREG();
-+      raise_if_error();
-+      return scheme_void;
-+    }
- }
- /*
-  * (insert-buff-line-list {linenr} {string/string-list} [buffer])
-  *
-- * Insert a number of lines into the specified buffer after the specifed line.
-+ * Insert a number of lines into the specified buffer after the specified line.
-  * The line number is in Vim format (1-based). The lines to be inserted are
-  * given as an MzScheme list of string objects or as a single string. The lines
-  * to be added are checked for validity and correct format. Errors are
-  * returned as a value of FAIL.  The return value is OK on success.
-  * If OK is returned and len_change is not NULL, *len_change
-@@ -2179,19 +2394,19 @@ set_buffer_line_list(void *data, int arg
-  */
-     static Scheme_Object *
- insert_buffer_line_list(void *data, int argc, Scheme_Object **argv)
- {
-     Vim_Prim      *prim = (Vim_Prim *)data;
--    vim_mz_buffer   *buf;
--    Scheme_Object   *list;
--    Scheme_Object   *line;
--    Scheme_Object   *rest;
--    char          **array;
--    char          *str;
--    buf_T         *savebuf;
-+    vim_mz_buffer   *buf = NULL;
-+    Scheme_Object   *list = NULL;
-+    char          *str = NULL;
-     int                   i, n, size;
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, list);
-+    MZ_GC_REG();
-+
- #ifdef HAVE_SANDBOX
-     sandbox_check();
+-                          },
++                          SCRIPTID_INIT},
+     {"cscopequickfix", "csqf", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #if defined(FEAT_CSCOPE) && defined(FEAT_QUICKFIX)
+                           (char_u *)&p_csqf, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-     /*
-      * First of all, we check the type of the supplied MzScheme object.
-@@ -2206,93 +2421,103 @@ insert_buffer_line_list(void *data, int
-     if (n != 0)           /* 0 can be used in insert */
-       check_line_range(n, buf->buf);
-     if (SCHEME_STRINGP(list))
-     {
--      str = string_to_line(list);
-+      buf_T       *savebuf = curbuf;
--      savebuf = curbuf;
-+      str = string_to_line(list);
-       curbuf = buf->buf;
-       if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL)
-       {
-           curbuf = savebuf;
-+          vim_free(str);
-           raise_vim_exn(_("cannot save undo information"));
-       }
-       else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL)
-       {
-           curbuf = savebuf;
-+          vim_free(str);
-           raise_vim_exn(_("cannot insert line"));
-       }
-       else
-+      {
-+          vim_free(str);
-           appended_lines_mark((linenr_T)n, 1L);
-+      }
-       curbuf = savebuf;
-       update_screen(VALID);
-+      MZ_GC_UNREG();
-       raise_if_error();
-       return scheme_void;
-     }
-     /* List */
-     size = scheme_proper_list_length(list);
-+    MZ_GC_CHECK();
-     if (size < 0)     /* improper or cyclic list */
-       scheme_wrong_type(prim->name, "proper list",
-               2, argc, argv);
--
--    /* Using MzScheme allocator, so we don't need to free this and
--     * can safely keep pointers to GC collected strings
--     */
--    array = (char **)scheme_malloc_fail_ok(
--          scheme_malloc, (unsigned)(size * sizeof(char *)));
--
--    rest = list;
--    for (i = 0; i < size; ++i)
-+    else
-     {
--      line = SCHEME_CAR(rest);
--      rest = SCHEME_CDR(rest);
--      array[i] = string_to_line(line);
--    }
-+      Scheme_Object   *line = NULL;
-+      Scheme_Object   *rest = NULL;
-+      char            **array;
-+      buf_T           *savebuf = curbuf;
-+
-+      MZ_GC_DECL_REG(2);
-+      MZ_GC_VAR_IN_REG(0, line);
-+      MZ_GC_VAR_IN_REG(1, rest);
-+      MZ_GC_REG();
--    savebuf = curbuf;
--    curbuf = buf->buf;
-+      array = (char **)alloc(size * sizeof(char *));
-+      vim_memset(array, 0, size * sizeof(char *));
--    if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
--    {
--      curbuf = savebuf;
--      raise_vim_exn(_("cannot save undo information"));
--    }
--    else
--    {
-+      rest = list;
-       for (i = 0; i < size; ++i)
--          if (ml_append((linenr_T)(n + i), (char_u *)array[i],
--                      0, FALSE) == FAIL)
--          {
--              curbuf = savebuf;
--              raise_vim_exn(_("cannot insert line"));
--          }
-+      {
-+          line = SCHEME_CAR(rest);
-+          rest = SCHEME_CDR(rest);
-+          array[i] = string_to_line(line);
-+      }
--      if (i > 0)
--          appended_lines_mark((linenr_T)n, (long)i);
--    }
-+      curbuf = buf->buf;
--    curbuf = savebuf;
--    update_screen(VALID);
-+      if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
-+      {
-+          curbuf = savebuf;
-+          free_array(array);
-+          raise_vim_exn(_("cannot save undo information"));
-+      }
-+      else
-+      {
-+          for (i = 0; i < size; ++i)
-+              if (ml_append((linenr_T)(n + i), (char_u *)array[i],
-+                          0, FALSE) == FAIL)
-+              {
-+                  curbuf = savebuf;
-+                  free_array(array);
-+                  raise_vim_exn(_("cannot insert line"));
-+              }
-+          if (i > 0)
-+              appended_lines_mark((linenr_T)n, (long)i);
-+      }
-+      free_array(array);
-+      MZ_GC_UNREG();
-+      curbuf = savebuf;
-+      update_screen(VALID);
-+    }
-+
-+    MZ_GC_UNREG();
-     raise_if_error();
-     return scheme_void;
- }
--/* (get-buff-namespace [buffer]) */
--    static Scheme_Object *
--get_buffer_namespace(void *data, int argc, Scheme_Object **argv)
--{
--    Vim_Prim  *prim = (Vim_Prim *)data;
--
--    return (Scheme_Object *)get_buffer_arg(prim->name, 0, argc, argv)->env;
--}
--
- /*
-  * Predicates
-  */
- /* (buff? obj) */
-     static Scheme_Object *
-@@ -2343,44 +2568,395 @@ vim_window_validp(void *data, int argc,
-  */
- /*
-  * Convert an MzScheme string into a Vim line.
-  *
-- * The result is in allocated memory. All internal nulls are replaced by
-- * newline characters. It is an error for the string to contain newline
-- * characters.
-+ * All internal nulls are replaced by newline characters.
-+ * It is an error for the string to contain newline characters.
-  *
-+ * Returns pointer to Vim allocated memory
-  */
-     static char *
- string_to_line(Scheme_Object *obj)
- {
--    char      *str;
-+    char      *scheme_str = NULL;
-+    char      *vim_str = NULL;
-     long      len;
-     int               i;
--    str = scheme_display_to_string(obj, &len);
-+    scheme_str = scheme_display_to_string(obj, &len);
-     /* Error checking: String must not contain newlines, as we
-      * are replacing a single line, and we must replace it with
-      * a single line.
-      */
--    if (memchr(str, '\n', len))
-+    if (memchr(scheme_str, '\n', len))
-       scheme_signal_error(_("string cannot contain newlines"));
-+    vim_str = (char *)alloc(len + 1);
-+
-     /* Create a copy of the string, with internal nulls replaced by
-      * newline characters, as is the vim convention.
-      */
-     for (i = 0; i < len; ++i)
-     {
--      if (str[i] == '\0')
--          str[i] = '\n';
-+      if (scheme_str[i] == '\0')
-+          vim_str[i] = '\n';
-+      else
-+          vim_str[i] = scheme_str[i];
-+    }
-+
-+    vim_str[i] = '\0';
-+
-+    MZ_GC_CHECK();
-+    return vim_str;
-+}
-+
-+#ifdef FEAT_EVAL
-+/*
-+ * Convert Vim value into MzScheme, adopted from if_python.c
-+ */
-+    static Scheme_Object *
-+vim_to_mzscheme(typval_T *vim_value, int depth, Scheme_Hash_Table *visited)
-+{
-+    Scheme_Object   *result = NULL;
-+    int                   new_value = TRUE;
-+
-+    MZ_GC_DECL_REG(1);
-+    MZ_GC_VAR_IN_REG(0, result);
-+    MZ_GC_REG();
-+
-+    /* Avoid infinite recursion */
-+    if (depth > 100)
-+    {
-+      MZ_GC_UNREG();
-+      return scheme_void;
-+    }
-+
-+    /* Check if we run into a recursive loop.  The item must be in visited
-+     * then and we can use it again.
-+     */
-+    result = scheme_hash_get(visited, (Scheme_Object *)vim_value);
-+    MZ_GC_CHECK();
-+    if (result != NULL) /* found, do nothing */
-+      new_value = FALSE;
-+    else if (vim_value->v_type == VAR_STRING)
-+    {
-+      result = scheme_make_string((char *)vim_value->vval.v_string);
-+      MZ_GC_CHECK();
-+    }
-+    else if (vim_value->v_type == VAR_NUMBER)
-+    {
-+      result = scheme_make_integer((long)vim_value->vval.v_number);
-+      MZ_GC_CHECK();
-+    }
-+# ifdef FEAT_FLOAT
-+    else if (vim_value->v_type == VAR_FLOAT)
-+    {
-+      result = scheme_make_double((double)vim_value->vval.v_float);
-+      MZ_GC_CHECK();
-+    }
-+# endif
-+    else if (vim_value->v_type == VAR_LIST)
-+    {
-+      list_T          *list = vim_value->vval.v_list;
-+      listitem_T      *curr;
-+
-+      if (list == NULL || list->lv_first == NULL)
-+          result = scheme_null;
-+      else
-+      {
-+          Scheme_Object   *obj = NULL;
-+
-+          MZ_GC_DECL_REG(1);
-+          MZ_GC_VAR_IN_REG(0, obj);
-+          MZ_GC_REG();
-+
-+          curr = list->lv_last;
-+          obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited);
-+          result = scheme_make_pair(obj, scheme_null);
-+          MZ_GC_CHECK();
-+
-+          while (curr != list->lv_first)
-+          {
-+              curr = curr->li_prev;
-+              obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited);
-+              result = scheme_make_pair(obj, result);
-+              MZ_GC_CHECK();
-+          }
-+      }
-+      MZ_GC_UNREG();
-+    }
-+    else if (vim_value->v_type == VAR_DICT)
-+    {
-+      Scheme_Object     *key = NULL;
-+      Scheme_Object     *obj = NULL;
-+
-+      MZ_GC_DECL_REG(2);
-+      MZ_GC_VAR_IN_REG(0, key);
-+      MZ_GC_VAR_IN_REG(1, obj);
-+      MZ_GC_REG();
-+
-+      result = (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr);
-+      MZ_GC_CHECK();
-+      if (vim_value->vval.v_dict != NULL)
-+      {
-+          hashtab_T   *ht = &vim_value->vval.v_dict->dv_hashtab;
-+          long_u      todo = ht->ht_used;
-+          hashitem_T  *hi;
-+          dictitem_T  *di;
-+
-+          for (hi = ht->ht_array; todo > 0; ++hi)
-+          {
-+              if (!HASHITEM_EMPTY(hi))
-+              {
-+                  --todo;
-+
-+                  di = dict_lookup(hi);
-+                  obj = vim_to_mzscheme(&di->di_tv, depth + 1, visited);
-+                  key = scheme_make_string((char *)hi->hi_key);
-+                  MZ_GC_CHECK();
-+                  scheme_hash_set((Scheme_Hash_Table *)result, key, obj);
-+                  MZ_GC_CHECK();
-+              }
-+          }
-+      }
-+      MZ_GC_UNREG();
-+    }
-+    else
-+    {
-+      result = scheme_void;
-+      new_value = FALSE;
-+    }
-+    if (new_value)
-+    {
-+      scheme_hash_set(visited, (Scheme_Object *)vim_value, result);
-+      MZ_GC_CHECK();
-+    }
-+    MZ_GC_UNREG();
-+    return result;
-+}
-+
-+    static int
-+mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth,
-+      Scheme_Hash_Table *visited)
-+{
-+    int               status = OK;
-+    typval_T  *found;
-+    MZ_GC_CHECK();
-+    if (depth > 100) /* limit the deepest recursion level */
-+    {
-+      tv->v_type = VAR_NUMBER;
-+      tv->vval.v_number = 0;
-+      return FAIL;
-+    }
-+
-+    found = (typval_T *)scheme_hash_get(visited, obj);
-+    if (found != NULL)
-+      copy_tv(found, tv);
-+    else if (SCHEME_VOIDP(obj))
-+    {
-+      tv->v_type = VAR_NUMBER;
-+      tv->vval.v_number = 0;
-+    }
-+    else if (SCHEME_INTP(obj))
-+    {
-+      tv->v_type = VAR_NUMBER;
-+      tv->vval.v_number = SCHEME_INT_VAL(obj);
-+    }
-+    else if (SCHEME_BOOLP(obj))
-+    {
-+      tv->v_type = VAR_NUMBER;
-+      tv->vval.v_number = SCHEME_TRUEP(obj);
-+    }
-+# ifdef FEAT_FLOAT
-+    else if (SCHEME_DBLP(obj))
-+    {
-+      tv->v_type = VAR_FLOAT;
-+      tv->vval.v_float = SCHEME_DBL_VAL(obj);
-+    }
-+# endif
-+    else if (SCHEME_STRINGP(obj))
-+    {
-+      tv->v_type = VAR_STRING;
-+      tv->vval.v_string = vim_strsave((char_u *)SCHEME_STR_VAL(obj));
-+    }
-+    else if (SCHEME_VECTORP(obj) || SCHEME_NULLP(obj)
-+          || SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj))
-+    {
-+      list_T  *list = list_alloc();
-+      if (list == NULL)
-+          status = FAIL;
-+      else
-+      {
-+          int             i;
-+          Scheme_Object   *curr = NULL;
-+          Scheme_Object   *cval = NULL;
-+          /* temporary var to hold current element of vectors and pairs */
-+          typval_T        *v;
-+
-+          MZ_GC_DECL_REG(2);
-+          MZ_GC_VAR_IN_REG(0, curr);
-+          MZ_GC_VAR_IN_REG(1, cval);
-+          MZ_GC_REG();
-+
-+          tv->v_type = VAR_LIST;
-+          tv->vval.v_list = list;
-+          ++list->lv_refcount;
-+
-+          v = (typval_T *)alloc(sizeof(typval_T));
-+          if (v == NULL)
-+              status = FAIL;
-+          else
-+          {
-+              /* add the value in advance to allow handling of self-referencial
-+               * data structures */
-+              typval_T    *visited_tv = (typval_T *)alloc(sizeof(typval_T));
-+              copy_tv(tv, visited_tv);
-+              scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv);
-+
-+              if (SCHEME_VECTORP(obj))
-+              {
-+                  for (i = 0; i < SCHEME_VEC_SIZE(obj); ++i)
-+                  {
-+                      cval = SCHEME_VEC_ELS(obj)[i];
-+                      status = mzscheme_to_vim(cval, v, depth + 1, visited);
-+                      if (status == FAIL)
-+                          break;
-+                      status = list_append_tv(list, v);
-+                      clear_tv(v);
-+                      if (status == FAIL)
-+                          break;
-+                  }
-+              }
-+              else if (SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj))
-+              {
-+                  for (curr = obj;
-+                          SCHEME_PAIRP(curr) || SCHEME_MUTABLE_PAIRP(curr);
-+                          curr = SCHEME_CDR(curr))
-+                  {
-+                      cval = SCHEME_CAR(curr);
-+                      status = mzscheme_to_vim(cval, v, depth + 1, visited);
-+                      if (status == FAIL)
-+                          break;
-+                      status = list_append_tv(list, v);
-+                      clear_tv(v);
-+                      if (status == FAIL)
-+                          break;
-+                  }
-+                  /* impoper list not terminated with null
-+                   * need to handle the last element */
-+                  if (status == OK && !SCHEME_NULLP(curr))
-+                  {
-+                      status = mzscheme_to_vim(cval, v, depth + 1, visited);
-+                      if (status == OK)
-+                      {
-+                          status = list_append_tv(list, v);
-+                          clear_tv(v);
-+                      }
-+                  }
-+              }
-+              /* nothing to do for scheme_null */
-+              vim_free(v);
-+          }
-+          MZ_GC_UNREG();
-+      }
-+    }
-+    else if (SCHEME_HASHTP(obj))
-+    {
-+      int             i;
-+      dict_T          *dict;
-+      Scheme_Object   *key = NULL;
-+      Scheme_Object   *val = NULL;
-+
-+      MZ_GC_DECL_REG(2);
-+      MZ_GC_VAR_IN_REG(0, key);
-+      MZ_GC_VAR_IN_REG(1, val);
-+      MZ_GC_REG();
-+
-+      dict = dict_alloc();
-+      if (dict == NULL)
-+          status = FAIL;
-+      else
-+      {
-+          typval_T    *visited_tv = (typval_T *)alloc(sizeof(typval_T));
-+
-+          tv->v_type = VAR_DICT;
-+          tv->vval.v_dict = dict;
-+          ++dict->dv_refcount;
-+
-+          copy_tv(tv, visited_tv);
-+          scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv);
-+
-+          for (i = 0; i < ((Scheme_Hash_Table *)obj)->size; ++i)
-+          {
-+              if (((Scheme_Hash_Table *) obj)->vals[i] != NULL)
-+              {
-+                  /* generate item for `diplay'ed Scheme key */
-+                  dictitem_T  *item = dictitem_alloc((char_u *)string_to_line(
-+                              ((Scheme_Hash_Table *) obj)->keys[i]));
-+                  /* convert Scheme val to Vim and add it to the dict */
-+                  if (mzscheme_to_vim(((Scheme_Hash_Table *) obj)->vals[i],
-+                                  &item->di_tv, depth + 1, visited) == FAIL
-+                          || dict_add(dict, item) == FAIL)
-+                  {
-+                      dictitem_free(item);
-+                      status = FAIL;
-+                      break;
-+                  }
-+              }
-+
-+          }
-+      }
-+      MZ_GC_UNREG();
-+    }
-+    else
-+    {
-+      /* `display' any other value to string */
-+      tv->v_type = VAR_STRING;
-+      tv->vval.v_string = (char_u *)string_to_line(obj);
-     }
-+    return status;
-+}
-+
-+    void
-+do_mzeval(char_u *str, typval_T *rettv)
-+{
-+    int i;
-+    Scheme_Object     *ret = NULL;
-+    Scheme_Hash_Table *visited = NULL;
--    str[i] = '\0';
-+    MZ_GC_DECL_REG(2);
-+    MZ_GC_VAR_IN_REG(0, ret);
-+    MZ_GC_VAR_IN_REG(0, visited);
-+    MZ_GC_REG();
-+
-+    if (mzscheme_init())
-+    {
-+      MZ_GC_UNREG();
-+      return;
-+    }
--    return str;
-+    MZ_GC_CHECK();
-+    visited = scheme_make_hash_table(SCHEME_hash_ptr);
-+    MZ_GC_CHECK();
-+
-+    if (eval_with_exn_handling(str, do_eval, &ret) == OK)
-+      mzscheme_to_vim(ret, rettv, 1, visited);
-+
-+    for (i = 0; i < visited->size; ++i)
-+    {
-+      /* free up remembered objects */
-+      if (visited->vals[i] != NULL)
-+      {
-+          free_tv((typval_T *)visited->vals[i]);
-+      }
-+    }
-+
-+    MZ_GC_UNREG();
- }
-+#endif
- /*
-  * Check to see whether a Vim error has been reported, or a keyboard
-  * interrupt (from vim --> got_int) has been detected.
-  */
-@@ -2392,82 +2968,119 @@ vim_error_check(void)
- /*
-  * register Scheme exn:vim
-  */
-     static void
--register_vim_exn(Scheme_Env *env)
-+register_vim_exn(void)
- {
--    Scheme_Object   *exn_name = scheme_intern_symbol("exn:vim");
-+    int       nc = 0;
-+    int i;
-+    Scheme_Object   *struct_exn = NULL;
-+    Scheme_Object   *exn_name = NULL;
-+
-+    MZ_GC_DECL_REG(2);
-+    MZ_GC_VAR_IN_REG(0, struct_exn);
-+    MZ_GC_VAR_IN_REG(1, exn_name);
-+    MZ_GC_REG();
-+
-+    exn_name = scheme_intern_symbol("exn:vim");
-+    MZ_GC_CHECK();
-+    struct_exn = scheme_builtin_value("struct:exn");
-+    MZ_GC_CHECK();
-     if (vim_exn == NULL)
-       vim_exn = scheme_make_struct_type(exn_name,
--              scheme_builtin_value("struct:exn"), NULL, 0, 0, NULL, NULL
-+              struct_exn, NULL, 0, 0, NULL, NULL
- #if MZSCHEME_VERSION_MAJOR >= 299
-               , NULL
+-                          },
++                          SCRIPTID_INIT},
+     {"cscopetag",   "cst",  P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_CSCOPE
+                           (char_u *)&p_cst, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-               );
--    if (vim_exn_values == NULL)
--    {
--      int     nc = 0;
--      Scheme_Object   **exn_names = scheme_make_struct_names(
--              exn_name, scheme_null, 0, &nc);
--      Scheme_Object   **exn_values = scheme_make_struct_values(
--              vim_exn, exn_names, nc, 0);
--
--      vim_exn_names = scheme_make_vector(nc, scheme_false);
--      vim_exn_values = scheme_make_vector(nc, scheme_false);
--      /* remember names and values */
--      mch_memmove(SCHEME_VEC_ELS(vim_exn_names), exn_names,
--              nc * sizeof(Scheme_Object *));
--      mch_memmove(SCHEME_VEC_ELS(vim_exn_values), exn_values,
--              nc * sizeof(Scheme_Object *));
-+    {
-+      Scheme_Object   **tmp = NULL;
-+      Scheme_Object   *exn_names[5] = {NULL, NULL, NULL, NULL, NULL};
-+      Scheme_Object   *exn_values[5] = {NULL, NULL, NULL, NULL, NULL};
-+      MZ_GC_DECL_REG(6);
-+      MZ_GC_ARRAY_VAR_IN_REG(0, exn_names, 5);
-+      MZ_GC_ARRAY_VAR_IN_REG(3, exn_values, 5);
-+      MZ_GC_REG();
-+
-+      tmp = scheme_make_struct_names(exn_name, scheme_null, 0, &nc);
-+      assert(nc <= 5);
-+      mch_memmove(exn_names, tmp, nc * sizeof(Scheme_Object *));
-+      MZ_GC_CHECK();
-+
-+      tmp = scheme_make_struct_values(vim_exn, exn_names, nc, 0);
-+      mch_memmove(exn_values, tmp, nc * sizeof(Scheme_Object *));
-+      MZ_GC_CHECK();
-+
-+      for (i = 0; i < nc; i++)
-+      {
-+          scheme_add_global_symbol(exn_names[i],
-+                  exn_values[i], environment);
-+          MZ_GC_CHECK();
-+      }
-+      MZ_GC_UNREG();
-     }
--
--    add_vim_exn(env);
--}
--
--/*
-- * Add stuff of exn:vim to env
-- */
--    static void
--add_vim_exn(Scheme_Env *env)
--{
--    int i;
--
--    for (i = 0; i < SCHEME_VEC_SIZE(vim_exn_values); i++)
--      scheme_add_global_symbol(SCHEME_VEC_ELS(vim_exn_names)[i],
--              SCHEME_VEC_ELS(vim_exn_values)[i], env);
-+    MZ_GC_UNREG();
- }
- /*
-  * raise exn:vim, may be with additional info string
-  */
-     void
- raise_vim_exn(const char *add_info)
- {
--    Scheme_Object   *argv[2];
--    char_u        *fmt = _("Vim error: ~a");
-+    char          *fmt = _("Vim error: ~a");
-+    Scheme_Object   *argv[2] = {NULL, NULL};
-+    Scheme_Object   *exn = NULL;
-+
-+    MZ_GC_DECL_REG(4);
-+    MZ_GC_ARRAY_VAR_IN_REG(0, argv, 2);
-+    MZ_GC_VAR_IN_REG(3, exn);
-+    MZ_GC_REG();
-     if (add_info != NULL)
-     {
--      Scheme_Object   *info = scheme_make_string(add_info);
--      argv[0] = scheme_byte_string_to_char_string(scheme_make_string(
--              scheme_format(fmt, strlen(fmt), 1, &info, NULL)));
-+      char            *c_string = NULL;
-+      Scheme_Object   *byte_string = NULL;
-+      Scheme_Object   *info = NULL;
-+
-+      MZ_GC_DECL_REG(3);
-+      MZ_GC_VAR_IN_REG(0, c_string);
-+      MZ_GC_VAR_IN_REG(1, byte_string);
-+      MZ_GC_VAR_IN_REG(2, info);
-+      MZ_GC_REG();
-+
-+      info = scheme_make_string(add_info);
-+      MZ_GC_CHECK();
-+      c_string = scheme_format(fmt, STRLEN(fmt), 1, &info, NULL);
-+      MZ_GC_CHECK();
-+      byte_string = scheme_make_string(c_string);
-+      MZ_GC_CHECK();
-+      argv[0] = scheme_byte_string_to_char_string(byte_string);
-+      MZ_GC_CHECK();
-       SCHEME_SET_IMMUTABLE(argv[0]);
-+      MZ_GC_UNREG();
-     }
-     else
-       argv[0] = scheme_make_string(_("Vim error"));
-+    MZ_GC_CHECK();
- #if MZSCHEME_VERSION_MAJOR < 360
-     argv[1] = scheme_current_continuation_marks();
-+    MZ_GC_CHECK();
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"cscopetagorder", "csto", P_NUM|P_VI_DEF|P_VIM,
+ #ifdef FEAT_CSCOPE
+                           (char_u *)&p_csto, PV_NONE,
  #else
-     argv[1] = scheme_current_continuation_marks(NULL);
-+    MZ_GC_CHECK();
+                           (char_u *)NULL, PV_NONE,
  #endif
--    scheme_raise(scheme_make_struct_instance(vim_exn, 2, argv));
-+    exn = scheme_make_struct_instance(vim_exn, 2, argv);
-+    MZ_GC_CHECK();
-+    scheme_raise(exn);
-+    MZ_GC_UNREG();
- }
-     void
- raise_if_error(void)
- {
-@@ -2570,10 +3183,12 @@ mz_fix_cursor(int lo, int hi, int extra)
-       else if (extra < 0)
-       {
-           curwin->w_cursor.lnum = lo;
-           check_cursor();
-       }
-+      else
-+          check_cursor_col();
-       changed_cline_bef_curs();
-     }
-     invalidate_botline();
- }
-@@ -2595,11 +3210,10 @@ static Vim_Prim prims[]=
-     {get_next_buffer, "get-next-buff", 0, 1},
-     {get_prev_buffer, "get-prev-buff", 0, 1},
-     {mzscheme_open_buffer, "open-buff", 1, 1},
-     {get_buffer_by_name, "get-buff-by-name", 1, 1},
-     {get_buffer_by_num, "get-buff-by-num", 1, 1},
--    {get_buffer_namespace, "get-buff-namespace", 0, 1},
-     /*
-      * Window-related commands
-      */
-     {get_curr_win, "curr-win", 0, 0},
-     {get_window_count, "win-count", 0, 0},
-@@ -2653,27 +3267,39 @@ get_vim_curr_window(void)
-     else
-       return (vim_mz_window *)curwin->w_mzscheme_ref;
- }
-     static void
--make_modules(Scheme_Env *env)
-+make_modules()
- {
--    int               i;
--    Scheme_Env        *mod;
--
--    mod = scheme_primitive_module(scheme_intern_symbol("vimext"), env);
-+    int                   i;
-+    Scheme_Env            *mod = NULL;
-+    Scheme_Object   *vimext_symbol = NULL;
-+    Scheme_Object   *closed_prim = NULL;
-+
-+    MZ_GC_DECL_REG(3);
-+    MZ_GC_VAR_IN_REG(0, mod);
-+    MZ_GC_VAR_IN_REG(1, vimext_symbol);
-+    MZ_GC_VAR_IN_REG(2, closed_prim);
-+    MZ_GC_REG();
-+
-+    vimext_symbol = scheme_intern_symbol("vimext");
-+    MZ_GC_CHECK();
-+    mod = scheme_primitive_module(vimext_symbol, environment);
-+    MZ_GC_CHECK();
-     /* all prims made closed so they can access their own names */
--    for (i = 0; i < sizeof(prims)/sizeof(prims[0]); i++)
-+    for (i = 0; i < (int)(sizeof(prims)/sizeof(prims[0])); i++)
-     {
-       Vim_Prim *prim = prims + i;
--      scheme_add_global(prim->name,
--              scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name,
--                  prim->mina, prim->maxa),
--              mod);
-+      closed_prim = scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name,
-+                          prim->mina, prim->maxa);
-+      scheme_add_global(prim->name, closed_prim, mod);
-+      MZ_GC_CHECK();
-     }
--    scheme_add_global("global-namespace", (Scheme_Object *)environment, mod);
-     scheme_finish_primitive_module(mod);
-+    MZ_GC_CHECK();
-+    MZ_GC_UNREG();
- }
- #ifdef HAVE_SANDBOX
- static Scheme_Object *M_write = NULL;
- static Scheme_Object *M_read = NULL;
-@@ -2697,25 +3323,29 @@ sandbox_file_guard(int argc, Scheme_Obje
-       if (M_write == NULL)
-       {
-           MZ_REGISTER_STATIC(M_write);
-           M_write = scheme_intern_symbol("write");
-+          MZ_GC_CHECK();
-       }
-       if (M_read == NULL)
-       {
-           MZ_REGISTER_STATIC(M_read);
-           M_read = scheme_intern_symbol("read");
-+          MZ_GC_CHECK();
-       }
-       if (M_execute == NULL)
-       {
-           MZ_REGISTER_STATIC(M_execute);
-           M_execute = scheme_intern_symbol("execute");
-+          MZ_GC_CHECK();
-       }
-       if (M_delete == NULL)
-       {
-           MZ_REGISTER_STATIC(M_delete);
-           M_delete = scheme_intern_symbol("delete");
-+          MZ_GC_CHECK();
-       }
-       while (!SCHEME_NULLP(requested_access))
-       {
-           Scheme_Object *item = SCHEME_CAR(requested_access);
---- vim72.orig/src/gui_at_fs.c
-+++ vim72/src/gui_at_fs.c
-@@ -827,11 +827,11 @@ SFsetText(path)
-     text.length = strlen(path);
-     text.ptr = path;
-     text.format = FMT8BIT;
- #ifdef XtNinternational
--    if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
-+    if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
-     {
-       XawTextReplace(selFileField, (XawTextPosition)0,
-                                   (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0]), &text);
-       XawTextSetInsertionPoint(selFileField,
-                                          (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0]));
-@@ -849,21 +849,19 @@ SFsetText(path)
-     XawTextSetInsertionPoint(selFileField,
-                                      (XawTextPosition)strlen(SFtextBuffer));
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"cscopeverbose", "csverb", P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_CSCOPE
+                           (char_u *)&p_csverbose, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
- }
--/* ARGSUSED */
-     static void
- SFbuttonPressList(w, n, event)
--    Widget            w;
--    int                       n;
--    XButtonPressedEvent       *event;
-+    Widget            w UNUSED;
-+    int                       n UNUSED;
-+    XButtonPressedEvent       *event UNUSED;
- {
-     SFbuttonPressed = 1;
- }
--/* ARGSUSED */
-     static void
- SFbuttonReleaseList(w, n, event)
-     Widget             w;
-     int                        n;
-     XButtonReleasedEvent *event;
-@@ -987,15 +985,14 @@ SFcheckFiles(dir)
-     }
-     return result;
- }
--/* ARGSUSED */
-     static void
- SFdirModTimer(cl, id)
--    XtPointer         cl;
--    XtIntervalId      *id;
-+    XtPointer         cl UNUSED;
-+    XtIntervalId      *id UNUSED;
- {
-     static int                n = -1;
-     static int                f = 0;
-     char              save;
-     SFDir             *dir;
-@@ -1594,15 +1591,14 @@ SFscrollTimerInterval()
-     return (unsigned long)t;
- }
- static void SFscrollTimer __ARGS((XtPointer p, XtIntervalId *id));
--/* ARGSUSED */
-     static void
- SFscrollTimer(p, id)
-     XtPointer         p;
--    XtIntervalId      *id;
-+    XtIntervalId      *id UNUSED;
- {
-     SFDir     *dir;
-     int               save;
-     int               n;
-@@ -1693,14 +1689,13 @@ SFnewInvertEntry(n, event)
-       }
-       return -1;
-     }
- }
--/* ARGSUSED */
-     static void
- SFenterList(w, n, event)
--    Widget            w;
-+    Widget            w UNUSED;
-     int                       n;
-     XEnterWindowEvent *event;
- {
-     int                       nw;
-@@ -1717,28 +1712,26 @@ SFenterList(w, n, event)
-       SFcurrentInvert[n] = nw;
-       SFinvertEntry(n);
-     }
- }
--/* ARGSUSED */
-     static void
- SFleaveList(w, n, event)
--    Widget    w;
-+    Widget    w UNUSED;
-     int               n;
--    XEvent    *event;
-+    XEvent    *event UNUSED;
- {
-     if (SFcurrentInvert[n] != -1)
-     {
-       SFinvertEntry(n);
-       SFcurrentInvert[n] = -1;
-     }
- }
--/* ARGSUSED */
-     static void
- SFmotionList(w, n, event)
--    Widget            w;
-+    Widget            w UNUSED;
-     int                       n;
-     XMotionEvent      *event;
- {
-     int               nw;
-@@ -1752,11 +1745,10 @@ SFmotionList(w, n, event)
-       if (nw != -1)
-           SFinvertEntry(n);
-     }
- }
--/* ARGSUSED */
-     static void
- SFvFloatSliderMovedCallback(w, n, fnew)
-     Widget    w;
-     XtPointer n;
-     XtPointer fnew;
-@@ -1765,14 +1757,13 @@ SFvFloatSliderMovedCallback(w, n, fnew)
-     nw = (*(float *)fnew) * SFdirs[SFdirPtr + (int)(long)n].nEntries;
-     SFvSliderMovedCallback(w, (int)(long)n, nw);
- }
--/* ARGSUSED */
-     static void
- SFvSliderMovedCallback(w, n, nw)
--    Widget    w;
-+    Widget    w UNUSED;
-     int               n;
-     int               nw;
- {
-     int               old;
-     Window    win;
-@@ -1851,14 +1842,13 @@ SFvSliderMovedCallback(w, n, nw)
-               False);
-       SFdrawStrings(win, dir, 0, SFlistSize - 1);
-     }
- }
--/* ARGSUSED */
-     static void
- SFvAreaSelectedCallback(w, n, pnew)
--    Widget            w;
-+    Widget    w;
-     XtPointer n;
-     XtPointer pnew;
- {
-     SFDir     *dir;
-     int               nw = (int)(long)pnew;
-@@ -1912,14 +1902,13 @@ SFvAreaSelectedCallback(w, n, pnew)
-     }
-     SFvSliderMovedCallback(w, (int)(long)n, nw);
- }
--/* ARGSUSED */
-     static void
- SFhSliderMovedCallback(w, n, nw)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer n;
-     XtPointer nw;
- {
-     SFDir     *dir;
-     int       save;
-@@ -1931,14 +1920,13 @@ SFhSliderMovedCallback(w, n, nw)
-       return;
-     SFdrawList((int)(long)n, SF_DO_NOT_SCROLL);
- }
--/* ARGSUSED */
-     static void
- SFhAreaSelectedCallback(w, n, pnew)
--    Widget            w;
-+    Widget    w;
-     XtPointer n;
-     XtPointer pnew;
- {
-     SFDir     *dir;
-     int               nw = (int)(long)pnew;
-@@ -1992,15 +1980,14 @@ SFhAreaSelectedCallback(w, n, pnew)
-       SFhSliderMovedCallback(w, n, (XtPointer)&f);
-     }
- }
--/* ARGSUSED */
-     static void
- SFpathSliderMovedCallback(w, client_data, nw)
--    Widget            w;
--    XtPointer client_data;
-+    Widget    w UNUSED;
-+    XtPointer client_data UNUSED;
-     XtPointer nw;
- {
-     SFDir             *dir;
-     int                       n;
-     XawTextPosition   pos;
-@@ -2029,15 +2016,14 @@ SFpathSliderMovedCallback(w, client_data
-     }
-     XawTextSetInsertionPoint(selFileField, pos);
- }
--/* ARGSUSED */
-     static void
- SFpathAreaSelectedCallback(w, client_data, pnew)
-     Widget    w;
--    XtPointer client_data;
-+    XtPointer client_data UNUSED;
-     XtPointer pnew;
- {
-     int               nw = (int)(long)pnew;
-     float     f;
-@@ -2204,33 +2190,31 @@ static char *oneLineTextEditTranslations
-       Ctrl<Key>M:     redraw-display()\n\
- ";
- static void SFexposeList __ARGS((Widget w, XtPointer n, XEvent *event, Boolean *cont));
--/* ARGSUSED */
-     static void
- SFexposeList(w, n, event, cont)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer n;
-     XEvent    *event;
--    Boolean   *cont;
-+    Boolean   *cont UNUSED;
- {
-     if ((event->type == NoExpose) || event->xexpose.count)
-       return;
-     SFdrawList((int)(long)n, SF_DO_NOT_SCROLL);
- }
- static void SFmodVerifyCallback __ARGS((Widget w, XtPointer client_data, XEvent *event, Boolean *cont));
--/* ARGSUSED */
-     static void
- SFmodVerifyCallback(w, client_data, event, cont)
--    Widget            w;
--    XtPointer         client_data;
-+    Widget            w UNUSED;
-+    XtPointer         client_data UNUSED;
-     XEvent            *event;
--    Boolean           *cont;
-+    Boolean           *cont UNUSED;
- {
-     char      buf[2];
-     if ((XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) &&
-           ((*buf) == '\r'))
-@@ -2239,15 +2223,15 @@ SFmodVerifyCallback(w, client_data, even
-       SFstatus = SEL_FILE_TEXT;
- }
- static void SFokCallback __ARGS((Widget w, XtPointer cl, XtPointer cd));
--/* ARGSUSED */
-     static void
- SFokCallback(w, cl, cd)
--    Widget    w;
--    XtPointer cl, cd;
-+    Widget    w UNUSED;
-+    XtPointer cl UNUSED;
-+    XtPointer cd UNUSED;
- {
-     SFstatus = SEL_FILE_OK;
- }
- static XtCallbackRec SFokSelect[] =
-@@ -2256,15 +2240,15 @@ static XtCallbackRec SFokSelect[] =
-     { NULL, (XtPointer) NULL },
- };
- static void SFcancelCallback __ARGS((Widget w, XtPointer cl, XtPointer cd));
--/* ARGSUSED */
-     static void
- SFcancelCallback(w, cl, cd)
--    Widget    w;
--    XtPointer cl, cd;
-+    Widget    w UNUSED;
-+    XtPointer cl UNUSED;
-+    XtPointer cd UNUSED;
- {
-     SFstatus = SEL_FILE_CANCEL;
- }
- static XtCallbackRec SFcancelSelect[] =
-@@ -2273,20 +2257,19 @@ static XtCallbackRec SFcancelSelect[] =
-     { NULL, (XtPointer) NULL },
- };
- static void SFdismissAction __ARGS((Widget w, XEvent *event, String *params, Cardinal *num_params));
--/* ARGSUSED */
-     static void
- SFdismissAction(w, event, params, num_params)
--    Widget    w;
--    XEvent *event;
--    String *params;
--    Cardinal *num_params;
-+    Widget    w UNUSED;
-+    XEvent    *event;
-+    String    *params UNUSED;
-+    Cardinal  *num_params UNUSED;
- {
--    if (event->type == ClientMessage &&
--          event->xclient.data.l[0] != SFwmDeleteWindow)
-+    if (event->type == ClientMessage
-+          && (Atom)event->xclient.data.l[0] != SFwmDeleteWindow)
-       return;
-     SFstatus = SEL_FILE_CANCEL;
- }
-@@ -2701,11 +2684,11 @@ SFcreateWidgets(toplevel, prompt, ok, ca
-     static void
- SFtextChanged()
- {
- #if defined(FEAT_XFONTSET) && defined(XtNinternational)
--    if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
-+    if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
-     {
-       wchar_t *wcbuf=(wchar_t *)SFtextBuffer;
-       if ((wcbuf[0] == L'/') || (wcbuf[0] == L'~'))
-       {
-@@ -2747,11 +2730,11 @@ SFtextChanged()
- SFgetText()
- {
- #if defined(FEAT_XFONTSET) && defined(XtNinternational)
-     char *buf;
--    if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
-+    if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide)
-     {
-       wchar_t *wcbuf;
-       int mbslength;
-       XtVaGetValues(selFileField,
---- vim72.orig/src/gui_athena.c
-+++ vim72/src/gui_athena.c
-@@ -84,14 +84,13 @@ static int         puller_width = 0;
- /*
-  * Scrollbar callback (XtNjumpProc) for when the scrollbar is dragged with the
-  * left or middle mouse button.
-  */
--/* ARGSUSED */
-     static void
- gui_athena_scroll_cb_jump(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data, call_data;
- {
-     scrollbar_T *sb, *sb_info;
-     long      value;
-@@ -120,14 +119,13 @@ gui_athena_scroll_cb_jump(w, client_data
- /*
-  * Scrollbar callback (XtNscrollProc) for paging up or down with the left or
-  * right mouse buttons.
-  */
--/* ARGSUSED */
-     static void
- gui_athena_scroll_cb_scroll(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data, call_data;
- {
-     scrollbar_T *sb, *sb_info;
-     long      value;
-     int               data = (int)(long)call_data;
-@@ -490,11 +488,11 @@ get_toolbar_pixmap(menu, sen)
-     }
-     if (menu->icon_builtin || gui_find_bitmap(menu->name, buf, "xpm") == FAIL)
-     {
-       if (menu->iconidx >= 0 && menu->iconidx
--                 < (sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
-+            < (int)(sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
-           xpm = built_in_pixmaps[menu->iconidx];
-       else
-           xpm = tb_blank_xpm;
-     }
-@@ -761,11 +759,11 @@ athena_calculate_ins_pos(widget)
-     XtSetArg(args[n], XtNchildren, &children); n++;
-     XtSetArg(args[n], XtNnumChildren, &num_children); n++;
-     XtGetValues(XtParent(widget), args, n);
-     retval = num_children;
--    for (i = 0; i < num_children; ++i)
-+    for (i = 0; i < (int)num_children; ++i)
-     {
-       Widget  current = children[i];
-       vimmenu_T       *menu = NULL;
-       for (menu = (a_cur_menu->parent == NULL)
-@@ -778,15 +776,14 @@ athena_calculate_ins_pos(widget)
-               retval = i;
-     }
-     return retval;
- }
--/* ARGSUSED */
-     void
- gui_mch_add_menu(menu, idx)
-     vimmenu_T *menu;
--    int               idx;
-+    int               idx UNUSED;
- {
-     char_u    *pullright_name;
-     Dimension height, space, border;
-     vimmenu_T *parent = menu->parent;
-@@ -867,11 +864,11 @@ gui_mch_add_menu(menu, idx)
-           int         i;
-           XtVaGetValues(parent->submenu_id, XtNchildren, &children,
-                                             XtNnumChildren, &num_children,
-                                             NULL);
--          for (i = 0; i < num_children; ++i)
-+          for (i = 0; i < (int)num_children; ++i)
-           {
-               XtVaSetValues(children[i],
-                             XtNrightMargin, puller_width,
-                             NULL);
-           }
-@@ -911,11 +908,11 @@ gui_athena_menu_has_submenus(id, ignore)
-     int               i;
-     XtVaGetValues(id, XtNchildren, &children,
-                     XtNnumChildren, &num_children,
-                     NULL);
--    for (i = 0; i < num_children; ++i)
-+    for (i = 0; i < (int)num_children; ++i)
-     {
-       if (children[i] == ignore)
-           continue;
-       if (has_submenu(children[i]))
-           return True;
-@@ -1173,15 +1170,14 @@ make_pull_name(name)
-           *p = '_';
-     }
-     return pname;
- }
--/* ARGSUSED */
-     void
- gui_mch_add_menu_item(menu, idx)
-     vimmenu_T *menu;
--    int               idx;
-+    int               idx UNUSED;
- {
-     vimmenu_T *parent = menu->parent;
-     a_cur_menu = menu;
- # ifdef FEAT_TOOLBAR
-@@ -1442,11 +1438,11 @@ gui_mch_compute_toolbar_height()
-               XtNborderWidth,     &shadowThickness,
-               XtNvSpace,          &marginHeight,
-               XtNchildren,        &children,
-               XtNnumChildren,     &numChildren,
-               NULL);
--      for (i = 0; i < numChildren; i++)
-+      for (i = 0; i < (int)numChildren; i++)
-       {
-           whgt = 0;
-           XtVaGetValues(children[i], XtNheight, &whgt, NULL);
-           if (height < whgt)
-@@ -1471,14 +1467,13 @@ gui_mch_get_toolbar_colors(bgp, fgp, bsp
-     *hsp = *tsp;
- }
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"cursorcolumn", "cuc", P_BOOL|P_VI_DEF|P_RWIN,
+ #ifdef FEAT_SYN_HL
+                           (char_u *)VAR_WIN, PV_CUC,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
--/* ARGSUSED */
-     void
- gui_mch_toggle_tearoffs(enable)
--    int               enable;
-+    int               enable UNUSED;
- {
-     /* no tearoff menus */
- }
-     void
-@@ -1535,11 +1530,11 @@ gui_mch_destroy_menu(menu)
-           if (gui_athena_menu_has_submenus(parent, menu->id))
-               right_margin = puller_width;
-           else
-               get_left_margin = True;
--          for (i = 0; i < num_children; ++i)
-+          for (i = 0; i < (int)num_children; ++i)
-           {
-               if (children[i] == menu->id)
-                   continue;
-               if (get_left_margin == True)
-               {
-@@ -1643,15 +1638,14 @@ gui_mch_destroy_menu(menu)
-       XtDestroyWidget(menu->submenu_id);
-       menu->submenu_id = (Widget)0;
-     }
- }
--/*ARGSUSED*/
-     static void
- gui_athena_menu_timeout(client_data, id)
-     XtPointer     client_data;
--    XtIntervalId    *id;
-+    XtIntervalId    *id UNUSED;
- {
-     Widget  w = (Widget)client_data;
-     Widget  popup;
-     timer = 0;
-@@ -1676,16 +1670,15 @@ gui_athena_menu_timeout(client_data, id)
-  * up.  It should appear even with and just slightly to the left of the
-  * rightmost end of the menu entry that caused the popup.
-  *
-  * This is called when XtPopup() is called.
-  */
--/*ARGSUSED*/
-     static void
- gui_athena_popup_callback(w, client_data, call_data)
-     Widget    w;
-     XtPointer client_data;
--    XtPointer call_data;
-+    XtPointer call_data UNUSED;
- {
-     /* Assumption: XtIsSubclass(XtParent(w),simpleMenuWidgetClass) */
-     vimmenu_T *menu = (vimmenu_T *)client_data;
-     Dimension width;
-     Position  root_x, root_y;
-@@ -1709,11 +1702,10 @@ gui_athena_popup_callback(w, client_data
-     XtVaSetValues(w, XtNx, root_x,
-                    XtNy, root_y,
-                    NULL);
- }
--/* ARGSUSED */
-     static void
- gui_athena_popdown_submenus_action(w, event, args, nargs)
-     Widget    w;
-     XEvent    *event;
-     String    *args;
-@@ -1754,11 +1746,10 @@ has_submenu(widget)
-           return True;
-     }
-     return False;
- }
--/* ARGSUSED */
-     static void
- gui_athena_delayed_arm_action(w, event, args, nargs)
-     Widget    w;
-     XEvent    *event;
-     String    *args;
-@@ -1835,11 +1826,10 @@ submenu_widget(widget)
-     return popup;
-     /* Postcondition: (popup != NULL) implies
-      * (XtIsSubclass(popup,simpleMenuWidgetClass) == True) */
- }
--/* ARGSUSED */
-     void
- gui_mch_show_popupmenu(menu)
-     vimmenu_T *menu;
- {
-     int               rootx, rooty, winx, winy;
-@@ -2044,19 +2034,18 @@ gui_x11_get_wid()
- #if defined(FEAT_BROWSE) || defined(PROTO)
- /*
-  * Put up a file requester.
-  * Returns the selected name in allocated memory, or NULL for Cancel.
-  */
--/* ARGSUSED */
-     char_u *
- gui_mch_browse(saving, title, dflt, ext, initdir, filter)
--    int               saving;         /* select file to write */
--    char_u    *title;         /* not used (title for the window) */
--    char_u    *dflt;          /* not used (default name) */
--    char_u    *ext;           /* not used (extension added) */
-+    int               saving UNUSED;  /* select file to write */
-+    char_u    *title;         /* title for the window */
-+    char_u    *dflt;          /* default name */
-+    char_u    *ext UNUSED;    /* extension added */
-     char_u    *initdir;       /* initial directory, NULL for current dir */
--    char_u    *filter;        /* not used (file name filter) */
-+    char_u    *filter UNUSED; /* file name filter */
- {
-     Position x, y;
-     char_u    dirbuf[MAXPATHL];
-     /* Concatenate "initdir" and "dflt". */
-@@ -2098,17 +2087,16 @@ static void dialog_wm_handler __ARGS((Wi
- /*
-  * Callback function for the textfield.  When CR is hit this works like
-  * hitting the "OK" button, ESC like "Cancel".
-  */
--/* ARGSUSED */
-     static void
- keyhit_callback(w, client_data, event, cont)
--    Widget            w;
--    XtPointer         client_data;
-+    Widget            w UNUSED;
-+    XtPointer         client_data UNUSED;
-     XEvent            *event;
--    Boolean           *cont;
-+    Boolean           *cont UNUSED;
- {
-     char      buf[2];
-     if (XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1)
-     {
-@@ -2117,44 +2105,41 @@ keyhit_callback(w, client_data, event, c
-       else if (*buf == ESC)
-           dialogStatus = 0;
-     }
- }
--/* ARGSUSED */
-     static void
- butproc(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
--    XtPointer call_data;
-+    XtPointer call_data UNUSED;
- {
-     dialogStatus = (int)(long)client_data + 1;
- }
- /*
-  * Function called when dialog window closed.
-  */
--/*ARGSUSED*/
-     static void
- dialog_wm_handler(w, client_data, event, dum)
--    Widget    w;
--    XtPointer client_data;
-+    Widget    w UNUSED;
-+    XtPointer client_data UNUSED;
-     XEvent    *event;
--    Boolean   *dum;
-+    Boolean   *dum UNUSED;
- {
-     if (event->type == ClientMessage
--          && ((XClientMessageEvent *)event)->data.l[0] == dialogatom)
-+          && (Atom)((XClientMessageEvent *)event)->data.l[0] == dialogatom)
-       dialogStatus = 0;
- }
--/* ARGSUSED */
-     int
- gui_mch_dialog(type, title, message, buttons, dfltbutton, textfield)
--    int               type;
-+    int               type UNUSED;
-     char_u    *title;
-     char_u    *message;
-     char_u    *buttons;
--    int               dfltbutton;
-+    int               dfltbutton UNUSED;
-     char_u    *textfield;
- {
-     char_u            *buts;
-     char_u            *p, *next;
-     XtAppContext      app;
---- vim72.orig/src/gui_motif.c
-+++ vim72/src/gui_motif.c
-@@ -115,14 +115,13 @@ static void gui_motif_scroll_colors __AR
- /*
-  * Call-back routines.
-  */
--/* ARGSUSED */
-     static void
- scroll_cb(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data, call_data;
- {
-     scrollbar_T *sb;
-     long      value;
-     int               dragging;
-@@ -134,28 +133,28 @@ scroll_cb(w, client_data, call_data)
-                                                             (int)XmCR_DRAG);
-     gui_drag_scrollbar(sb, value, dragging);
- }
- #ifdef FEAT_GUI_TABLINE
--/*ARGSUSED*/
-     static void
- tabline_cb(w, client_data, call_data)
--    Widget    w;
--    XtPointer client_data, call_data;
-+    Widget    w UNUSED;
-+    XtPointer client_data UNUSED;
-+    XtPointer call_data;
- {
-     XmNotebookCallbackStruct *nptr;
-     nptr = (XmNotebookCallbackStruct *)call_data;
-     if (nptr->reason != (int)XmCR_NONE)
-       send_tabline_event(nptr->page_number);
- }
--/*ARGSUSED*/
-     static void
- tabline_button_cb(w, client_data, call_data)
-     Widget    w;
--    XtPointer client_data, call_data;
-+    XtPointer client_data UNUSED;
-+    XtPointer call_data UNUSED;
- {
-     int               cmd, tab_idx;
-     XtVaGetValues(w, XmNuserData, &cmd, NULL);
-     XtVaGetValues(tabLine_menu, XmNuserData, &tab_idx, NULL);
-@@ -164,15 +163,14 @@ tabline_button_cb(w, client_data, call_d
- }
- /*
-  * Tabline single mouse click timeout handler
-  */
--/*ARGSUSED*/
-     static void
- motif_tabline_timer_cb (timed_out, interval_id)
-     XtPointer         timed_out;
--    XtIntervalId      *interval_id;
-+    XtIntervalId      *interval_id UNUSED;
- {
-     *((int *)timed_out) = TRUE;
- }
- /*
-@@ -201,17 +199,16 @@ tabline_scroller_clicked(scroller_name,
-       }
-     }
-     return FALSE;
- }
--/*ARGSUSED*/
-     static void
- tabline_menu_cb(w, closure, e, continue_dispatch)
-     Widget    w;
--    XtPointer closure;
-+    XtPointer closure UNUSED;
-     XEvent    *e;
--    Boolean   *continue_dispatch;
-+    Boolean   *continue_dispatch UNUSED;
- {
-     Widget                    tab_w;
-     XButtonPressedEvent               *event;
-     int                               tab_idx = 0;
-     WidgetList                        children;
-@@ -275,15 +272,14 @@ tabline_menu_cb(w, closure, e, continue_
-     XtManageChildren(children, numChildren);
-     XmMenuPosition(tabLine_menu, (XButtonPressedEvent *)e) ;
-     XtManageChild(tabLine_menu);
- }
--/*ARGSUSED*/
-     static void
- tabline_balloon_cb(beval, state)
-     BalloonEval       *beval;
--    int               state;
-+    int               state UNUSED;
- {
-     int               nr;
-     tabpage_T *tp;
-     if (beval->target == (Widget)0)
-@@ -640,17 +636,16 @@ gui_x11_destroy_widgets()
- #ifdef FEAT_MENU
-     menuBar = NULL;
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"cursorline",   "cul", P_BOOL|P_VI_DEF|P_RWIN,
+ #ifdef FEAT_SYN_HL
+                           (char_u *)VAR_WIN, PV_CUL,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
- }
--/*ARGSUSED*/
-     void
- gui_mch_set_text_area_pos(x, y, w, h)
--    int           x;
--    int           y;
--    int           w;
--    int           h;
-+    int           x UNUSED;
-+    int           y UNUSED;
-+    int           w UNUSED;
-+    int           h UNUSED;
- {
- #ifdef FEAT_TOOLBAR
-     /* Give keyboard focus to the textArea instead of the toolbar. */
-     reset_focus();
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"debug",     NULL,   P_STRING|P_VI_DEF,
+                           (char_u *)&p_debug, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"define",            "def",  P_STRING|P_ALLOCED|P_VI_DEF,
+ #ifdef FEAT_FIND_ID
+                           (char_u *)&p_def, PV_DEF,
+                           {(char_u *)"^\\s*#\\s*define", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
  #endif
-@@ -1259,11 +1254,11 @@ get_toolbar_pixmap(menu, fname)
-     }
-     if (menu->icon_builtin || gui_find_bitmap(menu->name, buf, "xpm") == FAIL)
-     {
-       if (menu->iconidx >= 0 && menu->iconidx
--                 < (sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
-+             < (int)(sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0])))
-           xpm = built_in_pixmaps[menu->iconidx];
-       else
-           xpm = tb_blank_xpm;
-     }
-@@ -1714,14 +1709,13 @@ gui_mch_destroy_menu(menu)
-       }
+-                          },
++                          SCRIPTID_INIT},
+     {"delcombine", "deco",  P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_MBYTE
+                           (char_u *)&p_deco, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-     }
- }
--/* ARGSUSED */
-     void
- gui_mch_show_popupmenu(menu)
--    vimmenu_T *menu;
-+    vimmenu_T *menu UNUSED;
- {
- #ifdef MOTIF_POPUP
-     XmMenuPosition(menu->submenu_id, gui_x11_get_last_mouse_event());
-     XtManageChild(menu->submenu_id);
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"dictionary",  "dict", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_INS_EXPAND
+                           (char_u *)&p_dict, PV_DICT,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-@@ -2044,13 +2038,12 @@ do_mnemonic(Widget w, unsigned int keyco
- }
- /*
-  * Callback routine for dialog mnemonic processing.
-  */
--/*ARGSUSED*/
-     static void
--mnemonic_event(Widget w, XtPointer call_data, XKeyEvent *event)
-+mnemonic_event(Widget w, XtPointer call_data UNUSED, XKeyEvent *event)
- {
-     do_mnemonic(w, event->keycode);
- }
-@@ -2285,17 +2278,16 @@ set_predefined_fontlist(parent, name)
- /*
-  * Put up a file requester.
-  * Returns the selected name in allocated memory, or NULL for Cancel.
-  */
--/* ARGSUSED */
-     char_u *
- gui_mch_browse(saving, title, dflt, ext, initdir, filter)
--    int               saving;         /* select file to write */
-+    int               saving UNUSED;  /* select file to write */
-     char_u    *title;         /* title for the window */
-     char_u    *dflt;          /* default name */
--    char_u    *ext;           /* not used (extension added) */
-+    char_u    *ext UNUSED;    /* not used (extension added) */
-     char_u    *initdir;       /* initial directory, NULL for current dir */
-     char_u    *filter;        /* file name filter */
- {
-     char_u    dirbuf[MAXPATHL];
-     char_u    dfltbuf[MAXPATHL];
-@@ -2411,16 +2403,15 @@ gui_mch_browse(saving, title, dflt, ext,
-  */
- /*
-  * Process callback from Dialog cancel actions.
-  */
--/* ARGSUSED */
-     static void
- DialogCancelCB(w, client_data, call_data)
--    Widget    w;              /*  widget id           */
--    XtPointer client_data;    /*  data from application   */
--    XtPointer call_data;      /*  data from widget class  */
-+    Widget    w UNUSED;               /*  widget id           */
-+    XtPointer client_data UNUSED;     /*  data from application   */
-+    XtPointer call_data UNUSED;       /*  data from widget class  */
- {
-     if (browse_fname != NULL)
-     {
-       XtFree(browse_fname);
-       browse_fname = NULL;
-@@ -2429,16 +2420,15 @@ DialogCancelCB(w, client_data, call_data
- }
- /*
-  * Process callback from Dialog actions.
-  */
--/* ARGSUSED */
-     static void
- DialogAcceptCB(w, client_data, call_data)
--    Widget    w;              /*  widget id           */
--    XtPointer client_data;    /*  data from application   */
--    XtPointer call_data;      /*  data from widget class  */
-+    Widget    w UNUSED;               /*  widget id           */
-+    XtPointer client_data UNUSED;     /*  data from application   */
-+    XtPointer call_data;              /*  data from widget class  */
- {
-     XmFileSelectionBoxCallbackStruct *fcb;
-     if (browse_fname != NULL)
-     {
-@@ -2465,17 +2455,16 @@ static void butproc __ARGS((Widget w, Xt
- /*
-  * Callback function for the textfield.  When CR is hit this works like
-  * hitting the "OK" button, ESC like "Cancel".
-  */
--/* ARGSUSED */
-     static void
- keyhit_callback(w, client_data, event, cont)
-     Widget            w;
--    XtPointer         client_data;
-+    XtPointer         client_data UNUSED;
-     XEvent            *event;
--    Boolean           *cont;
-+    Boolean           *cont UNUSED;
- {
-     char      buf[2];
-     KeySym    key_sym;
-     if (XLookupString(&(event->xkey), buf, 2, &key_sym, NULL) == 1)
-@@ -2488,16 +2477,15 @@ keyhit_callback(w, client_data, event, c
-     if ((key_sym == XK_Left || key_sym == XK_Right)
-           && !(event->xkey.state & ShiftMask))
-       XmTextFieldClearSelection(w, XtLastTimestampProcessed(gui.dpy));
- }
--/* ARGSUSED */
-     static void
- butproc(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
--    XtPointer call_data;
-+    XtPointer call_data UNUSED;
- {
-     dialogStatus = (int)(long)client_data + 1;
- }
- #ifdef HAVE_XPM
-@@ -2565,14 +2553,13 @@ create_pixmap_label(parent, name, data,
-     return label;
- }
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"diff",      NULL,   P_BOOL|P_VI_DEF|P_RWIN|P_NOGLOB,
+ #ifdef FEAT_DIFF
+                           (char_u *)VAR_WIN, PV_DIFF,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
--/* ARGSUSED */
-     int
- gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield)
--    int               type;
-+    int               type UNUSED;
-     char_u    *title;
-     char_u    *message;
-     char_u    *button_names;
-     int               dfltbutton;
-     char_u    *textfield;             /* buffer of size IOSIZE */
-@@ -3195,11 +3182,11 @@ gui_mch_compute_toolbar_height()
-               XmNshadowThickness, &tst,
-               XmNmarginHeight, &tmh,
-               XmNchildren, &children,
-               XmNnumChildren, &numChildren, NULL);
-       borders += tst + tmh;
--      for (i = 0; i < numChildren; i++)
-+      for (i = 0; i < (int)numChildren; i++)
-       {
-           whgt = 0;
-           XtVaGetValues(children[i], XmNheight, &whgt, NULL);
-           if (height < whgt)
-               height = whgt;
-@@ -3235,34 +3222,32 @@ motif_get_toolbar_colors(bgp, fgp, bsp,
- /*
-  * The next toolbar enter/leave callbacks should really do balloon help.  But
-  * I have to use footer help for backwards compatability.  Hopefully both will
-  * get implemented and the user will have a choice.
-  */
--/*ARGSUSED*/
-     static void
- toolbarbutton_enter_cb(w, client_data, event, cont)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
--    XEvent    *event;
--    Boolean   *cont;
-+    XEvent    *event UNUSED;
-+    Boolean   *cont UNUSED;
- {
-     vimmenu_T *menu = (vimmenu_T *) client_data;
-     if (menu->strings[MENU_INDEX_TIP] != NULL)
-     {
-       if (vim_strchr(p_go, GO_FOOTER) != NULL)
-           gui_mch_set_footer(menu->strings[MENU_INDEX_TIP]);
-     }
- }
--/*ARGSUSED*/
-     static void
- toolbarbutton_leave_cb(w, client_data, event, cont)
--    Widget    w;
--    XtPointer client_data;
--    XEvent    *event;
--    Boolean   *cont;
-+    Widget    w UNUSED;
-+    XtPointer client_data UNUSED;
-+    XEvent    *event UNUSED;
-+    Boolean   *cont UNUSED;
- {
-     gui_mch_set_footer((char_u *) "");
- }
- # endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"diffexpr",    "dex",  P_STRING|P_VI_DEF|P_SECURE,
+ #if defined(FEAT_DIFF) && defined(FEAT_EVAL)
+                           (char_u *)&p_dex, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-@@ -3490,14 +3475,13 @@ gui_motif_scroll_colors(id)
- }
- /*
-  * Set the fontlist for Widget "id" to use gui.menu_fontset or gui.menu_font.
-  */
--/*ARGSUSED*/
-     void
- gui_motif_menu_fontlist(id)
--    Widget  id;
-+    Widget  id UNUSED;
- {
- #ifdef FEAT_MENU
- #ifdef FONTSET_ALWAYS
-     if (gui.menu_fontset != NOFONTSET)
-     {
-@@ -3564,63 +3548,59 @@ typedef struct _SharedFindReplace
-     Widget undo;      /* 'Undo' action button */
-     Widget cancel;
- } SharedFindReplace;
--static SharedFindReplace find_widgets = { NULL };
--static SharedFindReplace repl_widgets = { NULL };
-+static SharedFindReplace find_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
-+static SharedFindReplace repl_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
- static void find_replace_destroy_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
- static void find_replace_dismiss_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
- static void entry_activate_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
- static void find_replace_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data));
- static void find_replace_keypress __ARGS((Widget w, SharedFindReplace * frdp, XKeyEvent * event));
- static void find_replace_dialog_create __ARGS((char_u *entry_text, int do_replace));
--/*ARGSUSED*/
-     static void
- find_replace_destroy_callback(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
--    XtPointer call_data;
-+    XtPointer call_data UNUSED;
- {
-     SharedFindReplace *cd = (SharedFindReplace *)client_data;
-     if (cd != NULL)
-        /* suppress_dialog_mnemonics(cd->dialog); */
-       cd->dialog = (Widget)0;
- }
--/*ARGSUSED*/
-     static void
- find_replace_dismiss_callback(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
--    XtPointer call_data;
-+    XtPointer call_data UNUSED;
- {
-     SharedFindReplace *cd = (SharedFindReplace *)client_data;
-     if (cd != NULL)
-       XtUnmanageChild(cd->dialog);
- }
--/*ARGSUSED*/
-     static void
- entry_activate_callback(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
--    XtPointer call_data;
-+    XtPointer call_data UNUSED;
- {
-     XmProcessTraversal((Widget)client_data, XmTRAVERSE_CURRENT);
- }
--/*ARGSUSED*/
-     static void
- find_replace_callback(w, client_data, call_data)
--    Widget    w;
-+    Widget    w UNUSED;
-     XtPointer client_data;
--    XtPointer call_data;
-+    XtPointer call_data UNUSED;
- {
-     long_u    flags = (long_u)client_data;
-     char      *find_text, *repl_text;
-     Boolean   direction_down = TRUE;
-     Boolean   wword;
-@@ -3666,14 +3646,13 @@ find_replace_callback(w, client_data, ca
-       XtFree(find_text);
-     if (repl_text != NULL)
-       XtFree(repl_text);
- }
--/*ARGSUSED*/
-     static void
- find_replace_keypress(w, frdp, event)
--    Widget            w;
-+    Widget            w UNUSED;
-     SharedFindReplace *frdp;
-     XKeyEvent         *event;
- {
-     KeySym keysym;
---- vim72.orig/src/if_ruby.c
-+++ vim72/src/if_ruby.c
-@@ -37,20 +37,35 @@
- # define rb_cNilClass         (*dll_rb_cNilClass)
- # define rb_cSymbol           (*dll_rb_cSymbol)
- # define rb_cTrueClass                (*dll_rb_cTrueClass)
- # if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
- /*
-- * On ver 1.8, all Ruby functions are exported with "__declspce(dllimport)"
-- * in ruby.h.  But it cause trouble for these variables, because it is
-+ * On ver 1.8, all Ruby functions are exported with "__declspec(dllimport)"
-+ * in ruby.h.  But it causes trouble for these variables, because it is
-  * defined in this file.  When defined this RUBY_EXPORT it modified to
-  * "extern" and be able to avoid this problem.
-  */
- #  define RUBY_EXPORT
- # endif
+-                          },
++                          SCRIPTID_INIT},
+     {"diffopt",           "dip",  P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN|P_COMMA|P_NODUP,
+ #ifdef FEAT_DIFF
+                           (char_u *)&p_dip, PV_NONE,
+                           {(char_u *)"filler", (char_u *)NULL}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)"", (char_u *)NULL}
  #endif
-+/* suggested by Ariya Mizutani */
-+#if (_MSC_VER == 1200)
-+# undef _WIN32_WINNT
-+#endif
-+
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+/* Ruby 1.9 defines a number of static functions which use rb_num2long and
-+ * rb_int2big */
-+# define rb_num2long rb_num2long_stub
-+# define rb_int2big rb_int2big_stub
-+#endif
-+
- #include <ruby.h>
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+# include <ruby/encoding.h>
-+#endif
- #undef EXTERN
- #undef _
- /* T_DATA defined both by Ruby and Mac header files, hack around it... */
-@@ -58,10 +73,32 @@
- # define __OPENTRANSPORT__
- # define __OPENTRANSPORTPROTOCOL__
- # define __OPENTRANSPORTPROVIDERS__
+-                          },
++                          SCRIPTID_INIT},
+     {"digraph",           "dg",   P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_DIGRAPHS
+                           (char_u *)&p_dg, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-+/*
-+ * Backward compatiblity for Ruby 1.8 and earlier.
-+ * Ruby 1.9 does not provide STR2CSTR, instead StringValuePtr is provided.
-+ * Ruby 1.9 does not provide RXXX(s)->len and RXXX(s)->ptr, instead
-+ * RXXX_LEN(s) and RXXX_PTR(s) are provided.
-+ */
-+#ifndef StringValuePtr
-+# define StringValuePtr(s) STR2CSTR(s)
-+#endif
-+#ifndef RARRAY_LEN
-+# define RARRAY_LEN(s) RARRAY(s)->len
-+#endif
-+#ifndef RARRAY_PTR
-+# define RARRAY_PTR(s) RARRAY(s)->ptr
-+#endif
-+#ifndef RSTRING_LEN
-+# define RSTRING_LEN(s) RSTRING(s)->len
-+#endif
-+#ifndef RSTRING_PTR
-+# define RSTRING_PTR(s) RSTRING(s)->ptr
-+#endif
-+
- #include "vim.h"
- #include "version.h"
- #if defined(PROTO) && !defined(FEAT_RUBY)
- /* Define these to be able to generate the function prototypes. */
-@@ -127,17 +164,37 @@ static void ruby_vim_init(void);
- #define rb_str2cstr                   dll_rb_str2cstr
- #define rb_str_cat                    dll_rb_str_cat
- #define rb_str_concat                 dll_rb_str_concat
- #define rb_str_new                    dll_rb_str_new
- #define rb_str_new2                   dll_rb_str_new2
--#define ruby_errinfo                  (*dll_ruby_errinfo)
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
-+# define rb_string_value_ptr          dll_rb_string_value_ptr
-+# define rb_float_new                 dll_rb_float_new
-+# define rb_ary_new                   dll_rb_ary_new
-+# define rb_ary_push                  dll_rb_ary_push
-+#endif
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \
-+    || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+# define rb_errinfo                   dll_rb_errinfo
-+#else
-+# define ruby_errinfo                 (*dll_ruby_errinfo)
-+#endif
- #define ruby_init                     dll_ruby_init
- #define ruby_init_loadpath            dll_ruby_init_loadpath
-+#define NtInitialize                  dll_NtInitialize
- #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
- # define rb_w32_snprintf              dll_rb_w32_snprintf
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"directory",   "dir",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP|P_SECURE,
+                           (char_u *)&p_dir, PV_NONE,
+-                          {(char_u *)DFLT_DIR, (char_u *)0L}},
++                          {(char_u *)DFLT_DIR, (char_u *)0L} SCRIPTID_INIT},
+     {"display",           "dy",   P_STRING|P_VI_DEF|P_COMMA|P_RALL|P_NODUP,
+                           (char_u *)&p_dy, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"eadirection", "ead",  P_STRING|P_VI_DEF,
+ #ifdef FEAT_VERTSPLIT
+                           (char_u *)&p_ead, PV_NONE,
+                           {(char_u *)"both", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
  #endif
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+# define ruby_script                  dll_ruby_script
-+# define rb_enc_find_index            dll_rb_enc_find_index
-+# define rb_enc_find                  dll_rb_enc_find
-+# define rb_enc_str_new                       dll_rb_enc_str_new
-+# define rb_sprintf                   dll_rb_sprintf
-+#endif
-+
- /*
-  * Pointers for dynamic link
-  */
- static VALUE (*dll_rb_assoc_new) (VALUE, VALUE);
- static VALUE *dll_rb_cFalseClass;
-@@ -181,17 +238,51 @@ static void (*dll_rb_raise) (VALUE, cons
- static char *(*dll_rb_str2cstr) (VALUE,int*);
- static VALUE (*dll_rb_str_cat) (VALUE, const char*, long);
- static VALUE (*dll_rb_str_concat) (VALUE, VALUE);
- static VALUE (*dll_rb_str_new) (const char*, long);
- static VALUE (*dll_rb_str_new2) (const char*);
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \
-+    || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+static VALUE (*dll_rb_errinfo) (void);
-+#else
- static VALUE *dll_ruby_errinfo;
-+#endif
- static void (*dll_ruby_init) (void);
- static void (*dll_ruby_init_loadpath) (void);
-+static void (*dll_NtInitialize) (int*, char***);
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
-+static char * (*dll_rb_string_value_ptr) (volatile VALUE*);
-+static VALUE (*dll_rb_float_new) (double);
-+static VALUE (*dll_rb_ary_new) (void);
-+static VALUE (*dll_rb_ary_push) (VALUE, VALUE);
-+#endif
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+static VALUE (*dll_rb_int2big)(SIGNED_VALUE);
-+#endif
- #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
- static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...);
+-                          },
++                          SCRIPTID_INIT},
+     {"edcompatible","ed",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_ed, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"encoding",    "enc",  P_STRING|P_VI_DEF|P_RCLR,
+ #ifdef FEAT_MBYTE
+                           (char_u *)&p_enc, PV_NONE,
+                           {(char_u *)ENC_DFLT, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+static void (*dll_ruby_script) (const char*);
-+static int (*dll_rb_enc_find_index) (const char*);
-+static rb_encoding* (*dll_rb_enc_find) (const char*);
-+static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*);
-+static VALUE (*dll_rb_sprintf) (const char*, ...);
-+#endif
-+
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+static SIGNED_VALUE rb_num2long_stub(VALUE x)
-+{
-+    return dll_rb_num2long(x);
-+}
-+static VALUE rb_int2big_stub(SIGNED_VALUE x)
-+{
-+    return dll_rb_int2big(x);
-+}
-+#endif
-+
- static HINSTANCE hinstRuby = 0; /* Instance of ruby.dll */
- /*
-  * Table of name to function pointer of ruby.
-  */
-@@ -243,16 +334,44 @@ static struct
-     {"rb_str2cstr", (RUBY_PROC*)&dll_rb_str2cstr},
-     {"rb_str_cat", (RUBY_PROC*)&dll_rb_str_cat},
-     {"rb_str_concat", (RUBY_PROC*)&dll_rb_str_concat},
-     {"rb_str_new", (RUBY_PROC*)&dll_rb_str_new},
-     {"rb_str_new2", (RUBY_PROC*)&dll_rb_str_new2},
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \
-+    || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+    {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo},
-+#else
-     {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo},
-+#endif
-     {"ruby_init", (RUBY_PROC*)&dll_ruby_init},
-     {"ruby_init_loadpath", (RUBY_PROC*)&dll_ruby_init_loadpath},
-+    {
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER < 19
-+    "NtInitialize",
-+#else
-+    "ruby_sysinit",
-+#endif
-+                      (RUBY_PROC*)&dll_NtInitialize},
- #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
-     {"rb_w32_snprintf", (RUBY_PROC*)&dll_rb_w32_snprintf},
+-                          },
++                          SCRIPTID_INIT},
+     {"endofline",   "eol",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
+                           (char_u *)&p_eol, PV_EOL,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"equalalways", "ea",   P_BOOL|P_VI_DEF|P_RALL,
+                           (char_u *)&p_ea, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"equalprg",    "ep",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_ep, PV_EP,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"errorbells",  "eb",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_eb, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"errorfile",   "ef",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_QUICKFIX
+                           (char_u *)&p_ef, PV_NONE,
+                           {(char_u *)DFLT_ERRORFILE, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
  #endif
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
-+    {"rb_string_value_ptr", (RUBY_PROC*)&dll_rb_string_value_ptr},
-+    {"rb_float_new", (RUBY_PROC*)&dll_rb_float_new},
-+    {"rb_ary_new", (RUBY_PROC*)&dll_rb_ary_new},
-+    {"rb_ary_push", (RUBY_PROC*)&dll_rb_ary_push},
-+#endif
-+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+    {"rb_int2big", (RUBY_PROC*)&dll_rb_int2big},
-+#endif
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+    {"ruby_script", (RUBY_PROC*)&dll_ruby_script},
-+    {"rb_enc_find_index", (RUBY_PROC*)&dll_rb_enc_find_index},
-+    {"rb_enc_find", (RUBY_PROC*)&dll_rb_enc_find},
-+    {"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new},
-+    {"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf},
-+#endif
-     {"", NULL},
- };
- /*
-  * Free ruby.dll
-@@ -338,10 +457,62 @@ void ex_ruby(exarg_T *eap)
-           error_print(state);
-     }
-     vim_free(script);
- }
-+/*
-+ *  In Ruby 1.9 or later, ruby String object has encoding.
-+ *  conversion buffer string of vim to ruby String object using
-+ *  VIM encoding option.
-+ */
-+    static VALUE
-+vim_str2rb_enc_str(const char *s)
-+{
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+    int isnum;
-+    long lval;
-+    char_u *sval;
-+    rb_encoding *enc;
-+
-+    isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
-+    if (isnum == 0)
-+    {
-+      enc = rb_enc_find((char *)sval);
-+      vim_free(sval);
-+      if (enc) {
-+          return rb_enc_str_new(s, strlen(s), enc);
-+      }
-+    }
-+#endif
-+    return rb_str_new2(s);
-+}
-+
-+    static VALUE
-+eval_enc_string_protect(const char *str, int *state)
-+{
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+    int isnum;
-+    long lval;
-+    char_u *sval;
-+    rb_encoding *enc;
-+    VALUE v;
-+
-+    isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
-+    if (isnum == 0)
-+    {
-+      enc = rb_enc_find((char *)sval);
-+      vim_free(sval);
-+      if (enc)
-+      {
-+          v = rb_sprintf("#-*- coding:%s -*-\n%s", rb_enc_name(enc), str);
-+          return rb_eval_string_protect(StringValuePtr(v), state);
-+      }
-+    }
-+#endif
-+    return rb_eval_string_protect(str, state);
-+}
-+
- void ex_rubydo(exarg_T *eap)
- {
-     int state;
-     linenr_T i;
-@@ -350,24 +521,24 @@ void ex_rubydo(exarg_T *eap)
-       if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
-           return;
-       for (i = eap->line1; i <= eap->line2; i++) {
-           VALUE line, oldline;
--          line = oldline = rb_str_new2((char *)ml_get(i));
-+          line = oldline = vim_str2rb_enc_str((char *)ml_get(i));
-           rb_lastline_set(line);
--          rb_eval_string_protect((char *) eap->arg, &state);
-+          eval_enc_string_protect((char *) eap->arg, &state);
-           if (state) {
-               error_print(state);
-               break;
-           }
-           line = rb_lastline_get();
-           if (!NIL_P(line)) {
-               if (TYPE(line) != T_STRING) {
-                   EMSG(_("E265: $_ must be an instance of String"));
-                   return;
-               }
--              ml_replace(i, (char_u *) STR2CSTR(line), 1);
-+              ml_replace(i, (char_u *) StringValuePtr(line), 1);
-               changed();
- #ifdef SYNTAX_HL
-               syn_changed(i); /* recompute syntax hl. for this line */
+-                          },
++                          SCRIPTID_INIT},
+     {"errorformat", "efm",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_QUICKFIX
+                           (char_u *)&p_efm, PV_EFM,
+-                          {(char_u *)DFLT_EFM, (char_u *)0L},
++                          {(char_u *)DFLT_EFM, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
  #endif
-           }
-@@ -412,13 +583,28 @@ static int ensure_ruby_initialized(void)
-     {
- #ifdef DYNAMIC_RUBY
-       if (ruby_enabled(TRUE))
-       {
+-                          },
++                          SCRIPTID_INIT},
+     {"esckeys",           "ek",   P_BOOL|P_VIM,
+                           (char_u *)&p_ek, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)TRUE}},
++                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
+     {"eventignore", "ei",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_AUTOCMD
+                           (char_u *)&p_ei, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
  #endif
-+#ifdef _WIN32
-+          /* suggested by Ariya Mizutani */
-+          int argc = 1;
-+          char *argv[] = {"gvim.exe"};
-+          NtInitialize(&argc, &argv);
-+#endif
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+          RUBY_INIT_STACK;
-+#endif
-           ruby_init();
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+          ruby_script("vim-ruby");
-+#endif
-           ruby_init_loadpath();
-           ruby_io_init();
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
-+          rb_enc_find_index("encdb");
-+#endif
-           ruby_vim_init();
-           ruby_initialized = 1;
- #ifdef DYNAMIC_RUBY
-       }
-       else
-@@ -432,12 +618,15 @@ static int ensure_ruby_initialized(void)
- }
- static void error_print(int state)
- {
- #ifndef DYNAMIC_RUBY
-+#if !(defined(RUBY_VERSION) && RUBY_VERSION >= 19) \
-+    && !(defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19)
-     RUBYEXTERN VALUE ruby_errinfo;
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"expandtab",   "et",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_et, PV_ET,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"exrc",      "ex",   P_BOOL|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_exrc, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"fileencoding","fenc", P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_RBUF|P_NO_MKRC,
+ #ifdef FEAT_MBYTE
+                           (char_u *)&p_fenc, PV_FENC,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
-+#endif
-     VALUE eclass;
-     VALUE einfo;
-     char buff[BUFSIZ];
- #define TAG_RETURN    0x1
-@@ -466,22 +655,28 @@ static void error_print(int state)
-     case TAG_RETRY:
-       EMSG(_("E271: retry outside of rescue clause"));
-       break;
-     case TAG_RAISE:
-     case TAG_FATAL:
-+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19 \
-+    || defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19
-+      eclass = CLASS_OF(rb_errinfo());
-+      einfo = rb_obj_as_string(rb_errinfo());
-+#else
-       eclass = CLASS_OF(ruby_errinfo);
-       einfo = rb_obj_as_string(ruby_errinfo);
--      if (eclass == rb_eRuntimeError && RSTRING(einfo)->len == 0) {
-+#endif
-+      if (eclass == rb_eRuntimeError && RSTRING_LEN(einfo) == 0) {
-           EMSG(_("E272: unhandled exception"));
-       }
-       else {
-           VALUE epath;
-           char *p;
-           epath = rb_class_path(eclass);
-           vim_snprintf(buff, BUFSIZ, "%s: %s",
--                   RSTRING(epath)->ptr, RSTRING(einfo)->ptr);
-+                   RSTRING_PTR(epath), RSTRING_PTR(einfo));
-           p = strchr(buff, '\n');
-           if (p) *p = '\0';
-           EMSG(buff);
-       }
-       break;
-@@ -490,50 +685,118 @@ static void error_print(int state)
-       EMSG(buff);
-       break;
-     }
- }
--static VALUE vim_message(VALUE self, VALUE str)
-+static VALUE vim_message(VALUE self UNUSED, VALUE str)
- {
-     char *buff, *p;
-     str = rb_obj_as_string(str);
--    buff = ALLOCA_N(char, RSTRING(str)->len);
--    strcpy(buff, RSTRING(str)->ptr);
-+    buff = ALLOCA_N(char, RSTRING_LEN(str));
-+    strcpy(buff, RSTRING_PTR(str));
-     p = strchr(buff, '\n');
-     if (p) *p = '\0';
-     MSG(buff);
-     return Qnil;
- }
--static VALUE vim_set_option(VALUE self, VALUE str)
-+static VALUE vim_set_option(VALUE self UNUSED, VALUE str)
- {
--    do_set((char_u *)STR2CSTR(str), 0);
-+    do_set((char_u *)StringValuePtr(str), 0);
-     update_screen(NOT_VALID);
-     return Qnil;
- }
--static VALUE vim_command(VALUE self, VALUE str)
-+static VALUE vim_command(VALUE self UNUSED, VALUE str)
- {
--    do_cmdline_cmd((char_u *)STR2CSTR(str));
-+    do_cmdline_cmd((char_u *)StringValuePtr(str));
-     return Qnil;
- }
--static VALUE vim_evaluate(VALUE self, VALUE str)
-+#ifdef FEAT_EVAL
-+static VALUE vim_to_ruby(typval_T *tv)
-+{
-+    VALUE result = Qnil;
-+
-+    if (tv->v_type == VAR_STRING)
-+    {
-+        result = rb_str_new2((char *)tv->vval.v_string);
-+    }
-+    else if (tv->v_type == VAR_NUMBER)
-+    {
-+        result = INT2NUM(tv->vval.v_number);
-+    }
-+# ifdef FEAT_FLOAT
-+    else if (tv->v_type == VAR_FLOAT)
-+    {
-+        result = rb_float_new(tv->vval.v_float);
-+    }
-+# endif
-+    else if (tv->v_type == VAR_LIST)
-+    {
-+        list_T      *list = tv->vval.v_list;
-+        listitem_T  *curr;
-+
-+        result = rb_ary_new();
-+
-+        if (list != NULL)
-+        {
-+            for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
-+            {
-+                rb_ary_push(result, vim_to_ruby(&curr->li_tv));
-+            }
-+        }
-+    }
-+    else if (tv->v_type == VAR_DICT)
-+    {
-+        result = rb_hash_new();
-+
-+        if (tv->vval.v_dict != NULL)
-+        {
-+            hashtab_T   *ht = &tv->vval.v_dict->dv_hashtab;
-+            long_u      todo = ht->ht_used;
-+            hashitem_T  *hi;
-+            dictitem_T  *di;
-+
-+            for (hi = ht->ht_array; todo > 0; ++hi)
-+            {
-+                if (!HASHITEM_EMPTY(hi))
-+                {
-+                    --todo;
-+
-+                    di = dict_lookup(hi);
-+                    rb_hash_aset(result, rb_str_new2((char *)hi->hi_key),
-+                                                   vim_to_ruby(&di->di_tv));
-+                }
-+            }
-+        }
-+    } /* else return Qnil; */
-+
-+    return result;
-+}
-+#endif
-+
-+static VALUE vim_evaluate(VALUE self UNUSED, VALUE str)
- {
+-                          },
++                          SCRIPTID_INIT},
+     {"fileencodings","fencs", P_STRING|P_VI_DEF|P_COMMA,
+ #ifdef FEAT_MBYTE
+                           (char_u *)&p_fencs, PV_NONE,
+                           {(char_u *)"ucs-bom", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"fileformat",  "ff",   P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_NO_MKRC,
+                           (char_u *)&p_ff, PV_FF,
+-                          {(char_u *)DFLT_FF, (char_u *)0L}},
++                          {(char_u *)DFLT_FF, (char_u *)0L} SCRIPTID_INIT},
+     {"fileformats", "ffs",  P_STRING|P_VIM|P_COMMA|P_NODUP,
+                           (char_u *)&p_ffs, PV_NONE,
+-                          {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM}},
++                          {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM}
++                          SCRIPTID_INIT},
+     {"filetype",    "ft",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
+ #ifdef FEAT_AUTOCMD
+                           (char_u *)&p_ft, PV_FT,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"fillchars",   "fcs",  P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP,
+ #if defined(FEAT_WINDOWS) || defined(FEAT_FOLDING)
+                           (char_u *)&p_fcs, PV_NONE,
+                           {(char_u *)"vert:|,fold:-", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"fkmap",     "fk",   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_FKMAP
+                           (char_u *)&p_fkmap, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"flash",     "fl",   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+ #ifdef FEAT_FOLDING
+     {"foldclose",   "fcl",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP|P_RWIN,
+                           (char_u *)&p_fcl, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"foldcolumn",  "fdc",  P_NUM|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_FDC,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"foldenable",  "fen",  P_BOOL|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_FEN,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"foldexpr",    "fde",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
+ # ifdef FEAT_EVAL
+                           (char_u *)VAR_WIN, PV_FDE,
+                           {(char_u *)"0", (char_u *)NULL}
+ # else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ # endif
+-                          },
++                          SCRIPTID_INIT},
+     {"foldignore",  "fdi",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_FDI,
+-                          {(char_u *)"#", (char_u *)NULL}},
++                          {(char_u *)"#", (char_u *)NULL} SCRIPTID_INIT},
+     {"foldlevel",   "fdl",  P_NUM|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_FDL,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"foldlevelstart","fdls", P_NUM|P_VI_DEF,
+                           (char_u *)&p_fdls, PV_NONE,
+-                          {(char_u *)-1L, (char_u *)0L}},
++                          {(char_u *)-1L, (char_u *)0L} SCRIPTID_INIT},
+     {"foldmarker",  "fmr",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|
+                                                      P_RWIN|P_COMMA|P_NODUP,
+                           (char_u *)VAR_WIN, PV_FMR,
+-                          {(char_u *)"{{{,}}}", (char_u *)NULL}},
++                          {(char_u *)"{{{,}}}", (char_u *)NULL}
++                          SCRIPTID_INIT},
+     {"foldmethod",  "fdm",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_FDM,
+-                          {(char_u *)"manual", (char_u *)NULL}},
++                          {(char_u *)"manual", (char_u *)NULL} SCRIPTID_INIT},
+     {"foldminlines","fml",  P_NUM|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_FML,
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"foldnestmax", "fdn",  P_NUM|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_FDN,
+-                          {(char_u *)20L, (char_u *)0L}},
++                          {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT},
+     {"foldopen",    "fdo",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_fdo, PV_NONE,
+                {(char_u *)"block,hor,mark,percent,quickfix,search,tag,undo",
+-                                                             (char_u *)0L}},
++                                               (char_u *)0L} SCRIPTID_INIT},
+     {"foldtext",    "fdt",  P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
+ # ifdef FEAT_EVAL
+                           (char_u *)VAR_WIN, PV_FDT,
+                           {(char_u *)"foldtext()", (char_u *)NULL}
+ # else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ # endif
+-                          },
++                          SCRIPTID_INIT},
+ #endif
+     {"formatexpr", "fex",   P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
  #ifdef FEAT_EVAL
--    char_u *value = eval_to_string((char_u *)STR2CSTR(str), NULL, TRUE);
-+    typval_T    *tv;
-+    VALUE       result;
--    if (value != NULL)
-+    tv = eval_expr((char_u *)StringValuePtr(str), NULL);
-+    if (tv == NULL)
-     {
--      VALUE val = rb_str_new2((char *)value);
--      vim_free(value);
--      return val;
-+        return Qnil;
-     }
--    else
-+    result = vim_to_ruby(tv);
-+
-+    free_tv(tv);
-+
-+    return result;
-+#else
-+    return Qnil;
+                           (char_u *)&p_fex, PV_FEX,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
  #endif
--      return Qnil;
- }
- static VALUE buffer_new(buf_T *buf)
- {
-     if (buf->b_ruby_ref)
-@@ -578,11 +841,11 @@ static VALUE buffer_s_count()
-     }
-     return INT2NUM(n);
- }
--static VALUE buffer_s_aref(VALUE self, VALUE num)
-+static VALUE buffer_s_aref(VALUE self UNUSED, VALUE num)
- {
-     buf_T *b;
-     int n = NUM2INT(num);
-     for (b = firstbuf; b != NULL; b = b->b_next)
-@@ -624,14 +887,16 @@ static VALUE buffer_count(VALUE self)
- static VALUE get_buffer_line(buf_T *buf, linenr_T n)
- {
-     if (n > 0 && n <= buf->b_ml.ml_line_count)
-     {
-       char *line = (char *)ml_get_buf(buf, n, FALSE);
--      return line ? rb_str_new2(line) : Qnil;
-+      return line ? vim_str2rb_enc_str(line) : Qnil;
-     }
--    rb_raise(rb_eIndexError, "index %d out of buffer", n);
-+    rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
-+#ifndef __GNUC__
-     return Qnil; /* For stop warning */
-+#endif
- }
- static VALUE buffer_aref(VALUE self, VALUE num)
- {
-     buf_T *buf = get_buf(self);
-@@ -641,11 +906,11 @@ static VALUE buffer_aref(VALUE self, VAL
-     return Qnil; /* For stop warning */
- }
- static VALUE set_buffer_line(buf_T *buf, linenr_T n, VALUE str)
- {
--    char      *line = STR2CSTR(str);
-+    char      *line = StringValuePtr(str);
-     aco_save_T        aco;
-     if (n > 0 && n <= buf->b_ml.ml_line_count && line != NULL)
-     {
-       /* set curwin/curbuf for "buf" and save some things */
-@@ -665,12 +930,14 @@ static VALUE set_buffer_line(buf_T *buf,
-       update_curbuf(NOT_VALID);
-     }
-     else
-     {
--      rb_raise(rb_eIndexError, "index %d out of buffer", n);
-+      rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
-+#ifndef __GNUC__
-       return Qnil; /* For stop warning */
-+#endif
-     }
-     return str;
- }
- static VALUE buffer_aset(VALUE self, VALUE num, VALUE str)
-@@ -709,23 +976,26 @@ static VALUE buffer_delete(VALUE self, V
-       update_curbuf(NOT_VALID);
-     }
-     else
-     {
--      rb_raise(rb_eIndexError, "index %d out of buffer", n);
-+      rb_raise(rb_eIndexError, "line number %ld out of range", n);
-     }
-     return Qnil;
- }
- static VALUE buffer_append(VALUE self, VALUE num, VALUE str)
- {
-     buf_T     *buf = get_buf(self);
--    char      *line = STR2CSTR(str);
-+    char      *line = StringValuePtr(str);
-     long      n = NUM2LONG(num);
-     aco_save_T        aco;
--    if (n >= 0 && n <= buf->b_ml.ml_line_count && line != NULL)
-+    if (line == NULL) {
-+      rb_raise(rb_eIndexError, "NULL line");
-+    }
-+    else if (n >= 0 && n <= buf->b_ml.ml_line_count)
-     {
-       /* set curwin/curbuf for "buf" and save some things */
-       aucmd_prepbuf(&aco, buf);
-       if (u_inssub(n + 1) == OK) {
-@@ -743,11 +1013,11 @@ static VALUE buffer_append(VALUE self, V
-       /* Careful: autocommands may have made "buf" invalid! */
-       update_curbuf(NOT_VALID);
-     }
-     else {
--      rb_raise(rb_eIndexError, "index %d out of buffer", n);
-+      rb_raise(rb_eIndexError, "line number %ld out of range", n);
-     }
-     return str;
- }
- static VALUE window_new(win_T *win)
-@@ -787,11 +1057,11 @@ static VALUE window_s_current()
- static VALUE line_s_current()
- {
-     return get_buffer_line(curbuf, curwin->w_cursor.lnum);
- }
--static VALUE set_current_line(VALUE self, VALUE str)
-+static VALUE set_current_line(VALUE self UNUSED, VALUE str)
- {
-     return set_buffer_line(curbuf, curwin->w_cursor.lnum, str);
- }
- static VALUE current_line_number()
-@@ -813,11 +1083,11 @@ static VALUE window_s_count()
+-                          },
++                          SCRIPTID_INIT},
+     {"formatoptions","fo",  P_STRING|P_ALLOCED|P_VIM|P_FLAGLIST,
+                           (char_u *)&p_fo, PV_FO,
+-                          {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}},
++                          {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}
++                          SCRIPTID_INIT},
+     {"formatlistpat","flp", P_STRING|P_ALLOCED|P_VI_DEF,
+                           (char_u *)&p_flp, PV_FLP,
+-                          {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*", (char_u *)0L}},
++                          {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*",
++                                               (char_u *)0L} SCRIPTID_INIT},
+     {"formatprg",   "fp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_fp, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"fsync",       "fs",   P_BOOL|P_SECURE|P_VI_DEF,
+ #ifdef HAVE_FSYNC
+                           (char_u *)&p_fs, PV_NONE,
+                           {(char_u *)TRUE, (char_u *)0L}
  #else
-     return INT2NUM(1);
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)FALSE, (char_u *)0L}
  #endif
- }
--static VALUE window_s_aref(VALUE self, VALUE num)
-+static VALUE window_s_aref(VALUE self UNUSED, VALUE num)
- {
-     win_T *w;
-     int n = NUM2INT(num);
- #ifndef FEAT_WINDOWS
-@@ -884,31 +1154,31 @@ static VALUE window_set_cursor(VALUE sel
- {
-     VALUE lnum, col;
-     win_T *win = get_win(self);
-     Check_Type(pos, T_ARRAY);
--    if (RARRAY(pos)->len != 2)
-+    if (RARRAY_LEN(pos) != 2)
-       rb_raise(rb_eArgError, "array length must be 2");
--    lnum = RARRAY(pos)->ptr[0];
--    col = RARRAY(pos)->ptr[1];
-+    lnum = RARRAY_PTR(pos)[0];
-+    col = RARRAY_PTR(pos)[1];
-     win->w_cursor.lnum = NUM2LONG(lnum);
-     win->w_cursor.col = NUM2UINT(col);
-     check_cursor();               /* put cursor on an existing line */
-     update_screen(NOT_VALID);
-     return Qnil;
- }
--static VALUE f_p(int argc, VALUE *argv, VALUE self)
-+static VALUE f_p(int argc, VALUE *argv, VALUE self UNUSED)
- {
-     int i;
-     VALUE str = rb_str_new("", 0);
-     for (i = 0; i < argc; i++) {
-       if (i > 0) rb_str_cat(str, ", ", 2);
-       rb_str_concat(str, rb_inspect(argv[i]));
-     }
--    MSG(RSTRING(str)->ptr);
-+    MSG(RSTRING_PTR(str));
-     return Qnil;
- }
- static void ruby_io_init(void)
- {
---- vim72.orig/src/if_tcl.c
-+++ vim72/src/if_tcl.c
-@@ -159,11 +159,11 @@ static struct ref refsdeleted;   /* dummy
- # ifndef  DYNAMIC_TCL /* Just generating prototypes */
- typedef int HANDLE;
+-                          },
++                          SCRIPTID_INIT},
+     {"gdefault",    "gd",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_gd, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"graphic",           "gr",   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"grepformat",  "gfm",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_QUICKFIX
+                           (char_u *)&p_gefm, PV_NONE,
+-                          {(char_u *)DFLT_GREPFORMAT, (char_u *)0L},
++                          {(char_u *)DFLT_GREPFORMAT, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"grepprg",           "gp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_QUICKFIX
+                           (char_u *)&p_gp, PV_GP,
+                           {
+ # ifdef WIN3264
+@@ -1183,19 +1192,19 @@ static struct vimoption
+ #  else
+ #   ifdef VMS
+                           (char_u *)"SEARCH/NUMBERS ",
+ #   else
+                           (char_u *)"grep -n ",
+-#endif
+-#endif
++#   endif
++#  endif
  # endif
- /*
-- * Declare HANDLE for perl.dll and function pointers.
-+ * Declare HANDLE for tcl.dll and function pointers.
-  */
- static HANDLE hTclLib = NULL;
- Tcl_Interp* (*dll_Tcl_CreateInterp)();
- /*
-@@ -180,11 +180,11 @@ static struct {
- /*
-  * Make all runtime-links of tcl.
-  *
-  * 1. Get module handle using LoadLibraryEx.
-- * 2. Get pointer to perl function by GetProcAddress.
-+ * 2. Get pointer to tcl function by GetProcAddress.
-  * 3. Repeat 2, until get all functions will be used.
-  *
-  * Parameter 'libname' provides name of DLL.
-  * Return OK or FAIL.
-  */
-@@ -288,14 +288,13 @@ tcl_end()
-  * we just delete the Tcl interpreter (and create a new one with the next
-  * :tcl command).
-  */
- #define TCL_EXIT      5
--/* ARGSUSED */
-     static int
- exitcmd(dummy, interp, objc, objv)
--    ClientData dummy;
-+    ClientData dummy UNUSED;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
- {
-     int value = 0;
-@@ -313,14 +312,13 @@ exitcmd(dummy, interp, objc, objv)
-           Tcl_WrongNumArgs(interp, 1, objv, "?returnCode?");
-     }
-     return TCL_ERROR;
- }
--/* ARGSUSED */
-     static int
- catchcmd(dummy, interp, objc, objv)
--    ClientData        dummy;
-+    ClientData        dummy UNUSED;
-     Tcl_Interp        *interp;
-     int               objc;
-     Tcl_Obj   *CONST objv[];
+-                          (char_u *)0L},
++                          (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"guicursor",    "gcr",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef CURSOR_SHAPE
+                           (char_u *)&p_guicursor, PV_NONE,
+                           {
+ # ifdef FEAT_GUI
+@@ -1206,45 +1215,45 @@ static struct vimoption
+                                   (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                                  },
++                          SCRIPTID_INIT},
+     {"guifont",           "gfn",  P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
+ #ifdef FEAT_GUI
+                           (char_u *)&p_guifont, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                                  },
++                          SCRIPTID_INIT},
+     {"guifontset",  "gfs",  P_STRING|P_VI_DEF|P_RCLR|P_COMMA,
+ #if defined(FEAT_GUI) && defined(FEAT_XFONTSET)
+                           (char_u *)&p_guifontset, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                                  },
++                          SCRIPTID_INIT},
+     {"guifontwide", "gfw",  P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
+ #if defined(FEAT_GUI) && defined(FEAT_MBYTE)
+                           (char_u *)&p_guifontwide, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                                  },
++                          SCRIPTID_INIT},
+     {"guiheadroom", "ghr",  P_NUM|P_VI_DEF,
+ #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
+                           (char_u *)&p_ghr, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)50L, (char_u *)0L}},
++                          {(char_u *)50L, (char_u *)0L} SCRIPTID_INIT},
+     {"guioptions",  "go",   P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST,
+ #if defined(FEAT_GUI)
+                           (char_u *)&p_go, PV_NONE,
+ # if defined(UNIX) && !defined(MACOS)
+                           {(char_u *)"aegimrLtT", (char_u *)0L}
+@@ -1253,115 +1262,117 @@ static struct vimoption
+ # endif
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                                  },
++                          SCRIPTID_INIT},
+     {"guipty",            NULL,   P_BOOL|P_VI_DEF,
+ #if defined(FEAT_GUI)
+                           (char_u *)&p_guipty, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"guitablabel",  "gtl", P_STRING|P_VI_DEF|P_RWIN,
+ #if defined(FEAT_GUI_TABLINE)
+                           (char_u *)&p_gtl, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                                  },
++                          SCRIPTID_INIT},
+     {"guitabtooltip",  "gtt", P_STRING|P_VI_DEF|P_RWIN,
+ #if defined(FEAT_GUI_TABLINE)
+                           (char_u *)&p_gtt, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                                  },
++                          SCRIPTID_INIT},
+     {"hardtabs",    "ht",   P_NUM|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"helpfile",    "hf",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_hf, PV_NONE,
+-                          {(char_u *)DFLT_HELPFILE, (char_u *)0L}},
++                          {(char_u *)DFLT_HELPFILE, (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"helpheight",  "hh",   P_NUM|P_VI_DEF,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)&p_hh, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)20L, (char_u *)0L}},
++                          {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT},
+     {"helplang",    "hlg",  P_STRING|P_VI_DEF|P_COMMA,
+ #ifdef FEAT_MULTI_LANG
+                           (char_u *)&p_hlg, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-    },
++                          SCRIPTID_INIT},
+     {"hidden",            "hid",  P_BOOL|P_VI_DEF,
+                           (char_u *)&p_hid, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"highlight",   "hl",   P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
+                           (char_u *)&p_hl, PV_NONE,
+-                          {(char_u *)HIGHLIGHT_INIT, (char_u *)0L}},
++                          {(char_u *)HIGHLIGHT_INIT, (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"history",           "hi",   P_NUM|P_VIM,
+                           (char_u *)&p_hi, PV_NONE,
+-                          {(char_u *)0L, (char_u *)20L}},
++                          {(char_u *)0L, (char_u *)20L} SCRIPTID_INIT},
+     {"hkmap",     "hk",   P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_RIGHTLEFT
+                           (char_u *)&p_hkmap, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"hkmapp",            "hkp",  P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_RIGHTLEFT
+                           (char_u *)&p_hkmapp, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"hlsearch",    "hls",  P_BOOL|P_VI_DEF|P_VIM|P_RALL,
+                           (char_u *)&p_hls, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"icon",      NULL,   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_TITLE
+                           (char_u *)&p_icon, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"iconstring",  NULL,   P_STRING|P_VI_DEF,
+ #ifdef FEAT_TITLE
+                           (char_u *)&p_iconstring, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"ignorecase",  "ic",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_ic, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"imactivatekey","imak",P_STRING|P_VI_DEF,
+ #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+                           (char_u *)&p_imak, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"imcmdline",   "imc",  P_BOOL|P_VI_DEF,
+ #ifdef USE_IM_CONTROL
+                           (char_u *)&p_imcmdline, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"imdisable",   "imd",  P_BOOL|P_VI_DEF,
+ #ifdef USE_IM_CONTROL
+                           (char_u *)&p_imdisable, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+@@ -1369,72 +1380,72 @@ static struct vimoption
+ #ifdef __sgi
+                           {(char_u *)TRUE, (char_u *)0L}
+ #else
+                           {(char_u *)FALSE, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"iminsert",    "imi",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_iminsert, PV_IMI,
+ #ifdef B_IMODE_IM
+                           {(char_u *)B_IMODE_IM, (char_u *)0L}
+ #else
+                           {(char_u *)B_IMODE_NONE, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"imsearch",    "ims",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_imsearch, PV_IMS,
+ #ifdef B_IMODE_IM
+                           {(char_u *)B_IMODE_IM, (char_u *)0L}
+ #else
+                           {(char_u *)B_IMODE_NONE, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"include",           "inc",  P_STRING|P_ALLOCED|P_VI_DEF,
+ #ifdef FEAT_FIND_ID
+                           (char_u *)&p_inc, PV_INC,
+                           {(char_u *)"^\\s*#\\s*include", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"includeexpr", "inex", P_STRING|P_ALLOCED|P_VI_DEF,
+ #if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
+                           (char_u *)&p_inex, PV_INEX,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"incsearch",   "is",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_is, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"indentexpr", "inde",  P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
+ #if defined(FEAT_CINDENT) && defined(FEAT_EVAL)
+                           (char_u *)&p_inde, PV_INDE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"indentkeys", "indk",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+ #if defined(FEAT_CINDENT) && defined(FEAT_EVAL)
+                           (char_u *)&p_indk, PV_INDK,
+                           {(char_u *)"0{,0},:,0#,!^F,o,O,e", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"infercase",   "inf",  P_BOOL|P_VI_DEF,
+                           (char_u *)&p_inf, PV_INF,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"insertmode",  "im",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_im, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"isfname",           "isf",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_isf, PV_NONE,
+                           {
+ #ifdef BACKSLASH_IN_FILENAME
+                               /* Excluded are: & and ^ are special in cmd.exe
+@@ -1453,11 +1464,11 @@ static struct vimoption
+                           (char_u *)"@,48-57,/,.,-,_,+,,,#,$,%,~,=",
+ #   endif
+ #  endif
+ # endif
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"isident",           "isi",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_isi, PV_NONE,
+                           {
+ #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
+                           (char_u *)"@,48-57,_,128-167,224-235",
+@@ -1470,11 +1481,11 @@ static struct vimoption
+                                   "251-254",
+ # else
+                           (char_u *)"@,48-57,_,192-255",
+ # endif
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"iskeyword",   "isk",  P_STRING|P_ALLOCED|P_VIM|P_COMMA|P_NODUP,
+                           (char_u *)&p_isk, PV_ISK,
+                           {
+ #ifdef EBCDIC
+                            (char_u *)"@,240-249,_",
+@@ -1489,11 +1500,11 @@ static struct vimoption
+                               (char_u *)"@,48-57,_,128-167,224-235"
+ # else
+                               ISK_LATIN1
+ # endif
+ #endif
+-                              }},
++                          } SCRIPTID_INIT},
+     {"isprint",           "isp",  P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP,
+                           (char_u *)&p_isp, PV_NONE,
+                           {
+ #if defined(MSDOS) || defined(MSWIN) || defined(OS2) \
+               || (defined(MACOS) && !defined(MACOS_X)) \
+@@ -1505,39 +1516,39 @@ static struct vimoption
+                           (char_u *)"63-255",
+ # else
+                           ISP_LATIN1,
+ # endif
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"joinspaces",  "js",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_js, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"key",       NULL,   P_STRING|P_ALLOCED|P_VI_DEF|P_NO_MKRC,
+ #ifdef FEAT_CRYPT
+                           (char_u *)&p_key, PV_KEY,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"keymap",            "kmp",  P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF|P_RSTAT|P_NFNAME|P_PRI_MKRC,
+ #ifdef FEAT_KEYMAP
+                           (char_u *)&p_keymap, PV_KMAP,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #endif
+-      },
++                          SCRIPTID_INIT},
+     {"keymodel",    "km",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_VISUAL
+                           (char_u *)&p_km, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"keywordprg",  "kp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_kp, PV_KP,
+                           {
+ #if defined(MSDOS) || defined(MSWIN)
+                           (char_u *)":help",
+@@ -1554,53 +1565,53 @@ static struct vimoption
+                           (char_u *)"man",
+ #  endif
+ # endif
+ #endif
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"langmap",     "lmap", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_LANGMAP
+                           (char_u *)&p_langmap, PV_NONE,
+                           {(char_u *)"",      /* unmatched } */
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL,
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"langmenu",    "lm",   P_STRING|P_VI_DEF|P_NFNAME,
+ #if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG)
+                           (char_u *)&p_lm, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"laststatus",  "ls",   P_NUM|P_VI_DEF|P_RALL,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)&p_ls, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"lazyredraw",  "lz",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_lz, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"linebreak",   "lbr",  P_BOOL|P_VI_DEF|P_RWIN,
+ #ifdef FEAT_LINEBREAK
+                           (char_u *)VAR_WIN, PV_LBR,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"lines",     NULL,   P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR,
+                           (char_u *)&Rows, PV_NONE,
+                           {
+ #if defined(MSDOS) || defined(WIN3264) || defined(OS2)
+                           (char_u *)25L,
+ #else
+                           (char_u *)24L,
+ #endif
+-                                          (char_u *)0L}},
++                                          (char_u *)0L} SCRIPTID_INIT},
+     {"linespace",   "lsp",  P_NUM|P_VI_DEF|P_RCLR,
+ #ifdef FEAT_GUI
+                           (char_u *)&p_linespace, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+@@ -1608,53 +1619,53 @@ static struct vimoption
+ #ifdef FEAT_GUI_W32
+                           {(char_u *)1L, (char_u *)0L}
+ #else
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"lisp",      NULL,   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_LISP
+                           (char_u *)&p_lisp, PV_LISP,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"lispwords",   "lw",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_LISP
+                           (char_u *)&p_lispwords, PV_NONE,
+                           {(char_u *)LISPWORD_VALUE, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"list",      NULL,   P_BOOL|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_LIST,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"listchars",   "lcs",  P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP,
+                           (char_u *)&p_lcs, PV_NONE,
+-                          {(char_u *)"eol:$", (char_u *)0L}},
++                          {(char_u *)"eol:$", (char_u *)0L} SCRIPTID_INIT},
+     {"loadplugins", "lpl",  P_BOOL|P_VI_DEF,
+                           (char_u *)&p_lpl, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+ #ifdef FEAT_GUI_MAC
+     {"macatsui",    NULL,   P_BOOL|P_VI_DEF|P_RCLR,
+                           (char_u *)&p_macatsui, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+ #endif
+     {"magic",     NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_magic, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"makeef",            "mef",  P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_QUICKFIX
+                           (char_u *)&p_mef, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"makeprg",           "mp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_QUICKFIX
+                           (char_u *)&p_mp, PV_MP,
+ # ifdef VMS
+                           {(char_u *)"MMS", (char_u *)0L}
+@@ -1663,100 +1674,103 @@ static struct vimoption
+ # endif
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"matchpairs",  "mps",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_mps, PV_MPS,
+-                          {(char_u *)"(:),{:},[:]", (char_u *)0L}},
++                          {(char_u *)"(:),{:},[:]", (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"matchtime",   "mat",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_mat, PV_NONE,
+-                          {(char_u *)5L, (char_u *)0L}},
++                          {(char_u *)5L, (char_u *)0L} SCRIPTID_INIT},
+     {"maxcombine",  "mco",  P_NUM|P_VI_DEF,
+ #ifdef FEAT_MBYTE
+                           (char_u *)&p_mco, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)2, (char_u *)0L}},
++                          {(char_u *)2, (char_u *)0L} SCRIPTID_INIT},
+     {"maxfuncdepth", "mfd", P_NUM|P_VI_DEF,
+ #ifdef FEAT_EVAL
+                           (char_u *)&p_mfd, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)100L, (char_u *)0L}},
++                          {(char_u *)100L, (char_u *)0L} SCRIPTID_INIT},
+     {"maxmapdepth", "mmd",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_mmd, PV_NONE,
+-                          {(char_u *)1000L, (char_u *)0L}},
++                          {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT},
+     {"maxmem",            "mm",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_mm, PV_NONE,
+-                          {(char_u *)DFLT_MAXMEM, (char_u *)0L}},
++                          {(char_u *)DFLT_MAXMEM, (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"maxmempattern","mmp", P_NUM|P_VI_DEF,
+                           (char_u *)&p_mmp, PV_NONE,
+-                          {(char_u *)1000L, (char_u *)0L}},
++                          {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT},
+     {"maxmemtot",   "mmt",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_mmt, PV_NONE,
+-                          {(char_u *)DFLT_MAXMEMTOT, (char_u *)0L}},
++                          {(char_u *)DFLT_MAXMEMTOT, (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"menuitems",   "mis",  P_NUM|P_VI_DEF,
+ #ifdef FEAT_MENU
+                           (char_u *)&p_mis, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)25L, (char_u *)0L}},
++                          {(char_u *)25L, (char_u *)0L} SCRIPTID_INIT},
+     {"mesg",      NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"mkspellmem",  "msm",  P_STRING|P_VI_DEF|P_EXPAND|P_SECURE,
+ #ifdef FEAT_SPELL
+                           (char_u *)&p_msm, PV_NONE,
+                           {(char_u *)"460000,2000,500", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-    },
++                          SCRIPTID_INIT},
+     {"modeline",    "ml",   P_BOOL|P_VIM,
+                           (char_u *)&p_ml, PV_ML,
+-                          {(char_u *)FALSE, (char_u *)TRUE}},
++                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
+     {"modelines",   "mls",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_mls, PV_NONE,
+-                          {(char_u *)5L, (char_u *)0L}},
++                          {(char_u *)5L, (char_u *)0L} SCRIPTID_INIT},
+     {"modifiable",  "ma",   P_BOOL|P_VI_DEF|P_NOGLOB,
+                           (char_u *)&p_ma, PV_MA,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"modified",    "mod",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
+                           (char_u *)&p_mod, PV_MOD,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"more",      NULL,   P_BOOL|P_VIM,
+                           (char_u *)&p_more, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)TRUE}},
++                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
+     {"mouse",     NULL,   P_STRING|P_VI_DEF|P_FLAGLIST,
+                           (char_u *)&p_mouse, PV_NONE,
+                           {
+ #if defined(MSDOS) || defined(WIN3264)
+                               (char_u *)"a",
+ #else
+                               (char_u *)"",
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"mousefocus",   "mousef", P_BOOL|P_VI_DEF,
+ #ifdef FEAT_GUI
+                           (char_u *)&p_mousef, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"mousehide",   "mh",   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_GUI
+                           (char_u *)&p_mh, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"mousemodel",  "mousem", P_STRING|P_VI_DEF,
+                           (char_u *)&p_mousem, PV_NONE,
+                           {
+ #if defined(MSDOS) || defined(MSWIN)
+                               (char_u *)"popup",
+@@ -1765,103 +1779,104 @@ static struct vimoption
+                               (char_u *)"popup_setpos",
+ # else
+                               (char_u *)"extend",
+ # endif
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"mouseshape",  "mouses",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_MOUSESHAPE
+                           (char_u *)&p_mouseshape, PV_NONE,
+                           {(char_u *)"i-r:beam,s:updown,sd:udsizing,vs:leftright,vd:lrsizing,m:no,ml:up-arrow,v:rightup-arrow", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"mousetime",   "mouset", P_NUM|P_VI_DEF,
+                           (char_u *)&p_mouset, PV_NONE,
+-                          {(char_u *)500L, (char_u *)0L}},
++                          {(char_u *)500L, (char_u *)0L} SCRIPTID_INIT},
+     {"mzquantum",  "mzq",   P_NUM,
+ #ifdef FEAT_MZSCHEME
+                           (char_u *)&p_mzq, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)100L, (char_u *)100L}},
++                          {(char_u *)100L, (char_u *)100L} SCRIPTID_INIT},
+     {"novice",            NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"nrformats",   "nf",   P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_nf, PV_NF,
+-                          {(char_u *)"octal,hex", (char_u *)0L}},
++                          {(char_u *)"octal,hex", (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"number",            "nu",   P_BOOL|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_NU,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"numberwidth", "nuw",  P_NUM|P_RWIN|P_VIM,
+ #ifdef FEAT_LINEBREAK
+                           (char_u *)VAR_WIN, PV_NUW,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)8L, (char_u *)4L}},
++                          {(char_u *)8L, (char_u *)4L} SCRIPTID_INIT},
+     {"omnifunc",    "ofu",  P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_COMPL_FUNC
+                           (char_u *)&p_ofu, PV_OFU,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"open",      NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"opendevice",  "odev", P_BOOL|P_VI_DEF,
+ #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
+                           (char_u *)&p_odev, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+                           {(char_u *)FALSE, (char_u *)FALSE}
+-                          },
++                          SCRIPTID_INIT},
+     {"operatorfunc", "opfunc", P_STRING|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_opfunc, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L} },
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"optimize",    "opt",  P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"osfiletype",  "oft",  P_STRING|P_ALLOCED|P_VI_DEF,
+ #ifdef FEAT_OSFILETYPE
+                           (char_u *)&p_oft, PV_OFT,
+                           {(char_u *)DFLT_OFT, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"paragraphs",  "para", P_STRING|P_VI_DEF,
+                           (char_u *)&p_para, PV_NONE,
+                           {(char_u *)"IPLPPPQPP TPHPLIPpLpItpplpipbp",
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"paste",     NULL,   P_BOOL|P_VI_DEF|P_PRI_MKRC,
+                           (char_u *)&p_paste, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"pastetoggle", "pt",   P_STRING|P_VI_DEF,
+                           (char_u *)&p_pt, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"patchexpr",   "pex",  P_STRING|P_VI_DEF|P_SECURE,
+ #if defined(FEAT_DIFF) && defined(FEAT_EVAL)
+                           (char_u *)&p_pex, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"patchmode",   "pm",   P_STRING|P_VI_DEF|P_NFNAME,
+                           (char_u *)&p_pm, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"path",      "pa",   P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_path, PV_PATH,
+                           {
+ #if defined AMIGA || defined MSDOS || defined MSWIN
+                           (char_u *)".,,",
+@@ -1870,55 +1885,55 @@ static struct vimoption
+                           (char_u *)".,/emx/include,,",
+ # else /* Unix, probably */
+                           (char_u *)".,/usr/include,,",
+ # endif
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"preserveindent", "pi", P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_pi, PV_PI,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"previewheight", "pvh", P_NUM|P_VI_DEF,
+ #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
+                           (char_u *)&p_pvh, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)12L, (char_u *)0L}},
++                          {(char_u *)12L, (char_u *)0L} SCRIPTID_INIT},
+     {"previewwindow", "pvw", P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB,
+ #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
+                           (char_u *)VAR_WIN, PV_PVW,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"printdevice", "pdev", P_STRING|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_PRINTER
+                           (char_u *)&p_pdev, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"printencoding", "penc", P_STRING|P_VI_DEF,
+ #ifdef FEAT_POSTSCRIPT
+                           (char_u *)&p_penc, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"printexpr", "pexpr",  P_STRING|P_VI_DEF,
+ #ifdef FEAT_POSTSCRIPT
+                           (char_u *)&p_pexpr, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"printfont", "pfn",    P_STRING|P_VI_DEF,
+ #ifdef FEAT_PRINTER
+                           (char_u *)&p_pfn, PV_NONE,
+                           {
+ # ifdef MSWIN
+@@ -1929,187 +1944,190 @@ static struct vimoption
+                               (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"printheader", "pheader",  P_STRING|P_VI_DEF|P_GETTEXT,
+ #ifdef FEAT_PRINTER
+                           (char_u *)&p_header, PV_NONE,
+                           {(char_u *)N_("%<%f%h%m%=Page %N"), (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+    {"printmbcharset", "pmbcs",  P_STRING|P_VI_DEF,
+ #if defined(FEAT_POSTSCRIPT) && defined(FEAT_MBYTE)
+                           (char_u *)&p_pmcs, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"printmbfont", "pmbfn",  P_STRING|P_VI_DEF,
+ #if defined(FEAT_POSTSCRIPT) && defined(FEAT_MBYTE)
+                           (char_u *)&p_pmfn, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"printoptions", "popt", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_PRINTER
+                           (char_u *)&p_popt, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"prompt",            NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_prompt, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"pumheight",   "ph",   P_NUM|P_VI_DEF,
+ #ifdef FEAT_INS_EXPAND
+                           (char_u *)&p_ph, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"quoteescape", "qe",   P_STRING|P_ALLOCED|P_VI_DEF,
+ #ifdef FEAT_TEXTOBJ
+                           (char_u *)&p_qe, PV_QE,
+                           {(char_u *)"\\", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"readonly",    "ro",   P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB,
+                           (char_u *)&p_ro, PV_RO,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"redraw",            NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"redrawtime",  "rdt",  P_NUM|P_VI_DEF,
+ #ifdef FEAT_RELTIME
+                           (char_u *)&p_rdt, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)2000L, (char_u *)0L}},
++                          {(char_u *)2000L, (char_u *)0L} SCRIPTID_INIT},
+     {"remap",     NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_remap, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"report",            NULL,   P_NUM|P_VI_DEF,
+                           (char_u *)&p_report, PV_NONE,
+-                          {(char_u *)2L, (char_u *)0L}},
++                          {(char_u *)2L, (char_u *)0L} SCRIPTID_INIT},
+     {"restorescreen", "rs", P_BOOL|P_VI_DEF,
+ #ifdef WIN3264
+                           (char_u *)&p_rs, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"revins",            "ri",   P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_RIGHTLEFT
+                           (char_u *)&p_ri, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"rightleft",   "rl",   P_BOOL|P_VI_DEF|P_RWIN,
+ #ifdef FEAT_RIGHTLEFT
+                           (char_u *)VAR_WIN, PV_RL,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"rightleftcmd", "rlc", P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN,
+ #ifdef FEAT_RIGHTLEFT
+                           (char_u *)VAR_WIN, PV_RLC,
+                           {(char_u *)"search", (char_u *)NULL}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"ruler",     "ru",   P_BOOL|P_VI_DEF|P_VIM|P_RSTAT,
+ #ifdef FEAT_CMDL_INFO
+                           (char_u *)&p_ru, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"rulerformat", "ruf",  P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT,
+ #ifdef FEAT_STL_OPT
+                           (char_u *)&p_ruf, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"runtimepath", "rtp",  P_STRING|P_VI_DEF|P_EXPAND|P_COMMA|P_NODUP|P_SECURE,
+                           (char_u *)&p_rtp, PV_NONE,
+-                          {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L}},
++                          {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"scroll",            "scr",  P_NUM|P_NO_MKRC|P_VI_DEF,
+                           (char_u *)VAR_WIN, PV_SCROLL,
+-                          {(char_u *)12L, (char_u *)0L}},
++                          {(char_u *)12L, (char_u *)0L} SCRIPTID_INIT},
+     {"scrollbind",  "scb",  P_BOOL|P_VI_DEF,
+ #ifdef FEAT_SCROLLBIND
+                           (char_u *)VAR_WIN, PV_SCBIND,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"scrolljump",  "sj",   P_NUM|P_VI_DEF|P_VIM,
+                           (char_u *)&p_sj, PV_NONE,
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"scrolloff",   "so",   P_NUM|P_VI_DEF|P_VIM|P_RALL,
+                           (char_u *)&p_so, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"scrollopt",   "sbo",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_SCROLLBIND
+                           (char_u *)&p_sbo, PV_NONE,
+                           {(char_u *)"ver,jump", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"sections",    "sect", P_STRING|P_VI_DEF,
+                           (char_u *)&p_sections, PV_NONE,
+-                          {(char_u *)"SHNHH HUnhsh", (char_u *)0L}},
++                          {(char_u *)"SHNHH HUnhsh", (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"secure",            NULL,   P_BOOL|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_secure, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"selection",   "sel",  P_STRING|P_VI_DEF,
+ #ifdef FEAT_VISUAL
+                           (char_u *)&p_sel, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"inclusive", (char_u *)0L}},
++                          {(char_u *)"inclusive", (char_u *)0L}
++                          SCRIPTID_INIT},
+     {"selectmode",  "slm",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_VISUAL
+                           (char_u *)&p_slm, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"sessionoptions", "ssop", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_SESSION
+                           (char_u *)&p_ssop, PV_NONE,
+        {(char_u *)"blank,buffers,curdir,folds,help,options,tabpages,winsize",
+                                                              (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"shell",     "sh",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_sh, PV_NONE,
+                           {
+ #ifdef VMS
+                           (char_u *)"-",
+@@ -2134,11 +2152,11 @@ static struct vimoption
+ #    endif
+ #   endif
+ #  endif
+ # endif
+ #endif /* VMS */
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"shellcmdflag","shcf", P_STRING|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_shcf, PV_NONE,
+                           {
+ #if defined(MSDOS) || defined(MSWIN)
+                           (char_u *)"/c",
+@@ -2147,11 +2165,11 @@ static struct vimoption
+                           (char_u *)"/c",
+ # else
+                           (char_u *)"-c",
+ # endif
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"shellpipe",   "sp",   P_STRING|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_QUICKFIX
+                           (char_u *)&p_sp, PV_NONE,
+                           {
+ #if defined(UNIX) || defined(OS2)
+@@ -2166,66 +2184,67 @@ static struct vimoption
+                               (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-    },
++                          SCRIPTID_INIT},
+     {"shellquote",  "shq",  P_STRING|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_shq, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"shellredir",  "srr",  P_STRING|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_srr, PV_NONE,
+-                          {(char_u *)">", (char_u *)0L}},
++                          {(char_u *)">", (char_u *)0L} SCRIPTID_INIT},
+     {"shellslash",  "ssl",   P_BOOL|P_VI_DEF,
+ #ifdef BACKSLASH_IN_FILENAME
+                           (char_u *)&p_ssl, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"shelltemp",   "stmp", P_BOOL,
+                           (char_u *)&p_stmp, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)TRUE}},
++                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
+     {"shelltype",   "st",   P_NUM|P_VI_DEF,
+ #ifdef AMIGA
+                           (char_u *)&p_st, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"shellxquote", "sxq",  P_STRING|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_sxq, PV_NONE,
+                           {
+ #if defined(UNIX) && defined(USE_SYSTEM) && !defined(__EMX__)
+                           (char_u *)"\"",
+ #else
+                           (char_u *)"",
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"shiftround",  "sr",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_sr, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"shiftwidth",  "sw",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_sw, PV_SW,
+-                          {(char_u *)8L, (char_u *)0L}},
++                          {(char_u *)8L, (char_u *)0L} SCRIPTID_INIT},
+     {"shortmess",   "shm",  P_STRING|P_VIM|P_FLAGLIST,
+                           (char_u *)&p_shm, PV_NONE,
+-                          {(char_u *)"", (char_u *)"filnxtToO"}},
++                          {(char_u *)"", (char_u *)"filnxtToO"}
++                          SCRIPTID_INIT},
+     {"shortname",   "sn",   P_BOOL|P_VI_DEF,
+ #ifdef SHORT_FNAME
+                           (char_u *)NULL, PV_NONE,
+ #else
+                           (char_u *)&p_sn, PV_SN,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"showbreak",   "sbr",  P_STRING|P_VI_DEF|P_RALL,
+ #ifdef FEAT_LINEBREAK
+                           (char_u *)&p_sbr, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"showcmd",           "sc",   P_BOOL|P_VIM,
+ #ifdef FEAT_CMDL_INFO
+                           (char_u *)&p_sc, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+@@ -2234,529 +2253,532 @@ static struct vimoption
+ #ifdef UNIX
+                               (char_u *)FALSE
+ #else
+                               (char_u *)TRUE
+ #endif
+-                              }},
++                              } SCRIPTID_INIT},
+     {"showfulltag", "sft",  P_BOOL|P_VI_DEF,
+                           (char_u *)&p_sft, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"showmatch",   "sm",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_sm, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"showmode",    "smd",  P_BOOL|P_VIM,
+                           (char_u *)&p_smd, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)TRUE}},
++                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
+     {"showtabline", "stal", P_NUM|P_VI_DEF|P_RALL,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)&p_stal, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"sidescroll",  "ss",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_ss, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"sidescrolloff", "siso", P_NUM|P_VI_DEF|P_VIM|P_RBUF,
+                           (char_u *)&p_siso, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"slowopen",    "slow", P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"smartcase",   "scs",  P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_scs, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"smartindent", "si",   P_BOOL|P_VI_DEF|P_VIM,
+ #ifdef FEAT_SMARTINDENT
+                           (char_u *)&p_si, PV_SI,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"smarttab",    "sta",  P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_sta, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"softtabstop", "sts",  P_NUM|P_VI_DEF|P_VIM,
+                           (char_u *)&p_sts, PV_STS,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"sourceany",   NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"spell",     NULL,   P_BOOL|P_VI_DEF|P_RWIN,
+ #ifdef FEAT_SPELL
+                           (char_u *)VAR_WIN, PV_SPELL,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"spellcapcheck", "spc", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF,
+ #ifdef FEAT_SPELL
+                           (char_u *)&p_spc, PV_SPC,
+                           {(char_u *)"[.?!]\\_[\\])'\"         ]\\+", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"spellfile",   "spf",  P_STRING|P_EXPAND|P_ALLOCED|P_VI_DEF|P_SECURE|P_COMMA,
+ #ifdef FEAT_SPELL
+                           (char_u *)&p_spf, PV_SPF,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"spelllang",   "spl",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_RBUF|P_EXPAND,
+ #ifdef FEAT_SPELL
+                           (char_u *)&p_spl, PV_SPL,
+                           {(char_u *)"en", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"spellsuggest", "sps", P_STRING|P_VI_DEF|P_EXPAND|P_SECURE|P_COMMA,
+ #ifdef FEAT_SPELL
+                           (char_u *)&p_sps, PV_NONE,
+                           {(char_u *)"best", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-    },
++                          SCRIPTID_INIT},
+     {"splitbelow",  "sb",   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)&p_sb, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"splitright",  "spr",  P_BOOL|P_VI_DEF,
+ #ifdef FEAT_VERTSPLIT
+                           (char_u *)&p_spr, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"startofline", "sol",  P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_sol, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"statusline"  ,"stl",  P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT,
+ #ifdef FEAT_STL_OPT
+                           (char_u *)&p_stl, PV_STL,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"suffixes",    "su",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_su, PV_NONE,
+                           {(char_u *)".bak,~,.o,.h,.info,.swp,.obj",
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"suffixesadd", "sua",  P_STRING|P_VI_DEF|P_ALLOCED|P_COMMA|P_NODUP,
+ #ifdef FEAT_SEARCHPATH
+                           (char_u *)&p_sua, PV_SUA,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"swapfile",    "swf",  P_BOOL|P_VI_DEF|P_RSTAT,
+                           (char_u *)&p_swf, PV_SWF,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"swapsync",    "sws",  P_STRING|P_VI_DEF,
+                           (char_u *)&p_sws, PV_NONE,
+-                          {(char_u *)"fsync", (char_u *)0L}},
++                          {(char_u *)"fsync", (char_u *)0L} SCRIPTID_INIT},
+     {"switchbuf",   "swb",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_swb, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"synmaxcol",   "smc",  P_NUM|P_VI_DEF|P_RBUF,
+ #ifdef FEAT_SYN_HL
+                           (char_u *)&p_smc, PV_SMC,
+                           {(char_u *)3000L, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"syntax",            "syn",  P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
+ #ifdef FEAT_SYN_HL
+                           (char_u *)&p_syn, PV_SYN,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"tabline",           "tal",  P_STRING|P_VI_DEF|P_RALL,
+ #ifdef FEAT_STL_OPT
+                           (char_u *)&p_tal, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"tabpagemax",  "tpm",  P_NUM|P_VI_DEF,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)&p_tpm, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)10L, (char_u *)0L}},
++                          {(char_u *)10L, (char_u *)0L} SCRIPTID_INIT},
+     {"tabstop",           "ts",   P_NUM|P_VI_DEF|P_RBUF,
+                           (char_u *)&p_ts, PV_TS,
+-                          {(char_u *)8L, (char_u *)0L}},
++                          {(char_u *)8L, (char_u *)0L} SCRIPTID_INIT},
+     {"tagbsearch",  "tbs",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_tbs, PV_NONE,
+ #ifdef VMS    /* binary searching doesn't appear to work on VMS */
+                           {(char_u *)0L, (char_u *)0L}
+ #else
+                           {(char_u *)TRUE, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"taglength",   "tl",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_tl, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"tagrelative", "tr",   P_BOOL|P_VIM,
+                           (char_u *)&p_tr, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)TRUE}},
++                          {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
+     {"tags",      "tag",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_tags, PV_TAGS,
+                           {
+ #if defined(FEAT_EMACS_TAGS) && !defined(CASE_INSENSITIVE_FILENAME)
+                           (char_u *)"./tags,./TAGS,tags,TAGS",
+ #else
+                           (char_u *)"./tags,tags",
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"tagstack",    "tgst", P_BOOL|P_VI_DEF,
+                           (char_u *)&p_tgst, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"term",      NULL,   P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
+                           (char_u *)&T_NAME, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"termbidi", "tbidi",   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_ARABIC
+                           (char_u *)&p_tbidi, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"termencoding", "tenc", P_STRING|P_VI_DEF|P_RCLR,
+ #ifdef FEAT_MBYTE
+                           (char_u *)&p_tenc, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"terse",     NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_terse, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"textauto",    "ta",   P_BOOL|P_VIM,
+                           (char_u *)&p_ta, PV_NONE,
+-                          {(char_u *)DFLT_TEXTAUTO, (char_u *)TRUE}},
++                          {(char_u *)DFLT_TEXTAUTO, (char_u *)TRUE}
++                          SCRIPTID_INIT},
+     {"textmode",    "tx",   P_BOOL|P_VI_DEF|P_NO_MKRC,
+                           (char_u *)&p_tx, PV_TX,
+                           {
+ #ifdef USE_CRNL
+                           (char_u *)TRUE,
+ #else
+                           (char_u *)FALSE,
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"textwidth",   "tw",   P_NUM|P_VI_DEF|P_VIM,
+                           (char_u *)&p_tw, PV_TW,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"thesaurus",   "tsr",  P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_INS_EXPAND
+                           (char_u *)&p_tsr, PV_TSR,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"tildeop",           "top",  P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_to, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"timeout",           "to",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_timeout, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"timeoutlen",  "tm",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_tm, PV_NONE,
+-                          {(char_u *)1000L, (char_u *)0L}},
++                          {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT},
+     {"title",     NULL,   P_BOOL|P_VI_DEF,
+ #ifdef FEAT_TITLE
+                           (char_u *)&p_title, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"titlelen",    NULL,   P_NUM|P_VI_DEF,
+ #ifdef FEAT_TITLE
+                           (char_u *)&p_titlelen, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)85L, (char_u *)0L}},
++                          {(char_u *)85L, (char_u *)0L} SCRIPTID_INIT},
+     {"titleold",    NULL,   P_STRING|P_VI_DEF|P_GETTEXT|P_SECURE|P_NO_MKRC,
+ #ifdef FEAT_TITLE
+                           (char_u *)&p_titleold, PV_NONE,
+                           {(char_u *)N_("Thanks for flying Vim"),
+                                                              (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"titlestring", NULL,   P_STRING|P_VI_DEF,
+ #ifdef FEAT_TITLE
+                           (char_u *)&p_titlestring, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+ #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32)
+     {"toolbar",     "tb",   P_STRING|P_COMMA|P_VI_DEF|P_NODUP,
+                           (char_u *)&p_toolbar, PV_NONE,
+-                          {(char_u *)"icons,tooltips", (char_u *)0L}},
++                          {(char_u *)"icons,tooltips", (char_u *)0L}
++                          SCRIPTID_INIT},
+ #endif
+ #if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
+     {"toolbariconsize",       "tbis", P_STRING|P_VI_DEF,
+                           (char_u *)&p_tbis, PV_NONE,
+-                          {(char_u *)"small", (char_u *)0L}},
++                          {(char_u *)"small", (char_u *)0L} SCRIPTID_INIT},
+ #endif
+     {"ttimeout",    NULL,   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_ttimeout, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"ttimeoutlen", "ttm",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_ttm, PV_NONE,
+-                          {(char_u *)-1L, (char_u *)0L}},
++                          {(char_u *)-1L, (char_u *)0L} SCRIPTID_INIT},
+     {"ttybuiltin",  "tbi",  P_BOOL|P_VI_DEF,
+                           (char_u *)&p_tbi, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"ttyfast",           "tf",   P_BOOL|P_NO_MKRC|P_VI_DEF,
+                           (char_u *)&p_tf, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"ttymouse",    "ttym", P_STRING|P_NODEFAULT|P_NO_MKRC|P_VI_DEF,
+ #if defined(FEAT_MOUSE) && (defined(UNIX) || defined(VMS))
+                           (char_u *)&p_ttym, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"ttyscroll",   "tsl",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_ttyscroll, PV_NONE,
+-                          {(char_u *)999L, (char_u *)0L}},
++                          {(char_u *)999L, (char_u *)0L} SCRIPTID_INIT},
+     {"ttytype",           "tty",  P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL,
+                           (char_u *)&T_NAME, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"undolevels",  "ul",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_ul, PV_NONE,
+                           {
+ #if defined(UNIX) || defined(WIN3264) || defined(OS2) || defined(VMS)
+                           (char_u *)1000L,
+ #else
+                           (char_u *)100L,
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"updatecount", "uc",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_uc, PV_NONE,
+-                          {(char_u *)200L, (char_u *)0L}},
++                          {(char_u *)200L, (char_u *)0L} SCRIPTID_INIT},
+     {"updatetime",  "ut",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_ut, PV_NONE,
+-                          {(char_u *)4000L, (char_u *)0L}},
++                          {(char_u *)4000L, (char_u *)0L} SCRIPTID_INIT},
+     {"verbose",           "vbs",  P_NUM|P_VI_DEF,
+                           (char_u *)&p_verbose, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"verbosefile", "vfile", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+                           (char_u *)&p_vfile, PV_NONE,
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"viewdir",     "vdir", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
+ #ifdef FEAT_SESSION
+                           (char_u *)&p_vdir, PV_NONE,
+                           {(char_u *)DFLT_VDIR, (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"viewoptions", "vop",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_SESSION
+                           (char_u *)&p_vop, PV_NONE,
+                           {(char_u *)"folds,options,cursor", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"viminfo",           "vi",   P_STRING|P_COMMA|P_NODUP|P_SECURE,
+ #ifdef FEAT_VIMINFO
+                           (char_u *)&p_viminfo, PV_NONE,
+ #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
+-                          {(char_u *)"", (char_u *)"'20,<50,s10,h,rA:,rB:"}
++                          {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
+ #else
+ # ifdef AMIGA
+                           {(char_u *)"",
+-                               (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"}
++                               (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"}
+ # else
+-                          {(char_u *)"", (char_u *)"'20,<50,s10,h"}
++                          {(char_u *)"", (char_u *)"'100,<50,s10,h"}
+ # endif
+ #endif
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"virtualedit", "ve",   P_STRING|P_COMMA|P_NODUP|P_VI_DEF|P_VIM,
+ #ifdef FEAT_VIRTUALEDIT
+                           (char_u *)&p_ve, PV_NONE,
+                           {(char_u *)"", (char_u *)""}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)0L, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"visualbell",  "vb",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_vb, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"w300",      NULL,   P_NUM|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"w1200",     NULL,   P_NUM|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"w9600",     NULL,   P_NUM|P_VI_DEF,
+                           (char_u *)NULL, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"warn",      NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_warn, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"weirdinvert", "wiv",  P_BOOL|P_VI_DEF|P_RCLR,
+                           (char_u *)&p_wiv, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"whichwrap",   "ww",   P_STRING|P_VIM|P_COMMA|P_FLAGLIST,
+                           (char_u *)&p_ww, PV_NONE,
+-                          {(char_u *)"", (char_u *)"b,s"}},
++                          {(char_u *)"", (char_u *)"b,s"} SCRIPTID_INIT},
+     {"wildchar",    "wc",   P_NUM|P_VIM,
+                           (char_u *)&p_wc, PV_NONE,
+-                          {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB}},
++                          {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB}
++                          SCRIPTID_INIT},
+     {"wildcharm",   "wcm",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_wcm, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"wildignore",  "wig",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+ #ifdef FEAT_WILDIGN
+                           (char_u *)&p_wig, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     {"wildmenu",    "wmnu", P_BOOL|P_VI_DEF,
+ #ifdef FEAT_WILDMENU
+                           (char_u *)&p_wmnu, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"wildmode",    "wim",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
+                           (char_u *)&p_wim, PV_NONE,
+-                          {(char_u *)"full", (char_u *)0L}},
++                          {(char_u *)"full", (char_u *)0L} SCRIPTID_INIT},
+     {"wildoptions", "wop",  P_STRING|P_VI_DEF,
+ #ifdef FEAT_CMDL_COMPL
+                           (char_u *)&p_wop, PV_NONE,
+                           {(char_u *)"", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"winaltkeys",  "wak",  P_STRING|P_VI_DEF,
+ #ifdef FEAT_WAK
+                           (char_u *)&p_wak, PV_NONE,
+                           {(char_u *)"menu", (char_u *)0L}
+ #else
+                           (char_u *)NULL, PV_NONE,
+                           {(char_u *)NULL, (char_u *)0L}
+ #endif
+-                          },
++                          SCRIPTID_INIT},
+     {"window",            "wi",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_window, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"winheight",   "wh",   P_NUM|P_VI_DEF,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)&p_wh, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"winfixheight", "wfh", P_BOOL|P_VI_DEF|P_RSTAT,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)VAR_WIN, PV_WFH,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"winfixwidth", "wfw", P_BOOL|P_VI_DEF|P_RSTAT,
+ #ifdef FEAT_VERTSPLIT
+                           (char_u *)VAR_WIN, PV_WFW,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"winminheight", "wmh", P_NUM|P_VI_DEF,
+ #ifdef FEAT_WINDOWS
+                           (char_u *)&p_wmh, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"winminwidth", "wmw", P_NUM|P_VI_DEF,
+ #ifdef FEAT_VERTSPLIT
+                           (char_u *)&p_wmw, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)1L, (char_u *)0L}},
++                          {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT},
+     {"winwidth",   "wiw",   P_NUM|P_VI_DEF,
+ #ifdef FEAT_VERTSPLIT
+                           (char_u *)&p_wiw, PV_NONE,
+ #else
+                           (char_u *)NULL, PV_NONE,
+ #endif
+-                          {(char_u *)20L, (char_u *)0L}},
++                          {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT},
+     {"wrap",      NULL,   P_BOOL|P_VI_DEF|P_RWIN,
+                           (char_u *)VAR_WIN, PV_WRAP,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"wrapmargin",  "wm",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_wm, PV_WM,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+     {"wrapscan",    "ws",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_ws, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"write",     NULL,   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_write, PV_NONE,
+-                          {(char_u *)TRUE, (char_u *)0L}},
++                          {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
+     {"writeany",    "wa",   P_BOOL|P_VI_DEF,
+                           (char_u *)&p_wa, PV_NONE,
+-                          {(char_u *)FALSE, (char_u *)0L}},
++                          {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+     {"writebackup", "wb",   P_BOOL|P_VI_DEF|P_VIM,
+                           (char_u *)&p_wb, PV_NONE,
+                           {
+ #ifdef FEAT_WRITEBACKUP
+                           (char_u *)TRUE,
+ #else
+                           (char_u *)FALSE,
+ #endif
+-                              (char_u *)0L}},
++                              (char_u *)0L} SCRIPTID_INIT},
+     {"writedelay",  "wd",   P_NUM|P_VI_DEF,
+                           (char_u *)&p_wd, PV_NONE,
+-                          {(char_u *)0L, (char_u *)0L}},
++                          {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+ /* terminal output codes */
+ #define p_term(sss, vvv)   {sss, NULL, P_STRING|P_VI_DEF|P_RALL|P_SECURE, \
+                           (char_u *)&vvv, PV_NONE, \
+-                          {(char_u *)"", (char_u *)0L}},
++                          {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
+     p_term("t_AB", T_CAB)
+     p_term("t_AF", T_CAF)
+     p_term("t_AL", T_CAL)
+     p_term("t_al", T_AL)
+@@ -2813,11 +2835,12 @@ static struct vimoption
+     p_term("t_ZH", T_CZH)
+     p_term("t_ZR", T_CZR)
+ /* terminal key codes are not in here */
+-    {NULL, NULL, 0, NULL, PV_NONE, {NULL, NULL}}      /* end marker */
++    /* end marker */
++    {NULL, NULL, 0, NULL, PV_NONE, {NULL, NULL} SCRIPTID_INIT}
+ };
+ #define PARAM_COUNT (sizeof(options) / sizeof(struct vimoption))
+ #ifdef FEAT_MBYTE
+@@ -3982,11 +4005,11 @@ do_set(arg, opt_flags)
+           arg += 7;
+       }
+       else
+       {
+           prefix = 1;
+-          if (STRNCMP(arg, "no", 2) == 0)
++          if (STRNCMP(arg, "no", 2) == 0 && STRNCMP(arg, "novice", 6) != 0)
+           {
+               prefix = 0;
+               arg += 2;
+           }
+           else if (STRNCMP(arg, "inv", 3) == 0)
+@@ -4117,15 +4140,27 @@ do_set(arg, opt_flags)
+           /* Skip all options that are window-local (used for :vimgrep). */
+           if ((opt_flags & OPT_NOWIN) && opt_idx >= 0
+                                          && options[opt_idx].var == VAR_WIN)
+               goto skip;
+-          /* Disallow changing some options from modelines */
+-          if ((opt_flags & OPT_MODELINE) && (flags & P_SECURE))
++          /* Disallow changing some options from modelines. */
++          if (opt_flags & OPT_MODELINE)
+           {
+-              errmsg = (char_u *)_("E520: Not allowed in a modeline");
+-              goto skip;
++              if (flags & P_SECURE)
++              {
++                  errmsg = (char_u *)_("E520: Not allowed in a modeline");
++                  goto skip;
++              }
++#ifdef FEAT_DIFF
++              /* In diff mode some options are overruled.  This avoids that
++               * 'foldmethod' becomes "marker" instead of "diff" and that
++               * "wrap" gets set. */
++              if (curwin->w_p_diff
++                      && (options[opt_idx].indir == PV_FDM
++                          || options[opt_idx].indir == PV_WRAP))
++                  goto skip;
++#endif
+           }
+ #ifdef HAVE_SANDBOX
+           /* Disallow changing some options in the sandbox */
+           if (sandbox != 0 && (flags & P_SECURE))
+@@ -5266,25 +5301,39 @@ insecure_flag(opt_idx, opt_flags)
+     /* Nothing special, return global flags field. */
+     return &options[opt_idx].flags;
+ }
+ #endif
++#ifdef FEAT_TITLE
++static void redraw_titles __ARGS((void));
++
++/*
++ * Redraw the window title and/or tab page text later.
++ */
++static void redraw_titles()
++{
++    need_maketitle = TRUE;
++# ifdef FEAT_WINDOWS
++    redraw_tabline = TRUE;
++# endif
++}
++#endif
++
+ /*
+  * Set a string option to a new value (without checking the effect).
+  * The string is copied into allocated memory.
+  * if ("opt_idx" == -1) "name" is used, otherwise "opt_idx" is used.
+  * When "set_sid" is zero set the scriptID to current_SID.  When "set_sid" is
+  * SID_NONE don't set the scriptID.  Otherwise set the scriptID to "set_sid".
+  */
+-/*ARGSUSED*/
+     void
+ set_string_option_direct(name, opt_idx, val, opt_flags, set_sid)
+     char_u    *name;
+     int               opt_idx;
+     char_u    *val;
+     int               opt_flags;      /* OPT_FREE, OPT_LOCAL and/or OPT_GLOBAL */
+-    int               set_sid;
++    int               set_sid UNUSED;
+ {
+     char_u    *s;
+     char_u    **varp;
+     int               both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0;
+     int               idx = opt_idx;
+@@ -5405,10 +5454,14 @@ did_set_string_option(opt_idx, varp, new
+     char_u    *errmsg = NULL;
+     char_u    *s, *p;
+     int               did_chartab = FALSE;
+     char_u    **gvarp;
+     long_u    free_oldval = (options[opt_idx].flags & P_ALLOCED);
++#ifdef FEAT_GUI
++    /* set when changing an option that only requires a redraw in the GUI */
++    int               redraw_gui_only = FALSE;
++#endif
+     /* Get the global option to compare with, otherwise we would have to check
+      * two values for all local options. */
+     gvarp = (char_u **)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL);
+@@ -5666,11 +5719,11 @@ did_set_string_option(opt_idx, varp, new
+               errmsg = e_invarg;
+           else
+           {
+ # ifdef FEAT_TITLE
+               /* May show a "+" in the title now. */
+-              need_maketitle = TRUE;
++              redraw_titles();
+ # endif
+               /* Add 'fileencoding' to the swap file. */
+               ml_setflags(curbuf);
+           }
+       }
+@@ -5685,11 +5738,11 @@ did_set_string_option(opt_idx, varp, new
+           }
+           if (varp == &p_enc)
+           {
+               errmsg = mb_init();
+ # ifdef FEAT_TITLE
+-              need_maketitle = TRUE;
++              redraw_titles();
+ # endif
+           }
+       }
+ # if defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)
+@@ -5764,18 +5817,32 @@ did_set_string_option(opt_idx, varp, new
+     else if (varp == &curbuf->b_p_keymap)
+     {
+       /* load or unload key mapping tables */
+       errmsg = keymap_init();
+-      /* When successfully installed a new keymap switch on using it. */
+-      if (*curbuf->b_p_keymap != NUL && errmsg == NULL)
++      if (errmsg == NULL)
+       {
+-          curbuf->b_p_iminsert = B_IMODE_LMAP;
+-          if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT)
+-              curbuf->b_p_imsearch = B_IMODE_LMAP;
+-          set_iminsert_global();
+-          set_imsearch_global();
++          if (*curbuf->b_p_keymap != NUL)
++          {
++              /* Installed a new keymap, switch on using it. */
++              curbuf->b_p_iminsert = B_IMODE_LMAP;
++              if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT)
++                  curbuf->b_p_imsearch = B_IMODE_LMAP;
++          }
++          else
++          {
++              /* Cleared the keymap, may reset 'iminsert' and 'imsearch'. */
++              if (curbuf->b_p_iminsert == B_IMODE_LMAP)
++                  curbuf->b_p_iminsert = B_IMODE_NONE;
++              if (curbuf->b_p_imsearch == B_IMODE_LMAP)
++                  curbuf->b_p_imsearch = B_IMODE_USE_INSERT;
++          }
++          if ((opt_flags & OPT_LOCAL) == 0)
++          {
++              set_iminsert_global();
++              set_imsearch_global();
++          }
+ # ifdef FEAT_WINDOWS
+           status_redraw_curbuf();
+ # endif
+       }
+     }
+@@ -5794,14 +5861,18 @@ did_set_string_option(opt_idx, varp, new
+           if (get_fileformat(curbuf) == EOL_DOS)
+               curbuf->b_p_tx = TRUE;
+           else
+               curbuf->b_p_tx = FALSE;
+ #ifdef FEAT_TITLE
+-          need_maketitle = TRUE;
++          redraw_titles();
+ #endif
+           /* update flag in swap file */
+           ml_setflags(curbuf);
++          /* Redraw needed when switching to/from "mac": a CR in the text
++           * will be displayed differently. */
++          if (get_fileformat(curbuf) == EOL_MAC || *oldval == 'm')
++              redraw_curbuf_later(NOT_VALID);
+       }
+     }
+     /* 'fileformats' */
+     else if (varp == &p_ffs)
+@@ -5975,19 +6046,27 @@ did_set_string_option(opt_idx, varp, new
+     else if (istermoption(&options[opt_idx]) && full_screen)
+     {
+       /* ":set t_Co=0" and ":set t_Co=1" do ":set t_Co=" */
+       if (varp == &T_CCO)
+       {
+-          t_colors = atoi((char *)T_CCO);
+-          if (t_colors <= 1)
++          int colors = atoi((char *)T_CCO);
++
++          /* Only reinitialize colors if t_Co value has really changed to
++           * avoid expensive reload of colorscheme if t_Co is set to the
++           * same value multiple times. */
++          if (colors != t_colors)
+           {
+-              if (new_value_alloced)
+-                  vim_free(T_CCO);
+-              T_CCO = empty_option;
++              t_colors = colors;
++              if (t_colors <= 1)
++              {
++                  if (new_value_alloced)
++                      vim_free(T_CCO);
++                  T_CCO = empty_option;
++              }
++              /* We now have a different color setup, initialize it again. */
++              init_highlight(TRUE, FALSE);
+           }
+-          /* We now have a different color setup, initialize it again. */
+-          init_highlight(TRUE, FALSE);
+       }
+       ttest(FALSE);
+       if (varp == &T_ME)
+       {
+           out_str(T_ME);
+@@ -6053,27 +6132,30 @@ did_set_string_option(opt_idx, varp, new
+               else
+ # endif
+                   errmsg = (char_u *)N_("E596: Invalid font(s)");
+           }
+       }
++      redraw_gui_only = TRUE;
+     }
+ # ifdef FEAT_XFONTSET
+     else if (varp == &p_guifontset)
+     {
+       if (STRCMP(p_guifontset, "*") == 0)
+           errmsg = (char_u *)N_("E597: can't select fontset");
+       else if (gui.in_use && gui_init_font(p_guifontset, TRUE) != OK)
+           errmsg = (char_u *)N_("E598: Invalid fontset");
++      redraw_gui_only = TRUE;
+     }
+ # endif
+ # ifdef FEAT_MBYTE
+     else if (varp == &p_guifontwide)
+     {
+       if (STRCMP(p_guifontwide, "*") == 0)
+           errmsg = (char_u *)N_("E533: can't select wide font");
+       else if (gui_get_wide_font() == FAIL)
+           errmsg = (char_u *)N_("E534: Invalid wide font");
++      redraw_gui_only = TRUE;
+     }
+ # endif
+ #endif
+ #ifdef CURSOR_SHAPE
+@@ -6131,17 +6213,28 @@ did_set_string_option(opt_idx, varp, new
+ #endif
+ #ifdef FEAT_GUI
+     /* 'guioptions' */
+     else if (varp == &p_go)
++    {
+       gui_init_which_components(oldval);
++      redraw_gui_only = TRUE;
++    }
+ #endif
+ #if defined(FEAT_GUI_TABLINE)
+     /* 'guitablabel' */
+     else if (varp == &p_gtl)
++    {
+       redraw_tabline = TRUE;
++      redraw_gui_only = TRUE;
++    }
++    /* 'guitabtooltip' */
++    else if (varp == &p_gtt)
++    {
++      redraw_gui_only = TRUE;
++    }
+ #endif
+ #if defined(FEAT_MOUSE_TTY) && (defined(UNIX) || defined(VMS))
+     /* 'ttymouse' */
+     else if (varp == &p_ttym)
+@@ -6319,10 +6412,13 @@ did_set_string_option(opt_idx, varp, new
+               curwin->w_redr_status = TRUE;
+               redraw_later(VALID);
+           }
+ # endif
+           curbuf->b_help = (curbuf->b_p_bt[0] == 'h');
++# ifdef FEAT_TITLE
++          redraw_titles();
++# endif
+       }
+     }
+ #endif
+ #ifdef FEAT_STL_OPT
+@@ -6488,11 +6584,15 @@ did_set_string_option(opt_idx, varp, new
+     {
+       if (check_opt_strings(*varp, p_fdm_values, FALSE) != OK
+               || *curwin->w_p_fdm == NUL)
+           errmsg = e_invarg;
+       else
++      {
+           foldUpdateAll(curwin);
++          if (foldmethodIsDiff(curwin))
++              newFoldLevel();
++      }
+     }
+ # ifdef FEAT_EVAL
+     /* 'foldexpr' */
+     else if (varp == &curwin->w_p_fde)
+     {
+@@ -6715,11 +6815,15 @@ did_set_string_option(opt_idx, varp, new
+     }
+ #endif
+     if (curwin->w_curswant != MAXCOL)
+       curwin->w_set_curswant = TRUE;  /* in case 'showbreak' changed */
+-    check_redraw(options[opt_idx].flags);
++#ifdef FEAT_GUI
++    /* check redraw when it's not a GUI option or the GUI is active. */
++    if (!redraw_gui_only || gui.in_use)
++#endif
++      check_redraw(options[opt_idx].flags);
+     return errmsg;
+ }
+ /*
+@@ -6930,10 +7034,11 @@ check_stl_option(s)
+ check_clipboard_option()
+ {
+     int               new_unnamed = FALSE;
+     int               new_autoselect = FALSE;
+     int               new_autoselectml = FALSE;
++    int               new_html = FALSE;
+     regprog_T *new_exclude_prog = NULL;
+     char_u    *errmsg = NULL;
+     char_u    *p;
+     for (p = p_cb; *p != NUL; )
+@@ -6953,10 +7058,15 @@ check_clipboard_option()
+                                       && (p[12] == ',' || p[12] == NUL))
+       {
+           new_autoselectml = TRUE;
+           p += 12;
+       }
++      else if (STRNCMP(p, "html", 4) == 0 && (p[4] == ',' || p[4] == NUL))
++      {
++          new_html = TRUE;
++          p += 4;
++      }
+       else if (STRNCMP(p, "exclude:", 8) == 0 && new_exclude_prog == NULL)
+       {
+           p += 8;
+           new_exclude_prog = vim_regcomp(p, RE_MAGIC);
+           if (new_exclude_prog == NULL)
+@@ -6974,10 +7084,11 @@ check_clipboard_option()
+     if (errmsg == NULL)
+     {
+       clip_unnamed = new_unnamed;
+       clip_autoselect = new_autoselect;
+       clip_autoselectml = new_autoselectml;
++      clip_html = new_html;
+       vim_free(clip_exclude_prog);
+       clip_exclude_prog = new_exclude_prog;
+     }
+     else
+       vim_free(new_exclude_prog);
+@@ -7092,10 +7203,18 @@ set_bool_option(opt_idx, varp, value, op
+     if ((int *)varp == &p_cp)
+     {
+       compatible_set();
+     }
++    /* 'list', 'number' */
++    else if ((int *)varp == &curwin->w_p_list
++        || (int *)varp == &curwin->w_p_nu)
++    {
++      if (curwin->w_curswant != MAXCOL)
++          curwin->w_set_curswant = TRUE;
++    }
++
+     else if ((int *)varp == &curbuf->b_p_ro)
+     {
+       /* when 'readonly' is reset globally, also reset readonlymode */
+       if (!curbuf->b_p_ro && (opt_flags & OPT_LOCAL) == 0)
+           readonlymode = FALSE;
+@@ -7103,34 +7222,40 @@ set_bool_option(opt_idx, varp, value, op
+       /* when 'readonly' is set may give W10 again */
+       if (curbuf->b_p_ro)
+           curbuf->b_did_warn = FALSE;
+ #ifdef FEAT_TITLE
+-      need_maketitle = TRUE;
++      redraw_titles();
+ #endif
+     }
+ #ifdef FEAT_TITLE
+     /* when 'modifiable' is changed, redraw the window title */
+     else if ((int *)varp == &curbuf->b_p_ma)
+-      need_maketitle = TRUE;
++    {
++      redraw_titles();
++    }
+     /* when 'endofline' is changed, redraw the window title */
+     else if ((int *)varp == &curbuf->b_p_eol)
+-      need_maketitle = TRUE;
+-#ifdef FEAT_MBYTE
+-    /* when 'bomb' is changed, redraw the window title */
++    {
++      redraw_titles();
++    }
++# ifdef FEAT_MBYTE
++    /* when 'bomb' is changed, redraw the window title and tab page text */
+     else if ((int *)varp == &curbuf->b_p_bomb)
+-      need_maketitle = TRUE;
+-#endif
++    {
++      redraw_titles();
++    }
++# endif
+ #endif
+     /* when 'bin' is set also set some other options */
+     else if ((int *)varp == &curbuf->b_p_bin)
+     {
+       set_options_bin(old_value, curbuf->b_p_bin, opt_flags);
+ #ifdef FEAT_TITLE
+-      need_maketitle = TRUE;
++      redraw_titles();
+ #endif
+     }
+ #ifdef FEAT_AUTOCMD
+     /* when 'buflisted' changes, trigger autocommands */
+@@ -7277,11 +7402,11 @@ set_bool_option(opt_idx, varp, value, op
+     else if ((int *)varp == &curbuf->b_changed)
+     {
+       if (!value)
+           save_file_ff(curbuf);       /* Buffer is unchanged */
+ #ifdef FEAT_TITLE
+-      need_maketitle = TRUE;
++      redraw_titles();
+ #endif
+ #ifdef FEAT_AUTOCMD
+       modified_was_set = value;
+ #endif
+     }
+@@ -7314,10 +7439,12 @@ set_bool_option(opt_idx, varp, value, op
+     /* If 'wrap' is set, set w_leftcol to zero. */
+     else if ((int *)varp == &curwin->w_p_wrap)
+     {
+       if (curwin->w_p_wrap)
+           curwin->w_leftcol = 0;
++      if (curwin->w_curswant != MAXCOL)
++          curwin->w_set_curswant = TRUE;
+     }
+ #ifdef FEAT_WINDOWS
+     else if ((int *)varp == &p_ea)
+     {
+@@ -7484,13 +7611,17 @@ set_bool_option(opt_idx, varp, value, op
+           /* Arabic requires a utf-8 encoding, inform the user if its not
+            * set. */
+           if (STRCMP(p_enc, "utf-8") != 0)
+           {
++              static char *w_arabic = N_("W17: Arabic requires UTF-8, do ':set encoding=utf-8'");
++
+               msg_source(hl_attr(HLF_W));
+-              MSG_ATTR(_("W17: Arabic requires UTF-8, do ':set encoding=utf-8'"),
+-                      hl_attr(HLF_W));
++              MSG_ATTR(_(w_arabic), hl_attr(HLF_W));
++#ifdef FEAT_EVAL
++              set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_arabic), -1);
++#endif
+           }
+ # ifdef FEAT_MBYTE
+           /* set 'delcombine' */
+           p_deco = TRUE;
+@@ -7533,22 +7664,45 @@ set_bool_option(opt_idx, varp, value, op
+           /* Revert to the default keymap */
+           curbuf->b_p_iminsert = B_IMODE_NONE;
+           curbuf->b_p_imsearch = B_IMODE_USE_INSERT;
+ # endif
+       }
++      if (curwin->w_curswant != MAXCOL)
++          curwin->w_set_curswant = TRUE;
++    }
++
++    else if ((int *)varp == &p_arshape)
++    {
++      if (curwin->w_curswant != MAXCOL)
++          curwin->w_set_curswant = TRUE;
++    }
++#endif
++
++#ifdef FEAT_LINEBREAK
++    if ((int *)varp == &curwin->w_p_lbr)
++    {
++      if (curwin->w_curswant != MAXCOL)
++          curwin->w_set_curswant = TRUE;
++    }
++#endif
++
++#ifdef FEAT_RIGHTLEFT
++    if ((int *)varp == &curwin->w_p_rl)
++    {
++      if (curwin->w_curswant != MAXCOL)
++          curwin->w_set_curswant = TRUE;
+     }
+ #endif
+     /*
+      * End of handling side effects for bool options.
+      */
+     options[opt_idx].flags |= P_WAS_SET;
+     comp_col();                           /* in case 'ruler' or 'showcmd' changed */
+-    if (curwin->w_curswant != MAXCOL)
+-      curwin->w_set_curswant = TRUE;  /* in case 'list' changed */
++
+     check_redraw(options[opt_idx].flags);
+     return NULL;
+ }
+@@ -7712,11 +7866,11 @@ set_num_option(opt_idx, varp, value, err
+       if (curwin->w_p_fdl < 0)
+           curwin->w_p_fdl = 0;
+       newFoldLevel();
+     }
+-    /* 'foldminlevel' */
++    /* 'foldminlines' */
+     else if (pp == &curwin->w_p_fml)
+     {
+       foldUpdateAll(curwin);
+     }
+@@ -7972,10 +8126,15 @@ set_num_option(opt_idx, varp, value, err
+       else if (curwin->w_p_scr <= 0)
+           curwin->w_p_scr = 1;
+       else /* curwin->w_p_scr > curwin->w_height */
+           curwin->w_p_scr = curwin->w_height;
+     }
++    if (p_hi < 0)
++    {
++      errmsg = e_positive;
++      p_hi = 0;
++    }
+     if (p_report < 0)
+     {
+       errmsg = e_positive;
+       p_report = 1;
+     }
+@@ -8225,17 +8384,17 @@ set_option_value(name, number, string, o
+           varp = get_varp_scope(&(options[opt_idx]), opt_flags);
+           if (varp != NULL)   /* hidden option is not changed */
+           {
+               if (number == 0 && string != NULL)
+               {
+-                  int index;
++                  int idx;
+                   /* Either we are given a string or we are setting option
+                    * to zero. */
+-                  for (index = 0; string[index] == '0'; ++index)
++                  for (idx = 0; string[idx] == '0'; ++idx)
+                       ;
+-                  if (string[index] != NUL || index == 0)
++                  if (string[idx] != NUL || idx == 0)
+                   {
+                       /* There's another character after zeros or the string
+                        * is empty.  In both cases, we are trying to set a
+                        * num option using a string. */
+                       EMSG3(_("E521: Number required: &%s = '%s'"),
+@@ -8321,11 +8480,11 @@ find_key_option(arg)
+       key = TERMCAP2KEY(arg[2], arg[3]);
+     else
+     {
+       --arg;                      /* put arg at the '<' */
+       modifiers = 0;
+-      key = find_special_key(&arg, &modifiers, TRUE);
++      key = find_special_key(&arg, &modifiers, TRUE, TRUE);
+       if (modifiers)              /* can't handle modifiers here */
+           key = 0;
+     }
+     return key;
+ }
+@@ -8811,10 +8970,32 @@ free_termoptions()
+       }
+     clear_termcodes();
+ }
+ /*
++ * Free the string for one term option, if it was allocated.
++ * Set the string to empty_option and clear allocated flag.
++ * "var" points to the option value.
++ */
++    void
++free_one_termoption(var)
++    char_u *var;
++{
++    struct vimoption   *p;
++
++    for (p = &options[0]; p->fullname != NULL; p++)
++      if (p->var == var)
++      {
++          if (p->flags & P_ALLOCED)
++              free_string_option(*(char_u **)(p->var));
++          *(char_u **)(p->var) = empty_option;
++          p->flags &= ~P_ALLOCED;
++          break;
++      }
++}
++
++/*
+  * Set the terminal option defaults to the current value.
+  * Used after setting the terminal name.
+  */
+     void
+ set_term_defaults()
+@@ -9269,14 +9450,13 @@ check_win_options(win)
+ }
+ /*
+  * Check for NULL pointers in a winopt_T and replace them with empty_option.
+  */
+-/*ARGSUSED*/
+     void
+ check_winopt(wop)
+-    winopt_T  *wop;
++    winopt_T  *wop UNUSED;
+ {
+ #ifdef FEAT_FOLDING
+     check_string_option(&wop->wo_fdi);
+     check_string_option(&wop->wo_fdm);
+ # ifdef FEAT_EVAL
+@@ -9294,14 +9474,13 @@ check_winopt(wop)
+ }
+ /*
+  * Free the allocated memory inside a winopt_T.
+  */
+-/*ARGSUSED*/
+     void
+ clear_winopt(wop)
+-    winopt_T  *wop;
++    winopt_T  *wop UNUSED;
+ {
+ #ifdef FEAT_FOLDING
+     clear_string_option(&wop->wo_fdi);
+     clear_string_option(&wop->wo_fdm);
+ # ifdef FEAT_EVAL
+@@ -9643,11 +9822,11 @@ set_context_in_set_cmd(xp, arg, opt_flag
+           ++p;
+           break;
+       }
+       --p;
+     }
+-    if (STRNCMP(p, "no", 2) == 0)
++    if (STRNCMP(p, "no", 2) == 0 && STRNCMP(p, "novice", 6) != 0)
+     {
+       xp->xp_context = EXPAND_BOOL_SETTINGS;
+       p += 2;
+     }
+     if (STRNCMP(p, "inv", 3) == 0)
+@@ -9832,11 +10011,12 @@ ExpandSettings(xp, regmatch, num_file, f
+     for (loop = 0; loop <= 1; ++loop)
+     {
+       regmatch->rm_ic = ic;
+       if (xp->xp_context != EXPAND_BOOL_SETTINGS)
+       {
+-          for (match = 0; match < sizeof(names) / sizeof(char *); ++match)
++          for (match = 0; match < (int)(sizeof(names) / sizeof(char *));
++                                                                    ++match)
+               if (vim_regexec(regmatch, (char_u *)names[match], (colnr_T)0))
+               {
+                   if (loop == 0)
+                       num_normal++;
+                   else
+@@ -10091,29 +10271,114 @@ wc_use_keyname(varp, wcp)
+     return FALSE;
+ }
+ #ifdef FEAT_LANGMAP
+ /*
+- * Any character has an equivalent character.  This is used for keyboards that
+- * have a special language mode that sends characters above 128 (although
+- * other characters can be translated too).
++ * Any character has an equivalent 'langmap' character.  This is used for
++ * keyboards that have a special language mode that sends characters above
++ * 128 (although other characters can be translated too).  The "to" field is a
++ * Vim command character.  This avoids having to switch the keyboard back to
++ * ASCII mode when leaving Insert mode.
++ *
++ * langmap_mapchar[] maps any of 256 chars to an ASCII char used for Vim
++ * commands.
++ * When FEAT_MBYTE is defined langmap_mapga.ga_data is a sorted table of
++ * langmap_entry_T.  This does the same as langmap_mapchar[] for characters >=
++ * 256.
+  */
++# ifdef FEAT_MBYTE
++/*
++ * With multi-byte support use growarray for 'langmap' chars >= 256
++ */
++typedef struct
++{
++    int           from;
++    int     to;
++} langmap_entry_T;
++
++static garray_T langmap_mapga;
++static void langmap_set_entry __ARGS((int from, int to));
++
++/*
++ * Search for an entry in "langmap_mapga" for "from".  If found set the "to"
++ * field.  If not found insert a new entry at the appropriate location.
++ */
++    static void
++langmap_set_entry(from, to)
++    int    from;
++    int    to;
++{
++    langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data);
++    int             a = 0;
++    int             b = langmap_mapga.ga_len;
++
++    /* Do a binary search for an existing entry. */
++    while (a != b)
++    {
++      int i = (a + b) / 2;
++      int d = entries[i].from - from;
++
++      if (d == 0)
++      {
++          entries[i].to = to;
++          return;
++      }
++      if (d < 0)
++          a = i + 1;
++      else
++          b = i;
++    }
++
++    if (ga_grow(&langmap_mapga, 1) != OK)
++      return;  /* out of memory */
++
++    /* insert new entry at position "a" */
++    entries = (langmap_entry_T *)(langmap_mapga.ga_data) + a;
++    mch_memmove(entries + 1, entries,
++                      (langmap_mapga.ga_len - a) * sizeof(langmap_entry_T));
++    ++langmap_mapga.ga_len;
++    entries[0].from = from;
++    entries[0].to = to;
++}
+ /*
+- * char_u langmap_mapchar[256];
+- * Normally maps each of the 128 upper chars to an <128 ascii char; used to
+- * "translate" native lang chars in normal mode or some cases of
+- * insert mode without having to tediously switch lang mode back&forth.
++ * Apply 'langmap' to multi-byte character "c" and return the result.
+  */
++    int
++langmap_adjust_mb(c)
++    int c;
++{
++    langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data);
++    int a = 0;
++    int b = langmap_mapga.ga_len;
++
++    while (a != b)
++    {
++      int i = (a + b) / 2;
++      int d = entries[i].from - c;
++
++      if (d == 0)
++          return entries[i].to;  /* found matching entry */
++      if (d < 0)
++          a = i + 1;
++      else
++          b = i;
++    }
++    return c;  /* no entry found, return "c" unmodified */
++}
++# endif
+     static void
+ langmap_init()
+ {
+     int i;
+-    for (i = 0; i < 256; i++)         /* we init with a-one-to one map */
+-      langmap_mapchar[i] = i;
++    for (i = 0; i < 256; i++)
++      langmap_mapchar[i] = i;  /* we init with a one-to-one map */
++# ifdef FEAT_MBYTE
++    ga_init2(&langmap_mapga, sizeof(langmap_entry_T), 8);
++# endif
+ }
+ /*
+  * Called when langmap option is set; the language map can be
+  * changed at any time!
+@@ -10123,11 +10388,14 @@ langmap_set()
+ {
+     char_u  *p;
+     char_u  *p2;
+     int           from, to;
+-    langmap_init();                       /* back to one-to-one map first */
++#ifdef FEAT_MBYTE
++    ga_clear(&langmap_mapga);             /* clear the previous map first */
++#endif
++    langmap_init();                       /* back to one-to-one map */
+     for (p = p_langmap; p[0] != NUL; )
+     {
+       for (p2 = p; p2[0] != NUL && p2[0] != ',' && p2[0] != ';';
+                                                              mb_ptr_adv(p2))
+@@ -10173,11 +10441,17 @@ langmap_set()
+           {
+               EMSG2(_("E357: 'langmap': Matching character missing for %s"),
+                                                            transchar(from));
+               return;
+           }
+-          langmap_mapchar[from & 255] = to;
++
++#ifdef FEAT_MBYTE
++          if (from >= 256)
++              langmap_set_entry(from, to);
++          else
++#endif
++              langmap_mapchar[from & 255] = to;
+           /* Advance to next pair */
+           mb_ptr_adv(p);
+           if (p2 == NULL)
+           {
+--- vim72.orig/src/option.h
++++ vim72/src/option.h
+@@ -31,11 +31,11 @@
+ #     define DFLT_EFM "%A%p^,%C%%CC-%t-%m,%Cat line number %l in file %f,%f|%l| %m"
+ #    else /* Unix, probably */
+ #     ifdef EBCDIC
+ #define DFLT_EFM      "%*[^ ] %*[^ ] %f:%l%*[ ]%m,%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m"
+ #     else
+-#define DFLT_EFM      "%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%D%*\\a: Entering directory `%f',%X%*\\a: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m"
++#define DFLT_EFM      "%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%-GIn file included from %f:%l:%c,%-GIn file included from %f:%l,%-Gfrom %f:%l:%c,%-Gfrom %f:%l,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%D%*\\a: Entering directory `%f',%X%*\\a: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m"
+ #     endif
+ #    endif
+ #   endif
+ #  endif
+ # endif
+--- vim72.orig/src/os_mac.h
++++ vim72/src/os_mac.h
+@@ -266,13 +266,19 @@
+  * version with os_unix.x instead of os_mac.c. Based on the result
+  * of ./configure for console MacOS X.
+  */
+ #ifdef MACOS_X_UNIX
+-# define SIGPROTOARG  (int)
+-# define SIGDEFARG(s) (s) int s;
+-# define SIGDUMMYARG  0
++# ifndef SIGPROTOARG
++#  define SIGPROTOARG (int)
++# endif
++# ifndef SIGDEFARG
++#  define SIGDEFARG(s)        (s) int s UNUSED;
++# endif
++# ifndef SIGDUMMYARG
++#  define SIGDUMMYARG 0
++# endif
+ # undef  HAVE_AVAIL_MEM
+ # ifndef HAVE_CONFIG_H
+ #  define RETSIGTYPE void
+ #  define SIGRETURN  return
+ /*# define USE_SYSTEM */  /* Output ship do debugger :(, but ot compile */
+@@ -283,11 +289,10 @@
+ #  define HAVE_SYS_SELECT_H 1
+ #  define HAVE_PUTENV
+ #  define HAVE_SETENV
+ #  define HAVE_RENAME
+ # endif
+-# define mch_chdir(s) chdir(s)
+ #endif
+ #if defined(MACOS_X) && !defined(HAVE_CONFIG_H)
+ # define HAVE_PUTENV
+ #endif
+--- vim72.orig/src/os_msdos.c
++++ vim72/src/os_msdos.c
+@@ -2037,10 +2037,16 @@ mch_has_wildcard(char_u *p)
+     int
+ mch_chdir(char *path)
+ {
+     if (path[0] == NUL)                   /* just checking... */
+       return 0;
++    if (p_verbose >= 5)
++    {
++      verbose_enter();
++      smsg((char_u *)"chdir(%s)", path);
++      verbose_leave();
++    }
+     if (path[1] == ':')                   /* has a drive name */
+     {
+       if (change_drive(TOLOWER_ASC(path[0]) - 'a' + 1))
+           return -1;              /* invalid drive name */
+       path += 2;
+--- vim72.orig/src/os_mswin.c
++++ vim72/src/os_mswin.c
+@@ -307,11 +307,11 @@ mch_settitle(
+     {
+ #  ifdef FEAT_MBYTE
+       if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+       {
+           /* Convert the title from 'encoding' to the active codepage. */
+-          WCHAR       *wp = enc_to_ucs2(title, NULL);
++          WCHAR       *wp = enc_to_utf16(title, NULL);
+           int n;
+           if (wp != NULL)
+           {
+               n = SetConsoleTitleW(wp);
+@@ -404,14 +404,14 @@ mch_FullName(
+           /* Use the wide function:
+            * - convert the fname from 'encoding' to UCS2.
+            * - invoke _wfullpath()
+            * - convert the result from UCS2 to 'encoding'.
+            */
+-          wname = enc_to_ucs2(fname, NULL);
++          wname = enc_to_utf16(fname, NULL);
+           if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH - 1) != NULL)
+           {
+-              cname = ucs2_to_enc((short_u *)wbuf, NULL);
++              cname = utf16_to_enc((short_u *)wbuf, NULL);
+               if (cname != NULL)
+               {
+                   vim_strncpy(buf, cname, len - 1);
+                   nResult = OK;
+               }
+@@ -505,11 +505,11 @@ vim_stat(const char *name, struct stat *
+           /* Wide functions of Borland C 5.5 do not work on Windows 98. */
+           && g_PlatformId == VER_PLATFORM_WIN32_NT
+ # endif
+        )
+     {
+-      WCHAR   *wp = enc_to_ucs2(buf, NULL);
++      WCHAR   *wp = enc_to_utf16(buf, NULL);
+       int     n;
+       if (wp != NULL)
+       {
+           n = _wstat(wp, (struct _stat *)stp);
+@@ -651,10 +651,16 @@ mch_has_wildcard(char_u *p)
+ mch_chdir(char *path)
+ {
+     if (path[0] == NUL)               /* just checking... */
+       return -1;
++    if (p_verbose >= 5)
++    {
++      verbose_enter();
++      smsg((char_u *)"chdir(%s)", path);
++      verbose_leave();
++    }
+     if (isalpha(path[0]) && path[1] == ':')   /* has a drive name */
+     {
+       /* If we can change to the drive, skip that part of the path.  If we
+        * can't then the current directory may be invalid, try using chdir()
+        * with the whole path. */
+@@ -666,11 +672,11 @@ mch_chdir(char *path)
+       return 0;
+ #ifdef FEAT_MBYTE
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+-      WCHAR   *p = enc_to_ucs2(path, NULL);
++      WCHAR   *p = enc_to_utf16(path, NULL);
+       int     n;
+       if (p != NULL)
+       {
+           n = _wchdir(p);
+@@ -889,23 +895,24 @@ mch_libcall(
+ }
+ #endif
+ #if defined(FEAT_MBYTE) || defined(PROTO)
+ /*
+- * Convert an UTF-8 string to UCS-2.
++ * Convert an UTF-8 string to UTF-16.
+  * "instr[inlen]" is the input.  "inlen" is in bytes.
+- * When "outstr" is NULL only return the number of UCS-2 words produced.
++ * When "outstr" is NULL only return the number of UTF-16 words produced.
+  * Otherwise "outstr" must be a buffer of sufficient size.
+- * Returns the number of UCS-2 words produced.
++ * Returns the number of UTF-16 words produced.
+  */
+     int
+-utf8_to_ucs2(char_u *instr, int inlen, short_u *outstr, int *unconvlenp)
++utf8_to_utf16(char_u *instr, int inlen, short_u *outstr, int *unconvlenp)
+ {
+     int               outlen = 0;
+     char_u    *p = instr;
+     int               todo = inlen;
+     int               l;
++    int               ch;
+     while (todo > 0)
+     {
+       /* Only convert if we have a complete sequence. */
+       l = utf_ptr2len_len(p, todo);
+@@ -915,44 +922,68 @@ utf8_to_ucs2(char_u *instr, int inlen, s
+           if (unconvlenp != NULL)
+               *unconvlenp = todo;
+           break;
+       }
+-      if (outstr != NULL)
+-          *outstr++ = utf_ptr2char(p);
++      ch = utf_ptr2char(p);
++      if (ch >= 0x10000)
++      {
++          /* non-BMP character, encoding with surrogate pairs */
++          ++outlen;
++          if (outstr != NULL)
++          {
++              *outstr++ = (0xD800 - (0x10000 >> 10)) + (ch >> 10);
++              *outstr++ = 0xDC00 | (ch & 0x3FF);
++          }
++      }
++      else if (outstr != NULL)
++          *outstr++ = ch;
+       ++outlen;
+       p += l;
+       todo -= l;
+     }
+     return outlen;
+ }
+ /*
+- * Convert an UCS-2 string to UTF-8.
+- * The input is "instr[inlen]" with "inlen" in number of ucs-2 words.
++ * Convert an UTF-16 string to UTF-8.
++ * The input is "instr[inlen]" with "inlen" in number of UTF-16 words.
+  * When "outstr" is NULL only return the required number of bytes.
+  * Otherwise "outstr" must be a buffer of sufficient size.
+  * Return the number of bytes produced.
+  */
+     int
+-ucs2_to_utf8(short_u *instr, int inlen, char_u *outstr)
++utf16_to_utf8(short_u *instr, int inlen, char_u *outstr)
+ {
+     int               outlen = 0;
+     int               todo = inlen;
+     short_u   *p = instr;
+     int               l;
++    int               ch, ch2;
+     while (todo > 0)
+     {
++      ch = *p;
++      if (ch >= 0xD800 && ch <= 0xDBFF && todo > 1)
++      {
++          /* surrogate pairs handling */
++          ch2 = p[1];
++          if (ch2 >= 0xDC00 && ch2 <= 0xDFFF)
++          {
++              ch = ((ch - 0xD800) << 10) + (ch2 & 0x3FF) + 0x10000;
++              ++p;
++              --todo;
++          }
++      }
+       if (outstr != NULL)
+       {
+-          l = utf_char2bytes(*p, outstr);
++          l = utf_char2bytes(ch, outstr);
+           outstr += l;
+       }
+       else
+-          l = utf_char2len(*p);
++          l = utf_char2len(ch);
+       ++p;
+       outlen += l;
+       --todo;
+     }
+@@ -1077,18 +1108,18 @@ crnl_to_nl(const char_u *str, int *size)
+  * Note: the following two functions are only guaranteed to work when using
+  * valid MS-Windows codepages or when iconv() is available.
+  */
+ /*
+- * Convert "str" from 'encoding' to UCS-2.
++ * Convert "str" from 'encoding' to UTF-16.
+  * Input in "str" with length "*lenp".  When "lenp" is NULL, use strlen().
+  * Output is returned as an allocated string.  "*lenp" is set to the length of
+  * the result.  A trailing NUL is always added.
+  * Returns NULL when out of memory.
+  */
+     short_u *
+-enc_to_ucs2(char_u *str, int *lenp)
++enc_to_utf16(char_u *str, int *lenp)
+ {
+     vimconv_T conv;
+     WCHAR     *ret;
+     char_u    *allocbuf = NULL;
+     int               len_loc;
+@@ -1100,11 +1131,11 @@ enc_to_ucs2(char_u *str, int *lenp)
+       lenp = &len_loc;
+     }
+     if (enc_codepage > 0)
+     {
+-      /* We can do any CP### -> UCS-2 in one pass, and we can do it
++      /* We can do any CP### -> UTF-16 in one pass, and we can do it
+        * without iconv() (convert_* may need iconv). */
+       MultiByteToWideChar_alloc(enc_codepage, 0, str, *lenp, &ret, &length);
+     }
+     else
+     {
+@@ -1121,15 +1152,15 @@ enc_to_ucs2(char_u *str, int *lenp)
+           if (str == NULL)
+               return NULL;
+       }
+       convert_setup(&conv, NULL, NULL);
+-      length = utf8_to_ucs2(str, *lenp, NULL, NULL);
++      length = utf8_to_utf16(str, *lenp, NULL, NULL);
+       ret = (WCHAR *)alloc((unsigned)((length + 1) * sizeof(WCHAR)));
+       if (ret != NULL)
+       {
+-          utf8_to_ucs2(str, *lenp, (short_u *)ret, NULL);
++          utf8_to_utf16(str, *lenp, (short_u *)ret, NULL);
+           ret[length] = 0;
+       }
+       vim_free(allocbuf);
+     }
+@@ -1137,19 +1168,19 @@ enc_to_ucs2(char_u *str, int *lenp)
+     *lenp = length;
+     return (short_u *)ret;
+ }
+ /*
+- * Convert an UCS-2 string to 'encoding'.
++ * Convert an UTF-16 string to 'encoding'.
+  * Input in "str" with length (counted in wide characters) "*lenp".  When
+  * "lenp" is NULL, use wcslen().
+  * Output is returned as an allocated string.  If "*lenp" is not NULL it is
+  * set to the length of the result.
+  * Returns NULL when out of memory.
+  */
+     char_u *
+-ucs2_to_enc(short_u *str, int *lenp)
++utf16_to_enc(short_u *str, int *lenp)
+ {
+     vimconv_T conv;
+     char_u    *utf8_str = NULL, *enc_str = NULL;
+     int               len_loc;
+@@ -1159,24 +1190,24 @@ ucs2_to_enc(short_u *str, int *lenp)
+       lenp = &len_loc;
+     }
+     if (enc_codepage > 0)
+     {
+-      /* We can do any UCS-2 -> CP### in one pass. */
++      /* We can do any UTF-16 -> CP### in one pass. */
+       int length;
+       WideCharToMultiByte_alloc(enc_codepage, 0, str, *lenp,
+                                           (LPSTR *)&enc_str, &length, 0, 0);
+       *lenp = length;
+       return enc_str;
+     }
+     /* Avoid allocating zero bytes, it generates an error message. */
+-    utf8_str = alloc(ucs2_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL));
++    utf8_str = alloc(utf16_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL));
+     if (utf8_str != NULL)
+     {
+-      *lenp = ucs2_to_utf8(str, *lenp, utf8_str);
++      *lenp = utf16_to_utf8(str, *lenp, utf8_str);
+       /* We might be called before we have p_enc set up. */
+       conv.vc_type = CONV_NONE;
+       convert_setup(&conv, (char_u *)"utf-8",
+                                           p_enc? p_enc: (char_u *)"latin1");
+@@ -1197,10 +1228,29 @@ ucs2_to_enc(short_u *str, int *lenp)
+     return enc_str;
+ }
+ #endif /* FEAT_MBYTE */
+ /*
++ * Wait for another process to Close the Clipboard.
++ * Returns TRUE for success.
++ */
++    static int
++vim_open_clipboard(void)
++{
++    int delay = 10;
++
++    while (!OpenClipboard(NULL))
++    {
++        if (delay > 500)
++            return FALSE;  /* waited too long, give up */
++        Sleep(delay);
++        delay *= 2;   /* wait for 10, 20, 40, 80, etc. msec */
++    }
++    return TRUE;
++}
++
++/*
+  * Get the current selection and put it in the clipboard register.
+  *
+  * NOTE: Must use GlobalLock/Unlock here to ensure Win32s compatibility.
+  * On NT/W95 the clipboard data is a fixed global memory object and
+  * so its handle = its pointer.
+@@ -1227,11 +1277,11 @@ clip_mch_request_selection(VimClipboard
+     /*
+      * Don't pass GetActiveWindow() as an argument to OpenClipboard() because
+      * then we can't paste back into the same window for some reason - webb.
+      */
+-    if (!OpenClipboard(NULL))
++    if (!vim_open_clipboard())
+       return;
+     /* Check for vim's own clipboard format first.  This only gets the type of
+      * the data, still need to use CF_UNICODETEXT or CF_TEXT for the text. */
+     if (IsClipboardFormatAvailable(cbd->format))
+@@ -1306,11 +1356,11 @@ clip_mch_request_selection(VimClipboard
+           {
+               for (str_size = 0; str_size < maxlen; ++str_size)
+                   if (hMemWstr[str_size] == NUL)
+                       break;
+           }
+-          to_free = str = ucs2_to_enc((short_u *)hMemWstr, &str_size);
++          to_free = str = utf16_to_enc((short_u *)hMemWstr, &str_size);
+           GlobalUnlock(hMemW);
+       }
+     }
+     else
+ #endif
+@@ -1338,11 +1388,11 @@ clip_mch_request_selection(VimClipboard
+                       break;
+           }
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+           /* The text is in the active codepage.  Convert to 'encoding',
+-           * going through UCS-2. */
++           * going through UTF-16. */
+           acp_to_enc(str, str_size, &to_free, &maxlen);
+           if (to_free != NULL)
+           {
+               str_size = maxlen;
+               str = to_free;
+@@ -1402,11 +1452,11 @@ acp_to_enc(str, str_size, out, outlen)
+     MultiByteToWideChar_alloc(GetACP(), 0, str, str_size, &widestr, outlen);
+     if (widestr != NULL)
+     {
+       ++*outlen;      /* Include the 0 after the string */
+-      *out = ucs2_to_enc((short_u *)widestr, outlen);
++      *out = utf16_to_enc((short_u *)widestr, outlen);
+       vim_free(widestr);
+     }
+ }
+ #endif
+@@ -1464,13 +1514,13 @@ clip_mch_set_selection(VimClipboard *cbd
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+     {
+       WCHAR           *out;
+       int             len = metadata.txtlen;
+-      /* Convert the text to UCS-2. This is put on the clipboard as
++      /* Convert the text to UTF-16. This is put on the clipboard as
+        * CF_UNICODETEXT. */
+-      out = (WCHAR *)enc_to_ucs2(str, &len);
++      out = (WCHAR *)enc_to_utf16(str, &len);
+       if (out != NULL)
+       {
+           WCHAR *lpszMemW;
+           /* Convert the text for CF_TEXT to Active codepage. Otherwise it's
+@@ -1486,11 +1536,11 @@ clip_mch_set_selection(VimClipboard *cbd
+               return;         /* out of memory */
+           }
+           WideCharToMultiByte(GetACP(), 0, out, len,
+                                                 str, metadata.txtlen, 0, 0);
+-          /* Allocate memory for the UCS-2 text, add one NUL word to
++          /* Allocate memory for the UTF-16 text, add one NUL word to
+            * terminate the string. */
+           hMemW = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
+                                                  (len + 1) * sizeof(WCHAR));
+           lpszMemW = (WCHAR *)GlobalLock(hMemW);
+           if (lpszMemW != NULL)
+@@ -1535,11 +1585,11 @@ clip_mch_set_selection(VimClipboard *cbd
+      *
+      * Don't pass GetActiveWindow() as an argument to OpenClipboard()
+      * because then we can't paste back into the same window for some
+      * reason - webb.
+      */
+-    if (OpenClipboard(NULL))
++    if (vim_open_clipboard())
+     {
+       if (EmptyClipboard())
+       {
+           SetClipboardData(cbd->format, hMemVim);
+           hMemVim = 0;
+--- vim72.orig/src/os_riscos.c
++++ vim72/src/os_riscos.c
+@@ -1201,10 +1201,16 @@ mch_chdir(dir)
+ {
+     int           length;
+     int           retval;
+     char_u  *new_dir;
++    if (p_verbose >= 5)
++    {
++      verbose_enter();
++      smsg((char_u *)"chdir(%s)", dir);
++      verbose_leave();
++    }
+     length = strlen(dir);
+     if (dir[length - 1] != '.')
+       return chdir(dir);          /* No trailing dots - nothing to do. */
+     new_dir = vim_strsave(dir);
+     if (new_dir == NULL)
+--- vim72.orig/src/os_unix.c
++++ vim72/src/os_unix.c
+@@ -179,11 +179,12 @@ static RETSIGTYPE catch_sigpwr __ARGS(SI
+ #endif
+ #if defined(SIGALRM) && defined(FEAT_X11) \
+       && defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK)
+ # define SET_SIG_ALARM
+ static RETSIGTYPE sig_alarm __ARGS(SIGPROTOARG);
+-static int sig_alarm_called;
++/* volatile because it is used in signal handler sig_alarm(). */
++static volatile int sig_alarm_called;
+ #endif
+ static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG);
+ static void catch_int_signal __ARGS((void));
+ static void set_signals __ARGS((void));
+@@ -199,17 +200,20 @@ static int save_patterns __ARGS((int num
+ #ifndef SIG_ERR
+ # define SIG_ERR      ((RETSIGTYPE (*)())-1)
+ #endif
+-static int    do_resize = FALSE;
++/* volatile because it is used in signal handler sig_winch(). */
++static volatile int do_resize = FALSE;
+ #ifndef __EMX__
+ static char_u *extra_shell_arg = NULL;
+ static int    show_shell_mess = TRUE;
+ #endif
+-static int    deadly_signal = 0;          /* The signal we caught */
+-static int    in_mch_delay = FALSE;       /* sleeping in mch_delay() */
++/* volatile because it is used in signal handler deathtrap(). */
++static volatile int deadly_signal = 0;            /* The signal we caught */
++/* volatile because it is used in signal handler deathtrap(). */
++static volatile int in_mch_delay = FALSE;    /* sleeping in mch_delay() */
+ static int curr_tmode = TMODE_COOK;   /* contains current terminal mode */
+ #ifdef USE_XSMP
+ typedef struct
+@@ -313,16 +317,36 @@ static struct signalinfo
+     {SIGPIPE,     "PIPE",     FALSE},
+ #endif
+     {-1,          "Unknown!", FALSE}
+ };
++    int
++mch_chdir(path)
++    char *path;
++{
++    if (p_verbose >= 5)
++    {
++      verbose_enter();
++      smsg((char_u *)"chdir(%s)", path);
++      verbose_leave();
++    }
++# ifdef VMS
++    return chdir(vms_fixfilename(path));
++# else
++    return chdir(path);
++# endif
++}
++
++/*
++ * Write s[len] to the screen.
++ */
+     void
+ mch_write(s, len)
+     char_u    *s;
+     int               len;
+ {
+-    write(1, (char *)s, len);
++    ignored = (int)write(1, (char *)s, len);
+     if (p_wd)         /* Unix is too fast, slow down a bit more */
+       RealWaitForChar(read_cmd_fd, p_wd, NULL);
+ }
+ /*
+@@ -445,14 +469,13 @@ mch_char_avail()
+ /*
+  * Return total amount of memory available in Kbyte.
+  * Doesn't change when memory has been allocated.
+  */
+-/* ARGSUSED */
+     long_u
+ mch_total_mem(special)
+-    int special;
++    int special UNUSED;
+ {
+ # ifdef __EMX__
+     return ulimit(3, 0L) >> 10;   /* always 32MB? */
+ # else
+     long_u    mem = 0;
+@@ -797,16 +820,15 @@ init_signal_stack()
+     }
+ }
+ #endif
+ /*
+- * We need correct potatotypes for a signal function, otherwise mean compilers
++ * We need correct prototypes for a signal function, otherwise mean compilers
+  * will barf when the second argument to signal() is ``wrong''.
+  * Let me try it with a few tricky defines from my own osdef.h        (jw).
+  */
+ #if defined(SIGWINCH)
+-/* ARGSUSED */
+     static RETSIGTYPE
+ sig_winch SIGDEFARG(sigarg)
+ {
+     /* this is not required on all systems, but it doesn't hurt anybody */
+     signal(SIGWINCH, (RETSIGTYPE (*)())sig_winch);
+@@ -814,11 +836,10 @@ sig_winch SIGDEFARG(sigarg)
+     SIGRETURN;
+ }
+ #endif
+ #if defined(SIGINT)
+-/* ARGSUSED */
+     static RETSIGTYPE
+ catch_sigint SIGDEFARG(sigarg)
+ {
+     /* this is not required on all systems, but it doesn't hurt anybody */
+     signal(SIGINT, (RETSIGTYPE (*)())catch_sigint);
+@@ -826,11 +847,10 @@ catch_sigint SIGDEFARG(sigarg)
+     SIGRETURN;
+ }
+ #endif
+ #if defined(SIGPWR)
+-/* ARGSUSED */
+     static RETSIGTYPE
+ catch_sigpwr SIGDEFARG(sigarg)
+ {
+     /* this is not required on all systems, but it doesn't hurt anybody */
+     signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr);
+@@ -846,11 +866,10 @@ catch_sigpwr SIGDEFARG(sigarg)
+ #ifdef SET_SIG_ALARM
+ /*
+  * signal function for alarm().
+  */
+-/* ARGSUSED */
+     static RETSIGTYPE
+ sig_alarm SIGDEFARG(sigarg)
+ {
+     /* doesn't do anything, just to break a system call */
+     sig_alarm_called = TRUE;
+@@ -1063,23 +1082,27 @@ deathtrap SIGDEFARG(sigarg)
+ #endif
+     SIGRETURN;
+ }
+-#ifdef _REENTRANT
++#if defined(_REENTRANT) && defined(SIGCONT)
+ /*
+  * On Solaris with multi-threading, suspending might not work immediately.
+  * Catch the SIGCONT signal, which will be used as an indication whether the
+  * suspending has been done or not.
++ *
++ * On Linux, signal is not always handled immediately either.
++ * See https://bugs.launchpad.net/bugs/291373
++ *
++ * volatile because it is used in in signal handler sigcont_handler().
+  */
+-static int sigcont_received;
++static volatile int sigcont_received;
+ static RETSIGTYPE sigcont_handler __ARGS(SIGPROTOARG);
+ /*
+  * signal handler for SIGCONT
+  */
+-/* ARGSUSED */
+     static RETSIGTYPE
+ sigcont_handler SIGDEFARG(sigarg)
+ {
+     sigcont_received = TRUE;
+     SIGRETURN;
+@@ -1113,19 +1136,32 @@ mch_suspend()
+       if (x11_display != NULL)
+           XFlush(x11_display);
+     }
+ # endif
+-# ifdef _REENTRANT
++# if defined(_REENTRANT) && defined(SIGCONT)
+     sigcont_received = FALSE;
+ # endif
+     kill(0, SIGTSTP);     /* send ourselves a STOP signal */
+-# ifdef _REENTRANT
+-    /* When we didn't suspend immediately in the kill(), do it now.  Happens
+-     * on multi-threaded Solaris. */
+-    if (!sigcont_received)
+-      pause();
++# if defined(_REENTRANT) && defined(SIGCONT)
++    /*
++     * Wait for the SIGCONT signal to be handled. It generally happens
++     * immediately, but somehow not all the time. Do not call pause()
++     * because there would be race condition which would hang Vim if
++     * signal happened in between the test of sigcont_received and the
++     * call to pause(). If signal is not yet received, call sleep(0)
++     * to just yield CPU. Signal should then be received. If somehow
++     * it's still not received, sleep 1, 2, 3 ms. Don't bother waiting
++     * further if signal is not received after 1+2+3+4 ms (not expected
++     * to happen).
++     */
++    {
++      long wait_time;
++      for (wait_time = 0; !sigcont_received && wait_time <= 3L; wait_time++)
++          /* Loop is not entered most of the time */
++          mch_delay(wait_time, FALSE);
++    }
+ # endif
+ # ifdef FEAT_TITLE
+     /*
+      * Set oldtitle to NULL, so the current title is obtained again.
+@@ -1170,11 +1206,11 @@ set_signals()
+      * For "rvim" the STOP signal is ignored.
+      */
+ #ifdef SIGTSTP
+     signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
+ #endif
+-#ifdef _REENTRANT
++#if defined(_REENTRANT) && defined(SIGCONT)
+     signal(SIGCONT, sigcont_handler);
+ #endif
+     /*
+      * We want to ignore breaking of PIPEs.
+@@ -1229,11 +1265,11 @@ catch_int_signal()
+     void
+ reset_signals()
+ {
+     catch_signals(SIG_DFL, SIG_DFL);
+-#ifdef _REENTRANT
++#if defined(_REENTRANT) && defined(SIGCONT)
+     /* SIGCONT isn't in the list, because its default action is ignore */
+     signal(SIGCONT, SIG_DFL);
+ #endif
+ }
+@@ -1324,15 +1360,14 @@ vim_handle_signal(sig)
+ }
+ /*
+  * Check_win checks whether we have an interactive stdout.
+  */
+-/* ARGSUSED */
+     int
+ mch_check_win(argc, argv)
+-    int           argc;
+-    char    **argv;
++    int           argc UNUSED;
++    char    **argv UNUSED;
+ {
+ #ifdef OS2
+     /*
+      * Store argv[0], may be used for $VIM.  Only use it if it is an absolute
+      * name, mostly it's just "vim" and found in the path, which is unusable.
+@@ -1412,15 +1447,14 @@ x_error_handler(dpy, error_event)
+ }
+ /*
+  * Another X Error handler, just used to check for errors.
+  */
+-/* ARGSUSED */
+     static int
+ x_error_check(dpy, error_event)
+-    Display *dpy;
+-    XErrorEvent       *error_event;
++    Display *dpy UNUSED;
++    XErrorEvent       *error_event UNUSED;
+ {
+     got_x_error = TRUE;
+     return 0;
+ }
+@@ -1429,41 +1463,41 @@ x_error_check(dpy, error_event)
+ /*
+  * An X IO Error handler, used to catch error while opening the display.
+  */
+ static int x_IOerror_check __ARGS((Display *dpy));
+-/* ARGSUSED */
+     static int
+ x_IOerror_check(dpy)
+-    Display *dpy;
++    Display *dpy UNUSED;
+ {
+     /* This function should not return, it causes exit().  Longjump instead. */
+     LONGJMP(lc_jump_env, 1);
+-    /*NOTREACHED*/
+-    return 0;
++#  ifdef VMS
++    return 0;  /* avoid the compiler complains about missing return value */
++#  endif
+ }
+ # endif
+ /*
+  * An X IO Error handler, used to catch terminal errors.
+  */
+ static int x_IOerror_handler __ARGS((Display *dpy));
+-/* ARGSUSED */
+     static int
+ x_IOerror_handler(dpy)
+-    Display *dpy;
++    Display *dpy UNUSED;
+ {
+     xterm_dpy = NULL;
+     x11_window = 0;
+     x11_display = NULL;
+     xterm_Shell = (Widget)0;
+     /* This function should not return, it causes exit().  Longjump instead. */
+     LONGJMP(x_jump_env, 1);
+-    /*NOTREACHED*/
+-    return 0;
++# ifdef VMS
++    return 0;  /* avoid the compiler complains about missing return value */
++# endif
+ }
+ #endif
+ /*
+  * Return TRUE when connection to the X server is desired.
+@@ -1704,13 +1738,13 @@ get_x11_icon(test_only)
+     /* could not get old icon, use terminal name */
+     if (oldicon == NULL && !test_only)
+     {
+       if (STRNCMP(T_NAME, "builtin_", 8) == 0)
+-          oldicon = T_NAME + 8;
++          oldicon = vim_strsave(T_NAME + 8);
+       else
+-          oldicon = T_NAME;
++          oldicon = vim_strsave(T_NAME);
+     }
+     return retval;
+ }
+@@ -1895,14 +1929,13 @@ set_x11_icon(icon)
+     XFlush(x11_display);
+ }
+ #else  /* FEAT_X11 */
+-/*ARGSUSED*/
+     static int
+ get_x11_title(test_only)
+-    int           test_only;
++    int           test_only UNUSED;
+ {
+     return FALSE;
+ }
+     static int
+@@ -1910,13 +1943,13 @@ get_x11_icon(test_only)
+     int           test_only;
+ {
+     if (!test_only)
+     {
+       if (STRNCMP(T_NAME, "builtin_", 8) == 0)
+-          oldicon = T_NAME + 8;
++          oldicon = vim_strsave(T_NAME + 8);
+       else
+-          oldicon = T_NAME;
++          oldicon = vim_strsave(T_NAME);
+     }
+     return FALSE;
+ }
+ #endif /* FEAT_X11 */
+@@ -2412,10 +2445,16 @@ mch_FullName(fname, buf, len, force)
+       if (p != NULL)
+       {
+ #ifdef HAVE_FCHDIR
+           if (fd >= 0)
+           {
++              if (p_verbose >= 5)
++              {
++                  verbose_enter();
++                  MSG("fchdir() to previous dir");
++                  verbose_leave();
++              }
+               l = fchdir(fd);
+               close(fd);
+           }
+           else
+ #endif
+@@ -2436,11 +2475,11 @@ mch_FullName(fname, buf, len, force)
+       }
+ #endif
+     }
+     /* Catch file names which are too long. */
+-    if (retval == FAIL || STRLEN(buf) + STRLEN(fname) >= len)
++    if (retval == FAIL || (int)(STRLEN(buf) + STRLEN(fname)) >= len)
+       return FAIL;
+     /* Do not append ".", "/dir/." is equal to "/dir". */
+     if (STRCMP(fname, ".") != 0)
+       STRCAT(buf, fname);
+@@ -2473,15 +2512,14 @@ mch_isFullName(fname)
+ /*
+  * Set the case of the file name, if it already exists.  This will cause the
+  * file name to remain exactly the same.
+  * Only required for file systems where case is ignored and preserved.
+  */
+-/*ARGSUSED*/
+     void
+ fname_case(name, len)
+     char_u    *name;
+-    int               len;        /* buffer size, only used when name gets longer */
++    int               len UNUSED;  /* buffer size, only used when name gets longer */
+ {
+     struct stat st;
+     char_u    *slash, *tail;
+     DIR               *dirp;
+     struct dirent *dp;
+@@ -2655,11 +2693,11 @@ mch_copy_sec(from_file, to_file)
+  * Return a pointer to the ACL of file "fname" in allocated memory.
+  * Return NULL if the ACL is not available for whatever reason.
+  */
+     vim_acl_T
+ mch_get_acl(fname)
+-    char_u    *fname;
++    char_u    *fname UNUSED;
+ {
+     vim_acl_T ret = NULL;
+ #ifdef HAVE_POSIX_ACL
+     ret = (vim_acl_T)acl_get_file((char *)fname, ACL_TYPE_ACCESS);
+ #else
+@@ -2715,11 +2753,11 @@ mch_get_acl(fname)
+ /*
+  * Set the ACL of file "fname" to "acl" (unless it's NULL).
+  */
+     void
+ mch_set_acl(fname, aclent)
+-    char_u    *fname;
++    char_u    *fname UNUSED;
+     vim_acl_T aclent;
+ {
+     if (aclent == NULL)
+       return;
+ #ifdef HAVE_POSIX_ACL
+@@ -2758,14 +2796,13 @@ mch_free_acl(aclent)
+ #endif
+ /*
+  * Set hidden flag for "name".
+  */
+-/* ARGSUSED */
+     void
+ mch_hide(name)
+-    char_u    *name;
++    char_u    *name UNUSED;
+ {
+     /* can't hide a file */
+ }
+ /*
+@@ -2903,11 +2940,11 @@ mch_early_init()
+      * running out of stack space.
+      * Use of sigaltstack() is preferred, it's more portable.
+      * Ignore any errors.
+      */
+ #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
+-    signal_stack = malloc(SIGSTKSZ);
++    signal_stack = (char *)alloc(SIGSTKSZ);
+     init_signal_stack();
+ #endif
+ }
+ #if defined(EXITFREE) || defined(PROTO)
+@@ -2934,11 +2971,12 @@ mch_free_mem()
+       x11_display = NULL; /* freed by XtDestroyApplicationContext() */
+ #   endif
+     }
+ #  endif
+ # endif
+-# ifdef FEAT_X11
++    /* Don't close the display for GTK 1, it is done in exit(). */
++# if defined(FEAT_X11) && (!defined(FEAT_GUI_GTK) || defined(HAVE_GTK2))
+     if (x11_display != NULL
+ #  ifdef FEAT_XCLIPBOARD
+           && x11_display != xterm_dpy
+ #  endif
+           )
+@@ -3449,14 +3487,13 @@ check_mouse_termcode()
+ #endif
+ /*
+  * set screen mode, always fails.
+  */
+-/* ARGSUSED */
+     int
+ mch_screenmode(arg)
+-    char_u   *arg;
++    char_u   *arg UNUSED;
+ {
+     EMSG(_(e_screenmode));
+     return FAIL;
+ }
+@@ -3924,13 +3961,13 @@ mch_call_shell(cmd, options)
+                * or dup() failed we'd just do the same thing ourselves
+                * anyway -- webb
+                */
+               if (fd >= 0)
+               {
+-                  dup(fd); /* To replace stdin  (file descriptor 0) */
+-                  dup(fd); /* To replace stdout (file descriptor 1) */
+-                  dup(fd); /* To replace stderr (file descriptor 2) */
++                  ignored = dup(fd); /* To replace stdin  (fd 0) */
++                  ignored = dup(fd); /* To replace stdout (fd 1) */
++                  ignored = dup(fd); /* To replace stderr (fd 2) */
+                   /* Don't need this now that we've duplicated it */
+                   close(fd);
+               }
+           }
+@@ -3944,11 +3981,21 @@ mch_call_shell(cmd, options)
+ # ifdef HAVE_SETSID
+               /* Create our own process group, so that the child and all its
+                * children can be kill()ed.  Don't do this when using pipes,
+                * because stdin is not a tty, we would lose /dev/tty. */
+               if (p_stmp)
++              {
+                   (void)setsid();
++#  if defined(SIGHUP)
++                  /* When doing "!xterm&" and 'shell' is bash: the shell
++                   * will exit and send SIGHUP to all processes in its
++                   * group, killing the just started process.  Ignore SIGHUP
++                   * to avoid that. (suggested by Simon Schubert)
++                   */
++                  signal(SIGHUP, SIG_IGN);
++#  endif
++              }
+ # endif
+ # ifdef FEAT_GUI
+               if (pty_slave_fd >= 0)
+               {
+                   /* push stream discipline modules */
+@@ -3994,42 +4041,42 @@ mch_call_shell(cmd, options)
+               {
+                   close(pty_master_fd);   /* close master side of pty */
+                   /* set up stdin/stdout/stderr for the child */
+                   close(0);
+-                  dup(pty_slave_fd);
++                  ignored = dup(pty_slave_fd);
+                   close(1);
+-                  dup(pty_slave_fd);
++                  ignored = dup(pty_slave_fd);
+                   if (gui.in_use)
+                   {
+                       close(2);
+-                      dup(pty_slave_fd);
++                      ignored = dup(pty_slave_fd);
+                   }
+                   close(pty_slave_fd);    /* has been dupped, close it now */
+               }
+               else
+ # endif
+               {
+                   /* set up stdin for the child */
+                   close(fd_toshell[1]);
+                   close(0);
+-                  dup(fd_toshell[0]);
++                  ignored = dup(fd_toshell[0]);
+                   close(fd_toshell[0]);
+                   /* set up stdout for the child */
+                   close(fd_fromshell[0]);
+                   close(1);
+-                  dup(fd_fromshell[1]);
++                  ignored = dup(fd_fromshell[1]);
+                   close(fd_fromshell[1]);
+ # ifdef FEAT_GUI
+                   if (gui.in_use)
+                   {
+                       /* set up stderr for the child */
+                       close(2);
+-                      dup(1);
++                      ignored = dup(1);
+                   }
+ # endif
+               }
+           }
+@@ -4076,10 +4123,13 @@ mch_call_shell(cmd, options)
+               int         c;
+               int         toshell_fd;
+               int         fromshell_fd;
+               garray_T    ga;
+               int         noread_cnt;
++# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
++              struct timeval  start_tv;
++# endif
+ # ifdef FEAT_GUI
+               if (pty_master_fd >= 0)
+               {
+                   close(pty_slave_fd);        /* close slave side of pty */
+@@ -4144,23 +4194,25 @@ mch_call_shell(cmd, options)
+                               len = write(toshell_fd, "", (size_t)1);
+                           else
+                           {
+                               s = vim_strchr(lp + written, NL);
+                               len = write(toshell_fd, (char *)lp + written,
+-                                         s == NULL ? l : s - (lp + written));
++                                         s == NULL ? l
++                                            : (size_t)(s - (lp + written)));
+                           }
+-                          if (len == l)
++                          if (len == (int)l)
+                           {
+                               /* Finished a line, add a NL, unless this line
+                                * should not have one. */
+                               if (lnum != curbuf->b_op_end.lnum
+                                       || !curbuf->b_p_bin
+                                       || (lnum != write_no_eol_lnum
+                                           && (lnum !=
+                                                   curbuf->b_ml.ml_line_count
+                                                   || curbuf->b_p_eol)))
+-                                  write(toshell_fd, "\n", (size_t)1);
++                                  ignored = write(toshell_fd, "\n",
++                                                                 (size_t)1);
+                               ++lnum;
+                               if (lnum > curbuf->b_op_end.lnum)
+                               {
+                                   /* finished all the lines, close pipe */
+                                   close(toshell_fd);
+@@ -4184,11 +4236,13 @@ mch_call_shell(cmd, options)
+               if (options & SHELL_READ)
+                   ga_init2(&ga, 1, BUFLEN);
+               noread_cnt = 0;
+-
++# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
++              gettimeofday(&start_tv, NULL);
++# endif
+               for (;;)
+               {
+                   /*
+                    * Check if keys have been typed, write them to the child
+                    * if there are any.
+@@ -4197,29 +4251,38 @@ mch_call_shell(cmd, options)
+                    * Don't do this when filtering and terminal is in cooked
+                    * mode, the shell command will handle the I/O.  Avoids
+                    * that a typed password is echoed for ssh or gpg command.
+                    * Don't get characters when the child has already
+                    * finished (wait_pid == 0).
+-                   * Don't get extra characters when we already have one.
+                    * Don't read characters unless we didn't get output for a
+-                   * while, avoids that ":r !ls" eats typeahead.
++                   * while (noread_cnt > 4), avoids that ":r !ls" eats
++                   * typeahead.
+                    */
+                   len = 0;
+                   if (!(options & SHELL_EXPAND)
+                           && ((options &
+                                        (SHELL_READ|SHELL_WRITE|SHELL_COOKED))
+                                     != (SHELL_READ|SHELL_WRITE|SHELL_COOKED)
+-#ifdef FEAT_GUI
++# ifdef FEAT_GUI
+                                                   || gui.in_use
+-#endif
++# endif
+                                                   )
+                           && wait_pid == 0
+-                          && (ta_len > 0
+-                              || (noread_cnt > 4
+-                                  && (len = ui_inchar(ta_buf,
+-                                                     BUFLEN, 10L, 0)) > 0)))
++                          && (ta_len > 0 || noread_cnt > 4))
+                   {
++                    if (ta_len == 0)
++                    {
++                        /* Get extra characters when we don't have any.
++                         * Reset the counter and timer. */
++                        noread_cnt = 0;
++# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
++                        gettimeofday(&start_tv, NULL);
++# endif
++                        len = ui_inchar(ta_buf, BUFLEN, 10L, 0);
++                    }
++                    if (ta_len > 0 || len > 0)
++                    {
+                       /*
+                        * For pipes:
+                        * Check for CTRL-C: send interrupt signal to child.
+                        * Check for CTRL-D: EOF, close pipe to child.
+                        */
+@@ -4269,11 +4332,12 @@ mch_call_shell(cmd, options)
+                           }
+                           else if (ta_buf[i] == '\r')
+                               ta_buf[i] = '\n';
+ # ifdef FEAT_MBYTE
+                           if (has_mbyte)
+-                              i += (*mb_ptr2len)(ta_buf + i) - 1;
++                              i += (*mb_ptr2len_len)(ta_buf + i,
++                                                      ta_len + len - i) - 1;
+ # endif
+                       }
+                       /*
+                        * For pipes: echo the typed characters.
+@@ -4317,13 +4381,13 @@ mch_call_shell(cmd, options)
+                           len = write(toshell_fd, (char *)ta_buf, (size_t)1);
+                           if (len > 0)
+                           {
+                               ta_len -= len;
+                               mch_memmove(ta_buf, ta_buf + len, ta_len);
+-                              noread_cnt = 0;
+                           }
+                       }
++                    }
+                   }
+                   if (got_int)
+                   {
+                       /* CTRL-C sends a signal to the child, we ignore it
+@@ -4427,10 +4491,29 @@ mch_call_shell(cmd, options)
+                       windgoto(msg_row, msg_col);
+                       cursor_on();
+                       out_flush();
+                       if (got_int)
+                           break;
++
++# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
++                      {
++                          struct timeval  now_tv;
++                          long            msec;
++
++                          /* Avoid that we keep looping here without
++                           * checking for a CTRL-C for a long time.  Don't
++                           * break out too often to avoid losing typeahead. */
++                          gettimeofday(&now_tv, NULL);
++                          msec = (now_tv.tv_sec - start_tv.tv_sec) * 1000L
++                              + (now_tv.tv_usec - start_tv.tv_usec) / 1000L;
++                          if (msec > 2000)
++                          {
++                              noread_cnt = 5;
++                              break;
++                          }
++                      }
++# endif
+                   }
+                   /* If we already detected the child has finished break the
+                    * loop now. */
+                   if (wait_pid == pid)
+@@ -4670,20 +4753,19 @@ WaitForChar(msec)
+  * Time == -1 will block forever.
+  * When a GUI is being used, this will not be used for input -- webb
+  * Returns also, when a request from Sniff is waiting -- toni.
+  * Or when a Linux GPM mouse event is waiting.
+  */
+-/* ARGSUSED */
+ #if defined(__BEOS__)
+     int
+ #else
+     static  int
+ #endif
+ RealWaitForChar(fd, msec, check_for_gpm)
+     int               fd;
+     long      msec;
+-    int               *check_for_gpm;
++    int               *check_for_gpm UNUSED;
+ {
+     int               ret;
+ #if defined(FEAT_XCLIPBOARD) || defined(USE_XSMP) || defined(FEAT_MZSCHEME)
+     static int        busy = FALSE;
+@@ -5074,11 +5156,10 @@ mch_expandpath(gap, path, flags)
+ # define SEEK_END 2
+ #endif
+ #define SHELL_SPECIAL (char_u *)"\t \"&'$;<>()\\|"
+-/* ARGSUSED */
+     int
+ mch_expand_wildcards(num_pat, pat, num_file, file, flags)
+     int                  num_pat;
+     char_u     **pat;
+     int                 *num_file;
+@@ -5496,11 +5577,11 @@ mch_expand_wildcards(num_pat, pat, num_f
+       return FAIL;
+     }
+     i = fread((char *)buffer, 1, len, fd);
+     fclose(fd);
+     mch_remove(tempname);
+-    if (i != len)
++    if (i != (int)len)
+     {
+       /* unexpected read error */
+       EMSG2(_(e_notread), tempname);
+       vim_free(tempname);
+       vim_free(buffer);
+@@ -5557,11 +5638,11 @@ mch_expand_wildcards(num_pat, pat, num_f
+        */
+       check_spaces = FALSE;
+       if (shell_style == STYLE_PRINT && !did_find_nul)
+       {
+           /* If there is a NUL, set did_find_nul, else set check_spaces */
+-          if (len && (int)STRLEN(buffer) < len - 1)
++          if (len && (int)STRLEN(buffer) < (int)len - 1)
+               did_find_nul = TRUE;
+           else
+               check_spaces = TRUE;
+       }
+@@ -5849,11 +5930,13 @@ gpm_open()
+           /* gpm library tries to handling TSTP causes
+            * problems. Anyways, we close connection to Gpm whenever
+            * we are going to suspend or starting an external process
+            * so we shouldn't  have problem with this
+            */
++# ifdef SIGTSTP
+           signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
++# endif
+           return 1; /* succeed */
+       }
+       if (gpm_fd == -2)
+           Gpm_Close(); /* We don't want to talk to xterm via gpm */
+       return 0;
+@@ -5999,11 +6082,10 @@ sysmouse_close()
+ }
+ /*
+  * Gets info from sysmouse and adds special keys to input buf.
+  */
+-/* ARGSUSED */
+     static RETSIGTYPE
+ sig_sysmouse SIGDEFARG(sigarg)
+ {
+     struct mouse_info mouse;
+     struct video_info video;
+@@ -6563,15 +6645,14 @@ static void xsmp_handle_interaction __AR
+ /*
+  * This is our chance to ask the user if they want to save,
+  * or abort the logout
+  */
+-/*ARGSUSED*/
+     static void
+ xsmp_handle_interaction(smc_conn, client_data)
+     SmcConn   smc_conn;
+-    SmPointer client_data;
++    SmPointer client_data UNUSED;
+ {
+     cmdmod_T  save_cmdmod;
+     int               cancel_shutdown = False;
+     save_cmdmod = cmdmod;
+@@ -6600,20 +6681,19 @@ xsmp_handle_interaction(smc_conn, client
+ # endif
+ /*
+  * Callback that starts save-yourself.
+  */
+-/*ARGSUSED*/
+     static void
+ xsmp_handle_save_yourself(smc_conn, client_data, save_type,
+                                              shutdown, interact_style, fast)
+     SmcConn   smc_conn;
+-    SmPointer client_data;
+-    int               save_type;
++    SmPointer client_data UNUSED;
++    int               save_type UNUSED;
+     Bool      shutdown;
+-    int               interact_style;
+-    Bool      fast;
++    int               interact_style UNUSED;
++    Bool      fast UNUSED;
+ {
+     /* Handle already being in saveyourself */
+     if (xsmp.save_yourself)
+       SmcSaveYourselfDone(smc_conn, True);
+     xsmp.save_yourself = True;
+@@ -6643,15 +6723,14 @@ xsmp_handle_save_yourself(smc_conn, clie
+ /*
+  * Callback to warn us of imminent death.
+  */
+-/*ARGSUSED*/
+     static void
+ xsmp_die(smc_conn, client_data)
+-    SmcConn   smc_conn;
+-    SmPointer client_data;
++    SmcConn   smc_conn UNUSED;
++    SmPointer client_data UNUSED;
+ {
+     xsmp_close();
+     /* quit quickly leaving swapfiles for modified buffers behind */
+     getout_preserve_modified(0);
+@@ -6659,29 +6738,27 @@ xsmp_die(smc_conn, client_data)
+ /*
+  * Callback to tell us that save-yourself has completed.
+  */
+-/*ARGSUSED*/
+     static void
+ xsmp_save_complete(smc_conn, client_data)
+-    SmcConn   smc_conn;
+-    SmPointer client_data;
++    SmcConn   smc_conn UNUSED;
++    SmPointer client_data UNUSED;
+ {
+     xsmp.save_yourself = False;
+ }
+ /*
+  * Callback to tell us that an instigated shutdown was cancelled
+  * (maybe even by us)
+  */
+-/*ARGSUSED*/
+     static void
+ xsmp_shutdown_cancelled(smc_conn, client_data)
+     SmcConn   smc_conn;
+-    SmPointer client_data;
++    SmPointer client_data UNUSED;
+ {
+     if (xsmp.save_yourself)
+       SmcSaveYourselfDone(smc_conn, True);
+     xsmp.save_yourself = False;
+     xsmp.shutdown = False;
+@@ -6689,17 +6766,16 @@ xsmp_shutdown_cancelled(smc_conn, client
+ /*
+  * Callback to tell us that a new ICE connection has been established.
+  */
+-/*ARGSUSED*/
+     static void
+ xsmp_ice_connection(iceConn, clientData, opening, watchData)
+     IceConn   iceConn;
+-    IcePointer        clientData;
++    IcePointer        clientData UNUSED;
+     Bool      opening;
+-    IcePointer        *watchData;
++    IcePointer        *watchData UNUSED;
+ {
+     /* Intercept creation of ICE connection fd */
+     if (opening)
+     {
+       xsmp_icefd = IceConnectionNumber(iceConn);
+@@ -6812,11 +6888,12 @@ xsmp_init(void)
+ xsmp_close()
+ {
+     if (xsmp_icefd != -1)
+     {
+       SmcCloseConnection(xsmp.smcconn, 0, NULL);
+-      vim_free(xsmp.clientid);
++      if (xsmp.clientid != NULL)
++          free(xsmp.clientid);
+       xsmp.clientid = NULL;
+       xsmp_icefd = -1;
+     }
+ }
+ #endif /* USE_XSMP */
+--- vim72.orig/src/os_unix.h
++++ vim72/src/os_unix.h
+@@ -122,11 +122,11 @@
+ #  define SIGPROTOARG (int, int, struct sigcontext *)
+ #  define SIGDEFARG(s)        (s, sig2, scont) int s, sig2; struct sigcontext *scont;
+ #  define SIGDUMMYARG 0, 0, (struct sigcontext *)0
+ # else
+ #  define SIGPROTOARG (int)
+-#  define SIGDEFARG(s)        (s) int s;
++#  define SIGDEFARG(s)        (s) int s UNUSED;
+ #  define SIGDUMMYARG 0
+ # endif
+ #else
+ # define SIGPROTOARG   (void)
+ # define SIGDEFARG(s)  ()
+@@ -480,15 +480,10 @@ typedef struct dsc$descriptor   DESC;
+ # ifdef HAVE_RENAME
+ #  define mch_rename(src, dst) rename(src, dst)
+ # else
+ int mch_rename __ARGS((const char *src, const char *dest));
+ # endif
+-# ifdef VMS
+-#  define mch_chdir(s) chdir(vms_fixfilename(s))
+-# else
+-#  define mch_chdir(s) chdir(s)
+-# endif
+ # ifndef VMS
+ #  ifdef __MVS__
+   /* on OS390 Unix getenv() doesn't return a pointer to persistent
+    * storage -> use __getenv() */
+ #   define mch_getenv(x) (char_u *)__getenv((char *)(x))
+--- vim72.orig/src/os_unixx.h
++++ vim72/src/os_unixx.h
+@@ -26,15 +26,10 @@
+ # if defined(HAVE_SYS_WAIT_H) || defined(HAVE_UNION_WAIT)
+ #  include <sys/wait.h>
+ # endif
+-# if defined(HAVE_SYS_SELECT_H) && \
+-      (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME))
+-#  include <sys/select.h>
+-# endif
+-
+ # ifndef WEXITSTATUS
+ #  ifdef HAVE_UNION_WAIT
+ #   define WEXITSTATUS(stat_val) ((stat_val).w_T.w_Retcode)
+ #  else
+ #   define WEXITSTATUS(stat_val) (((stat_val) >> 8) & 0377)
+@@ -63,20 +58,10 @@
+ #ifdef HAVE_STRING_H
+ # include <string.h>
+ #endif
+-#ifndef HAVE_SELECT
+-# ifdef HAVE_SYS_POLL_H
+-#  include <sys/poll.h>
+-# else
+-#  ifdef HAVE_POLL_H
+-#   include <poll.h>
+-#  endif
+-# endif
+-#endif
+-
+ #ifdef HAVE_SYS_STREAM_H
+ # include <sys/stream.h>
+ #endif
+ #ifdef HAVE_SYS_UTSNAME_H
+--- vim72.orig/src/os_vms.c
++++ vim72/src/os_vms.c
+@@ -226,11 +226,11 @@ mch_getenv(char_u *lognam)
+       return(cp);
+     }
+     else if ((sbuf = getenv((char *)lognam)))
+     {
+       lengte = strlen(sbuf) + 1;
+-      cp = (char_u *)malloc((size_t)lengte);
++      cp = (char_u *)alloc((size_t)lengte);
+       if (cp)
+           strcpy((char *)cp, sbuf);
+       return cp;
+     }
+     else
+@@ -379,11 +379,11 @@ vms_wproc(char *name, int val)
+           return 1;
+     }
+     if (--vms_match_free == 0) {
+       /* add more space to store matches */
+       vms_match_alloced += EXPL_ALLOC_INC;
+-      vms_fmatch = (char_u **)realloc(vms_fmatch,
++      vms_fmatch = (char_u **)vim_realloc(vms_fmatch,
+               sizeof(char **) * vms_match_alloced);
+       if (!vms_fmatch)
+           return 0;
+       vms_match_free = EXPL_ALLOC_INC;
+     }
+@@ -458,11 +458,11 @@ mch_expand_wildcards(int num_pat, char_u
+           /* allocate memory for pointers */
+           if (--files_free < 1)
+           {
+               files_alloced += EXPL_ALLOC_INC;
+-              *file = (char_u **)realloc(*file,
++              *file = (char_u **)vim_realloc(*file,
+                   sizeof(char_u **) * files_alloced);
+               if (*file == NULL)
+               {
+                   *file = (char_u **)"";
+                   *num_file = 0;
+@@ -612,18 +612,18 @@ vms_fixfilename(void *instring)
+     len = strlen(instring) + 1;
+     if (len > buflen)
+     {
+       buflen = len + 128;
+       if (buf)
+-          buf = (char *)realloc(buf, buflen);
++          buf = (char *)vim_realloc(buf, buflen);
+       else
+-          buf = (char *)calloc(buflen, sizeof(char));
++          buf = (char *)alloc(buflen * sizeof(char));
+     }
+ #ifdef DEBUG
+      char              *tmpbuf = NULL;
+-     tmpbuf = (char *)calloc(buflen, sizeof(char));
++     tmpbuf = (char *)alloc(buflen * sizeof(char));
+      strcpy(tmpbuf, instring);
+ #endif
+     Fspec_Rms = buf;                          /* for decc$to_vms */
+--- vim72.orig/src/os_vms_conf.h
++++ vim72/src/os_vms_conf.h
+@@ -112,10 +112,12 @@
+ #define       HAVE_ERRNO_H
+ #define HAVE_OPENDIR
+ #define HAVE_PUTENV
+ #define HAVE_SETENV
+ #define HAVE_SETJMP_H
++#define HAVE_MATH_H
++#define HAVE_FLOAT_FUNCS
+ #undef        HAVE_DIRENT_H
+ #undef        HAVE_SYS_NDIR_H
+ #undef        HAVE_SYS_DIR_H
+ #undef        HAVE_NDIR_H
+--- vim72.orig/src/os_w32exe.c
++++ vim72/src/os_w32exe.c
+@@ -127,11 +127,12 @@ WinMain(
+ #ifdef VIMDLL
+     FreeLibrary(hLib);
+ errout:
+ #endif
+     free(argv);
+-    free(tofree);
++    if (tofree != NULL)
++      free(tofree);
+ #ifdef FEAT_MBYTE
+     free_cmd_argsW();
+ #endif
+     return 0;
+--- vim72.orig/src/os_win16.c
++++ vim72/src/os_win16.c
+@@ -119,11 +119,12 @@ WinMain(
+     pmain = VimMain;
+     pSaveInst(hInstance);
+     pmain(argc, argv);
+     free(argv);
+-    free(tofree);
++    if (tofree != NULL)
++      free(tofree);
+     return 0;
+ }
+ #endif
+--- vim72.orig/src/os_win32.c
++++ vim72/src/os_win32.c
+@@ -1585,11 +1585,11 @@ executable_exists(char *name)
+     char      fname[_MAX_PATH];
+ #ifdef FEAT_MBYTE
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+-      WCHAR   *p = enc_to_ucs2(name, NULL);
++      WCHAR   *p = enc_to_utf16(name, NULL);
+       WCHAR   fnamew[_MAX_PATH];
+       WCHAR   *dumw;
+       long    n;
+       if (p != NULL)
+@@ -2438,11 +2438,11 @@ mch_dirname(
+     {
+       WCHAR   wbuf[_MAX_PATH + 1];
+       if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0)
+       {
+-          char_u  *p = ucs2_to_enc(wbuf, NULL);
++          char_u  *p = utf16_to_enc(wbuf, NULL);
+           if (p != NULL)
+           {
+               vim_strncpy(buf, p, len - 1);
+               vim_free(p);
+@@ -2464,11 +2464,11 @@ mch_dirname(
+ mch_getperm(char_u *name)
+ {
+ #ifdef FEAT_MBYTE
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+-      WCHAR   *p = enc_to_ucs2(name, NULL);
++      WCHAR   *p = enc_to_utf16(name, NULL);
+       long    n;
+       if (p != NULL)
+       {
+           n = (long)GetFileAttributesW(p);
+@@ -2493,11 +2493,11 @@ mch_setperm(
+ {
+     perm |= FILE_ATTRIBUTE_ARCHIVE;   /* file has changed, set archive bit */
+ #ifdef FEAT_MBYTE
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+-      WCHAR   *p = enc_to_ucs2(name, NULL);
++      WCHAR   *p = enc_to_utf16(name, NULL);
+       long    n;
+       if (p != NULL)
+       {
+           n = (long)SetFileAttributesW(p, perm);
+@@ -2520,11 +2520,11 @@ mch_hide(char_u *name)
+     int               perm;
+ #ifdef FEAT_MBYTE
+     WCHAR     *p = NULL;
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+-      p = enc_to_ucs2(name, NULL);
++      p = enc_to_utf16(name, NULL);
+ #endif
+ #ifdef FEAT_MBYTE
+     if (p != NULL)
+     {
+@@ -2588,11 +2588,11 @@ mch_is_linked(char_u *fname)
+     BY_HANDLE_FILE_INFORMATION inf;
+ #ifdef FEAT_MBYTE
+     WCHAR     *wn = NULL;
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+-      wn = enc_to_ucs2(fname, NULL);
++      wn = enc_to_utf16(fname, NULL);
+     if (wn != NULL)
+     {
+       hFile = CreateFileW(wn,         /* file name */
+                   GENERIC_READ,       /* access mode */
+                   0,                  /* share mode */
+@@ -4237,11 +4237,11 @@ mch_remove(char_u *name)
+     WCHAR     *wn = NULL;
+     int               n;
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+-      wn = enc_to_ucs2(name, NULL);
++      wn = enc_to_utf16(name, NULL);
+       if (wn != NULL)
+       {
+           SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL);
+           n = DeleteFileW(wn) ? 0 : -1;
+           vim_free(wn);
+@@ -4380,12 +4380,12 @@ mch_rename(
+     WCHAR     *wnew = NULL;
+     int               retval = -1;
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+-      wold = enc_to_ucs2((char_u *)pszOldFile, NULL);
+-      wnew = enc_to_ucs2((char_u *)pszNewFile, NULL);
++      wold = enc_to_utf16((char_u *)pszOldFile, NULL);
++      wnew = enc_to_utf16((char_u *)pszNewFile, NULL);
+       if (wold != NULL && wnew != NULL)
+           retval = mch_wrename(wold, wnew);
+       vim_free(wold);
+       vim_free(wnew);
+       if (retval == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
+@@ -4490,11 +4490,11 @@ mch_access(char *n, int p)
+     int               retval = -1;        /* default: fail */
+ #ifdef FEAT_MBYTE
+     WCHAR     *wn = NULL;
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+-      wn = enc_to_ucs2(n, NULL);
++      wn = enc_to_utf16(n, NULL);
+ #endif
+     if (mch_isdir(n))
+     {
+       char TempName[_MAX_PATH + 16] = "";
+@@ -4616,11 +4616,11 @@ getout:
+     return retval;
+ }
+ #if defined(FEAT_MBYTE) || defined(PROTO)
+ /*
+- * Version of open() that may use ucs2 file name.
++ * Version of open() that may use UTF-16 file name.
+  */
+     int
+ mch_open(char *name, int flags, int mode)
+ {
+     /* _wopen() does not work with Borland C 5.5: creates a read-only file. */
+@@ -4628,11 +4628,11 @@ mch_open(char *name, int flags, int mode
+     WCHAR     *wn;
+     int               f;
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+-      wn = enc_to_ucs2(name, NULL);
++      wn = enc_to_utf16(name, NULL);
+       if (wn != NULL)
+       {
+           f = _wopen(wn, flags, mode);
+           vim_free(wn);
+           if (f >= 0)
+@@ -4646,11 +4646,11 @@ mch_open(char *name, int flags, int mode
+     return open(name, flags, mode);
+ }
+ /*
+- * Version of fopen() that may use ucs2 file name.
++ * Version of fopen() that may use UTF-16 file name.
+  */
+     FILE *
+ mch_fopen(char *name, char *mode)
+ {
+     WCHAR     *wn, *wm;
+@@ -4673,12 +4673,12 @@ mch_fopen(char *name, char *mode)
+       if (newMode == 't')
+           _set_fmode(_O_TEXT);
+       else if (newMode == 'b')
+           _set_fmode(_O_BINARY);
+ # endif
+-      wn = enc_to_ucs2(name, NULL);
+-      wm = enc_to_ucs2(mode, NULL);
++      wn = enc_to_utf16(name, NULL);
++      wm = enc_to_utf16(mode, NULL);
+       if (wn != NULL && wm != NULL)
+           f = _wfopen(wn, wm);
+       vim_free(wn);
+       vim_free(wm);
+@@ -4774,12 +4774,12 @@ copy_infostreams(char_u *from, char_u *t
+     void              *context = NULL;
+     DWORD             lo, hi;
+     int                       len;
+     /* Convert the file names to wide characters. */
+-    fromw = enc_to_ucs2(from, NULL);
+-    tow = enc_to_ucs2(to, NULL);
++    fromw = enc_to_utf16(from, NULL);
++    tow = enc_to_utf16(to, NULL);
+     if (fromw != NULL && tow != NULL)
+     {
+       /* Open the file for reading. */
+       sh = CreateFileW(fromw, GENERIC_READ, FILE_SHARE_READ, NULL,
+                            OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+@@ -5120,11 +5120,11 @@ fix_arg_enc(void)
+       return;         /* out of memory */
+     for (i = 0; i < used_file_count; ++i)
+     {
+       idx = used_file_indexes[i];
+-      str = ucs2_to_enc(ArglistW[idx], NULL);
++      str = utf16_to_enc(ArglistW[idx], NULL);
+       if (str != NULL)
+       {
+ #ifdef FEAT_DIFF
+           /* When using diff mode may need to concatenate file name to
+            * directory name.  Just like it's done in main(). */
+--- vim72.orig/src/osdef1.h.in
++++ vim72/src/osdef1.h.in
+@@ -23,11 +23,11 @@ extern int fclose __ARGS((FILE *));
+ extern int    fseek __ARGS((FILE *, long, int));
+ #ifdef HAVE_FSEEKO
+ extern int    fseeko __ARGS((FILE *, off_t, int));
+ #endif
+ extern long   ftell __ARGS((FILE *));
+-#ifdef HAVE_FTELLO
++#ifdef HAVE_FSEEKO
+ extern off_t  ftello __ARGS((FILE *));
+ #endif
+ extern void   rewind __ARGS((FILE *));
+ extern int    fread __ARGS((char *, int, int, FILE *));
+ extern int    fwrite __ARGS((char *, int, int, FILE *));
+--- vim72.orig/src/po/check.vim
++++ vim72/src/po/check.vim
+@@ -21,10 +21,13 @@ func! GetMline()
+   endwhile
+   " remove '%', not used for formatting.
+   let idline = substitute(idline, "'%'", '', 'g')
++  " remove '%' used for plural forms.
++  let idline = substitute(idline, '\\nPlural-Forms: .\+;\\n', '', '')
++
+   " remove everything but % items.
+   return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g')
+ endfunc
+ " Start at the first "msgid" line.
+--- vim72.orig/src/popupmnu.c
++++ vim72/src/popupmnu.c
+@@ -343,25 +343,40 @@ pum_redraw()
+                       if (curwin->w_p_rl)
+                       {
+                           if (st != NULL)
+                           {
+                               char_u  *rt = reverse_text(st);
+-                              char_u  *rt_saved = rt;
+-                              int     len, j;
+                               if (rt != NULL)
+                               {
+-                                  len = (int)STRLEN(rt);
+-                                  if (len > pum_width)
++                                  char_u      *rt_start = rt;
++                                  int         size;
++
++                                  size = vim_strsize(rt);
++                                  if (size > pum_width)
+                                   {
+-                                      for (j = pum_width; j < len; ++j)
++                                      do
++                                      {
++                                          size -= has_mbyte
++                                                  ? (*mb_ptr2cells)(rt) : 1;
+                                           mb_ptr_adv(rt);
+-                                      len = pum_width;
++                                      } while (size > pum_width);
++
++                                      if (size < pum_width)
++                                      {
++                                          /* Most left character requires
++                                           * 2-cells but only 1 cell is
++                                           * available on screen.  Put a
++                                           * '<' on the left of the pum
++                                           * item */
++                                          *(--rt) = '<';
++                                          size++;
++                                      }
+                                   }
+-                                  screen_puts_len(rt, len, row,
+-                                                      col - len + 1, attr);
+-                                  vim_free(rt_saved);
++                                  screen_puts_len(rt, (int)STRLEN(rt),
++                                                 row, col - size + 1, attr);
++                                  vim_free(rt_start);
+                               }
+                               vim_free(st);
+                           }
+                           col -= width;
+                       }
+@@ -571,11 +586,11 @@ pum_set_selected(n, repeat)
+               }
+               else
+               {
+                   /* Don't want to sync undo in the current buffer. */
+                   ++no_u_sync;
+-                  res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0);
++                  res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0, NULL);
+                   --no_u_sync;
+                   if (res == OK)
+                   {
+                       /* Edit a new, empty buffer. Set options for a "wipeout"
+                        * buffer. */
+@@ -623,11 +638,11 @@ pum_set_selected(n, repeat)
+                       }
+                   }
+                   curbuf->b_changed = 0;
+                   curbuf->b_p_ma = FALSE;
+-                  curwin->w_cursor.lnum = 0;
++                  curwin->w_cursor.lnum = 1;
+                   curwin->w_cursor.col = 0;
+                   if (curwin != curwin_save && win_valid(curwin_save))
+                   {
+                       /* Return cursor to where we were */
+--- vim72.orig/src/proto/buffer.pro
++++ vim72/src/proto/buffer.pro
+@@ -31,33 +31,32 @@ void buf_set_name __ARGS((int fnum, char
+ void buf_name_changed __ARGS((buf_T *buf));
+ buf_T *setaltfname __ARGS((char_u *ffname, char_u *sfname, linenr_T lnum));
+ char_u *getaltfname __ARGS((int errmsg));
+ int buflist_add __ARGS((char_u *fname, int flags));
+ void buflist_slash_adjust __ARGS((void));
+-void buflist_altfpos __ARGS((void));
++void buflist_altfpos __ARGS((win_T *win));
+ int otherfile __ARGS((char_u *ffname));
+ void buf_setino __ARGS((buf_T *buf));
+ void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate));
+-void col_print __ARGS((char_u *buf, int col, int vcol));
++void col_print __ARGS((char_u *buf, size_t buflen, int col, int vcol));
+ void maketitle __ARGS((void));
+ void resettitle __ARGS((void));
+ void free_titles __ARGS((void));
+ int build_stl_str_hl __ARGS((win_T *wp, char_u *out, size_t outlen, char_u *fmt, int use_sandbox, int fillchar, int maxwidth, struct stl_hlrec *hltab, struct stl_hlrec *tabtab));
+-void get_rel_pos __ARGS((win_T *wp, char_u *str));
+-int append_arg_number __ARGS((win_T *wp, char_u *buf, int add_file, int maxlen));
++void get_rel_pos __ARGS((win_T *wp, char_u *buf, int buflen));
+ char_u *fix_fname __ARGS((char_u *fname));
+ void fname_expand __ARGS((buf_T *buf, char_u **ffname, char_u **sfname));
+ char_u *alist_name __ARGS((aentry_T *aep));
+ void do_arg_all __ARGS((int count, int forceit, int keep_tabs));
+ void ex_buffer_all __ARGS((exarg_T *eap));
+ void do_modelines __ARGS((int flags));
+ int read_viminfo_bufferlist __ARGS((vir_T *virp, int writing));
+ void write_viminfo_bufferlist __ARGS((FILE *fp));
+ char *buf_spname __ARGS((buf_T *buf));
+ void buf_addsign __ARGS((buf_T *buf, int id, linenr_T lnum, int typenr));
+-int buf_change_sign_type __ARGS((buf_T *buf, int markId, int typenr));
+-int_u buf_getsigntype __ARGS((buf_T *buf, linenr_T lnum, int type));
++linenr_T buf_change_sign_type __ARGS((buf_T *buf, int markId, int typenr));
++int buf_getsigntype __ARGS((buf_T *buf, linenr_T lnum, int type));
+ linenr_T buf_delsign __ARGS((buf_T *buf, int id));
+ int buf_findsign __ARGS((buf_T *buf, int id));
+ int buf_findsign_id __ARGS((buf_T *buf, linenr_T lnum));
+ int buf_findsigntype_id __ARGS((buf_T *buf, linenr_T lnum, int typenr));
+ int buf_signcount __ARGS((buf_T *buf, linenr_T lnum));
+--- vim72.orig/src/proto/edit.pro
++++ vim72/src/proto/edit.pro
+@@ -6,11 +6,11 @@ void display_dollar __ARGS((colnr_T col)
+ void change_indent __ARGS((int type, int amount, int round, int replaced, int call_changed_bytes));
+ void truncate_spaces __ARGS((char_u *line));
+ void backspace_until_column __ARGS((int col));
+ int vim_is_ctrl_x_key __ARGS((int c));
+ int ins_compl_add_infercase __ARGS((char_u *str, int len, int icase, char_u *fname, int dir, int flags));
+-void set_completion __ARGS((int startcol, list_T *list));
++void set_completion __ARGS((colnr_T startcol, list_T *list));
+ void ins_compl_show_pum __ARGS((void));
+ char_u *find_word_start __ARGS((char_u *ptr));
+ char_u *find_word_end __ARGS((char_u *ptr));
+ int ins_compl_active __ARGS((void));
+ int ins_compl_add_tv __ARGS((typval_T *tv, int dir));
+--- vim72.orig/src/proto/eval.pro
++++ vim72/src/proto/eval.pro
+@@ -15,11 +15,11 @@ int eval_printexpr __ARGS((char_u *fname
+ void eval_diff __ARGS((char_u *origfile, char_u *newfile, char_u *outfile));
+ void eval_patch __ARGS((char_u *origfile, char_u *difffile, char_u *outfile));
+ int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip));
+ char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip));
+ int skip_expr __ARGS((char_u **pp));
+-char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist));
++char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert));
+ char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox));
+ int eval_to_number __ARGS((char_u *expr));
+ list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr));
+ int get_spellword __ARGS((list_T *list, char_u **pp));
+ typval_T *eval_expr __ARGS((char_u *arg, char_u **nextcmd));
+@@ -44,24 +44,33 @@ void del_menutrans_vars __ARGS((void));
+ char_u *get_user_var_name __ARGS((expand_T *xp, int idx));
+ list_T *list_alloc __ARGS((void));
+ void list_unref __ARGS((list_T *l));
+ void list_free __ARGS((list_T *l, int recurse));
+ dictitem_T *dict_lookup __ARGS((hashitem_T *hi));
++char_u *list_find_str __ARGS((list_T *l, long idx));
++int list_append_tv __ARGS((list_T *l, typval_T *tv));
+ int list_append_dict __ARGS((list_T *list, dict_T *dict));
++int list_append_string __ARGS((list_T *l, char_u *str, int len));
+ int garbage_collect __ARGS((void));
+ dict_T *dict_alloc __ARGS((void));
++dictitem_T *dictitem_alloc __ARGS((char_u *key));
++void dictitem_free __ARGS((dictitem_T *item));
++int dict_add __ARGS((dict_T *d, dictitem_T *item));
+ int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str));
+ char_u *get_dict_string __ARGS((dict_T *d, char_u *key, int save));
+ long get_dict_number __ARGS((dict_T *d, char_u *key));
+ char_u *get_function_name __ARGS((expand_T *xp, int idx));
+ char_u *get_expr_name __ARGS((expand_T *xp, int idx));
+ long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit));
+ void set_vim_var_nr __ARGS((int idx, long val));
+ long get_vim_var_nr __ARGS((int idx));
+ char_u *get_vim_var_str __ARGS((int idx));
+-void set_vcount __ARGS((long count, long count1));
++list_T *get_vim_var_list __ARGS((int idx));
++void set_vim_var_char __ARGS((int c));
++void set_vcount __ARGS((long count, long count1, int set_prevcount));
+ void set_vim_var_string __ARGS((int idx, char_u *val, int len));
++void set_vim_var_list __ARGS((int idx, list_T *val));
+ void set_reg_var __ARGS((int c));
+ char_u *v_exception __ARGS((char_u *oldval));
+ char_u *v_throwpoint __ARGS((char_u *oldval));
+ char_u *set_cmdarg __ARGS((exarg_T *eap, char_u *oldarg));
+ void free_tv __ARGS((typval_T *varp));
+@@ -70,10 +79,11 @@ long get_tv_number_chk __ARGS((typval_T
+ char_u *get_tv_string_chk __ARGS((typval_T *varp));
+ char_u *get_var_value __ARGS((char_u *name));
+ void new_script_vars __ARGS((scid_T id));
+ void init_var_dict __ARGS((dict_T *dict, dictitem_T *dict_var));
+ void vars_clear __ARGS((hashtab_T *ht));
++void copy_tv __ARGS((typval_T *from, typval_T *to));
+ void ex_echo __ARGS((exarg_T *eap));
+ void ex_echohl __ARGS((exarg_T *eap));
+ void ex_execute __ARGS((exarg_T *eap));
+ void ex_function __ARGS((exarg_T *eap));
+ void free_all_functions __ARGS((void));
+@@ -92,8 +102,9 @@ int func_has_ended __ARGS((void *cookie)
+ int func_has_abort __ARGS((void *cookie));
+ int read_viminfo_varlist __ARGS((vir_T *virp, int writing));
+ void write_viminfo_varlist __ARGS((FILE *fp));
+ int store_session_globals __ARGS((FILE *fd));
+ void last_set_msg __ARGS((scid_T scriptID));
++void ex_oldfiles __ARGS((exarg_T *eap));
+ int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen));
+ char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags));
+ /* vim: set ft=c : */
+--- vim72.orig/src/proto/ex_cmds.pro
++++ vim72/src/proto/ex_cmds.pro
+@@ -7,13 +7,13 @@ int do_move __ARGS((linenr_T line1, line
+ void ex_copy __ARGS((linenr_T line1, linenr_T line2, linenr_T n));
+ void free_prev_shellcmd __ARGS((void));
+ void do_bang __ARGS((int addr_count, exarg_T *eap, int forceit, int do_in, int do_out));
+ void do_shell __ARGS((char_u *cmd, int flags));
+ char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp));
+-void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname));
++void append_redir __ARGS((char_u *buf, int buflen, char_u *opt, char_u *fname));
+ int viminfo_error __ARGS((char *errnum, char *message, char_u *line));
+-int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit));
++int read_viminfo __ARGS((char_u *file, int flags));
+ void write_viminfo __ARGS((char_u *file, int forceit));
+ int viminfo_readline __ARGS((vir_T *virp));
+ char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert));
+ void viminfo_writestring __ARGS((FILE *fd, char_u *p));
+ void do_fixdel __ARGS((exarg_T *eap));
+@@ -25,11 +25,11 @@ void ex_write __ARGS((exarg_T *eap));
+ int do_write __ARGS((exarg_T *eap));
+ void ex_wnext __ARGS((exarg_T *eap));
+ void do_wqall __ARGS((exarg_T *eap));
+ int not_writing __ARGS((void));
+ int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit));
+-int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags));
++int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags, win_T *oldwin));
+ void ex_append __ARGS((exarg_T *eap));
+ void ex_change __ARGS((exarg_T *eap));
+ void ex_z __ARGS((exarg_T *eap));
+ int check_restricted __ARGS((void));
+ int check_secure __ARGS((void));
+@@ -53,7 +53,10 @@ void ex_sign __ARGS((exarg_T *eap));
+ void sign_gui_started __ARGS((void));
+ int sign_get_attr __ARGS((int typenr, int line));
+ char_u *sign_get_text __ARGS((int typenr));
+ void *sign_get_image __ARGS((int typenr));
+ char_u *sign_typenr2name __ARGS((int typenr));
++void free_signs __ARGS((void));
++char_u *get_sign_name __ARGS((expand_T *xp, int idx));
++void set_context_in_sign_cmd __ARGS((expand_T *xp, char_u *arg));
+ void ex_drop __ARGS((exarg_T *eap));
+ /* vim: set ft=c : */
+--- vim72.orig/src/proto/ex_cmds2.pro
++++ vim72/src/proto/ex_cmds2.pro
+@@ -22,10 +22,12 @@ void profile_self __ARGS((proftime_T *se
+ void profile_get_wait __ARGS((proftime_T *tm));
+ void profile_sub_wait __ARGS((proftime_T *tm, proftime_T *tma));
+ int profile_equal __ARGS((proftime_T *tm1, proftime_T *tm2));
+ int profile_cmp __ARGS((proftime_T *tm1, proftime_T *tm2));
+ void ex_profile __ARGS((exarg_T *eap));
++char_u *get_profile_name __ARGS((expand_T *xp, int idx));
++void set_context_in_profile_cmd __ARGS((expand_T *xp, char_u *arg));
+ void profile_dump __ARGS((void));
+ void script_prof_save __ARGS((proftime_T *tm));
+ void script_prof_restore __ARGS((proftime_T *tm));
+ void prof_inchar_enter __ARGS((void));
+ void prof_inchar_exit __ARGS((void));
+--- vim72.orig/src/proto/ex_docmd.pro
++++ vim72/src/proto/ex_docmd.pro
+@@ -50,6 +50,7 @@ int find_cmdline_var __ARGS((char_u *src
+ char_u *eval_vars __ARGS((char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped));
+ char_u *expand_sfile __ARGS((char_u *arg));
+ int put_eol __ARGS((FILE *fd));
+ int put_line __ARGS((FILE *fd, char *s));
+ void dialog_msg __ARGS((char_u *buff, char *format, char_u *fname));
++char_u *get_behave_arg __ARGS((expand_T *xp, int idx));
+ /* vim: set ft=c : */
+--- vim72.orig/src/proto/ex_getln.pro
++++ vim72/src/proto/ex_getln.pro
+@@ -2,10 +2,11 @@
+ char_u *getcmdline __ARGS((int firstc, long count, int indent));
+ char_u *getcmdline_prompt __ARGS((int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg));
+ int text_locked __ARGS((void));
+ void text_locked_msg __ARGS((void));
+ int curbuf_locked __ARGS((void));
++int allbuf_locked __ARGS((void));
+ char_u *getexline __ARGS((int c, void *dummy, int indent));
+ char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent));
+ int cmdline_overstrike __ARGS((void));
+ int cmdline_at_end __ARGS((void));
+ colnr_T cmdline_getvcol_cursor __ARGS((void));
+@@ -29,11 +30,11 @@ void tilde_replace __ARGS((char_u *orig_
+ char_u *sm_gettail __ARGS((char_u *s));
+ char_u *addstar __ARGS((char_u *fname, int len, int context));
+ void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col));
+ int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches));
+ int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int))));
+-char_u *globpath __ARGS((char_u *path, char_u *file));
++char_u *globpath __ARGS((char_u *path, char_u *file, int expand_options));
+ void init_history __ARGS((void));
+ int get_histtype __ARGS((char_u *name));
+ void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep));
+ int get_history_idx __ARGS((int histype));
+ char_u *get_cmdline_str __ARGS((void));
+--- vim72.orig/src/proto/gui.pro
++++ vim72/src/proto/gui.pro
+@@ -41,10 +41,11 @@ int send_tabline_event __ARGS((int nr));
+ void send_tabline_menu_event __ARGS((int tabidx, int event));
+ void gui_remove_scrollbars __ARGS((void));
+ void gui_create_scrollbar __ARGS((scrollbar_T *sb, int type, win_T *wp));
+ scrollbar_T *gui_find_scrollbar __ARGS((long ident));
+ void gui_drag_scrollbar __ARGS((scrollbar_T *sb, long value, int still_dragging));
++void gui_may_update_scrollbars __ARGS((void));
+ void gui_update_scrollbars __ARGS((int force));
+ int gui_do_scroll __ARGS((void));
+ int gui_do_horiz_scroll __ARGS((void));
+ void gui_check_colors __ARGS((void));
+ guicolor_T gui_get_color __ARGS((char_u *name));
+--- vim72.orig/src/proto/gui_gtk_x11.pro
++++ vim72/src/proto/gui_gtk_x11.pro
+@@ -14,10 +14,12 @@ void gui_mch_forked __ARGS((void));
+ void gui_mch_new_colors __ARGS((void));
+ int gui_mch_open __ARGS((void));
+ void gui_mch_exit __ARGS((int rc));
+ int gui_mch_get_winpos __ARGS((int *x, int *y));
+ void gui_mch_set_winpos __ARGS((int x, int y));
++int gui_mch_maximized __ARGS((void));
++void gui_mch_unmaximize __ARGS((void));
+ void gui_mch_set_shellsize __ARGS((int width, int height, int min_width, int min_height, int base_width, int base_height, int direction));
+ void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h));
+ void gui_mch_settitle __ARGS((char_u *title, char_u *icon));
+ void gui_mch_enable_menu __ARGS((int showit));
+ void gui_mch_show_toolbar __ARGS((int showit));
+--- vim72.orig/src/proto/if_cscope.pro
++++ vim72/src/proto/if_cscope.pro
+@@ -1,6 +1,8 @@
+ /* if_cscope.c */
++char_u *get_cscope_name __ARGS((expand_T *xp, int idx));
++void set_context_in_cscope_cmd __ARGS((expand_T *xp, char_u *arg, cmdidx_T cmdidx));
+ void do_cscope __ARGS((exarg_T *eap));
+ void do_scscope __ARGS((exarg_T *eap));
+ void do_cstag __ARGS((exarg_T *eap));
+ int cs_fgets __ARGS((char_u *buf, int size));
+ void cs_free_tags __ARGS((void));
+--- vim72.orig/src/proto/if_mzsch.pro
++++ vim72/src/proto/if_mzsch.pro
+@@ -11,14 +11,9 @@ void raise_if_error __ARGS((void));
+ buf_T *get_valid_buffer __ARGS((void *));
+ win_T *get_valid_window __ARGS((void *));
+ void mzvim_check_threads __ARGS((void));
+ void mzvim_reset_timer __ARGS((void));
+ void *mzvim_eval_string __ARGS((char_u *str));
+-struct Scheme_Object *mzvim_apply __ARGS((struct Scheme_Object *, int argc,
+-    struct Scheme_Object **));
+-int mzthreads_allowed (void);
+-#ifdef FEAT_GUI_KDE
+-void timer_proc (void);
+-void mzscheme_kde_start_timer (void);
+-void mzscheme_kde_stop_timer (void);
+-#endif
++int mzthreads_allowed __ARGS((void));
++void mzscheme_main __ARGS((void));
++void do_mzeval __ARGS((char_u *str, typval_T *rettv));
+ /* vim: set ft=c : */
+--- vim72.orig/src/proto/mark.pro
++++ vim72/src/proto/mark.pro
+@@ -24,7 +24,7 @@ void set_last_cursor __ARGS((win_T *win)
+ void free_all_marks __ARGS((void));
+ int read_viminfo_filemark __ARGS((vir_T *virp, int force));
+ void write_viminfo_filemarks __ARGS((FILE *fp));
+ int removable __ARGS((char_u *name));
+ int write_viminfo_marks __ARGS((FILE *fp_out));
+-void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof));
++void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags));
+ /* vim: set ft=c : */
+--- vim72.orig/src/proto/mbyte.pro
++++ vim72/src/proto/mbyte.pro
+@@ -5,14 +5,16 @@ int bomb_size __ARGS((void));
+ int mb_get_class __ARGS((char_u *p));
+ int dbcs_class __ARGS((unsigned lead, unsigned trail));
+ int latin_char2len __ARGS((int c));
+ int latin_char2bytes __ARGS((int c, char_u *buf));
+ int latin_ptr2len __ARGS((char_u *p));
++int latin_ptr2len_len __ARGS((char_u *p, int size));
+ int utf_char2cells __ARGS((int c));
+ int latin_ptr2cells __ARGS((char_u *p));
+ int utf_ptr2cells __ARGS((char_u *p));
+ int dbcs_ptr2cells __ARGS((char_u *p));
++int latin_ptr2cells_len __ARGS((char_u *p, int size));
+ int latin_char2cells __ARGS((int c));
+ int latin_off2cells __ARGS((unsigned off, unsigned max_off));
+ int dbcs_off2cells __ARGS((unsigned off, unsigned max_off));
+ int utf_off2cells __ARGS((unsigned off, unsigned max_off));
+ int latin_ptr2char __ARGS((char_u *p));
+@@ -83,10 +85,11 @@ void im_shutdown __ARGS((void));
+ int xim_get_status_area_height __ARGS((void));
+ int im_get_status __ARGS((void));
+ int preedit_get_status __ARGS((void));
+ int im_is_preediting __ARGS((void));
+ int convert_setup __ARGS((vimconv_T *vcp, char_u *from, char_u *to));
++int convert_setup_ext __ARGS((vimconv_T *vcp, char_u *from, int from_unicode_is_utf8, char_u *to, int to_unicode_is_utf8));
+ int convert_input __ARGS((char_u *ptr, int len, int maxlen));
+ int convert_input_safe __ARGS((char_u *ptr, int len, int maxlen, char_u **restp, int *restlenp));
+ char_u *string_convert __ARGS((vimconv_T *vcp, char_u *ptr, int *lenp));
+ char_u *string_convert_ext __ARGS((vimconv_T *vcp, char_u *ptr, int *lenp, int *unconvlenp));
+ /* vim: set ft=c : */
+--- vim72.orig/src/proto/message.pro
++++ vim72/src/proto/message.pro
+@@ -52,10 +52,11 @@ void repeat_message __ARGS((void));
+ void msg_clr_eos __ARGS((void));
+ void msg_clr_eos_force __ARGS((void));
+ void msg_clr_cmdline __ARGS((void));
+ int msg_end __ARGS((void));
+ void msg_check __ARGS((void));
++int redirecting __ARGS((void));
+ void verbose_enter __ARGS((void));
+ void verbose_leave __ARGS((void));
+ void verbose_enter_scroll __ARGS((void));
+ void verbose_leave_scroll __ARGS((void));
+ void verbose_stop __ARGS((void));
+--- vim72.orig/src/proto/misc1.pro
++++ vim72/src/proto/misc1.pro
+@@ -83,10 +83,11 @@ int get_lisp_indent __ARGS((void));
+ void prepare_to_exit __ARGS((void));
+ void preserve_exit __ARGS((void));
+ int vim_fexists __ARGS((char_u *fname));
+ void line_breakcheck __ARGS((void));
+ void fast_breakcheck __ARGS((void));
++int expand_wildcards_eval __ARGS((char_u **pat, int *num_file, char_u ***file, int flags));
+ int expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags));
+ int match_suffix __ARGS((char_u *fname));
+ int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags, int didstar));
+ int gen_expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags));
+ void addfile __ARGS((garray_T *gap, char_u *f, int flags));
+--- vim72.orig/src/proto/misc2.pro
++++ vim72/src/proto/misc2.pro
+@@ -57,11 +57,11 @@ void ga_append __ARGS((garray_T *gap, in
+ int name_to_mod_mask __ARGS((int c));
+ int simplify_key __ARGS((int key, int *modifiers));
+ int handle_x_keys __ARGS((int key));
+ char_u *get_special_key_name __ARGS((int c, int modifiers));
+ int trans_special __ARGS((char_u **srcp, char_u *dst, int keycode));
+-int find_special_key __ARGS((char_u **srcp, int *modp, int keycode));
++int find_special_key __ARGS((char_u **srcp, int *modp, int keycode, int keep_x_key));
+ int extract_modifiers __ARGS((int key, int *modp));
+ int find_special_key_in_table __ARGS((int c));
+ int get_special_key_code __ARGS((char_u *name));
+ char_u *get_key_name __ARGS((int i));
+ int get_mouse_button __ARGS((int code, int *is_click, int *is_drag));
+--- vim72.orig/src/proto/netbeans.pro
++++ vim72/src/proto/netbeans.pro
+@@ -9,16 +9,16 @@ void netbeans_beval_cb __ARGS((BalloonEv
+ void netbeans_startup_done __ARGS((void));
+ void netbeans_send_disconnect __ARGS((void));
+ void netbeans_frame_moved __ARGS((int new_x, int new_y));
+ void netbeans_file_activated __ARGS((buf_T *bufp));
+ void netbeans_file_opened __ARGS((buf_T *bufp));
+-void netbeans_file_closed __ARGS((buf_T *bufp));
++void netbeans_file_killed __ARGS((buf_T *bufp));
+ void netbeans_inserted __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, char_u *txt, int newlen));
+ void netbeans_removed __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, long len));
+ void netbeans_unmodified __ARGS((buf_T *bufp));
+ void netbeans_button_release __ARGS((int button));
+-void netbeans_keycommand __ARGS((int key));
++int netbeans_keycommand __ARGS((int key));
+ void netbeans_save_buffer __ARGS((buf_T *bufp));
+ void netbeans_deleted_all_lines __ARGS((buf_T *bufp));
+ int netbeans_is_guarded __ARGS((linenr_T top, linenr_T bot));
+ void netbeans_draw_multisign_indicator __ARGS((int row));
+ void netbeans_draw_multisign_indicator __ARGS((int row));
+--- vim72.orig/src/proto/option.pro
++++ vim72/src/proto/option.pro
+@@ -27,10 +27,11 @@ char_u *get_highlight_default __ARGS((vo
+ char_u *get_encoding_default __ARGS((void));
+ int makeset __ARGS((FILE *fd, int opt_flags, int local_only));
+ int makefoldset __ARGS((FILE *fd));
+ void clear_termoptions __ARGS((void));
+ void free_termoptions __ARGS((void));
++void free_one_termoption __ARGS((char_u *var));
+ void set_term_defaults __ARGS((void));
+ void comp_col __ARGS((void));
+ char_u *get_equalprg __ARGS((void));
+ void win_copy_options __ARGS((win_T *wp_from, win_T *wp_to));
+ void copy_winopt __ARGS((winopt_T *from, winopt_T *to));
+@@ -42,10 +43,11 @@ void reset_modifiable __ARGS((void));
+ void set_iminsert_global __ARGS((void));
+ void set_imsearch_global __ARGS((void));
+ void set_context_in_set_cmd __ARGS((expand_T *xp, char_u *arg, int opt_flags));
+ int ExpandSettings __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file));
+ int ExpandOldSetting __ARGS((int *num_file, char_u ***file));
++int langmap_adjust_mb __ARGS((int c));
+ int has_format_option __ARGS((int x));
+ int shortmess __ARGS((int x));
+ void vimrc_found __ARGS((char_u *fname, char_u *envname));
+ void change_compatible __ARGS((int on));
+ int option_was_set __ARGS((char_u *name));
+--- vim72.orig/src/proto/os_mswin.pro
++++ vim72/src/proto/os_mswin.pro
+@@ -20,18 +20,18 @@ int mch_has_exp_wildcard __ARGS((char_u
+ int mch_has_wildcard __ARGS((char_u *p));
+ int mch_chdir __ARGS((char *path));
+ int can_end_termcap_mode __ARGS((int give_msg));
+ int mch_screenmode __ARGS((char_u *arg));
+ int mch_libcall __ARGS((char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result));
+-int utf8_to_ucs2 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp));
+-int ucs2_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr));
++int utf8_to_utf16 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp));
++int utf16_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr));
+ void MultiByteToWideChar_alloc __ARGS((UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen));
+ void WideCharToMultiByte_alloc __ARGS((UINT cp, DWORD flags, LPCWSTR in, int inlen, LPSTR *out, int *outlen, LPCSTR def, LPBOOL useddef));
+ int clip_mch_own_selection __ARGS((VimClipboard *cbd));
+ void clip_mch_lose_selection __ARGS((VimClipboard *cbd));
+-short_u *enc_to_ucs2 __ARGS((char_u *str, int *lenp));
+-char_u *ucs2_to_enc __ARGS((short_u *str, int *lenp));
++short_u *enc_to_utf16 __ARGS((char_u *str, int *lenp));
++char_u *utf16_to_enc __ARGS((short_u *str, int *lenp));
+ void clip_mch_request_selection __ARGS((VimClipboard *cbd));
+ void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen));
+ void clip_mch_set_selection __ARGS((VimClipboard *cbd));
+ void DumpPutS __ARGS((const char *psz));
+ int mch_get_winpos __ARGS((int *x, int *y));
+--- vim72.orig/src/proto/os_unix.pro
++++ vim72/src/proto/os_unix.pro
+@@ -1,6 +1,7 @@
+ /* os_unix.c */
++int mch_chdir __ARGS((char *path));
+ void mch_write __ARGS((char_u *s, int len));
+ int mch_inchar __ARGS((char_u *buf, int maxlen, long wtime, int tb_change_cnt));
+ int mch_char_avail __ARGS((void));
+ long_u mch_total_mem __ARGS((int special));
+ void mch_delay __ARGS((long msec, int ignoreinput));
+--- vim72.orig/src/proto/spell.pro
++++ vim72/src/proto/spell.pro
+@@ -20,7 +20,7 @@ void ex_spellinfo __ARGS((exarg_T *eap))
+ void ex_spelldump __ARGS((exarg_T *eap));
+ void spell_dump_compl __ARGS((buf_T *buf, char_u *pat, int ic, int *dir, int dumpflags_arg));
+ char_u *spell_to_word_end __ARGS((char_u *start, buf_T *buf));
+ int spell_word_start __ARGS((int startcol));
+ void spell_expand_check_cap __ARGS((colnr_T col));
+-int expand_spelling __ARGS((linenr_T lnum, int col, char_u *pat, char_u ***matchp));
++int expand_spelling __ARGS((linenr_T lnum, char_u *pat, char_u ***matchp));
+ /* vim: set ft=c : */
+--- vim72.orig/src/proto/ui.pro
++++ vim72/src/proto/ui.pro
+@@ -46,10 +46,11 @@ void ui_cursor_shape __ARGS((void));
+ int check_col __ARGS((int col));
+ int check_row __ARGS((int row));
+ void open_app_context __ARGS((void));
+ void x11_setup_atoms __ARGS((Display *dpy));
+ void clip_x11_request_selection __ARGS((Widget myShell, Display *dpy, VimClipboard *cbd));
++void yank_cut_buffer0 __ARGS((Display *dpy, VimClipboard *cbd));
+ void clip_x11_lose_selection __ARGS((Widget myShell, VimClipboard *cbd));
+ int clip_x11_own_selection __ARGS((Widget myShell, VimClipboard *cbd));
+ void clip_x11_set_selection __ARGS((VimClipboard *cbd));
+ int jump_to_mouse __ARGS((int flags, int *inclusive, int which_button));
+ int mouse_comp_pos __ARGS((win_T *win, int *rowp, int *colp, linenr_T *lnump));
+--- vim72.orig/src/proto/window.pro
++++ vim72/src/proto/window.pro
+@@ -1,20 +1,24 @@
+ /* window.c */
+ void do_window __ARGS((int nchar, long Prenum, int xchar));
+ int win_split __ARGS((int size, int flags));
++int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
+ int win_valid __ARGS((win_T *win));
+ int win_count __ARGS((void));
+ int make_windows __ARGS((int count, int vertical));
+ void win_move_after __ARGS((win_T *win1, win_T *win2));
+ void win_equal __ARGS((win_T *next_curwin, int current, int dir));
+ void close_windows __ARGS((buf_T *buf, int keep_curwin));
+ void win_close __ARGS((win_T *win, int free_buf));
+ void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp));
+ void win_free_all __ARGS((void));
++win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));
+ void close_others __ARGS((int message, int forceit));
+ void curwin_init __ARGS((void));
++void win_init_empty __ARGS((win_T *wp));
+ int win_alloc_first __ARGS((void));
++void win_alloc_aucmd_win __ARGS((void));
+ void win_init_size __ARGS((void));
+ void free_tabpage __ARGS((tabpage_T *tp));
+ int win_new_tabpage __ARGS((int after));
+ int may_open_tabpage __ARGS((void));
+ int make_tabpages __ARGS((int maxcount));
+@@ -28,10 +32,12 @@ void tabpage_move __ARGS((int nr));
+ void win_goto __ARGS((win_T *wp));
+ win_T *win_find_nr __ARGS((int winnr));
+ void win_enter __ARGS((win_T *wp, int undo_sync));
+ win_T *buf_jump_open_win __ARGS((buf_T *buf));
+ win_T *buf_jump_open_tab __ARGS((buf_T *buf));
++void win_append __ARGS((win_T *after, win_T *wp));
++void win_remove __ARGS((win_T *wp, tabpage_T *tp));
+ int win_alloc_lines __ARGS((win_T *wp));
+ void win_free_lsize __ARGS((win_T *wp));
+ void shell_new_rows __ARGS((void));
+ void shell_new_columns __ARGS((void));
+ void win_size_save __ARGS((garray_T *gap));
+@@ -56,10 +62,12 @@ int path_with_url __ARGS((char_u *fname)
+ int vim_isAbsName __ARGS((char_u *name));
+ int vim_FullName __ARGS((char_u *fname, char_u *buf, int len, int force));
+ int min_rows __ARGS((void));
+ int only_one_window __ARGS((void));
+ void check_lnums __ARGS((int do_curwin));
++void make_snapshot __ARGS((int idx));
++void restore_snapshot __ARGS((int idx, int close_curwin));
+ int win_hasvertsplit __ARGS((void));
+ int match_add __ARGS((win_T *wp, char_u *grp, char_u *pat, int prio, int id));
+ int match_delete __ARGS((win_T *wp, int id, int perr));
+ void clear_matches __ARGS((win_T *wp));
+ matchitem_T *get_match __ARGS((win_T *wp, int id));
+--- vim72.orig/src/pty.c
++++ vim72/src/pty.c
+@@ -268,13 +268,14 @@ OpenPTY(ttyn)
+     *ttyn = TtyName;
+     return f;
+ }
+ #endif
+-#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux)
++#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) && !defined(MACOS_X)
+-/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */
++/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work!
++ * Same for Mac OS X Leopard. */
+ #define PTY_DONE
+     int
+ OpenPTY(ttyn)
+     char **ttyn;
+ {
+--- vim72.orig/src/quickfix.c
++++ vim72/src/quickfix.c
+@@ -1417,11 +1417,13 @@ qf_jump(qi, dir, errornr, forceit)
+     char_u            *old_swb = p_swb;
+     unsigned          old_swb_flags = swb_flags;
+     int                       opened_window = FALSE;
+     win_T             *win;
+     win_T             *altwin;
++    int                       flags;
+ #endif
++    win_T             *oldwin = curwin;
+     int                       print_message = TRUE;
+     int                       len;
+ #ifdef FEAT_FOLDING
+     int                       old_KeyTyped = KeyTyped; /* getting file may reset it */
+ #endif
+@@ -1528,11 +1530,10 @@ qf_jump(qi, dir, errornr, forceit)
+      * For ":helpgrep" find a help window or open one.
+      */
+     if (qf_ptr->qf_type == 1 && (!curwin->w_buffer->b_help || cmdmod.tab != 0))
+     {
+       win_T   *wp;
+-      int     n;
+       if (cmdmod.tab != 0)
+           wp = NULL;
+       else
+           for (wp = firstwin; wp != NULL; wp = wp->w_next)
+@@ -1544,27 +1545,29 @@ qf_jump(qi, dir, errornr, forceit)
+       {
+           /*
+            * Split off help window; put it at far top if no position
+            * specified, the current window is vertically split and narrow.
+            */
+-          n = WSP_HELP;
++          flags = WSP_HELP;
+ # ifdef FEAT_VERTSPLIT
+           if (cmdmod.split == 0 && curwin->w_width != Columns
+                                                     && curwin->w_width < 80)
+-              n |= WSP_TOP;
++              flags |= WSP_TOP;
+ # endif
+-          if (win_split(0, n) == FAIL)
++          if (qi != &ql_info)
++              flags |= WSP_NEWLOC;  /* don't copy the location list */
++
++          if (win_split(0, flags) == FAIL)
+               goto theend;
+           opened_window = TRUE;       /* close it when fail */
+           if (curwin->w_height < p_hh)
+               win_setheight((int)p_hh);
+           if (qi != &ql_info)     /* not a quickfix list */
+           {
+               /* The new window should use the supplied location list */
+-              qf_free_all(curwin);
+               curwin->w_llist = qi;
+               qi->qf_refcount++;
+           }
+       }
+@@ -1607,24 +1610,28 @@ qf_jump(qi, dir, errornr, forceit)
+           {
+               if (wp->w_buffer->b_fnum == qf_ptr->qf_fnum)
+               {
+                   goto_tabpage_win(tp, wp);
+                   usable_win = 1;
+-                  break;
++                  goto win_found;
+               }
+           }
+       }
++win_found:
+       /*
+        * If there is only one window and it is the quickfix window, create a
+        * new one above the quickfix window.
+        */
+       if (((firstwin == lastwin) && bt_quickfix(curbuf)) || !usable_win)
+       {
+           ll_ref = curwin->w_llist_ref;
+-          if (win_split(0, WSP_ABOVE) == FAIL)
++          flags = WSP_ABOVE;
++          if (ll_ref != NULL)
++              flags |= WSP_NEWLOC;
++          if (win_split(0, flags) == FAIL)
+               goto failed;            /* not enough room for window */
+           opened_window = TRUE;       /* close it when fail */
+           p_swb = empty_option;       /* don't split again */
+           swb_flags = 0;
+ # ifdef FEAT_SCROLLBIND
+@@ -1632,11 +1639,10 @@ qf_jump(qi, dir, errornr, forceit)
+ # endif
+           if (ll_ref != NULL)
+           {
+               /* The new window should use the location list from the
+                * location list window */
+-              qf_free_all(curwin);
+               curwin->w_llist = ll_ref;
+               ll_ref->qf_refcount++;
+           }
+       }
+       else
+@@ -1742,11 +1748,12 @@ qf_jump(qi, dir, errornr, forceit)
+               EMSG(_(e_nowrtmsg));
+               ok = FALSE;
+           }
+           else
+               ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1,
+-                                                 ECMD_HIDE + ECMD_SET_HELP);
++                                         ECMD_HIDE + ECMD_SET_HELP,
++                                         oldwin == curwin ? curwin : NULL);
+       }
+       else
+           ok = buflist_getfile(qf_ptr->qf_fnum,
+                           (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
+     }
+@@ -1890,11 +1897,10 @@ qf_list(eap)
+     char_u    *fname;
+     qfline_T  *qfp;
+     int               i;
+     int               idx1 = 1;
+     int               idx2 = -1;
+-    int               need_return = TRUE;
+     char_u    *arg = eap->arg;
+     int               all = eap->forceit;     /* if not :cl!, only show
+                                                  recognised errors */
+     qf_info_T *qi = &ql_info;
+@@ -1930,17 +1936,13 @@ qf_list(eap)
+     qfp = qi->qf_lists[qi->qf_curlist].qf_start;
+     for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; )
+     {
+       if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2)
+       {
+-          if (need_return)
+-          {
+-              msg_putchar('\n');
+-              if (got_int)
+-                  break;
+-              need_return = FALSE;
+-          }
++          msg_putchar('\n');
++          if (got_int)
++              break;
+           fname = NULL;
+           if (qfp->qf_fnum != 0
+                             && (buf = buflist_findnr(qfp->qf_fnum)) != NULL)
+           {
+@@ -1979,11 +1981,10 @@ qf_list(eap)
+           qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
+                                    ? skipwhite(qfp->qf_text) : qfp->qf_text,
+                                                             IObuff, IOSIZE);
+           msg_prt_line(IObuff, FALSE);
+           out_flush();                /* show one line at a time */
+-          need_return = TRUE;
+       }
+       qfp = qfp->qf_next;
+       ++i;
+       ui_breakcheck();
+@@ -2231,11 +2232,10 @@ ex_cwindow(eap)
+ /*
+  * ":cclose": close the window showing the list of errors.
+  * ":lclose": close the window showing the location list
+  */
+-/*ARGSUSED*/
+     void
+ ex_cclose(eap)
+     exarg_T   *eap;
+ {
+     win_T     *win = NULL;
+@@ -2265,10 +2265,11 @@ ex_copen(eap)
+     qf_info_T *qi = &ql_info;
+     int               height;
+     win_T     *win;
+     tabpage_T *prevtab = curtab;
+     buf_T     *qf_buf;
++    win_T     *oldwin = curwin;
+     if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
+     {
+       qi = GET_LOC_LIST(curwin);
+       if (qi == NULL)
+@@ -2305,43 +2306,48 @@ ex_copen(eap)
+       win = curwin;
+       if (eap->cmdidx == CMD_copen || eap->cmdidx == CMD_cwindow)
+           /* Create the new window at the very bottom. */
+           win_goto(lastwin);
+-      if (win_split(height, WSP_BELOW) == FAIL)
++      if (win_split(height, WSP_BELOW | WSP_NEWLOC) == FAIL)
+           return;             /* not enough room for window */
+ #ifdef FEAT_SCROLLBIND
+       curwin->w_p_scb = FALSE;
+ #endif
+-      /* Remove the location list for the quickfix window */
+-      qf_free_all(curwin);
+-
+       if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
+       {
+           /*
+            * For the location list window, create a reference to the
+            * location list from the window 'win'.
+            */
+           curwin->w_llist_ref = win->w_llist;
+           win->w_llist->qf_refcount++;
+       }
++      if (oldwin != curwin)
++          oldwin = NULL;  /* don't store info when in another window */
+       if (qf_buf != NULL)
+           /* Use the existing quickfix buffer */
+           (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
+-                                                   ECMD_HIDE + ECMD_OLDBUF);
++                                           ECMD_HIDE + ECMD_OLDBUF, oldwin);
+       else
+       {
+           /* Create a new quickfix buffer */
+-          (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
++          (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin);
+           /* switch off 'swapfile' */
+           set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+           set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
+                                                                  OPT_LOCAL);
+           set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
+-          set_option_value((char_u *)"diff", 0L, NULL, OPT_LOCAL);
++#ifdef FEAT_DIFF
++          curwin->w_p_diff = FALSE;
++#endif
++#ifdef FEAT_FOLDING
++          set_option_value((char_u *)"fdm", 0L, (char_u *)"manual",
++                                                                 OPT_LOCAL);
++#endif
+       }
+       /* Only set the height when still in the same tab page and there is no
+        * window to the side. */
+       if (curtab == prevtab
+@@ -2598,14 +2604,16 @@ qf_fill_buffer(qi)
+      * autocommands. */
+     set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL);
+     curbuf->b_p_ma = FALSE;
+ #ifdef FEAT_AUTOCMD
++    keep_filetype = TRUE;             /* don't detect 'filetype' */
+     apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
+                                                              FALSE, curbuf);
+     apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL,
+                                                              FALSE, curbuf);
++    keep_filetype = FALSE;
+ #endif
+     /* make sure it will be redrawn */
+     redraw_curbuf_later(NOT_VALID);
+@@ -2757,11 +2765,11 @@ ex_make(eap)
+     if (cmd == NULL)
+       return;
+     sprintf((char *)cmd, "%s%s%s", (char *)p_shq, (char *)eap->arg,
+                                                              (char *)p_shq);
+     if (*p_sp != NUL)
+-      append_redir(cmd, p_sp, fname);
++      append_redir(cmd, len, p_sp, fname);
+     /*
+      * Output a newline if there's something else than the :make command that
+      * was typed (in which case the cursor is in column 0).
+      */
+     if (msg_col == 0)
+@@ -3194,11 +3202,11 @@ ex_vimgrep(eap)
+                   if ((flags & VGR_GLOBAL) == 0
+                                              || regmatch.endpos[0].lnum > 0)
+                       break;
+                   col = regmatch.endpos[0].col
+                                           + (col == regmatch.endpos[0].col);
+-                  if (col > STRLEN(ml_get_buf(buf, lnum, FALSE)))
++                  if (col > (colnr_T)STRLEN(ml_get_buf(buf, lnum, FALSE)))
+                       break;
+               }
+               line_breakcheck();
+               if (got_int)
+                   break;
+@@ -3395,18 +3403,19 @@ load_dummy_buffer(fname)
+       return NULL;
+     /* Init the options. */
+     buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP);
+-    /* set curwin/curbuf to buf and save a few things */
+-    aucmd_prepbuf(&aco, newbuf);
++    /* need to open the memfile before putting the buffer in a window */
++    if (ml_open(newbuf) == OK)
++    {
++      /* set curwin/curbuf to buf and save a few things */
++      aucmd_prepbuf(&aco, newbuf);
+-    /* Need to set the filename for autocommands. */
+-    (void)setfname(curbuf, fname, NULL, FALSE);
++      /* Need to set the filename for autocommands. */
++      (void)setfname(curbuf, fname, NULL, FALSE);
+-    if (ml_open(curbuf) == OK)
+-    {
+       /* Create swap file now to avoid the ATTENTION message. */
+       check_need_swap(TRUE);
+       /* Remove the "dummy" flag, otherwise autocommands may not
+        * work. */
+@@ -3425,14 +3434,14 @@ load_dummy_buffer(fname)
+               if (buf_valid(newbuf))
+                   wipe_buffer(newbuf, FALSE);
+               newbuf = curbuf;
+           }
+       }
+-    }
+-    /* restore curwin/curbuf and a few other things */
+-    aucmd_restbuf(&aco);
++      /* restore curwin/curbuf and a few other things */
++      aucmd_restbuf(&aco);
++    }
+     if (!buf_valid(newbuf))
+       return NULL;
+     if (failed)
+     {
+--- vim72.orig/src/regexp.c
++++ vim72/src/regexp.c
+@@ -469,11 +469,11 @@ get_char_class(pp)
+ #define CLASS_NONE 99
+     int i;
+     if ((*pp)[1] == ':')
+     {
+-      for (i = 0; i < sizeof(class_names) / sizeof(*class_names); ++i)
++      for (i = 0; i < (int)(sizeof(class_names) / sizeof(*class_names)); ++i)
+           if (STRNCMP(*pp + 2, class_names[i], STRLEN(class_names[i])) == 0)
+           {
+               *pp += STRLEN(class_names[i]) + 2;
+               return i;
+           }
+@@ -581,10 +581,11 @@ static int       regnpar;        /* () count. */
+ static int    regnzpar;       /* \z() count. */
+ static int    re_has_z;       /* \z item detected */
+ #endif
+ static char_u *regcode;       /* Code-emit pointer, or JUST_CALC_SIZE */
+ static long   regsize;        /* Code size. */
++static int    reg_toolong;    /* TRUE when offset out of range */
+ static char_u had_endbrace[NSUBEXP];  /* flags, TRUE if end of () found */
+ static unsigned       regflags;       /* RF_ flags for prog */
+ static long   brace_min[10];  /* Minimums for complex brace repeats */
+ static long   brace_max[10];  /* Maximums for complex brace repeats */
+ static int    brace_count[10]; /* Current counts for complex brace repeats */
+@@ -1026,13 +1027,15 @@ vim_regcomp(expr, re_flags)
+      * Second pass: emit code.
+      */
+     regcomp_start(expr, re_flags);
+     regcode = r->program;
+     regc(REGMAGIC);
+-    if (reg(REG_NOPAREN, &flags) == NULL)
++    if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong)
+     {
+       vim_free(r);
++      if (reg_toolong)
++          EMSG_RET_NULL(_("E339: Pattern too long"));
+       return NULL;
+     }
+     /* Dig out information for optimizations. */
+     r->regstart = NUL;                /* Worst-case defaults. */
+@@ -1139,10 +1142,11 @@ regcomp_start(expr, re_flags)
+ #ifdef FEAT_SYN_HL
+     regnzpar = 1;
+     re_has_z = 0;
+ #endif
+     regsize = 0L;
++    reg_toolong = FALSE;
+     regflags = 0;
+ #if defined(FEAT_SYN_HL) || defined(PROTO)
+     had_eol = FALSE;
+ #endif
+ }
+@@ -1226,11 +1230,11 @@ reg(paren, flagp)
+     *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
+     while (peekchr() == Magic('|'))
+     {
+       skipchr();
+       br = regbranch(&flags);
+-      if (br == NULL)
++      if (br == NULL || reg_toolong)
+           return NULL;
+       regtail(ret, br);       /* BRANCH -> BRANCH. */
+       if (!(flags & HASWIDTH))
+           *flagp &= ~HASWIDTH;
+       *flagp |= flags & (SPSTART | HASNL | HASLOOKBH);
+@@ -1311,10 +1315,12 @@ regbranch(flagp)
+           regtail(chain, latest);
+       if (peekchr() != Magic('&'))
+           break;
+       skipchr();
+       regtail(latest, regnode(END)); /* operand ends */
++      if (reg_toolong)
++          break;
+       reginsert(MATCH, latest);
+       chain = latest;
+     }
+     return ret;
+@@ -1380,11 +1386,11 @@ regconcat(flagp)
+                           skipchr_keepstart();
+                           curchr = -1;
+                           break;
+           default:
+                           latest = regpiece(&flags);
+-                          if (latest == NULL)
++                          if (latest == NULL || reg_toolong)
+                               return NULL;
+                           *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH);
+                           if (chain == NULL)  /* First piece. */
+                               *flagp |= flags & SPSTART;
+                           else
+@@ -2538,12 +2544,20 @@ regtail(p, val)
+     if (OP(scan) == BACK)
+       offset = (int)(scan - val);
+     else
+       offset = (int)(val - scan);
+-    *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
+-    *(scan + 2) = (char_u) (offset & 0377);
++    /* When the offset uses more than 16 bits it can no longer fit in the two
++     * bytes avaliable.  Use a global flag to avoid having to check return
++     * values in too many places. */
++    if (offset > 0xffff)
++      reg_toolong = TRUE;
++    else
++    {
++      *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377);
++      *(scan + 2) = (char_u) (offset & 0377);
++    }
+ }
+ /*
+  * regoptail - regtail on item after a BRANCH; nop if none
+  */
+@@ -3360,16 +3374,15 @@ vim_regexec_multi(rmp, win, buf, lnum, c
+ /*
+  * Match a regexp against a string ("line" points to the string) or multiple
+  * lines ("line" is NULL, use reg_getline()).
+  */
+-/*ARGSUSED*/
+     static long
+ vim_regexec_both(line, col, tm)
+     char_u    *line;
+     colnr_T   col;            /* column to start looking for match */
+-    proftime_T        *tm;            /* timeout limit or NULL */
++    proftime_T        *tm UNUSED;     /* timeout limit or NULL */
+ {
+     regprog_T *prog;
+     char_u    *s;
+     long      retval = 0L;
+@@ -4530,11 +4543,11 @@ regmatch(scan)
+               no = op - BACKREF;
+               cleanup_subexpr();
+               if (!REG_MULTI)         /* Single-line regexp */
+               {
+-                  if (reg_endp[no] == NULL)
++                  if (reg_startp[no] == NULL || reg_endp[no] == NULL)
+                   {
+                       /* Backref was not set: Match an empty string. */
+                       len = 0;
+                   }
+                   else
+@@ -4546,11 +4559,11 @@ regmatch(scan)
+                           status = RA_NOMATCH;
+                   }
+               }
+               else                            /* Multi-line regexp */
+               {
+-                  if (reg_endpos[no].lnum < 0)
++                  if (reg_startpos[no].lnum < 0 || reg_endpos[no].lnum < 0)
+                   {
+                       /* Backref was not set: Match an empty string. */
+                       len = 0;
+                   }
+                   else
+@@ -5763,18 +5776,20 @@ do_class:
+     return (int)count;
+ }
+ /*
+  * regnext - dig the "next" pointer out of a node
++ * Returns NULL when calculating size, when there is no next item and when
++ * there is an error.
+  */
+     static char_u *
+ regnext(p)
+     char_u  *p;
+ {
+     int           offset;
+-    if (p == JUST_CALC_SIZE)
++    if (p == JUST_CALC_SIZE || reg_toolong)
+       return NULL;
+     offset = NEXT(p);
+     if (offset == 0)
+       return NULL;
+@@ -6811,10 +6826,12 @@ static int can_f_submatch = FALSE;     /* TR
+ /* These pointers are used instead of reg_match and reg_mmatch for
+  * reg_submatch().  Needed for when the substitution string is an expression
+  * that contains a call to substitute() and submatch(). */
+ static regmatch_T     *submatch_match;
+ static regmmatch_T    *submatch_mmatch;
++static linenr_T               submatch_firstlnum;
++static linenr_T               submatch_maxline;
+ #endif
+ #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * vim_regsub() - perform substitutions after a vim_regexec() or
+@@ -6924,11 +6941,10 @@ vim_regsub_both(source, dest, copy, magi
+               eval_result = NULL;
+           }
+       }
+       else
+       {
+-          linenr_T    save_reg_maxline;
+           win_T       *save_reg_win;
+           int         save_ireg_ic;
+           vim_free(eval_result);
+@@ -6936,34 +6952,51 @@ vim_regsub_both(source, dest, copy, magi
+            * recursively.  Make sure submatch() gets the text from the first
+            * level.  Don't need to save "reg_buf", because
+            * vim_regexec_multi() can't be called recursively. */
+           submatch_match = reg_match;
+           submatch_mmatch = reg_mmatch;
+-          save_reg_maxline = reg_maxline;
++          submatch_firstlnum = reg_firstlnum;
++          submatch_maxline = reg_maxline;
+           save_reg_win = reg_win;
+           save_ireg_ic = ireg_ic;
+           can_f_submatch = TRUE;
+           eval_result = eval_to_string(source + 2, NULL, TRUE);
+           if (eval_result != NULL)
+           {
++              int had_backslash = FALSE;
++
+               for (s = eval_result; *s != NUL; mb_ptr_adv(s))
+               {
+                   /* Change NL to CR, so that it becomes a line break.
+                    * Skip over a backslashed character. */
+                   if (*s == NL)
+                       *s = CAR;
+                   else if (*s == '\\' && s[1] != NUL)
++                  {
+                       ++s;
++                      had_backslash = TRUE;
++                  }
++              }
++              if (had_backslash && backslash)
++              {
++                  /* Backslashes will be consumed, need to double them. */
++                  s = vim_strsave_escaped(eval_result, (char_u *)"\\");
++                  if (s != NULL)
++                  {
++                      vim_free(eval_result);
++                      eval_result = s;
++                  }
+               }
+               dst += STRLEN(eval_result);
+           }
+           reg_match = submatch_match;
+           reg_mmatch = submatch_mmatch;
+-          reg_maxline = save_reg_maxline;
++          reg_firstlnum = submatch_firstlnum;
++          reg_maxline = submatch_maxline;
+           reg_win = save_reg_win;
+           ireg_ic = save_ireg_ic;
+           can_f_submatch = FALSE;
+       }
+ #endif
+@@ -7194,10 +7227,35 @@ vim_regsub_both(source, dest, copy, magi
+ exit:
+     return (int)((dst - dest) + 1);
+ }
+ #ifdef FEAT_EVAL
++static char_u *reg_getline_submatch __ARGS((linenr_T lnum));
++
++/*
++ * Call reg_getline() with the line numbers from the submatch.  If a
++ * substitute() was used the reg_maxline and other values have been
++ * overwritten.
++ */
++    static char_u *
++reg_getline_submatch(lnum)
++    linenr_T  lnum;
++{
++    char_u *s;
++    linenr_T save_first = reg_firstlnum;
++    linenr_T save_max = reg_maxline;
++
++    reg_firstlnum = submatch_firstlnum;
++    reg_maxline = submatch_maxline;
++
++    s = reg_getline(lnum);
++
++    reg_firstlnum = save_first;
++    reg_maxline = save_max;
++    return s;
++}
++
+ /*
+  * Used for the submatch() function: get the string from the n'th submatch in
+  * allocated memory.
+  * Returns NULL when not in a ":s" command and for a non-existing submatch.
+  */
+@@ -7224,11 +7282,11 @@ reg_submatch(no)
+       {
+           lnum = submatch_mmatch->startpos[no].lnum;
+           if (lnum < 0 || submatch_mmatch->endpos[no].lnum < 0)
+               return NULL;
+-          s = reg_getline(lnum) + submatch_mmatch->startpos[no].col;
++          s = reg_getline_submatch(lnum) + submatch_mmatch->startpos[no].col;
+           if (s == NULL)  /* anti-crash check, cannot happen? */
+               break;
+           if (submatch_mmatch->endpos[no].lnum == lnum)
+           {
+               /* Within one line: take form start to end col. */
+@@ -7250,20 +7308,20 @@ reg_submatch(no)
+               }
+               ++len;
+               ++lnum;
+               while (lnum < submatch_mmatch->endpos[no].lnum)
+               {
+-                  s = reg_getline(lnum++);
++                  s = reg_getline_submatch(lnum++);
+                   if (round == 2)
+                       STRCPY(retval + len, s);
+                   len += (int)STRLEN(s);
+                   if (round == 2)
+                       retval[len] = '\n';
+                   ++len;
+               }
+               if (round == 2)
+-                  STRNCPY(retval + len, reg_getline(lnum),
++                  STRNCPY(retval + len, reg_getline_submatch(lnum),
+                                            submatch_mmatch->endpos[no].col);
+               len += submatch_mmatch->endpos[no].col;
+               if (round == 2)
+                   retval[len] = NUL;
+               ++len;
+@@ -7277,17 +7335,15 @@ reg_submatch(no)
+           }
+       }
+     }
+     else
+     {
+-      if (submatch_match->endp[no] == NULL)
++      s = submatch_match->startp[no];
++      if (s == NULL || submatch_match->endp[no] == NULL)
+           retval = NULL;
+       else
+-      {
+-          s = submatch_match->startp[no];
+           retval = vim_strnsave(s, (int)(submatch_match->endp[no] - s));
+-      }
+     }
+     return retval;
+ }
+ #endif
+--- vim72.orig/src/screen.c
++++ vim72/src/screen.c
+@@ -23,14 +23,15 @@
+  *
+  * For double-byte characters, two consecutive bytes in ScreenLines[] can form
+  * one character which occupies two display cells.
+  * For UTF-8 a multi-byte character is converted to Unicode and stored in
+  * ScreenLinesUC[].  ScreenLines[] contains the first byte only.  For an ASCII
+- * character without composing chars ScreenLinesUC[] will be 0.  When the
+- * character occupies two display cells the next byte in ScreenLines[] is 0.
++ * character without composing chars ScreenLinesUC[] will be 0 and
++ * ScreenLinesC[][] is not used.  When the character occupies two display
++ * cells the next byte in ScreenLines[] is 0.
+  * ScreenLinesC[][] contain up to 'maxcombine' composing characters
+- * (drawn on top of the first character).  They are 0 when not used.
++ * (drawn on top of the first character).  There is 0 after the last one used.
+  * ScreenLines2[] is only used for euc-jp to store the second byte if the
+  * first byte is 0x8e (single-width character).
+  *
+  * The screen_*() functions write to the screen and handle updating
+  * ScreenLines[].
+@@ -130,11 +131,11 @@ static void screen_line __ARGS((int row,
+ #endif
+ #ifdef FEAT_VERTSPLIT
+ static void draw_vsep_win __ARGS((win_T *wp, int row));
+ #endif
+ #ifdef FEAT_STL_OPT
+-static void redraw_custum_statusline __ARGS((win_T *wp));
++static void redraw_custom_statusline __ARGS((win_T *wp));
+ #endif
+ #ifdef FEAT_SEARCH_EXTRA
+ #define SEARCH_HL_PRIORITY 0
+ static void start_search_hl __ARGS((void));
+ static void end_search_hl __ARGS((void));
+@@ -268,15 +269,14 @@ redraw_buf_later(buf, type)
+  * Used when entering/leaving Insert mode with the cursor on a folded line.
+  * Used to remove the "$" from a change command.
+  * Note that when also inserting/deleting lines w_redraw_top and w_redraw_bot
+  * may become invalid and the whole window will have to be redrawn.
+  */
+-/*ARGSUSED*/
+     void
+ redrawWinline(lnum, invalid)
+     linenr_T  lnum;
+-    int               invalid;        /* window line height is invalid now */
++    int               invalid UNUSED; /* window line height is invalid now */
+ {
+ #ifdef FEAT_FOLDING
+     int               i;
+ #endif
+@@ -322,10 +322,11 @@ update_screen(type)
+     static int        did_intro = FALSE;
+ #if defined(FEAT_SEARCH_EXTRA) || defined(FEAT_CLIPBOARD)
+     int               did_one;
+ #endif
++    /* Don't do anything if the screen structures are (not yet) valid. */
+     if (!screen_valid(TRUE))
+       return;
+     if (must_redraw)
+     {
+@@ -341,11 +342,13 @@ update_screen(type)
+     /* Need to update w_lines[]. */
+     if (curwin->w_lines_valid == 0 && type < NOT_VALID)
+       type = NOT_VALID;
+-    if (!redrawing())
++    /* Postpone the redrawing when it's not needed and when being called
++     * recursively. */
++    if (!redrawing() || updating_screen)
+     {
+       redraw_later(type);             /* remember type for next time */
+       must_redraw = type;
+       if (type > INVERTED_ALL)
+           curwin->w_lines_valid = 0;  /* don't use w_lines[].wl_size now */
+@@ -581,10 +584,11 @@ update_screen(type)
+ static void update_prepare __ARGS((void));
+ static void update_finish __ARGS((void));
+ /*
+  * Prepare for updating one or more windows.
++ * Caller must check for "updating_screen" already set to avoid recursiveness.
+  */
+     static void
+ update_prepare()
+ {
+     cursor_off();
+@@ -662,11 +666,13 @@ update_debug_sign(buf, lnum)
+           redraw_win_later(wp, VALID);
+       if (wp->w_redr_type != 0)
+           doit = TRUE;
+     }
+-    if (!doit)
++    /* Return when there is nothing to do or screen updating already
++     * happening. */
++    if (!doit || updating_screen)
+       return;
+     /* update all windows that need updating */
+     update_prepare();
+@@ -695,10 +701,14 @@ update_debug_sign(buf, lnum)
+  */
+     void
+ updateWindow(wp)
+     win_T     *wp;
+ {
++    /* return if already busy updating */
++    if (updating_screen)
++      return;
++
+     update_prepare();
+ #ifdef FEAT_CLIPBOARD
+     /* When Visual area changed, may have to update selection. */
+     if (clip_star.available && clip_isautosel())
+@@ -2324,17 +2334,16 @@ fold_line(wp, fold_count, foldinfo, lnum
+                   }
+               }
+               if (cells > 1)
+                   ScreenLines[idx + 1] = 0;
+           }
+-          else if (cells > 1)     /* double-byte character */
+-          {
+-              if (enc_dbcs == DBCS_JPNU && *p == 0x8e)
+-                  ScreenLines2[idx] = p[1];
+-              else
+-                  ScreenLines[idx + 1] = p[1];
+-          }
++          else if (enc_dbcs == DBCS_JPNU && *p == 0x8e)
++              /* double-byte single width character */
++              ScreenLines2[idx] = p[1];
++          else if (cells > 1)
++              /* double-width character */
++              ScreenLines[idx + 1] = p[1];
+           col += cells;
+           idx += cells;
+           p += c_len;
+       }
+     }
+@@ -2411,11 +2420,11 @@ fold_line(wp, fold_count, foldinfo, lnum
+                           || (lnum == top->lnum
+                               && top->col == 0))
+                       && (lnume < bot->lnum
+                           || (lnume == bot->lnum
+                               && (bot->col - (*p_sel == 'e'))
+-              >= STRLEN(ml_get_buf(wp->w_buffer, lnume, FALSE)))))))
++              >= (colnr_T)STRLEN(ml_get_buf(wp->w_buffer, lnume, FALSE)))))))
+       {
+           if (VIsual_mode == Ctrl_V)
+           {
+               /* Visual block mode: highlight the chars part of the block */
+               if (wp->w_old_cursor_fcol + txtcol < (colnr_T)W_WIDTH(wp))
+@@ -2437,13 +2446,21 @@ fold_line(wp, fold_count, foldinfo, lnum
+     }
+ #endif
+ #ifdef FEAT_SYN_HL
+     /* Show 'cursorcolumn' in the fold line. */
+-    if (wp->w_p_cuc && (int)wp->w_virtcol + txtcol < W_WIDTH(wp))
+-      ScreenAttrs[off + wp->w_virtcol + txtcol] = hl_combine_attr(
+-               ScreenAttrs[off + wp->w_virtcol + txtcol], hl_attr(HLF_CUC));
++    if (wp->w_p_cuc)
++    {
++      txtcol += wp->w_virtcol;
++      if (wp->w_p_wrap)
++          txtcol -= wp->w_skipcol;
++      else
++          txtcol -= wp->w_leftcol;
++      if (txtcol >= 0 && txtcol < W_WIDTH(wp))
++          ScreenAttrs[off + txtcol] = hl_combine_attr(
++                               ScreenAttrs[off + txtcol], hl_attr(HLF_CUC));
++    }
+ #endif
+     SCREEN_LINE(row + W_WINROW(wp), W_WINCOL(wp), (int)W_WIDTH(wp),
+                                                    (int)W_WIDTH(wp), FALSE);
+@@ -2539,18 +2556,17 @@ fill_foldcolumn(p, wp, closed, lnum)
+  * Start at row "startrow", stop when "endrow" is reached.
+  * wp->w_virtcol needs to be valid.
+  *
+  * Return the number of last row the line occupies.
+  */
+-/* ARGSUSED */
+     static int
+ win_line(wp, lnum, startrow, endrow, nochange)
+     win_T     *wp;
+     linenr_T  lnum;
+     int               startrow;
+     int               endrow;
+-    int               nochange;               /* not updating for changed text */
++    int               nochange UNUSED;        /* not updating for changed text */
+ {
+     int               col;                    /* visual column on screen */
+     unsigned  off;                    /* offset in ScreenLines/ScreenAttrs */
+     int               c = 0;                  /* init for GCC */
+     long      vcol = 0;               /* virtual column (for tabs) */
+@@ -2586,10 +2602,11 @@ win_line(wp, lnum, startrow, endrow, noc
+     int               fromcol, tocol;         /* start/end of inverting */
+     int               fromcol_prev = -2;      /* start of inverting after cursor */
+     int               noinvcur = FALSE;       /* don't invert the cursor */
+ #ifdef FEAT_VISUAL
+     pos_T     *top, *bot;
++    int               lnum_in_visual_area = FALSE;
+ #endif
+     pos_T     pos;
+     long      v;
+     int               char_attr = 0;          /* attributes for next character */
+@@ -2782,13 +2799,14 @@ win_line(wp, lnum, startrow, endrow, noc
+       else                            /* Visual is before curwin->w_cursor */
+       {
+           top = &VIsual;
+           bot = &curwin->w_cursor;
+       }
++      lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum);
+       if (VIsual_mode == Ctrl_V)      /* block mode */
+       {
+-          if (lnum >= top->lnum && lnum <= bot->lnum)
++          if (lnum_in_visual_area)
+           {
+               fromcol = wp->w_old_cursor_fcol;
+               tocol = wp->w_old_cursor_lcol;
+           }
+       }
+@@ -2877,12 +2895,13 @@ win_line(wp, lnum, startrow, endrow, noc
+           pos.col = search_match_endcol;
+           getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL);
+       }
+       else
+           tocol = MAXCOL;
+-      if (fromcol == tocol)           /* do at least one character */
+-          tocol = fromcol + 1;        /* happens when past end of line */
++      /* do at least one character; happens when past end of line */
++      if (fromcol == tocol)
++          tocol = fromcol + 1;
+       area_highlighting = TRUE;
+       attr = hl_attr(HLF_I);
+     }
+ #ifdef FEAT_DIFF
+@@ -2997,15 +3016,37 @@ win_line(wp, lnum, startrow, endrow, noc
+           prev_ptr = ptr;
+ #endif
+           mb_ptr_adv(ptr);
+       }
+-#ifdef FEAT_VIRTUALEDIT
+-      /* When 'virtualedit' is set the end of the line may be before the
+-       * start of the displayed part. */
+-      if (vcol < v && *ptr == NUL && virtual_active())
++#if defined(FEAT_SYN_HL) || defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
++      /* When:
++       * - 'cuc' is set, or
++       * - 'virtualedit' is set, or
++       * - the visual mode is active,
++       * the end of the line may be before the start of the displayed part.
++       */
++      if (vcol < v && (
++# ifdef FEAT_SYN_HL
++           wp->w_p_cuc
++#  if defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
++           ||
++#  endif
++# endif
++# ifdef FEAT_VIRTUALEDIT
++           virtual_active()
++#  ifdef FEAT_VISUAL
++           ||
++#  endif
++# endif
++# ifdef FEAT_VISUAL
++           (VIsual_active && wp->w_buffer == curwin->w_buffer)
++# endif
++           ))
++      {
+           vcol = v;
++      }
+ #endif
+       /* Handle a character that's not completely on the screen: Put ptr at
+        * that character but skip the first few screen characters. */
+       if (vcol > v)
+@@ -3410,10 +3451,11 @@ win_line(wp, lnum, startrow, endrow, noc
+ #ifdef FEAT_MBYTE
+                   || (has_mbyte && vcol + 1 == fromcol && n_extra == 0
+                       && (*mb_ptr2cells)(ptr) > 1)
+ #endif
+                   || ((int)vcol_prev == fromcol_prev
++                      && vcol_prev < vcol     /* not at margin */
+                       && vcol < tocol))
+               area_attr = attr;               /* start highlighting */
+           else if (area_attr != 0
+                   && (vcol == tocol
+                       || (noinvcur && (colnr_T)vcol == wp->w_virtcol)))
+@@ -3542,11 +3584,12 @@ win_line(wp, lnum, startrow, endrow, noc
+               char_attr = search_attr;
+ #ifdef LINE_ATTR
+               /* Use line_attr when not in the Visual or 'incsearch' area
+                * (area_attr may be 0 when "noinvcur" is set). */
+           else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL)
+-                                      || (vcol < fromcol || vcol >= tocol)))
++                              || vcol < fromcol || vcol_prev < fromcol_prev
++                              || vcol >= tocol))
+               char_attr = line_attr;
+ #endif
+           else
+           {
+               attr_pri = FALSE;
+@@ -4104,10 +4147,11 @@ win_line(wp, lnum, startrow, endrow, noc
+ # ifdef FEAT_RIGHTLEFT
+                                   wp->w_p_rl ? (col >= 0) :
+ # endif
+                                   (col < W_WIDTH(wp)))
+                               && !(noinvcur
++                                  && lnum == wp->w_cursor.lnum
+                                   && (colnr_T)vcol == wp->w_virtcol)))
+                       && lcs_eol_one >= 0)
+               {
+                   /* Display a '$' after the line or highlight an extra
+                    * character if the line break is included. */
+@@ -4245,20 +4289,20 @@ win_line(wp, lnum, startrow, endrow, noc
+ #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+       /* XIM don't send preedit_start and preedit_end, but they send
+        * preedit_changed and commit.  Thus Vim can't set "im_is_active", use
+        * im_is_preediting() here. */
+       if (xic != NULL
+-              && lnum == curwin->w_cursor.lnum
++              && lnum == wp->w_cursor.lnum
+               && (State & INSERT)
+               && !p_imdisable
+               && im_is_preediting()
+               && draw_state == WL_LINE)
+       {
+           colnr_T tcol;
+           if (preedit_end_col == MAXCOL)
+-              getvcol(curwin, &(curwin->w_cursor), &tcol, NULL, NULL);
++              getvcol(curwin, &(wp->w_cursor), &tcol, NULL, NULL);
+           else
+               tcol = preedit_end_col;
+           if ((long)preedit_start_col <= vcol && vcol < (long)tcol)
+           {
+               if (feedback_old_attr < 0)
+@@ -4351,11 +4395,17 @@ win_line(wp, lnum, startrow, endrow, noc
+                   cur = cur->next;
+               }
+           }
+ #endif
+           if (lcs_eol == lcs_eol_one
+-                  && ((area_attr != 0 && vcol == fromcol && c == NUL)
++                  && ((area_attr != 0 && vcol == fromcol
++#ifdef FEAT_VISUAL
++                          && (VIsual_mode != Ctrl_V
++                              || lnum == VIsual.lnum
++                              || lnum == curwin->w_cursor.lnum)
++#endif
++                          && c == NUL)
+ #ifdef FEAT_SEARCH_EXTRA
+                       /* highlight 'hlsearch' match at end of line */
+                       || (prevcol_hl_flag == TRUE
+ # if defined(LINE_ATTR)
+                           && did_line_attr <= 1
+@@ -4445,11 +4495,12 @@ win_line(wp, lnum, startrow, endrow, noc
+        * At end of the text line.
+        */
+       if (c == NUL)
+       {
+ #ifdef FEAT_SYN_HL
+-          if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol)
++          if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol
++                  && lnum == wp->w_cursor.lnum)
+           {
+               /* highlight last char after line */
+               --col;
+               --off;
+               --vcol;
+@@ -4547,11 +4598,12 @@ win_line(wp, lnum, startrow, endrow, noc
+ #ifdef FEAT_SYN_HL
+       /* Highlight the cursor column if 'cursorcolumn' is set.  But don't
+        * highlight the cursor position itself. */
+       if (wp->w_p_cuc && vcol == (long)wp->w_virtcol
+               && lnum != wp->w_cursor.lnum
+-              && draw_state == WL_LINE)
++              && draw_state == WL_LINE
++              && !lnum_in_visual_area)
+       {
+           vcol_save_attr = char_attr;
+           char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC));
+       }
+       else
+@@ -4577,11 +4629,15 @@ win_line(wp, lnum, startrow, endrow, noc
+           }
+ #endif
+           ScreenLines[off] = c;
+ #ifdef FEAT_MBYTE
+           if (enc_dbcs == DBCS_JPNU)
++          {
++              if ((mb_c & 0xff00) == 0x8e00)
++                  ScreenLines[off] = 0x8e;
+               ScreenLines2[off] = mb_c & 0xff;
++          }
+           else if (enc_utf8)
+           {
+               if (mb_utf8)
+               {
+                   int i;
+@@ -4650,11 +4706,11 @@ win_line(wp, lnum, startrow, endrow, noc
+       }
+       else
+           --n_skip;
+       /* Only advance the "vcol" when after the 'number' column. */
+-      if (draw_state >= WL_SBR
++      if (draw_state > WL_NR
+ #ifdef FEAT_DIFF
+               && filler_todo <= 0
+ #endif
+               )
+           ++vcol;
+@@ -4836,10 +4892,11 @@ win_line(wp, lnum, startrow, endrow, noc
+ #ifdef FEAT_MBYTE
+ static int comp_char_differs __ARGS((int, int));
+ /*
+  * Return if the composing characters at "off_from" and "off_to" differ.
++ * Only to be used when ScreenLinesUC[off_from] != 0.
+  */
+     static int
+ comp_char_differs(off_from, off_to)
+     int           off_from;
+     int           off_to;
+@@ -5117,12 +5174,12 @@ screen_line(row, coloff, endcol, clear_w
+           if (char_cells == 2)
+               ScreenLines[off_to + 1] = ScreenLines[off_from + 1];
+ #endif
+ #if defined(FEAT_GUI) || defined(UNIX)
+-          /* The bold trick makes a single row of pixels appear in the next
+-           * character.  When a bold character is removed, the next
++          /* The bold trick makes a single column of pixels appear in the
++           * next character.  When a bold character is removed, the next
+            * character should be redrawn too.  This happens for our own GUI
+            * and for some xterms. */
+           if (
+ # ifdef FEAT_GUI
+                   gui.in_use
+@@ -5721,10 +5778,17 @@ win_redr_status(wp)
+     char_u    *p;
+     int               len;
+     int               fillchar;
+     int               attr;
+     int               this_ru_col;
++    static int  busy = FALSE;
++
++    /* It's possible to get here recursively when 'statusline' (indirectly)
++     * invokes ":redrawstatus".  Simply ignore the call then. */
++    if (busy)
++      return;
++    busy = TRUE;
+     wp->w_redr_status = FALSE;
+     if (wp->w_status_height == 0)
+     {
+       /* no status line, can only be last window */
+@@ -5743,11 +5807,11 @@ win_redr_status(wp)
+     }
+ #ifdef FEAT_STL_OPT
+     else if (*p_stl != NUL || *wp->w_p_stl != NUL)
+     {
+       /* redraw custom status line */
+-      redraw_custum_statusline(wp);
++      redraw_custom_statusline(wp);
+     }
+ #endif
+     else
+     {
+       fillchar = fillchar_status(&attr, wp == curwin);
+@@ -5859,30 +5923,44 @@ win_redr_status(wp)
+           fillchar = fillchar_vsep(&attr);
+       screen_putchar(fillchar, W_WINROW(wp) + wp->w_height, W_ENDCOL(wp),
+                                                                       attr);
+     }
+ #endif
++    busy = FALSE;
+ }
+ #ifdef FEAT_STL_OPT
+ /*
+  * Redraw the status line according to 'statusline' and take care of any
+  * errors encountered.
+  */
+     static void
+-redraw_custum_statusline(wp)
++redraw_custom_statusline(wp)
+     win_T         *wp;
+ {
+-    int       save_called_emsg = called_emsg;
++    static int            entered = FALSE;
++    int                   save_called_emsg = called_emsg;
++
++    /* When called recursively return.  This can happen when the statusline
++     * contains an expression that triggers a redraw. */
++    if (entered)
++      return;
++    entered = TRUE;
+     called_emsg = FALSE;
+     win_redr_custom(wp, FALSE);
+     if (called_emsg)
++    {
++      /* When there is an error disable the statusline, otherwise the
++       * display is messed up with errors and a redraw triggers the problem
++       * again and again. */
+       set_string_option_direct((char_u *)"statusline", -1,
+               (char_u *)"", OPT_FREE | (*wp->w_p_stl != NUL
+                                       ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR);
++    }
+     called_emsg |= save_called_emsg;
++    entered = FALSE;
+ }
+ #endif
+ # ifdef FEAT_VERTSPLIT
+ /*
+@@ -5986,20 +6064,21 @@ win_redr_custom(wp, draw_ruler)
+     int               width;
+     int               n;
+     int               len;
+     int               fillchar;
+     char_u    buf[MAXPATHL];
++    char_u    *stl;
+     char_u    *p;
+     struct    stl_hlrec hltab[STL_MAX_ITEM];
+     struct    stl_hlrec tabtab[STL_MAX_ITEM];
+     int               use_sandbox = FALSE;
+     /* setup environment for the task at hand */
+     if (wp == NULL)
+     {
+       /* Use 'tabline'.  Always at the first line of the screen. */
+-      p = p_tal;
++      stl = p_tal;
+       row = 0;
+       fillchar = ' ';
+       attr = hl_attr(HLF_TPF);
+       maxwidth = Columns;
+ # ifdef FEAT_EVAL
+@@ -6012,21 +6091,21 @@ win_redr_custom(wp, draw_ruler)
+       fillchar = fillchar_status(&attr, wp == curwin);
+       maxwidth = W_WIDTH(wp);
+       if (draw_ruler)
+       {
+-          p = p_ruf;
++          stl = p_ruf;
+           /* advance past any leading group spec - implicit in ru_col */
+-          if (*p == '%')
++          if (*stl == '%')
+           {
+-              if (*++p == '-')
+-                  p++;
+-              if (atoi((char *) p))
+-                  while (VIM_ISDIGIT(*p))
+-                      p++;
+-              if (*p++ != '(')
+-                  p = p_ruf;
++              if (*++stl == '-')
++                  stl++;
++              if (atoi((char *)stl))
++                  while (VIM_ISDIGIT(*stl))
++                      stl++;
++              if (*stl++ != '(')
++                  stl = p_ruf;
+           }
+ #ifdef FEAT_VERTSPLIT
+           col = ru_col - (Columns - W_WIDTH(wp));
+           if (col < (W_WIDTH(wp) + 1) / 2)
+               col = (W_WIDTH(wp) + 1) / 2;
+@@ -6051,13 +6130,13 @@ win_redr_custom(wp, draw_ruler)
+ # endif
+       }
+       else
+       {
+           if (*wp->w_p_stl != NUL)
+-              p = wp->w_p_stl;
++              stl = wp->w_p_stl;
+           else
+-              p = p_stl;
++              stl = p_stl;
+ # ifdef FEAT_EVAL
+           use_sandbox = was_set_insecurely((char_u *)"statusline",
+                                        *wp->w_p_stl == NUL ? 0 : OPT_LOCAL);
+ # endif
+       }
+@@ -6068,17 +6147,21 @@ win_redr_custom(wp, draw_ruler)
+     }
+     if (maxwidth <= 0)
+       return;
++    /* Make a copy, because the statusline may include a function call that
++     * might change the option value and free the memory. */
++    stl = vim_strsave(stl);
+     width = build_stl_str_hl(wp == NULL ? curwin : wp,
+                               buf, sizeof(buf),
+-                              p, use_sandbox,
++                              stl, use_sandbox,
+                               fillchar, maxwidth, hltab, tabtab);
++    vim_free(stl);
+     len = (int)STRLEN(buf);
+-    while (width < maxwidth && len < sizeof(buf) - 1)
++    while (width < maxwidth && len < (int)sizeof(buf) - 1)
+     {
+ #ifdef FEAT_MBYTE
+       len += (*mb_char2bytes)(fillchar, buf + len);
+ #else
+       buf[len++] = fillchar;
+@@ -6198,10 +6281,11 @@ screen_getbytes(row, col, bytes, attrp)
+ static int screen_comp_differs __ARGS((int, int*));
+ /*
+  * Return TRUE if composing characters for screen posn "off" differs from
+  * composing characters in "u8cc".
++ * Only to be used when ScreenLinesUC[off] != 0.
+  */
+     static int
+ screen_comp_differs(off, u8cc)
+     int           off;
+     int           *u8cc;
+@@ -6261,26 +6345,43 @@ screen_puts_len(text, len, row, col, att
+     int               prev_c = 0;             /* previous Arabic character */
+     int               pc, nc, nc1;
+     int               pcc[MAX_MCO];
+ # endif
+ #endif
++#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
++    int               force_redraw_this;
++    int               force_redraw_next = FALSE;
++#endif
++    int               need_redraw;
+     if (ScreenLines == NULL || row >= screen_Rows)    /* safety check */
+       return;
++    off = LineOffset[row] + col;
+ #ifdef FEAT_MBYTE
+     /* When drawing over the right halve of a double-wide char clear out the
+      * left halve.  Only needed in a terminal. */
+     if (has_mbyte && col > 0 && col < screen_Columns
+ # ifdef FEAT_GUI
+           && !gui.in_use
+ # endif
+           && mb_fix_col(col, row) != col)
+-      screen_puts_len((char_u *)" ", 1, row, col - 1, 0);
++    {
++      ScreenLines[off - 1] = ' ';
++      ScreenAttrs[off - 1] = 0;
++      if (enc_utf8)
++      {
++          ScreenLinesUC[off - 1] = 0;
++          ScreenLinesC[0][off - 1] = 0;
++      }
++      /* redraw the previous cell, make it empty */
++      screen_char(off - 1, row, col - 1);
++      /* force the cell at "col" to be redrawn */
++      force_redraw_next = TRUE;
++    }
+ #endif
+-    off = LineOffset[row] + col;
+ #ifdef FEAT_MBYTE
+     max_off = LineOffset[row] + screen_Columns;
+ #endif
+     while (col < screen_Columns
+           && (len < 0 || (int)(ptr - text) < len)
+@@ -6326,76 +6427,82 @@ screen_puts_len(text, len, row, col, att
+                       nc = NUL;
+                       nc1 = NUL;
+                   }
+                   else
+                   {
+-                      nc = utfc_ptr2char(ptr + mbyte_blen, pcc);
++                      nc = utfc_ptr2char_len(ptr + mbyte_blen, pcc,
++                                    (int)((text + len) - ptr - mbyte_blen));
+                       nc1 = pcc[0];
+                   }
+                   pc = prev_c;
+                   prev_c = u8c;
+                   u8c = arabic_shape(u8c, &c, &u8cc[0], nc, nc1, pc);
+               }
+               else
+                   prev_c = u8c;
+ # endif
++              if (col + mbyte_cells > screen_Columns)
++              {
++                  /* Only 1 cell left, but character requires 2 cells:
++                   * display a '>' in the last column to avoid wrapping. */
++                  c = '>';
++                  mbyte_cells = 1;
++              }
+           }
+       }
+ #endif
+-      if (ScreenLines[off] != c
++#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
++      force_redraw_this = force_redraw_next;
++      force_redraw_next = FALSE;
++#endif
++
++      need_redraw = ScreenLines[off] != c
+ #ifdef FEAT_MBYTE
+               || (mbyte_cells == 2
+                   && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0))
+               || (enc_dbcs == DBCS_JPNU
+                   && c == 0x8e
+                   && ScreenLines2[off] != ptr[1])
+               || (enc_utf8
+-                  && (ScreenLinesUC[off] != (u8char_T)u8c
+-                      || screen_comp_differs(off, u8cc)))
++                  && (ScreenLinesUC[off] !=
++                              (u8char_T)(c < 0x80 && u8cc[0] == 0 ? 0 : u8c)
++                      || (ScreenLinesUC[off] != 0
++                                        && screen_comp_differs(off, u8cc))))
+ #endif
+               || ScreenAttrs[off] != attr
+-              || exmode_active
++              || exmode_active;
++
++      if (need_redraw
++#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
++              || force_redraw_this
++#endif
+               )
+       {
+ #if defined(FEAT_GUI) || defined(UNIX)
+           /* The bold trick makes a single row of pixels appear in the next
+            * character.  When a bold character is removed, the next
+            * character should be redrawn too.  This happens for our own GUI
+-           * and for some xterms.
+-           * Force the redraw by setting the attribute to a different value
+-           * than "attr", the contents of ScreenLines[] may be needed by
+-           * mb_off2cells() further on.
+-           * Don't do this for the last drawn character, because the next
+-           * character may not be redrawn. */
+-          if (
++           * and for some xterms. */
++          if (need_redraw && ScreenLines[off] != ' ' && (
+ # ifdef FEAT_GUI
+                   gui.in_use
+ # endif
+ # if defined(FEAT_GUI) && defined(UNIX)
+                   ||
+ # endif
+ # ifdef UNIX
+                   term_is_xterm
+ # endif
+-             )
++                  ))
+           {
+-              int             n;
++              int     n = ScreenAttrs[off];
+-              n = ScreenAttrs[off];
+-# ifdef FEAT_MBYTE
+-              if (col + mbyte_cells < screen_Columns
+-                      && (n > HL_ALL || (n & HL_BOLD))
+-                      && (len < 0 ? ptr[mbyte_blen] != NUL
+-                                           : ptr + mbyte_blen < text + len))
+-                  ScreenAttrs[off + mbyte_cells] = attr + 1;
+-# else
+-              if (col + 1 < screen_Columns
+-                      && (n > HL_ALL || (n & HL_BOLD))
+-                      && (len < 0 ? ptr[1] != NUL : ptr + 1 < text + len))
+-                  ScreenLines[off + 1] = 0;
+-# endif
++              if (n > HL_ALL)
++                  n = syn_attr2attr(n);
++              if (n & HL_BOLD)
++                  force_redraw_next = TRUE;
+           }
+ #endif
+ #ifdef FEAT_MBYTE
+           /* When at the end of the text and overwriting a two-cell
+            * character with a one-cell character, need to clear the next
+@@ -6478,10 +6585,24 @@ screen_puts_len(text, len, row, col, att
+           ++off;
+           ++col;
+           ++ptr;
+       }
+     }
++
++#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
++    /* If we detected the next character needs to be redrawn, but the text
++     * doesn't extend up to there, update the character here. */
++    if (force_redraw_next && col < screen_Columns)
++    {
++# ifdef FEAT_MBYTE
++      if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1)
++          screen_char_2(off, row, col);
++      else
++# endif
++          screen_char(off, row, col);
++    }
++#endif
+ }
+ #ifdef FEAT_SEARCH_EXTRA
+ /*
+  * Prepare for 'hlsearch' highlighting.
+@@ -7354,11 +7475,15 @@ screenalloc(clear)
+     short         *new_TabPageIdxs;
+     tabpage_T     *tp;
+ #endif
+     static int            entered = FALSE;            /* avoid recursiveness */
+     static int            done_outofmem_msg = FALSE;  /* did outofmem message */
++#ifdef FEAT_AUTOCMD
++    int                   retry_count = 0;
++retry:
++#endif
+     /*
+      * Allocation of the screen buffers is done only when the size changes and
+      * when Rows and Columns have been set and we have started doing full
+      * screen stuff.
+      */
+@@ -7406,21 +7531,25 @@ screenalloc(clear)
+      * Continuing with the old ScreenLines may result in a crash, because the
+      * size is wrong.
+      */
+     FOR_ALL_TAB_WINDOWS(tp, wp)
+       win_free_lsize(wp);
++#ifdef FEAT_AUTOCMD
++    if (aucmd_win != NULL)
++      win_free_lsize(aucmd_win);
++#endif
+     new_ScreenLines = (schar_T *)lalloc((long_u)(
+                             (Rows + 1) * Columns * sizeof(schar_T)), FALSE);
+ #ifdef FEAT_MBYTE
+-    vim_memset(new_ScreenLinesC, 0, sizeof(u8char_T) * MAX_MCO);
++    vim_memset(new_ScreenLinesC, 0, sizeof(u8char_T *) * MAX_MCO);
+     if (enc_utf8)
+     {
+       new_ScreenLinesUC = (u8char_T *)lalloc((long_u)(
+                            (Rows + 1) * Columns * sizeof(u8char_T)), FALSE);
+       for (i = 0; i < p_mco; ++i)
+-          new_ScreenLinesC[i] = (u8char_T *)lalloc((long_u)(
++          new_ScreenLinesC[i] = (u8char_T *)lalloc_clear((long_u)(
+                            (Rows + 1) * Columns * sizeof(u8char_T)), FALSE);
+     }
+     if (enc_dbcs == DBCS_JPNU)
+       new_ScreenLines2 = (schar_T *)lalloc((long_u)(
+                            (Rows + 1) * Columns * sizeof(schar_T)), FALSE);
+@@ -7438,14 +7567,22 @@ screenalloc(clear)
+     {
+       if (win_alloc_lines(wp) == FAIL)
+       {
+           outofmem = TRUE;
+ #ifdef FEAT_WINDOWS
+-          break;
++          goto give_up;
+ #endif
+       }
+     }
++#ifdef FEAT_AUTOCMD
++    if (aucmd_win != NULL && aucmd_win->w_lines == NULL
++                                      && win_alloc_lines(aucmd_win) == FAIL)
++      outofmem = TRUE;
++#endif
++#ifdef FEAT_WINDOWS
++give_up:
++#endif
+ #ifdef FEAT_MBYTE
+     for (i = 0; i < p_mco; ++i)
+       if (new_ScreenLinesC[i] == NULL)
+           break;
+@@ -7626,12 +7763,21 @@ screenalloc(clear)
+     entered = FALSE;
+     --RedrawingDisabled;
+ #ifdef FEAT_AUTOCMD
+-    if (starting == 0)
++    /*
++     * Do not apply autocommands more than 3 times to avoid an endless loop
++     * in case applying autocommands always changes Rows or Columns.
++     */
++    if (starting == 0 && ++retry_count <= 3)
++    {
+       apply_autocmds(EVENT_VIMRESIZED, NULL, NULL, FALSE, curbuf);
++      /* In rare cases, autocommands may have altered Rows or Columns,
++       * jump back to check if we need to allocate the screen again. */
++      goto retry;
++    }
+ #endif
+ }
+     void
+ free_screenlines()
+@@ -8588,19 +8734,18 @@ screen_ins_lines(off, row, line_count, e
+  * When scrolling region used 'off' is the offset from the top for the region.
+  * 'row' and 'end' are relative to the start of the region.
+  *
+  * Return OK for success, FAIL if the lines are not deleted.
+  */
+-/*ARGSUSED*/
+     int
+ screen_del_lines(off, row, line_count, end, force, wp)
+     int               off;
+     int               row;
+     int               line_count;
+     int               end;
+     int               force;          /* even when line_count > p_ttyscroll */
+-    win_T     *wp;            /* NULL or window to use width from */
++    win_T     *wp UNUSED;     /* NULL or window to use width from */
+ {
+     int               j;
+     int               i;
+     unsigned  temp;
+     int               cursor_row;
+@@ -9078,11 +9223,11 @@ msg_pos_mode()
+     void
+ unshowmode(force)
+     int           force;
+ {
+     /*
+-     * Don't delete it right now, when not redrawing or insided a mapping.
++     * Don't delete it right now, when not redrawing or inside a mapping.
+      */
+     if (!redrawing() || (!force && char_avail() && !KeyTyped))
+       redraw_cmdline = TRUE;          /* delete mode later */
+     else
+     {
+@@ -9384,11 +9529,11 @@ showruler(always)
+     }
+ #endif
+ #if defined(FEAT_STL_OPT) && defined(FEAT_WINDOWS)
+     if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height)
+     {
+-      redraw_custum_statusline(curwin);
++      redraw_custom_statusline(curwin);
+     }
+     else
+ #endif
+ #ifdef FEAT_CMDL_INFO
+       win_redr_ruler(curwin, always);
+@@ -9414,17 +9559,19 @@ showruler(always)
+     static void
+ win_redr_ruler(wp, always)
+     win_T     *wp;
+     int               always;
+ {
+-    char_u    buffer[70];
++#define RULER_BUF_LEN 70
++    char_u    buffer[RULER_BUF_LEN];
+     int               row;
+     int               fillchar;
+     int               attr;
+     int               empty_line = FALSE;
+     colnr_T   virtcol;
+     int               i;
++    size_t    len;
+     int               o;
+ #ifdef FEAT_VERTSPLIT
+     int               this_ru_col;
+     int               off = 0;
+     int               width = Columns;
+@@ -9535,25 +9682,26 @@ win_redr_ruler(wp, always)
+       /*
+        * Some sprintfs return the length, some return a pointer.
+        * To avoid portability problems we use strlen() here.
+        */
+-      sprintf((char *)buffer, "%ld,",
++      vim_snprintf((char *)buffer, RULER_BUF_LEN, "%ld,",
+               (wp->w_buffer->b_ml.ml_flags & ML_EMPTY)
+                   ? 0L
+                   : (long)(wp->w_cursor.lnum));
+-      col_print(buffer + STRLEN(buffer),
++      len = STRLEN(buffer);
++      col_print(buffer + len, RULER_BUF_LEN - len,
+                       empty_line ? 0 : (int)wp->w_cursor.col + 1,
+                       (int)virtcol + 1);
+       /*
+        * Add a "50%" if there is room for it.
+        * On the last line, don't print in the last column (scrolls the
+        * screen up on some terminals).
+        */
+       i = (int)STRLEN(buffer);
+-      get_rel_pos(wp, buffer + i + 1);
++      get_rel_pos(wp, buffer + i + 1, RULER_BUF_LEN - i - 1);
+       o = i + vim_strsize(buffer + i + 1);
+ #ifdef FEAT_WINDOWS
+       if (wp->w_status_height == 0)   /* can't use last char of screen */
+ #endif
+           ++o;
+@@ -9576,11 +9724,11 @@ win_redr_ruler(wp, always)
+               else
+ #endif
+                   buffer[i++] = fillchar;
+               ++o;
+           }
+-          get_rel_pos(wp, buffer + i);
++          get_rel_pos(wp, buffer + i, RULER_BUF_LEN - i);
+       }
+       /* Truncate at window boundary. */
+ #ifdef FEAT_MBYTE
+       if (has_mbyte)
+       {
+--- vim72.orig/src/search.c
++++ vim72/src/search.c
+@@ -343,10 +343,19 @@ restore_search_patterns()
+     void
+ free_search_patterns()
+ {
+     vim_free(spats[0].pat);
+     vim_free(spats[1].pat);
++
++# ifdef FEAT_RIGHTLEFT
++    if (mr_pattern_alloced)
++    {
++        vim_free(mr_pattern);
++        mr_pattern_alloced = FALSE;
++        mr_pattern = NULL;
++    }
++# endif
+ }
+ #endif
+ /*
+  * Return TRUE when case should be ignored for search pattern "pat".
+@@ -511,11 +520,10 @@ last_pat_prog(regmatch)
+  *
+  * Return FAIL (zero) for failure, non-zero for success.
+  * When FEAT_EVAL is defined, returns the index of the first matching
+  * subpattern plus one; one if there was none.
+  */
+-/*ARGSUSED*/
+     int
+ searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm)
+     win_T     *win;           /* window to search in; can be NULL for a
+                                  buffer without a window! */
+     buf_T     *buf;
+@@ -524,11 +532,11 @@ searchit(win, buf, pos, dir, pat, count,
+     char_u    *pat;
+     long      count;
+     int               options;
+     int               pat_use;        /* which pattern to use when "pat" is empty */
+     linenr_T  stop_lnum;      /* stop after this line number when != 0 */
+-    proftime_T        *tm;            /* timeout limit or NULL */
++    proftime_T        *tm UNUSED;     /* timeout limit or NULL */
+ {
+     int               found;
+     linenr_T  lnum;           /* no init to shut up Apollo cc */
+     regmmatch_T       regmatch;
+     char_u    *ptr;
+@@ -543,12 +551,10 @@ searchit(win, buf, pos, dir, pat, count,
+     long      nmatched;
+     int               submatch = 0;
+     int               save_called_emsg = called_emsg;
+ #ifdef FEAT_SEARCH_EXTRA
+     int               break_loop = FALSE;
+-#else
+-# define break_loop FALSE
+ #endif
+     if (search_regcomp(pat, RE_SEARCH, pat_use,
+                  (options & (SEARCH_HIS + SEARCH_KEEP)), &regmatch) == FAIL)
+     {
+@@ -929,11 +935,14 @@ searchit(win, buf, pos, dir, pat, count,
+            * Stop the search if wrapscan isn't set, "stop_lnum" is
+            * specified, after an interrupt, after a match and after looping
+            * twice.
+            */
+           if (!p_ws || stop_lnum != 0 || got_int || called_emsg
+-                                             || break_loop || found || loop)
++#ifdef FEAT_SEARCH_EXTRA
++                                             || break_loop
++#endif
++                                             || found || loop)
+               break;
+           /*
+            * If 'wrapscan' is set we continue at the other end of the file.
+            * If 'shortmess' does not contain 's', we give a message.
+@@ -947,11 +956,15 @@ searchit(win, buf, pos, dir, pat, count,
+               lnum = 1;
+           if (!shortmess(SHM_SEARCH) && (options & SEARCH_MSG))
+               give_warning((char_u *)_(dir == BACKWARD
+                                         ? top_bot_msg : bot_top_msg), TRUE);
+       }
+-      if (got_int || called_emsg || break_loop)
++      if (got_int || called_emsg
++#ifdef FEAT_SEARCH_EXTRA
++              || break_loop
++#endif
++              )
+           break;
+     }
+     while (--count > 0 && found);   /* stop after count matches or no match */
+     vim_free(regmatch.regprog);
+@@ -2325,12 +2338,12 @@ findmatchlimit(oap, initc, flags, maxtra
+               if (!cpo_bsl)
+               {
+                   for (col = pos.col; check_prevcol(linep, col, '\\', &col);)
+                       bslcnt++;
+               }
+-              /* Only accept a match when 'M' is in 'cpo' or when ecaping is
+-               * what we expect. */
++              /* Only accept a match when 'M' is in 'cpo' or when escaping
++               * is what we expect. */
+               if (cpo_bsl || (bslcnt & 1) == match_escaped)
+               {
+                   if (c == initc)
+                       count++;
+                   else
+@@ -4512,16 +4525,15 @@ linewhite(lnum)
+ #if defined(FEAT_FIND_ID) || defined(PROTO)
+ /*
+  * Find identifiers or defines in included files.
+  * if p_ic && (compl_cont_status & CONT_SOL) then ptr must be in lowercase.
+  */
+-/*ARGSUSED*/
+     void
+ find_pattern_in_path(ptr, dir, len, whole, skip_comments,
+                                   type, count, action, start_lnum, end_lnum)
+     char_u    *ptr;           /* pointer to search pattern */
+-    int               dir;            /* direction of expansion */
++    int               dir UNUSED;     /* direction of expansion */
+     int               len;            /* length of search pattern */
+     int               whole;          /* match whole words only */
+     int               skip_comments;  /* don't match inside comments */
+     int               type;           /* Type of search; are we looking for a type?
+                                  a macro? */
+@@ -4661,11 +4673,11 @@ find_pattern_in_path(ptr, dir, len, whol
+                               action == ACTION_SHOW_ALL && files[i].matched)
+                       {
+                           msg_putchar('\n');      /* cursor below last one */
+                           if (!got_int)           /* don't display if 'q'
+                                                      typed at "--more--"
+-                                                     mesage */
++                                                     message */
+                           {
+                               msg_home_replace_hl(new_fname);
+                               MSG_PUTS(_(" (includes previously listed match)"));
+                               prev_fname = NULL;
+                           }
+@@ -4973,11 +4985,11 @@ search_line:
+                                   || (vim_strchr(p_cpo, CPO_JOINSP) == NULL
+                                       && (IObuff[i-2] == '?'
+                                           || IObuff[i-2] == '!'))))
+                               IObuff[i++] = ' ';
+                       }
+-                      /* copy as much as posible of the new word */
++                      /* copy as much as possible of the new word */
+                       if (p - aux >= IOSIZE - i)
+                           p = aux + IOSIZE - i - 1;
+                       STRNCPY(IObuff + i, aux, p - aux);
+                       i += (int)(p - aux);
+                       reuse |= CONT_S_IPOS;
+@@ -5008,11 +5020,11 @@ search_line:
+               if (curr_fname != prev_fname)
+               {
+                   if (did_show)
+                       msg_putchar('\n');      /* cursor below last one */
+                   if (!got_int)               /* don't display if 'q' typed
+-                                                  at "--more--" mesage */
++                                                  at "--more--" message */
+                       msg_home_replace_hl(curr_fname);
+                   prev_fname = curr_fname;
+               }
+               did_show = TRUE;
+               if (!got_int)
+@@ -5090,11 +5102,11 @@ search_line:
+                       curwin->w_cursor.lnum = files[depth].lnum;
+                   }
+               }
+               if (action != ACTION_SHOW)
+               {
+-                  curwin->w_cursor.col = (colnr_T) (startp - line);
++                  curwin->w_cursor.col = (colnr_T)(startp - line);
+                   curwin->w_set_curswant = TRUE;
+               }
+ #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
+               if (g_do_tagpreview != 0
+@@ -5117,11 +5129,12 @@ exit_matched:
+           if (def_regmatch.regprog == NULL
+ #ifdef FEAT_INS_EXPAND
+                   && action == ACTION_EXPAND
+                   && !(compl_cont_status & CONT_SOL)
+ #endif
+-                  && *(p = startp + 1))
++                  && *startp != NUL
++                  && *(p = startp + 1) != NUL)
+               goto search_line;
+       }
+       line_breakcheck();
+ #ifdef FEAT_INS_EXPAND
+       if (action == ACTION_EXPAND)
+--- vim72.orig/src/spell.c
++++ vim72/src/spell.c
+@@ -75,11 +75,11 @@
+  */
+ #define RESCORE(word_score, sound_score) ((3 * word_score + sound_score) / 4)
+ /*
+  * Do the opposite: based on a maximum end score and a known sound score,
+- * compute the the maximum word score that can be used.
++ * compute the maximum word score that can be used.
+  */
+ #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3)
+ /*
+  * Vim spell file format: <HEADER>
+@@ -467,10 +467,11 @@ struct slang_S
+     int               sl_compsylmax;  /* COMPOUNDSYLMAX (default: MAXWLEN) */
+     int               sl_compoptions; /* COMP_* flags */
+     garray_T  sl_comppat;     /* CHECKCOMPOUNDPATTERN items */
+     regprog_T *sl_compprog;   /* COMPOUNDRULE turned into a regexp progrm
+                                * (NULL when no compounding) */
++    char_u    *sl_comprules;  /* all COMPOUNDRULE concatenated (or NULL) */
+     char_u    *sl_compstartflags; /* flags for first compound word */
+     char_u    *sl_compallflags; /* all flags for compound words */
+     char_u    sl_nobreak;     /* When TRUE: no spaces between words */
+     char_u    *sl_syllable;   /* SYLLABLE repeatable chars or NULL */
+     garray_T  sl_syl_items;   /* syllable items */
+@@ -623,11 +624,11 @@ typedef struct suggest_S
+ #define SUG(ga, i) (((suggest_T *)(ga).ga_data)[i])
+ /* TRUE if a word appears in the list of banned words.  */
+ #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word)))
+-/* Number of suggestions kept when cleaning up.  we need to keep more than
++/* Number of suggestions kept when cleaning up.  We need to keep more than
+  * what is displayed, because when rescore_suggestions() is called the score
+  * may change and wrong suggestions may be removed later. */
+ #define SUG_CLEAN_COUNT(su)    ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20)
+ /* Threshold for sorting and cleaning up suggestions.  Don't want to keep lots
+@@ -837,11 +838,14 @@ typedef struct trystate_S
+ static slang_T *slang_alloc __ARGS((char_u *lang));
+ static void slang_free __ARGS((slang_T *lp));
+ static void slang_clear __ARGS((slang_T *lp));
+ static void slang_clear_sug __ARGS((slang_T *lp));
+ static void find_word __ARGS((matchinf_T *mip, int mode));
++static int match_checkcompoundpattern __ARGS((char_u *ptr, int wlen, garray_T *gap));
+ static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags));
++static int can_be_compound __ARGS((trystate_T *sp, slang_T *slang, char_u *compflags, int flag));
++static int match_compoundrule __ARGS((slang_T *slang, char_u *compflags));
+ static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req));
+ static void find_prefix __ARGS((matchinf_T *mip, int mode));
+ static int fold_more __ARGS((matchinf_T *mip));
+ static int spell_valid_case __ARGS((int wordflags, int treeflags));
+ static int no_spell_checking __ARGS((win_T *wp));
+@@ -944,34 +948,34 @@ static void close_spellbuf __ARGS((buf_T
+  * differ from what the .spl file uses.
+  * These must not be called with negative number!
+  */
+ #ifndef FEAT_MBYTE
+ /* Non-multi-byte implementation. */
+-# define SPELL_TOFOLD(c) ((c) < 256 ? spelltab.st_fold[c] : (c))
+-# define SPELL_TOUPPER(c) ((c) < 256 ? spelltab.st_upper[c] : (c))
++# define SPELL_TOFOLD(c) ((c) < 256 ? (int)spelltab.st_fold[c] : (c))
++# define SPELL_TOUPPER(c) ((c) < 256 ? (int)spelltab.st_upper[c] : (c))
+ # define SPELL_ISUPPER(c) ((c) < 256 ? spelltab.st_isu[c] : FALSE)
+ #else
+ # if defined(HAVE_WCHAR_H)
+ #  include <wchar.h>      /* for towupper() and towlower() */
+ # endif
+ /* Multi-byte implementation.  For Unicode we can call utf_*(), but don't do
+  * that for ASCII, because we don't want to use 'casemap' here.  Otherwise use
+  * the "w" library function for characters above 255 if available. */
+ # ifdef HAVE_TOWLOWER
+ #  define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \
+-          : (c) < 256 ? spelltab.st_fold[c] : towlower(c))
++          : (c) < 256 ? (int)spelltab.st_fold[c] : (int)towlower(c))
+ # else
+ #  define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \
+-          : (c) < 256 ? spelltab.st_fold[c] : (c))
++          : (c) < 256 ? (int)spelltab.st_fold[c] : (c))
+ # endif
+ # ifdef HAVE_TOWUPPER
+ #  define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? utf_toupper(c) \
+-          : (c) < 256 ? spelltab.st_upper[c] : towupper(c))
++          : (c) < 256 ? (int)spelltab.st_upper[c] : (int)towupper(c))
+ # else
+ #  define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? utf_toupper(c) \
+-          : (c) < 256 ? spelltab.st_upper[c] : (c))
++          : (c) < 256 ? (int)spelltab.st_upper[c] : (c))
+ # endif
+ # ifdef HAVE_ISWUPPER
+ #  define SPELL_ISUPPER(c) (enc_utf8 && (c) >= 128 ? utf_isupper(c) \
+           : (c) < 256 ? spelltab.st_isu[c] : iswupper(c))
+@@ -1517,10 +1521,15 @@ find_word(mip, mode)
+                                       ? slang->sl_compstartflags
+                                       : slang->sl_compallflags,
+                                           ((unsigned)flags >> 24)))
+                   continue;
++              /* If there is a match with a CHECKCOMPOUNDPATTERN rule
++               * discard the compound word. */
++              if (match_checkcompoundpattern(ptr, wlen, &slang->sl_comppat))
++                  continue;
++
+               if (mode == FIND_COMPOUND)
+               {
+                   int     capflags;
+                   /* Need to check the caps type of the appended compound
+@@ -1575,10 +1584,15 @@ find_word(mip, mode)
+                           vim_strncpy(fword, ptr, endlen[endidxcnt]);
+                   }
+                   if (!can_compound(slang, fword, mip->mi_compflags))
+                       continue;
+               }
++              else if (slang->sl_comprules != NULL
++                           && !match_compoundrule(slang, mip->mi_compflags))
++                  /* The compound flags collected so far do not match any
++                   * COMPOUNDRULE, discard the compounded word. */
++                  continue;
+           }
+           /* Check NEEDCOMPOUND: can't use word without compounding. */
+           else if (flags & WF_NEEDCOMP)
+               continue;
+@@ -1725,10 +1739,43 @@ find_word(mip, mode)
+           break;
+     }
+ }
+ /*
++ * Return TRUE if there is a match between the word ptr[wlen] and
++ * CHECKCOMPOUNDPATTERN rules, assuming that we will concatenate with another
++ * word.
++ * A match means that the first part of CHECKCOMPOUNDPATTERN matches at the
++ * end of ptr[wlen] and the second part matches after it.
++ */
++    static int
++match_checkcompoundpattern(ptr, wlen, gap)
++    char_u    *ptr;
++    int               wlen;
++    garray_T  *gap;  /* &sl_comppat */
++{
++    int               i;
++    char_u    *p;
++    int               len;
++
++    for (i = 0; i + 1 < gap->ga_len; i += 2)
++    {
++      p = ((char_u **)gap->ga_data)[i + 1];
++      if (STRNCMP(ptr + wlen, p, STRLEN(p)) == 0)
++      {
++          /* Second part matches at start of following compound word, now
++           * check if first part matches at end of previous word. */
++          p = ((char_u **)gap->ga_data)[i];
++          len = (int)STRLEN(p);
++          if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0)
++              return TRUE;
++      }
++    }
++    return FALSE;
++}
++
++/*
+  * Return TRUE if "flags" is a valid sequence of compound flags and "word"
+  * does not have too many syllables.
+  */
+     static int
+ can_compound(slang, word, flags)
+@@ -1771,10 +1818,102 @@ can_compound(slang, word, flags)
+       return (int)STRLEN(flags) < slang->sl_compmax;
+     return TRUE;
+ }
+ /*
++ * Return TRUE when the sequence of flags in "compflags" plus "flag" can
++ * possibly form a valid compounded word.  This also checks the COMPOUNDRULE
++ * lines if they don't contain wildcards.
++ */
++    static int
++can_be_compound(sp, slang, compflags, flag)
++    trystate_T        *sp;
++    slang_T   *slang;
++    char_u    *compflags;
++    int               flag;
++{
++    /* If the flag doesn't appear in sl_compstartflags or sl_compallflags
++     * then it can't possibly compound. */
++    if (!byte_in_str(sp->ts_complen == sp->ts_compsplit
++              ? slang->sl_compstartflags : slang->sl_compallflags, flag))
++      return FALSE;
++
++    /* If there are no wildcards, we can check if the flags collected so far
++     * possibly can form a match with COMPOUNDRULE patterns.  This only
++     * makes sense when we have two or more words. */
++    if (slang->sl_comprules != NULL && sp->ts_complen > sp->ts_compsplit)
++    {
++      int v;
++
++      compflags[sp->ts_complen] = flag;
++      compflags[sp->ts_complen + 1] = NUL;
++      v = match_compoundrule(slang, compflags + sp->ts_compsplit);
++      compflags[sp->ts_complen] = NUL;
++      return v;
++    }
++
++    return TRUE;
++}
++
++
++/*
++ * Return TRUE if the compound flags in compflags[] match the start of any
++ * compound rule.  This is used to stop trying a compound if the flags
++ * collected so far can't possibly match any compound rule.
++ * Caller must check that slang->sl_comprules is not NULL.
++ */
++    static int
++match_compoundrule(slang, compflags)
++    slang_T   *slang;
++    char_u    *compflags;
++{
++    char_u    *p;
++    int               i;
++    int               c;
++
++    /* loop over all the COMPOUNDRULE entries */
++    for (p = slang->sl_comprules; *p != NUL; ++p)
++    {
++      /* loop over the flags in the compound word we have made, match
++       * them against the current rule entry */
++      for (i = 0; ; ++i)
++      {
++          c = compflags[i];
++          if (c == NUL)
++              /* found a rule that matches for the flags we have so far */
++              return TRUE;
++          if (*p == '/' || *p == NUL)
++              break;  /* end of rule, it's too short */
++          if (*p == '[')
++          {
++              int match = FALSE;
++
++              /* compare against all the flags in [] */
++              ++p;
++              while (*p != ']' && *p != NUL)
++                  if (*p++ == c)
++                      match = TRUE;
++              if (!match)
++                  break;  /* none matches */
++          }
++          else if (*p != c)
++              break;  /* flag of word doesn't match flag in pattern */
++          ++p;
++      }
++
++      /* Skip to the next "/", where the next pattern starts. */
++      p = vim_strchr(p, '/');
++      if (p == NULL)
++          break;
++    }
++
++    /* Checked all the rules and none of them match the flags, so there
++     * can't possibly be a compound starting with these flags. */
++    return FALSE;
++}
++
++/*
+  * Return non-zero if the prefix indicated by "arridx" matches with the prefix
+  * ID in "flags" for the word "word".
+  * The WF_RAREPFX flag is included in the return value for a rare prefix.
+  */
+     static int
+@@ -2235,11 +2374,11 @@ spell_move_to(wp, dir, allwords, curline
+                   give_warning((char_u *)_(bot_top_msg), TRUE);
+           }
+           /* If we are back at the starting line and there is no match then
+            * give up. */
+-          if (lnum == wp->w_cursor.lnum && !found_one)
++          if (lnum == wp->w_cursor.lnum && (!found_one || wrapped))
+               break;
+           /* Skip the characters at the start of the next line that were
+            * included in a match crossing line boundaries. */
+           if (attr == HLF_COUNT)
+@@ -2511,13 +2650,15 @@ slang_clear(lp)
+     vim_free(lp->sl_midword);
+     lp->sl_midword = NULL;
+     vim_free(lp->sl_compprog);
++    vim_free(lp->sl_comprules);
+     vim_free(lp->sl_compstartflags);
+     vim_free(lp->sl_compallflags);
+     lp->sl_compprog = NULL;
++    lp->sl_comprules = NULL;
+     lp->sl_compstartflags = NULL;
+     lp->sl_compallflags = NULL;
+     vim_free(lp->sl_syllable);
+     lp->sl_syllable = NULL;
+@@ -3458,10 +3599,11 @@ read_compound(fd, slang, len)
+     int               atstart;
+     char_u    *pat;
+     char_u    *pp;
+     char_u    *cp;
+     char_u    *ap;
++    char_u    *crp;
+     int               cnt;
+     garray_T  *gap;
+     if (todo < 2)
+       return SP_FORMERROR;    /* need at least two bytes */
+@@ -3543,10 +3685,16 @@ read_compound(fd, slang, len)
+       return SP_OTHERERROR;
+     }
+     slang->sl_compallflags = ap;
+     *ap = NUL;
++    /* And a list of all patterns in their original form, for checking whether
++     * compounding may work in match_compoundrule().  This is freed when we
++     * encounter a wildcard, the check doesn't work then. */
++    crp = alloc(todo + 1);
++    slang->sl_comprules = crp;
++
+     pp = pat;
+     *pp++ = '^';
+     *pp++ = '\\';
+     *pp++ = '(';
+@@ -3585,10 +3733,24 @@ read_compound(fd, slang, len)
+               }
+               if (atstart == 1)
+                   atstart = 0;
+           }
+       }
++
++      /* Copy flag to "sl_comprules", unless we run into a wildcard. */
++      if (crp != NULL)
++      {
++          if (c == '+' || c == '*')
++          {
++              vim_free(slang->sl_comprules);
++              slang->sl_comprules = NULL;
++              crp = NULL;
++          }
++          else
++              *crp++ = c;
++      }
++
+       if (c == '/')       /* slash separates two items */
+       {
+           *pp++ = '\\';
+           *pp++ = '|';
+           atstart = 1;
+@@ -3609,10 +3771,13 @@ read_compound(fd, slang, len)
+     *pp++ = '\\';
+     *pp++ = ')';
+     *pp++ = '$';
+     *pp = NUL;
++    if (crp != NULL)
++      *crp = NUL;
++
+     slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT);
+     vim_free(pat);
+     if (slang->sl_compprog == NULL)
+       return SP_FORMERROR;
+@@ -4789,17 +4954,20 @@ typedef struct compitem_S
+ /*
+  * Structure that is used to store the items in the word tree.  This avoids
+  * the need to keep track of each allocated thing, everything is freed all at
+  * once after ":mkspell" is done.
++ * Note: "sb_next" must be just before "sb_data" to make sure the alignment of
++ * "sb_data" is correct for systems where pointers must be aligned on
++ * pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc).
+  */
+ #define  SBLOCKSIZE 16000     /* size of sb_data */
+ typedef struct sblock_S sblock_T;
+ struct sblock_S
+ {
+-    sblock_T  *sb_next;       /* next block in list */
+     int               sb_used;        /* nr of bytes already in use */
++    sblock_T  *sb_next;       /* next block in list */
+     char_u    sb_data[1];     /* data, actually longer */
+ };
+ /*
+  * A node in the tree.
+@@ -4913,10 +5081,11 @@ typedef struct spellinfo_S
+     int               si_newprefID;   /* current value for ah_newID */
+     int               si_newcompID;   /* current value for compound ID */
+ } spellinfo_T;
+ static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname));
++static int is_aff_rule __ARGS((char_u **items, int itemcnt, char *rulename, int        mincount));
+ static void aff_process_flags __ARGS((afffile_T *affile, affentry_T *entry));
+ static int spell_info_item __ARGS((char_u *s));
+ static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u       *fname, int lnum));
+ static unsigned get_affitem __ARGS((int flagtype, char_u **pp));
+ static void process_compflags __ARGS((spellinfo_T *spin, afffile_T *aff, char_u *compflags));
+@@ -4948,11 +5117,11 @@ static void wordtree_compress __ARGS((sp
+ static int node_compress __ARGS((spellinfo_T *spin, wordnode_T *node, hashtab_T *ht, int *tot));
+ static int node_equal __ARGS((wordnode_T *n1, wordnode_T *n2));
+ static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd));
+ static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname));
+ static void clear_node __ARGS((wordnode_T *node));
+-static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree));
++static int put_node __ARGS((FILE *fd, wordnode_T *node, int idx, int regionmask, int prefixtree));
+ static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname));
+ static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang));
+ static int sug_maketable __ARGS((spellinfo_T *spin));
+ static int sug_filltable __ARGS((spellinfo_T *spin, wordnode_T *node, int startwordnr, garray_T *gap));
+ static int offset2bytes __ARGS((int nr, char_u *buf));
+@@ -5221,12 +5390,11 @@ spell_read_aff(spin, fname)
+       }
+       /* Handle non-empty lines. */
+       if (itemcnt > 0)
+       {
+-          if (STRCMP(items[0], "SET") == 0 && itemcnt == 2
+-                                                     && aff->af_enc == NULL)
++          if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL)
+           {
+ #ifdef FEAT_MBYTE
+               /* Setup for conversion from "ENC" to 'encoding'. */
+               aff->af_enc = enc_canonize(items[1]);
+               if (aff->af_enc != NULL && !spin->si_ascii
+@@ -5237,11 +5405,11 @@ spell_read_aff(spin, fname)
+               spin->si_conv.vc_fail = TRUE;
+ #else
+                   smsg((char_u *)_("Conversion in %s not supported"), fname);
+ #endif
+           }
+-          else if (STRCMP(items[0], "FLAG") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "FLAG", 2)
+                                             && aff->af_flagtype == AFT_CHAR)
+           {
+               if (STRCMP(items[1], "long") == 0)
+                   aff->af_flagtype = AFT_LONG;
+               else if (STRCMP(items[1], "num") == 0)
+@@ -5282,90 +5450,92 @@ spell_read_aff(spin, fname)
+                       STRCAT(p, " ");
+                       STRCAT(p, items[1]);
+                       spin->si_info = p;
+                   }
+           }
+-          else if (STRCMP(items[0], "MIDWORD") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "MIDWORD", 2)
+                                                          && midword == NULL)
+           {
+               midword = getroom_save(spin, items[1]);
+           }
+-          else if (STRCMP(items[0], "TRY") == 0 && itemcnt == 2)
++          else if (is_aff_rule(items, itemcnt, "TRY", 2))
+           {
+               /* ignored, we look in the tree for what chars may appear */
+           }
+           /* TODO: remove "RAR" later */
+-          else if ((STRCMP(items[0], "RAR") == 0
+-                      || STRCMP(items[0], "RARE") == 0) && itemcnt == 2
+-                                                     && aff->af_rare == 0)
++          else if ((is_aff_rule(items, itemcnt, "RAR", 2)
++                      || is_aff_rule(items, itemcnt, "RARE", 2))
++                                                       && aff->af_rare == 0)
+           {
+               aff->af_rare = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+           /* TODO: remove "KEP" later */
+-          else if ((STRCMP(items[0], "KEP") == 0
+-                  || STRCMP(items[0], "KEEPCASE") == 0) && itemcnt == 2
++          else if ((is_aff_rule(items, itemcnt, "KEP", 2)
++                      || is_aff_rule(items, itemcnt, "KEEPCASE", 2))
+                                                    && aff->af_keepcase == 0)
+           {
+               aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+-          else if (STRCMP(items[0], "BAD") == 0 && itemcnt == 2
+-                                                     && aff->af_bad == 0)
++          else if ((is_aff_rule(items, itemcnt, "BAD", 2)
++                      || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2))
++                                                        && aff->af_bad == 0)
+           {
+               aff->af_bad = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+-          else if (STRCMP(items[0], "NEEDAFFIX") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2)
+                                                   && aff->af_needaffix == 0)
+           {
+               aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+-          else if (STRCMP(items[0], "CIRCUMFIX") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2)
+                                                   && aff->af_circumfix == 0)
+           {
+               aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+-          else if (STRCMP(items[0], "NOSUGGEST") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2)
+                                                   && aff->af_nosuggest == 0)
+           {
+               aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+-          else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2
++          else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2)
++                      || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2))
+                                                    && aff->af_needcomp == 0)
+           {
+               aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+-          else if (STRCMP(items[0], "COMPOUNDROOT") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2)
+                                                    && aff->af_comproot == 0)
+           {
+               aff->af_comproot = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+           }
+-          else if (STRCMP(items[0], "COMPOUNDFORBIDFLAG") == 0
+-                                 && itemcnt == 2 && aff->af_compforbid == 0)
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2)
++                                                 && aff->af_compforbid == 0)
+           {
+               aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+               if (aff->af_pref.ht_used > 0)
+                   smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"),
+                           fname, lnum);
+           }
+-          else if (STRCMP(items[0], "COMPOUNDPERMITFLAG") == 0
+-                                 && itemcnt == 2 && aff->af_comppermit == 0)
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2)
++                                                 && aff->af_comppermit == 0)
+           {
+               aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1],
+                                                                fname, lnum);
+               if (aff->af_pref.ht_used > 0)
+                   smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"),
+                           fname, lnum);
+           }
+-          else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2)
+                                                        && compflags == NULL)
+           {
+               /* Turn flag "c" into COMPOUNDRULE compatible string "c+",
+                * "Na" into "Na+", "1234" into "1234+". */
+               p = getroom(spin, STRLEN(items[1]) + 2, FALSE);
+@@ -5374,11 +5544,19 @@ spell_read_aff(spin, fname)
+                   STRCPY(p, items[1]);
+                   STRCAT(p, "+");
+                   compflags = p;
+               }
+           }
+-          else if (STRCMP(items[0], "COMPOUNDRULE") == 0 && itemcnt == 2)
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2))
++          {
++              /* We don't use the count, but do check that it's a number and
++               * not COMPOUNDRULE mistyped. */
++              if (atoi((char *)items[1]) == 0)
++                  smsg((char_u *)_("Wrong COMPOUNDRULES value in %s line %d: %s"),
++                                                     fname, lnum, items[1]);
++          }
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2))
+           {
+               /* Concatenate this string to previously defined ones, using a
+                * slash to separate them. */
+               l = (int)STRLEN(items[1]) + 1;
+               if (compflags != NULL)
+@@ -5393,60 +5571,57 @@ spell_read_aff(spin, fname)
+                   }
+                   STRCAT(p, items[1]);
+                   compflags = p;
+               }
+           }
+-          else if (STRCMP(items[0], "COMPOUNDWORDMAX") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
+                                                             && compmax == 0)
+           {
+               compmax = atoi((char *)items[1]);
+               if (compmax == 0)
+                   smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"),
+                                                      fname, lnum, items[1]);
+           }
+-          else if (STRCMP(items[0], "COMPOUNDMIN") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2)
+                                                          && compminlen == 0)
+           {
+               compminlen = atoi((char *)items[1]);
+               if (compminlen == 0)
+                   smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"),
+                                                      fname, lnum, items[1]);
+           }
+-          else if (STRCMP(items[0], "COMPOUNDSYLMAX") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2)
+                                                          && compsylmax == 0)
+           {
+               compsylmax = atoi((char *)items[1]);
+               if (compsylmax == 0)
+                   smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"),
+                                                      fname, lnum, items[1]);
+           }
+-          else if (STRCMP(items[0], "CHECKCOMPOUNDDUP") == 0 && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1))
+           {
+               compoptions |= COMP_CHECKDUP;
+           }
+-          else if (STRCMP(items[0], "CHECKCOMPOUNDREP") == 0 && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1))
+           {
+               compoptions |= COMP_CHECKREP;
+           }
+-          else if (STRCMP(items[0], "CHECKCOMPOUNDCASE") == 0 && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1))
+           {
+               compoptions |= COMP_CHECKCASE;
+           }
+-          else if (STRCMP(items[0], "CHECKCOMPOUNDTRIPLE") == 0
+-                                                            && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1))
+           {
+               compoptions |= COMP_CHECKTRIPLE;
+           }
+-          else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
+-                                                            && itemcnt == 2)
++          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2))
+           {
+               if (atoi((char *)items[1]) == 0)
+                   smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"),
+                                                      fname, lnum, items[1]);
+           }
+-          else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
+-                                                            && itemcnt == 3)
++          else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3))
+           {
+               garray_T    *gap = &spin->si_comppat;
+               int         i;
+               /* Only add the couple if it isn't already there. */
+@@ -5461,28 +5636,28 @@ spell_read_aff(spin, fname)
+                                              = getroom_save(spin, items[1]);
+                   ((char_u **)(gap->ga_data))[gap->ga_len++]
+                                              = getroom_save(spin, items[2]);
+               }
+           }
+-          else if (STRCMP(items[0], "SYLLABLE") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2)
+                                                         && syllable == NULL)
+           {
+               syllable = getroom_save(spin, items[1]);
+           }
+-          else if (STRCMP(items[0], "NOBREAK") == 0 && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "NOBREAK", 1))
+           {
+               spin->si_nobreak = TRUE;
+           }
+-          else if (STRCMP(items[0], "NOSPLITSUGS") == 0 && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1))
+           {
+               spin->si_nosplitsugs = TRUE;
+           }
+-          else if (STRCMP(items[0], "NOSUGFILE") == 0 && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1))
+           {
+               spin->si_nosugfile = TRUE;
+           }
+-          else if (STRCMP(items[0], "PFXPOSTPONE") == 0 && itemcnt == 1)
++          else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1))
+           {
+               aff->af_pfxpostpone = TRUE;
+           }
+           else if ((STRCMP(items[0], "PFX") == 0
+                                             || STRCMP(items[0], "SFX") == 0)
+@@ -5769,28 +5944,24 @@ spell_read_aff(spin, fname)
+                           cur_aff->ah_newID = 0;
+                       }
+                   }
+               }
+           }
+-          else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2
+-                                                             && fol == NULL)
++          else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL)
+           {
+               fol = vim_strsave(items[1]);
+           }
+-          else if (STRCMP(items[0], "LOW") == 0 && itemcnt == 2
+-                                                             && low == NULL)
++          else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL)
+           {
+               low = vim_strsave(items[1]);
+           }
+-          else if (STRCMP(items[0], "UPP") == 0 && itemcnt == 2
+-                                                             && upp == NULL)
++          else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL)
+           {
+               upp = vim_strsave(items[1]);
+           }
+-          else if ((STRCMP(items[0], "REP") == 0
+-                      || STRCMP(items[0], "REPSAL") == 0)
+-                  && itemcnt == 2)
++          else if (is_aff_rule(items, itemcnt, "REP", 2)
++                   || is_aff_rule(items, itemcnt, "REPSAL", 2))
+           {
+               /* Ignore REP/REPSAL count */;
+               if (!isdigit(*items[1]))
+                   smsg((char_u *)_("Expected REP(SAL) count in %s line %d"),
+                                                                fname, lnum);
+@@ -5817,11 +5988,11 @@ spell_read_aff(spin, fname)
+                   add_fromto(spin, items[0][3] == 'S'
+                                        ? &spin->si_repsal
+                                        : &spin->si_rep, items[1], items[2]);
+               }
+           }
+-          else if (STRCMP(items[0], "MAP") == 0 && itemcnt == 2)
++          else if (is_aff_rule(items, itemcnt, "MAP", 2))
+           {
+               /* MAP item or count */
+               if (!found_map)
+               {
+                   /* First line contains the count. */
+@@ -5854,13 +6025,12 @@ spell_read_aff(spin, fname)
+                    * slashes. */
+                   ga_concat(&spin->si_map, items[1]);
+                   ga_append(&spin->si_map, '/');
+               }
+           }
+-          /* Accept "SAL from to" and "SAL from to # comment". */
+-          else if (STRCMP(items[0], "SAL") == 0
+-                  && (itemcnt == 3 || (itemcnt > 3 && items[3][0] == '#')))
++          /* Accept "SAL from to" and "SAL from to  #comment". */
++          else if (is_aff_rule(items, itemcnt, "SAL", 3))
+           {
+               if (do_sal)
+               {
+                   /* SAL item (sounds-a-like)
+                    * Either one of the known keys or a from-to pair. */
+@@ -5875,16 +6045,16 @@ spell_read_aff(spin, fname)
+                       add_fromto(spin, &spin->si_sal, items[1],
+                                    STRCMP(items[2], "_") == 0 ? (char_u *)""
+                                                               : items[2]);
+               }
+           }
+-          else if (STRCMP(items[0], "SOFOFROM") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2)
+                                                         && sofofrom == NULL)
+           {
+               sofofrom = getroom_save(spin, items[1]);
+           }
+-          else if (STRCMP(items[0], "SOFOTO") == 0 && itemcnt == 2
++          else if (is_aff_rule(items, itemcnt, "SOFOTO", 2)
+                                                           && sofoto == NULL)
+           {
+               sofoto = getroom_save(spin, items[1]);
+           }
+           else if (STRCMP(items[0], "COMMON") == 0)
+@@ -5978,11 +6148,11 @@ spell_read_aff(spin, fname)
+       if (spin->si_newcompID == 127 || spin->si_newcompID == 255)
+           MSG(_("Too many postponed prefixes"));
+       else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
+           MSG(_("Too many compound flags"));
+       else
+-          MSG(_("Too many posponed prefixes and/or compound flags"));
++          MSG(_("Too many postponed prefixes and/or compound flags"));
+     }
+     if (syllable != NULL)
+     {
+       aff_check_string(spin->si_syllable, syllable, "SYLLABLE");
+@@ -6015,10 +6185,26 @@ spell_read_aff(spin, fname)
+     fclose(fd);
+     return aff;
+ }
+ /*
++ * Return TRUE when items[0] equals "rulename", there are "mincount" items or
++ * a comment is following after item "mincount".
++ */
++    static int
++is_aff_rule(items, itemcnt, rulename, mincount)
++    char_u    **items;
++    int               itemcnt;
++    char      *rulename;
++    int               mincount;
++{
++    return (STRCMP(items[0], rulename) == 0
++          && (itemcnt == mincount
++              || (itemcnt > mincount && items[mincount][0] == '#')));
++}
++
++/*
+  * For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from
+  * ae_flags to ae_comppermit and ae_compforbid.
+  */
+     static void
+ aff_process_flags(affile, entry)
+@@ -7864,11 +8050,11 @@ put_sugtime(spin, fd)
+     int               i;
+     /* time_t can be up to 8 bytes in size, more than long_u, thus we
+      * can't use put_bytes() here. */
+     for (i = 7; i >= 0; --i)
+-      if (i + 1 > sizeof(time_t))
++      if (i + 1 > (int)sizeof(time_t))
+           /* ">>" doesn't work well when shifting more bits than avail */
+           putc(0, fd);
+       else
+       {
+           c = (unsigned)spin->si_sugtime >> (i * 8);
+@@ -7924,25 +8110,27 @@ write_vim_spell(spin, fname)
+     garray_T  *gap;
+     fromto_T  *ftp;
+     char_u    *p;
+     int               rr;
+     int               retval = OK;
++    size_t    fwv = 1;  /* collect return value of fwrite() to avoid
++                           warnings from picky compiler */
+     fd = mch_fopen((char *)fname, "w");
+     if (fd == NULL)
+     {
+       EMSG2(_(e_notopen), fname);
+       return FAIL;
+     }
+     /* <HEADER>: <fileID> <versionnr> */
+                                                           /* <fileID> */
+-    if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1)
+-    {
+-      EMSG(_(e_write));
+-      retval = FAIL;
+-    }
++    fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd);
++    if (fwv != (size_t)1)
++      /* Catch first write error, don't try writing more. */
++      goto theend;
++
+     putc(VIMSPELLVERSION, fd);                                    /* <versionnr> */
+     /*
+      * <SECTIONS>: <section> ... <sectionend>
+      */
+@@ -7953,22 +8141,22 @@ write_vim_spell(spin, fname)
+       putc(SN_INFO, fd);                              /* <sectionID> */
+       putc(0, fd);                                    /* <sectionflags> */
+       i = (int)STRLEN(spin->si_info);
+       put_bytes(fd, (long_u)i, 4);                    /* <sectionlen> */
+-      fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
++      fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
+     }
+     /* SN_REGION: <regionname> ...
+      * Write the region names only if there is more than one. */
+     if (spin->si_region_count > 1)
+     {
+       putc(SN_REGION, fd);                            /* <sectionID> */
+       putc(SNF_REQUIRED, fd);                         /* <sectionflags> */
+       l = spin->si_region_count * 2;
+       put_bytes(fd, (long_u)l, 4);                    /* <sectionlen> */
+-      fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
++      fwv &= fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
+                                                       /* <regionname> ... */
+       regionmask = (1 << spin->si_region_count) - 1;
+     }
+     else
+       regionmask = 0;
+@@ -8014,22 +8202,23 @@ write_vim_spell(spin, fname)
+               flags |= CF_UPPER;
+           fputc(flags, fd);                           /* <charflags> */
+       }
+       put_bytes(fd, (long_u)l, 2);                    /* <folcharslen> */
+-      fwrite(folchars, (size_t)l, (size_t)1, fd);     /* <folchars> */
++      fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */
+     }
+     /* SN_MIDWORD: <midword> */
+     if (spin->si_midword != NULL)
+     {
+       putc(SN_MIDWORD, fd);                           /* <sectionID> */
+       putc(SNF_REQUIRED, fd);                         /* <sectionflags> */
+       i = (int)STRLEN(spin->si_midword);
+       put_bytes(fd, (long_u)i, 4);                    /* <sectionlen> */
+-      fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* <midword> */
++      fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd);
++                                                      /* <midword> */
+     }
+     /* SN_PREFCOND: <prefcondcnt> <prefcond> ... */
+     if (spin->si_prefcond.ga_len > 0)
+     {
+@@ -8111,11 +8300,12 @@ write_vim_spell(spin, fname)
+           for (rr = 1; rr <= 2; ++rr)
+           {
+               p = rr == 1 ? ftp->ft_from : ftp->ft_to;
+               l = (int)STRLEN(p);
+               putc(l, fd);
+-              fwrite(p, l, (size_t)1, fd);
++              if (l > 0)
++                  fwv &= fwrite(p, l, (size_t)1, fd);
+           }
+       }
+     }
+@@ -8129,15 +8319,15 @@ write_vim_spell(spin, fname)
+       l = (int)STRLEN(spin->si_sofofr);
+       put_bytes(fd, (long_u)(l + STRLEN(spin->si_sofoto) + 4), 4);
+                                                       /* <sectionlen> */
+       put_bytes(fd, (long_u)l, 2);                    /* <sofofromlen> */
+-      fwrite(spin->si_sofofr, l, (size_t)1, fd);      /* <sofofrom> */
++      fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */
+       l = (int)STRLEN(spin->si_sofoto);
+       put_bytes(fd, (long_u)l, 2);                    /* <sofotolen> */
+-      fwrite(spin->si_sofoto, l, (size_t)1, fd);      /* <sofoto> */
++      fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */
+     }
+     /* SN_WORDS: <word> ...
+      * This is for making suggestions, section is not required. */
+     if (spin->si_commonwords.ht_used > 0)
+@@ -8158,11 +8348,11 @@ write_vim_spell(spin, fname)
+               if (!HASHITEM_EMPTY(hi))
+               {
+                   l = (int)STRLEN(hi->hi_key) + 1;
+                   len += l;
+                   if (round == 2)                     /* <word> */
+-                      fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
++                      fwv &= fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
+                   --todo;
+               }
+           if (round == 1)
+               put_bytes(fd, (long_u)len, 4);          /* <sectionlen> */
+       }
+@@ -8174,11 +8364,11 @@ write_vim_spell(spin, fname)
+     {
+       putc(SN_MAP, fd);                               /* <sectionID> */
+       putc(0, fd);                                    /* <sectionflags> */
+       l = spin->si_map.ga_len;
+       put_bytes(fd, (long_u)l, 4);                    /* <sectionlen> */
+-      fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
++      fwv &= fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
+                                                       /* <mapstr> */
+     }
+     /* SN_SUGFILE: <timestamp>
+      * This is used to notify that a .sug file may be available and at the
+@@ -8230,14 +8420,15 @@ write_vim_spell(spin, fname)
+                                                       /* <comppatcount> */
+       for (i = 0; i < spin->si_comppat.ga_len; ++i)
+       {
+           p = ((char_u **)(spin->si_comppat.ga_data))[i];
+           putc((int)STRLEN(p), fd);                   /* <comppatlen> */
+-          fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* <comppattext> */
++          fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);
++                                                      /* <comppattext> */
+       }
+                                                       /* <compflags> */
+-      fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
++      fwv &= fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
+                                                              (size_t)1, fd);
+     }
+     /* SN_NOBREAK: NOBREAK flag */
+     if (spin->si_nobreak)
+@@ -8257,11 +8448,12 @@ write_vim_spell(spin, fname)
+       putc(SN_SYLLABLE, fd);                          /* <sectionID> */
+       putc(0, fd);                                    /* <sectionflags> */
+       l = (int)STRLEN(spin->si_syllable);
+       put_bytes(fd, (long_u)l, 4);                    /* <sectionlen> */
+-      fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* <syllable> */
++      fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd);
++                                                      /* <syllable> */
+     }
+     /* end of <SECTIONS> */
+     putc(SN_END, fd);                                 /* <sectionend> */
+@@ -8293,17 +8485,22 @@ write_vim_spell(spin, fname)
+       /* Write the nodes. */
+       (void)put_node(fd, tree, 0, regionmask, round == 3);
+     }
+-    /* Write another byte to check for errors. */
++    /* Write another byte to check for errors (file system full). */
+     if (putc(0, fd) == EOF)
+       retval = FAIL;
+-
++theend:
+     if (fclose(fd) == EOF)
+       retval = FAIL;
++    if (fwv != (size_t)1)
++      retval = FAIL;
++    if (retval == FAIL)
++      EMSG(_(e_write));
++
+     return retval;
+ }
+ /*
+  * Clear the index and wnode fields of "node", it siblings and its
+@@ -9888,10 +10085,11 @@ write_spell_prefcond(fd, gap)
+ {
+     int               i;
+     char_u    *p;
+     int               len;
+     int               totlen;
++    size_t    x = 1;  /* collect return value of fwrite() */
+     if (fd != NULL)
+       put_bytes(fd, (long_u)gap->ga_len, 2);      /* <prefcondcnt> */
+     totlen = 2 + gap->ga_len; /* length of <prefcondcnt> and <condlen> bytes */
+@@ -9904,11 +10102,11 @@ write_spell_prefcond(fd, gap)
+       {
+           len = (int)STRLEN(p);
+           if (fd != NULL)
+           {
+               fputc(len, fd);
+-              fwrite(p, (size_t)len, (size_t)1, fd);
++              x &= fwrite(p, (size_t)len, (size_t)1, fd);
+           }
+           totlen += len;
+       }
+       else if (fd != NULL)
+           fputc(0, fd);
+@@ -10052,10 +10250,11 @@ spell_suggest(count)
+     int               mouse_used;
+     int               need_cap;
+     int               limit;
+     int               selected = count;
+     int               badlen = 0;
++    int               msg_scroll_save = msg_scroll;
+     if (no_spell_checking(curwin))
+       return;
+ #ifdef FEAT_VISUAL
+@@ -10105,11 +10304,14 @@ spell_suggest(count)
+     /* Get the word and its length. */
+     /* Figure out if the word should be capitalised. */
+     need_cap = check_need_cap(curwin->w_cursor.lnum, curwin->w_cursor.col);
+-    line = ml_get_curline();
++    /* Make a copy of current line since autocommands may free the line. */
++    line = vim_strsave(ml_get_curline());
++    if (line == NULL)
++      goto skip;
+     /* Get the list of suggestions.  Limit to 'lines' - 2 or the number in
+      * 'spellsuggest', whatever is smaller. */
+     if (sps_limit > (int)Rows - 2)
+       limit = (int)Rows - 2;
+@@ -10216,11 +10418,13 @@ spell_suggest(count)
+ #endif
+       /* Ask for choice. */
+       selected = prompt_for_number(&mouse_used);
+       if (mouse_used)
+           selected -= lines_left;
+-      lines_left = Rows;      /* avoid more prompt */
++      lines_left = Rows;              /* avoid more prompt */
++      /* don't delay for 'smd' in normal_cmd() */
++      msg_scroll = msg_scroll_save;
+     }
+     if (selected > 0 && selected <= sug.su_ga.ga_len && u_save_cursor() == OK)
+     {
+       /* Save the from and to text for :spellrepall. */
+@@ -10241,11 +10445,12 @@ spell_suggest(count)
+           repl_from = vim_strnsave(sug.su_badptr, stp->st_orglen);
+           repl_to = vim_strsave(stp->st_word);
+       }
+       /* Replace the word. */
+-      p = alloc((unsigned)STRLEN(line) - stp->st_orglen + stp->st_wordlen + 1);
++      p = alloc((unsigned)STRLEN(line) - stp->st_orglen
++                                                     + stp->st_wordlen + 1);
+       if (p != NULL)
+       {
+           c = (int)(sug.su_badptr - line);
+           mch_memmove(p, line, c);
+           STRCPY(p + c, stp->st_word);
+@@ -10266,10 +10471,12 @@ spell_suggest(count)
+     }
+     else
+       curwin->w_cursor = prev_cursor;
+     spell_find_cleanup(&sug);
++skip:
++    vim_free(line);
+ }
+ /*
+  * Check if the word at line "lnum" column "col" is required to start with a
+  * capital.  This uses 'spellcapcheck' of the current buffer.
+@@ -10341,14 +10548,13 @@ check_need_cap(lnum, col)
+ /*
+  * ":spellrepall"
+  */
+-/*ARGSUSED*/
+     void
+ ex_spellrepall(eap)
+-    exarg_T *eap;
++    exarg_T *eap UNUSED;
+ {
+     pos_T     pos = curwin->w_cursor;
+     char_u    *frompat;
+     int               addlen;
+     char_u    *line;
+@@ -10728,11 +10934,11 @@ spell_suggest_intern(su, interactive)
+           /* Adjust the word score for the suggestions found so far for how
+            * they sounds like. */
+           rescore_suggestions(su);
+       /*
+-       * While going throught the soundfold tree "su_maxscore" is the score
++       * While going through the soundfold tree "su_maxscore" is the score
+        * for the soundfold word, limits the changes that are being tried,
+        * and "su_sfmaxscore" the rescored score, which is set by
+        * cleanup_suggestions().
+        * First find words with a small edit distance, because this is much
+        * faster and often already finds the top-N suggestions.  If we didn't
+@@ -11212,11 +11418,11 @@ suggest_trie_walk(su, lp, fword, soundfo
+     int               soundfold;
+ {
+     char_u    tword[MAXWLEN];     /* good word collected so far */
+     trystate_T        stack[MAXWLEN];
+     char_u    preword[MAXWLEN * 3]; /* word found with proper case;
+-                                     * concatanation of prefix compound
++                                     * concatenation of prefix compound
+                                      * words and split word.  NUL terminated
+                                      * when going deeper but not when coming
+                                      * back. */
+     char_u    compflags[MAXWLEN];     /* compound flags, one for each word */
+     trystate_T        *sp;
+@@ -11478,19 +11684,28 @@ suggest_trie_walk(su, lp, fword, soundfo
+                   compflags[sp->ts_complen] = ((unsigned)flags >> 24);
+                   compflags[sp->ts_complen + 1] = NUL;
+                   vim_strncpy(preword + sp->ts_prewordlen,
+                           tword + sp->ts_splitoff,
+                           sp->ts_twordlen - sp->ts_splitoff);
+-                  p = preword;
+-                  while (*skiptowhite(p) != NUL)
+-                      p = skipwhite(skiptowhite(p));
+-                  if (fword_ends && !can_compound(slang, p,
+-                                              compflags + sp->ts_compsplit))
+-                      /* Compound is not allowed.  But it may still be
+-                       * possible if we add another (short) word. */
++
++                  /* Verify CHECKCOMPOUNDPATTERN  rules. */
++                  if (match_checkcompoundpattern(preword,  sp->ts_prewordlen,
++                                                        &slang->sl_comppat))
+                       compound_ok = FALSE;
++                  if (compound_ok)
++                  {
++                      p = preword;
++                      while (*skiptowhite(p) != NUL)
++                          p = skipwhite(skiptowhite(p));
++                      if (fword_ends && !can_compound(slang, p,
++                                              compflags + sp->ts_compsplit))
++                          /* Compound is not allowed.  But it may still be
++                           * possible if we add another (short) word. */
++                          compound_ok = FALSE;
++                  }
++
+                   /* Get pointer to last char of previous word. */
+                   p = preword + sp->ts_prewordlen;
+                   mb_ptr_back(preword, p);
+               }
+           }
+@@ -11683,14 +11898,13 @@ suggest_trie_walk(su, lp, fword, soundfo
+                                                     >= slang->sl_compminlen)
+ #endif
+                       && (slang->sl_compsylmax < MAXWLEN
+                           || sp->ts_complen + 1 - sp->ts_compsplit
+                                                         < slang->sl_compmax)
+-                      && (byte_in_str(sp->ts_complen == sp->ts_compsplit
+-                                          ? slang->sl_compstartflags
+-                                          : slang->sl_compallflags,
+-                                                  ((unsigned)flags >> 24))))
++                      && (can_be_compound(sp, slang,
++                                       compflags, ((unsigned)flags >> 24))))
++
+               {
+                   try_compound = TRUE;
+                   compflags[sp->ts_complen] = ((unsigned)flags >> 24);
+                   compflags[sp->ts_complen + 1] = NUL;
+               }
+@@ -14806,11 +15020,11 @@ soundalike_score(goodstart, badstart)
+           /* Failed to compare. */
+           break;
+       case 0:
+           /*
+-           * Lenghts are equal, thus changes must result in same length: An
++           * Lengths are equal, thus changes must result in same length: An
+            * insert is only possible in combination with a delete.
+            * 1: check if for identical strings
+            */
+           if (*pl == NUL)
+               return score;
+@@ -15396,14 +15610,13 @@ pop:
+ #endif
+ /*
+  * ":spellinfo"
+  */
+-/*ARGSUSED*/
+     void
+ ex_spellinfo(eap)
+-    exarg_T *eap;
++    exarg_T *eap UNUSED;
+ {
+     int               lpi;
+     langp_T   *lp;
+     char_u    *p;
+@@ -15943,15 +16156,13 @@ spell_expand_check_cap(col)
+  * Get list of spelling suggestions.
+  * Used for Insert mode completion CTRL-X ?.
+  * Returns the number of matches.  The matches are in "matchp[]", array of
+  * allocated strings.
+  */
+-/*ARGSUSED*/
+     int
+-expand_spelling(lnum, col, pat, matchp)
+-    linenr_T  lnum;
+-    int               col;
++expand_spelling(lnum, pat, matchp)
++    linenr_T  lnum UNUSED;
+     char_u    *pat;
+     char_u    ***matchp;
+ {
+     garray_T  ga;
+--- vim72.orig/src/structs.h
++++ vim72/src/structs.h
+@@ -14,11 +14,11 @@
+  * There is something wrong in the SAS compiler that makes typedefs not
+  * valid in include files.  Has been fixed in version 6.58.
+  */
+ #if defined(SASC) && SASC < 658
+ typedef long          linenr_T;
+-typedef unsigned      colnr_T;
++typedef int           colnr_T;
+ typedef unsigned short        short_u;
+ #endif
+ /*
+  * position in file or buffer
+@@ -31,13 +31,13 @@ typedef struct
+     colnr_T   coladd;
+ #endif
+ } pos_T;
+ #ifdef FEAT_VIRTUALEDIT
+-# define INIT_POS_T {0, 0, 0}
++# define INIT_POS_T(l, c, ca) {l, c, ca}
+ #else
+-# define INIT_POS_T {0, 0}
++# define INIT_POS_T(l, c, ca) {l, c}
+ #endif
+ /*
+  * Same, but without coladd.
+  */
+@@ -430,10 +430,11 @@ struct buffheader
+  */
+ typedef struct expand
+ {
+     int               xp_context;             /* type of expansion */
+     char_u    *xp_pattern;            /* start of item to expand */
++    int               xp_pattern_len;         /* bytes in xp_pattern before cursor */
+ #if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
+     char_u    *xp_arg;                /* completion function */
+     int               xp_scriptID;            /* SID for completion function */
+ #endif
+     int               xp_backslash;           /* one of the XP_BS_ values */
+@@ -457,11 +458,11 @@ typedef struct expand
+  * easy manipulation.
+  */
+ typedef struct
+ {
+     int               hide;                   /* TRUE when ":hide" was used */
+-# ifdef FEAT_BROWSE
++# ifdef FEAT_BROWSE_CMD
+     int               browse;                 /* TRUE to invoke file dialog */
+ # endif
+ # ifdef FEAT_WINDOWS
+     int               split;                  /* flags for win_split() */
+     int               tab;                    /* > 0 when ":tab" was used */
+@@ -880,10 +881,12 @@ typedef struct
+ /* Struct to hold the saved typeahead for save_typeahead(). */
+ typedef struct
+ {
+     typebuf_T         save_typebuf;
+     int                       typebuf_valid;      /* TRUE when save_typebuf valid */
++    int                       old_char;
++    int                       old_mod_mask;
+     struct buffheader save_stuffbuff;
+ #ifdef USE_INPUT_BUF
+     char_u            *save_inputbuf;
+ #endif
+ } tasave_T;
+@@ -1164,11 +1167,12 @@ struct file_buffer
+     char_u    *b_ffname;      /* full path file name */
+     char_u    *b_sfname;      /* short file name */
+     char_u    *b_fname;       /* current file name */
+ #ifdef UNIX
+-    int               b_dev;          /* device number (-1 if not set) */
++    int               b_dev_valid;    /* TRUE when b_dev has a valid number */
++    dev_t     b_dev;          /* device number */
+     ino_t     b_ino;          /* inode number */
+ #endif
+ #ifdef FEAT_CW_EDITOR
+     FSSpec    b_FSSpec;       /* MacOS File Identification */
+ #endif
+@@ -1618,10 +1622,18 @@ struct diffblock_S
+     linenr_T  df_lnum[DB_COUNT];      /* line number in buffer */
+     linenr_T  df_count[DB_COUNT];     /* nr of inserted/changed lines */
+ };
+ #endif
++#define SNAP_HELP_IDX 0
++#ifdef FEAT_AUTOCMD
++# define SNAP_AUCMD_IDX 1
++# define SNAP_COUNT   2
++#else
++# define SNAP_COUNT   1
++#endif
++
+ /*
+  * Tab pages point to the top frame of each tab page.
+  * Note: Most values are NOT valid for the current tab page!  Use "curwin",
+  * "firstwin", etc. for that.  "tp_topframe" is always valid and can be
+  * compared against "topframe" to find the current tab page.
+@@ -1646,11 +1658,11 @@ struct tabpage_S
+ #ifdef FEAT_DIFF
+     diff_T        *tp_first_diff;
+     buf_T         *(tp_diffbuf[DB_COUNT]);
+     int                   tp_diff_invalid;    /* list of diffs is outdated */
+ #endif
+-    frame_T       *tp_snapshot;    /* window layout snapshot */
++    frame_T       *(tp_snapshot[SNAP_COUNT]);  /* window layout snapshots */
+ #ifdef FEAT_EVAL
+     dictitem_T            tp_winvar;      /* variable for "t:" Dictionary */
+     dict_T        tp_vars;        /* internal variables, local to tab page */
+ #endif
+ };
+@@ -1782,14 +1794,19 @@ struct window_S
+     colnr_T   w_old_visual_col;   /* last known start of visual part */
+     colnr_T   w_old_curswant;     /* last known value of Curswant */
+ #endif
+     /*
+-     * The next three specify the offsets for displaying the buffer:
++     * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for
++     * displaying the buffer.
+      */
+     linenr_T  w_topline;          /* buffer line number of the line at the
+                                      top of the window */
++#ifdef FEAT_AUTOCMD
++    char      w_topline_was_set;  /* flag set to TRUE when topline is set,
++                                     e.g. by winrestview() */
++#endif
+ #ifdef FEAT_DIFF
+     int               w_topfill;          /* number of filler lines above w_topline */
+     int               w_old_topfill;      /* w_topfill at last redraw */
+     int               w_botfill;          /* TRUE when filler lines are actually
+                                      below w_topline (at end of file) */
+@@ -2268,20 +2285,17 @@ typedef int vimmenu_T;
+  * Struct to save values in before executing autocommands for a buffer that is
+  * not the current buffer.  Without FEAT_AUTOCMD only "curbuf" is remembered.
+  */
+ typedef struct
+ {
+-    buf_T     *save_buf;      /* saved curbuf */
++    buf_T     *save_curbuf;   /* saved curbuf */
+ #ifdef FEAT_AUTOCMD
+-    buf_T     *new_curbuf;    /* buffer to be used */
+-    win_T     *save_curwin;   /* saved curwin, NULL if it didn't change */
+-    win_T     *new_curwin;    /* new curwin if save_curwin != NULL */
+-    pos_T     save_cursor;    /* saved cursor pos of save_curwin */
+-    linenr_T  save_topline;   /* saved topline of save_curwin */
+-# ifdef FEAT_DIFF
+-    int               save_topfill;   /* saved topfill of save_curwin */
+-# endif
++    int               use_aucmd_win;  /* using aucmd_win */
++    win_T     *save_curwin;   /* saved curwin */
++    win_T     *new_curwin;    /* new curwin */
++    buf_T     *new_curbuf;    /* new curbuf */
++    char_u    *globaldir;     /* saved value of globaldir */
+ #endif
+ } aco_save_T;
+ /*
+  * Generic option table item, only used for printer at the moment.
+--- vim72.orig/src/syntax.c
++++ vim72/src/syntax.c
+@@ -204,11 +204,11 @@ typedef struct syn_pattern
+  * The attributes of the syntax item that has been recognized.
+  */
+ static int current_attr = 0;      /* attr of current syntax word */
+ #ifdef FEAT_EVAL
+ static int current_id = 0;        /* ID of current char for syn_get_id() */
+-static int current_trans_id = 0;    /* idem, transparancy removed */
++static int current_trans_id = 0;    /* idem, transparency removed */
+ #endif
+ typedef struct syn_cluster_S
+ {
+     char_u        *scl_name;      /* syntax cluster name */
+@@ -280,11 +280,11 @@ static int keepend_level = -1;
+ typedef struct state_item
+ {
+     int               si_idx;                 /* index of syntax pattern or
+                                          KEYWORD_IDX */
+     int               si_id;                  /* highlight group ID for keywords */
+-    int               si_trans_id;            /* idem, transparancy removed */
++    int               si_trans_id;            /* idem, transparency removed */
+     int               si_m_lnum;              /* lnum of the match */
+     int               si_m_startcol;          /* starting column of the match */
+     lpos_T    si_m_endpos;            /* just after end posn of the match */
+     lpos_T    si_h_startpos;          /* start position of the highlighting */
+     lpos_T    si_h_endpos;            /* end position of the highlighting */
+@@ -1272,11 +1272,11 @@ syn_stack_cleanup()
+       dist = 999999;
+     else
+       dist = syn_buf->b_ml.ml_line_count / (syn_buf->b_sst_len - Rows) + 1;
+     /*
+-     * Go throught the list to find the "tick" for the oldest entry that can
++     * Go through the list to find the "tick" for the oldest entry that can
+      * be removed.  Set "above" when the "tick" for the oldest entry is above
+      * "b_sst_lasttick" (the display tick wraps around).
+      */
+     tick = syn_buf->b_sst_lasttick;
+     above = FALSE;
+@@ -2317,11 +2317,11 @@ syn_current_attr(syncing, displaying, ca
+        * ":syn spell toplevel" was used. */
+       *can_spell = syn_buf->b_syn_spell == SYNSPL_DEFAULT
+                   ? (syn_buf->b_spell_cluster_id == 0)
+                   : (syn_buf->b_syn_spell == SYNSPL_TOP);
+-    /* nextgroup ends at end of line, unless "skipnl" or "skipemtpy" present */
++    /* nextgroup ends at end of line, unless "skipnl" or "skipempty" present */
+     if (current_next_list != NULL
+           && syn_getcurline()[current_col + 1] == NUL
+           && !(current_next_flags & (HL_SKIPNL | HL_SKIPEMPTY)))
+       current_next_list = NULL;
+@@ -3084,10 +3084,16 @@ syn_add_start_off(result, regmatch, spp,
+     {
+       result->lnum = regmatch->startpos[0].lnum;
+       col = regmatch->startpos[0].col;
+       off = spp->sp_offsets[idx];
+     }
++    if (result->lnum > syn_buf->b_ml.ml_line_count)
++    {
++      /* a "\n" at the end of the pattern may take us below the last line */
++      result->lnum = syn_buf->b_ml.ml_line_count;
++      col = (int)STRLEN(ml_get_buf(syn_buf, result->lnum, FALSE));
++    }
+     if (off != 0)
+     {
+       base = ml_get_buf(syn_buf, result->lnum, FALSE);
+       p = base + col;
+       if (off > 0)
+@@ -3222,15 +3228,14 @@ check_keyword_id(line, startcol, endcolp
+ }
+ /*
+  * Handle ":syntax case" command.
+  */
+-/* ARGSUSED */
+     static void
+ syn_cmd_case(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;            /* not used */
++    int               syncing UNUSED;
+ {
+     char_u    *arg = eap->arg;
+     char_u    *next;
+     eap->nextcmd = find_nextcmd(arg);
+@@ -3247,15 +3252,14 @@ syn_cmd_case(eap, syncing)
+ }
+ /*
+  * Handle ":syntax spell" command.
+  */
+-/* ARGSUSED */
+     static void
+ syn_cmd_spell(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;            /* not used */
++    int               syncing UNUSED;
+ {
+     char_u    *arg = eap->arg;
+     char_u    *next;
+     eap->nextcmd = find_nextcmd(arg);
+@@ -3515,41 +3519,38 @@ syn_clear_one(id, syncing)
+ }
+ /*
+  * Handle ":syntax on" command.
+  */
+-/* ARGSUSED */
+     static void
+ syn_cmd_on(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;        /* not used */
++    int               syncing UNUSED;
  {
-     char    *varname = NULL;
-@@ -354,14 +352,13 @@ catchcmd(dummy, interp, objc, objv)
+     syn_cmd_onoff(eap, "syntax");
  }
  
  /*
-  *  "::vim::beep" - what Vi[m] does best :-)
+  * Handle ":syntax enable" command.
   */
 -/* ARGSUSED */
-     static int
- beepcmd(dummy, interp, objc, objv)
--    ClientData dummy;
-+    ClientData dummy UNUSED;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
+     static void
+ syn_cmd_enable(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;        /* not used */
++    int               syncing UNUSED;
  {
-     if (objc != 1)
-@@ -376,14 +373,13 @@ beepcmd(dummy, interp, objc, objv)
+     set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"enable");
+     syn_cmd_onoff(eap, "syntax");
+     do_unlet((char_u *)"g:syntax_cmd", TRUE);
+ }
  /*
-  *  "::vim::buffer list" - create a list of buffer commands.
-  *  "::vim::buffer {N}" - create buffer command for buffer N.
-  *  "::vim::buffer new" - create a new buffer (not implemented)
+  * Handle ":syntax reset" command.
   */
 -/* ARGSUSED */
-     static int
- buffercmd(dummy, interp, objc, objv)
--    ClientData dummy;
-+    ClientData dummy UNUSED;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
+     static void
+ syn_cmd_reset(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;        /* not used */
++    int               syncing UNUSED;
  {
-     char      *name;
-@@ -473,14 +469,13 @@ buffercmd(dummy, interp, objc, objv)
+     eap->nextcmd = check_nextcmd(eap->arg);
+     if (!eap->skip)
+     {
+       set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"reset");
+@@ -3559,27 +3560,25 @@ syn_cmd_reset(eap, syncing)
  }
  
  /*
-  * "::vim::window list" - create list of window commands.
+  * Handle ":syntax manual" command.
   */
 -/* ARGSUSED */
-     static int
- windowcmd(dummy, interp, objc, objv)
--    ClientData        dummy;
-+    ClientData        dummy UNUSED;
-     Tcl_Interp        *interp;
-     int               objc;
-     Tcl_Obj   *CONST objv[];
+     static void
+ syn_cmd_manual(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;        /* not used */
++    int               syncing UNUSED;
  {
-     char      *what, *string;
-@@ -1128,14 +1123,13 @@ winselfcmd(ref, interp, objc, objv)
-     return err;
+     syn_cmd_onoff(eap, "manual");
  }
  
+ /*
+  * Handle ":syntax off" command.
+  */
 -/* ARGSUSED */
-     static int
- commandcmd(dummy, interp, objc, objv)
--    ClientData        dummy;
-+    ClientData        dummy UNUSED;
-     Tcl_Interp        *interp;
-     int               objc;
-     Tcl_Obj   *CONST objv[];
+     static void
+ syn_cmd_off(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;        /* not used */
++    int               syncing UNUSED;
  {
-     int               err;
-@@ -1143,14 +1137,13 @@ commandcmd(dummy, interp, objc, objv)
-     err = tcldoexcommand(interp, objc, objv, 1);
-     update_screen(VALID);
-     return err;
+     syn_cmd_onoff(eap, "nosyntax");
  }
  
--/* ARGSUSED */
-     static int
optioncmd(dummy, interp, objc, objv)
--    ClientData        dummy;
-+    ClientData        dummy UNUSED;
-     Tcl_Interp        *interp;
-     int               objc;
-     Tcl_Obj   *CONST objv[];
- {
-     int               err;
-@@ -1158,14 +1151,13 @@ optioncmd(dummy, interp, objc, objv)
-     err = tclsetoption(interp, objc, objv, 1);
-     update_screen(VALID);
-     return err;
+     static void
+@@ -4172,11 +4171,10 @@ clear_keywtab(ht)
    for (hi = ht->ht_array; todo > 0; ++hi)
+     {
+       if (!HASHITEM_EMPTY(hi))
+       {
+           --todo;
+-          kp = HI2KE(hi);
+           for (kp = HI2KE(hi); kp != NULL; kp = kp_next)
+           {
+               kp_next = kp->ke_next;
+               vim_free(kp->next_list);
+               vim_free(kp->k_syn.cont_in_list);
+@@ -4459,15 +4457,14 @@ syn_incl_toplevel(id, flagsp)
  }
  
+ /*
+  * Handle ":syntax include [@{group-name}] filename" command.
+  */
 -/* ARGSUSED */
-     static int
- exprcmd(dummy, interp, objc, objv)
--    ClientData        dummy;
-+    ClientData        dummy UNUSED;
-     Tcl_Interp        *interp;
-     int               objc;
-     Tcl_Obj   *CONST objv[];
+     static void
+ syn_cmd_include(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;            /* not used */
++    int               syncing UNUSED;
  {
-     return tclvimexpr(interp, objc, objv, 1);
-@@ -1582,15 +1574,14 @@ tclsetdelcmd(interp, reflist, vimobj, de
- /*******************************************
-     I/O Channel
- ********************************************/
+     char_u    *arg = eap->arg;
+     int               sgl_id = 1;
+     char_u    *group_name_end;
+     char_u    *rest;
+@@ -4530,15 +4527,14 @@ syn_cmd_include(eap, syncing)
+ }
  
+ /*
+  * Handle ":syntax keyword {group-name} [{option}] keyword .." command.
+  */
 -/* ARGSUSED */
-     static int
channel_close(instance, interp)
-     ClientData        instance;
--    Tcl_Interp        *interp;
-+    Tcl_Interp        *interp UNUSED;
+     static void
syn_cmd_keyword(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;            /* not used */
++    int               syncing UNUSED;
  {
-     int               err = 0;
-     /* currently does nothing */
-@@ -1600,16 +1591,15 @@ channel_close(instance, interp)
-       err = EBADF;
-     }
-     return err;
- }
+     char_u    *arg = eap->arg;
+     char_u    *group_name_end;
+     int               syn_id;
+     char_u    *rest;
+@@ -5273,15 +5269,14 @@ syn_add_cluster(name)
  
+ /*
+  * Handle ":syntax cluster {cluster-name} [contains={groupname},..]
+  *            [add={groupname},..] [remove={groupname},..]".
+  */
 -/* ARGSUSED */
-     static int
- channel_input(instance, buf, bufsiz, errptr)
--    ClientData        instance;
--    char      *buf;
--    int               bufsiz;
-+    ClientData        instance UNUSED;
-+    char      *buf UNUSED;
-+    int               bufsiz UNUSED;
-     int               *errptr;
+     static void
+ syn_cmd_cluster(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;            /* not used */
++    int               syncing UNUSED;
  {
-     /* input is currently not supported */
-@@ -1657,43 +1647,56 @@ channel_output(instance, buf, bufsiz, er
-     }
-     vim_free(str);
-     return result;
+     char_u    *arg = eap->arg;
+     char_u    *group_name_end;
+     char_u    *rest;
+     int               scl_id;
+@@ -5462,15 +5457,14 @@ get_syn_pattern(arg, ci)
  }
  
+ /*
+  * Handle ":syntax sync .." command.
+  */
 -/* ARGSUSED */
      static void
- channel_watch(instance, mask)
--    ClientData        instance;
--    int               mask;
-+    ClientData        instance UNUSED;
-+    int               mask UNUSED;
+ syn_cmd_sync(eap, syncing)
+     exarg_T   *eap;
+-    int               syncing;            /* not used */
++    int               syncing UNUSED;
  {
-     Tcl_SetErrno(EINVAL);
- }
+     char_u    *arg_start = eap->arg;
+     char_u    *arg_end;
+     char_u    *key = NULL;
+     char_u    *next_arg;
+@@ -6097,14 +6091,13 @@ static char *(case_args[]) = {"match", "
  
--/* ARGSUSED */
-     static int
- channel_gethandle(instance, direction, handleptr)
--    ClientData        instance;
--    int               direction;
--    ClientData        *handleptr;
-+    ClientData        instance UNUSED;
-+    int               direction UNUSED;
-+    ClientData        *handleptr UNUSED;
+ /*
+  * Function given to ExpandGeneric() to obtain the list syntax names for
+  * expansion.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_syntax_name(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
  {
-     Tcl_SetErrno(EINVAL);
-     return EINVAL;
+     if (expand_what == EXP_SUBCMD)
+       return (char_u *)subcommands[idx].name;
+     return (char_u *)case_args[idx];
+@@ -6118,11 +6111,11 @@ get_syntax_name(xp, idx)
+     int
+ syn_get_id(wp, lnum, col, trans, spellp, keep_state)
+     win_T     *wp;
+     long      lnum;
+     colnr_T   col;
+-    int               trans;       /* remove transparancy */
++    int               trans;       /* remove transparency */
+     int               *spellp;     /* return: can do spell checking */
+     int               keep_state;  /* keep state of char at "col" */
+ {
+     /* When the position is not after the current position and in the same
+      * line of the same buffer, need to restart parsing. */
+@@ -6210,14 +6203,12 @@ syn_get_foldlevel(wp, lnum)
+ #endif
+ static char *(highlight_init_both[]) =
+     {
+       CENT("ErrorMsg term=standout ctermbg=DarkRed ctermfg=White",
+            "ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White"),
+-#ifdef FEAT_SEARCH_EXTRA
+       CENT("IncSearch term=reverse cterm=reverse",
+            "IncSearch term=reverse cterm=reverse gui=reverse"),
+-#endif
+       CENT("ModeMsg term=bold cterm=bold",
+            "ModeMsg term=bold cterm=bold gui=bold"),
+       CENT("NonText term=bold ctermfg=Blue",
+            "NonText term=bold ctermfg=Blue gui=bold guifg=Blue"),
+       CENT("StatusLine term=reverse,bold cterm=reverse,bold",
+@@ -7533,11 +7524,11 @@ highlight_clear(idx)
  }
  
- static Tcl_ChannelType channel_type =
+ #if defined(FEAT_GUI) || defined(PROTO)
+ /*
+  * Set the normal foreground and background colors according to the "Normal"
+- * highlighighting group.  For X11 also set "Menu", "Scrollbar", and
++ * highlighting group.  For X11 also set "Menu", "Scrollbar", and
+  * "Tooltip" colors.
+  */
+     void
+ set_normal_colors()
  {
--    "vimmessage",
--    NULL,   /* blockmode */
--    channel_close,
--    channel_input,
--    channel_output,
--    NULL,   /* seek */
--    NULL,   /* set option */
--    NULL,   /* get option */
--    channel_watch,
--    channel_gethandle
-+    "vimmessage",     /* typeName */
-+    NULL,             /* version */
-+    channel_close,    /* closeProc */
-+    channel_input,    /* inputProc */
-+    channel_output,   /* outputProc */
-+    NULL,             /* seekProc */
-+    NULL,             /* setOptionProc */
-+    NULL,             /* getOptionProc */
-+    channel_watch,    /* watchProc */
-+    channel_gethandle,        /* getHandleProc */
-+    NULL,             /* close2Proc */
-+    NULL,             /* blockModeProc */
-+#ifdef TCL_CHANNEL_VERSION_2
-+    NULL,             /* flushProc */
-+    NULL,             /* handlerProc */
-+#endif
-+#ifdef TCL_CHANNEL_VERSION_3
-+    NULL,             /* wideSeekProc */
-+#endif
-+#ifdef TCL_CHANNEL_VERSION_4
-+    NULL,             /* threadActionProc */
-+#endif
-+#ifdef TCL_CHANNEL_VERSION_5
-+    NULL              /* truncateProc */
-+#endif
- };
- /**********************************
-   Interface to vim
-  **********************************/
---- vim72.orig/runtime/doc/if_mzsch.txt
-+++ vim72/runtime/doc/if_mzsch.txt
-@@ -1,18 +1,19 @@
--*if_mzsch.txt*  For Vim version 7.2.  Last change: 2008 Jun 28
-+*if_mzsch.txt*  For Vim version 7.2.  Last change: 2010 Jan 19
-                 VIM REFERENCE MANUAL    by Sergey Khorev
- The MzScheme Interface to Vim                         *mzscheme* *MzScheme*
- 1. Commands                           |mzscheme-commands|
- 2. Examples                           |mzscheme-examples|
- 3. Threads                            |mzscheme-threads|
--4. The Vim access procedures          |mzscheme-vim|
--5. Dynamic loading                    |mzscheme-dynamic|
-+4. Vim access from MzScheme           |mzscheme-vim|
-+5. mzeval() Vim function              |mzscheme-mzeval|
-+6. Dynamic loading                    |mzscheme-dynamic|
- {Vi does not have any of these commands}
- The MzScheme interface is available only if Vim was compiled with the
- |+mzscheme| feature.
-@@ -40,24 +41,18 @@ Note: On FreeBSD you should use the "drs
-                       feature wasn't compiled in.  To avoid errors, see
-                       |script-here|.
-                                                       *:mzfile* *:mzf*
- :[range]mzf[ile] {file}       Execute the MzScheme script in {file}.  {not in Vi}
--                      All statements are executed in the namespace of the
--                      buffer that was current during :mzfile start.
--                      If you want to access other namespaces, use
--                      'parameterize'.
- All of these commands do essentially the same thing - they execute a piece of
- MzScheme code, with the "current range" set to the given line
- range.
+@@ -7742,18 +7733,17 @@ fontset_name2handle(name, fixed_width)
+ # endif
  
- In the case of :mzscheme, the code to execute is in the command-line.
- In the case of :mzfile, the code to execute is the contents of the given file.
+ /*
+  * Get the font or fontset for one highlight group.
+  */
+-/*ARGSUSED*/
+     static void
+ hl_do_font(idx, arg, do_normal, do_menu, do_tooltip)
+     int               idx;
+     char_u    *arg;
+-    int               do_normal;      /* set normal font */
+-    int               do_menu;        /* set menu font */
+-    int               do_tooltip;     /* set tooltip font */
++    int               do_normal;              /* set normal font */
++    int               do_menu UNUSED;         /* set menu font */
++    int               do_tooltip UNUSED;      /* set tooltip font */
+ {
+ # ifdef FEAT_XFONTSET
+     /* If 'guifontset' is not empty, first try using the name as a
+      * fontset.  If that doesn't work, use it as a font name. */
+     if (*p_guifontset != NUL
+@@ -8332,32 +8322,42 @@ highlight_has_attr(id, flag, modec)
+  * Return color name of highlight group "id".
+  */
+     char_u *
+ highlight_color(id, what, modec)
+     int               id;
+-    char_u    *what;  /* "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
++    char_u    *what;  /* "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
+     int               modec;  /* 'g' for GUI, 'c' for cterm, 't' for term */
+ {
+     static char_u     name[20];
+     int                       n;
+     int                       fg = FALSE;
+ # ifdef FEAT_GUI
+     int                       sp = FALSE;
++    int                       font = FALSE;
+ # endif
  
--Each buffer has its own MzScheme namespace. Global namespace is bound to
--the "global-namespace" value from the 'vimext' module.
- MzScheme interface defines exception exn:vim, derived from exn.
- It is raised for various Vim errors.
+     if (id <= 0 || id > highlight_ga.ga_len)
+       return NULL;
  
- During compilation, the MzScheme interface will remember the current MzScheme
- collection path. If you want to specify additional paths use the
-@@ -77,79 +72,68 @@ The exn:vim is available without explici
+-    if (TOLOWER_ASC(what[0]) == 'f')
++    if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'g')
+       fg = TRUE;
+ # ifdef FEAT_GUI
+-    else if (TOLOWER_ASC(what[0]) == 's')
++    else if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'o'
++             && TOLOWER_ASC(what[2]) == 'n' && TOLOWER_ASC(what[3]) == 't')
++      font = TRUE;
++    else if (TOLOWER_ASC(what[0]) == 's' && TOLOWER_ASC(what[1]) == 'p')
+       sp = TRUE;
++    else if (!(TOLOWER_ASC(what[0]) == 'b' && TOLOWER_ASC(what[1]) == 'g'))
++      return NULL;
+     if (modec == 'g')
+     {
++      /* return font name */
++      if (font)
++          return HL_TABLE()[id - 1].sg_font_name;
++
+       /* return #RRGGBB form (only possible when GUI is running) */
+-      if (gui.in_use && what[1] && what[2] == '#')
++      if (gui.in_use && what[2] == '#')
+       {
+           guicolor_T          color;
+           long_u              rgb;
+           static char_u       buf[10];
  
- To avoid clashes with MzScheme, consider using prefix when requiring module,
- e.g.: >
-       :mzscheme (require (prefix vim- vimext))
- <
--All the examples below assume this naming scheme.  Note that you need to do
--this again for every buffer.
-+All the examples below assume this naming scheme.
+@@ -8380,10 +8380,12 @@ highlight_color(id, what, modec)
+           return (HL_TABLE()[id - 1].sg_gui_fg_name);
+       if (sp)
+           return (HL_TABLE()[id - 1].sg_gui_sp_name);
+       return (HL_TABLE()[id - 1].sg_gui_bg_name);
+     }
++    if (font || sp)
++      return NULL;
+ # endif
+     if (modec == 'c')
+     {
+       if (fg)
+           n = HL_TABLE()[id - 1].sg_cterm_fg - 1;
+@@ -8658,10 +8660,11 @@ syn_add_group(name)
+     for (p = name; *p != NUL; ++p)
+     {
+       if (!vim_isprintc(*p))
+       {
+           EMSG(_("E669: Unprintable character in group name"));
++          vim_free(name);
+           return 0;
+       }
+       else if (!ASCII_ISALNUM(*p) && *p != '_')
+       {
+           /* This is an error, but since there previously was no check only
+@@ -9148,14 +9151,13 @@ highlight_list_two(cnt, attr)
+     || defined(FEAT_SIGNS) || defined(PROTO)
+ /*
+  * Function given to ExpandGeneric() to obtain the list of group names.
+  * Also used for synIDattr() function.
+  */
+-/*ARGSUSED*/
+     char_u *
+ get_highlight_name(xp, idx)
+-    expand_T  *xp;
++    expand_T  *xp UNUSED;
+     int               idx;
+ {
+ #ifdef FEAT_CMDL_COMPL
+     if (idx == highlight_ga.ga_len && include_none != 0)
+       return (char_u *)"none";
+--- vim72.orig/src/tag.c
++++ vim72/src/tag.c
+@@ -88,21 +88,22 @@ static char_u *topmsg = (char_u *)N_("E5
+ static char_u *tagmatchname = NULL;   /* name of last used tag */
  
--The auto-instantiation can be achieved with autocommands, e.g. you can put
--something like this in your .vimrc (EOFs should not have indentation): >
--    function s:MzRequire()
--      if has("mzscheme")
--          :mz << EOF
--          (require (prefix vim- vimext))
--          (let ((buf (vim-get-buff-by-name (vim-eval "expand(\"<afile>\")"))))
--            (when (and buf (not (eq? buf (vim-curr-buff))))
--              (parameterize ((current-namespace (vim-get-buff-namespace buf)))
--                (namespace-attach-module vim-global-namespace 'vimext)
--                (namespace-require '(prefix vim vimext)))))
--    EOF
--      endif
--    endfunction
--
--    function s:MzStartup()
--      if has("mzscheme")
--          au BufNew,BufNewFile,BufAdd,BufReadPre * :call s:MzRequire()
--          :mz << EOF
--          (current-library-collection-paths
--              (cons
--                  (build-path (find-system-path 'addon-dir) (version) "collects")
--                  (current-library-collection-paths)))
--    EOF
--      endif
--    endfunction
--
--    call s:MzStartup()
--<
--
--The global namespace just instantiated this module with the prefix "vimext:".
-                                                       *mzscheme-sandbox*
- When executed in the |sandbox|, access to some filesystem and Vim interface
- procedures is restricted.
+ /*
+  * We use ftello() here, if available.  It returns off_t instead of long,
+  * which helps if long is 32 bit and off_t is 64 bit.
++ * We assume that when fseeko() is available then ftello() is too.
+  */
+-#ifdef HAVE_FTELLO
++#ifdef HAVE_FSEEKO
+ # define ftell ftello
+ #endif
  
- ==============================================================================
- 2. Examples                                           *mzscheme-examples*
- >
-       :mzscheme (display "Hello")
-+      :mz (display (string-append "Using MzScheme version " (version)))
-+      :mzscheme (require (prefix vim- vimext)) ; for MzScheme < 4.x
-+      :mzscheme (require (prefix-in vim- 'vimext)) ; MzScheme 4.x
-       :mzscheme (vim-set-buff-line 10 "This is line #10")
- <
- Inline script usage: >
-       function! <SID>SetFirstLine()
-           :mz << EOF
-           (display "!!!")
-+          (require (prefix vim- vimext))
-+          ; for newer versions (require (prefix-in vim- 'vimext))
-           (vim-set-buff-line 1 "This is line #1")
-           (vim-beep)
--          EOF
-+      EOF
-       endfunction
+ #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
+ /*
+  * Tag for preview window is remembered separately, to avoid messing up the
+  * normal tagstack.
+  */
+-static taggy_T ptag_entry = {NULL};
++static taggy_T ptag_entry = {NULL, {INIT_POS_T(0, 0, 0), 0}, 0, 0};
+ #endif
  
-       nmap <F9> :call <SID>SetFirstLine() <CR>
- <
- File execution: >
-       :mzfile supascript.scm
- <
--Accessing the current buffer namespace from an MzScheme program running in
--another buffer within |:mzfile|-executed script : >
--      ; Move to the window below
--      (vim-command "wincmd j")
--      ; execute in the context of buffer, to which window belongs
--      ; assume that buffer has 'textstring' defined
--      (parameterize ((current-namespace
--                      (vim-get-buff-namespace (vim-curr-buff))))
--       (eval '(vim-set-buff-line 1 textstring)))
--<
-+Vim exception handling: >
-+      :mz << EOF
-+      (require (prefix vim- vimext))
-+      ; for newer versions (require (prefix-in vim- 'vimext))
-+      (with-handlers
-+        ([exn:vim? (lambda (e) (display (exn-message e)))])
-+        (vim-eval "nonsense-string"))
-+      EOF
-+<
-+Auto-instantiation of vimext module (can be placed in your |vimrc|): >
-+    function! MzRequire()
-+      :redir => l:mzversion
-+      :mz (version)
-+      :redir END
-+      if strpart(l:mzversion, 1, 1) < "4"
-+          " MzScheme versions < 4.x:
-+          :mz (require (prefix vim- vimext))
-+      else
-+          " newer versions:
-+          :mz (require (prefix-in vim- 'vimext))
-+      endif
-+    endfunction
+ /*
+  * Jump to tag; handling of tag commands and tag stack
+  *
+@@ -513,11 +514,11 @@ do_tag(tag, type, count, forceit, verbos
  
-+    if has("mzscheme")
-+      silent call MzRequire()
-+    endif
-+<
- ==============================================================================
- 3. Threads                                            *mzscheme-threads*
+           /*
+            * If a count is supplied to the ":tag <name>" command, then
+            * jump to count'th matching tag.
+            */
+-          if (type == DT_TAG && count > 0)
++          if (type == DT_TAG && *tag != NUL && count > 0)
+               cur_match = count - 1;
  
- The MzScheme interface supports threads. They are independent from OS threads,
- thus scheduling is required. The option 'mzquantum' determines how often
-@@ -157,24 +141,24 @@ Vim should poll for available MzScheme t
- NOTE
- Thread scheduling in the console version of Vim is less reliable than in the
- GUI version.
+           if (type == DT_SELECT || type == DT_JUMP
+ #if defined(FEAT_QUICKFIX)
+               || type == DT_LTAG
+@@ -616,11 +617,11 @@ do_tag(tag, type, count, forceit, verbos
+               MSG_PUTS_ATTR(_("  # pri kind tag"), hl_attr(HLF_T));
+               msg_clr_eos();
+               taglen_advance(taglen);
+               MSG_PUTS_ATTR(_("file\n"), hl_attr(HLF_T));
  
- ==============================================================================
--5. VIM Functions                                      *mzscheme-vim*
-+4. Vim access from MzScheme                           *mzscheme-vim*
+-              for (i = 0; i < num_matches; ++i)
++              for (i = 0; i < num_matches && !got_int; ++i)
+               {
+                   parse_match(matches[i], &tagp);
+                   if (!new_tag && (
+ #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
+                               (g_do_tagpreview
+@@ -653,10 +654,12 @@ do_tag(tag, type, count, forceit, verbos
+                       msg_puts_long_attr(p, hl_attr(HLF_D));
+                       vim_free(p);
+                   }
+                   if (msg_col > 0)
+                       msg_putchar('\n');
++                  if (got_int)
++                      break;
+                   msg_advance(15);
  
-                                                       *mzscheme-vimext*
- The 'vimext' module provides access to procedures defined in the MzScheme
- interface.
+                   /* print any extra fields */
+                   command_end = tagp.command_end;
+                   if (command_end != NULL)
+@@ -687,10 +690,12 @@ do_tag(tag, type, count, forceit, verbos
+                           while (*p && *p != '\r' && *p != '\n')
+                           {
+                               if (msg_col + ptr2cells(p) >= Columns)
+                               {
+                                   msg_putchar('\n');
++                                  if (got_int)
++                                      break;
+                                   msg_advance(15);
+                               }
+                               p = msg_outtrans_one(p, attr);
+                               if (*p == TAB)
+                               {
+@@ -702,10 +707,12 @@ do_tag(tag, type, count, forceit, verbos
+                           }
+                       }
+                       if (msg_col > 15)
+                       {
+                           msg_putchar('\n');
++                          if (got_int)
++                              break;
+                           msg_advance(15);
+                       }
+                   }
+                   else
+                   {
+@@ -732,10 +739,12 @@ do_tag(tag, type, count, forceit, verbos
  
- Common
- ------
-     (command {command-string})            Perform the vim ":Ex" style command.
--    (eval {expr-string})          Evaluate the vim expression to a string.
--                                  A |List| is turned into a string by
--                                  joining the items and inserting line
--                                  breaks.
--                                  NOTE clashes with MzScheme eval
-+    (eval {expr-string})          Evaluate the vim expression into
-+                                  respective MzScheme object: |Lists| are
-+                                  represented as Scheme lists,
-+                                  |Dictionaries| as hash tables.
-+                                  NOTE the name clashes with MzScheme eval
-     (range-start)                 Start/End of the range passed with
-     (range-end)                           the Scheme command.
-     (beep)                        beep
-     (get-option {option-name} [buffer-or-window]) Get Vim option value (either
-                                   local or global, see set-option).
-@@ -184,11 +168,10 @@ Common
-                                   optname+=optval, etc.) When called with
-                                   {buffer} or {window} the local option will
-                                   be set. The symbol 'global can be passed
-                                   as {buffer-or-window}. Then |:setglobal|
-                                   will be used.
--    global-namespace              The MzScheme main namespace.
+                   while (p != command_end)
+                   {
+                       if (msg_col + (*p == TAB ? 1 : ptr2cells(p)) > Columns)
+                           msg_putchar('\n');
++                      if (got_int)
++                          break;
+                       msg_advance(15);
  
- Buffers                                                        *mzscheme-buffer*
- -------
-     (buff? {object})              Is object a buffer?
-     (buff-valid? {object})        Is object a valid buffer? (i.e.
-@@ -226,11 +209,10 @@ Buffers                                                   *mzscheme-buffer*
-     (open-buff {filename})        Open a new buffer (for file "name")
-     (get-buff-by-name {buffername}) Get a buffer by its filename or #f
-                                       if there is no such buffer.
-     (get-buff-by-num {buffernum})   Get a buffer by its number (return #f if
-                                   there is no buffer with this number).
--    (get-buff-namespace [buffer])   Get buffer namespace.
+                       /* skip backslash used for escaping command char */
+                       if (*p == '\\' && *(p + 1) == *tagp.command)
+                           ++p;
+@@ -758,16 +767,13 @@ do_tag(tag, type, count, forceit, verbos
+                           break;
+                   }
+                   if (msg_col)
+                       msg_putchar('\n');
+                   ui_breakcheck();
+-                  if (got_int)
+-                  {
+-                      got_int = FALSE;        /* only stop the listing */
+-                      break;
+-                  }
+               }
++              if (got_int)
++                  got_int = FALSE;    /* only stop the listing */
+               ask_for_selection = TRUE;
+           }
+ #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL)
+           else if (type == DT_LTAG)
+           {
+@@ -1098,14 +1104,13 @@ taglen_advance(l)
+ }
  
- Windows                                                           *mzscheme-window*
- ------
-     (win? {object})               Is object a window?
-     (win-valid? {object})         Is object a valid window (i.e. corresponds
-@@ -248,11 +230,17 @@ Windows                                                      *mzscheme-window*
-     (get-cursor [window])         Get cursor position in a window as
-                                   a pair (linenr . column).
-     (set-cursor (line . col) [window])  Set cursor position.
+ /*
+  * Print the tag stack
+  */
+-/*ARGSUSED*/
+     void
+ do_tags(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     int               i;
+     char_u    *name;
+     taggy_T   *tagstack = curwin->w_tagstack;
+     int               tagstackidx = curwin->w_tagstackidx;
+@@ -2523,15 +2528,14 @@ static void found_tagfile_cb __ARGS((cha
  
- ==============================================================================
--5. Dynamic loading                                    *mzscheme-dynamic*
-+5. mzeval() Vim function                                  *mzscheme-mzeval*
-+
-+To facilitate bi-directional interface, you can use |mzeval| function to
-+evaluate MzScheme expressions and pass their values to VimL.
+ /*
+  * Callback function for finding all "tags" and "tags-??" files in
+  * 'runtimepath' doc directories.
+  */
+-/*ARGSUSED*/
+     static void
+ found_tagfile_cb(fname, cookie)
+     char_u    *fname;
+-    void      *cookie;
++    void      *cookie UNUSED;
+ {
+     if (ga_grow(&tag_fnames, 1) == OK)
+       ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] =
+                                                          vim_strsave(fname);
+ }
+@@ -2540,10 +2544,19 @@ found_tagfile_cb(fname, cookie)
+     void
+ free_tag_stuff()
+ {
+     ga_clear_strings(&tag_fnames);
+     do_tag(NULL, DT_FREE, 0, 0, 0);
++    tag_freematch();
 +
-+==============================================================================
-+6. Dynamic loading                                *mzscheme-dynamic* *E815*
++# if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
++    if (ptag_entry.tagname)
++    {
++        vim_free(ptag_entry.tagname);
++        ptag_entry.tagname = NULL;
++    }
++# endif
+ }
+ #endif
  
- On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version|
- output then includes |+mzscheme/dyn|.
+ /*
+  * Get the next name of a tag file from the tag file list.
+@@ -2723,21 +2736,38 @@ parse_tag_line(lbuf,
+        * 1:  struct EnvBase ^?EnvBase^A139,4627
+        * 2: #define   ARPB_WILD_WORLD ^?153,5194
+        */
+       p_7f = vim_strchr(lbuf, 0x7f);
+       if (p_7f == NULL)
++      {
++etag_fail:
++          if (vim_strchr(lbuf, '\n') == NULL)
++          {
++              /* Truncated line.  Ignore it. */
++              if (p_verbose >= 5)
++              {
++                  verbose_enter();
++                  MSG(_("Ignoring long line in tags file"));
++                  verbose_leave();
++              }
++              tagp->command = lbuf;
++              tagp->tagname = lbuf;
++              tagp->tagname_end = lbuf;
++              return OK;
++          }
+           return FAIL;
++      }
  
- This means that Vim will search for the MzScheme DLL files only when needed.
---- vim72.orig/src/Make_ming.mak
-+++ vim72/src/Make_ming.mak
-@@ -113,18 +113,31 @@ endif
+       /* Find ^A.  If not found the line number is after the 0x7f */
+       p = vim_strchr(p_7f, Ctrl_A);
+       if (p == NULL)
+           p = p_7f + 1;
+       else
+           ++p;
  
- ifndef MZSCHEME_VER
- MZSCHEME_VER=205_000
- endif
+       if (!VIM_ISDIGIT(*p))       /* check for start of line number */
+-          return FAIL;
++          goto etag_fail;
+       tagp->command = p;
  
-+ifndef MZSCHEME_PRECISE_GC
-+MZSCHEME_PRECISE_GC=no
-+endif
-+
-+# for version 4.x we need to generate byte-code for Scheme base
-+ifndef MZSCHEME_GENERATE_BASE
-+MZSCHEME_GENERATE_BASE=no
-+endif
-+
- ifeq (no,$(DYNAMIC_MZSCHEME))
-+ifeq (yes,$(MZSCHEME_PRECISE_GC))
-+MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
-+else
- MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
-+endif
- # the modern MinGW can dynamically link to dlls directly.
- # point MZSCHEME_DLLS to where you put libmzschXXXXXXX.dll and libgcXXXXXXX.dll
- ifndef MZSCHEME_DLLS
- MZSCHEME_DLLS=$(MZSCHEME)
- endif
--MZSCHEME_LIBDIR=-L$(MZSCHEME_DLLS)
-+MZSCHEME_LIBDIR=-L$(MZSCHEME_DLLS) -L$(MZSCHEME_DLLS)\lib
- endif
  
- endif
+       if (p[-1] == Ctrl_A)        /* first format: explicit tagname given */
+       {
+@@ -2747,11 +2777,11 @@ parse_tag_line(lbuf,
+       else                        /* second format: isolate tagname */
+       {
+           /* find end of tagname */
+           for (p = p_7f - 1; !vim_iswordc(*p); --p)
+               if (p == lbuf)
+-                  return FAIL;
++                  goto etag_fail;
+           tagp->tagname_end = p + 1;
+           while (p >= lbuf && vim_iswordc(*p))
+               --p;
+           tagp->tagname = p + 1;
+       }
+@@ -3760,11 +3790,11 @@ add_tag_field(dict, field_name, start, e
+           end = start + STRLEN(start);
+           while (end > start && (end[-1] == '\r' || end[-1] == '\n'))
+               --end;
+       }
+       len = (int)(end - start);
+-      if (len > sizeof(buf) - 1)
++      if (len > (int)sizeof(buf) - 1)
+           len = sizeof(buf) - 1;
+       vim_strncpy(buf, start, len);
+     }
+     buf[len] = NUL;
+     return dict_add_nr_str(dict, field_name, 0L, buf);
+--- vim72.orig/src/term.c
++++ vim72/src/term.c
+@@ -2879,11 +2879,11 @@ ttest(pairs)
+           T_CAF = empty_option;
+       }
  
- # Python support -- works with the ActiveState python 2.0 release (and others
-@@ -197,27 +210,29 @@ RUBY_VER = 16
- endif
- ifndef RUBY_VER_LONG
- RUBY_VER_LONG = 1.6
- endif
+       /* if 'Sb' and 'AB' are not defined, reset "Co" */
+       if (*T_CSB == NUL && *T_CAB == NUL)
+-          T_CCO = empty_option;
++          free_one_termoption(T_CCO);
  
--ifeq ($(RUBY_VER), 16)
- ifndef RUBY_PLATFORM
-+ifeq ($(RUBY_VER), 16)
- RUBY_PLATFORM = i586-mswin32
--endif
--ifndef RUBY_INSTALL_NAME
--RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_VER)
--endif
-+else ifneq ("X$(wildcard, $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/i386-mingw32)", X)
-+RUBY_PLATFORM = i386-mingw32
- else
--ifndef RUBY_PLATFORM
- RUBY_PLATFORM = i386-mswin32
- endif
-+endif
-+
- ifndef RUBY_INSTALL_NAME
-+ifeq ($(RUBY_VER), 16)
-+RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_VER)
-+else
- RUBY_INSTALL_NAME = msvcrt-ruby$(RUBY_VER)
- endif
- endif
+       /* Set 'weirdinvert' according to value of 't_xs' */
+       p_wiv = (*T_XS != NUL);
+     }
+     need_gather = TRUE;
+@@ -2904,11 +2904,11 @@ add_long_to_buf(val, dst)
+     char_u  *dst;
+ {
+     int           i;
+     int           shift;
  
--RUBYINC =-I $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/$(RUBY_PLATFORM)
-+RUBYINC =-I $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/$(RUBY_PLATFORM) -I $(RUBY)/include/ruby-$(RUBY_VER_LONG) -I $(RUBY)/include/ruby-$(RUBY_VER_LONG)/$(RUBY_PLATFORM)
- ifeq (no, $(DYNAMIC_RUBY))
- RUBYLIB = -L$(RUBY)/lib -l$(RUBY_INSTALL_NAME)
- endif
+-    for (i = 1; i <= sizeof(long_u); i++)
++    for (i = 1; i <= (int)sizeof(long_u); i++)
+     {
+       shift = 8 * (sizeof(long_u) - i);
+       dst[i - 1] = (char_u) ((val >> shift) & 0xff);
+     }
+ }
+@@ -2935,11 +2935,11 @@ get_long_from_buf(buf, val)
  
- endif # RUBY
-@@ -226,29 +241,30 @@ endif # RUBY
- # Any other defines can be included here.
- DEF_GUI=-DFEAT_GUI_W32 -DFEAT_CLIPBOARD
- DEFINES=-DWIN32 -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) \
-       -DHAVE_PATHDEF -DFEAT_$(FEATURES)
- ifeq ($(CROSS),yes)
--# cross-compiler:
--CC = i586-pc-mingw32msvc-gcc
-+# cross-compiler prefix:
-+CROSS_COMPILE = i586-pc-mingw32msvc-
- DEL = rm
- MKDIR = mkdir -p
--WINDRES = i586-pc-mingw32msvc-windres
-+DIRSLASH = /
- else
- # normal (Windows) compilation:
--CC = gcc
-+CROSS_COMPILE =
- ifneq (sh.exe, $(SHELL))
- DEL = rm
- MKDIR = mkdir -p
- DIRSLASH = /
- else
- DEL = del
- MKDIR = mkdir
- DIRSLASH = \\
- endif
--WINDRES = windres
- endif
-+CC := $(CROSS_COMPILE)gcc
-+WINDRES := $(CROSS_COMPILE)windres
+     *val = 0;
+     len = get_bytes_from_buf(buf, bytes, (int)sizeof(long_u));
+     if (len != -1)
+     {
+-      for (i = 0; i < sizeof(long_u); i++)
++      for (i = 0; i < (int)sizeof(long_u); i++)
+       {
+           shift = 8 * (sizeof(long_u) - 1 - i);
+           *val += (long_u)bytes[i] << shift;
+       }
+     }
+@@ -4918,11 +4918,19 @@ check_termcode(max_offset, buf, buflen)
  
- #>>>>> end of choices
- ###########################################################################
+       /* Finally, add the special key code to our string */
+       key_name[0] = KEY2TERMCAP0(key);
+       key_name[1] = KEY2TERMCAP1(key);
+       if (key_name[0] == KS_KEY)
+-          string[new_slen++] = key_name[1];   /* from ":set <M-b>=xx" */
++      {
++          /* from ":set <M-b>=xx" */
++#ifdef FEAT_MBYTE
++          if (has_mbyte)
++              new_slen += (*mb_char2bytes)(key_name[1], string + new_slen);
++          else
++#endif
++              string[new_slen++] = key_name[1];
++      }
+       else
+       {
+           string[new_slen++] = K_SPECIAL;
+           string[new_slen++] = key_name[0];
+           string[new_slen++] = key_name[1];
+@@ -5545,11 +5553,11 @@ check_for_codes_from_term()
+  * Translate an internal mapping/abbreviation representation into the
+  * corresponding external one recognized by :map/:abbrev commands;
+  * respects the current B/k/< settings of 'cpoption'.
+  *
+  * This function is called when expanding mappings/abbreviations on the
+- * command-line, and for building the "Ambiguous mapping..." error messæge.
++ * command-line, and for building the "Ambiguous mapping..." error message.
+  *
+  * It uses a growarray to build the translation string since the
+  * latter can be wider than the original description. The caller has to
+  * free the string afterwards.
+  *
+--- vim72.orig/src/testdir/Make_amiga.mak
++++ vim72/src/testdir/Make_amiga.mak
+@@ -23,11 +23,12 @@ SCRIPTS = test1.out test3.out test4.out
+               test33.out test34.out test35.out test36.out test37.out \
+               test38.out test39.out test40.out test41.out test42.out \
+               test43.out test44.out test45.out test46.out test47.out \
+               test48.out test51.out test53.out test54.out test55.out \
+               test56.out test57.out test58.out test59.out test60.out \
+-              test61.out test62.out test63.out test64.out test65.out
++              test61.out test62.out test63.out test64.out test65.out \
++              test66.out test67.out test68.out test69.out
  
- CFLAGS = -Iproto $(DEFINES) -pipe -w -march=$(ARCH) -Wall
-@@ -408,10 +424,17 @@ ifdef PERL
- OBJ += $(OUTDIR)/if_perl.o
- endif
- ifdef MZSCHEME
- OBJ += $(OUTDIR)/if_mzsch.o
- MZSCHEME_INCL = if_mzsch.h
-+ifeq (yes,$(MZSCHEME_GENERATE_BASE))
-+CFLAGS += -DINCLUDE_MZSCHEME_BASE
-+MZ_EXTRA_DEP += mzscheme_base.c
-+endif
-+ifeq (yes,$(MZSCHEME_PRECISE_GC))
-+CFLAGS += -DMZ_PRECISE_GC
-+endif
- endif
- ifdef PYTHON
- OBJ += $(OUTDIR)/if_python.o
- endif
- ifdef RUBY
-@@ -527,24 +550,27 @@ $(TARGET): $(OUTDIR) $(OBJ)
- upx: exes
-       upx gvim.exe
-       upx vim.exe
+ .SUFFIXES: .in .out
  
- xxd/xxd.exe: xxd/xxd.c
--      $(MAKE) -C xxd -f Make_cyg.mak
-+      $(MAKE) -C xxd -f Make_cyg.mak CC=$(CC)
+ nongui:       /tmp $(SCRIPTS)
+       csh -c echo ALL DONE
+@@ -108,5 +109,9 @@ test60.out: test60.in
+ test61.out: test61.in
+ test62.out: test62.in
+ test63.out: test63.in
+ test64.out: test64.in
+ test65.out: test65.in
++test66.out: test66.in
++test67.out: test67.in
++test68.out: test68.in
++test69.out: test69.in
+--- vim72.orig/src/testdir/Make_dos.mak
++++ vim72/src/testdir/Make_dos.mak
+@@ -24,13 +24,14 @@ SCRIPTS16 =        test1.out test19.out test20.
+ SCRIPTS =     test3.out test4.out test5.out test6.out test7.out \
+               test8.out test9.out test11.out test13.out test14.out \
+               test15.out test17.out test18.out test21.out test26.out \
+               test30.out test31.out test32.out test33.out test34.out \
+               test37.out test38.out test39.out test40.out test41.out \
+-              test42.out test52.out test65.out
++              test42.out test52.out test65.out test66.out test67.out \
++              test68.out test69.out
  
- GvimExt/gvimext.dll: GvimExt/gvimext.cpp GvimExt/gvimext.rc GvimExt/gvimext.h
--      $(MAKE) -C GvimExt -f Make_ming.mak
-+      $(MAKE) -C GvimExt -f Make_ming.mak CROSS=$(CROSS) CROSS_COMPILE=$(CROSS_COMPILE)
+-SCRIPTS32 =   test50.out
++SCRIPTS32 =   test50.out test70.out
  
- clean:
-       -$(DEL) $(OUTDIR)$(DIRSLASH)*.o
-       -$(DEL) $(OUTDIR)$(DIRSLASH)*.res
-       -rmdir $(OUTDIR)
-       -$(DEL) *.exe
-       -$(DEL) pathdef.c
- ifdef PERL
-       -$(DEL) if_perl.c
- endif
-+ifdef MZSCHEME
-+      -$(DEL) mzscheme_base.c
-+endif
-       $(MAKE) -C GvimExt -f Make_ming.mak clean
-       $(MAKE) -C xxd -f Make_cyg.mak clean
+ SCRIPTS_GUI = test16.out
  
- ###########################################################################
- INCL = vim.h feature.h os_win32.h os_dos.h ascii.h keymap.h term.h macros.h \
-@@ -586,10 +612,16 @@ if_perl.c: if_perl.xs typemap
-            $(PERLLIB)/ExtUtils/typemap if_perl.xs > $@
+ .SUFFIXES: .in .out
  
- $(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_INCL) $(NBDEBUG_SRC)
-       $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o
+@@ -53,10 +54,11 @@ clean:
+       -del *.out
+       -if exist test.ok del test.ok
+       -if exist small.vim del small.vim
+       -if exist tiny.vim del tiny.vim
+       -if exist mbyte.vim del mbyte.vim
++      -if exist mzscheme.vim del mzscheme.vim
+       -del X*
+       -if exist viminfo del viminfo
  
-+$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP)
-+      $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o
+ .in.out:
+       copy $*.ok test.ok
+--- /dev/null
++++ vim72/src/testdir/Make_ming.mak
+@@ -0,0 +1,93 @@
++# Makefile to run tests for Vim, on Dos-like machines
++# with sh.exe or zsh.exe in the path or not.
++#
++# Author: Bill McCarthy
++#
++# Note that test54 has been removed until it is fixed.
++#
++# Requires a set of Unix tools: echo, diff, etc.
 +
-+mzscheme_base.c:
-+      $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base
++ifneq (sh.exe, $(SHELL))
++DEL = rm -f
++MV = mv
++CP = cp
++DIRSLASH = /
++else
++DEL = del
++MV = rename
++CP = copy
++DIRSLASH = \\
++endif
 +
- pathdef.c: $(INCL)
- ifneq (sh.exe, $(SHELL))
-       @echo creating pathdef.c
-       @echo '/* pathdef.c */' > pathdef.c
-       @echo '#include "vim.h"' >> pathdef.c
---- vim72.orig/src/config.mk.in
-+++ vim72/src/config.mk.in
-@@ -39,10 +39,12 @@ X_LIBS             = @X_LIB@
- MZSCHEME_LIBS = @MZSCHEME_LIBS@
- MZSCHEME_SRC  = @MZSCHEME_SRC@
- MZSCHEME_OBJ  = @MZSCHEME_OBJ@
- MZSCHEME_CFLAGS       = @MZSCHEME_CFLAGS@
- MZSCHEME_PRO  = @MZSCHEME_PRO@
-+MZSCHEME_EXTRA  = @MZSCHEME_EXTRA@
-+MZSCHEME_MZC  = @MZSCHEME_MZC@
- PERL          = @vi_cv_path_perl@
- PERLLIB               = @vi_cv_perllib@
- PERL_LIBS     = @PERL_LIBS@
- SHRPENV               = @shrpenv@
---- vim72.orig/src/if_mzsch.h
-+++ vim72/src/if_mzsch.h
-@@ -9,10 +9,11 @@
- # define __CYGWIN32__
- #endif
- /* #ifdef needed for "make depend" */
- #ifdef FEAT_MZSCHEME
-+# include <schvers.h>
- # include <scheme.h>
- #endif
- #ifdef __MINGW32__
- # undef __CYGWIN32__
-@@ -44,6 +45,33 @@
- # define SCHEME_BYTE_STRLEN_VAL SCHEME_STRLEN_VAL
- # define SCHEME_BYTE_STR_VAL SCHEME_STR_VAL
- # define scheme_byte_string_to_char_string(obj) (obj)
- #endif
-+/* Precise GC macros */
-+#ifndef MZ_GC_DECL_REG
-+# define MZ_GC_DECL_REG(size)            /* empty */
-+#endif
-+#ifndef MZ_GC_VAR_IN_REG
-+# define MZ_GC_VAR_IN_REG(x, v)          /* empty */
-+#endif
-+#ifndef MZ_GC_ARRAY_VAR_IN_REG
-+# define MZ_GC_ARRAY_VAR_IN_REG(x, v, l) /* empty */
-+#endif
-+#ifndef MZ_GC_REG
-+# define MZ_GC_REG()                     /* empty */
-+#endif
-+#ifndef MZ_GC_UNREG
-+# define MZ_GC_UNREG()                   /* empty */
-+#endif
++VIMPROG = ..$(DIRSLASH)vim
 +
-+#ifdef MZSCHEME_FORCE_GC
-+/*
-+ * force garbage collection to check all references are registered
-+ * seg faults will indicate not registered refs
-+ */
-+# define MZ_GC_CHECK() scheme_collect_garbage();
-+#else
-+# define MZ_GC_CHECK()                        /* empty */
-+#endif
++# Omitted:
++# test2               "\\tmp" doesn't work.
++# test10      'errorformat' is different
++# test12      can't unlink a swap file
++# test25      uses symbolic link
++# test27      can't edit file with "*" in file name
++# test31      16 bit version runs out of memory...
 +
- #endif /* _IF_MZSCH_H_ */
---- vim72.orig/src/proto/if_mzsch.pro
-+++ vim72/src/proto/if_mzsch.pro
-@@ -11,14 +11,9 @@ void raise_if_error __ARGS((void));
- buf_T *get_valid_buffer __ARGS((void *));
- win_T *get_valid_window __ARGS((void *));
- void mzvim_check_threads __ARGS((void));
- void mzvim_reset_timer __ARGS((void));
- void *mzvim_eval_string __ARGS((char_u *str));
--struct Scheme_Object *mzvim_apply __ARGS((struct Scheme_Object *, int argc,
--    struct Scheme_Object **));
--int mzthreads_allowed (void);
--#ifdef FEAT_GUI_KDE
--void timer_proc (void);
--void mzscheme_kde_start_timer (void);
--void mzscheme_kde_stop_timer (void);
--#endif
-+int mzthreads_allowed __ARGS((void));
-+void mzscheme_main __ARGS((void));
-+void do_mzeval __ARGS((char_u *str, typval_T *rettv));
- /* vim: set ft=c : */
---- vim72.orig/src/msvc2008.bat
-+++ vim72/src/msvc2008.bat
-@@ -1,5 +1,7 @@
-+@echo off
- rem To be used on MS-Windows for Visual C++ 2008 Express Edition
- rem   aka Microsoft Visual Studio 9.0.
- rem See INSTALLpc.txt for information.
-+@echo on
++SCRIPTS16 =   test1.out test19.out test20.out test22.out \
++              test23.out test24.out test28.out test29.out \
++              test35.out test36.out test43.out \
++              test44.out test45.out test46.out test47.out \
++              test48.out test51.out test53.out            \
++              test55.out test56.out test57.out test58.out test59.out \
++              test60.out test61.out test62.out test63.out test64.out
++
++# Had to remove test54 which doesn't work yet.
++#                                              test54.out
++
++SCRIPTS =     test3.out test4.out test5.out test6.out test7.out \
++              test8.out test9.out test11.out test13.out test14.out \
++              test15.out test17.out test18.out test21.out test26.out \
++              test30.out test31.out test32.out test33.out test34.out \
++              test37.out test38.out test39.out test40.out test41.out \
++              test42.out test52.out test65.out test66.out test67.out \
++              test68.out test69.out
++
++SCRIPTS32 =   test50.out test70.out
++
++SCRIPTS_GUI = test16.out
++
++.SUFFIXES: .in .out
++
++vimall:       fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32)
++      echo ALL DONE
++
++nongui:       fixff $(SCRIPTS16) $(SCRIPTS)
++      echo ALL DONE
++
++small:
++      echo ALL DONE
++
++gui:  fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI)
++      echo ALL DONE
++
++win32:        fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS32)
++      echo ALL DONE
++
++fixff:
++      -$(VIMPROG) -u dos.vim --noplugin "+argdo set ff=dos|upd" +q *.in *.ok
++
++clean:
++      -$(DEL) *.out
++      -$(DEL) test.ok
++      -$(DEL) small.vim
++      -$(DEL) tiny.vim
++      -$(DEL) mbyte.vim
++      -$(DEL) mzscheme.vim
++      -$(DEL) X*
++      -$(DEL) viminfo
++
++.in.out:
++      $(CP) $*.ok test.ok
++      $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in
++      diff test.out $*.ok
++      -$(DEL) $*.out
++      $(MV) test.out $*.out
++      -$(DEL) X*
++      -$(DEL) test.ok
++      -$(DEL) viminfo
+--- vim72.orig/src/testdir/Make_os2.mak
++++ vim72/src/testdir/Make_os2.mak
+@@ -23,11 +23,12 @@ SCRIPTS = test1.out test3.out test4.out
+               test33.out test34.out test35.out test36.out test37.out \
+               test38.out test39.out test40.out test41.out test42.out \
+               test43.out test44.out test45.out test46.out test47.out \
+               test48.out test51.out test53.out test54.out test55.out \
+               test56.out test57.out test58.out test59.out test60.out \
+-              test61.out test62.out test63.out test64.out test65.out
++              test61.out test62.out test63.out test64.out test65.out \
++              test66.out test67.out test68.out test69.out
  
- call "%VS90COMNTOOLS%%vsvars32.bat"
---- vim72.orig/src/proto/mbyte.pro
-+++ vim72/src/proto/mbyte.pro
-@@ -5,14 +5,16 @@ int bomb_size __ARGS((void));
- int mb_get_class __ARGS((char_u *p));
- int dbcs_class __ARGS((unsigned lead, unsigned trail));
- int latin_char2len __ARGS((int c));
- int latin_char2bytes __ARGS((int c, char_u *buf));
- int latin_ptr2len __ARGS((char_u *p));
-+int latin_ptr2len_len __ARGS((char_u *p, int size));
- int utf_char2cells __ARGS((int c));
- int latin_ptr2cells __ARGS((char_u *p));
- int utf_ptr2cells __ARGS((char_u *p));
- int dbcs_ptr2cells __ARGS((char_u *p));
-+int latin_ptr2cells_len __ARGS((char_u *p, int size));
- int latin_char2cells __ARGS((int c));
- int latin_off2cells __ARGS((unsigned off, unsigned max_off));
- int dbcs_off2cells __ARGS((unsigned off, unsigned max_off));
- int utf_off2cells __ARGS((unsigned off, unsigned max_off));
- int latin_ptr2char __ARGS((char_u *p));
-@@ -83,10 +85,11 @@ void im_shutdown __ARGS((void));
- int xim_get_status_area_height __ARGS((void));
- int im_get_status __ARGS((void));
- int preedit_get_status __ARGS((void));
- int im_is_preediting __ARGS((void));
- int convert_setup __ARGS((vimconv_T *vcp, char_u *from, char_u *to));
-+int convert_setup_ext __ARGS((vimconv_T *vcp, char_u *from, int from_unicode_is_utf8, char_u *to, int to_unicode_is_utf8));
- int convert_input __ARGS((char_u *ptr, int len, int maxlen));
- int convert_input_safe __ARGS((char_u *ptr, int len, int maxlen, char_u **restp, int *restlenp));
- char_u *string_convert __ARGS((vimconv_T *vcp, char_u *ptr, int *lenp));
- char_u *string_convert_ext __ARGS((vimconv_T *vcp, char_u *ptr, int *lenp, int *unconvlenp));
- /* vim: set ft=c : */
---- vim72.orig/src/proto/gui.pro
-+++ vim72/src/proto/gui.pro
-@@ -41,10 +41,11 @@ int send_tabline_event __ARGS((int nr));
- void send_tabline_menu_event __ARGS((int tabidx, int event));
- void gui_remove_scrollbars __ARGS((void));
- void gui_create_scrollbar __ARGS((scrollbar_T *sb, int type, win_T *wp));
- scrollbar_T *gui_find_scrollbar __ARGS((long ident));
- void gui_drag_scrollbar __ARGS((scrollbar_T *sb, long value, int still_dragging));
-+void gui_may_update_scrollbars __ARGS((void));
- void gui_update_scrollbars __ARGS((int force));
- int gui_do_scroll __ARGS((void));
- int gui_do_horiz_scroll __ARGS((void));
- void gui_check_colors __ARGS((void));
- guicolor_T gui_get_color __ARGS((char_u *name));
---- vim72.orig/src/proto/window.pro
-+++ vim72/src/proto/window.pro
-@@ -1,20 +1,24 @@
- /* window.c */
- void do_window __ARGS((int nchar, long Prenum, int xchar));
- int win_split __ARGS((int size, int flags));
-+int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
- int win_valid __ARGS((win_T *win));
- int win_count __ARGS((void));
- int make_windows __ARGS((int count, int vertical));
- void win_move_after __ARGS((win_T *win1, win_T *win2));
- void win_equal __ARGS((win_T *next_curwin, int current, int dir));
- void close_windows __ARGS((buf_T *buf, int keep_curwin));
- void win_close __ARGS((win_T *win, int free_buf));
- void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp));
- void win_free_all __ARGS((void));
-+win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));
- void close_others __ARGS((int message, int forceit));
- void curwin_init __ARGS((void));
-+void win_init_empty __ARGS((win_T *wp));
- int win_alloc_first __ARGS((void));
-+void win_alloc_aucmd_win __ARGS((void));
- void win_init_size __ARGS((void));
- void free_tabpage __ARGS((tabpage_T *tp));
- int win_new_tabpage __ARGS((int after));
- int may_open_tabpage __ARGS((void));
- int make_tabpages __ARGS((int maxcount));
-@@ -28,10 +32,12 @@ void tabpage_move __ARGS((int nr));
- void win_goto __ARGS((win_T *wp));
- win_T *win_find_nr __ARGS((int winnr));
- void win_enter __ARGS((win_T *wp, int undo_sync));
- win_T *buf_jump_open_win __ARGS((buf_T *buf));
- win_T *buf_jump_open_tab __ARGS((buf_T *buf));
-+void win_append __ARGS((win_T *after, win_T *wp));
-+void win_remove __ARGS((win_T *wp, tabpage_T *tp));
- int win_alloc_lines __ARGS((win_T *wp));
- void win_free_lsize __ARGS((win_T *wp));
- void shell_new_rows __ARGS((void));
- void shell_new_columns __ARGS((void));
- void win_size_save __ARGS((garray_T *gap));
-@@ -56,10 +62,12 @@ int path_with_url __ARGS((char_u *fname)
- int vim_isAbsName __ARGS((char_u *name));
- int vim_FullName __ARGS((char_u *fname, char_u *buf, int len, int force));
- int min_rows __ARGS((void));
- int only_one_window __ARGS((void));
- void check_lnums __ARGS((int do_curwin));
-+void make_snapshot __ARGS((int idx));
-+void restore_snapshot __ARGS((int idx, int close_curwin));
- int win_hasvertsplit __ARGS((void));
- int match_add __ARGS((win_T *wp, char_u *grp, char_u *pat, int prio, int id));
- int match_delete __ARGS((win_T *wp, int id, int perr));
- void clear_matches __ARGS((win_T *wp));
- matchitem_T *get_match __ARGS((win_T *wp, int id));
---- vim72.orig/src/gvim.exe.mnf
-+++ vim72/src/gvim.exe.mnf
-@@ -1,7 +1,7 @@
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
--<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
-   <assemblyIdentity
-     processorArchitecture="*"
-     version="7.2.0.0"
-     type="win32"
-     name="Vim"
-@@ -27,6 +27,12 @@
-           level="asInvoker"
-           uiAccess="false"/>
-       </requestedPrivileges>
-     </security>
-   </trustInfo>
-+  <!-- Vista High DPI aware -->
-+  <asmv3:application>
-+    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
-+      <dpiAware>true</dpiAware>
-+    </asmv3:windowsSettings>
-+  </asmv3:application>
- </assembly>
---- vim72.orig/src/xxd/xxd.c
-+++ vim72/src/xxd/xxd.c
-@@ -62,10 +62,13 @@
- /* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */
- #if _MSC_VER >= 1400
- # define _CRT_SECURE_NO_DEPRECATE
- # define _CRT_NONSTDC_NO_DEPRECATE
- #endif
-+#if !defined(CYGWIN) && (defined(CYGWIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__))
-+# define CYGWIN
-+#endif
+ .SUFFIXES: .in .out
  
- #include <stdio.h>
- #ifdef VAXC
- # include <file.h>
- #else
-@@ -75,11 +78,12 @@
- # define MSDOS
- #endif
- #if !defined(OS2) && defined(__EMX__)
- # define OS2
- #endif
--#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(__BORLANDC__)
-+#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(__BORLANDC__) \
-+  || defined(CYGWIN)
- # include <io.h>      /* for setmode() */
- #else
- # ifdef UNIX
- #  include <unistd.h>
- # endif
-@@ -148,13 +152,10 @@ char osver[] = " (dos 16 bit)";
- char osver[] = "";
- #  endif
- # endif
- #endif
+ all:  /tmp $(SCRIPTS)
+       @echo ALL DONE
+--- vim72.orig/src/testdir/Make_vms.mms
++++ vim72/src/testdir/Make_vms.mms
+@@ -2,13 +2,13 @@
+ # Makefile to run all tests for Vim on VMS
+ #
+ # Authors:    Zoltan Arpadffy, <arpadffy@polarhome.com>
+ #             Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
+ #
+-# Last change:  2008 Jun 19
++# Last change:  2009 Sep 11
+ #
+-# This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX.
++# This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
+ # Edit the lines in the Configuration section below to select.
+ #
+ # Execute with:
+ #             mms/descrip=Make_vms.mms
+ # Cleanup with:
+@@ -30,10 +30,19 @@
+ # Comment out if you want to run Unix specific tests as well, but please
+ # be aware, that on OpenVMS will fail, because of cat, rm, etc commands
+ # and directory handling.
+ # WANT_UNIX = YES
  
--#if !defined(CYGWIN) && (defined(CYGWIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__))
--# define CYGWIN
--#endif
- #if defined(MSDOS) || defined(WIN32) || defined(OS2)
- # define BIN_READ(yes)  ((yes) ? "rb" : "rt")
- # define BIN_WRITE(yes) ((yes) ? "wb" : "wt")
- # define BIN_CREAT(yes) ((yes) ? (O_CREAT|O_BINARY) : O_CREAT)
- # define BIN_ASSIGN(fp, yes) setmode(fileno(fp), (yes) ? O_BINARY : O_TEXT)
-@@ -228,11 +229,11 @@ char *pname;
- {
-   fprintf(stderr, "Usage:\n       %s [options] [infile [outfile]]\n", pname);
-   fprintf(stderr, "    or\n       %s -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]\n", pname);
-   fprintf(stderr, "Options:\n");
-   fprintf(stderr, "    -a          toggle autoskip: A single '*' replaces nul-lines. Default off.\n");
--  fprintf(stderr, "    -b          binary digit dump (incompatible with -p,-i,-r). Default hex.\n");
-+  fprintf(stderr, "    -b          binary digit dump (incompatible with -ps,-i,-r). Default hex.\n");
-   fprintf(stderr, "    -c cols     format <cols> octets per line. Default 16 (-i: 12, -ps: 30).\n");
-   fprintf(stderr, "    -E          show characters in EBCDIC. Default ASCII.\n");
-   fprintf(stderr, "    -g          number of octets per group in normal output. Default 2.\n");
-   fprintf(stderr, "    -h          print this summary.\n");
-   fprintf(stderr, "    -i          output in C include file style.\n");
-@@ -273,15 +274,15 @@ long base_off;
-   while ((c = getc(fpi)) != EOF)
-     {
-       if (c == '\r')  /* Doze style input file? */
-       continue;
++# Comment out if you want to run Win32 specific tests as well, but please
++# be aware, that on OpenVMS will fail, because of cat, rm, etc commands
++# and directory handling.
++# WANT_WIN = YES
++
++# Comment out if you want to run spell checker tests.
++# They fail because VMS does not support file names.
++# WANT_SPELL = YES
++
+ # Comment out if you have gzip on your system
+ # HAVE_GZIP = YES
  
--#if 0 /* this doesn't work when there is normal text after the hex codes in
--         the last line that looks like hex */
--      if (c == ' ' || c == '\n' || c == '\t')  /* allow multiple spaces */
-+      /* Allow multiple spaces.  This doesn't work when there is normal text
-+       * after the hex codes in the last line that looks like hex, thus only
-+       * use it for PostScript format. */
-+      if (hextype == HEX_POSTSCRIPT && (c == ' ' || c == '\n' || c == '\t'))
-       continue;
--#endif
+ # Comment out if you have GNU compatible diff on your system
+ # HAVE_GDIFF = YES
+@@ -51,25 +60,34 @@ VIMPROG = <->vim.exe
+ SCRIPT = test1.out  test2.out  test3.out  test4.out  test5.out  \
+        test6.out  test7.out  test8.out  test9.out  test10a.out\
+        test13.out test14.out test15.out test17.out \
+        test18.out test19.out test20.out test21.out test22.out \
+        test23.out test24.out test26.out \
+-       test28.out test29.out test31.out test32.out \
++       test28.out test29.out test30.out test31.out test32.out \
+        test33.out test34.out test35.out test36.out test37.out \
+        test38.out test39.out test40.out test41.out test42.out \
+        test43.out test44.out test45.out test46.out \
+        test48.out test51.out test53.out test54.out test55.out \
+-       test56.out test57.out test58.out test59.out test60.out \
+-       test61.out test62.out test63.out test64.out test65.out
++       test56.out test57.out test60.out \
++       test61.out test62.out test63.out test64.out test65.out \
++       test66.out test67.out test68.out test69.out
  
-       n3 = n2;
-       n2 = n1;
+ .IFDEF WANT_GUI
+ SCRIPT_GUI = test16.out
+ GUI_OPTION = -g
+ .ENDIF
  
-       if (c >= '0' && c <= '9')
---- vim72.orig/src/os_mac.h
-+++ vim72/src/os_mac.h
-@@ -266,13 +266,19 @@
-  * version with os_unix.x instead of os_mac.c. Based on the result
-  * of ./configure for console MacOS X.
-  */
+ .IFDEF WANT_UNIX
+-SCRIPT_UNIX = test10.out test12.out test25.out test27.out test30.out test49.out
++SCRIPT_UNIX = test10.out test12.out test25.out test27.out test49.out
++.ENDIF
++
++.IFDEF WANT_WIN
++SCRIPT_WIN = test50.out test52.out
++.ENDIF
++
++.IFDEF WANT_SPELL
++SCRIPT_SPELL = test58.out test59.out
+ .ENDIF
  
- #ifdef MACOS_X_UNIX
--# define SIGPROTOARG  (int)
--# define SIGDEFARG(s) (s) int s;
--# define SIGDUMMYARG  0
-+# ifndef SIGPROTOARG
-+#  define SIGPROTOARG (int)
-+# endif
-+# ifndef SIGDEFARG
-+#  define SIGDEFARG(s)        (s) int s UNUSED;
-+# endif
-+# ifndef SIGDUMMYARG
-+#  define SIGDUMMYARG 0
-+# endif
- # undef  HAVE_AVAIL_MEM
- # ifndef HAVE_CONFIG_H
- #  define RETSIGTYPE void
- #  define SIGRETURN  return
- /*# define USE_SYSTEM */  /* Output ship do debugger :(, but ot compile */
-@@ -283,11 +289,10 @@
- #  define HAVE_SYS_SELECT_H 1
- #  define HAVE_PUTENV
- #  define HAVE_SETENV
- #  define HAVE_RENAME
- # endif
--# define mch_chdir(s) chdir(s)
- #endif
+ .IFDEF HAVE_GZIP
+ SCRIPT_GZIP = test11.out
+ .ENDIF
+@@ -82,15 +100,15 @@ SCRIPT_GDIFF = test47.out
+       -@ write sys$output " "
+       -@ write sys$output "-----------------------------------------------"
+       -@ write sys$output "                "$*" "
+       -@ write sys$output "-----------------------------------------------"
+       -@ create/term/wait mcr $(VIMPROG) $(GUI_OPTION) -u vms.vim --noplugin -s dotest.in $*.in
+-      -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences test.out $*.ok;
++      -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences /par test.out $*.ok;
+       -@ if "''F$SEARCH("test.out.*")'" .NES. "" then rename test.out $*.out
+       -@ if "''F$SEARCH("Xdotest.*")'"  .NES. "" then delete/noconfirm/nolog Xdotest.*.*
  
- #if defined(MACOS_X) && !defined(HAVE_CONFIG_H)
- # define HAVE_PUTENV
- #endif
---- vim72.orig/runtime/doc/autocmd.txt
-+++ vim72/runtime/doc/autocmd.txt
-@@ -333,10 +333,12 @@ BufDelete                        Before deleting a buffer fro
-                               Also used just before a buffer in the buffer
-                               list is renamed.
-                               NOTE: When this autocommand is executed, the
-                               current buffer "%" may be different from the
-                               buffer being deleted "<afile>" and "<abuf>".
-+                              Don't change to another buffer, it will cause
-+                              problems.
-                                                       *BufEnter*
- BufEnter                      After entering a buffer.  Useful for setting
-                               options for a file type.  Also executed when
-                               starting to edit a buffer, after the
-                               BufReadPost autocommands.
-@@ -395,10 +397,12 @@ BufUnload                        Before unloading a buffer.
-                               BufDelete.  Also used for all buffers that are
-                               loaded when Vim is going to exit.
-                               NOTE: When this autocommand is executed, the
-                               current buffer "%" may be different from the
-                               buffer being unloaded "<afile>".
-+                              Don't change to another buffer, it will cause
-+                              problems.
-                                                       *BufWinEnter*
- BufWinEnter                   After a buffer is displayed in a window.  This
-                               can be when the buffer is loaded (after
-                               processing the modelines) or when a hidden
-                               buffer is displayed in a window (and is no
-@@ -426,10 +430,12 @@ BufWipeout                       Before completely deleting
-                               is renamed (also when it's not in the buffer
-                               list).
-                               NOTE: When this autocommand is executed, the
-                               current buffer "%" may be different from the
-                               buffer being deleted "<afile>".
-+                              Don't change to another buffer, it will cause
-+                              problems.
-                                               *BufWrite* *BufWritePre*
- BufWrite or BufWritePre               Before writing the whole buffer to a file.
-                                                       *BufWriteCmd*
- BufWriteCmd                   Before writing the whole buffer to a file.
-                               Should do the writing of the file and reset
-@@ -746,12 +752,14 @@ SwapExists                       Detected an existing swap f
-                                       'd'     delete the swap file
-                                       'q'     quit, don't edit the file
-                                       'a'     abort, like hitting CTRL-C
-                               When set to an empty string the user will be
-                               asked, as if there was no SwapExists autocmd.
--                              Note: Do not try to change the buffer, the
--                              results are unpredictable.
-+                                                      *E812*
-+                              It is not allowed to change to another buffer,
-+                              change a buffer name or change directory
-+                              here.
-                                                       *Syntax*
- Syntax                                When the 'syntax' option has been set.  The
-                               pattern is matched against the syntax name.
-                               <afile> can be used for the name of the file
-                               where this option was set, and <amatch> for
---- vim72.orig/src/gui_photon.c
-+++ vim72/src/gui_photon.c
-@@ -836,11 +836,16 @@ gui_ph_handle_window_open(
+-all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_GZIP) $(SCRIPT_GDIFF)
++all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_WIN) $(SCRIPT_SPELL) $(SCRIPT_GZIP) $(SCRIPT_GDIFF)
+       -@ write sys$output " "
+       -@ write sys$output "-----------------------------------------------"
+       -@ write sys$output "                All done"
+       -@ write sys$output "-----------------------------------------------"
+       -@ deassign sys$output
+@@ -111,16 +129,26 @@ nolog :
+       -@ write sys$output "                Test results:"
+       -@ write sys$output "-----------------------------------------------"
+       -@ write sys$output "MAKE_VMS.MMS options:"
+       -@ write sys$output "   WANT_GUI  = ""$(WANT_GUI)"" "
+       -@ write sys$output "   WANT_UNIX = ""$(WANT_UNIX)"" "
++      -@ write sys$output "   WANT_WIN  = ""$(WANT_WIN)"" "
++      -@ write sys$output "   WANT_SPELL= ""$(WANT_SPELL)"" "
+       -@ write sys$output "   HAVE_GZIP = ""$(HAVE_GZIP)"" "
+       -@ write sys$output "   HAVE_GDIFF= ""$(HAVE_GDIFF)"" "
+       -@ write sys$output "Default vimrc file is VMS.VIM:
+       -@ write sys$output "-----------------------------------------------"
+       -@ type VMS.VIM
  
- /* TODO: Set a clipping rect? */
-     static void
- gui_ph_draw_start( void )
- {
-+    PhGC_t *gc;
+ clean :
+       -@ if "''F$SEARCH("*.out")'"     .NES. "" then delete/noconfirm/nolog *.out.*
+       -@ if "''F$SEARCH("test.log")'"  .NES. "" then delete/noconfirm/nolog test.log.*
++      -@ if "''F$SEARCH("test.ok")'"   .NES. "" then delete/noconfirm/nolog test.ok.*
+       -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.*
+       -@ if "''F$SEARCH("*.*_sw*")'"   .NES. "" then delete/noconfirm/nolog *.*_sw*.*
++      -@ if "''F$SEARCH("*.failed")'"  .NES. "" then delete/noconfirm/nolog *.failed.*
++      -@ if "''F$SEARCH("*.rej")'"     .NES. "" then delete/noconfirm/nolog *.rej.*
++      -@ if "''F$SEARCH("tiny.vim")'"  .NES. "" then delete/noconfirm/nolog tiny.vim.*
++      -@ if "''F$SEARCH("small.vim")'" .NES. "" then delete/noconfirm/nolog small.vim.*
++      -@ if "''F$SEARCH("mbyte.vim")'" .NES. "" then delete/noconfirm/nolog mbyte.vim.*
++      -@ if "''F$SEARCH("viminfo.*")'" .NES. "" then delete/noconfirm/nolog viminfo.*.*
 +
-+    gc = PgGetGC();
-     PgSetRegion( PtWidgetRid( PtFindDisjoint( gui.vimTextArea ) ) );
-+    PgClearClippingsCx( gc );
-+    PgClearTranslationCx( gc );
+--- vim72.orig/src/testdir/Makefile
++++ vim72/src/testdir/Makefile
+@@ -2,13 +2,15 @@
+ # Makefile to run all tests for Vim
+ #
  
-     PtWidgetOffset( gui.vimTextArea, &gui_ph_raw_offset );
-     PhTranslatePoint( &gui_ph_raw_offset, PtWidgetPos( gui.vimTextArea, NULL ) );
+ VIMPROG = ../vim
  
-     PgSetTranslation( &gui_ph_raw_offset, Pg_RELATIVE );
-@@ -2968,11 +2973,11 @@ gui_mch_init_font(char_u *vim_font_name,
-     PhRect_t extent;
+-# Uncomment this line for using valgrind.
+-# The output goes into a file "valgrind.$PID" (sorry, no test number).
+-# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --logfile=valgrind
++# Uncomment this line to use valgrind for memory leaks and extra warnings.
++#   The output goes into a file "valgrind.testN"
++#   Vim should be compiled with EXITFREE to avoid false warnings.
++#   This will make testing about 10 times as slow.
++# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --log-file=valgrind.$*
  
-     if( vim_font_name == NULL )
-     {
-       /* Default font */
--      vim_font_name = "PC Term";
-+      vim_font_name = "PC Terminal";
-     }
+ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
+               test7.out test8.out test9.out test10.out test11.out \
+               test12.out  test13.out test14.out test15.out test17.out \
+               test18.out test19.out test20.out test21.out test22.out \
+@@ -18,33 +20,36 @@ SCRIPTS = test1.out test2.out test3.out
+               test38.out test39.out test40.out test41.out test42.out \
+               test43.out test44.out test45.out test46.out test47.out \
+               test48.out test49.out test51.out test52.out test53.out \
+               test54.out test55.out test56.out test57.out test58.out \
+               test59.out test60.out test61.out test62.out test63.out \
+-              test64.out test65.out
++              test64.out test65.out test66.out test67.out test68.out \
++              test69.out test70.out
  
-     if( STRCMP( vim_font_name, "*" ) == 0 )
-     {
-       font_tag = PtFontSelection( gui.vimWindow, NULL, NULL,
---- vim72.orig/src/proto/ui.pro
-+++ vim72/src/proto/ui.pro
-@@ -46,10 +46,11 @@ void ui_cursor_shape __ARGS((void));
- int check_col __ARGS((int col));
- int check_row __ARGS((int row));
- void open_app_context __ARGS((void));
- void x11_setup_atoms __ARGS((Display *dpy));
- void clip_x11_request_selection __ARGS((Widget myShell, Display *dpy, VimClipboard *cbd));
-+void yank_cut_buffer0 __ARGS((Display *dpy, VimClipboard *cbd));
- void clip_x11_lose_selection __ARGS((Widget myShell, VimClipboard *cbd));
- int clip_x11_own_selection __ARGS((Widget myShell, VimClipboard *cbd));
- void clip_x11_set_selection __ARGS((VimClipboard *cbd));
- int jump_to_mouse __ARGS((int flags, int *inclusive, int which_button));
- int mouse_comp_pos __ARGS((win_T *win, int *rowp, int *colp, linenr_T *lnump));
---- vim72.orig/runtime/doc/various.txt
-+++ vim72/runtime/doc/various.txt
-@@ -372,10 +372,11 @@ m  *+ruby*               Ruby interface |ruby|
- m  *+ruby/dyn*                Ruby interface |ruby-dynamic| |/dyn|
- N  *+scrollbind*      |'scrollbind'|
- B  *+signs*           |:sign|
- N  *+smartindent*     |'smartindent'|
- m  *+sniff*           SniFF interface |sniff|
-+N  *+startuptime*     |--startuptime| argument
- N  *+statusline*      Options 'statusline', 'rulerformat' and special
-                       formats of 'titlestring' and 'iconstring'
- m  *+sun_workshop*    |workshop|
- N  *+syntax*          Syntax highlighting |syntax|
-    *+system()*                Unix only: opposite of |+fork|
-@@ -506,10 +507,21 @@ N  *+X11*                Unix only: can restore window
-                       ":silent menu ..." defines a menu that will not echo a
-                       Command-line command.  The command will still produce
-                       messages though.  Use ":silent" in the command itself
-                       to avoid that: ":silent menu .... :silent command".
+ SCRIPTS_GUI = test16.out
  
-+                                              *:uns* *:unsilent*
-+:uns[ilent] {command} Execute {command} not silently.  Only makes a
-+                      difference when |:silent| was used to get to this
-+                      command.
-+                      Use this for giving a message even when |:silent| was
-+                      used.  In this example |:silent| is used to avoid the
-+                      message about reading the file and |:unsilent| to be
-+                      able to list the first line of each file. >
-+              :silent argdo unsilent echo expand('%') . ": " . getline(1)
-+<
-+
-                                               *:verb* *:verbose*
- :[count]verb[ose] {command}
-                       Execute {command} with 'verbose' set to [count].  If
-                       [count] is omitted one is used. ":0verbose" can be
-                       used to set 'verbose' to zero.
---- vim72.orig/src/proto/os_unix.pro
-+++ vim72/src/proto/os_unix.pro
-@@ -1,6 +1,7 @@
- /* os_unix.c */
-+int mch_chdir __ARGS((char *path));
- void mch_write __ARGS((char_u *s, int len));
- int mch_inchar __ARGS((char_u *buf, int maxlen, long wtime, int tb_change_cnt));
- int mch_char_avail __ARGS((void));
- long_u mch_total_mem __ARGS((int special));
- void mch_delay __ARGS((long msec, int ignoreinput));
---- vim72.orig/src/os_msdos.c
-+++ vim72/src/os_msdos.c
-@@ -2037,10 +2037,16 @@ mch_has_wildcard(char_u *p)
-     int
- mch_chdir(char *path)
- {
-     if (path[0] == NUL)                   /* just checking... */
-       return 0;
-+    if (p_verbose >= 5)
-+    {
-+      verbose_enter();
-+      smsg((char_u *)"chdir(%s)", path);
-+      verbose_leave();
-+    }
-     if (path[1] == ':')                   /* has a drive name */
-     {
-       if (change_drive(TOLOWER_ASC(path[0]) - 'a' + 1))
-           return -1;              /* invalid drive name */
-       path += 2;
---- vim72.orig/src/os_riscos.c
-+++ vim72/src/os_riscos.c
-@@ -1201,10 +1201,16 @@ mch_chdir(dir)
- {
-     int           length;
-     int           retval;
-     char_u  *new_dir;
+ .SUFFIXES: .in .out
  
-+    if (p_verbose >= 5)
-+    {
-+      verbose_enter();
-+      smsg((char_u *)"chdir(%s)", dir);
-+      verbose_leave();
-+    }
-     length = strlen(dir);
-     if (dir[length - 1] != '.')
-       return chdir(dir);          /* No trailing dots - nothing to do. */
-     new_dir = vim_strsave(dir);
-     if (new_dir == NULL)
---- vim72.orig/src/Make_cyg.mak
-+++ vim72/src/Make_cyg.mak
-@@ -1,8 +1,8 @@
- #
- # Makefile for VIM on Win32, using Cygnus gcc
--# Last updated by Dan Sharp.  Last Change: 2007 Sep 29
-+# Last updated by Dan Sharp.  Last Change: 2010 Feb 24
- #
- # Also read INSTALLpc.txt!
- #
- # This compiles Vim as a Windows application.  If you want Vim to run as a
- # Cygwin application use the Makefile (just like on Unix).
-@@ -30,13 +30,16 @@
- # IME         no or yes: set to yes to include IME support (yes)
- #   DYNAMIC_IME no or yes: set to yes to load imm32.dll dynamically (yes)
- # OLE         no or yes: set to yes to make OLE gvim (no)
- # DEBUG               no or yes: set to yes if you wish a DEBUGging build (no)
- # CPUNR               No longer supported, use ARCH.
--# ARCH                i386 through pentium4: select -march argument to compile with (i386)
-+# ARCH                i386 through pentium4: select -march argument to compile with
-+#               (i386)
- # USEDLL      no or yes: set to yes to use the Runtime library DLL (no)
- #             For USEDLL=yes the cygwin1.dll is required to run Vim.
-+#             "no" does not work with latest version of Cygwin, use
-+#             Make_ming.mak instead.  Or set CC to gcc-3.
- # POSTSCRIPT  no or yes: set to yes for PostScript printing (no)
- # FEATURES    TINY, SMALL, NORMAL, BIG or HUGE (BIG)
- # WINVER      Lowest Win32 version to support.  (0x0400)
- # CSCOPE      no or yes: to include cscope interface support (yes)
- # OPTIMIZE    SPACE, SPEED, or MAXSPEED: set optimization level (MAXSPEED)
-@@ -97,10 +100,11 @@ endif
- DEFINES = -DWIN32 -DHAVE_PATHDEF -DFEAT_$(FEATURES) \
-         -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER)
- INCLUDES = -march=$(ARCH) -Iproto
+-nongui:       nolog $(SCRIPTS)
+-      @echo
+-      @cat test.log
+-      @echo ALL DONE
++nongui:       nolog $(SCRIPTS) report
++
++gui:  nolog $(SCRIPTS) $(SCRIPTS_GUI) report
  
- #>>>>> name of the compiler and linker, name of lib directory
-+CROSS_COMPILE =
- CC = gcc
- RC = windres
+-gui:  nolog $(SCRIPTS) $(SCRIPTS_GUI)
++report:
+       @echo
+-      @cat test.log
+-      @echo ALL DONE
++      @echo 'Test results:'
++      @/bin/sh -c "if test -f test.log; \
++              then cat test.log; echo TEST FAILURE; exit 1; \
++              else echo ALL DONE; \
++              fi"
  
- ##############################
- # DYNAMIC_PERL=yes and no both work
-@@ -210,17 +214,38 @@ endif
+ $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
  
- ifndef MZSCHEME_VER
- MZSCHEME_VER = 209_000
- endif
+ clean:
+-      -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* valgrind.pid* viminfo
++      -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* valgrind.pid* viminfo
  
-+ifndef MZSCHEME_PRECISE_GC
-+MZSCHEME_PRECISE_GC=no
-+endif
-+
-+# for version 4.x we need to generate byte-code for Scheme base
-+ifndef MZSCHEME_GENERATE_BASE
-+MZSCHEME_GENERATE_BASE=no
-+endif
-+
- ifeq (yes, $(DYNAMIC_MZSCHEME))
- DEFINES += -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
- else
- ifndef MZSCHEME_DLLS
- MZSCHEME_DLLS = $(MZSCHEME)
- endif
--EXTRA_LIBS += -L$(MZSCHEME_DLLS) -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
-+ifeq (yes,$(MZSCHEME_PRECISE_GC))
-+MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
-+else
-+MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
-+endif
-+EXTRA_LIBS += -L$(MZSCHEME_DLLS) -L$(MZSCHEME_DLLS)/lib $(MZSCHEME_LIB)
-+endif
-+ifeq (yes,$(MZSCHEME_GENERATE_BASE))
-+DEFINES += -DINCLUDE_MZSCHEME_BASE
-+MZ_EXTRA_DEP += mzscheme_base.c
-+endif
-+ifeq (yes,$(MZSCHEME_PRECISE_GC))
-+DEFINES += -DMZ_PRECISE_GC
- endif
- endif
+ test1.out: test1.in
+-      -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo
++      -rm -f $*.failed tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* viminfo
+       $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in
+       @/bin/sh -c "if diff test.out $*.ok; \
+               then mv -f test.out $*.out; \
+               else echo; \
+               echo test1 FAILED - Something basic is wrong; \
+@@ -69,6 +74,6 @@ test1.out: test1.in
+ test49.out: test49.vim
  
- ##############################
- # DYNAMIC_TCL=yes and no both work.
-@@ -444,14 +469,14 @@ all: $(EXE) xxd/xxd.exe vimrun.exe insta
- # See /usr/doc/cygwin-doc-1.2/html/faq_toc.html#TOC93 for more information.
- $(EXE): $(OUTDIR) $(OBJ)
-       $(CC) $(CFLAGS) -o $(EXE) $(OBJ) $(LIBS) -luuid -lole32 $(EXTRA_LIBS)
+ test60.out: test60.vim
  
- xxd/xxd.exe: xxd/xxd.c
--      $(MAKE) -C xxd -f Make_cyg.mak USEDLL=$(USEDLL)
-+      $(MAKE) -C xxd -f Make_cyg.mak CC=$(CC) USEDLL=$(USEDLL)
+ nolog:
+-      -echo Test results: >test.log
++      -rm -f test.log
+--- vim72.orig/src/testdir/main.aap
++++ vim72/src/testdir/main.aap
+@@ -30,15 +30,15 @@ gui:       newlog $Scripts $ScriptsGUI
+       :print ALL DONE
  
- GvimExt/gvimext.dll: GvimExt/gvimext.cpp GvimExt/gvimext.rc GvimExt/gvimext.h
--      $(MAKE) -C GvimExt -f Make_ming.mak
-+      $(MAKE) -C GvimExt -f Make_ming.mak CROSS_COMPILE=$(CROSS_COMPILE)
+ $Scripts $ScriptsGUI: $VimProg
  
- vimrun.exe: vimrun.c
-       $(CC) $(CFLAGS) -o vimrun.exe vimrun.c  $(LIBS)
+ clean:
+-      :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim test.ok X*
++      :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X*
  
- install.exe: dosinst.c
-@@ -471,10 +496,13 @@ clean:
-       -rmdir $(OUTDIR)
-       -$(DEL) $(EXE) vimrun.exe install.exe uninstal.exe
- ifdef PERL
-       -$(DEL) if_perl.c
- endif
-+ifdef MZSCHEME
-+      -$(DEL) mzscheme_base.c
-+endif
-       -$(DEL) pathdef.c
-       $(MAKE) -C xxd -f Make_cyg.mak clean
-       $(MAKE) -C GvimExt -f Make_ming.mak clean
+ # test1 is special, it checks for features
+ test1.out: test1.in
+-      :del {force} test1.failed tiny.vim small.vim mbyte.vim
++      :del {force} test1.failed tiny.vim small.vim mbyte.vim mzscheme.vim
+       :sys {i} $VimProg -u unix.vim -U NONE --noplugin -s dotest.in test1.in
+       @if os.system("diff test.out test1.ok") != 0:
+               :error test1 FAILED - Something basic is wrong
+       :move {force} test.out test1.out
+       :del {r}{force} X*
+--- vim72.orig/src/testdir/test1.in
++++ vim72/src/testdir/test1.in
+@@ -11,10 +11,11 @@ If Vim was not compiled with the +window
+ set like small.vim above.  tiny.vim is sourced by tests that require the
+ +windows feature or other features that are missing in the tiny version.
  
- distclean: clean
-@@ -521,13 +549,19 @@ ifeq (16, $(RUBY_VER))
- endif
+ If Vim was not compiled with the +multi_byte feature, the mbyte.vim script will be set like small.vim above.  mbyte.vim is sourced by tests that require the
+ +multi_byte feature.
++Similar logic is applied to the +mzscheme feature, using mzscheme.vim.
  
- $(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_DEP)
-       $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o
+ STARTTEST
+ :" Write a single line to test.out to check if testing works at all.
+ :%d
+ athis is a test\e:w! test.out
+@@ -23,12 +24,15 @@ athis is a test\e:w! test.out
+ :w! tiny.vim
+ ae! test.ok
+ w! test.out
+ qa!
\e:w! mbyte.vim
++:w! mzscheme.vim
+ :" If +multi_byte feature supported, make mbyte.vim empty.
+ :if has("multi_byte") | sp another | w! mbyte.vim | q | endif
++:" If +mzscheme feature supported, make mzscheme.vim empty.
++:if has("mzscheme") | sp another | w! mzscheme.vim | q | endif
+ :" If +eval feature supported quit here, leaving tiny.vim and small.vim empty.
+ :" Otherwise write small.vim to skip the test.
+ :if 1 | q! | endif
+ :w! small.vim
+ :" If +windows feature not supported :sp will fail and tiny.vim will be
+--- vim72.orig/src/testdir/test30.in
++++ vim72/src/testdir/test30.in
+@@ -22,14 +22,21 @@ STARTTEST
+ :set bin noeol
+ :$w! XXMac
+ :set nobin eol
+ :bwipe XXUnix XXDos XXMac
+ :" create mixed format files
+-:!cat XXUnix XXDos >XXUxDs
+-:!cat XXUnix XXMac >XXUxMac
+-:!cat XXDos XXMac >XXDosMac
+-:!cat XXUnix XXDos XXMac >XXUxDsMc
++:if has("vms")
++: !copy XXUnix,XXDos XXUxDs.
++: !copy XXUnix,XXMac XXUxMac.
++: !copy XXDos,XXMac  XXDosMac.
++: !copy XXUnix,XXDos,XXMac XXUxDsMc.
++:else
++: !cat XXUnix XXDos >XXUxDs
++: !cat XXUnix XXMac >XXUxMac
++: !cat XXDos XXMac >XXDosMac
++: !cat XXUnix XXDos XXMac >XXUxDsMc
++:endif
+ :"
+ :" try reading and writing with 'fileformats' empty
+ :set fileformat=unix
+ :e! XXUnix
+ :w! test.out
+--- vim72.orig/src/testdir/test45.in
++++ vim72/src/testdir/test45.in
+@@ -26,13 +26,20 @@ kYpj:call append("$", foldlevel("."))
+ /^2 b
+ i  \ejI    \e:call append("$", "indent " . foldlevel("."))
+ k:call append("$", foldlevel("."))
+ :" test syntax folding
+ :set fdm=syntax fdl=0
+-:syn region Hup start="dd" end="hh" fold
++:syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3
++:syn region Fd1 start="ee" end="ff" fold contained
++:syn region Fd2 start="gg" end="hh" fold contained
++:syn region Fd3 start="commentstart" end="commentend" fold contained
+ Gzk:call append("$", "folding " . getline("."))
+ k:call append("$", getline("."))
++jAcommentstart  \eAcommentend\e:set fdl=1
++3j:call append("$", getline("."))
++:set fdl=0
++zO\fj:call append("$", getline("."))
+ :" test expression folding
+ :fun Flvl()
+   let l = getline(v:lnum)
+   if l =~ "bb$"
+     return 2
+--- vim72.orig/src/testdir/test45.ok
++++ vim72/src/testdir/test45.ok
+@@ -6,11 +6,13 @@ marker 2
+ 1
+ 1
+ 0
+ indent 2
+ 1
+-folding 8 hh
++folding 9 ii
+     3 cc
++7 gg
++8 hh
+ expr 2
+ 1
+ 2
+ 0
+--- vim72.orig/src/testdir/test54.in
++++ vim72/src/testdir/test54.in
+@@ -1,12 +1,17 @@
+ Some tests for buffer-local autocommands
  
-+$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP)
-+      $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o
+ STARTTEST
+ :so small.vim
+ :e xx
+-:!rm -f test.out
+-:au BufLeave <buffer> :!echo buffer-local autommand in %>> test.out
++:if has("vms")
++: !del test.out.*
++: au BufLeave <buffer> :!write sys$output "buffer-local autommand in %" > test.out
++:else
++: !rm -f test.out
++: au BufLeave <buffer> :!echo buffer-local autommand in %>> test.out
++:endif
+ :e somefile           " here, autocommand for xx shall write test.out 
+ :                     " but autocommand shall not apply to buffer named <buffer>
+ :bwipe xx             " here, autocommand shall be auto-deleted
+ :e xx                 " nothing shall be written
+ :e somefile           " nothing shall be written
+--- /dev/null
++++ vim72/src/testdir/test66.in
+@@ -0,0 +1,25 @@
 +
- $(OUTDIR)/vimrc.o:    vim.rc version.h gui_w32_rc.h
-       $(RC) $(RCFLAGS) vim.rc -o $(OUTDIR)/vimrc.o
-+mzscheme_base.c:
-+      $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base
++Test for visual block shift and tab characters.
 +
- pathdef.c: $(INCL)
- ifneq (sh.exe, $(SHELL))
-       @echo creating pathdef.c
-       @echo '/* pathdef.c */' > pathdef.c
-       @echo '#include "vim.h"' >> pathdef.c
---- vim72.orig/src/po/check.vim
-+++ vim72/src/po/check.vim
-@@ -21,10 +21,13 @@ func! GetMline()
-   endwhile
-   " remove '%', not used for formatting.
-   let idline = substitute(idline, "'%'", '', 'g')
-+  " remove '%' used for plural forms.
-+  let idline = substitute(idline, '\\nPlural-Forms: .\+;\\n', '', '')
++STARTTEST
++:so small.vim
++/^abcdefgh
++\164jI    \ej<<11|D
++7|a           \e
++7|a              \e
++7|a           \e4k13|\164j<
++:$-4,$w! test.out
++:$-4,$s/\s\+//g
++\164kI    \ej<<
++7|a           \e
++7|a                                   \e
++7|a                   \e4k13|\164j3<
++:$-4,$w >> test.out
++:qa!
++ENDTEST
 +
-   " remove everything but % items.
-   return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g')
- endfunc
- " Start at the first "msgid" line.
---- vim72.orig/src/GvimExt/gvimext.cpp
-+++ vim72/src/GvimExt/gvimext.cpp
-@@ -633,11 +633,13 @@ STDMETHODIMP CShellExt::QueryContextMenu
-               --pos;
-           *pos = 0;
-       }
-       // Now concatenate
-       strncpy(temp, _("Edit with existing Vim - "), BUFSIZE - 1);
--      strncat(temp, title, BUFSIZE - 1);
-+      temp[BUFSIZE - 1] = '\0';
-+      strncat(temp, title, BUFSIZE - 1 - strlen(temp));
-+      temp[BUFSIZE - 1] = '\0';
-       InsertMenu(hMenu,
-               indexMenu++,
-               MF_STRING|MF_BYPOSITION,
-               idCmd++,
-               temp);
++abcdefghijklmnopqrstuvwxyz
++abcdefghijklmnopqrstuvwxyz
++abcdefghijklmnopqrstuvwxyz
++abcdefghijklmnopqrstuvwxyz
++abcdefghijklmnopqrstuvwxyz
+--- /dev/null
++++ vim72/src/testdir/test66.ok
+@@ -0,0 +1,10 @@
++    abcdefghijklmnopqrstuvwxyz
++abcdefghij
++    abc           defghijklmnopqrstuvwxyz
++    abc           defghijklmnopqrstuvwxyz
++    abc           defghijklmnopqrstuvwxyz
++    abcdefghijklmnopqrstuvwxyz
++abcdefghij
++    abc           defghijklmnopqrstuvwxyz
++    abc               defghijklmnopqrstuvwxyz
++    abc           defghijklmnopqrstuvwxyz
 --- /dev/null
 +++ vim72/src/testdir/test67.in
 @@ -0,0 +1,33 @@
@@ -49410,97 +47899,6 @@ Individual patches for Vim 7.2:
 +#BufEnter#<buffer>: 0
 +#BufEnter#<buffer>: 1
 +#BufEnter#<buffer>: 0
---- vim72.orig/src/proto/gui_gtk_x11.pro
-+++ vim72/src/proto/gui_gtk_x11.pro
-@@ -14,10 +14,12 @@ void gui_mch_forked __ARGS((void));
- void gui_mch_new_colors __ARGS((void));
- int gui_mch_open __ARGS((void));
- void gui_mch_exit __ARGS((int rc));
- int gui_mch_get_winpos __ARGS((int *x, int *y));
- void gui_mch_set_winpos __ARGS((int x, int y));
-+int gui_mch_maximized __ARGS((void));
-+void gui_mch_unmaximize __ARGS((void));
- void gui_mch_set_shellsize __ARGS((int width, int height, int min_width, int min_height, int base_width, int base_height, int direction));
- void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h));
- void gui_mch_settitle __ARGS((char_u *title, char_u *icon));
- void gui_mch_enable_menu __ARGS((int showit));
- void gui_mch_show_toolbar __ARGS((int showit));
---- vim72.orig/runtime/doc/map.txt
-+++ vim72/runtime/doc/map.txt
-@@ -222,10 +222,14 @@ define a new mapping or abbreviation, th
- expression is evaluated to obtain the {rhs} that is used.  Example: >
-       :inoremap <expr> . InsertDot()
- The result of the InsertDot() function will be inserted.  It could check the
- text before the cursor and start omni completion when some condition is met.
-+For abbreviations |v:char| is set to the character that was typed to trigger
-+the abbreviation.  You can use this to decide how to expand the {lhs}.  You
-+can't change v:char and you should not insert it.
-+
- Be very careful about side effects!  The expression is evaluated while
- obtaining characters, you may very well make the command dysfunctional.
- For this reason the following is blocked:
- - Changing the buffer text |textlock|.
- - Editing another buffer.
---- vim72.orig/src/testdir/test45.in
-+++ vim72/src/testdir/test45.in
-@@ -26,13 +26,20 @@ kYpj:call append("$", foldlevel("."))
- /^2 b
- i  \ejI    \e:call append("$", "indent " . foldlevel("."))
- k:call append("$", foldlevel("."))
- :" test syntax folding
- :set fdm=syntax fdl=0
--:syn region Hup start="dd" end="hh" fold
-+:syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3
-+:syn region Fd1 start="ee" end="ff" fold contained
-+:syn region Fd2 start="gg" end="hh" fold contained
-+:syn region Fd3 start="commentstart" end="commentend" fold contained
- Gzk:call append("$", "folding " . getline("."))
- k:call append("$", getline("."))
-+jAcommentstart  \eAcommentend\e:set fdl=1
-+3j:call append("$", getline("."))
-+:set fdl=0
-+zO\fj:call append("$", getline("."))
- :" test expression folding
- :fun Flvl()
-   let l = getline(v:lnum)
-   if l =~ "bb$"
-     return 2
---- vim72.orig/src/testdir/test45.ok
-+++ vim72/src/testdir/test45.ok
-@@ -6,11 +6,13 @@ marker 2
- 1
- 1
- 0
- indent 2
- 1
--folding 8 hh
-+folding 9 ii
-     3 cc
-+7 gg
-+8 hh
- expr 2
- 1
- 2
- 0
---- vim72.orig/src/memfile.c
-+++ vim72/src/memfile.c
-@@ -1341,10 +1341,15 @@ mf_do_open(mfp, fname, flags)
-       mfp->mf_fname = NULL;
-       mfp->mf_ffname = NULL;
-     }
-     else
-     {
-+#ifdef HAVE_FD_CLOEXEC
-+      int fdflags = fcntl(mfp->mf_fd, F_GETFD);
-+      if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
-+          fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC);
-+#endif
- #ifdef HAVE_SELINUX
-       mch_copy_sec(fname, mfp->mf_fname);
- #endif
-       mch_hide(mfp->mf_fname);    /* try setting the 'hidden' flag */
-     }
 --- /dev/null
 +++ vim72/src/testdir/test68.in
 @@ -0,0 +1,56 @@
@@ -49781,948 +48179,3012 @@ Individual patches for Vim 7.2:
 +
 +
 +{
-+X
-+X
-+a
-+X
-+a
-+X
-+Y
-+X
-+Y
-+a
-+X
-+ab
-+X
-+abc
-+X
-+ab
-+X
-+c
-+ab
-+X
-+Y
-+
-+X
-+X
-+a
-+X
-+a
-+X
-+Y
-+X
-+Y
-+a
-+X
-+ab
-+X
-+abc
-+X
-+ab
-+X
-+c
-+ab
-+X
-+Y
-+}
++X
++X
++a
++X
++a
++X
++Y
++X
++Y
++a
++X
++ab
++X
++abc
++X
++ab
++X
++c
++ab
++X
++Y
++
++X
++X
++a
++X
++a
++X
++Y
++X
++Y
++a
++X
++ab
++X
++abc
++X
++ab
++X
++c
++ab
++X
++Y
++}
++
++
++{
++  X
++  X
++  a
++
++  X
++  X
++  a
++}
++
++
++{
++  X
++  X
++a
++
++  X
++  X
++a
++}
++
++
++{
++X
++Xa
++Xa
++XY
++XY
++XY
++XZ
++X Y
++X Y
++X Z
++XX
++XXa
++XXY
++
++X
++Xa
++Xa
++XY
++XY
++XY
++XZ
++X Y
++X Y
++X Z
++XX
++XXa
++XXY
++}
++
++
++{
++X
++a
++}
++
+--- /dev/null
++++ vim72/src/testdir/test70.in
+@@ -0,0 +1,53 @@
++Smoke test for MzScheme interface and mzeval() function
++
++STARTTEST
++:so mzscheme.vim
++:set nocompatible viminfo+=nviminfo
++:function! MzRequire()
++:redir => l:mzversion
++:mz (version)
++:redir END
++:if strpart(l:mzversion, 1, 1) < "4"
++:" MzScheme versions < 4.x:
++:mz (require (prefix vim- vimext))
++:else
++:" newer versions:
++:mz (require (prefix-in vim- 'vimext))
++:mz (require r5rs)
++:endif
++:endfunction
++:silent call MzRequire()
++:mz (define l '("item0" "dictionary with list OK" "item2"))
++:mz (define h (make-hash))
++:mz (hash-set! h "list" l)
++/^1
++:" change buffer contents
++:mz (vim-set-buff-line (vim-eval "line('.')") "1 changed line 1")
++:" scalar test
++:let tmp_string = mzeval('"string"')
++:let tmp_1000 = mzeval('1000')
++:if tmp_string . tmp_1000 == "string1000"
++:let scalar_res = "OK"
++:else
++:let scalar_res = "FAILED"
++:endif
++:call append(search("^1"), "scalar test " . scalar_res)
++:" dictionary containing a list
++:let tmp = mzeval("h")["list"][1]
++:/^2/put =tmp
++:" circular list (at the same time test lists containing lists)
++:mz (set-car! (cddr l) l)
++:let l2 = mzeval("h")["list"]
++:if l2[2] == l2
++:let res = "OK"
++:else
++:let res = "FAILED"
++:endif
++:call setline(search("^3"), "circular test " . res)
++:?^1?,$w! test.out
++:qa!
++ENDTEST
++
++1 line 1
++2 line 2
++3 line 3
+--- /dev/null
++++ vim72/src/testdir/test70.ok
+@@ -0,0 +1,5 @@
++1 changed line 1
++scalar test OK
++2 line 2
++dictionary with list OK
++circular test OK
+--- vim72.orig/src/ui.c
++++ vim72/src/ui.c
+@@ -318,14 +318,13 @@ ui_get_shellsize()
+ /*
+  * Set the size of the Vim shell according to Rows and Columns, if possible.
+  * The gui_set_shellsize() or mch_set_shellsize() function will try to set the
+  * new size.  If this is not possible, it will adjust Rows and Columns.
+  */
+-/*ARGSUSED*/
+     void
+ ui_set_shellsize(mustset)
+-    int               mustset;        /* set by the user */
++    int               mustset UNUSED; /* set by the user */
+ {
+ #ifdef FEAT_GUI
+     if (gui.in_use)
+       gui_set_shellsize(mustset,
+ # ifdef WIN3264
+@@ -1125,14 +1124,13 @@ clip_invert_rectangle(row, col, height,
+ /*
+  * Copy the currently selected area into the '*' register so it will be
+  * available for pasting.
+  * When "both" is TRUE also copy to the '+' register.
+  */
+-/*ARGSUSED*/
+     void
+ clip_copy_modeless_selection(both)
+-    int               both;
++    int               both UNUSED;
+ {
+     char_u    *buffer;
+     char_u    *bufp;
+     int               row;
+     int               start_col;
+@@ -1699,14 +1697,13 @@ read_from_input_buf(buf, maxlen)
+     if (inbufcount)
+       mch_memmove(inbuf, inbuf + maxlen, (size_t)inbufcount);
+     return (int)maxlen;
+ }
+-/*ARGSUSED*/
+     void
+ fill_input_buf(exit_on_error)
+-    int       exit_on_error;
++    int       exit_on_error UNUSED;
+ {
+ #if defined(UNIX) || defined(OS2) || defined(VMS) || defined(MACOS_X_UNIX)
+     int               len;
+     int               try;
+     static int        did_read_something = FALSE;
+@@ -1818,11 +1815,11 @@ fill_input_buf(exit_on_error)
+            * what it was. */
+           settmode(TMODE_COOK);
+ #ifdef HAVE_DUP
+           /* Use stderr for stdin, also works for shell commands. */
+           close(0);
+-          dup(2);
++          ignored = dup(2);
+ #else
+           read_cmd_fd = 2;    /* read from stderr instead of stdin */
+ #endif
+           settmode(m);
+       }
+@@ -1990,15 +1987,14 @@ x11_setup_atoms(dpy)
+  * X Selection stuff, for cutting and pasting text to other windows.
+  */
+ static void  clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *));
+-/* ARGSUSED */
+     static void
+ clip_x11_request_selection_cb(w, success, sel_atom, type, value, length,
+                             format)
+-    Widget    w;
++    Widget    w UNUSED;
+     XtPointer success;
+     Atom      *sel_atom;
+     Atom      *type;
+     XtPointer value;
+     long_u    *length;
+@@ -2018,11 +2014,11 @@ clip_x11_request_selection_cb(w, success
+     else
+       cbd = &clip_star;
+     if (value == NULL || *length == 0)
+     {
+-      clip_free_selection(cbd);       /* ???  [what's the query?] */
++      clip_free_selection(cbd);       /* nothing received, clear register */
+       *(int *)success = FALSE;
+       return;
+     }
+     motion_type = MCHAR;
+     p = (char_u *)value;
+@@ -2074,11 +2070,11 @@ clip_x11_request_selection_cb(w, success
+       int             status;
+       text_prop.value = (unsigned char *)value;
+       text_prop.encoding = *type;
+       text_prop.format = *format;
+-      text_prop.nitems = STRLEN(value);
++      text_prop.nitems = len;
+       status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
+                                                        &text_list, &n_text);
+       if (status != Success || n_text < 1)
+       {
+           *(int *)success = FALSE;
+@@ -2106,12 +2102,12 @@ clip_x11_request_selection(myShell, dpy,
+ {
+     XEvent    event;
+     Atom      type;
+     static int        success;
+     int               i;
+-    int               nbytes = 0;
+-    char_u    *buffer;
++    time_t    start_time;
++    int               timed_out = FALSE;
+     for (i =
+ #ifdef FEAT_MBYTE
+           0
+ #else
+@@ -2127,10 +2123,11 @@ clip_x11_request_selection(myShell, dpy,
+           case 1:  type = vim_atom;           break;
+           case 2:  type = compound_text_atom; break;
+           case 3:  type = text_atom;          break;
+           default: type = XA_STRING;
+       }
++      success = MAYBE;
+       XtGetSelectionValue(myShell, cbd->sel_atom, type,
+           clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
+       /* Make sure the request for the selection goes out before waiting for
+        * a response. */
+@@ -2139,51 +2136,63 @@ clip_x11_request_selection(myShell, dpy,
+       /*
+        * Wait for result of selection request, otherwise if we type more
+        * characters, then they will appear before the one that requested the
+        * paste!  Don't worry, we will catch up with any other events later.
+        */
+-      for (;;)
++      start_time = time(NULL);
++      while (success == MAYBE)
+       {
+-          if (XCheckTypedEvent(dpy, SelectionNotify, &event))
+-              break;
+-          if (XCheckTypedEvent(dpy, SelectionRequest, &event))
+-              /* We may get a SelectionRequest here and if we don't handle
+-               * it we hang.  KDE klipper does this, for example. */
++          if (XCheckTypedEvent(dpy, SelectionNotify, &event)
++                  || XCheckTypedEvent(dpy, SelectionRequest, &event)
++                  || XCheckTypedEvent(dpy, PropertyNotify, &event))
++          {
++              /* This is where clip_x11_request_selection_cb() should be
++               * called.  It may actually happen a bit later, so we loop
++               * until "success" changes.
++               * We may get a SelectionRequest here and if we don't handle
++               * it we hang.  KDE klipper does this, for example.
++               * We need to handle a PropertyNotify for large selections. */
+               XtDispatchEvent(&event);
++              continue;
++          }
++
++          /* Time out after 2 to 3 seconds to avoid that we hang when the
++           * other process doesn't respond.  Note that the SelectionNotify
++           * event may still come later when the selection owner comes back
++           * to life and the text gets inserted unexpectedly.  Don't know
++           * why that happens or how to avoid that :-(. */
++          if (time(NULL) > start_time + 2)
++          {
++              timed_out = TRUE;
++              break;
++          }
+           /* Do we need this?  Probably not. */
+           XSync(dpy, False);
+-          /* Bernhard Walle solved a slow paste response in an X terminal by
+-           * adding: usleep(10000); here. */
++          /* Wait for 1 msec to avoid that we eat up all CPU time. */
++          ui_delay(1L, TRUE);
+       }
+-      /* this is where clip_x11_request_selection_cb() is actually called */
+-      XtDispatchEvent(&event);
+-
+-      if (success)
++      if (success == TRUE)
+           return;
++
++      /* don't do a retry with another type after timing out, otherwise we
++       * hang for 15 seconds. */
++      if (timed_out)
++          break;
+     }
+     /* Final fallback position - use the X CUT_BUFFER0 store */
+-    buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0);
+-    if (nbytes > 0)
+-    {
+-      /* Got something */
+-      clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
+-      XFree((void *)buffer);
+-      if (p_verbose > 0)
+-          verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection"));
+-    }
++    yank_cut_buffer0(dpy, cbd);
+ }
+ static Boolean        clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *));
+-/* ARGSUSED */
+     static Boolean
+ clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format)
+-    Widget    w;
++    Widget    w UNUSED;
+     Atom      *sel_atom;
+     Atom      *target;
+     Atom      *type;
+     XtPointer *value;
+     long_u    *length;
+@@ -2306,14 +2315,13 @@ clip_x11_convert_selection_cb(w, sel_ato
+     return True;
+ }
+ static void  clip_x11_lose_ownership_cb __ARGS((Widget, Atom *));
+-/* ARGSUSED */
+     static void
+ clip_x11_lose_ownership_cb(w, sel_atom)
+-    Widget  w;
++    Widget  w UNUSED;
+     Atom    *sel_atom;
+ {
+     if (*sel_atom == clip_plus.sel_atom)
+       clip_lose_selection(&clip_plus);
+     else
+@@ -2342,18 +2350,71 @@ clip_x11_own_selection(myShell, cbd)
+ /*
+  * Send the current selection to the clipboard.  Do nothing for X because we
+  * will fill in the selection only when requested by another app.
+  */
+-/*ARGSUSED*/
+     void
+ clip_x11_set_selection(cbd)
+-    VimClipboard *cbd;
++    VimClipboard *cbd UNUSED;
+ {
+ }
+ #endif
++#if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11) \
++    || defined(FEAT_GUI_GTK) || defined(PROTO)
++/*
++ * Get the contents of the X CUT_BUFFER0 and put it in "cbd".
++ */
++    void
++yank_cut_buffer0(dpy, cbd)
++    Display           *dpy;
++    VimClipboard      *cbd;
++{
++    int               nbytes = 0;
++    char_u    *buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0);
 +
++    if (nbytes > 0)
++    {
++#ifdef FEAT_MBYTE
++      int  done = FALSE;
 +
-+{
-+  X
-+  X
-+  a
++      /* CUT_BUFFER0 is supposed to be always latin1.  Convert to 'enc' when
++       * using a multi-byte encoding.  Conversion between two 8-bit
++       * character sets usually fails and the text might actually be in
++       * 'enc' anyway. */
++      if (has_mbyte)
++      {
++          char_u      *conv_buf;
++          vimconv_T   vc;
 +
-+  X
-+  X
-+  a
++          vc.vc_type = CONV_NONE;
++          if (convert_setup(&vc, (char_u *)"latin1", p_enc) == OK)
++          {
++              conv_buf = string_convert(&vc, buffer, &nbytes);
++              if (conv_buf != NULL)
++              {
++                  clip_yank_selection(MCHAR, conv_buf, (long)nbytes, cbd);
++                  vim_free(conv_buf);
++                  done = TRUE;
++              }
++              convert_setup(&vc, NULL, NULL);
++          }
++      }
++      if (!done)  /* use the text without conversion */
++#endif
++          clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
++      XFree((void *)buffer);
++      if (p_verbose > 0)
++      {
++          verbose_enter();
++          verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection"));
++          verbose_leave();
++      }
++    }
 +}
++#endif
 +
+ #if defined(FEAT_MOUSE) || defined(PROTO)
+ /*
+  * Move the cursor to the specified row and column on the screen.
+  * Change current window if necessary.        Returns an integer with the
+@@ -2535,18 +2596,11 @@ retnomove:
+ #endif
+ #ifdef FEAT_CMDWIN
+       if (cmdwin_type != 0 && wp != curwin)
+       {
+           /* A click outside the command-line window: Use modeless
+-           * selection if possible.  Allow dragging the status line of
+-           * windows just above the command-line window. */
+-          if (wp->w_winrow + wp->w_height
+-                     != curwin->w_prev->w_winrow + curwin->w_prev->w_height)
+-          {
+-              on_status_line = 0;
+-              dragwin = NULL;
+-          }
++           * selection if possible.  Allow dragging the status lines. */
+ # ifdef FEAT_VERTSPLIT
+           on_sep_line = 0;
+ # endif
+ # ifdef FEAT_CLIPBOARD
+           if (on_status_line)
+@@ -2896,15 +2950,14 @@ mouse_comp_pos(win, rowp, colp, lnump)
+ #if defined(FEAT_WINDOWS) || defined(PROTO)
+ /*
+  * Find the window at screen position "*rowp" and "*colp".  The positions are
+  * updated to become relative to the top-left of the window.
+  */
+-/*ARGSUSED*/
+     win_T *
+ mouse_find_win(rowp, colp)
+     int               *rowp;
+-    int               *colp;
++    int               *colp UNUSED;
+ {
+     frame_T   *fp;
+     fp = topframe;
+     *rowp -= firstwin->w_winrow;
+@@ -2993,22 +3046,21 @@ vcol2col(wp, lnum, vcol)
+     win_T     *wp;
+     linenr_T  lnum;
+     int               vcol;
+ {
+     /* try to advance to the specified column */
+-    int               col = 0;
+     int               count = 0;
+     char_u    *ptr;
++    char_u    *start;
+-    ptr = ml_get_buf(wp->w_buffer, lnum, FALSE);
++    start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE);
+     while (count <= vcol && *ptr != NUL)
+     {
+-      ++col;
+       count += win_lbr_chartabsize(wp, ptr, count, NULL);
+       mb_ptr_adv(ptr);
+     }
+-    return col;
++    return (int)(ptr - start);
+ }
+ #endif
+ #endif /* FEAT_MOUSE */
+--- vim72.orig/src/version.c
++++ vim72/src/version.c
+@@ -492,10 +492,15 @@ static char *(features[]) =
+ #ifdef FEAT_SNIFF
+       "+sniff",
+ #else
+       "-sniff",
+ #endif
++#ifdef STARTUPTIME
++      "+startuptime",
++#else
++      "-startuptime",
++#endif
+ #ifdef FEAT_STL_OPT
+       "+statusline",
+ #else
+       "-statusline",
+ #endif
+@@ -675,13 +680,848 @@ static char *(features[]) =
+ };
+ static int included_patches[] =
+ {   /* Add new patch number below this line */
+ /**/
++    411,
++/**/
++    410,
++/**/
++    409,
++/**/
++    408,
++/**/
++    407,
++/**/
++    406,
++/**/
++    405,
++/**/
++    404,
++/**/
++    403,
++/**/
++    402,
++/**/
++    401,
++/**/
++    400,
++/**/
++    399,
++/**/
++    398,
++/**/
++    397,
++/**/
++    396,
++/**/
++    395,
++/**/
++    394,
++/**/
++    393,
++/**/
++    392,
++/**/
++    391,
++/**/
++    390,
++/**/
++    389,
++/**/
++    388,
++/**/
++    387,
++/**/
++    386,
++/**/
++    385,
++/**/
++    384,
++/**/
++    383,
++/**/
++    382,
++/**/
++    381,
++/**/
++    380,
++/**/
++    379,
++/**/
++    378,
++/**/
++    377,
++/**/
++    376,
++/**/
++    375,
++/**/
++    374,
++/**/
++    373,
++/**/
++    372,
++/**/
++    371,
++/**/
++    370,
++/**/
++    369,
++/**/
++    368,
++/**/
++    367,
++/**/
++    366,
++/**/
++    365,
++/**/
++    364,
++/**/
++    363,
++/**/
++    362,
++/**/
++    361,
++/**/
++    360,
++/**/
++    359,
++/**/
++    358,
++/**/
++    357,
++/**/
++    356,
++/**/
++    355,
++/**/
++    354,
++/**/
++    353,
++/**/
++    352,
++/**/
++    351,
++/**/
++    350,
++/**/
++    349,
++/**/
++    348,
++/**/
++    347,
++/**/
++    346,
++/**/
++    345,
++/**/
++    344,
++/**/
++    343,
++/**/
++    342,
++/**/
++    341,
++/**/
++    340,
++/**/
++    339,
++/**/
++    338,
++/**/
++    337,
++/**/
++    336,
++/**/
++    335,
++/**/
++    334,
++/**/
++    333,
++/**/
++    332,
++/**/
++    331,
++/**/
++    330,
++/**/
++    329,
++/**/
++    328,
++/**/
++    327,
++/**/
++    326,
++/**/
++    325,
++/**/
++    324,
++/**/
++    323,
++/**/
++    322,
++/**/
++    321,
++/**/
++    320,
++/**/
++    319,
++/**/
++    318,
++/**/
++    317,
++/**/
++    316,
++/**/
++    315,
++/**/
++    314,
++/**/
++    313,
++/**/
++    312,
++/**/
++    311,
++/**/
++    310,
++/**/
++    309,
++/**/
++    308,
++/**/
++    307,
++/**/
++    306,
++/**/
++    305,
++/**/
++    304,
++/**/
++    303,
++/**/
++    302,
++/**/
++    301,
++/**/
++    300,
++/**/
++    299,
++/**/
++    298,
++/**/
++    297,
++/**/
++    296,
++/**/
++    295,
++/**/
++    294,
++/**/
++    293,
++/**/
++    292,
++/**/
++    291,
++/**/
++    290,
++/**/
++    289,
++/**/
++    288,
++/**/
++    287,
++/**/
++    286,
++/**/
++    285,
++/**/
++    284,
++/**/
++    283,
++/**/
++    282,
++/**/
++    281,
++/**/
++    280,
++/**/
++    279,
++/**/
++    278,
++/**/
++    277,
++/**/
++    276,
++/**/
++    275,
++/**/
++    274,
++/**/
++    273,
++/**/
++    272,
++/**/
++    271,
++/**/
++    270,
++/**/
++    269,
++/**/
++    268,
++/**/
++    267,
++/**/
++    266,
++/**/
++    265,
++/**/
++    264,
++/**/
++    263,
++/**/
++    262,
++/**/
++    261,
++/**/
++    260,
++/**/
++    259,
++/**/
++    258,
++/**/
++    257,
++/**/
++    256,
++/**/
++    255,
++/**/
++    254,
++/**/
++    253,
++/**/
++    252,
++/**/
++    251,
++/**/
++    250,
++/**/
++    249,
++/**/
++    248,
++/**/
++    247,
++/**/
++    246,
++/**/
++    245,
++/**/
++    244,
++/**/
++    243,
++/**/
++    242,
++/**/
++    241,
++/**/
++    240,
++/**/
++    239,
++/**/
++    238,
++/**/
++    237,
++/**/
++    236,
++/**/
++    235,
++/**/
++    234,
++/**/
++    233,
++/**/
++    232,
++/**/
++    231,
++/**/
++    230,
++/**/
++    229,
++/**/
++    228,
++/**/
++    227,
++/**/
++    226,
++/**/
++    225,
++/**/
++    224,
++/**/
++    223,
++/**/
++    222,
++/**/
++    221,
++/**/
++    220,
++/**/
++    219,
++/**/
++    218,
++/**/
++    217,
++/**/
++    216,
++/**/
++    215,
++/**/
++    214,
++/**/
++    213,
++/**/
++    212,
++/**/
++    211,
++/**/
++    210,
++/**/
++    209,
++/**/
++    208,
++/**/
++    207,
++/**/
++    206,
++/**/
++    205,
++/**/
++    204,
++/**/
++    203,
++/**/
++    202,
++/**/
++    201,
++/**/
++    200,
++/**/
++    199,
++/**/
++    198,
++/**/
++    197,
++/**/
++    196,
++/**/
++    195,
++/**/
++    194,
++/**/
++    193,
++/**/
++    192,
++/**/
++    191,
++/**/
++    190,
++/**/
++    189,
++/**/
++    188,
++/**/
++    187,
++/**/
++    186,
++/**/
++    185,
++/**/
++    184,
++/**/
++    183,
++/**/
++    182,
++/**/
++    181,
++/**/
++    180,
++/**/
++    179,
++/**/
++    178,
++/**/
++    177,
++/**/
++    176,
++/**/
++    175,
++/**/
++    174,
++/**/
++    173,
++/**/
++    172,
++/**/
++    171,
++/**/
++    170,
++/**/
++    169,
++/**/
++    168,
++/**/
++    167,
++/**/
++    166,
++/**/
++    165,
++/**/
++    164,
++/**/
++    163,
++/**/
++    162,
++/**/
++    161,
++/**/
++    160,
++/**/
++    159,
++/**/
++    158,
++/**/
++    157,
++/**/
++    156,
++/**/
++    155,
++/**/
++    154,
++/**/
++    153,
++/**/
++    152,
++/**/
++    151,
++/**/
++    150,
++/**/
++    149,
++/**/
++    148,
++/**/
++    147,
++/**/
++    146,
++/**/
++    145,
++/**/
++    144,
++/**/
++    143,
++/**/
++    142,
++/**/
++    141,
++/**/
++    140,
++/**/
++    139,
++/**/
++    138,
++/**/
++    137,
++/**/
++    136,
++/**/
++    135,
++/**/
++    134,
++/**/
++    133,
++/**/
++    132,
++/**/
++    131,
++/**/
++    130,
++/**/
++    129,
++/**/
++    128,
++/**/
++    127,
++/**/
++    126,
++/**/
++    125,
++/**/
++    124,
++/**/
++    123,
++/**/
++    122,
++/**/
++    121,
++/**/
++    120,
++/**/
++    119,
++/**/
++    118,
++/**/
++    117,
++/**/
++    116,
++/**/
++    115,
++/**/
++    114,
++/**/
++    113,
++/**/
++    112,
++/**/
++    111,
++/**/
++    110,
++/**/
++    109,
++/**/
++    108,
++/**/
++    107,
++/**/
++    106,
++/**/
++    105,
++/**/
++    104,
++/**/
++    103,
++/**/
++    102,
++/**/
++    101,
++/**/
++    100,
++/**/
++    99,
++/**/
++    98,
++/**/
++    97,
++/**/
++    96,
++/**/
++    95,
++/**/
++    94,
++/**/
++    93,
++/**/
++    92,
++/**/
++    91,
++/**/
++    90,
++/**/
++    89,
++/**/
++    88,
++/**/
++    87,
++/**/
++    86,
++/**/
++    85,
++/**/
++    84,
++/**/
++    83,
++/**/
++    82,
++/**/
++    81,
++/**/
++    80,
++/**/
++    79,
++/**/
++    78,
++/**/
++    77,
++/**/
++    76,
++/**/
++    75,
++/**/
++    74,
++/**/
++    73,
++/**/
++    72,
++/**/
++    71,
++/**/
++    70,
++/**/
++    69,
++/**/
++    68,
++/**/
++    67,
++/**/
++    66,
++/**/
++    65,
++/**/
++    64,
++/**/
++    63,
++/**/
++    62,
++/**/
++    61,
++/**/
++    60,
++/**/
++    59,
++/**/
++    58,
++/**/
++    57,
++/**/
++    56,
++/**/
++    55,
++/**/
++    54,
++/**/
++    53,
++/**/
++    52,
++/**/
++    51,
++/**/
++    50,
++/**/
++    49,
++/**/
++    48,
++/**/
++    47,
++/**/
++    46,
++/**/
++    45,
++/**/
++    44,
++/**/
++    43,
++/**/
++    42,
++/**/
++    41,
++/**/
++    40,
++/**/
++    39,
++/**/
++    38,
++/**/
++    37,
++/**/
++    36,
++/**/
++    35,
++/**/
++    34,
++/**/
++    33,
++/**/
++    32,
++/**/
++    31,
++/**/
++    30,
++/**/
++    29,
++/**/
++    28,
++/**/
++    27,
++/**/
++    26,
++/**/
++    25,
++/**/
++    24,
++/**/
++    23,
++/**/
++    22,
++/**/
++    21,
++/**/
++    20,
++/**/
++    19,
++/**/
++    18,
++/**/
++    17,
++/**/
++    16,
++/**/
++    15,
++/**/
++    14,
++/**/
++    13,
++/**/
++    12,
++/**/
++    11,
++/**/
++    10,
++/**/
++    9,
++/**/
++    8,
++/**/
++    7,
++/**/
++    6,
++/**/
++    5,
++/**/
++    4,
++/**/
++    3,
++/**/
++    2,
++/**/
++    1,
++/**/
+     0
+ };
++/*
++ * Place to put a short description when adding a feature with a patch.
++ * Keep it short, e.g.,: "relative numbers", "persistent undo".
++ * Also add a comment marker to separate the lines.
++ * See the official Vim patches for the diff format: It must use a context of
++ * one line only.  Create it by hand or use "diff -C2" and edit the patch.
++ */
++static char *(extra_patches[]) =
++{   /* Add your patch description below this line */
++/**/
++    NULL
++};
 +
-+{
-+  X
-+  X
-+a
-+
-+  X
-+  X
-+a
-+}
-+
+     int
+ highest_patch()
+ {
+     int               i;
+     int               h = 0;
+@@ -784,11 +1624,11 @@ list_version()
+ #ifdef RISCOS
+     MSG_PUTS(_("\nRISC OS version"));
+ #endif
+ #ifdef VMS
+-    MSG_PUTS("\nOpenVMS version");
++    MSG_PUTS(_("\nOpenVMS version"));
+ # ifdef HAVE_PATHDEF
+     if (*compiled_arch != NUL)
+     {
+       MSG_PUTS(" - ");
+       MSG_PUTS(compiled_arch);
+@@ -823,10 +1663,23 @@ list_version()
+               first = -1;
+           }
+       }
+     }
++    /* Print the list of extra patch descriptions if there is at least one. */
++    if (extra_patches[0] != NULL)
++    {
++      MSG_PUTS(_("\nExtra patches: "));
++      s = "";
++      for (i = 0; extra_patches[i] != NULL; ++i)
++      {
++          MSG_PUTS(s);
++          s = ", ";
++          MSG_PUTS(extra_patches[i]);
++      }
++    }
 +
-+{
-+X
-+Xa
-+Xa
-+XY
-+XY
-+XY
-+XZ
-+X Y
-+X Y
-+X Z
-+XX
-+XXa
-+XXY
+ #ifdef MODIFIED_BY
+     MSG_PUTS("\n");
+     MSG_PUTS(_("Modified by "));
+     MSG_PUTS(MODIFIED_BY);
+ #endif
+@@ -1251,14 +2104,13 @@ do_intro_line(row, mesg, add_version, at
+ }
+ /*
+  * ":intro": clear screen, display intro screen and wait for return.
+  */
+-/*ARGSUSED*/
+     void
+ ex_intro(eap)
+-    exarg_T   *eap;
++    exarg_T   *eap UNUSED;
+ {
+     screenclear();
+     intro_message(TRUE);
+     wait_return(TRUE);
+ }
+--- vim72.orig/src/vim.h
++++ vim72/src/vim.h
+@@ -50,11 +50,13 @@
+ # endif
+ #endif
+ /* user ID of root is usually zero, but not for everybody */
+ #ifdef __TANDEM
+-# define _TANDEM_SOURCE
++# ifndef _TANDEM_SOURCE
++#  define _TANDEM_SOURCE
++# endif
+ # include <floss.h>
+ # define ROOT_UID 65535
+ #else
+ # define ROOT_UID 0
+ #endif
+@@ -260,10 +262,18 @@
+ /* __ARGS and __PARMS are the same thing. */
+ #ifndef __PARMS
+ # define __PARMS(x) __ARGS(x)
+ #endif
++/* Mark unused function arguments with UNUSED, so that gcc -Wunused-parameter
++ * can be used to check for mistakes. */
++#ifdef HAVE_ATTRIBUTE_UNUSED
++# define UNUSED __attribute__((unused))
++#else
++# define UNUSED
++#endif
 +
-+X
-+Xa
-+Xa
-+XY
-+XY
-+XY
-+XZ
-+X Y
-+X Y
-+X Z
-+XX
-+XXa
-+XXY
-+}
+ /* if we're compiling in C++ (currently only KVim), the system
+  * headers must have the correct prototypes or nothing will build.
+  * conversely, our prototypes might clash due to throw() specifiers and
+  * cause compilation failures even though the headers are correct.  For
+  * a concrete example, gcc-3.2 enforces exception specifications, and
+@@ -339,12 +349,18 @@
+ # endif
+ #endif
+ #ifdef BACKSLASH_IN_FILENAME
+ # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
+ #else
+-# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
+-# define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
++# ifdef VMS
++    /* VMS allows a lot of characters in the file name */
++#  define PATH_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'\"|!")
++#  define SHELL_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'|!()&")
++# else
++#  define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
++#  define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
++# endif
+ #endif
+ #define NUMBUFLEN 30      /* length of a buffer to store a number in ASCII */
+ /*
+@@ -368,11 +384,11 @@ typedef           __int64        long_i;
+    * that change size between 32-bit and 64-bit platforms.  For any such type,
+    * __w64 should appear only on the 32-bit definition of the typedef.
+    * Define __w64 as an empty token for everything but MSVC 7.x or later.
+    */
+ # if !defined(_MSC_VER)       || (_MSC_VER < 1300)
+-#  define __w64 
++#  define __w64
+ # endif
+ typedef unsigned long __w64   long_u;
+ typedef                long __w64     long_i;
+ # define SCANF_HEX_LONG_U       "%lx"
+ # define SCANF_DECIMAL_LONG_U   "%lu"
+@@ -459,10 +475,27 @@ typedef unsigned long u8char_T;      /* l
+ #endif
+ #ifdef HAVE_STDARG_H
+ # include <stdarg.h>
+ #endif
++# if defined(HAVE_SYS_SELECT_H) && \
++      (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME))
++#  include <sys/select.h>
++# endif
 +
++# ifndef HAVE_SELECT
++#  ifdef HAVE_SYS_POLL_H
++#   include <sys/poll.h>
++#   define HAVE_POLL
++#  else
++#   ifdef HAVE_POLL_H
++#    include <poll.h>
++#    define HAVE_POLL
++#   endif
++#  endif
++# endif
 +
-+{
-+X
-+a
-+}
+ /* ================ end of the header file puzzle =============== */
+ /*
+  * For dynamically loaded imm library. Currently, only for Win32.
+  */
+@@ -577,11 +610,11 @@ extern char *(*dyn_libintl_textdomain)(c
+ #define VALID_BOTLINE_AP 0x40 /* w_botine is approximated */
+ #define VALID_TOPLINE 0x80    /* w_topline is valid (for cursor position) */
+ /*
+  * Terminal highlighting attribute bits.
+- * Attibutes above HL_ALL are used for syntax highlighting.
++ * Attributes above HL_ALL are used for syntax highlighting.
+  */
+ #define HL_NORMAL             0x00
+ #define HL_INVERSE            0x01
+ #define HL_BOLD                       0x02
+ #define HL_ITALIC             0x04
+@@ -700,10 +733,14 @@ extern char *(*dyn_libintl_textdomain)(c
+ #define EXPAND_COLORS         28
+ #define EXPAND_COMPILER               29
+ #define EXPAND_USER_DEFINED   30
+ #define EXPAND_USER_LIST      31
+ #define EXPAND_SHELLCMD               32
++#define EXPAND_CSCOPE         33
++#define EXPAND_SIGN           34
++#define EXPAND_PROFILE                35
++#define EXPAND_BEHAVE         36
+ /* Values for exmode_active (0 is no exmode) */
+ #define EXMODE_NORMAL         1
+ #define EXMODE_VIM            2
+@@ -1049,10 +1086,11 @@ extern char *(*dyn_libintl_textdomain)(c
+ #define WSP_TOP               4       /* window at top-left of shell */
+ #define WSP_BOT               8       /* window at bottom-right of shell */
+ #define WSP_HELP      16      /* creating the help window */
+ #define WSP_BELOW     32      /* put new window below/right */
+ #define WSP_ABOVE     64      /* put new window above/left */
++#define WSP_NEWLOC    128     /* don't copy location list */
+ /*
+  * arguments for gui_set_shellsize()
+  */
+ #define RESIZE_VERT   1       /* resize vertically */
+@@ -1240,11 +1278,11 @@ typedef enum
+     , HLF_CUL     /* 'cursurline' */
+     , HLF_COUNT           /* MUST be the last one */
+ } hlf_T;
+ /* The HL_FLAGS must be in the same order as the HLF_ enums!
+- * When chainging this also adjust the default for 'highlight'. */
++ * When changing this also adjust the default for 'highlight'. */
+ #define HL_FLAGS {'8', '@', 'd', 'e', 'h', 'i', 'l', 'm', 'M', \
+                 'n', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', \
+                 'f', 'F', 'A', 'C', 'D', 'T', '>', \
+                 'B', 'P', 'R', 'L', \
+                 '+', '=', 'x', 'X', '*', '#', '_', '!', '.'}
+@@ -1326,15 +1364,15 @@ typedef enum
+ #else
+ # define MSG_BUF_LEN 80               /* length of buffer for small messages */
+ # define MSG_BUF_CLEN  MSG_BUF_LEN        /* cell length */
+ #endif
+-#if defined(AMIGA) || defined(__linux__) || defined(__QNX__) || defined(__CYGWIN32__) || defined(_AIX)
+-# define TBUFSZ 2048          /* buffer size for termcap entry */
+-#else
+-# define TBUFSZ 1024          /* buffer size for termcap entry */
+-#endif
++/* Size of the buffer used for tgetent().  Unfortunately this is largely
++ * undocumented, some systems use 1024.  Using a buffer that is too small
++ * causes a buffer overrun and a crash.  Use the maximum known value to stay
++ * on the safe side. */
++#define TBUFSZ 2048           /* buffer size for termcap entry */
+ /*
+  * Maximum length of key sequence to be mapped.
+  * Must be able to hold an Amiga resize report.
+  */
+@@ -1408,11 +1446,11 @@ typedef enum
+ #endif
+ #ifdef FEAT_MBYTE
+ /* We need to call mb_stricmp() even when we aren't dealing with a multi-byte
+  * encoding because mb_stricmp() takes care of all ascii and non-ascii
+- * encodings, including characters with umluats in latin1, etc., while
++ * encodings, including characters with umlauts in latin1, etc., while
+  * STRICMP() only handles the system locale version, which often does not
+  * handle non-ascii properly. */
+ # define MB_STRICMP(d, s)     mb_strnicmp((char_u *)(d), (char_u *)(s), (int)MAXCOL)
+ # define MB_STRNICMP(d, s, n) mb_strnicmp((char_u *)(d), (char_u *)(s), (int)(n))
+@@ -1449,12 +1487,12 @@ typedef enum
+ # define PERROR(msg)              (void)emsg3((char_u *)"%s: %s", (char_u *)msg, (char_u *)strerror(errno))
+ #else
+ # define PERROR(msg)              perror(msg)
+ #endif
+-typedef long      linenr_T;           /* line number type */
+-typedef unsigned    colnr_T;          /* column number type */
++typedef long  linenr_T;               /* line number type */
++typedef int   colnr_T;                /* column number type */
+ typedef unsigned short disptick_T;    /* display tick type */
+ #define MAXLNUM (0x7fffffffL)         /* maximum (invalid) line number */
+ /*
+@@ -1726,11 +1764,12 @@ typedef int proftime_T;            /* dummy for
+ #define VV_MOUSE_WIN  49
+ #define VV_MOUSE_LNUM   50
+ #define VV_MOUSE_COL  51
+ #define VV_OP         52
+ #define VV_SEARCHFORWARD 53
+-#define VV_LEN                54      /* number of v: vars */
++#define VV_OLDFILES   54
++#define VV_LEN                55      /* number of v: vars */
+ #ifdef FEAT_CLIPBOARD
+ /* VIM_ATOM_NAME is the older Vim-specific selection type for X11.  Still
+  * supported for when a mix of Vim versions is used. VIMENC_ATOM_NAME includes
+@@ -1977,10 +2016,13 @@ typedef int VimClipboard;      /* This is req
+ # else
+ #  define X_DISPLAY   xterm_dpy
+ # endif
+ #endif
++#ifndef FEAT_NETBEANS_INTG
++# undef NBDEBUG
++#endif
+ #ifdef NBDEBUG /* Netbeans debugging. */
+ # include "nbdebug.h"
+ #else
+ # define nbdebug(a)
+ #endif
+@@ -2052,6 +2094,12 @@ typedef int VimClipboard;       /* This is req
+ /* last argument for do_source() */
+ #define DOSO_NONE     0
+ #define DOSO_VIMRC    1       /* loading vimrc file */
+ #define DOSO_GVIMRC   2       /* loading gvimrc file */
++/* flags for read_viminfo() and children */
++#define VIF_WANT_INFO         1       /* load non-mark info */
++#define VIF_WANT_MARKS                2       /* load file marks */
++#define VIF_FORCEIT           4       /* overwrite info already read */
++#define VIF_GET_OLDFILES      8       /* load v:oldfiles */
 +
---- vim72.orig/runtime/filetype.vim
-+++ vim72/runtime/filetype.vim
-@@ -2398,22 +2398,24 @@ au BufNewFile,BufRead /etc/xinetd.d/*          c
+ #endif /* VIM__H */
+--- vim72.orig/src/window.c
++++ vim72/src/window.c
+@@ -9,24 +9,24 @@
+ #include "vim.h"
  
- " Z-Shell script
- au BufNewFile,BufRead zsh*,zlog*              call s:StarSetf('zsh')
+ static int path_is_url __ARGS((char_u *p));
+ #if defined(FEAT_WINDOWS) || defined(PROTO)
+-static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
+-static void win_init __ARGS((win_T *newp, win_T *oldp));
++static void win_init __ARGS((win_T *newp, win_T *oldp, int flags));
++static void win_init_some __ARGS((win_T *newp, win_T *oldp));
+ static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col));
+ static void frame_setheight __ARGS((frame_T *curfrp, int height));
+ #ifdef FEAT_VERTSPLIT
+ static void frame_setwidth __ARGS((frame_T *curfrp, int width));
+ #endif
+ static void win_exchange __ARGS((long));
+ static void win_rotate __ARGS((int, int));
+ static void win_totop __ARGS((int size, int flags));
+ static void win_equal_rec __ARGS((win_T *next_curwin, int current, frame_T *topfr, int dir, int col, int row, int width, int height));
+ static int last_window __ARGS((void));
++static int one_window __ARGS((void));
+ static win_T *win_free_mem __ARGS((win_T *win, int *dirp, tabpage_T *tp));
+-static win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));
+ static frame_T *win_altframe __ARGS((win_T *win, tabpage_T *tp));
+ static tabpage_T *alt_tabpage __ARGS((void));
+ static win_T *frame2win __ARGS((frame_T *frp));
+ static int frame_has_win __ARGS((frame_T *frp, win_T *wp));
+ static void frame_new_height __ARGS((frame_T *topfrp, int height, int topfirst, int wfh));
+@@ -39,20 +39,19 @@ static void frame_add_vsep __ARGS((frame
+ static int frame_minwidth __ARGS((frame_T *topfrp, win_T *next_curwin));
+ static void frame_fix_width __ARGS((win_T *wp));
+ #endif
+ #endif
+ static int win_alloc_firstwin __ARGS((win_T *oldwin));
++static void new_frame __ARGS((win_T *wp));
+ #if defined(FEAT_WINDOWS) || defined(PROTO)
+ static tabpage_T *alloc_tabpage __ARGS((void));
+ static int leave_tabpage __ARGS((buf_T *new_curbuf));
+ static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf));
+ static void frame_fix_height __ARGS((win_T *wp));
+ static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin));
+ static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin));
+ static void win_free __ARGS((win_T *wp, tabpage_T *tp));
+-static void win_append __ARGS((win_T *, win_T *));
+-static void win_remove __ARGS((win_T *, tabpage_T *tp));
+ static void frame_append __ARGS((frame_T *after, frame_T *frp));
+ static void frame_insert __ARGS((frame_T *before, frame_T *frp));
+ static void frame_remove __ARGS((frame_T *frp));
+ #ifdef FEAT_VERTSPLIT
+ static void win_new_width __ARGS((win_T *wp, int width));
+@@ -60,21 +59,19 @@ static void win_goto_ver __ARGS((int up,
+ static void win_goto_hor __ARGS((int left, long count));
+ #endif
+ static void frame_add_height __ARGS((frame_T *frp, int n));
+ static void last_status_rec __ARGS((frame_T *fr, int statusline));
  
+-static void make_snapshot __ARGS((void));
+ static void make_snapshot_rec __ARGS((frame_T *fr, frame_T **frp));
+-static void clear_snapshot __ARGS((tabpage_T *tp));
++static void clear_snapshot __ARGS((tabpage_T *tp, int idx));
+ static void clear_snapshot_rec __ARGS((frame_T *fr));
+-static void restore_snapshot __ARGS((int close_curwin));
+ static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
+ static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
  
-+
-+" Use the filetype detect plugins.  They may overrule any of the previously
-+" detected filetypes.
-+runtime! ftdetect/*.vim
-+
-+
- " Generic configuration file (check this last, it's just guessing!)
- au BufNewFile,BufRead,StdinReadPost *
-       \ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
-       \    && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
-       \       || getline(4) =~ '^#' || getline(5) =~ '^#') |
-       \   setf conf |
-       \ endif
+ #endif /* FEAT_WINDOWS */
  
--" Use the plugin-filetype checks last, they may overrule any of the previously
--" detected filetypes.
--runtime! ftdetect/*.vim
--
- augroup END
+-static win_T *win_alloc __ARGS((win_T *after));
++static win_T *win_alloc __ARGS((win_T *after, int hidden));
+ static void win_new_height __ARGS((win_T *, int));
  
+ #define URL_SLASH     1               /* path_is_url() has found "://" */
+ #define URL_BACKSLASH 2               /* path_is_url() has found ":\\" */
  
- " If the GUI is already running, may still need to install the Syntax menu.
- " Don't do it when the 'M' flag is included in 'guioptions'.
---- vim72.orig/src/proto/misc1.pro
-+++ vim72/src/proto/misc1.pro
-@@ -83,10 +83,11 @@ int get_lisp_indent __ARGS((void));
- void prepare_to_exit __ARGS((void));
- void preserve_exit __ARGS((void));
- int vim_fexists __ARGS((char_u *fname));
- void line_breakcheck __ARGS((void));
- void fast_breakcheck __ARGS((void));
-+int expand_wildcards_eval __ARGS((char_u **pat, int *num_file, char_u ***file, int flags));
- int expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags));
- int match_suffix __ARGS((char_u *fname));
- int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags, int didstar));
- int gen_expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags));
- void addfile __ARGS((garray_T *gap, char_u *f, int flags));
---- vim72.orig/src/integration.c
-+++ vim72/src/integration.c
-@@ -76,11 +76,11 @@
- # define NOCATGETS(x) x
+@@ -257,11 +254,11 @@ newwindow:
+     case Ctrl_W:
+     case 'w':
+ /* cursor to previous window with wrap around */
+     case 'W':
+               CHECK_CMDWIN
+-              if (lastwin == firstwin && Prenum != 1) /* just one window */
++              if (firstwin == lastwin && Prenum != 1) /* just one window */
+                   beep_flush();
+               else
+               {
+                   if (Prenum)                 /* go to specified window */
+                   {
+@@ -341,11 +338,11 @@ newwindow:
+               break;
  #endif
  
- /* Functions private to this file */
- static void workshop_connection_closed(void);
--static void messageFromEserve(XtPointer clientData, int *NOTUSED1, XtInputId *NOTUSED2);
-+static void messageFromEserve(XtPointer clientData, int *dum1, XtInputId *dum2);
- static void workshop_disconnect(void);
- static void workshop_sensitivity(int num, char *table);
- static void adjust_sign_name(char *filename);
- static void process_menuItem(char *);
- static void process_toolbarButton(char *);
-@@ -155,13 +155,14 @@ getCommand(void)
-               return NULL;
-       }
+ /* move window to new tab page */
+     case 'T':
+-              if (firstwin == lastwin)
++              if (one_window())
+                   MSG(_(m_onlyone));
+               else
+               {
+                   tabpage_T   *oldtab = curtab;
+                   tabpage_T   *newtab;
+@@ -529,11 +526,12 @@ wingotofile:
+                   if (win_split(0, 0) == OK)
+                   {
+ # ifdef FEAT_SCROLLBIND
+                       curwin->w_p_scb = FALSE;
+ # endif
+-                      (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, ECMD_HIDE);
++                      (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL,
++                                                         ECMD_HIDE, NULL);
+                       if (nchar == 'F' && lnum >= 0)
+                       {
+                           curwin->w_cursor.lnum = lnum;
+                           check_cursor_lnum();
+                           beginline(BL_SOL | BL_FIX);
+@@ -591,13 +589,11 @@ wingotofile:
+ #endif
+               ++no_mapping;
+               ++allow_keys;   /* no mapping for xchar, but allow key codes */
+               if (xchar == NUL)
+                   xchar = plain_vgetc();
+-#ifdef FEAT_LANGMAP
+               LANGMAP_ADJUST(xchar, TRUE);
+-#endif
+               --no_mapping;
+               --allow_keys;
+ #ifdef FEAT_CMDL_INFO
+               (void)add_to_showcmd(xchar);
+ #endif
+@@ -628,11 +624,11 @@ wingotofile:
+                       break;
  
- }
+ #ifdef FEAT_SEARCHPATH
+                   case 'f':       /* CTRL-W gf: "gf" in a new tab page */
+                   case 'F':       /* CTRL-W gF: "gF" in a new tab page */
+-                      cmdmod.tab = TRUE;
++                      cmdmod.tab = tabpage_index(curtab) + 1;
+                       nchar = xchar;
+                       goto wingotofile;
+ #endif
+                   default:
+                       beep_flush();
+@@ -678,24 +674,24 @@ win_split(size, flags)
+     }
  
--/*ARGSUSED*/
- void
--messageFromEserve(XtPointer clientData, int *NOTUSED1, XtInputId *NOTUSED2)
-+messageFromEserve(XtPointer clientData UNUSED,
-+                int *dum1 UNUSED,
-+                XtInputId *dum2 UNUSED)
- {
-       char    *cmd;           /* the 1st word of the command */
+     /* When creating the help window make a snapshot of the window layout.
+      * Otherwise clear the snapshot, it's now invalid. */
+     if (flags & WSP_HELP)
+-      make_snapshot();
++      make_snapshot(SNAP_HELP_IDX);
+     else
+-      clear_snapshot(curtab);
++      clear_snapshot(curtab, SNAP_HELP_IDX);
  
-       cmd = getCommand();
-       if (cmd == NULL) {
-@@ -197,11 +198,11 @@ messageFromEserve(XtPointer clientData,
-                               color++;
-                       }
-                       if (sign) {
-                               sign++;
-                       }
--                      /* Change sign name to accomodate a different size? */
-+                      /* Change sign name to accommodate a different size? */
-                       adjust_sign_name(sign);
-                       workshop_add_mark_type(idx, color, sign);
-               }
-               HANDLE_ERRORS(cmd);
-               break;
-@@ -578,11 +579,11 @@ unrecognised_message(
-       /* abort(); */
+     return win_split_ins(size, flags, NULL, 0);
  }
+ /*
+  * When "newwin" is NULL: split the current window in two.
+  * When "newwin" is not NULL: insert this window at the far
+  * top/left/right/bottom.
+  * return FAIL for failure, OK otherwise
+  */
+-    static int
++    int
+ win_split_ins(size, flags, newwin, dir)
+     int               size;
+     int               flags;
+     win_T     *newwin;
+     int               dir;
+@@ -892,29 +888,36 @@ win_split_ins(size, flags, newwin, dir)
  #endif
+                       p_sb))))
+     {
+       /* new window below/right of current one */
+       if (newwin == NULL)
+-          wp = win_alloc(oldwin);
++          wp = win_alloc(oldwin, FALSE);
+       else
+           win_append(oldwin, wp);
+     }
+     else
+     {
+       if (newwin == NULL)
+-          wp = win_alloc(oldwin->w_prev);
++          wp = win_alloc(oldwin->w_prev, FALSE);
+       else
+           win_append(oldwin->w_prev, wp);
+     }
  
+     if (newwin == NULL)
+     {
+       if (wp == NULL)
+           return FAIL;
  
--/* Change sign name to accomodate a different size:
-+/* Change sign name to accommodate a different size:
-  * Create the filename based on the height. The filename format
-  * of multisize icons are:
-  *    x.xpm   : largest icon
-  *    x1.xpm  : smaller icon
-  *    x2.xpm  : smallest icon */
-@@ -612,10 +613,11 @@ adjust_sign_name(char *filename)
-               strcpy(s, "1.xpm");
++      new_frame(wp);
++      if (wp->w_frame == NULL)
++      {
++          win_free(wp, NULL);
++          return FAIL;
++      }
++
+       /* make the contents of the new window the same as the current one */
+-      win_init(wp, curwin);
++      win_init(wp, curwin, flags);
+     }
+     /*
+      * Reorganise the tree of frames to insert the new window.
+      */
+@@ -969,17 +972,11 @@ win_split_ins(size, flags, newwin, dir)
+           for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next)
+               frp->fr_parent = curfrp;
+     }
+     if (newwin == NULL)
+-    {
+-      /* Create a frame for the new window. */
+-      frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
+-      frp->fr_layout = FR_LEAF;
+-      frp->fr_win = wp;
+-      wp->w_frame = frp;
+-    }
++      frp = wp->w_frame;
+     else
+       frp = newwin->w_frame;
+     frp->fr_parent = curfrp->fr_parent;
+     /* Insert the new frame at the right place in the frame list. */
+@@ -992,32 +989,32 @@ win_split_ins(size, flags, newwin, dir)
+     if (flags & WSP_VERT)
+     {
+       wp->w_p_scr = curwin->w_p_scr;
+       if (need_status)
+       {
+-          --oldwin->w_height;
++          win_new_height(oldwin, oldwin->w_height - 1);
+           oldwin->w_status_height = need_status;
+       }
+       if (flags & (WSP_TOP | WSP_BOT))
+       {
+           /* set height and row of new window to full height */
+           wp->w_winrow = tabline_height();
+-          wp->w_height = curfrp->fr_height - (p_ls > 0);
++          win_new_height(wp, curfrp->fr_height - (p_ls > 0));
+           wp->w_status_height = (p_ls > 0);
+       }
        else
-               strcpy(s, ".xpm");
- }
+       {
+           /* height and row of new window is same as current window */
+           wp->w_winrow = oldwin->w_winrow;
+-          wp->w_height = oldwin->w_height;
++          win_new_height(wp, oldwin->w_height);
+           wp->w_status_height = oldwin->w_status_height;
+       }
+       frp->fr_height = curfrp->fr_height;
  
-+#if 0
- /* Were we invoked by WorkShop? This function can be used early during startup
-    if you want to do things differently if the editor is started standalone
-    or in WorkShop mode. For example, in standalone mode you may not want to
-    add a footer/message area or a sign gutter. */
- int
-@@ -625,10 +627,11 @@ workshop_invoked()
-       if (result == -1) {
-               result = (getenv(NOCATGETS("SPRO_EDITOR_SOCKET")) != NULL);
+       /* "new_size" of the current window goes to the new window, use
+        * one column for the vertical separator */
+-      wp->w_width = new_size;
++      win_new_width(wp, new_size);
+       if (before)
+           wp->w_vsep_width = 1;
+       else
+       {
+           wp->w_vsep_width = oldwin->w_vsep_width;
+@@ -1050,17 +1047,17 @@ win_split_ins(size, flags, newwin, dir)
+       /* width and column of new window is same as current window */
+ #ifdef FEAT_VERTSPLIT
+       if (flags & (WSP_TOP | WSP_BOT))
+       {
+           wp->w_wincol = 0;
+-          wp->w_width = Columns;
++          win_new_width(wp, Columns);
+           wp->w_vsep_width = 0;
        }
-       return result;
- }
-+#endif
+       else
+       {
+           wp->w_wincol = oldwin->w_wincol;
+-          wp->w_width = oldwin->w_width;
++          win_new_width(wp, oldwin->w_width);
+           wp->w_vsep_width = oldwin->w_vsep_width;
+       }
+       frp->fr_width = curfrp->fr_width;
+ #endif
  
- /* Connect back to eserve */
- void  workshop_connect(XtAppContext context)
- {
- #ifdef INET_SOCKETS
-@@ -748,10 +751,11 @@ void     workshop_disconnect()
+@@ -1112,11 +1109,11 @@ win_split_ins(size, flags, newwin, dir)
+       msg_row = Rows - 1;
+       msg_col = 0;    /* put position back at start of line */
+     }
+     /*
+-     * make the new window the current window and redraw
++     * equalize the window sizes.
+      */
+     if (do_equal || dir != 0)
+       win_equal(wp, TRUE,
+ #ifdef FEAT_VERTSPLIT
+               (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h')
+@@ -1144,10 +1141,14 @@ win_split_ins(size, flags, newwin, dir)
+     {
+       i = p_wh;
+       if (size != 0)
+           p_wh = size;
+     }
++
++    /*
++     * make the new window the current window
++     */
+     win_enter(wp, FALSE);
+ #ifdef FEAT_VERTSPLIT
+     if (flags & WSP_VERT)
+       p_wiw = i;
+     else
+@@ -1155,19 +1156,23 @@ win_split_ins(size, flags, newwin, dir)
+       p_wh = i;
+     return OK;
+ }
  
++
  /*
-  * Utility functions
+  * Initialize window "newp" from window "oldp".
+  * Used when splitting a window and when creating a new tab page.
+  * The windows will both edit the same buffer.
++ * WSP_NEWLOC may be specified in flags to prevent the location list from
++ * being copied.
   */
-+#if 0
- /* Set icon for the window */
- void
- workshop_set_icon(Display *display, Widget shell, char **xpmdata,
-                 int width, int height)
+     static void
+-win_init(newp, oldp)
++win_init(newp, oldp, flags)
+     win_T     *newp;
+     win_T     *oldp;
++    int                flags UNUSED;
  {
-@@ -791,10 +795,11 @@ workshop_set_icon(Display *display, Widg
-               XtVaSetValues(shell,
-                   XtNiconWindow, iconWindow, NULL);
-       }
-       XtFree((char *)xpmAttributes.colorsymbols);
- }
-+#endif
+     int               i;
  
- /* Minimize and maximize shells. From libutil's shell.cc. */
+     newp->w_buffer = oldp->w_buffer;
+     oldp->w_buffer->b_nwindows++;
+@@ -1188,36 +1193,55 @@ win_init(newp, oldp)
+     newp->w_prev_fraction_row = oldp->w_prev_fraction_row;
+ #ifdef FEAT_JUMPLIST
+     copy_jumplist(oldp, newp);
+ #endif
+ #ifdef FEAT_QUICKFIX
+-    copy_loclist(oldp, newp);
++    if (flags & WSP_NEWLOC)
++    {
++      /* Don't copy the location list.  */
++      newp->w_llist = NULL;
++      newp->w_llist_ref = NULL;
++    }
++    else
++      copy_loclist(oldp, newp);
+ #endif
+     if (oldp->w_localdir != NULL)
+       newp->w_localdir = vim_strsave(oldp->w_localdir);
  
- /* utility functions from libutil's shell.cc */
- static Boolean
-@@ -925,11 +930,11 @@ Boolean workshop_get_width_height(int *w
-               *height = hgt;
-       }
-       return success;
+-    /* Use the same argument list. */
+-    newp->w_alist = oldp->w_alist;
+-    ++newp->w_alist->al_refcount;
+-    newp->w_arg_idx = oldp->w_arg_idx;
+-
+-    /*
+-     * copy tagstack and options from existing window
+-     */
++    /* copy tagstack and folds */
+     for (i = 0; i < oldp->w_tagstacklen; i++)
+     {
+       newp->w_tagstack[i] = oldp->w_tagstack[i];
+       if (newp->w_tagstack[i].tagname != NULL)
+           newp->w_tagstack[i].tagname =
+                                  vim_strsave(newp->w_tagstack[i].tagname);
+     }
+     newp->w_tagstackidx = oldp->w_tagstackidx;
+     newp->w_tagstacklen = oldp->w_tagstacklen;
+-    win_copy_options(oldp, newp);
+ # ifdef FEAT_FOLDING
+     copyFoldingState(oldp, newp);
+ # endif
++
++    win_init_some(newp, oldp);
++}
++
++/*
++ * Initialize window "newp" from window"old".
++ * Only the essential things are copied.
++ */
++    static void
++win_init_some(newp, oldp)
++    win_T     *newp;
++    win_T     *oldp;
++{
++    /* Use the same argument list. */
++    newp->w_alist = oldp->w_alist;
++    ++newp->w_alist->al_refcount;
++    newp->w_arg_idx = oldp->w_arg_idx;
++
++    /* copy options from existing window */
++    win_copy_options(oldp, newp);
  }
  
--
-+#if 0
- Boolean workshop_get_rows_cols(int *rows, int *cols)
+ #endif /* FEAT_WINDOWS */
+ #if defined(FEAT_WINDOWS) || defined(PROTO)
+@@ -1256,15 +1280,14 @@ win_count()
+  * Make "count" windows on the screen.
+  * Return actual number of windows on the screen.
+  * Must be called when there is just one window, filling the whole screen
+  * (excluding the command line).
+  */
+-/*ARGSUSED*/
+     int
+ make_windows(count, vertical)
+     int               count;
+-    int               vertical;       /* split windows vertically if TRUE */
++    int               vertical UNUSED;  /* split windows vertically if TRUE */
  {
-       static int      r = 0;
-       static int      c = 0;
-       static Boolean  firstTime = True;
-@@ -956,10 +961,11 @@ Boolean workshop_get_rows_cols(int *rows
-               *rows = r;
-               *cols = c;
-       }
-       return success;
+     int               maxcount;
+     int               todo;
+ #ifdef FEAT_VERTSPLIT
+@@ -1555,19 +1578,12 @@ win_totop(size, flags)
+     }
+ #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
+     /* When 'guioptions' includes 'L' or 'R' may have to remove or add
+      * scrollbars.  Have to update them anyway. */
+-    if (gui.in_use)
+-    {
+-      out_flush();
+-      gui_init_which_components(NULL);
+-      gui_update_scrollbars(TRUE);
+-    }
+-    need_mouse_correct = TRUE;
++    gui_may_update_scrollbars();
+ #endif
+-
+ }
+ /*
+  * Move window "win1" to below/right of "win2" and make "win1" the current
+  * window.  Only works within the same frame!
+@@ -2038,17 +2054,44 @@ close_windows(buf, keep_curwin)
+     if (h != tabline_height())
+       shell_new_rows();
  }
+ /*
+- * Return TRUE if the current window is the only window that exists.
++ * Return TRUE if the current window is the only window that exists (ignoring
++ * "aucmd_win").
+  * Returns FALSE if there is a window, possibly in another tab page.
+  */
+     static int
+ last_window()
+ {
+-    return (lastwin == firstwin && first_tabpage->tp_next == NULL);
++    return (one_window() && first_tabpage->tp_next == NULL);
++}
++
++/*
++ * Return TRUE if there is only one window other than "aucmd_win" in the
++ * current tab page.
++ */
++    static int
++one_window()
++{
++#ifdef FEAT_AUTOCMD
++    win_T     *wp;
++    int               seen_one = FALSE;
++
++    FOR_ALL_WINDOWS(wp)
++    {
++      if (wp != aucmd_win)
++      {
++          if (seen_one)
++              return FALSE;
++          seen_one = TRUE;
++      }
++    }
++    return TRUE;
++#else
++    return firstwin == lastwin;
 +#endif
- /*
-  * Toolbar code
-  */
-@@ -1041,23 +1047,23 @@ void workshop_set_option_first(char *nam
-               workshop_set_option(name, value);
-       }
  }
  
--
-+#if 0
  /*
-  * Send information to eserve on certain editor events
-  * You must make sure these are called when necessary
-  */
--
- void workshop_file_closed(char *filename)
- {
-       char buffer[2*MAXPATHLEN];
-       vim_snprintf(buffer, sizeof(buffer),
-                       NOCATGETS("deletedFile %s\n"), filename);
-       write(sd, buffer, strlen(buffer));
- }
+  * Close window "win".  Only works for the current tab page.
+  * If "free_buf" is TRUE related buffer may be unloaded.
+@@ -2073,10 +2116,23 @@ win_close(win, free_buf)
+     {
+       EMSG(_("E444: Cannot close last window"));
+       return;
+     }
++#ifdef FEAT_AUTOCMD
++    if (win == aucmd_win)
++    {
++      EMSG(_("E813: Cannot close autocmd window"));
++      return;
++    }
++    if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window())
++    {
++      EMSG(_("E814: Cannot close window, only autocmd window would remain"));
++      return;
++    }
 +#endif
++
+     /*
+      * When closing the last window in a tab page first go to another tab
+      * page and then close the window and the tab page.  This avoids that
+      * curwin and curtab are not invalid while we are freeing memory, they may
+      * be used in GUI events.
+@@ -2102,11 +2158,11 @@ win_close(win, free_buf)
+     /* When closing the help window, try restoring a snapshot after closing
+      * the window.  Otherwise clear the snapshot, it's now invalid. */
+     if (win->w_buffer->b_help)
+       help_window = TRUE;
+     else
+-      clear_snapshot(curtab);
++      clear_snapshot(curtab, SNAP_HELP_IDX);
  
- void workshop_file_closed_lineno(char *filename, int lineno)
- {
-       char buffer[2*MAXPATHLEN];
-       vim_snprintf(buffer, sizeof(buffer),
-@@ -1084,25 +1090,27 @@ void workshop_file_saved(char *filename)
-       /* Let editor report any moved marks that the eserve client
-        * should deal with (for example, moving location-based breakpoints) */
-       workshop_moved_marks(filename);
- }
+ #ifdef FEAT_AUTOCMD
+     if (win == curwin)
+     {
+       /*
+@@ -2219,11 +2275,11 @@ win_close(win, free_buf)
+     last_status(FALSE);
  
--void workshop_move_mark(char *filename, int markId, int newLineno)
-+#if 0
-+void workshop_file_modified(char *filename)
- {
-       char buffer[2*MAXPATHLEN];
-       vim_snprintf(buffer, sizeof(buffer),
--                      NOCATGETS("moveMark %s %d %d\n"), filename, markId, newLineno);
-+                      NOCATGETS("modifiedFile %s\n"), filename);
-       write(sd, buffer, strlen(buffer));
- }
+     /* After closing the help window, try restoring the window layout from
+      * before it was opened. */
+     if (help_window)
+-      restore_snapshot(close_curwin);
++      restore_snapshot(SNAP_HELP_IDX, close_curwin);
  
--void workshop_file_modified(char *filename)
-+void workshop_move_mark(char *filename, int markId, int newLineno)
+ #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
+     /* When 'guioptions' includes 'L' or 'R' may have to remove scrollbars. */
+     if (gui.in_use && !win_hasvertsplit())
+       gui_init_which_components(NULL);
+@@ -2300,17 +2356,10 @@ win_free_mem(win, dirp, tp)
+     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
  {
-       char buffer[2*MAXPATHLEN];
-       vim_snprintf(buffer, sizeof(buffer),
--                      NOCATGETS("modifiedFile %s\n"), filename);
-+             NOCATGETS("moveMark %s %d %d\n"), filename, markId, newLineno);
-       write(sd, buffer, strlen(buffer));
- }
-+#endif
+     frame_T   *frp;
+     win_T     *wp;
  
- void workshop_frame_moved(int new_x, int new_y, int new_w, int new_h)
- {
-       char buffer[200];
+-#ifdef FEAT_FOLDING
+-    clearFolding(win);
+-#endif
+-
+-    /* reduce the reference count to the argument list. */
+-    alist_unlink(win->w_alist);
+-
+     /* Remove the window and its frame from the tree of frames. */
+     frp = win->w_frame;
+     wp = winframe_remove(win, dirp, tp);
+     vim_free(frp);
+     win_free(win, tp);
+@@ -2332,24 +2381,31 @@ win_free_all()
+ # ifdef FEAT_WINDOWS
+     while (first_tabpage->tp_next != NULL)
+       tabpage_close(TRUE);
+ # endif
  
-@@ -1177,14 +1185,16 @@ void workshop_perform_verb(char *verb, v
-               }
-       }
++# ifdef FEAT_AUTOCMD
++    if (aucmd_win != NULL)
++    {
++      (void)win_free_mem(aucmd_win, &dummy, NULL);
++      aucmd_win = NULL;
++    }
++# endif
++
+     while (firstwin != NULL)
+       (void)win_free_mem(firstwin, &dummy, NULL);
  }
+ #endif
  
- /* Send a message to eserve */
-+#if defined(NOHANDS_SUPPORT_FUNCTIONS) || defined(FEAT_BEVAL)
- void workshop_send_message(char *buf)
+ /*
+  * Remove a window and its frame from the tree of frames.
+  * Returns a pointer to the window that got the freed up space.
+  */
+-/*ARGSUSED*/
+-    static win_T *
++    win_T *
+ winframe_remove(win, dirp, tp)
+     win_T     *win;
+-    int               *dirp;          /* set to 'v' or 'h' for direction if 'ea' */
++    int               *dirp UNUSED;   /* set to 'v' or 'h' for direction if 'ea' */
+     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
  {
-       write(sd, buf, strlen(buf));
- }
-+#endif
+     frame_T   *frp, *frp2, *frp3;
+     frame_T   *frp_close = win->w_frame;
+     win_T     *wp;
+@@ -3081,11 +3137,11 @@ close_others(message, forceit)
+ {
+     win_T     *wp;
+     win_T     *nextwp;
+     int               r;
  
- /* Some methods, like currentFile, cursorPos, etc. are missing here.
-  * But it looks like these are used for NoHands testing only so we
-  * won't bother requiring editors to implement these
+-    if (lastwin == firstwin)
++    if (one_window())
+     {
+       if (message
+ #ifdef FEAT_AUTOCMD
+                   && !autocmd_busy
+ #endif
+@@ -3143,31 +3199,38 @@ close_others(message, forceit)
+  * Called when a new file is being edited.
   */
---- vim72.orig/runtime/tools/README.txt
-+++ vim72/runtime/tools/README.txt
-@@ -30,6 +30,8 @@ vim_vs_net.cmd: MS-Windows command file
-               later.
- xcmdsrv_client.c:  Example for a client program that communicates with a Vim
-                  server through the X-Windows interface.
-+unicode.vim   Vim script to generate tables for src/mbyte.c.
-+
- [xxd (and tee for OS/2) can be found in the src directory]
---- /dev/null
-+++ vim72/runtime/tools/unicode.vim
-@@ -0,0 +1,290 @@
-+" Script to extract tables from Unicode .txt files, to be used in src/mbyte.c.
-+" The format of the UnicodeData.txt file is explained here:
-+" http://www.unicode.org/Public/5.1.0/ucd/UCD.html
-+" For the other files see the header.
-+"
-+" Usage: Vim -S <this-file>
-+"
-+" Author: Bram Moolenaar
-+" Last Update: 2010 Jan 12
-+
-+" Parse lines of UnicodeData.txt.  Creates a list of lists in s:dataprops.
-+func! ParseDataToProps()
-+  let s:dataprops = []
-+  let lnum = 1
-+  while lnum <= line('$')
-+    let l = split(getline(lnum), '\s*;\s*', 1)
-+    if len(l) != 15
-+      echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 15'
-+      return
-+    endif
-+    call add(s:dataprops, l)
-+    let lnum += 1
-+  endwhile
-+endfunc
-+
-+" Parse lines of CaseFolding.txt.  Creates a list of lists in s:foldprops.
-+func! ParseFoldProps()
-+  let s:foldprops = []
-+  let lnum = 1
-+  while lnum <= line('$')
-+    let line = getline(lnum)
-+    if line !~ '^#' && line !~ '^\s*$'
-+      let l = split(line, '\s*;\s*', 1)
-+      if len(l) != 4
-+      echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 4'
-+      return
-+      endif
-+      call add(s:foldprops, l)
-+    endif
-+    let lnum += 1
-+  endwhile
-+endfunc
-+
-+" Parse lines of EastAsianWidth.txt.  Creates a list of lists in s:widthprops.
-+func! ParseWidthProps()
-+  let s:widthprops = []
-+  let lnum = 1
-+  while lnum <= line('$')
-+    let line = getline(lnum)
-+    if line !~ '^#' && line !~ '^\s*$'
-+      let l = split(line, '\s*;\s*', 1)
-+      if len(l) != 2
-+      echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 2'
-+      return
-+      endif
-+      call add(s:widthprops, l)
-+    endif
-+    let lnum += 1
-+  endwhile
-+endfunc
-+
-+" Build the toLower or toUpper table in a new buffer.
-+" Uses s:dataprops.
-+func! BuildCaseTable(name, index)
-+  let start = -1
-+  let end = -1
-+  let step = 0
-+  let add = -1
-+  let ranges = []
-+  for p in s:dataprops
-+    if p[a:index] != ''
-+      let n = ('0x' . p[0]) + 0
-+      let nl = ('0x' . p[a:index]) + 0
-+      if start >= 0 && add == nl - n && (step == 0 || n - end == step)
-+      " continue with same range.
-+      let step = n - end
-+      let end = n
-+      else
-+      if start >= 0
-+        " produce previous range
-+        call Range(ranges, start, end, step, add)
-+      endif
-+      let start = n
-+      let end = n
-+      let step = 0
-+      let add = nl - n
-+      endif
-+    endif
-+  endfor
-+  if start >= 0
-+    call Range(ranges, start, end, step, add)
-+  endif
-+
-+  " New buffer to put the result in.
-+  new
-+  exe "file to" . a:name
-+  call setline(1, "static convertStruct to" . a:name . "[] =")
-+  call setline(2, "{")
-+  call append('$', ranges)
-+  call setline('$', getline('$')[:-2])  " remove last comma
-+  call setline(line('$') + 1, "};")
-+  wincmd p
-+endfunc
-+
-+" Build the foldCase table in a new buffer.
-+" Uses s:foldprops.
-+func! BuildFoldTable()
-+  let start = -1
-+  let end = -1
-+  let step = 0
-+  let add = -1
-+  let ranges = []
-+  for p in s:foldprops
-+    if p[1] == 'C' || p[1] == 'S'
-+      let n = ('0x' . p[0]) + 0
-+      let nl = ('0x' . p[2]) + 0
-+      if start >= 0 && add == nl - n && (step == 0 || n - end == step)
-+      " continue with same range.
-+      let step = n - end
-+      let end = n
-+      else
-+      if start >= 0
-+        " produce previous range
-+        call Range(ranges, start, end, step, add)
-+      endif
-+      let start = n
-+      let end = n
-+      let step = 0
-+      let add = nl - n
-+      endif
-+    endif
-+  endfor
-+  if start >= 0
-+    call Range(ranges, start, end, step, add)
-+  endif
-+
-+  " New buffer to put the result in.
-+  new
-+  file foldCase
-+  call setline(1, "static convertStruct foldCase[] =")
-+  call setline(2, "{")
-+  call append('$', ranges)
-+  call setline('$', getline('$')[:-2])  " remove last comma
-+  call setline(line('$') + 1, "};")
-+  wincmd p
-+endfunc
-+
-+func! Range(ranges, start, end, step, add)
-+  let s = printf("\t{0x%x,0x%x,%d,%d},", a:start, a:end, a:step == 0 ? -1 : a:step, a:add)
-+  call add(a:ranges, s)
-+endfunc
-+
-+" Build the combining table.
-+" Uses s:dataprops.
-+func! BuildCombiningTable()
-+  let start = -1
-+  let end = -1
-+  let ranges = []
-+  for p in s:dataprops
-+    if p[2] == 'Mn' || p[2] == 'Mc' || p[2] == 'Me'
-+      let n = ('0x' . p[0]) + 0
-+      if start >= 0 && end + 1 == n
-+      " continue with same range.
-+      let end = n
-+      else
-+      if start >= 0
-+        " produce previous range
-+        call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
-+      endif
-+      let start = n
-+      let end = n
-+      endif
-+    endif
-+  endfor
-+  if start >= 0
-+    call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
-+  endif
-+
-+  " New buffer to put the result in.
-+  new
-+  file combining
-+  call setline(1, "    static struct interval combining[] =")
-+  call setline(2, "    {")
-+  call append('$', ranges)
-+  call setline('$', getline('$')[:-2])  " remove last comma
-+  call setline(line('$') + 1, "    };")
-+  wincmd p
-+endfunc
-+
-+" Build the double width or ambiguous width table in a new buffer.
-+" Uses s:widthprops and s:dataprops.
-+func! BuildWidthTable(pattern, tableName)
-+  let start = -1
-+  let end = -1
-+  let ranges = []
-+  let dataidx = 0
-+  for p in s:widthprops
-+    if p[1][0] =~ a:pattern
-+      if p[0] =~ '\.\.'
-+      " It is a range.  we don't check for composing char then.
-+      let rng = split(p[0], '\.\.')
-+      if len(rng) != 2
-+        echoerr "Cannot parse range: '" . p[0] . "' in width table"
-+      endif
-+      let n = ('0x' . rng[0]) + 0
-+      let n_last =  ('0x' . rng[1]) + 0
-+      else
-+      let n = ('0x' . p[0]) + 0
-+      let n_last = n
-+      endif
-+      " Find this char in the data table.
-+      while 1
-+      let dn = ('0x' . s:dataprops[dataidx][0]) + 0
-+      if dn >= n
-+        break
-+      endif
-+      let dataidx += 1
-+      endwhile
-+      if dn != n && n_last == n
-+      echoerr "Cannot find character " . n . " in data table"
-+      endif
-+      " Only use the char when it's not a composing char.
-+      " But use all chars from a range.
-+      let dp = s:dataprops[dataidx]
-+      if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me')
-+      if start >= 0 && end + 1 == n
-+        " continue with same range.
-+      else
-+        if start >= 0
-+          " produce previous range
-+          call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
-+        endif
-+        let start = n
-+      endif
-+      let end = n_last
-+      endif
-+    endif
-+  endfor
-+  if start >= 0
-+    call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
-+  endif
-+
-+  " New buffer to put the result in.
-+  new
-+  exe "file " . a:tableName
-+  call setline(1, "    static struct interval " . a:tableName . "[] =")
-+  call setline(2, "    {")
-+  call append('$', ranges)
-+  call setline('$', getline('$')[:-2])  " remove last comma
-+  call setline(line('$') + 1, "    };")
-+  wincmd p
-+endfunc
-+
-+
-+
-+" Edit the Unicode text file.  Requires the netrw plugin.
-+edit http://unicode.org/Public/UNIDATA/UnicodeData.txt
-+
-+" Parse each line, create a list of lists.
-+call ParseDataToProps()
-+
-+" Build the toLower table.
-+call BuildCaseTable("Lower", 13)
-+
-+" Build the toUpper table.
-+call BuildCaseTable("Upper", 12)
-+
-+" Build the ranges of composing chars.
-+call BuildCombiningTable()
-+
-+" Edit the case folding text file.  Requires the netrw plugin.
-+edit http://www.unicode.org/Public/UNIDATA/CaseFolding.txt
+     void
+ curwin_init()
+ {
+-    redraw_win_later(curwin, NOT_VALID);
+-    curwin->w_lines_valid = 0;
+-    curwin->w_cursor.lnum = 1;
+-    curwin->w_curswant = curwin->w_cursor.col = 0;
++    win_init_empty(curwin);
++}
 +
-+" Parse each line, create a list of lists.
-+call ParseFoldProps()
++    void
++win_init_empty(wp)
++    win_T *wp;
++{
++    redraw_win_later(wp, NOT_VALID);
++    wp->w_lines_valid = 0;
++    wp->w_cursor.lnum = 1;
++    wp->w_curswant = wp->w_cursor.col = 0;
+ #ifdef FEAT_VIRTUALEDIT
+-    curwin->w_cursor.coladd = 0;
++    wp->w_cursor.coladd = 0;
+ #endif
+-    curwin->w_pcmark.lnum = 1;        /* pcmark not cleared but set to line 1 */
+-    curwin->w_pcmark.col = 0;
+-    curwin->w_prev_pcmark.lnum = 0;
+-    curwin->w_prev_pcmark.col = 0;
+-    curwin->w_topline = 1;
++    wp->w_pcmark.lnum = 1;    /* pcmark not cleared but set to line 1 */
++    wp->w_pcmark.col = 0;
++    wp->w_prev_pcmark.lnum = 0;
++    wp->w_prev_pcmark.col = 0;
++    wp->w_topline = 1;
+ #ifdef FEAT_DIFF
+-    curwin->w_topfill = 0;
++    wp->w_topfill = 0;
+ #endif
+-    curwin->w_botline = 2;
++    wp->w_botline = 2;
+ #ifdef FEAT_FKMAP
+-    if (curwin->w_p_rl)
+-      curwin->w_farsi = W_CONV + W_R_L;
++    if (wp->w_p_rl)
++      wp->w_farsi = W_CONV + W_R_L;
+     else
+-      curwin->w_farsi = W_CONV;
++      wp->w_farsi = W_CONV;
+ #endif
+ }
+ /*
+  * Allocate the first window and put an empty buffer in it.
+@@ -3185,13 +3248,34 @@ win_alloc_first()
+     if (first_tabpage == NULL)
+       return FAIL;
+     first_tabpage->tp_topframe = topframe;
+     curtab = first_tabpage;
+ #endif
 +
-+" Build the foldCase table.
-+call BuildFoldTable()
+     return OK;
+ }
++#if defined(FEAT_AUTOCMD) || defined(PROTO)
++/*
++ * Init "aucmd_win".  This can only be done after the first
++ * window is fully initialized, thus it can't be in win_alloc_first().
++ */
++    void
++win_alloc_aucmd_win()
++{
++    aucmd_win = win_alloc(NULL, TRUE);
++    if (aucmd_win != NULL)
++    {
++      win_init_some(aucmd_win, curwin);
++# ifdef FEAT_SCROLLBIND
++      aucmd_win->w_p_scb = FALSE;
++# endif
++      new_frame(aucmd_win);
++    }
++}
++#endif
 +
-+" Edit the width text file.  Requires the netrw plugin.
-+edit http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
+ /*
+  * Allocate the first window or the first window in a new tab page.
+  * When "oldwin" is NULL create an empty buffer for it.
+  * When "oldwin" is not NULL copy info from it to the new window (only with
+  * FEAT_WINDOWS).
+@@ -3199,11 +3283,11 @@ win_alloc_first()
+  */
+     static int
+ win_alloc_firstwin(oldwin)
+     win_T     *oldwin;
+ {
+-    curwin = win_alloc(NULL);
++    curwin = win_alloc(NULL, FALSE);
+     if (oldwin == NULL)
+     {
+       /* Very first window, need to create an empty buffer for it and
+        * initialize from scratch. */
+       curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
+@@ -3218,34 +3302,49 @@ win_alloc_firstwin(oldwin)
+     }
+ #ifdef FEAT_WINDOWS
+     else
+     {
+       /* First window in new tab page, initialize it from "oldwin". */
+-      win_init(curwin, oldwin);
++      win_init(curwin, oldwin, 0);
+ # ifdef FEAT_SCROLLBIND
+       /* We don't want scroll-binding in the first window. */
+       curwin->w_p_scb = FALSE;
+ # endif
+     }
+ #endif
+-    topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
+-    if (topframe == NULL)
++    new_frame(curwin);
++    if (curwin->w_frame == NULL)
+       return FAIL;
+-    topframe->fr_layout = FR_LEAF;
++    topframe = curwin->w_frame;
+ #ifdef FEAT_VERTSPLIT
+     topframe->fr_width = Columns;
+ #endif
+     topframe->fr_height = Rows - p_ch;
+     topframe->fr_win = curwin;
+-    curwin->w_frame = topframe;
+     return OK;
+ }
+ /*
++ * Create a frame for window "wp".
++ */
++    static void
++new_frame(win_T *wp)
++{
++    frame_T *frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
 +
-+" Parse each line, create a list of lists.
-+call ParseWidthProps()
++    wp->w_frame = frp;
++    if (frp != NULL)
++    {
++      frp->fr_layout = FR_LEAF;
++      frp->fr_win = wp;
++    }
++}
 +
-+" Build the double width table.
-+call BuildWidthTable('[WF]', 'doublewidth')
++/*
+  * Initialize the window and frame size to the maximum.
+  */
+     void
+ win_init_size()
+ {
+@@ -3291,14 +3390,17 @@ alloc_tabpage()
+     void
+ free_tabpage(tp)
+     tabpage_T *tp;
+ {
++    int idx;
 +
-+" Build the ambiguous width table.
-+call BuildWidthTable('A', 'ambiguous')
---- vim72.orig/runtime/doc/usr_41.txt
-+++ vim72/runtime/doc/usr_41.txt
-@@ -866,10 +866,12 @@ Various:
-       setreg()                set contents and type of a register
+ # ifdef FEAT_DIFF
+     diff_clear(tp);
+ # endif
+-    clear_snapshot(tp);
++    for (idx = 0; idx < SNAP_COUNT; ++idx)
++      clear_snapshot(tp, idx);
+ #ifdef FEAT_EVAL
+     vars_clear(&tp->tp_vars.dv_hashtab);      /* free all t: variables */
+ #endif
+     vim_free(tp);
+ }
+@@ -3361,16 +3463,11 @@ win_new_tabpage(after)
+       last_status(FALSE);
  
-       taglist()               get list of matching tags
-       tagfiles()              get a list of tags files
+ #if defined(FEAT_GUI)
+       /* When 'guioptions' includes 'L' or 'R' may have to remove or add
+        * scrollbars.  Have to update them anyway. */
+-      if (gui.in_use && starting == 0)
+-      {
+-          gui_init_which_components(NULL);
+-          gui_update_scrollbars(TRUE);
+-      }
+-      need_mouse_correct = TRUE;
++      gui_may_update_scrollbars();
+ #endif
  
-+      mzeval()                evaluate |MzScheme| expression
-+
- ==============================================================================
- *41.7*        Defining a function
+       redraw_all_later(CLEAR);
+ #ifdef FEAT_AUTOCMD
+       apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
+@@ -3488,14 +3585,13 @@ tabpage_index(ftp)
+  * Prepare for leaving the current tab page.
+  * When autocomands change "curtab" we don't leave the tab page and return
+  * FAIL.
+  * Careful: When OK is returned need to get a new tab page very very soon!
+  */
+-/*ARGSUSED*/
+     static int
+ leave_tabpage(new_curbuf)
+-    buf_T     *new_curbuf;        /* what is going to be the new curbuf,
++    buf_T     *new_curbuf UNUSED;    /* what is going to be the new curbuf,
+                                      NULL if unknown */
+ {
+     tabpage_T *tp = curtab;
  
- Vim enables you to define your own functions.  The basic function declaration
- begins as follows: >
---- vim72.orig/src/testdir/main.aap
-+++ vim72/src/testdir/main.aap
-@@ -30,15 +30,15 @@ gui:       newlog $Scripts $ScriptsGUI
-       :print ALL DONE
+ #ifdef FEAT_VISUAL
+@@ -3533,15 +3629,14 @@ leave_tabpage(new_curbuf)
  
- $Scripts $ScriptsGUI: $VimProg
+ /*
+  * Start using tab page "tp".
+  * Only to be used after leave_tabpage() or freeing the current tab page.
+  */
+-/*ARGSUSED*/
+     static void
+ enter_tabpage(tp, old_curbuf)
+     tabpage_T *tp;
+-    buf_T     *old_curbuf;
++    buf_T     *old_curbuf UNUSED;
+ {
+     int               old_off = tp->tp_firstwin->w_winrow;
+     win_T     *next_prevwin = tp->tp_prevwin;
  
- clean:
--      :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim test.ok X*
-+      :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X*
+     curtab = tp;
+@@ -3586,16 +3681,11 @@ enter_tabpage(tp, old_curbuf)
+ #endif
  
- # test1 is special, it checks for features
- test1.out: test1.in
--      :del {force} test1.failed tiny.vim small.vim mbyte.vim
-+      :del {force} test1.failed tiny.vim small.vim mbyte.vim mzscheme.vim
-       :sys {i} $VimProg -u unix.vim -U NONE --noplugin -s dotest.in test1.in
-       @if os.system("diff test.out test1.ok") != 0:
-               :error test1 FAILED - Something basic is wrong
-       :move {force} test.out test1.out
-       :del {r}{force} X*
---- vim72.orig/src/testdir/test1.in
-+++ vim72/src/testdir/test1.in
-@@ -11,10 +11,11 @@ If Vim was not compiled with the +window
- set like small.vim above.  tiny.vim is sourced by tests that require the
- +windows feature or other features that are missing in the tiny version.
+ #if defined(FEAT_GUI)
+     /* When 'guioptions' includes 'L' or 'R' may have to remove or add
+      * scrollbars.  Have to update them anyway. */
+-    if (gui.in_use && starting == 0)
+-    {
+-      gui_init_which_components(NULL);
+-      gui_update_scrollbars(TRUE);
+-    }
+-    need_mouse_correct = TRUE;
++    gui_may_update_scrollbars();
+ #endif
  
- If Vim was not compiled with the +multi_byte feature, the mbyte.vim script will be set like small.vim above.  mbyte.vim is sourced by tests that require the
- +multi_byte feature.
-+Similar logic is applied to the +mzscheme feature, using mzscheme.vim.
+     redraw_all_later(CLEAR);
+ }
  
- STARTTEST
- :" Write a single line to test.out to check if testing works at all.
- :%d
- athis is a test\e:w! test.out
-@@ -23,12 +24,15 @@ athis is a test\e:w! test.out
- :w! tiny.vim
- ae! test.ok
- w! test.out
- qa!
\e:w! mbyte.vim
-+:w! mzscheme.vim
- :" If +multi_byte feature supported, make mbyte.vim empty.
- :if has("multi_byte") | sp another | w! mbyte.vim | q | endif
-+:" If +mzscheme feature supported, make mzscheme.vim empty.
-+:if has("mzscheme") | sp another | w! mzscheme.vim | q | endif
- :" If +eval feature supported quit here, leaving tiny.vim and small.vim empty.
- :" Otherwise write small.vim to skip the test.
- :if 1 | q! | endif
- :w! small.vim
- :" If +windows feature not supported :sp will fail and tiny.vim will be
---- /dev/null
-+++ vim72/src/testdir/test70.in
-@@ -0,0 +1,53 @@
-+Smoke test for MzScheme interface and mzeval() function
+@@ -4026,18 +4116,18 @@ win_enter_ext(wp, undo_sync, curwin_inva
+           char_u      cwd[MAXPATHL];
+           if (mch_dirname(cwd, MAXPATHL) == OK)
+               globaldir = vim_strsave(cwd);
+       }
+-      mch_chdir((char *)curwin->w_localdir);
+-      shorten_fnames(TRUE);
++      if (mch_chdir((char *)curwin->w_localdir) == 0)
++          shorten_fnames(TRUE);
+     }
+     else if (globaldir != NULL)
+     {
+       /* Window doesn't have a local directory and we are not in the global
+        * directory: Change to the global directory. */
+-      mch_chdir((char *)globaldir);
++      ignored = mch_chdir((char *)globaldir);
+       vim_free(globaldir);
+       globaldir = NULL;
+       shorten_fnames(TRUE);
+     }
+@@ -4143,16 +4233,17 @@ buf_jump_open_tab(buf)
+ # endif
+ }
+ #endif
+ /*
+- * allocate a window structure and link it in the window list
++ * Allocate a window structure and link it in the window list when "hidden" is
++ * FALSE.
+  */
+-/*ARGSUSED*/
+     static win_T *
+-win_alloc(after)
+-    win_T     *after;
++win_alloc(after, hidden)
++    win_T     *after UNUSED;
++    int               hidden UNUSED;
+ {
+     win_T     *newwin;
+     /*
+      * allocate window structure and linesizes arrays
+@@ -4174,11 +4265,12 @@ win_alloc(after)
+ #endif
+       /*
+        * link the window in the window list
+        */
+ #ifdef FEAT_WINDOWS
+-      win_append(after, newwin);
++      if (!hidden)
++          win_append(after, newwin);
+ #endif
+ #ifdef FEAT_VERTSPLIT
+       newwin->w_wincol = 0;
+       newwin->w_width = Columns;
+ #endif
+@@ -4235,10 +4327,17 @@ win_free(wp, tp)
+     win_T     *wp;
+     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
+ {
+     int               i;
++#ifdef FEAT_FOLDING
++    clearFolding(wp);
++#endif
 +
-+STARTTEST
-+:so mzscheme.vim
-+:set nocompatible viminfo+=nviminfo
-+:function! MzRequire()
-+:redir => l:mzversion
-+:mz (version)
-+:redir END
-+:if strpart(l:mzversion, 1, 1) < "4"
-+:" MzScheme versions < 4.x:
-+:mz (require (prefix vim- vimext))
-+:else
-+:" newer versions:
-+:mz (require (prefix-in vim- 'vimext))
-+:mz (require r5rs)
-+:endif
-+:endfunction
-+:silent call MzRequire()
-+:mz (define l '("item0" "dictionary with list OK" "item2"))
-+:mz (define h (make-hash))
-+:mz (hash-set! h "list" l)
-+/^1
-+:" change buffer contents
-+:mz (vim-set-buff-line (vim-eval "line('.')") "1 changed line 1")
-+:" scalar test
-+:let tmp_string = mzeval('"string"')
-+:let tmp_1000 = mzeval('1000')
-+:if tmp_string . tmp_1000 == "string1000"
-+:let scalar_res = "OK"
-+:else
-+:let scalar_res = "FAILED"
-+:endif
-+:call append(search("^1"), "scalar test " . scalar_res)
-+:" dictionary containing a list
-+:let tmp = mzeval("h")["list"][1]
-+:/^2/put =tmp
-+:" circular list (at the same time test lists containing lists)
-+:mz (set-car! (cddr l) l)
-+:let l2 = mzeval("h")["list"]
-+:if l2[2] == l2
-+:let res = "OK"
-+:else
-+:let res = "FAILED"
-+:endif
-+:call setline(search("^3"), "circular test " . res)
-+:?^1?,$w! test.out
-+:qa!
-+ENDTEST
++    /* reduce the reference count to the argument list. */
++    alist_unlink(wp->w_alist);
 +
-+1 line 1
-+2 line 2
-+3 line 3
---- /dev/null
-+++ vim72/src/testdir/test70.ok
-@@ -0,0 +1,5 @@
-+1 changed line 1
-+scalar test OK
-+2 line 2
-+dictionary with list OK
-+circular test OK
---- vim72.orig/src/proto/ex_cmds2.pro
-+++ vim72/src/proto/ex_cmds2.pro
-@@ -22,10 +22,12 @@ void profile_self __ARGS((proftime_T *se
- void profile_get_wait __ARGS((proftime_T *tm));
- void profile_sub_wait __ARGS((proftime_T *tm, proftime_T *tma));
- int profile_equal __ARGS((proftime_T *tm1, proftime_T *tm2));
- int profile_cmp __ARGS((proftime_T *tm1, proftime_T *tm2));
- void ex_profile __ARGS((exarg_T *eap));
-+char_u *get_profile_name __ARGS((expand_T *xp, int idx));
-+void set_context_in_profile_cmd __ARGS((expand_T *xp, char_u *arg));
- void profile_dump __ARGS((void));
- void script_prof_save __ARGS((proftime_T *tm));
- void script_prof_restore __ARGS((proftime_T *tm));
- void prof_inchar_enter __ARGS((void));
- void prof_inchar_exit __ARGS((void));
---- vim72.orig/src/GvimExt/gvimext.h
-+++ vim72/src/GvimExt/gvimext.h
-@@ -12,13 +12,13 @@
+ #ifdef FEAT_AUTOCMD
+     /* Don't execute autocommands while the window is halfway being deleted.
+      * gui_mch_destroy_scrollbar() may trigger a FocusGained event. */
+     block_autocmds();
+ #endif
+@@ -4297,22 +4396,25 @@ win_free(wp, tp)
+       gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_LEFT]);
+       gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_RIGHT]);
+     }
+ #endif /* FEAT_GUI */
+-    win_remove(wp, tp);
++#ifdef FEAT_AUTOCMD
++    if (wp != aucmd_win)
++#endif
++      win_remove(wp, tp);
+     vim_free(wp);
+ #ifdef FEAT_AUTOCMD
+     unblock_autocmds();
+ #endif
+ }
+ /*
+  * Append window "wp" in the window list after window "after".
   */
+-    static void
++    void
+ win_append(after, wp)
+     win_T     *after, *wp;
+ {
+     win_T     *before;
  
- #if !defined(AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_)
- #define AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_
+@@ -4334,11 +4436,11 @@ win_append(after, wp)
+ }
  
--#if _MSC_VER > 1000
-+#if defined(_MSC_VER) && _MSC_VER > 1000
- #pragma once
--#endif // _MSC_VER > 1000
-+#endif
+ /*
+  * Remove a window from the window list.
+  */
+-    static void
++    void
+ win_remove(wp, tp)
+     win_T     *wp;
+     tabpage_T *tp;            /* tab page "win" is in, NULL for current */
+ {
+     if (wp->w_prev != NULL)
+@@ -6034,10 +6136,11 @@ min_rows()
+ }
+ /*
+  * Return TRUE if there is only one window (in the current tab page), not
+  * counting a help or preview window, unless it is the current window.
++ * Does not count "aucmd_win".
+  */
+     int
+ only_one_window()
+ {
+ #ifdef FEAT_WINDOWS
+@@ -6047,15 +6150,19 @@ only_one_window()
+     /* If there is another tab page there always is another window. */
+     if (first_tabpage->tp_next != NULL)
+       return FALSE;
+     for (wp = firstwin; wp != NULL; wp = wp->w_next)
+-      if (!((wp->w_buffer->b_help && !curbuf->b_help)
++      if ((!((wp->w_buffer->b_help && !curbuf->b_help)
+ # ifdef FEAT_QUICKFIX
+                   || wp->w_p_pvw
+ # endif
+            ) || wp == curwin)
++# ifdef FEAT_AUTOCMD
++              && wp != aucmd_win
++# endif
++         )
+           ++count;
+     return (count <= 1);
+ #else
+     return TRUE;
+ #endif
+@@ -6106,15 +6213,16 @@ check_lnums(do_curwin)
+  */
+ /*
+  * Create a snapshot of the current frame sizes.
+  */
+-    static void
+-make_snapshot()
++    void
++make_snapshot(idx)
++    int idx;
+ {
+-    clear_snapshot(curtab);
+-    make_snapshot_rec(topframe, &curtab->tp_snapshot);
++    clear_snapshot(curtab, idx);
++    make_snapshot_rec(topframe, &curtab->tp_snapshot[idx]);
+ }
+     static void
+ make_snapshot_rec(fr, frp)
+     frame_T   *fr;
+@@ -6138,15 +6246,16 @@ make_snapshot_rec(fr, frp)
+ /*
+  * Remove any existing snapshot.
+  */
+     static void
+-clear_snapshot(tp)
++clear_snapshot(tp, idx)
+     tabpage_T *tp;
++    int               idx;
+ {
+-    clear_snapshot_rec(tp->tp_snapshot);
+-    tp->tp_snapshot = NULL;
++    clear_snapshot_rec(tp->tp_snapshot[idx]);
++    tp->tp_snapshot[idx] = NULL;
+ }
+     static void
+ clear_snapshot_rec(fr)
+     frame_T   *fr;
+@@ -6162,30 +6271,31 @@ clear_snapshot_rec(fr)
+ /*
+  * Restore a previously created snapshot, if there is any.
+  * This is only done if the screen size didn't change and the window layout is
+  * still the same.
+  */
+-    static void
+-restore_snapshot(close_curwin)
++    void
++restore_snapshot(idx, close_curwin)
++    int               idx;
+     int               close_curwin;       /* closing current window */
+ {
+     win_T     *wp;
  
- // Insert your headers here
- // #define WIN32_LEAN_AND_MEAN                // Exclude rarely-used stuff from Windows headers
+-    if (curtab->tp_snapshot != NULL
++    if (curtab->tp_snapshot[idx] != NULL
+ # ifdef FEAT_VERTSPLIT
+-          && curtab->tp_snapshot->fr_width == topframe->fr_width
++          && curtab->tp_snapshot[idx]->fr_width == topframe->fr_width
+ # endif
+-          && curtab->tp_snapshot->fr_height == topframe->fr_height
+-          && check_snapshot_rec(curtab->tp_snapshot, topframe) == OK)
++          && curtab->tp_snapshot[idx]->fr_height == topframe->fr_height
++          && check_snapshot_rec(curtab->tp_snapshot[idx], topframe) == OK)
+     {
+-      wp = restore_snapshot_rec(curtab->tp_snapshot, topframe);
++      wp = restore_snapshot_rec(curtab->tp_snapshot[idx], topframe);
+       win_comp_pos();
+       if (wp != NULL && close_curwin)
+           win_goto(wp);
+       redraw_all_later(CLEAR);
+     }
+-    clear_snapshot(curtab);
++    clear_snapshot(curtab, idx);
+ }
  
- //--------------------------------------------------------------
-@@ -32,21 +32,21 @@
+ /*
+  * Check if frames "sn" and "fr" have the same layout, same following frames
+  * and same children.
+--- vim72.orig/src/workshop.c
++++ vim72/src/workshop.c
+@@ -54,16 +54,16 @@ static void         load_buffer_by_name(char *,
+ static void    load_buffer_by_number(int, int);
  #endif
+ static void    load_window(char *, int lnum);
+ static void    warp_to_pc(int);
+ #ifdef FEAT_BEVAL
+-void          workshop_beval_cb(BalloonEval *, int);
++void           workshop_beval_cb(BalloonEval *, int);
++static int     computeIndex(int, char_u *, int);
+ #endif
+ static char   *fixAccelText(char *);
+ static void    addMenu(char *, char *, char *);
+ static char   *lookupVerb(char *, int);
+-static int     computeIndex(int, char_u *, int);
+ static void    coloncmd(char *, Boolean);
  
- #define INC_OLE2      // WIN32, get ole2 from windows.h
- /* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */
--#if _MSC_VER >= 1400
-+#if defined(_MSC_VER) && _MSC_VER >= 1400
- # define _CRT_SECURE_NO_DEPRECATE
- # define _CRT_NONSTDC_NO_DEPRECATE
+ extern Widget  vimShell;
+ extern Widget  textArea;
+ extern XtAppContext app_context;
+@@ -202,16 +202,15 @@ workshop_get_editor_version()
+  *    workshop_load_file
+  *
+  * Function:
+  *    Load a given file into the WorkShop buffer.
+  */
+-/*ARGSUSED*/
+     void
+ workshop_load_file(
+       char    *filename,              /* the file to load */
+       int      line,                  /* an optional line number (or 0) */
+-      char    *frameid)               /* used for multi-frame support */
++      char    *frameid UNUSED)        /* used for multi-frame support */
+ {
+ #ifdef WSDEBUG_TRACE
+     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+       wstrace("workshop_load_file(%s, %d)\n", filename, line);
+ #endif
+@@ -261,14 +260,13 @@ workshop_goto_line(
  #endif
  
- #include <windows.h>
- #include <windowsx.h>
- #include <shlobj.h>
+     load_window(filename, lineno);
+ }
  
- /* Accommodate old versions of VC that don't have a modern Platform SDK */
--#if _MSC_VER < 1300
-+#if defined(_MSC_VER) && _MSC_VER < 1300
- # undef  UINT_PTR
- # define UINT_PTR UINT
+-/*ARGSUSED*/
+     void
+ workshop_front_file(
+-      char    *filename)
++      char    *filename UNUSED)
+ {
+ #ifdef WSDEBUG_TRACE
+     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+       wstrace("workshop_front_file()\n");
  #endif
- #define ResultFromShort(i)  ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(i)))
---- vim72.orig/src/osdef1.h.in
-+++ vim72/src/osdef1.h.in
-@@ -23,11 +23,11 @@ extern int fclose __ARGS((FILE *));
- extern int    fseek __ARGS((FILE *, long, int));
- #ifdef HAVE_FSEEKO
- extern int    fseeko __ARGS((FILE *, off_t, int));
+@@ -536,13 +534,12 @@ workshop_adjust_marks(Widget *window, in
+  * Are there any moved marks? If so, call workshop_move_mark on
+  * each of them now. This is how eserve can find out if for example
+  * breakpoints have moved when a program has been recompiled and
+  * reloaded into dbx.
+  */
+-/*ARGSUSED*/
+     void
+-workshop_moved_marks(char *filename)
++workshop_moved_marks(char *filename UNUSED)
+ {
+ #ifdef WSDEBUG_TRACE
+     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+       wstrace("XXXworkshop_moved_marks(%s)\n", filename);
  #endif
- extern long   ftell __ARGS((FILE *));
--#ifdef HAVE_FTELLO
-+#ifdef HAVE_FSEEKO
- extern off_t  ftello __ARGS((FILE *));
+@@ -573,15 +570,14 @@ workshop_get_font_height()
+     }
+     return (int)h;
+ }
+-/*ARGSUSED*/
+     void
+ workshop_footer_message(
+-      char            *message,
+-      int              severity)      /* severity is currently unused */
++      char    *message,
++      int     severity UNUSED)        /* severity is currently unused */
+ {
+ #ifdef WSDEBUG_TRACE
+     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
+       wstrace("workshop_footer_message(%s, %d)\n", message, severity);
  #endif
- extern void   rewind __ARGS((FILE *));
- extern int    fread __ARGS((char *, int, int, FILE *));
- extern int    fwrite __ARGS((char *, int, int, FILE *));
---- vim72.orig/src/GvimExt/Make_ming.mak
-+++ vim72/src/GvimExt/Make_ming.mak
-@@ -18,28 +18,24 @@ CROSS = no
- MINGWOLD = no
+@@ -685,19 +681,18 @@ workshop_submenu_end()
+ /*
+  * This is where menus are really made. Each item will generate an amenu vim
+  * command. The globals curMenuName and curMenuPriority contain the name and
+  * priority of the parent menu tree.
+  */
+-/*ARGSUSED*/
+     void
+ workshop_menu_item(
+       char            *label,
+       char            *verb,
+-      char            *accelerator,
++      char            *accelerator UNUSED,
+       char            *acceleratorText,
+-      char            *name,
+-      char            *filepos,
++      char            *name UNUSED,
++      char            *filepos UNUSED,
+       char            *sensitive)
+ {
+     char               cbuf[BUFSIZ];
+     char               namebuf[BUFSIZ];
+     char               accText[BUFSIZ];
+@@ -808,17 +803,16 @@ workshop_toolbar_end()
+       set_option_value((char_u *)"go", 0L, buf, 0);
+     }
+     workshopInitDone = True;
+ }
  
- ifeq ($(CROSS),yes)
- DEL = rm
- ifeq ($(MINGWOLD),yes)
--CXX = i586-mingw32msvc-g++
- CXXFLAGS := -O2 -mno-cygwin -fvtable-thunks
--WINDRES = i586-mingw32msvc-windres
- else
--CXX = i386-mingw32msvc-g++
- CXXFLAGS := -O2 -mno-cygwin
--WINDRES = i386-mingw32msvc-windres
- endif
- else
--CXX := g++
--WINDRES := windres
- CXXFLAGS := -O2 -mno-cygwin
- ifneq (sh.exe, $(SHELL))
- DEL = rm
- else
- DEL = del
- endif
- endif
-+CXX := $(CROSS_COMPILE)g++
-+WINDRES := $(CROSS_COMPILE)windres
- LIBS :=  -luuid
- RES  := gvimext.res
- DEFFILE = gvimext_ming.def
- OBJ  := gvimext.o
+-/*ARGSUSED*/
+     void
+ workshop_toolbar_button(
+       char    *label,
+       char    *verb,
+-      char    *senseVerb,
+-      char    *filepos,
++      char    *senseVerb UNUSED,
++      char    *filepos UNUSED,
+       char    *help,
+       char    *sense,
+       char    *file,
+       char    *left)
+ {
+@@ -966,11 +960,13 @@ workshop_set_option(
+     {
+       case 's':
+           if (strcmp(option, "syntax") == 0)
+               vim_snprintf(cbuf, sizeof(cbuf), "syntax %s", value);
+           else if (strcmp(option, "savefiles") == 0)
+-              ; /* XXX - Not yet implemented */
++          {
++              /* XXX - Not yet implemented */
++          }
+           break;
  
---- vim72.orig/src/INSTALLpc.txt
-+++ vim72/src/INSTALLpc.txt
-@@ -213,12 +213,13 @@ and you type:
- After churning for a while, you will end up with 'gvim.exe' in the 'vim\src'
- directory.
+       case 'l':
+           if (strcmp(option, "lineno") == 0)
+               sprintf(cbuf, "set %snu",
+@@ -1096,14 +1092,13 @@ workshop_hotkeys(
+ }
  
- You should not need to do *any* editing of any files to get vim compiled this
- way.  If, for some reason, you want the console-mode-only version of vim (this
--is NOT recommended on Win32, especially on '95/'98!!!), you need only change
--the 'gvim.exe' to 'vim.exe' in the 'make' commands given above.
-+is NOT recommended on Win32, especially on '95/'98!!!), you can use:
-+
-+    make -f Make_ming.mak GUI=no vim.exe
+ /*
+  * A button in the toolbar has been pushed.
+  */
+-/*ARGSUSED*/
+     int
+ workshop_get_positions(
+-      void            *clientData,    /* unused */
++      void            *clientData UNUSED,
+       char           **filename,      /* output data */
+       int             *curLine,       /* output data */
+       int             *curCol,        /* output data */
+       int             *selStartLine,  /* output data */
+       int             *selStartCol,   /* output data */
+@@ -1119,12 +1114,16 @@ workshop_get_positions(
+       wstrace("workshop_get_positions(%#x, \"%s\", ...)\n",
+               clientData, (curbuf && curbuf->b_sfname != NULL)
+                                     ? (char *)curbuf->b_sfname : "<None>");
+ #endif
  
- If you are dismayed by how big the EXE is, I strongly recommend you get 'UPX'
- (also free!) and compress the file (typical compression is 50%). UPX can be
- found at
-     http://www.upx.org/
-@@ -238,11 +239,11 @@ Use Make_cyg.mak with Cygwin's GCC. See
-     http://users.skynet.be/antoine.mechelynck/vim/compile.htm
+-    strcpy(ffname, (char *) curbuf->b_ffname);
+-    *filename = ffname;               /* copy so nobody can change b_ffname */
++    if (curbuf->b_ffname == NULL)
++      ffname[0] = NUL;
++    else
++      /* copy so nobody can change b_ffname */
++      strcpy(ffname, (char *) curbuf->b_ffname);
++    *filename = ffname;
+     *curLine = curwin->w_cursor.lnum;
+     *curCol = curwin->w_cursor.col;
  
- The Cygnus one many not fully work yet.
- With Cygnus gcc you can use the Unix Makefile instead (you need to get the
- Unix archive then).  Then you get a Cygwin application (feels like Vim is
--runnin on Unix), while with Make_cyg.mak you get a Windows application (like
-+running on Unix), while with Make_cyg.mak you get a Windows application (like
- with the other makefiles).
+     if (curbuf->b_visual.vi_mode == 'v' &&
+           equalpos(curwin->w_cursor, curbuf->b_visual.vi_end))
+@@ -1520,13 +1519,12 @@ workshop_test_getselectedtext()
+       return selection;
+     else
+       return NULL;
+ }
  
+-/*ARGSUSED*/
+     void
+-workshop_save_sensitivity(char *filename)
++workshop_save_sensitivity(char *filename UNUSED)
+ {
+ }
  
- 4. Borland
- ===========
-@@ -257,14 +258,17 @@ Use Make_bc5.mak with Borland C++ 5.x. S
- [Update of 1) needs to be verified]
+ #endif
  
- If you like, you can compile the 'mingw' Win32 version from the comfort of
- your Linux (or other unix) box.  To do this, you need to follow a few steps:
-     1) Install the mingw32 cross-compiler. See
-+      http://www.mingw.org/wiki/LinuxCrossMinGW
-       http://www.libsdl.org/extras/win32/cross/README.txt
-     2) Get and unpack both the Unix sources and the extra archive
-     3) in 'Make_ming.mak', set 'CROSS' to 'yes' instead of 'no'.
-        Make further changes to 'Make_ming.mak' as you wish.
-+       If your cross-compiler prefix differs from the predefined value,
-+       set 'CROSS_COMPILE' corresponding.
-     4) make -f Make_ming.mak gvim.exe
+@@ -1624,12 +1622,10 @@ workshop_beval_cb(
+               workshop_send_message(buf);
+           }
+       }
+     }
+ }
+-#endif
+-
  
- Now you have created the Windows binary from your Linux box!  Have fun...
+     static int
+ computeIndex(
+       int              wantedCol,
+       char_u          *line,
+@@ -1649,10 +1645,11 @@ computeIndex(
+           return idx;
+     }
  
+     return -1;
+ }
++#endif
  
+     static void
+ addMenu(
+       char            *menu,          /* menu name */
+       char            *accel,         /* accelerator text (optional) */
 --- vim72.orig/src/xxd/Make_cyg.mak
 +++ vim72/src/xxd/Make_cyg.mak
 @@ -10,18 +10,19 @@ LIBS    = -lc
@@ -50746,108 +51208,80 @@ Individual patches for Vim 7.2:
  
  clean:
        -$(DEL) xxd.exe
---- vim72.orig/src/option.h
-+++ vim72/src/option.h
-@@ -31,11 +31,11 @@
- #     define DFLT_EFM "%A%p^,%C%%CC-%t-%m,%Cat line number %l in file %f,%f|%l| %m"
- #    else /* Unix, probably */
- #     ifdef EBCDIC
- #define DFLT_EFM      "%*[^ ] %*[^ ] %f:%l%*[ ]%m,%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m"
- #     else
--#define DFLT_EFM      "%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%D%*\\a: Entering directory `%f',%X%*\\a: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m"
-+#define DFLT_EFM      "%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%-GIn file included from %f:%l:%c,%-GIn file included from %f:%l,%-Gfrom %f:%l:%c,%-Gfrom %f:%l,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%D%*\\a: Entering directory `%f',%X%*\\a: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m"
- #     endif
- #    endif
- #   endif
- #  endif
- # endif
---- vim72.orig/src/proto/ex_docmd.pro
-+++ vim72/src/proto/ex_docmd.pro
-@@ -50,6 +50,7 @@ int find_cmdline_var __ARGS((char_u *src
- char_u *eval_vars __ARGS((char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped));
- char_u *expand_sfile __ARGS((char_u *arg));
- int put_eol __ARGS((FILE *fd));
- int put_line __ARGS((FILE *fd, char *s));
- void dialog_msg __ARGS((char_u *buff, char *format, char_u *fname));
-+char_u *get_behave_arg __ARGS((expand_T *xp, int idx));
- /* vim: set ft=c : */
---- vim72.orig/src/os_unixx.h
-+++ vim72/src/os_unixx.h
-@@ -26,15 +26,10 @@
+--- vim72.orig/src/xxd/xxd.c
++++ vim72/src/xxd/xxd.c
+@@ -62,10 +62,13 @@
+ /* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */
+ #if _MSC_VER >= 1400
+ # define _CRT_SECURE_NO_DEPRECATE
+ # define _CRT_NONSTDC_NO_DEPRECATE
+ #endif
++#if !defined(CYGWIN) && (defined(CYGWIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__))
++# define CYGWIN
++#endif
  
- # if defined(HAVE_SYS_WAIT_H) || defined(HAVE_UNION_WAIT)
- #  include <sys/wait.h>
+ #include <stdio.h>
+ #ifdef VAXC
+ # include <file.h>
+ #else
+@@ -75,11 +78,12 @@
+ # define MSDOS
+ #endif
+ #if !defined(OS2) && defined(__EMX__)
+ # define OS2
+ #endif
+-#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(__BORLANDC__)
++#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(__BORLANDC__) \
++  || defined(CYGWIN)
+ # include <io.h>      /* for setmode() */
+ #else
+ # ifdef UNIX
+ #  include <unistd.h>
+ # endif
+@@ -148,13 +152,10 @@ char osver[] = " (dos 16 bit)";
+ char osver[] = "";
+ #  endif
  # endif
--# if defined(HAVE_SYS_SELECT_H) && \
--      (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME))
--#  include <sys/select.h>
--# endif
--
- # ifndef WEXITSTATUS
- #  ifdef HAVE_UNION_WAIT
- #   define WEXITSTATUS(stat_val) ((stat_val).w_T.w_Retcode)
- #  else
- #   define WEXITSTATUS(stat_val) (((stat_val) >> 8) & 0377)
-@@ -63,20 +58,10 @@
- #ifdef HAVE_STRING_H
- # include <string.h>
  #endif
  
--#ifndef HAVE_SELECT
--# ifdef HAVE_SYS_POLL_H
--#  include <sys/poll.h>
--# else
--#  ifdef HAVE_POLL_H
--#   include <poll.h>
--#  endif
--# endif
+-#if !defined(CYGWIN) && (defined(CYGWIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__))
+-# define CYGWIN
 -#endif
--
- #ifdef HAVE_SYS_STREAM_H
- # include <sys/stream.h>
- #endif
+ #if defined(MSDOS) || defined(WIN32) || defined(OS2)
+ # define BIN_READ(yes)  ((yes) ? "rb" : "rt")
+ # define BIN_WRITE(yes) ((yes) ? "wb" : "wt")
+ # define BIN_CREAT(yes) ((yes) ? (O_CREAT|O_BINARY) : O_CREAT)
+ # define BIN_ASSIGN(fp, yes) setmode(fileno(fp), (yes) ? O_BINARY : O_TEXT)
+@@ -228,11 +229,11 @@ char *pname;
+ {
+   fprintf(stderr, "Usage:\n       %s [options] [infile [outfile]]\n", pname);
+   fprintf(stderr, "    or\n       %s -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]\n", pname);
+   fprintf(stderr, "Options:\n");
+   fprintf(stderr, "    -a          toggle autoskip: A single '*' replaces nul-lines. Default off.\n");
+-  fprintf(stderr, "    -b          binary digit dump (incompatible with -p,-i,-r). Default hex.\n");
++  fprintf(stderr, "    -b          binary digit dump (incompatible with -ps,-i,-r). Default hex.\n");
+   fprintf(stderr, "    -c cols     format <cols> octets per line. Default 16 (-i: 12, -ps: 30).\n");
+   fprintf(stderr, "    -E          show characters in EBCDIC. Default ASCII.\n");
+   fprintf(stderr, "    -g          number of octets per group in normal output. Default 2.\n");
+   fprintf(stderr, "    -h          print this summary.\n");
+   fprintf(stderr, "    -i          output in C include file style.\n");
+@@ -273,15 +274,15 @@ long base_off;
+   while ((c = getc(fpi)) != EOF)
+     {
+       if (c == '\r')  /* Doze style input file? */
+       continue;
  
- #ifdef HAVE_SYS_UTSNAME_H
---- vim72.orig/runtime/plugin/gzip.vim
-+++ vim72/runtime/plugin/gzip.vim
-@@ -1,8 +1,8 @@
- " Vim plugin for editing compressed files.
- " Maintainer: Bram Moolenaar <Bram@vim.org>
--" Last Change: 2005 Jul 26
-+" Last Change: 2010 Mar 10
+-#if 0 /* this doesn't work when there is normal text after the hex codes in
+-         the last line that looks like hex */
+-      if (c == ' ' || c == '\n' || c == '\t')  /* allow multiple spaces */
++      /* Allow multiple spaces.  This doesn't work when there is normal text
++       * after the hex codes in the last line that looks like hex, thus only
++       * use it for PostScript format. */
++      if (hextype == HEX_POSTSCRIPT && (c == ' ' || c == '\n' || c == '\t'))
+       continue;
+-#endif
  
- " Exit quickly when:
- " - this plugin was already loaded
- " - when 'compatible' is set
- " - some autocommands are already taking care of compressed files
-@@ -18,19 +18,27 @@ augroup gzip
-   " Enable editing of gzipped files.
-   " The functions are defined in autoload/gzip.vim.
-   "
-   " Set binary mode before reading the file.
-   " Use "gzip -d", gunzip isn't always available.
--  autocmd BufReadPre,FileReadPre      *.gz,*.bz2,*.Z setlocal bin
-+  autocmd BufReadPre,FileReadPre      *.gz,*.bz2,*.Z,*.lzma,*.xz setlocal bin
-   autocmd BufReadPost,FileReadPost    *.gz  call gzip#read("gzip -dn")
-   autocmd BufReadPost,FileReadPost    *.bz2 call gzip#read("bzip2 -d")
-   autocmd BufReadPost,FileReadPost    *.Z   call gzip#read("uncompress")
-+  autocmd BufReadPost,FileReadPost    *.lzma call gzip#read("lzma -d")
-+  autocmd BufReadPost,FileReadPost    *.xz  call gzip#read("xz -d")
-   autocmd BufWritePost,FileWritePost  *.gz  call gzip#write("gzip")
-   autocmd BufWritePost,FileWritePost  *.bz2 call gzip#write("bzip2")
-   autocmd BufWritePost,FileWritePost  *.Z   call gzip#write("compress -f")
-+  autocmd BufWritePost,FileWritePost  *.lzma call gzip#write("lzma -z")
-+  autocmd BufWritePost,FileWritePost  *.xz  call gzip#write("xz -z")
-   autocmd FileAppendPre                       *.gz  call gzip#appre("gzip -dn")
-   autocmd FileAppendPre                       *.bz2 call gzip#appre("bzip2 -d")
-   autocmd FileAppendPre                       *.Z   call gzip#appre("uncompress")
-+  autocmd FileAppendPre                       *.lzma call gzip#appre("lzma -d")
-+  autocmd FileAppendPre                       *.xz   call gzip#appre("xz -d")
-   autocmd FileAppendPost              *.gz  call gzip#write("gzip")
-   autocmd FileAppendPost              *.bz2 call gzip#write("bzip2")
-   autocmd FileAppendPost              *.Z   call gzip#write("compress -f")
-+  autocmd FileAppendPost              *.lzma call gzip#write("lzma -z")
-+  autocmd FileAppendPost              *.xz call gzip#write("xz -z")
- augroup END
+       n3 = n2;
+       n2 = n1;
+       if (c >= '0' && c <= '9')
index 37bdfb8..b1d71a2 100644 (file)
@@ -11,15 +11,15 @@ VIMX ?= "--without-x"
 
 require vim.inc
 
-PR = "${INC_PR}.0"
+PR = "${INC_PR}.1"
 
-# 001-394.diff contains 394 patches fetched from upstream
-SRC_URI += "file://001-394.diff"
+# 001-411.diff contains 411 patches fetched from upstream
+SRC_URI += "file://001-411.diff"
 
 # we need to apply patches in other dir then ${S}
 do_applypatch() {
        cd ${WORKDIR}/vim${VIMVER}
-       patch -p1 <${WORKDIR}/001-394.diff
+       patch -p1 <${WORKDIR}/001-411.diff
 }
 
 addtask applypatch after do_unpack before do_patch