summaryrefslogtreecommitdiff
path: root/data/vim/patches
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches')
-rw-r--r--data/vim/patches/7.2.00161
-rw-r--r--data/vim/patches/7.2.00247
-rw-r--r--data/vim/patches/7.2.003107
-rw-r--r--data/vim/patches/7.2.004103
-rw-r--r--data/vim/patches/7.2.005149
-rw-r--r--data/vim/patches/7.2.00650
-rw-r--r--data/vim/patches/7.2.007493
-rw-r--r--data/vim/patches/7.2.00863
-rw-r--r--data/vim/patches/7.2.00967
-rw-r--r--data/vim/patches/7.2.010206
-rw-r--r--data/vim/patches/7.2.011105
-rw-r--r--data/vim/patches/7.2.01253
-rw-r--r--data/vim/patches/7.2.013135
-rw-r--r--data/vim/patches/7.2.01452
-rw-r--r--data/vim/patches/7.2.01582
-rw-r--r--data/vim/patches/7.2.016166
-rw-r--r--data/vim/patches/7.2.017162
-rw-r--r--data/vim/patches/7.2.01845
-rw-r--r--data/vim/patches/7.2.01965
-rw-r--r--data/vim/patches/7.2.02054
-rw-r--r--data/vim/patches/7.2.021147
-rw-r--r--data/vim/patches/7.2.022140
-rw-r--r--data/vim/patches/8.1.000284
-rw-r--r--data/vim/patches/8.1.0003116
-rw-r--r--data/vim/patches/8.1.000454
-rw-r--r--data/vim/patches/8.1.000555
-rw-r--r--data/vim/patches/8.1.000656
-rw-r--r--data/vim/patches/8.1.000765
-rw-r--r--data/vim/patches/8.1.000871
-rw-r--r--data/vim/patches/8.1.0009102
-rw-r--r--data/vim/patches/8.1.0010381
-rw-r--r--data/vim/patches/8.1.001185
-rw-r--r--data/vim/patches/8.1.001254
-rw-r--r--data/vim/patches/8.1.0013205
-rw-r--r--data/vim/patches/8.1.0014486
-rw-r--r--data/vim/patches/8.1.0015144
-rw-r--r--data/vim/patches/8.1.001661
-rw-r--r--data/vim/patches/8.1.0017210
-rw-r--r--data/vim/patches/8.1.0018328
-rw-r--r--data/vim/patches/8.1.001978
-rw-r--r--data/vim/patches/8.1.0020519
-rw-r--r--data/vim/patches/8.1.002171
-rw-r--r--data/vim/patches/8.1.002279
-rw-r--r--data/vim/patches/8.1.002357
-rw-r--r--data/vim/patches/8.1.0024105
-rw-r--r--data/vim/patches/8.1.0025169
-rw-r--r--data/vim/patches/8.1.002655
-rw-r--r--data/vim/patches/8.1.00271480
-rw-r--r--data/vim/patches/8.1.002855
-rw-r--r--data/vim/patches/8.1.002948
-rw-r--r--data/vim/patches/8.1.003080
-rw-r--r--data/vim/patches/8.1.003153
-rw-r--r--data/vim/patches/8.1.0032191
-rw-r--r--data/vim/patches/8.1.003353
-rw-r--r--data/vim/patches/8.1.003490
-rw-r--r--data/vim/patches/8.1.0035237
-rw-r--r--data/vim/patches/8.1.0036145
-rw-r--r--data/vim/patches/8.1.0037581
-rw-r--r--data/vim/patches/8.1.003855
-rw-r--r--data/vim/patches/8.1.0039306
-rw-r--r--data/vim/patches/8.1.004073
-rw-r--r--data/vim/patches/8.1.0041107
-rw-r--r--data/vim/patches/8.1.0042110
-rw-r--r--data/vim/patches/8.1.0043109
-rw-r--r--data/vim/patches/8.1.004482
-rw-r--r--data/vim/patches/8.1.0045357
-rw-r--r--data/vim/patches/8.1.0046256
-rw-r--r--data/vim/patches/8.1.004793
-rw-r--r--data/vim/patches/8.1.0048111
-rw-r--r--data/vim/patches/8.1.0049236
-rw-r--r--data/vim/patches/8.1.0050414
-rw-r--r--data/vim/patches/8.1.005144
-rw-r--r--data/vim/patches/8.1.005250
-rw-r--r--data/vim/patches/8.1.0053609
-rw-r--r--data/vim/patches/8.1.005468
-rw-r--r--data/vim/patches/8.1.005588
-rw-r--r--data/vim/patches/8.1.0056130
-rw-r--r--data/vim/patches/8.1.0057203
-rw-r--r--data/vim/patches/8.1.0058220
-rw-r--r--data/vim/patches/8.1.0059111
-rw-r--r--data/vim/patches/8.1.006074
-rw-r--r--data/vim/patches/8.1.0061420
-rw-r--r--data/vim/patches/8.1.0062371
-rw-r--r--data/vim/patches/8.1.0063123
-rw-r--r--data/vim/patches/8.1.0064100
-rw-r--r--data/vim/patches/8.1.006590
-rw-r--r--data/vim/patches/8.1.0066129
-rw-r--r--data/vim/patches/8.1.006795
-rw-r--r--data/vim/patches/8.1.006880
-rw-r--r--data/vim/patches/8.1.0069301
-rw-r--r--data/vim/patches/8.1.007048
-rw-r--r--data/vim/patches/8.1.0071792
-rw-r--r--data/vim/patches/8.1.007297
-rw-r--r--data/vim/patches/8.1.007378
-rw-r--r--data/vim/patches/8.1.007454
-rw-r--r--data/vim/patches/8.1.007545
-rw-r--r--data/vim/patches/8.1.007663
-rw-r--r--data/vim/patches/8.1.007752
-rw-r--r--data/vim/patches/8.1.0078140
-rw-r--r--data/vim/patches/8.1.007969
-rw-r--r--data/vim/patches/8.1.0080258
-rw-r--r--data/vim/patches/8.1.008183
-rw-r--r--data/vim/patches/8.1.0082129
-rw-r--r--data/vim/patches/8.1.0083196
-rw-r--r--data/vim/patches/8.1.0084161
-rw-r--r--data/vim/patches/8.1.008597
-rw-r--r--data/vim/patches/8.1.008678
-rw-r--r--data/vim/patches/8.1.0087255
-rw-r--r--data/vim/patches/8.1.008856
-rw-r--r--data/vim/patches/8.1.0089199
-rw-r--r--data/vim/patches/8.1.0090146
-rw-r--r--data/vim/patches/8.1.0091369
-rw-r--r--data/vim/patches/8.1.009247
-rw-r--r--data/vim/patches/8.1.009367
-rw-r--r--data/vim/patches/8.1.009452
-rw-r--r--data/vim/patches/8.1.009585
-rw-r--r--data/vim/patches/8.1.0096126
-rw-r--r--data/vim/patches/8.1.009769
-rw-r--r--data/vim/patches/8.1.0098294
-rw-r--r--data/vim/patches/8.1.009970
-rw-r--r--data/vim/patches/8.1.010049
-rw-r--r--data/vim/patches/8.1.010160
-rw-r--r--data/vim/patches/8.1.010253
-rw-r--r--data/vim/patches/8.1.0103195
-rw-r--r--data/vim/patches/8.1.010457
-rw-r--r--data/vim/patches/8.1.01053397
-rw-r--r--data/vim/patches/8.1.010652
-rw-r--r--data/vim/patches/8.1.010793
-rw-r--r--data/vim/patches/8.1.01087847
-rw-r--r--data/vim/patches/8.1.010945
-rw-r--r--data/vim/patches/8.1.011084
-rw-r--r--data/vim/patches/8.1.0111149
-rw-r--r--data/vim/patches/8.1.0112139
-rw-r--r--data/vim/patches/8.1.011353
-rw-r--r--data/vim/patches/8.1.0114218
-rw-r--r--data/vim/patches/8.1.011552
-rw-r--r--data/vim/patches/8.1.011695
-rw-r--r--data/vim/patches/8.1.011752
-rw-r--r--data/vim/patches/8.1.0118136
-rw-r--r--data/vim/patches/8.1.011971
-rw-r--r--data/vim/patches/8.1.0120217
-rw-r--r--data/vim/patches/8.1.0121175
-rw-r--r--data/vim/patches/8.1.012249
-rw-r--r--data/vim/patches/8.1.012362
-rw-r--r--data/vim/patches/8.1.012451
-rw-r--r--data/vim/patches/8.1.0125197
-rw-r--r--data/vim/patches/8.1.0126213
-rw-r--r--data/vim/patches/8.1.012754
-rw-r--r--data/vim/patches/8.1.0128487
-rw-r--r--data/vim/patches/8.1.012950
-rw-r--r--data/vim/patches/8.1.0130169
-rw-r--r--data/vim/patches/8.1.0131196
-rw-r--r--data/vim/patches/8.1.0132737
-rw-r--r--data/vim/patches/8.1.0133141
-rw-r--r--data/vim/patches/8.1.0134724
-rw-r--r--data/vim/patches/8.1.013595
-rw-r--r--data/vim/patches/8.1.0136342
-rw-r--r--data/vim/patches/8.1.0137137
-rw-r--r--data/vim/patches/8.1.0138153
-rw-r--r--data/vim/patches/8.1.013986
-rw-r--r--data/vim/patches/8.1.0140108
-rw-r--r--data/vim/patches/8.1.0141558
-rw-r--r--data/vim/patches/8.1.0142103
-rw-r--r--data/vim/patches/8.1.0143163
-rw-r--r--data/vim/patches/8.1.014497
-rw-r--r--data/vim/patches/8.1.014573
-rw-r--r--data/vim/patches/8.1.014649
-rw-r--r--data/vim/patches/8.1.014778
-rw-r--r--data/vim/patches/8.1.014848
-rw-r--r--data/vim/patches/8.1.0149263
-rw-r--r--data/vim/patches/8.1.0150692
-rw-r--r--data/vim/patches/8.1.015157
-rw-r--r--data/vim/patches/8.1.0152512
-rw-r--r--data/vim/patches/8.1.015353
-rw-r--r--data/vim/patches/8.1.0154132
-rw-r--r--data/vim/patches/8.1.015544
-rw-r--r--data/vim/patches/8.1.015652
-rw-r--r--data/vim/patches/8.1.015776
-rw-r--r--data/vim/patches/8.1.015852
-rw-r--r--data/vim/patches/8.1.015977
-rw-r--r--data/vim/patches/8.1.016046
-rw-r--r--data/vim/patches/8.1.0161154
-rw-r--r--data/vim/patches/8.1.0162149
-rw-r--r--data/vim/patches/8.1.0163174
-rw-r--r--data/vim/patches/8.1.016483
-rw-r--r--data/vim/patches/8.1.0165123
-rw-r--r--data/vim/patches/8.1.01661183
-rw-r--r--data/vim/patches/8.1.0167206
-rw-r--r--data/vim/patches/8.1.0168138
-rw-r--r--data/vim/patches/8.1.0169110
-rw-r--r--data/vim/patches/8.1.0170296
-rw-r--r--data/vim/patches/8.1.0171105
-rw-r--r--data/vim/patches/8.1.017254
-rw-r--r--data/vim/patches/8.1.017352
-rw-r--r--data/vim/patches/8.1.0174130
-rw-r--r--data/vim/patches/8.1.017564
-rw-r--r--data/vim/patches/8.1.017652
-rw-r--r--data/vim/patches/8.1.0177146
-rw-r--r--data/vim/patches/8.1.017855
-rw-r--r--data/vim/patches/8.1.017958
-rw-r--r--data/vim/patches/8.1.0180160
-rw-r--r--data/vim/patches/8.1.018166
-rw-r--r--data/vim/patches/8.1.0182425
-rw-r--r--data/vim/patches/8.1.0183130
-rw-r--r--data/vim/patches/8.1.0184122
-rw-r--r--data/vim/patches/8.1.0185124
-rw-r--r--data/vim/patches/8.1.018669
-rw-r--r--data/vim/patches/8.1.0187233
-rw-r--r--data/vim/patches/8.1.018863
-rw-r--r--data/vim/patches/8.1.018957
-rw-r--r--data/vim/patches/8.1.0190269
-rw-r--r--data/vim/patches/8.1.019153
-rw-r--r--data/vim/patches/8.1.01924274
-rw-r--r--data/vim/patches/8.1.019357
-rw-r--r--data/vim/patches/8.1.0194104
-rw-r--r--data/vim/patches/8.1.019559
-rw-r--r--data/vim/patches/8.1.019656
-rw-r--r--data/vim/patches/8.1.019774
-rw-r--r--data/vim/patches/8.1.019888
-rw-r--r--data/vim/patches/8.1.019948
-rw-r--r--data/vim/patches/8.1.020093
-rw-r--r--data/vim/patches/8.1.0201332
-rw-r--r--data/vim/patches/8.1.020272
-rw-r--r--data/vim/patches/8.1.0203132
-rw-r--r--data/vim/patches/8.1.020458
-rw-r--r--data/vim/patches/8.1.0205226
-rw-r--r--data/vim/patches/8.1.020680
-rw-r--r--data/vim/patches/8.1.020767
-rw-r--r--data/vim/patches/8.1.020848
-rw-r--r--data/vim/patches/8.1.020983
-rw-r--r--data/vim/patches/8.1.0210115
-rw-r--r--data/vim/patches/8.1.0211228
-rw-r--r--data/vim/patches/8.1.0212253
-rw-r--r--data/vim/patches/8.1.0213197
234 files changed, 49005 insertions, 2552 deletions
diff --git a/data/vim/patches/7.2.001 b/data/vim/patches/7.2.001
deleted file mode 100644
index 3bcb7d090..000000000
--- a/data/vim/patches/7.2.001
+++ /dev/null
@@ -1,61 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.001
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.001
-Problem: Mac: pseudo-ttys don't work properly on Leopard, resulting in the
- shell not to have a prompt, CTRL-C not working, etc.
-Solution: Don't use SVR4 compatible ptys, even though they are detected.
- (Ben Schmidt)
-Files: src/pty.c
-
-
-*** ../vim-7.2.000/src/pty.c Wed Aug 6 19:04:29 2008
---- src/pty.c Fri Aug 15 04:00:34 2008
-***************
-*** 270,278 ****
- }
- #endif
-
-! #if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux)
-
-! /* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */
- #define PTY_DONE
- int
- OpenPTY(ttyn)
---- 270,279 ----
- }
- #endif
-
-! #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!
-! * Same for Mac OS X Leopard. */
- #define PTY_DONE
- int
- OpenPTY(ttyn)
-*** ../vim-7.2.000/src/version.c Sat Aug 9 19:37:37 2008
---- src/version.c Sun Aug 17 22:56:25 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 1,
- /**/
-
---
-ARTHUR: Now stand aside worthy adversary.
-BLACK KNIGHT: (Glancing at his shoulder) 'Tis but a scratch.
-ARTHUR: A scratch? Your arm's off.
- "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.002 b/data/vim/patches/7.2.002
deleted file mode 100644
index e1ee32cd5..000000000
--- a/data/vim/patches/7.2.002
+++ /dev/null
@@ -1,47 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.002
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.002
-Problem: Leaking memory when displaying menus.
-Solution: Free allocated memory. (Dominique Pelle)
-Files: src/menu.c
-
-
-*** ../vim-7.2.001/src/menu.c Wed Jun 25 00:19:17 2008
---- src/menu.c Sat Aug 16 05:38:45 2008
-***************
-*** 1120,1125 ****
---- 1120,1126 ----
- parent = menu;
- menu = menu->children;
- }
-+ vim_free(path_name);
-
- /* Now we have found the matching menu, and we list the mappings */
- /* Highlight title */
-*** ../vim-7.2.001/src/version.c Sun Aug 17 23:01:21 2008
---- src/version.c Sun Aug 17 23:42:53 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 2,
- /**/
-
---
-ARTHUR: You are indeed brave Sir knight, but the fight is mine.
-BLACK KNIGHT: Had enough?
-ARTHUR: You stupid bastard. You havn't got any arms left.
- "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.003 b/data/vim/patches/7.2.003
deleted file mode 100644
index 626d81e5a..000000000
--- a/data/vim/patches/7.2.003
+++ /dev/null
@@ -1,107 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.003
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.003
-Problem: Typo in translated message. Message not translated.
-Solution: Correct spelling. Add _(). (Dominique Pelle)
-Files: src/spell.c, src/version.c
-
-
-*** ../vim-7.2.002/src/spell.c Tue Jun 24 22:21:31 2008
---- src/spell.c Sun Aug 10 12:51:38 2008
-***************
-*** 77,83 ****
-
- /*
- * Do the opposite: based on a maximum end score and a known sound score,
-! * compute the the maximum word score that can be used.
- */
- #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3)
-
---- 77,83 ----
-
- /*
- * Do the opposite: based on a maximum end score and a known sound score,
-! * compute the maximum word score that can be used.
- */
- #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3)
-
-***************
-*** 625,631 ****
- /* 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
- * 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)
---- 625,631 ----
- /* 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
- * 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)
-***************
-*** 5980,5986 ****
- 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"));
- }
-
- if (syllable != NULL)
---- 5980,5986 ----
- else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
- MSG(_("Too many compound flags"));
- else
-! MSG(_("Too many postponed prefixes and/or compound flags"));
- }
-
- if (syllable != NULL)
-*** ../vim-7.2.002/src/version.c Sun Aug 17 23:43:53 2008
---- src/version.c Mon Aug 25 04:06:52 2008
-***************
-*** 790,796 ****
- MSG_PUTS(_("\nRISC OS version"));
- #endif
- #ifdef VMS
-! MSG_PUTS("\nOpenVMS version");
- # ifdef HAVE_PATHDEF
- if (*compiled_arch != NUL)
- {
---- 792,798 ----
- MSG_PUTS(_("\nRISC OS version"));
- #endif
- #ifdef VMS
-! MSG_PUTS(_("\nOpenVMS version"));
- # ifdef HAVE_PATHDEF
- if (*compiled_arch != NUL)
- {
-*** ../vim-7.2.002/src/version.c Sun Aug 17 23:43:53 2008
---- src/version.c Mon Aug 25 04:06:52 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 3,
- /**/
-
---
-I learned the customs and mannerisms of engineers by observing them, much the
-way Jane Goodall learned about the great apes, but without the hassle of
-grooming.
- (Scott Adams - The Dilbert principle)
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.004 b/data/vim/patches/7.2.004
deleted file mode 100644
index 8e7ed3e9d..000000000
--- a/data/vim/patches/7.2.004
+++ /dev/null
@@ -1,103 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.004
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.004
-Problem: Cscope help message is not translated.
-Solution: Put it in _(). (Dominique Pelle)
-Files: src/if_cscope.c, src/if_cscope.h
-
-
-*** ../vim-7.2.003/src/if_cscope.c Tue Jun 24 23:52:06 2008
---- src/if_cscope.c Mon Aug 25 04:34:19 2008
-***************
-*** 74,80 ****
- { "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 },
- { "help", cs_help,
- N_("Show this message"), "help", 0 },
- { "kill", cs_kill,
---- 74,80 ----
- { "add", cs_add,
- N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 },
- { "find", cs_find,
-! 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,
-***************
-*** 1180,1186 ****
- (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"),
- cmdp->name, _(cmdp->help), cmdp->usage);
- if (strcmp(cmdp->name, "find") == 0)
-! MSG_PUTS(FIND_HELP);
- cmdp++;
- }
-
---- 1180,1195 ----
- (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"),
- cmdp->name, _(cmdp->help), cmdp->usage);
- if (strcmp(cmdp->name, "find") == 0)
-! 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"));
-!
- cmdp++;
- }
-
-*** ../vim-7.2.003/src/if_cscope.h Thu Sep 6 17:38:58 2007
---- src/if_cscope.h Mon Aug 25 04:34:17 2008
-***************
-*** 42,58 ****
- * 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"
--
-
- typedef struct {
- char * name;
---- 42,47 ----
-*** ../vim-7.2.003/src/version.c Mon Aug 25 04:12:38 2008
---- src/version.c Mon Aug 25 04:29:53 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 4,
- /**/
-
---
-If someone questions your market projections, simply point out that your
-target market is "People who are nuts" and "People who will buy any damn
-thing". Nobody is going to tell you there aren't enough of those people
-to go around.
- (Scott Adams - The Dilbert principle)
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.005 b/data/vim/patches/7.2.005
deleted file mode 100644
index 20cce85b3..000000000
--- a/data/vim/patches/7.2.005
+++ /dev/null
@@ -1,149 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.005
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.005
-Problem: A few problems when profiling. Using flag pointer instead of flag
- value. Allocating zero bytes. Not freeing used memory.
-Solution: Remove wrong '&' characters. Skip dumping when there is nothing
- to dump. Free used memory. (Dominique Pelle)
-Files: src/eval.c
-
-
-*** ../vim-7.2.004/src/eval.c Fri Aug 8 12:36:31 2008
---- src/eval.c Mon Aug 25 04:40:11 2008
-***************
-*** 3657,3664 ****
- }
-
- /*
-! * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or
-! * it refers to a List or Dictionary that is locked.
- */
- static int
- tv_islocked(tv)
---- 3657,3664 ----
- }
-
- /*
-! * 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)
-***************
-*** 15838,15847 ****
- 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;
- clear_tv(&rettv);
- return res;
- }
---- 15838,15846 ----
- if (res == FAIL)
- res = ITEM_COMPARE_FAIL;
- else
- res = get_tv_number_chk(&rettv, &item_compare_func_err);
- if (item_compare_func_err)
-! res = ITEM_COMPARE_FAIL; /* return value has wrong type */
- clear_tv(&rettv);
- return res;
- }
-***************
-*** 20590,20595 ****
---- 20589,20597 ----
- int st_len = 0;
-
- todo = (int)func_hashtab.ht_used;
-+ if (todo == 0)
-+ return; /* nothing to dump */
-+
- sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo));
-
- for (hi = func_hashtab.ht_array; todo > 0; ++hi)
-***************
-*** 20638,20643 ****
---- 20640,20647 ----
- prof_self_cmp);
- prof_sort_list(fd, sorttab, st_len, "SELF", TRUE);
- }
-+
-+ vim_free(sorttab);
- }
-
- static void
-***************
-*** 21204,21210 ****
- 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))
- {
- ++fp->uf_tm_count;
- profile_start(&call_start);
---- 21208,21214 ----
- 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))
- {
- ++fp->uf_tm_count;
- profile_start(&call_start);
-***************
-*** 21235,21247 ****
-
- #ifdef FEAT_PROFILE
- if (do_profiling == PROF_YES && (fp->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)
- {
- profile_add(&fc.caller->func->uf_tm_children, &call_start);
- profile_add(&fc.caller->func->uf_tml_children, &call_start);
---- 21239,21251 ----
-
- #ifdef FEAT_PROFILE
- if (do_profiling == PROF_YES && (fp->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)
- {
- profile_add(&fc.caller->func->uf_tm_children, &call_start);
- profile_add(&fc.caller->func->uf_tml_children, &call_start);
-*** ../vim-7.2.004/src/version.c Mon Aug 25 04:35:13 2008
---- src/version.c Mon Aug 25 04:46:44 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 5,
- /**/
-
---
-The process for understanding customers primarily involves sitting around with
-other marketing people and talking about what you would to if you were dumb
-enough to be a customer.
- (Scott Adams - The Dilbert principle)
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.006 b/data/vim/patches/7.2.006
deleted file mode 100644
index f22eeae53..000000000
--- a/data/vim/patches/7.2.006
+++ /dev/null
@@ -1,50 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.006
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.006
-Problem: HTML files are not recognized by contents.
-Solution: Add a rule to the scripts file. (Nico Weber)
-Files: runtime/scripts.vim
-
-
-*** ../vim-7.2.005/runtime/scripts.vim Sat Aug 9 19:37:09 2008
---- runtime/scripts.vim Sat Aug 16 04:05:34 2008
-***************
-*** 234,239 ****
---- 234,243 ----
- elseif s:line1 =~ '\<DTD\s\+XHTML\s'
- set ft=xhtml
-
-+ " 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
-*** ../vim-7.2.005/src/version.c Mon Aug 25 04:48:21 2008
---- src/version.c Mon Aug 25 05:02:34 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 6,
- /**/
-
---
-Never enter the boss's office unless it's absolutely necessary. Every boss
-saves one corner of the desk for useless assignments that are doled out like
-Halloween candy to each visitor.
- (Scott Adams - The Dilbert principle)
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.007 b/data/vim/patches/7.2.007
deleted file mode 100644
index 104b26785..000000000
--- a/data/vim/patches/7.2.007
+++ /dev/null
@@ -1,493 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.007 (extra)
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.007 (extra)
-Problem: Minor issues for VMS.
-Solution: Minor fixes for VMS. Add float support. (Zoltan Arpadffy)
-Files: runtime/doc/os_vms.txt, src/os_vms_conf.h, src/Make_vms.mms,
- src/testdir/Make_vms.mms, src/testdir/test30.in,
- src/testdir/test54.in
-
-
-*** ../vim-7.2.006/runtime/doc/os_vms.txt Sat Aug 9 19:36:50 2008
---- runtime/doc/os_vms.txt Tue Aug 19 06:29:31 2008
-***************
-*** 1,4 ****
-! *os_vms.txt* For Vim version 7.2. Last change: 2006 Nov 18
-
-
- VIM REFERENCE MANUAL
---- 1,4 ----
-! *os_vms.txt* For Vim version 7.2. Last change: 2008 Aug 19
-
-
- VIM REFERENCE MANUAL
-***************
-*** 312,318 ****
-
- 8. Useful notes *vms-notes*
-
-! 8.1 backspace/delete
- 8.2 Filters
- 8.3 VMS file version numbers
- 8.4 Directory conversion
---- 312,318 ----
-
- 8. Useful notes *vms-notes*
-
-! 8.1 Backspace/delete
- 8.2 Filters
- 8.3 VMS file version numbers
- 8.4 Directory conversion
-***************
-*** 326,333 ****
- 8.12 diff-mode
- 8.13 Allow '$' in C keywords
- 8.14 VIMTUTOR for beginners
-
-! 8.1 backspace/delete
-
- There are backspace/delete key inconsistencies with VMS.
- :fixdel doesn't do the trick, but the solution is: >
---- 326,335 ----
- 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
-
-! 8.1 Backspace/delete
-
- There are backspace/delete key inconsistencies with VMS.
- :fixdel doesn't do the trick, but the solution is: >
-***************
-*** 663,674 ****
-
- (Thomas.R.Wyant III, Vim 6.1)
-
- ==============================================================================
-
- 9. VMS related changes *vms-changes*
-
-! Version 7
- - Improved low level char input (affects just console mode)
-
- Version 6.4 (2005 Oct 15)
- - GTKLIB and Vim build on IA64
---- 665,794 ----
-
- (Thomas.R.Wyant III, Vim 6.1)
-
-+ 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:
-+
-+ $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)
-+
- ==============================================================================
-
- 9. VMS related changes *vms-changes*
-
-! 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
-
- Version 6.4 (2005 Oct 15)
- - GTKLIB and Vim build on IA64
-***************
-*** 806,811 ****
---- 926,932 ----
-
- 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:
-*** ../vim-7.2.006/src/os_vms_conf.h Thu May 10 19:26:17 2007
---- src/os_vms_conf.h Sat Aug 16 05:09:17 2008
-***************
-*** 114,119 ****
---- 114,121 ----
- #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
-*** ../vim-7.2.006/src/Make_vms.mms Mon Oct 29 22:38:54 2007
---- src/Make_vms.mms Sat Aug 16 05:17:41 2008
-***************
-*** 2,8 ****
- # Makefile for Vim on OpenVMS
- #
- # Maintainer: Zoltan Arpadffy <arpadffy@polarhome.com>
-! # Last change: 2007 Oct 22
- #
- # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64
- # with MMS and MMK
---- 2,8 ----
- # Makefile for Vim on OpenVMS
- #
- # Maintainer: Zoltan Arpadffy <arpadffy@polarhome.com>
-! # 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
-***************
-*** 36,42 ****
- # BIG - Many features enabled, as rich as possible. (default)
- # HUGE - All possible featues enabled.
- # Please select one of these alternatives above.
-! MODEL = BIG
-
- # GUI or terminal mode executable.
- # Comment out if you want just the character terminal mode only.
---- 36,42 ----
- # BIG - Many features enabled, as rich as possible. (default)
- # HUGE - All possible featues enabled.
- # Please select one of these alternatives above.
-! MODEL = HUGE
-
- # GUI or terminal mode executable.
- # Comment out if you want just the character terminal mode only.
-*** ../vim-7.2.006/src/testdir/Make_vms.mms Wed Jun 25 00:34:23 2008
---- src/testdir/Make_vms.mms Tue Aug 19 06:28:07 2008
-***************
-*** 4,12 ****
- # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com>
- # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu>
- #
-! # Last change: 2008 Jun 19
- #
-! # This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX.
- # Edit the lines in the Configuration section below to select.
- #
- # Execute with:
---- 4,12 ----
- # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com>
- # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu>
- #
-! # Last change: 2008 Aug 19
- #
-! # 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:
-***************
-*** 32,37 ****
---- 32,46 ----
- # and directory handling.
- # WANT_UNIX = YES
-
-+ # 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
-
-***************
-*** 53,64 ****
- 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 \
- 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
-
- .IFDEF WANT_GUI
---- 62,73 ----
- 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 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 test60.out \
- test61.out test62.out test63.out test64.out test65.out
-
- .IFDEF WANT_GUI
-***************
-*** 67,73 ****
- .ENDIF
-
- .IFDEF WANT_UNIX
-! SCRIPT_UNIX = test10.out test12.out test25.out test27.out test30.out test49.out
- .ENDIF
-
- .IFDEF HAVE_GZIP
---- 76,90 ----
- .ENDIF
-
- .IFDEF WANT_UNIX
-! 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 HAVE_GZIP
-***************
-*** 84,94 ****
- -@ 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 rename test.out $*.out
- -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.*
-
-! all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_GZIP) $(SCRIPT_GDIFF)
- -@ write sys$output " "
- -@ write sys$output "-----------------------------------------------"
- -@ write sys$output " All done"
---- 101,111 ----
- -@ 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 /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.*.*
-
-! 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"
-***************
-*** 113,118 ****
---- 130,137 ----
- -@ 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:
-***************
-*** 122,126 ****
---- 141,153 ----
- 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.*.*
-+
-*** ../vim-7.2.006/src/testdir/test30.in Sun Jul 13 19:17:14 2008
---- src/testdir/test30.in Sat Aug 16 04:59:37 2008
-***************
-*** 24,33 ****
- :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
- :"
- :" try reading and writing with 'fileformats' empty
- :set fileformat=unix
---- 24,40 ----
- :set nobin eol
- :bwipe XXUnix XXDos XXMac
- :" create mixed format files
-! :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
-*** ../vim-7.2.006/src/testdir/test54.in Sun Jan 2 12:43:19 2005
---- src/testdir/test54.in Tue Aug 19 06:26:55 2008
-***************
-*** 3,10 ****
- STARTTEST
- :so small.vim
- :e xx
-! :!rm -f test.out
-! :au BufLeave <buffer> :!echo buffer-local autommand in %>> test.out
- :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
---- 3,15 ----
- STARTTEST
- :so small.vim
- :e xx
-! :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
-*** ../vim-7.2.006/src/version.c Mon Aug 25 05:03:29 2008
---- src/version.c Mon Sep 1 16:46:50 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 7,
- /**/
-
---
-How To Keep A Healthy Level Of Insanity:
-8. Don't use any punctuation marks.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.008 b/data/vim/patches/7.2.008
deleted file mode 100644
index d3fb58e5c..000000000
--- a/data/vim/patches/7.2.008
+++ /dev/null
@@ -1,63 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.008
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.008
-Problem: With a BufHidden autocommand that invokes ":bunload" the window
- count for a buffer can be wrong. (Bob Hiestand)
-Solution: Don't call enter_buffer() when already in that buffer.
-Files: src/buffer.c
-
-
-*** ../vim-7.2.007/src/buffer.c Wed Aug 6 18:32:40 2008
---- src/buffer.c Mon Sep 1 14:25:45 2008
-***************
-*** 1351,1361 ****
- }
- }
- #ifdef FEAT_AUTOCMD
- # ifdef FEAT_EVAL
-! /* An autocommand may have deleted buf or aborted the script processing! */
-! if (buf_valid(buf) && !aborting())
- # else
-! if (buf_valid(buf)) /* an autocommand may have deleted buf! */
- # endif
- #endif
- enter_buffer(buf);
---- 1351,1362 ----
- }
- }
- #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
-! if (buf_valid(buf) && buf != curbuf && !aborting())
- # else
-! if (buf_valid(buf) && buf != curbuf)
- # endif
- #endif
- enter_buffer(buf);
-*** ../vim-7.2.007/src/version.c Mon Sep 1 16:50:09 2008
---- src/version.c Mon Sep 1 17:31:28 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 8,
- /**/
-
---
-If Pacman had affected us as kids we'd be running around in dark rooms,
-munching pills and listening to repetitive music.
- -- Marcus Brigstocke
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.009 b/data/vim/patches/7.2.009
deleted file mode 100644
index fa891dcfc..000000000
--- a/data/vim/patches/7.2.009
+++ /dev/null
@@ -1,67 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.009
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.009
-Problem: Can't compile with Perl 5.10 on MS-Windows. (Cesar Romani)
-Solution: Add the Perl_sv_free2 function for dynamic loading. (Dan Sharp)
-Files: src/if_perl.xs
-
-
-*** ../vim-7.2.008/src/if_perl.xs Thu Jul 24 16:24:15 2008
---- src/if_perl.xs Mon Sep 1 14:58:37 2008
-***************
-*** 136,141 ****
---- 136,144 ----
- # 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
-***************
-*** 268,273 ****
---- 271,277 ----
- static void (*boot_DynaLoader)_((pTHX_ CV*));
-
- #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
-+ static void (*Perl_sv_free2)(pTHX_ SV*);
- static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env);
- static void (*Perl_sys_term)(void);
- static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
-***************
-*** 367,372 ****
---- 371,377 ----
- {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr},
- {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
- #else
-+ {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
- {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3},
- {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
- {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
-*** ../vim-7.2.008/src/version.c Mon Sep 1 17:32:40 2008
---- src/version.c Mon Sep 1 17:55:24 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 9,
- /**/
-
---
-How To Keep A Healthy Level Of Insanity:
-11. Specify that your drive-through order is "to go".
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.010 b/data/vim/patches/7.2.010
deleted file mode 100644
index 47315881e..000000000
--- a/data/vim/patches/7.2.010
+++ /dev/null
@@ -1,206 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.010
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.010
-Problem: When using "K" in Visual mode not all characters are properly
- escaped. (Ben Schmidt)
-Solution: Use a function with the functionality of shellescape(). (Jan
- Minar)
-Files: src/mbyte.c, src/misc2.c, src/normal.c
-
-
-*** ../vim-7.2.009/src/mbyte.c Wed Aug 6 18:45:36 2008
---- src/mbyte.c Wed Sep 3 22:34:48 2008
-***************
-*** 2540,2546 ****
- return (int)(p - q);
- }
-
-- #if defined(FEAT_EVAL) || defined(PROTO)
- /*
- * Copy a character from "*fp" to "*tp" and advance the pointers.
- */
---- 2540,2545 ----
-***************
-*** 2555,2561 ****
- *tp += l;
- *fp += l;
- }
-- #endif
-
- /*
- * Return the offset from "p" to the first byte of a character. When "p" is
---- 2554,2559 ----
-*** ../vim-7.2.009/src/misc2.c Thu Jul 24 20:28:58 2008
---- src/misc2.c Wed Sep 3 22:05:21 2008
-***************
-*** 1257,1263 ****
- return escaped_string;
- }
-
-- #if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)
- /*
- * Return TRUE when 'shell' has "csh" in the tail.
- */
---- 1257,1262 ----
-***************
-*** 1266,1274 ****
- {
- return (strstr((char *)gettail(p_sh), "csh") != NULL);
- }
-- #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
---- 1265,1271 ----
-***************
-*** 1391,1397 ****
-
- return escaped_string;
- }
-- #endif
-
- /*
- * Like vim_strsave(), but make all characters uppercase.
---- 1388,1393 ----
-*** ../vim-7.2.009/src/normal.c Thu Jul 31 22:03:54 2008
---- src/normal.c Sat Sep 6 15:06:07 2008
-***************
-*** 5469,5474 ****
---- 5469,5479 ----
- STRCPY(buf, "he! ");
- else
- {
-+ /* An external command will probably use an argument starting
-+ * with "-" as an option. To avoid trouble we skip the "-". */
-+ while (*ptr == '-')
-+ ++ptr;
-+
- /* When a count is given, turn it into a range. Is this
- * really what we want? */
- isman = (STRCMP(kp, "man") == 0);
-***************
-*** 5511,5547 ****
- /*
- * 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)
- {
-! int i;
-! int len = (*mb_ptr2len)(ptr) - 1;
-!
-! for (i = 0; i < len && n >= 1; ++i, --n)
-! *p++ = *ptr++;
- }
- #endif
-! *p++ = *ptr++;
- }
-- *p = NUL;
-
- /*
- * Execute the command.
---- 5516,5572 ----
- /*
- * Now grab the chars in the identifier
- */
-! if (cmdchar == 'K' && !kp_help)
-! {
-! /* Escape the argument properly for a shell command */
-! p = vim_strsave_shellescape(ptr, TRUE);
-! if (p == NULL)
- {
-! 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
-+ /* Don't escape spaces and Tabs in a tag with a backslash */
-+ 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 = NUL;
- }
-
- /*
- * Execute the command.
-*** ../vim-7.2.009/src/version.c Mon Sep 1 17:56:05 2008
---- src/version.c Sat Sep 6 16:26:42 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 10,
- /**/
-
---
-Q. What happens to programmers when they die?
-A: MS-Windows programmers are reinstalled. C++ programmers become undefined,
- anyone who refers to them will die as well. Java programmers reincarnate
- after being garbage collected.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.011 b/data/vim/patches/7.2.011
deleted file mode 100644
index 928f8d638..000000000
--- a/data/vim/patches/7.2.011
+++ /dev/null
@@ -1,105 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.011
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.011
-Problem: Get an error when inserting a float value from the expression
- register.
-Solution: Convert the Float to a String automatically in the same place
- where a List would be converted to a String.
-Files: src/eval.c
-
-
-*** ../vim-7.2.010/src/eval.c Mon Aug 25 04:48:21 2008
---- src/eval.c Sun Sep 7 13:50:38 2008
-***************
-*** 1256,1278 ****
-
- /*
- * Top level evaluation function, returning a string.
- * Return pointer to allocated memory, or NULL for failure.
- */
- char_u *
-! eval_to_string(arg, nextcmd, dolist)
- char_u *arg;
- char_u **nextcmd;
-! int dolist; /* turn List into sequence of lines */
- {
- typval_T tv;
- char_u *retval;
- garray_T ga;
-
- if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
- retval = NULL;
- else
- {
-! if (dolist && tv.v_type == VAR_LIST)
- {
- ga_init2(&ga, (int)sizeof(char), 80);
- if (tv.vval.v_list != NULL)
---- 1256,1281 ----
-
- /*
- * 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, convert)
- char_u *arg;
- char_u **nextcmd;
-! int convert;
- {
- typval_T tv;
- char_u *retval;
- garray_T ga;
-+ char_u numbuf[NUMBUFLEN];
-
- if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
- retval = NULL;
- else
- {
-! if (convert && tv.v_type == VAR_LIST)
- {
- ga_init2(&ga, (int)sizeof(char), 80);
- if (tv.vval.v_list != NULL)
-***************
-*** 1280,1285 ****
---- 1283,1295 ----
- 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);
-*** ../vim-7.2.010/src/version.c Sat Sep 6 16:44:06 2008
---- src/version.c Sun Sep 7 13:52:00 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 11,
- /**/
-
---
-hundred-and-one symptoms of being an internet addict:
-34. You laugh at people with 14400 baud modems.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.012 b/data/vim/patches/7.2.012
deleted file mode 100644
index fa3ed2473..000000000
--- a/data/vim/patches/7.2.012
+++ /dev/null
@@ -1,53 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.012
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.012
-Problem: Compiler warnings when building with startup timing.
-Solution: Add type casts.
-Files: src/ex_cmds2.c
-
-
-*** ../vim-7.2.011/src/ex_cmds2.c Sun Jul 13 19:36:09 2008
---- src/ex_cmds2.c Tue Sep 2 11:14:41 2008
-***************
-*** 3145,3152 ****
- verbose_leave();
- }
- #ifdef STARTUPTIME
-! vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname);
-! time_msg(IObuff, &tv_start);
- time_pop(&tv_rel);
- #endif
-
---- 3145,3152 ----
- verbose_leave();
- }
- #ifdef STARTUPTIME
-! vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
-! time_msg((char *)IObuff, &tv_start);
- time_pop(&tv_rel);
- #endif
-
-*** ../vim-7.2.011/src/version.c Sun Sep 7 13:54:31 2008
---- src/version.c Sun Sep 7 15:49:00 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 12,
- /**/
-
---
-He who laughs last, thinks slowest.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.013 b/data/vim/patches/7.2.013
deleted file mode 100644
index 2645f0a7d..000000000
--- a/data/vim/patches/7.2.013
+++ /dev/null
@@ -1,135 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.013
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.013
-Problem: While waiting for the X selection Vim consumes a lot of CPU time
- and hangs until a response is received.
-Solution: Sleep a bit when the selection event hasn't been received yet.
- Time out after a couple of seconds to avoid a hang when the
- selection owner isn't responding.
-Files: src/ui.c
-
-
-*** ../vim-7.2.012/src/ui.c Mon Jul 14 21:47:49 2008
---- src/ui.c Sun Sep 7 16:54:35 2008
-***************
-*** 2110,2115 ****
---- 2110,2117 ----
- int i;
- int nbytes = 0;
- char_u *buffer;
-+ time_t start_time;
-+ int timed_out = FALSE;
-
- for (i =
- #ifdef FEAT_MBYTE
-***************
-*** 2129,2134 ****
---- 2131,2137 ----
- case 3: type = text_atom; break;
- default: type = XA_STRING;
- }
-+ success = FALSE;
- XtGetSelectionValue(myShell, cbd->sel_atom, type,
- clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
-
-***************
-*** 2141,2167 ****
- * 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 (;;)
- {
- 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. */
- XtDispatchEvent(&event);
-
- /* 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. */
- }
-
-- /* this is where clip_x11_request_selection_cb() is actually called */
-- XtDispatchEvent(&event);
--
- if (success)
- return;
- }
-
- /* Final fallback position - use the X CUT_BUFFER0 store */
---- 2144,2189 ----
- * characters, then they will appear before the one that requested the
- * paste! Don't worry, we will catch up with any other events later.
- */
-+ start_time = time(NULL);
- for (;;)
- {
- if (XCheckTypedEvent(dpy, SelectionNotify, &event))
-+ {
-+ /* this is where clip_x11_request_selection_cb() is actually
-+ * called */
-+ XtDispatchEvent(&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. */
- XtDispatchEvent(&event);
-
-+ /* 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 (by xterm).
-+ * Don't know how to avoid that :-(. */
-+ if (time(NULL) > start_time + 2)
-+ {
-+ timed_out = TRUE;
-+ break;
-+ }
-+
- /* Do we need this? Probably not. */
- XSync(dpy, False);
-
-! /* Wait for 1 msec to avoid that we eat up all CPU time. */
-! ui_delay(1L, TRUE);
- }
-
- if (success)
- 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 */
-*** ../vim-7.2.012/src/version.c Sun Sep 7 15:49:45 2008
---- src/version.c Sun Sep 7 21:45:55 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 13,
- /**/
-
---
-The users that I support would double-click on a landmine to find out
-what happens. -- A system administrator
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.014 b/data/vim/patches/7.2.014
deleted file mode 100644
index a03794868..000000000
--- a/data/vim/patches/7.2.014
+++ /dev/null
@@ -1,52 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.014
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.014
-Problem: synstack() doesn't work in an emptly line.
-Solution: Accept column zero as a valid position.
-Files: src/eval.c
-
-
-*** ../vim-7.2.013/src/eval.c Sun Sep 7 13:54:31 2008
---- src/eval.c Sun Sep 7 13:50:38 2008
-***************
-*** 16667,16673 ****
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
-
- if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
-! && 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);
---- 16667,16673 ----
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
-
- if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
-! && 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);
-*** ../vim-7.2.013/src/version.c Sun Sep 7 21:47:51 2008
---- src/version.c Wed Sep 10 15:36:52 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 14,
- /**/
-
---
-Everybody lies, but it doesn't matter since nobody listens.
- -- Lieberman's Law
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.015 b/data/vim/patches/7.2.015
deleted file mode 100644
index e03ac1564..000000000
--- a/data/vim/patches/7.2.015
+++ /dev/null
@@ -1,82 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.015
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.015
-Problem: "make all test install" doesn't stop when the test fails. (Daniel
- Shahaf)
-Solution: When test.log contains failures exit with non-zero status.
-Files: src/testdir/Makefile
-
-
-*** ../vim-7.2.014/src/testdir/Makefile Wed Jun 25 00:22:53 2008
---- src/testdir/Makefile Sun Sep 7 21:31:49 2008
-***************
-*** 26,40 ****
-
- .SUFFIXES: .in .out
-
-! nongui: nolog $(SCRIPTS)
-! @echo
-! @cat test.log
-! @echo ALL DONE
-
-! gui: nolog $(SCRIPTS) $(SCRIPTS_GUI)
- @echo
-! @cat test.log
-! @echo ALL DONE
-
- $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
-
---- 26,42 ----
-
- .SUFFIXES: .in .out
-
-! nongui: nolog $(SCRIPTS) report
-!
-! gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) report
-
-! report:
- @echo
-! @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)
-
-***************
-*** 71,74 ****
- test60.out: test60.vim
-
- nolog:
-! -echo Test results: >test.log
---- 73,76 ----
- test60.out: test60.vim
-
- nolog:
-! -rm -f test.log
-*** ../vim-7.2.014/src/version.c Wed Sep 10 15:38:13 2008
---- src/version.c Wed Sep 10 18:23:38 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 15,
- /**/
-
---
-Light travels faster than sound. This is why some people
-appear bright until you hear them speak
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.016 b/data/vim/patches/7.2.016
deleted file mode 100644
index 03d5207f2..000000000
--- a/data/vim/patches/7.2.016
+++ /dev/null
@@ -1,166 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.016
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.016
-Problem: The pattern being completed may be in freed memory when the
- command line is being reallocated. (Dominique Pelle)
-Solution: Keep a pointer to the expand_T in the command line structure.
- Don't use <S-Tab> as CTRL-P when there are no results. Clear the
- completion when using a command line from the history.
-Files: src/ex_getln.c
-
-
-*** ../vim-7.2.015/src/ex_getln.c Fri Aug 8 12:58:59 2008
---- src/ex_getln.c Wed Sep 10 22:43:41 2008
-***************
-*** 31,36 ****
---- 31,38 ----
- 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 */
-***************
-*** 38,44 ****
- # endif
- };
-
-! static struct cmdline_info ccline; /* current cmdline_info */
-
- static int cmd_showtail; /* Only show path tail in lists ? */
-
---- 40,50 ----
- # endif
- };
-
-! /* 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 ? */
-
-***************
-*** 238,243 ****
---- 244,250 ----
- }
-
- ExpandInit(&xpc);
-+ ccline.xpc = &xpc;
-
- #ifdef FEAT_RIGHTLEFT
- if (curwin->w_p_rl && *curwin->w_p_rlc == 's'
-***************
-*** 408,416 ****
- #endif
-
- /*
-! * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
- */
-! if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)
- c = Ctrl_P;
-
- #ifdef FEAT_WILDMENU
---- 415,424 ----
- #endif
-
- /*
-! * 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 > 0)
- c = Ctrl_P;
-
- #ifdef FEAT_WILDMENU
-***************
-*** 1513,1518 ****
---- 1521,1527 ----
- int old_firstc;
-
- vim_free(ccline.cmdbuff);
-+ xpc.xp_context = EXPAND_NOTHING;
- if (hiscnt == hislen)
- p = lookfor; /* back to the old one */
- else
-***************
-*** 1839,1844 ****
---- 1848,1854 ----
- #endif
-
- ExpandCleanup(&xpc);
-+ ccline.xpc = NULL;
-
- #ifdef FEAT_SEARCH_EXTRA
- if (did_incsearch)
-***************
-*** 2508,2513 ****
---- 2518,2537 ----
- }
- 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 = 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;
- }
-
-***************
-*** 2875,2880 ****
---- 2899,2905 ----
- prev_ccline = ccline;
- ccline.cmdbuff = NULL;
- ccline.cmdprompt = NULL;
-+ ccline.xpc = NULL;
- }
-
- /*
-***************
-*** 3582,3587 ****
---- 3607,3613 ----
- ExpandInit(xp)
- expand_T *xp;
- {
-+ xp->xp_pattern = NULL;
- xp->xp_backslash = XP_BS_NONE;
- #ifndef BACKSLASH_IN_FILENAME
- xp->xp_shell = FALSE;
-*** ../vim-7.2.015/src/version.c Wed Sep 10 18:25:18 2008
---- src/version.c Sun Sep 14 14:38:47 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 16,
- /**/
-
---
-hundred-and-one symptoms of being an internet addict:
-53. To find out what time it is, you send yourself an e-mail and check the
- "Date:" field.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.017 b/data/vim/patches/7.2.017
deleted file mode 100644
index 99979a152..000000000
--- a/data/vim/patches/7.2.017
+++ /dev/null
@@ -1,162 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.017
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.017
-Problem: strlen() used on text that may not end in a NUL. (Dominique Pelle)
- Pasting a very big selection doesn't work.
-Solution: Use the length passed to the XtSelectionCallbackProc() function.
- After getting the SelectionNotify event continue dispatching
- events until the callback is actually called. Also dispatch the
- PropertyNotify event.
-Files: src/ui.c
-
-
-*** ../vim-7.2.016/src/ui.c Sun Sep 7 21:47:51 2008
---- src/ui.c Sun Sep 14 15:52:19 2008
-***************
-*** 2020,2026 ****
-
- if (value == NULL || *length == 0)
- {
-! clip_free_selection(cbd); /* ??? [what's the query?] */
- *(int *)success = FALSE;
- return;
- }
---- 2020,2026 ----
-
- if (value == NULL || *length == 0)
- {
-! clip_free_selection(cbd); /* nothing received, clear register */
- *(int *)success = FALSE;
- return;
- }
-***************
-*** 2076,2082 ****
- text_prop.value = (unsigned char *)value;
- text_prop.encoding = *type;
- text_prop.format = *format;
-! text_prop.nitems = STRLEN(value);
- status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
- &text_list, &n_text);
- if (status != Success || n_text < 1)
---- 2076,2082 ----
- text_prop.value = (unsigned char *)value;
- text_prop.encoding = *type;
- text_prop.format = *format;
-! text_prop.nitems = len;
- status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
- &text_list, &n_text);
- if (status != Success || n_text < 1)
-***************
-*** 2131,2137 ****
- case 3: type = text_atom; break;
- default: type = XA_STRING;
- }
-! success = FALSE;
- XtGetSelectionValue(myShell, cbd->sel_atom, type,
- clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
-
---- 2131,2137 ----
- 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);
-
-***************
-*** 2145,2169 ****
- * paste! Don't worry, we will catch up with any other events later.
- */
- start_time = time(NULL);
-! for (;;)
- {
-! if (XCheckTypedEvent(dpy, SelectionNotify, &event))
- {
-! /* this is where clip_x11_request_selection_cb() is actually
-! * called */
- XtDispatchEvent(&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. */
-- XtDispatchEvent(&event);
-
- /* 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 (by xterm).
-! * Don't know how to avoid that :-(. */
- if (time(NULL) > start_time + 2)
- {
- timed_out = TRUE;
---- 2145,2171 ----
- * paste! Don't worry, we will catch up with any other events later.
- */
- start_time = time(NULL);
-! while (success == MAYBE)
- {
-! 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;
-***************
-*** 2177,2183 ****
- ui_delay(1L, TRUE);
- }
-
-! if (success)
- return;
-
- /* don't do a retry with another type after timing out, otherwise we
---- 2179,2185 ----
- ui_delay(1L, TRUE);
- }
-
-! if (success == TRUE)
- return;
-
- /* don't do a retry with another type after timing out, otherwise we
-*** ../vim-7.2.016/src/version.c Sun Sep 14 14:41:44 2008
---- src/version.c Sun Sep 14 15:55:34 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 17,
- /**/
-
---
-hundred-and-one symptoms of being an internet addict:
-54. You start tilting your head sideways to smile. :-)
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.018 b/data/vim/patches/7.2.018
deleted file mode 100644
index b195f09dc..000000000
--- a/data/vim/patches/7.2.018
+++ /dev/null
@@ -1,45 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.018
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.018
-Problem: Memory leak when substitute is aborted.
-Solution: Free the buffer allocated for the new text. (Dominique Pelle)
-Files: src/ex_cmds.c
-
-
-*** ../vim-7.2.017/src/ex_cmds.c Wed Aug 6 15:03:07 2008
---- src/ex_cmds.c Sun Sep 14 13:45:03 2008
-***************
-*** 5059,5064 ****
---- 5059,5065 ----
-
- 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;
- }
-*** ../vim-7.2.017/src/version.c Sun Sep 14 15:57:54 2008
---- src/version.c Sun Sep 14 21:38:25 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 18,
- /**/
-
---
-hundred-and-one symptoms of being an internet addict:
-55. You ask your doctor to implant a gig in your brain.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.019 b/data/vim/patches/7.2.019
deleted file mode 100644
index 4404bca4f..000000000
--- a/data/vim/patches/7.2.019
+++ /dev/null
@@ -1,65 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.019
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.019
-Problem: Completion of ":noautocmd" doesn't work and exists(":noautocmd")
- returns zero. (Ben Fritz)
-Solution: Add "noautocmd" to the list of modifiers and commands.
-Files: src/ex_cmds.h, src/ex_docmd.c
-
-
-*** ../vim-7.2.018/src/ex_cmds.h Wed Jun 25 00:44:40 2008
---- src/ex_cmds.h Sat Sep 13 18:37:25 2008
-***************
-*** 635,640 ****
---- 635,642 ----
- 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,
-*** ../vim-7.2.018/src/ex_docmd.c Sat Jul 26 16:04:39 2008
---- src/ex_docmd.c Mon Sep 15 20:04:53 2008
-***************
-*** 2978,2983 ****
---- 2979,2985 ----
- {"keepmarks", 3, FALSE},
- {"leftabove", 5, FALSE},
- {"lockmarks", 3, FALSE},
-+ {"noautocmd", 3, FALSE},
- {"rightbelow", 6, FALSE},
- {"sandbox", 3, FALSE},
- {"silent", 3, FALSE},
-*** ../vim-7.2.018/src/version.c Sun Sep 14 21:40:26 2008
---- src/version.c Thu Sep 18 12:39:56 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 19,
- /**/
-
---
-Proof techniques #2: Proof by Oddity.
- SAMPLE: To prove that horses have an infinite number of legs.
-(1) Horses have an even number of legs.
-(2) They have two legs in back and fore legs in front.
-(3) This makes a total of six legs, which certainly is an odd number of
- legs for a horse.
-(4) But the only number that is both odd and even is infinity.
-(5) Therefore, horses must have an infinite number of legs.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.020 b/data/vim/patches/7.2.020
deleted file mode 100644
index fb290407f..000000000
--- a/data/vim/patches/7.2.020
+++ /dev/null
@@ -1,54 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.020
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.020
-Problem: Starting the GUI when the executable starts with 'k', but the KDE
- version no longer exists.
-Solution: Don't have "kvim" start the GUI.
-Files: src/main.c
-
-
-*** ../vim-7.2.019/src/main.c Thu Jul 24 19:34:23 2008
---- src/main.c Sun Sep 14 13:26:10 2008
-***************
-*** 1457,1463 ****
- ++initstr;
- }
-
-! if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k')
- {
- main_start_gui();
- #ifdef FEAT_GUI
---- 1458,1465 ----
- ++initstr;
- }
-
-! /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */
-! if (TOLOWER_ASC(initstr[0]) == 'g')
- {
- main_start_gui();
- #ifdef FEAT_GUI
-*** ../vim-7.2.019/src/version.c Thu Sep 18 12:43:21 2008
---- src/version.c Thu Sep 18 20:54:10 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 20,
- /**/
-
---
-hundred-and-one symptoms of being an internet addict:
-90. Instead of calling you to dinner, your spouse sends e-mail.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.021 b/data/vim/patches/7.2.021
deleted file mode 100644
index fee0bd85c..000000000
--- a/data/vim/patches/7.2.021
+++ /dev/null
@@ -1,147 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.021
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.021
-Problem: When executing autocommands getting the full file name may be
- slow. (David Kotchan)
-Solution: Postpone calling FullName_save() until autocmd_fname is used.
-Files: src/ex_docmd.c, src/fileio.c, src/globals.h
-
-
-*** ../vim-7.2.020/src/ex_docmd.c Thu Sep 18 12:43:21 2008
---- src/ex_docmd.c Mon Sep 15 20:04:53 2008
-***************
-*** 9542,9547 ****
---- 9569,9583 ----
- #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>\"");
-*** ../vim-7.2.020/src/fileio.c Wed Aug 6 18:43:07 2008
---- src/fileio.c Tue Sep 16 21:24:26 2008
-***************
-*** 8523,8528 ****
---- 8523,8529 ----
- 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;
-***************
-*** 8601,8606 ****
---- 8602,8608 ----
- * 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;
-***************
-*** 8618,8631 ****
- if (fname != NULL && *fname != NUL)
- autocmd_fname = fname;
- else if (buf != NULL)
-! autocmd_fname = buf->b_fname;
- else
- autocmd_fname = NULL;
- }
- else
- autocmd_fname = fname_io;
- if (autocmd_fname != NULL)
-! autocmd_fname = FullName_save(autocmd_fname, FALSE);
-
- /*
- * Set the buffer number to be used for <abuf>.
---- 8620,8634 ----
- if (fname != NULL && *fname != NUL)
- autocmd_fname = fname;
- else if (buf != NULL)
-! autocmd_fname = buf->b_ffname;
- else
- autocmd_fname = NULL;
- }
- else
- autocmd_fname = fname_io;
- if (autocmd_fname != NULL)
-! autocmd_fname = vim_strsave(autocmd_fname);
-! autocmd_fname_full = FALSE; /* call FullName_save() later */
-
- /*
- * Set the buffer number to be used for <abuf>.
-***************
-*** 8810,8815 ****
---- 8813,8819 ----
- 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
-***************
-*** 8918,8924 ****
- {
- apc->curpat = NULL;
-
-! /* 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
---- 8922,8928 ----
- {
- apc->curpat = NULL;
-
-! /* 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
-*** ../vim-7.2.020/src/globals.h Sat Jul 26 16:04:49 2008
---- src/globals.h Mon Sep 15 19:59:28 2008
-***************
-*** 1022,1027 ****
---- 1022,1028 ----
- #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 */
-*** ../vim-7.2.020/src/version.c Thu Sep 18 20:55:19 2008
---- src/version.c Thu Sep 18 21:24:30 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 21,
- /**/
-
---
-From "know your smileys":
- :----} You lie like Pinocchio
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/7.2.022 b/data/vim/patches/7.2.022
deleted file mode 100644
index 392773523..000000000
--- a/data/vim/patches/7.2.022
+++ /dev/null
@@ -1,140 +0,0 @@
-To: vim-dev@vim.org
-Subject: Patch 7.2.022 (extra)
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=ISO-8859-1
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.022 (extra)
-Problem: Testing is not possible when compiling with MingW.
-Solution: Add a MingW specific test Makefile. (Bill McCarthy)
-Files: Filelist, src/testdir/Make_ming.mak
-
-
-*** ../vim-7.2.021/Filelist Sun Jul 13 19:33:31 2008
---- Filelist Sun Sep 14 21:47:01 2008
-***************
-*** 285,290 ****
---- 285,291 ----
- 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 \
-*** ../vim-7.2.021/src/testdir/Make_ming.mak Sat Sep 20 16:25:06 2008
---- src/testdir/Make_ming.mak Sat Sep 20 16:25:58 2008
-***************
-*** 0 ****
---- 1,91 ----
-+ # 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.
-+
-+ ifneq (sh.exe, $(SHELL))
-+ DEL = rm -f
-+ MV = mv
-+ CP = cp
-+ DIRSLASH = /
-+ else
-+ DEL = del
-+ MV = rename
-+ CP = copy
-+ DIRSLASH = \\
-+ endif
-+
-+ VIMPROG = ..$(DIRSLASH)vim
-+
-+ # 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
-+
-+ SCRIPTS32 = test50.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) 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
-*** ../vim-7.2.021/src/version.c Thu Sep 18 21:29:07 2008
---- src/version.c Sat Sep 20 16:25:16 2008
-***************
-*** 678,679 ****
---- 678,681 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 22,
- /**/
-
---
-Where do you want to crash today?
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ download, build and distribute -- http://www.A-A-P.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0002 b/data/vim/patches/8.1.0002
new file mode 100644
index 000000000..1584c3080
--- /dev/null
+++ b/data/vim/patches/8.1.0002
@@ -0,0 +1,84 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0002
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0002
+Problem: :stopinsert changes the message position.
+Solution: Save and restore msg_col and msg_row in clearmode(). (Jason
+ Franklin)
+Files: src/screen.c, src/testdir/test_messages.vim
+
+
+*** ../vim-8.1.0001/src/screen.c 2018-05-11 21:59:36.000000000 +0200
+--- src/screen.c 2018-05-19 14:33:04.359236642 +0200
+***************
+*** 10485,10494 ****
+--- 10485,10500 ----
+ void
+ clearmode(void)
+ {
++ int save_msg_row = msg_row;
++ int save_msg_col = msg_col;
++
+ msg_pos_mode();
+ if (Recording)
+ recording_mode(HL_ATTR(HLF_CM));
+ msg_clr_eos();
++
++ msg_col = save_msg_col;
++ msg_row = save_msg_row;
+ }
+
+ static void
+*** ../vim-8.1.0001/src/testdir/test_messages.vim 2017-03-16 18:28:30.000000000 +0100
+--- src/testdir/test_messages.vim 2018-05-19 14:23:02.298669402 +0200
+***************
+*** 38,40 ****
+--- 38,61 ----
+ let &more = oldmore
+ endtry
+ endfunction
++
++ " Patch 7.4.1696 defined the "clearmode()" command for clearing the mode
++ " indicator (e.g., "-- INSERT --") when ":stopinsert" is invoked. Message
++ " output could then be disturbed when 'cmdheight' was greater than one.
++ " This test ensures that the bugfix for this issue remains in place.
++ function! Test_stopinsert_does_not_break_message_output()
++ set cmdheight=2
++ redraw!
++
++ stopinsert | echo 'test echo'
++ call assert_equal(116, screenchar(&lines - 1, 1))
++ call assert_equal(32, screenchar(&lines, 1))
++ redraw!
++
++ stopinsert | echomsg 'test echomsg'
++ call assert_equal(116, screenchar(&lines - 1, 1))
++ call assert_equal(32, screenchar(&lines, 1))
++ redraw!
++
++ set cmdheight&
++ endfunction
+*** ../vim-8.1.0001/src/version.c 2018-05-17 23:34:37.427631392 +0200
+--- src/version.c 2018-05-19 14:24:40.646043654 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 2,
+ /**/
+
+--
+Wi n0t trei a h0liday in Sweden thi yer?
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0003 b/data/vim/patches/8.1.0003
new file mode 100644
index 000000000..e8dd64546
--- /dev/null
+++ b/data/vim/patches/8.1.0003
@@ -0,0 +1,116 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0003
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0003
+Problem: The :compiler command is not tested.
+Solution: Add a test. (Dominique Pelle, closes #2930)
+Files: src/Makefile, src/testdir/test_alot.vim,
+ src/testdir/test_compiler.vim
+
+
+*** ../vim-8.1.0002/src/Makefile 2018-05-17 15:34:28.000000000 +0200
+--- src/Makefile 2018-05-19 14:57:04.670463659 +0200
+***************
+*** 2150,2155 ****
+--- 2150,2156 ----
+ test_cmdline \
+ test_command_count \
+ test_comparators \
++ test_compiler \
+ test_crypt \
+ test_cscope \
+ test_cursor_func \
+*** ../vim-8.1.0002/src/testdir/test_alot.vim 2017-10-29 15:08:48.000000000 +0100
+--- src/testdir/test_alot.vim 2018-05-19 14:57:04.670463659 +0200
+***************
+*** 5,10 ****
+--- 5,11 ----
+ source test_bufline.vim
+ source test_cd.vim
+ source test_changedtick.vim
++ source test_compiler.vim
+ source test_cursor_func.vim
+ source test_delete.vim
+ source test_ex_undo.vim
+*** ../vim-8.1.0002/src/testdir/test_compiler.vim 2018-05-19 15:00:23.281190298 +0200
+--- src/testdir/test_compiler.vim 2018-05-19 14:57:04.670463659 +0200
+***************
+*** 0 ****
+--- 1,50 ----
++ " Test the :compiler command
++
++ func Test_compiler()
++ if !executable('perl')
++ return
++ endif
++
++ e Xfoo.pl
++ compiler perl
++ call assert_equal('perl', b:current_compiler)
++ call assert_fails('let g:current_compiler', 'E121:')
++
++ call setline(1, ['#!/usr/bin/perl -w', 'use strict;', 'my $foo=1'])
++ w!
++ call feedkeys(":make\<CR>\<CR>", 'tx')
++ call assert_fails('clist', 'E42:')
++
++ call setline(1, ['#!/usr/bin/perl -w', 'use strict;', '$foo=1'])
++ w!
++ call feedkeys(":make\<CR>\<CR>", 'tx')
++ let a=execute('clist')
++ call assert_equal("\n 1 Xfoo.pl:3: Global symbol \"\$foo\" "
++ \ . "requires explicit package name "
++ \ . "(did you forget to declare \"my $foo\"?)", a)
++
++ call delete('Xfoo.pl')
++ bw!
++ endfunc
++
++ func Test_compiler_without_arg()
++ let a=split(execute('compiler'))
++ call assert_equal($VIMRUNTIME . '/compiler/ant.vim', a[0])
++ call assert_equal($VIMRUNTIME . '/compiler/bcc.vim', a[1])
++ call assert_equal($VIMRUNTIME . '/compiler/xmlwf.vim', a[-1])
++ endfunc
++
++ func Test_compiler_completion()
++ call feedkeys(":compiler \<C-A>\<C-B>\"\<CR>", 'tx')
++ call assert_match('^"compiler ant bcc .* xmlwf$', @:)
++
++ call feedkeys(":compiler p\<C-A>\<C-B>\"\<CR>", 'tx')
++ call assert_equal('"compiler pbx perl php pylint pyunit', @:)
++
++ call feedkeys(":compiler! p\<C-A>\<C-B>\"\<CR>", 'tx')
++ call assert_equal('"compiler! pbx perl php pylint pyunit', @:)
++ endfunc
++
++ func Test_compiler_error()
++ call assert_fails('compiler doesnotexist', 'E666:')
++ endfunc
+*** ../vim-8.1.0002/src/version.c 2018-05-19 14:43:26.779509715 +0200
+--- src/version.c 2018-05-19 14:58:56.017772272 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 3,
+ /**/
+
+--
+The Characters and incidents portrayed and the names used are fictitious and
+any similarity to the names, characters, or history of any person is entirely
+accidental and unintentional.
+ Signed RICHARD M. NIXON
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0004 b/data/vim/patches/8.1.0004
new file mode 100644
index 000000000..7d970899c
--- /dev/null
+++ b/data/vim/patches/8.1.0004
@@ -0,0 +1,54 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0004
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0004
+Problem: Test for :compiler command sometimes fails.
+Solution: Be less strict about the error message. (Dominique Pelle)
+Files: src/testdir/test_compiler.vim
+
+
+*** ../vim-8.1.0003/src/testdir/test_compiler.vim 2018-05-19 15:00:48.841017887 +0200
+--- src/testdir/test_compiler.vim 2018-05-19 15:47:59.785667252 +0200
+***************
+*** 19,27 ****
+ w!
+ call feedkeys(":make\<CR>\<CR>", 'tx')
+ let a=execute('clist')
+! call assert_equal("\n 1 Xfoo.pl:3: Global symbol \"\$foo\" "
+! \ . "requires explicit package name "
+! \ . "(did you forget to declare \"my $foo\"?)", a)
+
+ call delete('Xfoo.pl')
+ bw!
+--- 19,26 ----
+ w!
+ call feedkeys(":make\<CR>\<CR>", 'tx')
+ let a=execute('clist')
+! call assert_match("\n 1 Xfoo.pl:3: Global symbol \"\$foo\" "
+! \ . "requires explicit package name", a)
+
+ call delete('Xfoo.pl')
+ bw!
+*** ../vim-8.1.0003/src/version.c 2018-05-19 15:00:48.841017887 +0200
+--- src/version.c 2018-05-19 15:51:02.132530786 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 4,
+ /**/
+
+--
+This message contains 78% recycled characters.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0005 b/data/vim/patches/8.1.0005
new file mode 100644
index 000000000..54e05f1b8
--- /dev/null
+++ b/data/vim/patches/8.1.0005
@@ -0,0 +1,55 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0005
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0005
+Problem: Test for :compiler command fails on MS-Windows.
+Solution: Ignore difference in path.
+Files: src/testdir/test_compiler.vim
+
+
+*** ../vim-8.1.0004/src/testdir/test_compiler.vim 2018-05-19 15:52:08.080147738 +0200
+--- src/testdir/test_compiler.vim 2018-05-19 16:43:40.978098419 +0200
+***************
+*** 28,36 ****
+
+ func Test_compiler_without_arg()
+ let a=split(execute('compiler'))
+! call assert_equal($VIMRUNTIME . '/compiler/ant.vim', a[0])
+! call assert_equal($VIMRUNTIME . '/compiler/bcc.vim', a[1])
+! call assert_equal($VIMRUNTIME . '/compiler/xmlwf.vim', a[-1])
+ endfunc
+
+ func Test_compiler_completion()
+--- 28,36 ----
+
+ func Test_compiler_without_arg()
+ let a=split(execute('compiler'))
+! call assert_match('^.*runtime/compiler/ant.vim$', a[0])
+! call assert_match('^.*runtime/compiler/bcc.vim$', a[1])
+! call assert_match('^.*runtime/compiler/xmlwf.vim$', a[-1])
+ endfunc
+
+ func Test_compiler_completion()
+*** ../vim-8.1.0004/src/version.c 2018-05-19 15:52:08.084147716 +0200
+--- src/version.c 2018-05-19 16:44:18.851652336 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 5,
+ /**/
+
+--
+To keep milk from turning sour: Keep it in the cow.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0006 b/data/vim/patches/8.1.0006
new file mode 100644
index 000000000..4e22ca8f4
--- /dev/null
+++ b/data/vim/patches/8.1.0006
@@ -0,0 +1,56 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0006
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0006
+Problem: syn_id2cterm_bg() may be undefined. (Axel Bender)
+Solution: Adjust #ifdef.
+Files: src/syntax.c
+
+
+*** ../vim-8.1.0005/src/syntax.c 2018-04-30 15:12:37.000000000 +0200
+--- src/syntax.c 2018-05-20 13:33:20.830017598 +0200
+***************
+*** 9854,9860 ****
+ }
+ #endif
+
+! #if defined(FEAT_TERMINAL) || defined(PROTO)
+ void
+ syn_id2cterm_bg(int hl_id, int *fgp, int *bgp)
+ {
+--- 9854,9862 ----
+ }
+ #endif
+
+! #if (defined(WIN3264) \
+! && !defined(FEAT_GUI_W32) \
+! && defined(FEAT_TERMGUICOLORS)) || defined(PROTO)
+ void
+ syn_id2cterm_bg(int hl_id, int *fgp, int *bgp)
+ {
+*** ../vim-8.1.0005/src/version.c 2018-05-19 16:45:12.346716042 +0200
+--- src/version.c 2018-05-20 13:33:40.345133373 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 6,
+ /**/
+
+--
+SUPERIMPOSE "England AD 787". After a few more seconds we hear hoofbeats in
+the distance. They come slowly closer. Then out of the mist comes KING
+ARTHUR followed by a SERVANT who is banging two half coconuts together.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0007 b/data/vim/patches/8.1.0007
new file mode 100644
index 000000000..aaff80b09
--- /dev/null
+++ b/data/vim/patches/8.1.0007
@@ -0,0 +1,65 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0007
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0007
+Problem: No test for "o" and "O" in Visual block mode.
+Solution: Add a test. (Dominique Pelle, closes #2932)
+Files: src/testdir/test_visual.vim
+
+
+*** ../vim-8.1.0006/src/testdir/test_visual.vim 2018-03-06 14:18:55.000000000 +0100
+--- src/testdir/test_visual.vim 2018-05-20 14:05:02.489093403 +0200
+***************
+*** 155,160 ****
+--- 155,179 ----
+ enew!
+ endfunc
+
++ " Test swapping corners in blockwise visual mode with o and O
++ func Test_blockwise_visual_o_O()
++ enew!
++
++ exe "norm! 10i.\<Esc>Y4P3lj\<C-V>4l2jr "
++ exe "norm! gvO\<Esc>ra"
++ exe "norm! gvO\<Esc>rb"
++ exe "norm! gvo\<C-c>rc"
++ exe "norm! gvO\<C-c>rd"
++
++ call assert_equal(['..........',
++ \ '...c d..',
++ \ '... ..',
++ \ '...a b..',
++ \ '..........'], getline(1, '$'))
++
++ enew!
++ endfun
++
+ " Test Virtual replace mode.
+ func Test_virtual_replace()
+ if exists('&t_kD')
+*** ../vim-8.1.0006/src/version.c 2018-05-20 13:35:40.193163458 +0200
+--- src/version.c 2018-05-20 14:05:52.113562894 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 7,
+ /**/
+
+--
+SOLDIER: Where did you get the coconuts?
+ARTHUR: Through ... We found them.
+SOLDIER: Found them? In Mercea. The coconut's tropical!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0008 b/data/vim/patches/8.1.0008
new file mode 100644
index 000000000..98c193276
--- /dev/null
+++ b/data/vim/patches/8.1.0008
@@ -0,0 +1,71 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0008
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0008
+Problem: No test for strwidth().
+Solution: Add a test. (Dominique Pelle, closes #2931)
+Files: src/testdir/test_functions.vim
+
+
+*** ../vim-8.1.0007/src/testdir/test_functions.vim 2018-03-22 22:48:20.000000000 +0100
+--- src/testdir/test_functions.vim 2018-05-20 14:09:31.346367348 +0200
+***************
+*** 96,101 ****
+--- 96,125 ----
+ call assert_fails('call min(v:none)', 'E712:')
+ endfunc
+
++ func Test_strwidth()
++ for aw in ['single', 'double']
++ exe 'set ambiwidth=' . aw
++ call assert_equal(0, strwidth(''))
++ call assert_equal(1, strwidth("\t"))
++ call assert_equal(3, strwidth('Vim'))
++ call assert_equal(4, strwidth(1234))
++ call assert_equal(5, strwidth(-1234))
++
++ if has('multi_byte')
++ call assert_equal(2, strwidth('😉'))
++ call assert_equal(17, strwidth('EÄ¥oÅanÄo ĉiuĵaÅ­de'))
++ call assert_equal((aw == 'single') ? 6 : 7, strwidth('Straße'))
++ endif
++
++ call assert_fails('call strwidth({->0})', 'E729:')
++ call assert_fails('call strwidth([])', 'E730:')
++ call assert_fails('call strwidth({})', 'E731:')
++ call assert_fails('call strwidth(1.2)', 'E806:')
++ endfor
++
++ set ambiwidth&
++ endfunc
++
+ func Test_str2nr()
+ call assert_equal(0, str2nr(''))
+ call assert_equal(1, str2nr('1'))
+*** ../vim-8.1.0007/src/version.c 2018-05-20 14:06:34.506186527 +0200
+--- src/version.c 2018-05-20 14:10:31.208184912 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 8,
+ /**/
+
+--
+ARTHUR: The swallow may fly south with the sun, or the house martin or the
+ plover seek warmer hot lands in winter, yet these are not strangers to
+ our land.
+SOLDIER: Are you suggesting coconuts migrate?
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0009 b/data/vim/patches/8.1.0009
new file mode 100644
index 000000000..aef38ee84
--- /dev/null
+++ b/data/vim/patches/8.1.0009
@@ -0,0 +1,102 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0009
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0009
+Problem: Tabpages insufficiently tested.
+Solution: Add more test coverage. (Dominique Pelle, closes #2934)
+Files: src/testdir/test_tabpage.vim
+
+
+*** ../vim-8.1.0008/src/testdir/test_tabpage.vim 2018-02-12 21:49:22.000000000 +0100
+--- src/testdir/test_tabpage.vim 2018-05-20 14:55:02.425998478 +0200
+***************
+*** 1,5 ****
+--- 1,6 ----
+ " Tests for tabpage
+
++
+ function Test_tabpage()
+ bw!
+ " Simple test for opening and closing a tab page
+***************
+*** 317,322 ****
+--- 318,351 ----
+ endfor
+ endfunc
+
++ func Test_tabpage_ctrl_pgup_pgdown()
++ enew!
++ tabnew tab1
++ tabnew tab2
++
++ call assert_equal(3, tabpagenr())
++ exe "norm! \<C-PageUp>"
++ call assert_equal(2, tabpagenr())
++ exe "norm! \<C-PageDown>"
++ call assert_equal(3, tabpagenr())
++
++ " Check wrapping at last or first page.
++ exe "norm! \<C-PageDown>"
++ call assert_equal(1, tabpagenr())
++ exe "norm! \<C-PageUp>"
++ call assert_equal(3, tabpagenr())
++
++ " With a count, <C-PageUp> and <C-PageDown> are not symmetrical somehow:
++ " - {count}<C-PageUp> goes {count} pages downward (relative count)
++ " - {count}<C-PageDown> goes to page number {count} (absolute count)
++ exe "norm! 2\<C-PageUp>"
++ call assert_equal(1, tabpagenr())
++ exe "norm! 2\<C-PageDown>"
++ call assert_equal(2, tabpagenr())
++
++ 1tabonly!
++ endfunc
++
+ " Test for [count] of tabclose
+ function Test_tabpage_with_tabclose()
+
+***************
+*** 491,494 ****
+--- 520,537 ----
+ buf Xtest
+ endfunc
+
++ func Test_tabs()
++ enew!
++ tabnew tab1
++ norm ixxx
++ let a=split(execute(':tabs'), "\n")
++ call assert_equal(['Tab page 1',
++ \ ' [No Name]',
++ \ 'Tab page 2',
++ \ '> + tab1'], a)
++
++ 1tabonly!
++ bw!
++ endfunc
++
+ " vim: shiftwidth=2 sts=2 expandtab
+*** ../vim-8.1.0008/src/version.c 2018-05-20 14:11:07.125342749 +0200
+--- src/version.c 2018-05-20 14:56:27.560347600 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 9,
+ /**/
+
+--
+Clothes make the man. Naked people have little or no influence on society.
+ -- Mark Twain (Samuel Clemens) (1835-1910)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0010 b/data/vim/patches/8.1.0010
new file mode 100644
index 000000000..9df182cc9
--- /dev/null
+++ b/data/vim/patches/8.1.0010
@@ -0,0 +1,381 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0010
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0010
+Problem: efm_to_regpat() is too long.
+Solution: Split off three functions. (Yegappan Lakshmanan, closes #2924)
+Files: src/quickfix.c
+
+
+*** ../vim-8.1.0009/src/quickfix.c 2018-05-15 21:53:11.000000000 +0200
+--- src/quickfix.c 2018-05-20 15:40:22.857179812 +0200
+***************
+*** 228,246 ****
+ };
+
+ /*
+ * Converts a 'errorformat' string to regular expression pattern
+ */
+ static int
+ efm_to_regpat(
+ char_u *efm,
+! int len,
+ efm_T *fmt_ptr,
+ char_u *regpat,
+ char_u *errmsg)
+ {
+ char_u *ptr;
+ char_u *efmp;
+- char_u *srcptr;
+ int round;
+ int idx = 0;
+
+--- 228,399 ----
+ };
+
+ /*
++ * Convert an errorformat pattern to a regular expression pattern.
++ * See fmt_pat definition above for the list of supported patterns.
++ */
++ static char_u *
++ fmtpat_to_regpat(
++ char_u *efmp,
++ efm_T *fmt_ptr,
++ int idx,
++ int round,
++ char_u *ptr,
++ char_u *errmsg)
++ {
++ char_u *srcptr;
++
++ if (fmt_ptr->addr[idx])
++ {
++ /* Each errorformat pattern can occur only once */
++ sprintf((char *)errmsg,
++ _("E372: Too many %%%c in format string"), *efmp);
++ EMSG(errmsg);
++ return NULL;
++ }
++ if ((idx && idx < 6
++ && vim_strchr((char_u *)"DXOPQ", fmt_ptr->prefix) != NULL)
++ || (idx == 6
++ && vim_strchr((char_u *)"OPQ", fmt_ptr->prefix) == NULL))
++ {
++ sprintf((char *)errmsg,
++ _("E373: Unexpected %%%c in format string"), *efmp);
++ EMSG(errmsg);
++ return NULL;
++ }
++ fmt_ptr->addr[idx] = (char_u)++round;
++ *ptr++ = '\\';
++ *ptr++ = '(';
++ #ifdef BACKSLASH_IN_FILENAME
++ if (*efmp == 'f')
++ {
++ /* Also match "c:" in the file name, even when
++ * checking for a colon next: "%f:".
++ * "\%(\a:\)\=" */
++ STRCPY(ptr, "\\%(\\a:\\)\\=");
++ ptr += 10;
++ }
++ #endif
++ if (*efmp == 'f' && efmp[1] != NUL)
++ {
++ if (efmp[1] != '\\' && efmp[1] != '%')
++ {
++ /* A file name may contain spaces, but this isn't
++ * in "\f". For "%f:%l:%m" there may be a ":" in
++ * the file name. Use ".\{-1,}x" instead (x is
++ * the next character), the requirement that :999:
++ * follows should work. */
++ STRCPY(ptr, ".\\{-1,}");
++ ptr += 7;
++ }
++ else
++ {
++ /* File name followed by '\\' or '%': include as
++ * many file name chars as possible. */
++ STRCPY(ptr, "\\f\\+");
++ ptr += 4;
++ }
++ }
++ else
++ {
++ srcptr = (char_u *)fmt_pat[idx].pattern;
++ while ((*ptr = *srcptr++) != NUL)
++ ++ptr;
++ }
++ *ptr++ = '\\';
++ *ptr++ = ')';
++
++ return ptr;
++ }
++
++ /*
++ * Convert a scanf like format in 'errorformat' to a regular expression.
++ */
++ static char_u *
++ scanf_fmt_to_regpat(
++ char_u *efm,
++ int len,
++ char_u **pefmp,
++ char_u *ptr,
++ char_u *errmsg)
++ {
++ char_u *efmp = *pefmp;
++
++ if (*++efmp == '[' || *efmp == '\\')
++ {
++ if ((*ptr++ = *efmp) == '[') /* %*[^a-z0-9] etc. */
++ {
++ if (efmp[1] == '^')
++ *ptr++ = *++efmp;
++ if (efmp < efm + len)
++ {
++ *ptr++ = *++efmp; /* could be ']' */
++ while (efmp < efm + len
++ && (*ptr++ = *++efmp) != ']')
++ /* skip */;
++ if (efmp == efm + len)
++ {
++ EMSG(_("E374: Missing ] in format string"));
++ return NULL;
++ }
++ }
++ }
++ else if (efmp < efm + len) /* %*\D, %*\s etc. */
++ *ptr++ = *++efmp;
++ *ptr++ = '\\';
++ *ptr++ = '+';
++ }
++ else
++ {
++ /* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */
++ sprintf((char *)errmsg,
++ _("E375: Unsupported %%%c in format string"), *efmp);
++ EMSG(errmsg);
++ return NULL;
++ }
++
++ *pefmp = efmp;
++
++ return ptr;
++ }
++
++ /*
++ * Analyze/parse an errorformat prefix.
++ */
++ static int
++ efm_analyze_prefix(char_u **pefmp, efm_T *fmt_ptr, char_u *errmsg)
++ {
++ char_u *efmp = *pefmp;
++
++ if (vim_strchr((char_u *)"+-", *efmp) != NULL)
++ fmt_ptr->flags = *efmp++;
++ if (vim_strchr((char_u *)"DXAEWICZGOPQ", *efmp) != NULL)
++ fmt_ptr->prefix = *efmp;
++ else
++ {
++ sprintf((char *)errmsg,
++ _("E376: Invalid %%%c in format string prefix"), *efmp);
++ EMSG(errmsg);
++ return FAIL;
++ }
++
++ *pefmp = efmp;
++
++ return OK;
++ }
++
++ /*
+ * Converts a 'errorformat' string to regular expression pattern
+ */
+ static int
+ efm_to_regpat(
+ char_u *efm,
+! int len,
+ efm_T *fmt_ptr,
+ char_u *regpat,
+ char_u *errmsg)
+ {
+ char_u *ptr;
+ char_u *efmp;
+ int round;
+ int idx = 0;
+
+***************
+*** 260,361 ****
+ break;
+ if (idx < FMT_PATTERNS)
+ {
+! if (fmt_ptr->addr[idx])
+! {
+! sprintf((char *)errmsg,
+! _("E372: Too many %%%c in format string"), *efmp);
+! EMSG(errmsg);
+! return -1;
+! }
+! if ((idx
+! && idx < 6
+! && vim_strchr((char_u *)"DXOPQ",
+! fmt_ptr->prefix) != NULL)
+! || (idx == 6
+! && vim_strchr((char_u *)"OPQ",
+! fmt_ptr->prefix) == NULL))
+! {
+! sprintf((char *)errmsg,
+! _("E373: Unexpected %%%c in format string"), *efmp);
+! EMSG(errmsg);
+ return -1;
+! }
+! fmt_ptr->addr[idx] = (char_u)++round;
+! *ptr++ = '\\';
+! *ptr++ = '(';
+! #ifdef BACKSLASH_IN_FILENAME
+! if (*efmp == 'f')
+! {
+! /* Also match "c:" in the file name, even when
+! * checking for a colon next: "%f:".
+! * "\%(\a:\)\=" */
+! STRCPY(ptr, "\\%(\\a:\\)\\=");
+! ptr += 10;
+! }
+! #endif
+! if (*efmp == 'f' && efmp[1] != NUL)
+! {
+! if (efmp[1] != '\\' && efmp[1] != '%')
+! {
+! /* A file name may contain spaces, but this isn't
+! * in "\f". For "%f:%l:%m" there may be a ":" in
+! * the file name. Use ".\{-1,}x" instead (x is
+! * the next character), the requirement that :999:
+! * follows should work. */
+! STRCPY(ptr, ".\\{-1,}");
+! ptr += 7;
+! }
+! else
+! {
+! /* File name followed by '\\' or '%': include as
+! * many file name chars as possible. */
+! STRCPY(ptr, "\\f\\+");
+! ptr += 4;
+! }
+! }
+! else
+! {
+! srcptr = (char_u *)fmt_pat[idx].pattern;
+! while ((*ptr = *srcptr++) != NUL)
+! ++ptr;
+! }
+! *ptr++ = '\\';
+! *ptr++ = ')';
+ }
+ else if (*efmp == '*')
+ {
+! if (*++efmp == '[' || *efmp == '\\')
+! {
+! if ((*ptr++ = *efmp) == '[') /* %*[^a-z0-9] etc. */
+! {
+! if (efmp[1] == '^')
+! *ptr++ = *++efmp;
+! if (efmp < efm + len)
+! {
+! *ptr++ = *++efmp; /* could be ']' */
+! while (efmp < efm + len
+! && (*ptr++ = *++efmp) != ']')
+! /* skip */;
+! if (efmp == efm + len)
+! {
+! EMSG(_("E374: Missing ] in format string"));
+! return -1;
+! }
+! }
+! }
+! else if (efmp < efm + len) /* %*\D, %*\s etc. */
+! *ptr++ = *++efmp;
+! *ptr++ = '\\';
+! *ptr++ = '+';
+! }
+! else
+! {
+! /* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */
+! sprintf((char *)errmsg,
+! _("E375: Unsupported %%%c in format string"), *efmp);
+! EMSG(errmsg);
+ return -1;
+- }
+ }
+ else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
+ *ptr++ = *efmp; /* regexp magic characters */
+--- 413,429 ----
+ break;
+ if (idx < FMT_PATTERNS)
+ {
+! ptr = fmtpat_to_regpat(efmp, fmt_ptr, idx, round, ptr,
+! errmsg);
+! if (ptr == NULL)
+ return -1;
+! round++;
+ }
+ else if (*efmp == '*')
+ {
+! ptr = scanf_fmt_to_regpat(efm, len, &efmp, ptr, errmsg);
+! if (ptr == NULL)
+ return -1;
+ }
+ else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
+ *ptr++ = *efmp; /* regexp magic characters */
+***************
+*** 365,381 ****
+ fmt_ptr->conthere = TRUE;
+ else if (efmp == efm + 1) /* analyse prefix */
+ {
+! if (vim_strchr((char_u *)"+-", *efmp) != NULL)
+! fmt_ptr->flags = *efmp++;
+! if (vim_strchr((char_u *)"DXAEWICZGOPQ", *efmp) != NULL)
+! fmt_ptr->prefix = *efmp;
+! else
+! {
+! sprintf((char *)errmsg,
+! _("E376: Invalid %%%c in format string prefix"), *efmp);
+! EMSG(errmsg);
+ return -1;
+- }
+ }
+ else
+ {
+--- 433,440 ----
+ fmt_ptr->conthere = TRUE;
+ else if (efmp == efm + 1) /* analyse prefix */
+ {
+! if (efm_analyze_prefix(&efmp, fmt_ptr, errmsg) == FAIL)
+ return -1;
+ }
+ else
+ {
+*** ../vim-8.1.0009/src/version.c 2018-05-20 14:57:19.121429579 +0200
+--- src/version.c 2018-05-20 15:37:57.138956740 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 10,
+ /**/
+
+--
+SECOND SOLDIER: It could be carried by an African swallow!
+FIRST SOLDIER: Oh yes! An African swallow maybe ... but not a European
+ swallow. that's my point.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0011 b/data/vim/patches/8.1.0011
new file mode 100644
index 000000000..e767ad96d
--- /dev/null
+++ b/data/vim/patches/8.1.0011
@@ -0,0 +1,85 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0011
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0011
+Problem: maparg() and mapcheck() confuse empty and non-existing.
+Solution: Return <Nop> for an existing non-empty mapping. (closes #2940)
+Files: src/evalfunc.c, src/testdir/test_maparg.vim
+
+
+*** ../vim-8.1.0010/src/evalfunc.c 2018-05-13 15:23:25.000000000 +0200
+--- src/evalfunc.c 2018-05-21 13:16:25.980369218 +0200
+***************
+*** 7383,7389 ****
+ {
+ /* Return a string. */
+ if (rhs != NULL)
+! rettv->vval.v_string = str2special_save(rhs, FALSE);
+
+ }
+ else if (rettv_dict_alloc(rettv) != FAIL && rhs != NULL)
+--- 7383,7394 ----
+ {
+ /* Return a string. */
+ if (rhs != NULL)
+! {
+! if (*rhs == NUL)
+! rettv->vval.v_string = vim_strsave((char_u *)"<Nop>");
+! else
+! rettv->vval.v_string = str2special_save(rhs, FALSE);
+! }
+
+ }
+ else if (rettv_dict_alloc(rettv) != FAIL && rhs != NULL)
+*** ../vim-8.1.0010/src/testdir/test_maparg.vim 2017-07-11 21:35:19.000000000 +0200
+--- src/testdir/test_maparg.vim 2018-05-21 13:23:58.341721377 +0200
+***************
+*** 29,37 ****
+ \ maparg('foo', '', 0, 1))
+
+ map abc x<char-114>x
+! call assert_equal(maparg('abc'), "xrx")
+ map abc y<S-char-114>y
+! call assert_equal(maparg('abc'), "yRy")
+ endfunction
+
+ function Test_range_map()
+--- 29,41 ----
+ \ maparg('foo', '', 0, 1))
+
+ map abc x<char-114>x
+! call assert_equal("xrx", maparg('abc'))
+ map abc y<S-char-114>y
+! call assert_equal("yRy", maparg('abc'))
+!
+! map abc <Nop>
+! call assert_equal("<Nop>", maparg('abc'))
+! unmap abc
+ endfunction
+
+ function Test_range_map()
+*** ../vim-8.1.0010/src/version.c 2018-05-20 15:41:12.884693893 +0200
+--- src/version.c 2018-05-21 13:22:09.938362521 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 11,
+ /**/
+
+--
+Why I like vim:
+> I like VIM because, when I ask a question in this newsgroup, I get a
+> one-line answer. With xemacs, I get a 1Kb lisp script with bugs in it ;-)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0012 b/data/vim/patches/8.1.0012
new file mode 100644
index 000000000..a7f9d8d5b
--- /dev/null
+++ b/data/vim/patches/8.1.0012
@@ -0,0 +1,54 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0012
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0012
+Problem: Misplaced #endif.
+Solution: Move the #endif to after the expression. (David Binderman)
+Files: src/fileio.c
+
+
+*** ../vim-8.1.0011/src/fileio.c 2018-05-01 14:13:53.000000000 +0200
+--- src/fileio.c 2018-05-21 13:35:31.805571321 +0200
+***************
+*** 714,721 ****
+ && st.st_gid != swap_st.st_gid
+ # ifdef HAVE_FCHOWN
+ && fchown(curbuf->b_ml.ml_mfp->mf_fd, -1, st.st_gid)
+- # endif
+ == -1
+ )
+ swap_mode &= 0600;
+ }
+--- 714,721 ----
+ && st.st_gid != swap_st.st_gid
+ # ifdef HAVE_FCHOWN
+ && fchown(curbuf->b_ml.ml_mfp->mf_fd, -1, st.st_gid)
+ == -1
++ # endif
+ )
+ swap_mode &= 0600;
+ }
+*** ../vim-8.1.0011/src/version.c 2018-05-21 13:28:40.324041565 +0200
+--- src/version.c 2018-05-21 13:36:39.065166257 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 12,
+ /**/
+
+--
+"Lisp has all the visual appeal of oatmeal with nail clippings thrown in."
+ -- Larry Wall
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0013 b/data/vim/patches/8.1.0013
new file mode 100644
index 000000000..fedac815d
--- /dev/null
+++ b/data/vim/patches/8.1.0013
@@ -0,0 +1,205 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0013
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0013
+Problem: Using freed memory when changing terminal cursor color.
+Solution: Make a copy of the color. (Dominique Pelle, closes #2938,
+ closes #2941)
+Files: src/terminal.c
+
+
+*** ../vim-8.1.0012/src/terminal.c 2018-05-17 13:17:10.000000000 +0200
+--- src/terminal.c 2018-05-21 14:46:25.723564355 +0200
+***************
+*** 171,178 ****
+
+ /* Store the last set and the desired cursor properties, so that we only update
+ * them when needed. Doing it unnecessary may result in flicker. */
+! static char_u *last_set_cursor_color = (char_u *)"";
+! static char_u *desired_cursor_color = (char_u *)"";
+ static int last_set_cursor_shape = -1;
+ static int desired_cursor_shape = -1;
+ static int last_set_cursor_blink = -1;
+--- 171,178 ----
+
+ /* Store the last set and the desired cursor properties, so that we only update
+ * them when needed. Doing it unnecessary may result in flicker. */
+! static char_u *last_set_cursor_color = NULL;
+! static char_u *desired_cursor_color = NULL;
+ static int last_set_cursor_shape = -1;
+ static int desired_cursor_shape = -1;
+ static int last_set_cursor_blink = -1;
+***************
+*** 183,188 ****
+--- 183,210 ----
+ * 1. Generic code for all systems.
+ */
+
++ static void
++ cursor_color_copy(char_u** to_color, char_u* from_color)
++ {
++ vim_free(*to_color);
++ *to_color = (from_color == NULL) ? NULL : vim_strsave(from_color);
++ }
++
++ static int
++ cursor_color_equal(char_u *lhs_color, char_u *rhs_color)
++ {
++ if (lhs_color != NULL && rhs_color != NULL)
++ return STRCMP(lhs_color, rhs_color) == 0;
++ return lhs_color == NULL && rhs_color == NULL;
++ }
++
++ static char_u *
++ cursor_color_get(char_u *color)
++ {
++ return (color == NULL) ? (char_u *)"" : color;
++ }
++
++
+ /*
+ * Parse 'termwinsize' and set "rows" and "cols" for the terminal size in the
+ * current window.
+***************
+*** 823,830 ****
+ if (term->tl_out_fd != NULL)
+ fclose(term->tl_out_fd);
+ #endif
+- if (desired_cursor_color == term->tl_cursor_color)
+- desired_cursor_color = (char_u *)"";
+ vim_free(term->tl_cursor_color);
+ vim_free(term);
+ buf->b_term = NULL;
+--- 845,850 ----
+***************
+*** 1954,1967 ****
+ static void
+ may_output_cursor_props(void)
+ {
+! if (STRCMP(last_set_cursor_color, desired_cursor_color) != 0
+ || last_set_cursor_shape != desired_cursor_shape
+ || last_set_cursor_blink != desired_cursor_blink)
+ {
+! last_set_cursor_color = desired_cursor_color;
+ last_set_cursor_shape = desired_cursor_shape;
+ last_set_cursor_blink = desired_cursor_blink;
+! term_cursor_color(desired_cursor_color);
+ if (desired_cursor_shape == -1 || desired_cursor_blink == -1)
+ /* this will restore the initial cursor style, if possible */
+ ui_cursor_shape_forced(TRUE);
+--- 1974,1987 ----
+ static void
+ may_output_cursor_props(void)
+ {
+! if (!cursor_color_equal(last_set_cursor_color, desired_cursor_color)
+ || last_set_cursor_shape != desired_cursor_shape
+ || last_set_cursor_blink != desired_cursor_blink)
+ {
+! cursor_color_copy(&last_set_cursor_color, desired_cursor_color);
+ last_set_cursor_shape = desired_cursor_shape;
+ last_set_cursor_blink = desired_cursor_blink;
+! term_cursor_color(cursor_color_get(desired_cursor_color));
+ if (desired_cursor_shape == -1 || desired_cursor_blink == -1)
+ /* this will restore the initial cursor style, if possible */
+ ui_cursor_shape_forced(TRUE);
+***************
+*** 1984,1993 ****
+ #endif
+ if (in_terminal_loop == term)
+ {
+! if (term->tl_cursor_color != NULL)
+! desired_cursor_color = term->tl_cursor_color;
+! else
+! desired_cursor_color = (char_u *)"";
+ desired_cursor_shape = term->tl_cursor_shape;
+ desired_cursor_blink = term->tl_cursor_blink;
+ may_output_cursor_props();
+--- 2004,2010 ----
+ #endif
+ if (in_terminal_loop == term)
+ {
+! cursor_color_copy(&desired_cursor_color, term->tl_cursor_color);
+ desired_cursor_shape = term->tl_cursor_shape;
+ desired_cursor_blink = term->tl_cursor_blink;
+ may_output_cursor_props();
+***************
+*** 2004,2010 ****
+ if (gui.in_use)
+ return;
+ #endif
+! desired_cursor_color = (char_u *)"";
+ desired_cursor_shape = -1;
+ desired_cursor_blink = -1;
+ may_output_cursor_props();
+--- 2021,2027 ----
+ if (gui.in_use)
+ return;
+ #endif
+! cursor_color_copy(&desired_cursor_color, NULL);
+ desired_cursor_shape = -1;
+ desired_cursor_blink = -1;
+ may_output_cursor_props();
+***************
+*** 2624,2636 ****
+ break;
+
+ case VTERM_PROP_CURSORCOLOR:
+! if (desired_cursor_color == term->tl_cursor_color)
+! desired_cursor_color = (char_u *)"";
+! vim_free(term->tl_cursor_color);
+! if (*value->string == NUL)
+! term->tl_cursor_color = NULL;
+! else
+! term->tl_cursor_color = vim_strsave((char_u *)value->string);
+ may_set_cursor_props(term);
+ break;
+
+--- 2641,2647 ----
+ break;
+
+ case VTERM_PROP_CURSORCOLOR:
+! cursor_color_copy(&term->tl_cursor_color, (char_u*)value->string);
+ may_set_cursor_props(term);
+ break;
+
+***************
+*** 4711,4718 ****
+ dict_add_nr_str(d, "blink", blink_state_is_inverted()
+ ? !term->tl_cursor_blink : term->tl_cursor_blink, NULL);
+ dict_add_nr_str(d, "shape", term->tl_cursor_shape, NULL);
+! dict_add_nr_str(d, "color", 0L, term->tl_cursor_color == NULL
+! ? (char_u *)"" : term->tl_cursor_color);
+ list_append_dict(l, d);
+ }
+ }
+--- 4722,4728 ----
+ dict_add_nr_str(d, "blink", blink_state_is_inverted()
+ ? !term->tl_cursor_blink : term->tl_cursor_blink, NULL);
+ dict_add_nr_str(d, "shape", term->tl_cursor_shape, NULL);
+! dict_add_nr_str(d, "color", 0L, cursor_color_get(term->tl_cursor_color));
+ list_append_dict(l, d);
+ }
+ }
+*** ../vim-8.1.0012/src/version.c 2018-05-21 13:39:36.051906757 +0200
+--- src/version.c 2018-05-21 14:47:20.927181563 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 13,
+ /**/
+
+--
+Friends? I have lots of friends! In fact, I have all episodes ever made.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0014 b/data/vim/patches/8.1.0014
new file mode 100644
index 000000000..3fd601475
--- /dev/null
+++ b/data/vim/patches/8.1.0014
@@ -0,0 +1,486 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0014
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0014
+Problem: qf_init_ext() is too long.
+Solution: Split it into multiple functions. (Yegappan Lakshmanan,
+ closes #2939)
+Files: src/quickfix.c
+
+
+*** ../vim-8.1.0013/src/quickfix.c 2018-05-20 15:41:12.884693893 +0200
+--- src/quickfix.c 2018-05-21 16:53:13.288566927 +0200
+***************
+*** 134,143 ****
+
+ static efm_T *fmt_start = NULL; /* cached across qf_parse_line() calls */
+
+- static int qf_init_ext(qf_info_T *qi, int qf_idx, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title, char_u *enc);
+ static void qf_new_list(qf_info_T *qi, char_u *qf_title);
+ static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid);
+- static qf_info_T *ll_new_list(void);
+ static void qf_free(qf_info_T *qi, int idx);
+ static char_u *qf_types(int, int);
+ static int qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *, char_u *);
+--- 134,141 ----
+***************
+*** 178,209 ****
+ N_("E926: Current location list was changed");
+
+ /*
+- * Read the errorfile "efile" into memory, line by line, building the error
+- * list. Set the error list's title to qf_title.
+- * Return -1 for error, number of errors for success.
+- */
+- int
+- qf_init(win_T *wp,
+- char_u *efile,
+- char_u *errorformat,
+- int newlist, /* TRUE: start a new error list */
+- char_u *qf_title,
+- char_u *enc)
+- {
+- qf_info_T *qi = &ql_info;
+-
+- if (wp != NULL)
+- {
+- qi = ll_get_or_alloc_list(wp);
+- if (qi == NULL)
+- return FAIL;
+- }
+-
+- return qf_init_ext(qi, qi->qf_curlist, efile, curbuf, NULL, errorformat,
+- newlist, (linenr_T)0, (linenr_T)0, qf_title, enc);
+- }
+-
+- /*
+ * Maximum number of bytes allowed per line while reading a errorfile.
+ */
+ #define LINE_MAXLEN 4096
+--- 176,181 ----
+***************
+*** 1336,1341 ****
+--- 1308,1401 ----
+ }
+
+ /*
++ * Allocate the fields used for parsing lines and populating a quickfix list.
++ */
++ static int
++ qf_alloc_fields(qffields_T *pfields)
++ {
++ pfields->namebuf = alloc_id(CMDBUFFSIZE + 1, aid_qf_namebuf);
++ pfields->module = alloc_id(CMDBUFFSIZE + 1, aid_qf_module);
++ pfields->errmsglen = CMDBUFFSIZE + 1;
++ pfields->errmsg = alloc_id(pfields->errmsglen, aid_qf_errmsg);
++ pfields->pattern = alloc_id(CMDBUFFSIZE + 1, aid_qf_pattern);
++ if (pfields->namebuf == NULL || pfields->errmsg == NULL
++ || pfields->pattern == NULL || pfields->module == NULL)
++ return FAIL;
++
++ return OK;
++ }
++
++ /*
++ * Free the fields used for parsing lines and populating a quickfix list.
++ */
++ static void
++ qf_free_fields(qffields_T *pfields)
++ {
++ vim_free(pfields->namebuf);
++ vim_free(pfields->module);
++ vim_free(pfields->errmsg);
++ vim_free(pfields->pattern);
++ }
++
++ /*
++ * Setup the state information used for parsing lines and populating a
++ * quickfix list.
++ */
++ static int
++ qf_setup_state(
++ qfstate_T *pstate,
++ char_u *enc,
++ char_u *efile,
++ typval_T *tv,
++ buf_T *buf,
++ linenr_T lnumfirst,
++ linenr_T lnumlast)
++ {
++ #ifdef FEAT_MBYTE
++ pstate->vc.vc_type = CONV_NONE;
++ if (enc != NULL && *enc != NUL)
++ convert_setup(&pstate->vc, enc, p_enc);
++ #endif
++
++ if (efile != NULL && (pstate->fd = mch_fopen((char *)efile, "r")) == NULL)
++ {
++ EMSG2(_(e_openerrf), efile);
++ return FAIL;
++ }
++
++ if (tv != NULL)
++ {
++ if (tv->v_type == VAR_STRING)
++ pstate->p_str = tv->vval.v_string;
++ else if (tv->v_type == VAR_LIST)
++ pstate->p_li = tv->vval.v_list->lv_first;
++ pstate->tv = tv;
++ }
++ pstate->buf = buf;
++ pstate->buflnum = lnumfirst;
++ pstate->lnumlast = lnumlast;
++
++ return OK;
++ }
++
++ /*
++ * Cleanup the state information used for parsing lines and populating a
++ * quickfix list.
++ */
++ static void
++ qf_cleanup_state(qfstate_T *pstate)
++ {
++ if (pstate->fd != NULL)
++ fclose(pstate->fd);
++
++ vim_free(pstate->growbuf);
++ #ifdef FEAT_MBYTE
++ if (pstate->vc.vc_type != CONV_NONE)
++ convert_setup(&pstate->vc, NULL, NULL);
++ #endif
++ }
++
++ /*
+ * Read the errorfile "efile" into memory, line by line, building the error
+ * list.
+ * Alternative: when "efile" is NULL read errors from buffer "buf".
+***************
+*** 1375,1400 ****
+
+ vim_memset(&state, 0, sizeof(state));
+ vim_memset(&fields, 0, sizeof(fields));
+! #ifdef FEAT_MBYTE
+! state.vc.vc_type = CONV_NONE;
+! if (enc != NULL && *enc != NUL)
+! convert_setup(&state.vc, enc, p_enc);
+! #endif
+! fields.namebuf = alloc_id(CMDBUFFSIZE + 1, aid_qf_namebuf);
+! fields.module = alloc_id(CMDBUFFSIZE + 1, aid_qf_module);
+! fields.errmsglen = CMDBUFFSIZE + 1;
+! fields.errmsg = alloc_id(fields.errmsglen, aid_qf_errmsg);
+! fields.pattern = alloc_id(CMDBUFFSIZE + 1, aid_qf_pattern);
+! if (fields.namebuf == NULL || fields.errmsg == NULL
+! || fields.pattern == NULL || fields.module == NULL)
+ goto qf_init_end;
+
+- if (efile != NULL && (state.fd = mch_fopen((char *)efile, "r")) == NULL)
+- {
+- EMSG2(_(e_openerrf), efile);
+- goto qf_init_end;
+- }
+-
+ if (newlist || qf_idx == qi->qf_listcount)
+ {
+ /* make place for a new list */
+--- 1435,1445 ----
+
+ vim_memset(&state, 0, sizeof(state));
+ vim_memset(&fields, 0, sizeof(fields));
+! if ((qf_alloc_fields(&fields) == FAIL) ||
+! (qf_setup_state(&state, enc, efile, tv, buf,
+! lnumfirst, lnumlast) == FAIL))
+ goto qf_init_end;
+
+ if (newlist || qf_idx == qi->qf_listcount)
+ {
+ /* make place for a new list */
+***************
+*** 1442,1459 ****
+ */
+ got_int = FALSE;
+
+- if (tv != NULL)
+- {
+- if (tv->v_type == VAR_STRING)
+- state.p_str = tv->vval.v_string;
+- else if (tv->v_type == VAR_LIST)
+- state.p_li = tv->vval.v_list->lv_first;
+- state.tv = tv;
+- }
+- state.buf = buf;
+- state.buflnum = lnumfirst;
+- state.lnumlast = lnumlast;
+-
+ /*
+ * Read the lines in the error file one by one.
+ * Try to recognize one of the error formats in each line.
+--- 1487,1492 ----
+***************
+*** 1526,1550 ****
+ --qi->qf_curlist;
+ }
+ qf_init_end:
+- if (state.fd != NULL)
+- fclose(state.fd);
+- vim_free(fields.namebuf);
+- vim_free(fields.module);
+- vim_free(fields.errmsg);
+- vim_free(fields.pattern);
+- vim_free(state.growbuf);
+-
+ if (qf_idx == qi->qf_curlist)
+ qf_update_buffer(qi, old_last);
+! #ifdef FEAT_MBYTE
+! if (state.vc.vc_type != CONV_NONE)
+! convert_setup(&state.vc, NULL, NULL);
+! #endif
+
+ return retval;
+ }
+
+ /*
+ * Set the title of the specified quickfix list. Frees the previous title.
+ * Prepends ':' to the title.
+ */
+--- 1559,1599 ----
+ --qi->qf_curlist;
+ }
+ qf_init_end:
+ if (qf_idx == qi->qf_curlist)
+ qf_update_buffer(qi, old_last);
+! qf_cleanup_state(&state);
+! qf_free_fields(&fields);
+
+ return retval;
+ }
+
+ /*
++ * Read the errorfile "efile" into memory, line by line, building the error
++ * list. Set the error list's title to qf_title.
++ * Return -1 for error, number of errors for success.
++ */
++ int
++ qf_init(win_T *wp,
++ char_u *efile,
++ char_u *errorformat,
++ int newlist, /* TRUE: start a new error list */
++ char_u *qf_title,
++ char_u *enc)
++ {
++ qf_info_T *qi = &ql_info;
++
++ if (wp != NULL)
++ {
++ qi = ll_get_or_alloc_list(wp);
++ if (qi == NULL)
++ return FAIL;
++ }
++
++ return qf_init_ext(qi, qi->qf_curlist, efile, curbuf, NULL, errorformat,
++ newlist, (linenr_T)0, (linenr_T)0, qf_title, enc);
++ }
++
++ /*
+ * Set the title of the specified quickfix list. Frees the previous title.
+ * Prepends ':' to the title.
+ */
+***************
+*** 3835,3840 ****
+--- 3884,3963 ----
+ }
+
+ /*
++ * Add an error line to the quickfix buffer.
++ */
++ static int
++ qf_buf_add_line(buf_T *buf, linenr_T lnum, qfline_T *qfp, char_u *dirname)
++ {
++ int len;
++ buf_T *errbuf;
++
++ if (qfp->qf_module != NULL)
++ {
++ STRCPY(IObuff, qfp->qf_module);
++ len = (int)STRLEN(IObuff);
++ }
++ else if (qfp->qf_fnum != 0
++ && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
++ && errbuf->b_fname != NULL)
++ {
++ if (qfp->qf_type == 1) /* :helpgrep */
++ STRCPY(IObuff, gettail(errbuf->b_fname));
++ else
++ {
++ /* shorten the file name if not done already */
++ if (errbuf->b_sfname == NULL
++ || mch_isFullName(errbuf->b_sfname))
++ {
++ if (*dirname == NUL)
++ mch_dirname(dirname, MAXPATHL);
++ shorten_buf_fname(errbuf, dirname, FALSE);
++ }
++ STRCPY(IObuff, errbuf->b_fname);
++ }
++ len = (int)STRLEN(IObuff);
++ }
++ else
++ len = 0;
++ IObuff[len++] = '|';
++
++ if (qfp->qf_lnum > 0)
++ {
++ sprintf((char *)IObuff + len, "%ld", qfp->qf_lnum);
++ len += (int)STRLEN(IObuff + len);
++
++ if (qfp->qf_col > 0)
++ {
++ sprintf((char *)IObuff + len, " col %d", qfp->qf_col);
++ len += (int)STRLEN(IObuff + len);
++ }
++
++ sprintf((char *)IObuff + len, "%s",
++ (char *)qf_types(qfp->qf_type, qfp->qf_nr));
++ len += (int)STRLEN(IObuff + len);
++ }
++ else if (qfp->qf_pattern != NULL)
++ {
++ qf_fmt_text(qfp->qf_pattern, IObuff + len, IOSIZE - len);
++ len += (int)STRLEN(IObuff + len);
++ }
++ IObuff[len++] = '|';
++ IObuff[len++] = ' ';
++
++ /* Remove newlines and leading whitespace from the text.
++ * For an unrecognized line keep the indent, the compiler may
++ * mark a word with ^^^^. */
++ qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
++ IObuff + len, IOSIZE - len);
++
++ if (ml_append_buf(buf, lnum, IObuff,
++ (colnr_T)STRLEN(IObuff) + 1, FALSE) == FAIL)
++ return FAIL;
++
++ return OK;
++ }
++
++ /*
+ * Fill current buffer with quickfix errors, replacing any previous contents.
+ * curbuf must be the quickfix buffer!
+ * If "old_last" is not NULL append the items after this one.
+***************
+*** 3846,3853 ****
+ {
+ linenr_T lnum;
+ qfline_T *qfp;
+- buf_T *errbuf;
+- int len;
+ int old_KeyTyped = KeyTyped;
+
+ if (old_last == NULL)
+--- 3969,3974 ----
+***************
+*** 3883,3949 ****
+ }
+ while (lnum < qi->qf_lists[qi->qf_curlist].qf_count)
+ {
+! if (qfp->qf_module != NULL)
+! {
+! STRCPY(IObuff, qfp->qf_module);
+! len = (int)STRLEN(IObuff);
+! }
+! else if (qfp->qf_fnum != 0
+! && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
+! && errbuf->b_fname != NULL)
+! {
+! if (qfp->qf_type == 1) /* :helpgrep */
+! STRCPY(IObuff, gettail(errbuf->b_fname));
+! else
+! {
+! /* shorten the file name if not done already */
+! if (errbuf->b_sfname == NULL
+! || mch_isFullName(errbuf->b_sfname))
+! {
+! if (*dirname == NUL)
+! mch_dirname(dirname, MAXPATHL);
+! shorten_buf_fname(errbuf, dirname, FALSE);
+! }
+! STRCPY(IObuff, errbuf->b_fname);
+! }
+! len = (int)STRLEN(IObuff);
+! }
+! else
+! len = 0;
+! IObuff[len++] = '|';
+!
+! if (qfp->qf_lnum > 0)
+! {
+! sprintf((char *)IObuff + len, "%ld", qfp->qf_lnum);
+! len += (int)STRLEN(IObuff + len);
+!
+! if (qfp->qf_col > 0)
+! {
+! sprintf((char *)IObuff + len, " col %d", qfp->qf_col);
+! len += (int)STRLEN(IObuff + len);
+! }
+!
+! sprintf((char *)IObuff + len, "%s",
+! (char *)qf_types(qfp->qf_type, qfp->qf_nr));
+! len += (int)STRLEN(IObuff + len);
+! }
+! else if (qfp->qf_pattern != NULL)
+! {
+! qf_fmt_text(qfp->qf_pattern, IObuff + len, IOSIZE - len);
+! len += (int)STRLEN(IObuff + len);
+! }
+! IObuff[len++] = '|';
+! IObuff[len++] = ' ';
+!
+! /* Remove newlines and leading whitespace from the text.
+! * For an unrecognized line keep the indent, the compiler may
+! * mark a word with ^^^^. */
+! qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
+! IObuff + len, IOSIZE - len);
+!
+! if (ml_append_buf(buf, lnum, IObuff,
+! (colnr_T)STRLEN(IObuff) + 1, FALSE) == FAIL)
+ break;
+ ++lnum;
+ qfp = qfp->qf_next;
+ if (qfp == NULL)
+--- 4004,4012 ----
+ }
+ while (lnum < qi->qf_lists[qi->qf_curlist].qf_count)
+ {
+! if (qf_buf_add_line(buf, lnum, qfp, dirname) == FAIL)
+ break;
++
+ ++lnum;
+ qfp = qfp->qf_next;
+ if (qfp == NULL)
+*** ../vim-8.1.0013/src/version.c 2018-05-21 14:55:22.555983588 +0200
+--- src/version.c 2018-05-21 16:55:00.327845962 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 14,
+ /**/
+
+--
+ARTHUR: ... and I am your king ....
+OLD WOMAN: Ooooh! I didn't know we had a king. I thought we were an
+ autonomous collective ...
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0015 b/data/vim/patches/8.1.0015
new file mode 100644
index 000000000..648710228
--- /dev/null
+++ b/data/vim/patches/8.1.0015
@@ -0,0 +1,144 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0015
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0015
+Problem: Cursor color wrong when closing a terminal window, ending up in
+ another terminal window. (Dominique Pelle)
+Solution: Bail out of terminal_loop() when the buffer changes.
+ (closes #2942)
+Files: src/terminal.c
+
+
+*** ../vim-8.1.0014/src/terminal.c 2018-05-21 14:55:22.555983588 +0200
+--- src/terminal.c 2018-05-21 18:37:16.628386002 +0200
+***************
+*** 183,196 ****
+ * 1. Generic code for all systems.
+ */
+
+! static void
+! cursor_color_copy(char_u** to_color, char_u* from_color)
+! {
+! vim_free(*to_color);
+! *to_color = (from_color == NULL) ? NULL : vim_strsave(from_color);
+! }
+!
+! static int
+ cursor_color_equal(char_u *lhs_color, char_u *rhs_color)
+ {
+ if (lhs_color != NULL && rhs_color != NULL)
+--- 183,189 ----
+ * 1. Generic code for all systems.
+ */
+
+! static int
+ cursor_color_equal(char_u *lhs_color, char_u *rhs_color)
+ {
+ if (lhs_color != NULL && rhs_color != NULL)
+***************
+*** 198,204 ****
+ return lhs_color == NULL && rhs_color == NULL;
+ }
+
+! static char_u *
+ cursor_color_get(char_u *color)
+ {
+ return (color == NULL) ? (char_u *)"" : color;
+--- 191,207 ----
+ return lhs_color == NULL && rhs_color == NULL;
+ }
+
+! static void
+! cursor_color_copy(char_u **to_color, char_u *from_color)
+! {
+! // Avoid a free & alloc if the value is already right.
+! if (cursor_color_equal(*to_color, from_color))
+! return;
+! vim_free(*to_color);
+! *to_color = (from_color == NULL) ? NULL : vim_strsave(from_color);
+! }
+!
+! static char_u *
+ cursor_color_get(char_u *color)
+ {
+ return (color == NULL) ? (char_u *)"" : color;
+***************
+*** 2119,2125 ****
+ while (must_redraw != 0)
+ if (update_screen(0) == FAIL)
+ break;
+! if (!term_use_loop_check(TRUE))
+ /* job finished while redrawing */
+ break;
+
+--- 2122,2128 ----
+ while (must_redraw != 0)
+ if (update_screen(0) == FAIL)
+ break;
+! if (!term_use_loop_check(TRUE) || in_terminal_loop != curbuf->b_term)
+ /* job finished while redrawing */
+ break;
+
+***************
+*** 2127,2133 ****
+ restore_cursor = TRUE;
+
+ c = term_vgetc();
+! if (!term_use_loop_check(TRUE))
+ {
+ /* Job finished while waiting for a character. Push back the
+ * received character. */
+--- 2130,2136 ----
+ restore_cursor = TRUE;
+
+ c = term_vgetc();
+! if (!term_use_loop_check(TRUE) || in_terminal_loop != curbuf->b_term)
+ {
+ /* Job finished while waiting for a character. Push back the
+ * received character. */
+***************
+*** 2178,2184 ****
+ #ifdef FEAT_CMDL_INFO
+ clear_showcmd();
+ #endif
+! if (!term_use_loop_check(TRUE))
+ /* job finished while waiting for a character */
+ break;
+
+--- 2181,2188 ----
+ #ifdef FEAT_CMDL_INFO
+ clear_showcmd();
+ #endif
+! if (!term_use_loop_check(TRUE)
+! || in_terminal_loop != curbuf->b_term)
+ /* job finished while waiting for a character */
+ break;
+
+*** ../vim-8.1.0014/src/version.c 2018-05-21 16:56:33.687217173 +0200
+--- src/version.c 2018-05-21 17:16:16.343071822 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 15,
+ /**/
+
+--
+OLD WOMAN: Well, how did you become king, then?
+ARTHUR: The Lady of the Lake, her arm clad in the purest shimmering samite,
+ held Excalibur aloft from the bosom of the water to signify by Divine
+ Providence ... that I, Arthur, was to carry Excalibur ... That is
+ why I am your king!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0016 b/data/vim/patches/8.1.0016
new file mode 100644
index 000000000..0ecad20a9
--- /dev/null
+++ b/data/vim/patches/8.1.0016
@@ -0,0 +1,61 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0016
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0016
+Problem: Possible crash in term_wait(). (Dominique Pelle)
+Solution: Check for a valid buffer after ui_delay(). (closes #2944)
+Files: src/terminal.c
+
+
+*** ../vim-8.1.0015/src/terminal.c 2018-05-21 18:47:47.496590765 +0200
+--- src/terminal.c 2018-05-21 22:47:11.788087575 +0200
+***************
+*** 5264,5274 ****
+ {
+ mch_check_messages();
+ parse_queued_messages();
+ if (!buf_valid(buf))
+ /* If the terminal is closed when the channel is closed the
+ * buffer disappears. */
+ break;
+- ui_delay(10L, FALSE);
+ }
+ mch_check_messages();
+ parse_queued_messages();
+--- 5264,5274 ----
+ {
+ mch_check_messages();
+ parse_queued_messages();
++ ui_delay(10L, FALSE);
+ if (!buf_valid(buf))
+ /* If the terminal is closed when the channel is closed the
+ * buffer disappears. */
+ break;
+ }
+ mch_check_messages();
+ parse_queued_messages();
+*** ../vim-8.1.0015/src/version.c 2018-05-21 18:47:47.500590743 +0200
+--- src/version.c 2018-05-21 22:49:40.782890938 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 16,
+ /**/
+
+--
+DENNIS: You can't expect to wield supreme executive power just 'cause some
+ watery tart threw a sword at you!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0017 b/data/vim/patches/8.1.0017
new file mode 100644
index 000000000..7eb2704a6
--- /dev/null
+++ b/data/vim/patches/8.1.0017
@@ -0,0 +1,210 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0017
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0017
+Problem: Shell command completion has duplicates. (Yegappan Lakshmanan)
+Solution: Use a hash table to avoid duplicates. (Ozaki Kiichi, closes #539,
+ closes #2733)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+
+*** ../vim-8.1.0016/src/ex_getln.c 2018-05-13 18:28:45.000000000 +0200
+--- src/ex_getln.c 2018-05-22 16:50:19.196716156 +0200
+***************
+*** 5147,5153 ****
+ {
+ char_u *pat;
+ int i;
+! char_u *path;
+ int mustfree = FALSE;
+ garray_T ga;
+ char_u *buf = alloc(MAXPATHL);
+--- 5147,5153 ----
+ {
+ char_u *pat;
+ int i;
+! char_u *path = NULL;
+ int mustfree = FALSE;
+ garray_T ga;
+ char_u *buf = alloc(MAXPATHL);
+***************
+*** 5156,5161 ****
+--- 5156,5164 ----
+ int flags = flagsarg;
+ int ret;
+ int did_curdir = FALSE;
++ hashtab_T found_ht;
++ hashitem_T *hi;
++ hash_T hash;
+
+ if (buf == NULL)
+ return FAIL;
+***************
+*** 5169,5183 ****
+
+ flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
+
+! /* For an absolute name we don't use $PATH. */
+! if (mch_isFullName(pat))
+! path = (char_u *)" ";
+! else if ((pat[0] == '.' && (vim_ispathsep(pat[1])
+! || (pat[1] == '.' && vim_ispathsep(pat[2])))))
+ path = (char_u *)".";
+ else
+ {
+! path = vim_getenv((char_u *)"PATH", &mustfree);
+ if (path == NULL)
+ path = (char_u *)"";
+ }
+--- 5172,5185 ----
+
+ flags |= EW_FILE | EW_EXEC | EW_SHELLCMD;
+
+! if (pat[0] == '.' && (vim_ispathsep(pat[1])
+! || (pat[1] == '.' && vim_ispathsep(pat[2]))))
+ path = (char_u *)".";
+ else
+ {
+! /* For an absolute name we don't use $PATH. */
+! if (!mch_isFullName(pat))
+! path = vim_getenv((char_u *)"PATH", &mustfree);
+ if (path == NULL)
+ path = (char_u *)"";
+ }
+***************
+*** 5188,5193 ****
+--- 5190,5196 ----
+ * current directory, to find "subdir/cmd".
+ */
+ ga_init2(&ga, (int)sizeof(char *), 10);
++ hash_init(&found_ht);
+ for (s = path; ; s = e)
+ {
+ if (*s == NUL)
+***************
+*** 5200,5208 ****
+ else if (*s == '.')
+ did_curdir = TRUE;
+
+- if (*s == ' ')
+- ++s; /* Skip space used for absolute path name. */
+-
+ #if defined(MSWIN)
+ e = vim_strchr(s, ';');
+ #else
+--- 5203,5208 ----
+***************
+*** 5229,5243 ****
+ {
+ for (i = 0; i < *num_file; ++i)
+ {
+! s = (*file)[i];
+! if (STRLEN(s) > l)
+ {
+! /* Remove the path again. */
+! STRMOVE(s, s + l);
+! ((char_u **)ga.ga_data)[ga.ga_len++] = s;
+ }
+! else
+! vim_free(s);
+ }
+ vim_free(*file);
+ }
+--- 5229,5251 ----
+ {
+ for (i = 0; i < *num_file; ++i)
+ {
+! char_u *name = (*file)[i];
+!
+! if (STRLEN(name) > l)
+ {
+! // Check if this name was already found.
+! hash = hash_hash(name + l);
+! hi = hash_lookup(&found_ht, name + l, hash);
+! if (HASHITEM_EMPTY(hi))
+! {
+! // Remove the path that was prepended.
+! STRMOVE(name, name + l);
+! ((char_u **)ga.ga_data)[ga.ga_len++] = name;
+! hash_add_item(&found_ht, hi, name, hash);
+! name = NULL;
+! }
+ }
+! vim_free(name);
+ }
+ vim_free(*file);
+ }
+***************
+*** 5252,5257 ****
+--- 5260,5266 ----
+ vim_free(pat);
+ if (mustfree)
+ vim_free(path);
++ hash_clear(&found_ht);
+ return OK;
+ }
+
+*** ../vim-8.1.0016/src/testdir/test_cmdline.vim 2018-05-12 13:15:47.000000000 +0200
+--- src/testdir/test_cmdline.vim 2018-05-22 16:46:15.281766628 +0200
+***************
+*** 231,236 ****
+--- 231,245 ----
+ let l = getcompletion('not', 'mapclear')
+ call assert_equal([], l)
+
++ let l = getcompletion('.', 'shellcmd')
++ call assert_equal(['./', '../'], l[0:1])
++ call assert_equal(-1, match(l[2:], '^\.\.\?/$'))
++ let root = has('win32') ? 'C:\\' : '/'
++ let l = getcompletion(root, 'shellcmd')
++ let expected = map(filter(glob(root . '*', 0, 1),
++ \ 'isdirectory(v:val) || executable(v:val)'), 'isdirectory(v:val) ? v:val . ''/'' : v:val')
++ call assert_equal(expected, l)
++
+ if has('cscope')
+ let l = getcompletion('', 'cscope')
+ let cmds = ['add', 'find', 'help', 'kill', 'reset', 'show']
+***************
+*** 258,265 ****
+ endif
+
+ " For others test if the name is recognized.
+! let names = ['buffer', 'environment', 'file_in_path',
+! \ 'mapping', 'shellcmd', 'tag', 'tag_listfiles', 'user']
+ if has('cmdline_hist')
+ call add(names, 'history')
+ endif
+--- 267,273 ----
+ endif
+
+ " For others test if the name is recognized.
+! let names = ['buffer', 'environment', 'file_in_path', 'mapping', 'tag', 'tag_listfiles', 'user']
+ if has('cmdline_hist')
+ call add(names, 'history')
+ endif
+*** ../vim-8.1.0016/src/version.c 2018-05-21 22:50:22.514568516 +0200
+--- src/version.c 2018-05-22 16:48:23.473237408 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 17,
+ /**/
+
+--
+ARTHUR: You are indeed brave Sir knight, but the fight is mine.
+BLACK KNIGHT: Had enough?
+ARTHUR: You stupid bastard. You havn't got any arms left.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0018 b/data/vim/patches/8.1.0018
new file mode 100644
index 000000000..998587b8c
--- /dev/null
+++ b/data/vim/patches/8.1.0018
@@ -0,0 +1,328 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0018
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0018
+Problem: Using "gn" may select wrong text when wrapping.
+Solution: Avoid wrapping when searching forward. (Christian Brabandt)
+Files: src/search.c, src/testdir/test_gn.vim
+
+
+*** ../vim-8.1.0017/src/search.c 2018-04-27 22:44:25.000000000 +0200
+--- src/search.c 2018-05-22 17:45:10.884137772 +0200
+***************
+*** 4665,4670 ****
+--- 4665,4671 ----
+ {
+ pos_T start_pos; /* position before the pattern */
+ pos_T orig_pos; /* position of the cursor at beginning */
++ pos_T first_match; /* position of first match */
+ pos_T pos; /* position after the pattern */
+ int i;
+ int dir;
+***************
+*** 4758,4763 ****
+--- 4759,4766 ----
+ ml_get(curwin->w_buffer->b_ml.ml_line_count));
+ }
+ }
++ if (i == 0)
++ first_match = pos;
+ p_ws = old_p_ws;
+ }
+
+***************
+*** 4774,4782 ****
+ /* move to match, except for zero-width matches, in which case, we are
+ * already on the next match */
+ if (!one_char)
+! result = searchit(curwin, curbuf, &pos, direction,
+ spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0,
+ NULL, NULL);
+
+ if (!VIsual_active)
+ VIsual = start_pos;
+--- 4777,4801 ----
+ /* move to match, except for zero-width matches, in which case, we are
+ * already on the next match */
+ if (!one_char)
+! {
+! p_ws = FALSE;
+! for (i = 0; i < 2; i++)
+! {
+! result = searchit(curwin, curbuf, &pos, direction,
+ spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0,
+ NULL, NULL);
++ /* Search successfull, break out from the loop */
++ if (result)
++ break;
++ /* search failed, try again from the last search position match */
++ pos = first_match;
++ }
++ }
++
++ p_ws = old_p_ws;
++ /* not found */
++ if (!result)
++ return FAIL;
+
+ if (!VIsual_active)
+ VIsual = start_pos;
+*** ../vim-8.1.0017/src/testdir/test_gn.vim 2017-10-15 22:02:53.000000000 +0200
+--- src/testdir/test_gn.vim 2018-05-22 17:48:47.536062374 +0200
+***************
+*** 4,54 ****
+ noautocmd new
+ " replace a single char by itsself quoted:
+ call setline('.', 'abc x def x ghi x jkl')
+! let @/='x'
+ exe "norm! cgn'x'\<esc>.."
+ call assert_equal("abc 'x' def 'x' ghi 'x' jkl", getline('.'))
+ sil! %d_
+
+ " simple search match
+ call setline('.', 'foobar')
+! let @/='foobar'
+ exe "norm! gncsearchmatch"
+ call assert_equal('searchmatch', getline('.'))
+ sil! %d _
+
+ " replace a multi-line match
+ call setline('.', ['', 'one', 'two'])
+! let @/='one\_s*two\_s'
+ exe "norm! gnceins\<CR>zwei"
+ call assert_equal(['','eins','zwei'], getline(1,'$'))
+ sil! %d _
+
+ " test count argument
+ call setline('.', ['', 'abcdx | abcdx | abcdx'])
+! let @/='[a]bcdx'
+ exe "norm! 2gnd"
+ call assert_equal(['','abcdx | | abcdx'], getline(1,'$'))
+ sil! %d _
+
+ " join lines
+ call setline('.', ['join ', 'lines'])
+! let @/='$'
+ exe "norm! 0gnd"
+ call assert_equal(['join lines'], getline(1,'$'))
+ sil! %d _
+
+ " zero-width match
+ call setline('.', ['', 'zero width pattern'])
+! let @/='\>\zs'
+ exe "norm! 0gnd"
+ call assert_equal(['', 'zerowidth pattern'], getline(1,'$'))
+ sil! %d _
+
+ " delete first and last chars
+ call setline('.', ['delete first and last chars'])
+! let @/='^'
+ exe "norm! 0gnd$"
+! let @/='\zs'
+ exe "norm! gnd"
+ call assert_equal(['elete first and last char'], getline(1,'$'))
+ sil! %d _
+--- 4,54 ----
+ noautocmd new
+ " replace a single char by itsself quoted:
+ call setline('.', 'abc x def x ghi x jkl')
+! let @/ = 'x'
+ exe "norm! cgn'x'\<esc>.."
+ call assert_equal("abc 'x' def 'x' ghi 'x' jkl", getline('.'))
+ sil! %d_
+
+ " simple search match
+ call setline('.', 'foobar')
+! let @/ = 'foobar'
+ exe "norm! gncsearchmatch"
+ call assert_equal('searchmatch', getline('.'))
+ sil! %d _
+
+ " replace a multi-line match
+ call setline('.', ['', 'one', 'two'])
+! let @/ = 'one\_s*two\_s'
+ exe "norm! gnceins\<CR>zwei"
+ call assert_equal(['','eins','zwei'], getline(1,'$'))
+ sil! %d _
+
+ " test count argument
+ call setline('.', ['', 'abcdx | abcdx | abcdx'])
+! let @/ = '[a]bcdx'
+ exe "norm! 2gnd"
+ call assert_equal(['','abcdx | | abcdx'], getline(1,'$'))
+ sil! %d _
+
+ " join lines
+ call setline('.', ['join ', 'lines'])
+! let @/ = '$'
+ exe "norm! 0gnd"
+ call assert_equal(['join lines'], getline(1,'$'))
+ sil! %d _
+
+ " zero-width match
+ call setline('.', ['', 'zero width pattern'])
+! let @/ = '\>\zs'
+ exe "norm! 0gnd"
+ call assert_equal(['', 'zerowidth pattern'], getline(1,'$'))
+ sil! %d _
+
+ " delete first and last chars
+ call setline('.', ['delete first and last chars'])
+! let @/ = '^'
+ exe "norm! 0gnd$"
+! let @/ = '\zs'
+ exe "norm! gnd"
+ call assert_equal(['elete first and last char'], getline(1,'$'))
+ sil! %d _
+***************
+*** 61,74 ****
+
+ " backwards search
+ call setline('.', ['my very excellent mother just served us nachos'])
+! let @/='mother'
+ exe "norm! $cgNmongoose"
+ call assert_equal(['my very excellent mongoose just served us nachos'], getline(1,'$'))
+ sil! %d _
+
+ " search for single char
+ call setline('.', ['','for (i=0; i<=10; i++)'])
+! let @/='i'
+ exe "norm! cgnj"
+ call assert_equal(['','for (j=0; i<=10; i++)'], getline(1,'$'))
+ sil! %d _
+--- 61,74 ----
+
+ " backwards search
+ call setline('.', ['my very excellent mother just served us nachos'])
+! let @/ = 'mother'
+ exe "norm! $cgNmongoose"
+ call assert_equal(['my very excellent mongoose just served us nachos'], getline(1,'$'))
+ sil! %d _
+
+ " search for single char
+ call setline('.', ['','for (i=0; i<=10; i++)'])
+! let @/ = 'i'
+ exe "norm! cgnj"
+ call assert_equal(['','for (j=0; i<=10; i++)'], getline(1,'$'))
+ sil! %d _
+***************
+*** 76,103 ****
+ " search hex char
+ call setline('.', ['','Y'])
+ set noignorecase
+! let @/='\%x59'
+ exe "norm! gnd"
+ call assert_equal(['',''], getline(1,'$'))
+ sil! %d _
+
+ " test repeating gdn
+ call setline('.', ['', '1', 'Johnny', '2', 'Johnny', '3'])
+! let @/='Johnny'
+ exe "norm! dgn."
+ call assert_equal(['','1', '', '2', '', '3'], getline(1,'$'))
+ sil! %d _
+
+ " test repeating gUgn
+ call setline('.', ['', '1', 'Depp', '2', 'Depp', '3'])
+! let @/='Depp'
+ exe "norm! gUgn."
+ call assert_equal(['', '1', 'DEPP', '2', 'DEPP', '3'], getline(1,'$'))
+ sil! %d _
+
+ " test using look-ahead assertions
+ call setline('.', ['a:10', '', 'a:1', '', 'a:20'])
+! let @/='a:0\@!\zs\d\+'
+ exe "norm! 2nygno\<esc>p"
+ call assert_equal(['a:10', '', 'a:1', '1', '', 'a:20'], getline(1,'$'))
+ sil! %d _
+--- 76,103 ----
+ " search hex char
+ call setline('.', ['','Y'])
+ set noignorecase
+! let @/ = '\%x59'
+ exe "norm! gnd"
+ call assert_equal(['',''], getline(1,'$'))
+ sil! %d _
+
+ " test repeating gdn
+ call setline('.', ['', '1', 'Johnny', '2', 'Johnny', '3'])
+! let @/ = 'Johnny'
+ exe "norm! dgn."
+ call assert_equal(['','1', '', '2', '', '3'], getline(1,'$'))
+ sil! %d _
+
+ " test repeating gUgn
+ call setline('.', ['', '1', 'Depp', '2', 'Depp', '3'])
+! let @/ = 'Depp'
+ exe "norm! gUgn."
+ call assert_equal(['', '1', 'DEPP', '2', 'DEPP', '3'], getline(1,'$'))
+ sil! %d _
+
+ " test using look-ahead assertions
+ call setline('.', ['a:10', '', 'a:1', '', 'a:20'])
+! let @/ = 'a:0\@!\zs\d\+'
+ exe "norm! 2nygno\<esc>p"
+ call assert_equal(['a:10', '', 'a:1', '1', '', 'a:20'], getline(1,'$'))
+ sil! %d _
+***************
+*** 113,124 ****
+ " search upwards with nowrapscan set
+ call setline('.', ['foo', 'bar', 'foo', 'baz'])
+ set nowrapscan
+! let @/='foo'
+ $
+ norm! dgN
+ call assert_equal(['foo', 'bar', '', 'baz'], getline(1,'$'))
+ sil! %d_
+
+ set wrapscan&vim
+ endfu
+
+--- 113,133 ----
+ " search upwards with nowrapscan set
+ call setline('.', ['foo', 'bar', 'foo', 'baz'])
+ set nowrapscan
+! let @/ = 'foo'
+ $
+ norm! dgN
+ call assert_equal(['foo', 'bar', '', 'baz'], getline(1,'$'))
+ sil! %d_
+
++ " search using the \zs atom
++ call setline(1, [' nnoremap', '' , 'nnoremap'])
++ set wrapscan&vim
++ let @/ = '\_s\zsnnoremap'
++ $
++ norm! cgnmatch
++ call assert_equal([' nnoremap', '', 'match'], getline(1,'$'))
++ sil! %d_
++
+ set wrapscan&vim
+ endfu
+
+*** ../vim-8.1.0017/src/version.c 2018-05-22 16:58:43.979903077 +0200
+--- src/version.c 2018-05-22 17:49:43.960023944 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 18,
+ /**/
+
+--
+Eye have a spelling checker, it came with my PC;
+It plainly marks four my revue mistakes I cannot sea.
+I've run this poem threw it, I'm sure your please to no,
+It's letter perfect in it's weigh, my checker tolled me sew!
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0019 b/data/vim/patches/8.1.0019
new file mode 100644
index 000000000..2c23681b7
--- /dev/null
+++ b/data/vim/patches/8.1.0019
@@ -0,0 +1,78 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0019
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0019
+Problem: Error when defining a Lambda with index of a function result.
+Solution: When not evaluating an expression and skipping a function call,
+ set the return value to VAR_UNKNOWN.
+Files: src/userfunc.c, src/testdir/test_lambda.vim
+
+
+*** ../vim-8.1.0018/src/userfunc.c 2018-03-04 16:24:26.000000000 +0100
+--- src/userfunc.c 2018-05-22 18:28:12.801624574 +0200
+***************
+*** 1349,1356 ****
+ }
+
+
+! /* execute the function if no errors detected and executing */
+! if (evaluate && error == ERROR_NONE)
+ {
+ char_u *rfname = fname;
+
+--- 1349,1364 ----
+ }
+
+
+! /*
+! * Execute the function if executing and no errors were detected.
+! */
+! if (!evaluate)
+! {
+! // Not evaluating, which means the return value is unknown. This
+! // matters for giving error messages.
+! rettv->v_type = VAR_UNKNOWN;
+! }
+! else if (error == ERROR_NONE)
+ {
+ char_u *rfname = fname;
+
+*** ../vim-8.1.0018/src/testdir/test_lambda.vim 2017-02-02 22:52:07.000000000 +0100
+--- src/testdir/test_lambda.vim 2018-05-22 18:27:22.697688766 +0200
+***************
+*** 284,286 ****
+--- 284,292 ----
+ call test_garbagecollect_now()
+ call assert_equal(14, s:Abar())
+ endfunc
++
++ func Test_lambda_with_index()
++ let List = {x -> [x]}
++ let Extract = {-> function(List, ['foobar'])()[0]}
++ call assert_equal('foobar', Extract())
++ endfunc
+*** ../vim-8.1.0018/src/version.c 2018-05-22 17:50:38.683980716 +0200
+--- src/version.c 2018-05-22 18:27:48.673655578 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 19,
+ /**/
+
+--
+Westheimer's Discovery:
+ A couple of months in the laboratory can
+ frequently save a couple of hours in the library.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0020 b/data/vim/patches/8.1.0020
new file mode 100644
index 000000000..3685bee38
--- /dev/null
+++ b/data/vim/patches/8.1.0020
@@ -0,0 +1,519 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0020
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0020
+Problem: Cannot tell whether a register is being used for executing or
+ recording.
+Solution: Add reg_executing() and reg_recording(). (Hirohito Higashi,
+ closes #2745) Rename the global variables for consistency. Store
+ the register name in reg_executing.
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim, src/getchar.c, src/normal.c,
+ src/ops.c, src/globals.h, src/edit.c, src/fileio.c, src/message.c,
+ src/screen.c
+
+
+*** ../vim-8.1.0019/runtime/doc/eval.txt 2018-05-17 15:06:48.000000000 +0200
+--- runtime/doc/eval.txt 2018-05-22 20:25:41.869831935 +0200
+***************
+*** 2302,2307 ****
+--- 2302,2309 ----
+ List items from {expr} to {max}
+ readfile({fname} [, {binary} [, {max}]])
+ List get list of lines from file {fname}
++ reg_executing() Number get the executing register name
++ reg_recording() String get the recording register name
+ reltime([{start} [, {end}]]) List get time value
+ reltimefloat({time}) Float turn the time value into a Float
+ reltimestr({time}) String turn time value into a String
+***************
+*** 6558,6563 ****
+--- 6562,6576 ----
+ the result is an empty list.
+ Also see |writefile()|.
+
++ reg_executing() *reg_executing()*
++ Returns the single letter name of the register being executed.
++ Returns an empty string when no register is being executed.
++ See |@|.
++
++ reg_recording() *reg_recording()*
++ Returns the single letter name of the register being recorded.
++ Returns an empty string string when not recording. See |q|.
++
+ reltime([{start} [, {end}]]) *reltime()*
+ Return an item that represents a time value. The format of
+ the item depends on the system. It can be passed to
+*** ../vim-8.1.0019/runtime/doc/usr_41.txt 2018-05-17 13:42:03.000000000 +0200
+--- runtime/doc/usr_41.txt 2018-05-22 20:26:30.025880034 +0200
+***************
+*** 1018,1023 ****
+--- 1018,1025 ----
+ getreg() get contents of a register
+ getregtype() get type of a register
+ setreg() set contents and type of a register
++ reg_executing() return the name of the register being executed
++ reg_recording() return the name of the register being recorded
+
+ shiftwidth() effective value of 'shiftwidth'
+
+*** ../vim-8.1.0019/src/evalfunc.c 2018-05-21 13:28:40.320041589 +0200
+--- src/evalfunc.c 2018-05-22 20:32:33.566027870 +0200
+***************
+*** 306,311 ****
+--- 306,313 ----
+ #endif
+ static void f_range(typval_T *argvars, typval_T *rettv);
+ static void f_readfile(typval_T *argvars, typval_T *rettv);
++ static void f_reg_executing(typval_T *argvars, typval_T *rettv);
++ static void f_reg_recording(typval_T *argvars, typval_T *rettv);
+ static void f_reltime(typval_T *argvars, typval_T *rettv);
+ #ifdef FEAT_FLOAT
+ static void f_reltimefloat(typval_T *argvars, typval_T *rettv);
+***************
+*** 754,759 ****
+--- 756,763 ----
+ #endif
+ {"range", 1, 3, f_range},
+ {"readfile", 1, 3, f_readfile},
++ {"reg_executing", 0, 0, f_reg_executing},
++ {"reg_recording", 0, 0, f_reg_recording},
+ {"reltime", 0, 2, f_reltime},
+ #ifdef FEAT_FLOAT
+ {"reltimefloat", 1, 1, f_reltimefloat},
+***************
+*** 8697,8702 ****
+--- 8701,8734 ----
+ fclose(fd);
+ }
+
++ static void
++ return_register(int regname, typval_T *rettv)
++ {
++ char_u buf[2] = {0, 0};
++
++ buf[0] = (char_u)regname;
++ rettv->v_type = VAR_STRING;
++ rettv->vval.v_string = vim_strsave(buf);
++ }
++
++ /*
++ * "reg_executing()" function
++ */
++ static void
++ f_reg_executing(typval_T *argvars UNUSED, typval_T *rettv)
++ {
++ return_register(reg_executing, rettv);
++ }
++
++ /*
++ * "reg_recording()" function
++ */
++ static void
++ f_reg_recording(typval_T *argvars UNUSED, typval_T *rettv)
++ {
++ return_register(reg_recording, rettv);
++ }
++
+ #if defined(FEAT_RELTIME)
+ static int list2proftime(typval_T *arg, proftime_T *tm);
+
+*** ../vim-8.1.0019/src/testdir/test_functions.vim 2018-05-20 14:11:07.125342749 +0200
+--- src/testdir/test_functions.vim 2018-05-22 20:27:42.625937524 +0200
+***************
+*** 923,925 ****
+--- 923,950 ----
+ let chars = join(map(range(1, 0x20) + [0xa0], {n -> nr2char(n)}), '')
+ call assert_equal("x", trim(chars . "x" . chars))
+ endfunc
++
++ " Test for reg_recording() and reg_executing()
++ func Test_reg_executing_and_recording()
++ let s:reg_stat = ''
++ func s:save_reg_stat()
++ let s:reg_stat = reg_recording() . ':' . reg_executing()
++ return ''
++ endfunc
++
++ new
++ call s:save_reg_stat()
++ call assert_equal(':', s:reg_stat)
++ call feedkeys("qa\"=s:save_reg_stat()\<CR>pq", 'xt')
++ call assert_equal('a:', s:reg_stat)
++ call feedkeys("@a", 'xt')
++ call assert_equal(':a', s:reg_stat)
++ call feedkeys("qb@aq", 'xt')
++ call assert_equal('b:a', s:reg_stat)
++ call feedkeys("q\"\"=s:save_reg_stat()\<CR>pq", 'xt')
++ call assert_equal('":', s:reg_stat)
++
++ bwipe!
++ delfunc s:save_reg_stat
++ unlet s:reg_stat
++ endfunc
+*** ../vim-8.1.0019/src/getchar.c 2018-05-13 18:25:53.000000000 +0200
+--- src/getchar.c 2018-05-22 20:21:55.241805765 +0200
+***************
+*** 1244,1250 ****
+ int todo = len;
+
+ /* remember how many chars were last recorded */
+! if (Recording)
+ last_recorded_len += len;
+
+ buf[1] = NUL;
+--- 1244,1250 ----
+ int todo = len;
+
+ /* remember how many chars were last recorded */
+! if (reg_recording != 0)
+ last_recorded_len += len;
+
+ buf[1] = NUL;
+***************
+*** 1254,1260 ****
+ c = *s++;
+ updatescript(c);
+
+! if (Recording)
+ {
+ buf[0] = c;
+ add_buff(&recordbuff, buf, 1L);
+--- 1254,1260 ----
+ c = *s++;
+ updatescript(c);
+
+! if (reg_recording != 0)
+ {
+ buf[0] = c;
+ add_buff(&recordbuff, buf, 1L);
+***************
+*** 2007,2013 ****
+ init_typebuf();
+ start_stuff();
+ if (advance && typebuf.tb_maplen == 0)
+! Exec_reg = FALSE;
+ do
+ {
+ /*
+--- 2007,2013 ----
+ init_typebuf();
+ start_stuff();
+ if (advance && typebuf.tb_maplen == 0)
+! reg_executing = 0;
+ do
+ {
+ /*
+*** ../vim-8.1.0019/src/normal.c 2018-05-10 15:04:13.000000000 +0200
+--- src/normal.c 2018-05-22 20:22:01.537798525 +0200
+***************
+*** 871,878 ****
+ || (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
+ || (ca.cmdchar == 'q'
+ && oap->op_type == OP_NOP
+! && !Recording
+! && !Exec_reg)
+ || ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
+ && (oap->op_type != OP_NOP || VIsual_active))))
+ {
+--- 871,878 ----
+ || (nv_cmds[idx].cmd_flags & NV_NCH_ALW) == NV_NCH_ALW
+ || (ca.cmdchar == 'q'
+ && oap->op_type == OP_NOP
+! && reg_recording == 0
+! && reg_executing == 0)
+ || ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
+ && (oap->op_type != OP_NOP || VIsual_active))))
+ {
+***************
+*** 9324,9330 ****
+ #endif
+ /* (stop) recording into a named register, unless executing a
+ * register */
+! if (!Exec_reg && do_record(cap->nchar) == FAIL)
+ clearopbeep(cap->oap);
+ }
+ }
+--- 9324,9330 ----
+ #endif
+ /* (stop) recording into a named register, unless executing a
+ * register */
+! if (reg_executing == 0 && do_record(cap->nchar) == FAIL)
+ clearopbeep(cap->oap);
+ }
+ }
+*** ../vim-8.1.0019/src/ops.c 2018-05-01 19:10:26.000000000 +0200
+--- src/ops.c 2018-05-22 20:22:13.973784219 +0200
+***************
+*** 1091,1104 ****
+ yankreg_T *old_y_previous, *old_y_current;
+ int retval;
+
+! if (Recording == FALSE) /* start recording */
+ {
+ /* registers 0-9, a-z and " are allowed */
+ if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
+ retval = FAIL;
+ else
+ {
+! Recording = c;
+ showmode();
+ regname = c;
+ retval = OK;
+--- 1091,1104 ----
+ yankreg_T *old_y_previous, *old_y_current;
+ int retval;
+
+! if (reg_recording == 0) /* start recording */
+ {
+ /* registers 0-9, a-z and " are allowed */
+ if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
+ retval = FAIL;
+ else
+ {
+! reg_recording = c;
+ showmode();
+ regname = c;
+ retval = OK;
+***************
+*** 1111,1117 ****
+ * needs to be removed again to put it in a register. exec_reg then
+ * adds the escaping back later.
+ */
+! Recording = FALSE;
+ MSG("");
+ p = get_recorded();
+ if (p == NULL)
+--- 1111,1117 ----
+ * needs to be removed again to put it in a register. exec_reg then
+ * adds the escaping back later.
+ */
+! reg_recording = 0;
+ MSG("");
+ p = get_recorded();
+ if (p == NULL)
+***************
+*** 1318,1324 ****
+ == FAIL)
+ return FAIL;
+ }
+! Exec_reg = TRUE; /* disable the 'q' command */
+ }
+ return retval;
+ }
+--- 1318,1324 ----
+ == FAIL)
+ return FAIL;
+ }
+! reg_executing = regname == 0 ? '"' : regname; // disable "q" command
+ }
+ return retval;
+ }
+*** ../vim-8.1.0019/src/globals.h 2018-05-01 15:29:24.000000000 +0200
+--- src/globals.h 2018-05-22 20:22:30.453765251 +0200
+***************
+*** 933,940 ****
+ EXTERN int exmode_active INIT(= 0); /* zero, EXMODE_NORMAL or EXMODE_VIM */
+ EXTERN int ex_no_reprint INIT(= FALSE); /* no need to print after z or p */
+
+! EXTERN int Recording INIT(= FALSE); /* TRUE when recording into a reg. */
+! EXTERN int Exec_reg INIT(= FALSE); /* TRUE when executing a register */
+
+ EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */
+ EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */
+--- 933,940 ----
+ EXTERN int exmode_active INIT(= 0); /* zero, EXMODE_NORMAL or EXMODE_VIM */
+ EXTERN int ex_no_reprint INIT(= FALSE); /* no need to print after z or p */
+
+! EXTERN int reg_recording INIT(= 0); /* register for recording or zero */
+! EXTERN int reg_executing INIT(= 0); /* register being executed or zero */
+
+ EXTERN int no_mapping INIT(= FALSE); /* currently no mapping allowed */
+ EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */
+*** ../vim-8.1.0019/src/edit.c 2018-05-10 15:03:58.000000000 +0200
+--- src/edit.c 2018-05-22 20:19:41.393959222 +0200
+***************
+*** 8698,8704 ****
+ * When recording or for CTRL-O, need to display the new mode.
+ * Otherwise remove the mode message.
+ */
+! if (Recording || restart_edit != NUL)
+ showmode();
+ else if (p_smd)
+ MSG("");
+--- 8698,8704 ----
+ * When recording or for CTRL-O, need to display the new mode.
+ * Otherwise remove the mode message.
+ */
+! if (reg_recording != 0 || restart_edit != NUL)
+ showmode();
+ else if (p_smd)
+ MSG("");
+*** ../vim-8.1.0019/src/fileio.c 2018-05-21 13:39:36.047906786 +0200
+--- src/fileio.c 2018-05-22 20:19:50.201949153 +0200
+***************
+*** 9274,9280 ****
+
+ if (!did_cursorhold
+ && has_cursorhold()
+! && !Recording
+ && typebuf.tb_len == 0
+ #ifdef FEAT_INS_EXPAND
+ && !ins_compl_active()
+--- 9274,9280 ----
+
+ if (!did_cursorhold
+ && has_cursorhold()
+! && reg_recording == 0
+ && typebuf.tb_len == 0
+ #ifdef FEAT_INS_EXPAND
+ && !ins_compl_active()
+*** ../vim-8.1.0019/src/message.c 2018-04-29 12:18:04.000000000 +0200
+--- src/message.c 2018-05-22 20:20:24.417909998 +0200
+***************
+*** 1025,1031 ****
+ int oldState;
+ int tmpState;
+ int had_got_int;
+! int save_Recording;
+ FILE *save_scriptout;
+
+ if (redraw == TRUE)
+--- 1025,1031 ----
+ int oldState;
+ int tmpState;
+ int had_got_int;
+! int save_reg_recording;
+ FILE *save_scriptout;
+
+ if (redraw == TRUE)
+***************
+*** 1103,1118 ****
+ /* Temporarily disable Recording. If Recording is active, the
+ * character will be recorded later, since it will be added to the
+ * typebuf after the loop */
+! save_Recording = Recording;
+ save_scriptout = scriptout;
+! Recording = FALSE;
+ scriptout = NULL;
+ c = safe_vgetc();
+ if (had_got_int && !global_busy)
+ got_int = FALSE;
+ --no_mapping;
+ --allow_keys;
+! Recording = save_Recording;
+ scriptout = save_scriptout;
+
+ #ifdef FEAT_CLIPBOARD
+--- 1103,1118 ----
+ /* Temporarily disable Recording. If Recording is active, the
+ * character will be recorded later, since it will be added to the
+ * typebuf after the loop */
+! save_reg_recording = reg_recording;
+ save_scriptout = scriptout;
+! reg_recording = 0;
+ scriptout = NULL;
+ c = safe_vgetc();
+ if (had_got_int && !global_busy)
+ got_int = FALSE;
+ --no_mapping;
+ --allow_keys;
+! reg_recording = save_reg_recording;
+ scriptout = save_scriptout;
+
+ #ifdef FEAT_CLIPBOARD
+*** ../vim-8.1.0019/src/screen.c 2018-05-19 14:43:26.775509740 +0200
+--- src/screen.c 2018-05-22 20:20:50.233880413 +0200
+***************
+*** 10255,10261 ****
+ && ((State & INSERT)
+ || restart_edit
+ || VIsual_active));
+! if (do_mode || Recording)
+ {
+ /*
+ * Don't show mode right now, when not redrawing or inside a mapping.
+--- 10255,10261 ----
+ && ((State & INSERT)
+ || restart_edit
+ || VIsual_active));
+! if (do_mode || reg_recording != 0)
+ {
+ /*
+ * Don't show mode right now, when not redrawing or inside a mapping.
+***************
+*** 10414,10420 ****
+
+ need_clear = TRUE;
+ }
+! if (Recording
+ #ifdef FEAT_INS_EXPAND
+ && edit_submode == NULL /* otherwise it gets too long */
+ #endif
+--- 10414,10420 ----
+
+ need_clear = TRUE;
+ }
+! if (reg_recording != 0
+ #ifdef FEAT_INS_EXPAND
+ && edit_submode == NULL /* otherwise it gets too long */
+ #endif
+***************
+*** 10489,10495 ****
+ int save_msg_col = msg_col;
+
+ msg_pos_mode();
+! if (Recording)
+ recording_mode(HL_ATTR(HLF_CM));
+ msg_clr_eos();
+
+--- 10489,10495 ----
+ int save_msg_col = msg_col;
+
+ msg_pos_mode();
+! if (reg_recording != 0)
+ recording_mode(HL_ATTR(HLF_CM));
+ msg_clr_eos();
+
+***************
+*** 10504,10510 ****
+ if (!shortmess(SHM_RECORDING))
+ {
+ char_u s[4];
+! sprintf((char *)s, " @%c", Recording);
+ MSG_PUTS_ATTR(s, attr);
+ }
+ }
+--- 10504,10510 ----
+ if (!shortmess(SHM_RECORDING))
+ {
+ char_u s[4];
+! sprintf((char *)s, " @%c", reg_recording);
+ MSG_PUTS_ATTR(s, attr);
+ }
+ }
+*** ../vim-8.1.0019/src/version.c 2018-05-22 18:31:30.001365739 +0200
+--- src/version.c 2018-05-22 20:33:34.882025227 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 20,
+ /**/
+
+--
+ |
+
+Ceci n'est pas une pipe.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0021 b/data/vim/patches/8.1.0021
new file mode 100644
index 000000000..3106e3ea5
--- /dev/null
+++ b/data/vim/patches/8.1.0021
@@ -0,0 +1,71 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0021
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0021
+Problem: Clang warns for undefined behavior.
+Solution: Move #ifdef outside of sprintf() call.(suggestion by Michael
+ Jarvis, closes #2956)
+Files: src/term.c
+
+
+*** ../vim-8.1.0020/src/term.c 2018-05-10 14:39:42.000000000 +0200
+--- src/term.c 2018-05-23 20:26:41.770633594 +0200
+***************
+*** 2872,2885 ****
+ #else
+ char *format = "%s%s%%dm";
+ #endif
+! sprintf(buf, format,
+! i == 2 ?
+ #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
+! s[1] == '|' ? IF_EB("\033|", ESC_STR "|") :
+ #endif
+! IF_EB("\033[", ESC_STR "[") : "\233",
+! s[i] == '3' ? (n >= 16 ? "38;5;" : "9")
+! : (n >= 16 ? "48;5;" : "10"));
+ OUT_STR(tgoto(buf, 0, n >= 16 ? n : n - 8));
+ }
+ else
+--- 2872,2886 ----
+ #else
+ char *format = "%s%s%%dm";
+ #endif
+! char *lead = i == 2 ? (
+ #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
+! s[1] == '|' ? IF_EB("\033|", ESC_STR "|") :
+ #endif
+! IF_EB("\033[", ESC_STR "[")) : "\233";
+! char *tail = s[i] == '3' ? (n >= 16 ? "38;5;" : "9")
+! : (n >= 16 ? "48;5;" : "10");
+!
+! sprintf(buf, format, lead, tail);
+ OUT_STR(tgoto(buf, 0, n >= 16 ? n : n - 8));
+ }
+ else
+*** ../vim-8.1.0020/src/version.c 2018-05-22 20:35:13.566009271 +0200
+--- src/version.c 2018-05-23 20:30:12.982576453 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 21,
+ /**/
+
+--
+BEDEVERE: And what do you burn, apart from witches?
+FOURTH VILLAGER: ... Wood?
+BEDEVERE: So why do witches burn?
+SECOND VILLAGER: (pianissimo) ... Because they're made of wood...?
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0022 b/data/vim/patches/8.1.0022
new file mode 100644
index 000000000..ce8aff837
--- /dev/null
+++ b/data/vim/patches/8.1.0022
@@ -0,0 +1,79 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0022
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0022
+Problem: Repeating put from expression register fails.
+Solution: Re-evaluate the expression register. (Andy Massimino,
+ closes #2945)
+Files: src/getchar.c, src/testdir/test_put.vim
+
+
+*** ../vim-8.1.0021/src/getchar.c 2018-05-22 20:35:13.554009274 +0200
+--- src/getchar.c 2018-05-23 21:46:55.680567676 +0200
+***************
+*** 844,849 ****
+--- 844,857 ----
+ if (c >= '1' && c < '9')
+ ++c;
+ add_char_buff(&readbuf2, c);
++
++ /* the expression register should be re-evaluated */
++ if (c == '=')
++ {
++ add_char_buff(&readbuf2, CAR);
++ cmd_silent = TRUE;
++ }
++
+ c = read_redo(FALSE, old_redo);
+ }
+
+*** ../vim-8.1.0021/src/testdir/test_put.vim 2017-06-27 15:22:24.000000000 +0200
+--- src/testdir/test_put.vim 2018-05-23 21:44:03.492595109 +0200
+***************
+*** 45,47 ****
+--- 45,60 ----
+ bw!
+ call setreg('a', a[0], a[1])
+ endfunc
++
++ func Test_put_expr()
++ new
++ call setline(1, repeat(['A'], 6))
++ exec "1norm! \"=line('.')\<cr>p"
++ norm! j0.
++ norm! j0.
++ exec "4norm! \"=\<cr>P"
++ norm! j0.
++ norm! j0.
++ call assert_equal(['A1','A2','A3','4A','5A','6A'], getline(1,'$'))
++ bw!
++ endfunc
+*** ../vim-8.1.0021/src/version.c 2018-05-23 20:30:52.738566360 +0200
+--- src/version.c 2018-05-23 21:45:38.776580863 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 22,
+ /**/
+
+--
+The word "leader" is derived from the word "lead", as in the material that
+bullets are made out of. The term "leader" was popularized at about the same
+time as the invention of firearms. It grew out of the observation that the
+person in charge of every organization was the person whom everyone wanted to
+fill with hot lead.
+ I don't recomment this; it's just a point of historical interest.
+ (Scott Adams - The Dilbert principle)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0023 b/data/vim/patches/8.1.0023
new file mode 100644
index 000000000..49fb6543d
--- /dev/null
+++ b/data/vim/patches/8.1.0023
@@ -0,0 +1,57 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0023
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0023
+Problem: gcc 8.1 warns for use of strncpy(). (John Marriott)
+Solution: Use mch_memmove() instead of STRNCPY().
+Files: src/memline.c
+
+
+*** ../vim-8.1.0022/src/memline.c 2018-05-12 16:51:22.000000000 +0200
+--- src/memline.c 2018-05-26 17:30:46.805941698 +0200
+***************
+*** 344,350 ****
+ b0p->b0_magic_int = (int)B0_MAGIC_INT;
+ b0p->b0_magic_short = (short)B0_MAGIC_SHORT;
+ b0p->b0_magic_char = B0_MAGIC_CHAR;
+! STRNCPY(b0p->b0_version, "VIM ", 4);
+ STRNCPY(b0p->b0_version + 4, Version, 6);
+ long_to_char((long)mfp->mf_page_size, b0p->b0_page_size);
+
+--- 344,350 ----
+ b0p->b0_magic_int = (int)B0_MAGIC_INT;
+ b0p->b0_magic_short = (short)B0_MAGIC_SHORT;
+ b0p->b0_magic_char = B0_MAGIC_CHAR;
+! mch_memmove(b0p->b0_version, "VIM ", 4);
+ STRNCPY(b0p->b0_version + 4, Version, 6);
+ long_to_char((long)mfp->mf_page_size, b0p->b0_page_size);
+
+*** ../vim-8.1.0022/src/version.c 2018-05-23 21:53:48.356478969 +0200
+--- src/version.c 2018-05-26 17:32:05.633850332 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 23,
+ /**/
+
+--
+A salesperson says: Translation:
+"backward compatible" Old technology
+"Premium" Overpriced
+"Can't keep it on the shelf" Unavailable
+"Stands alone" Piece of shit
+"Proprietary" Incompatible
+ (Scott Adams - The Dilbert principle)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0024 b/data/vim/patches/8.1.0024
new file mode 100644
index 000000000..eb0deec55
--- /dev/null
+++ b/data/vim/patches/8.1.0024
@@ -0,0 +1,105 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0024
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0024
+Problem: % command not testded on #ifdef and comment.
+Solution: Add tests. (Dominique Pelle, closes #2956)
+Files: src/testdir/test_goto.vim
+
+
+*** ../vim-8.1.0023/src/testdir/test_goto.vim 2017-04-20 18:35:04.000000000 +0200
+--- src/testdir/test_goto.vim 2018-05-26 18:36:54.076751185 +0200
+***************
+*** 309,311 ****
+--- 309,373 ----
+ \ ]
+ call XTest_goto_decl('1gd', lines, 11, 11)
+ endfunc
++
++ func Test_motion_if_elif_else_endif()
++ new
++ a
++ /* Test pressing % on #if, #else #elsif and #endif,
++ * with nested #if
++ */
++ #if FOO
++ /* ... */
++ # if BAR
++ /* ... */
++ # endif
++ #elif BAR
++ /* ... */
++ #else
++ /* ... */
++ #endif
++ .
++ /#if FOO
++ norm %
++ call assert_equal([9, 1], getpos('.')[1:2])
++ norm %
++ call assert_equal([11, 1], getpos('.')[1:2])
++ norm %
++ call assert_equal([13, 1], getpos('.')[1:2])
++ norm %
++ call assert_equal([4, 1], getpos('.')[1:2])
++ /# if BAR
++ norm $%
++ call assert_equal([8, 1], getpos('.')[1:2])
++ norm $%
++ call assert_equal([6, 1], getpos('.')[1:2])
++
++ bw!
++ endfunc
++
++ func Test_motion_c_comment()
++ new
++ a
++ /*
++ * Test pressing % on beginning/end
++ * of C comments.
++ */
++ /* Another comment */
++ .
++ norm gg0%
++ call assert_equal([4, 3], getpos('.')[1:2])
++ norm %
++ call assert_equal([1, 1], getpos('.')[1:2])
++ norm gg0l%
++ call assert_equal([4, 3], getpos('.')[1:2])
++ norm h%
++ call assert_equal([1, 1], getpos('.')[1:2])
++
++ norm G^
++ norm %
++ call assert_equal([5, 21], getpos('.')[1:2])
++ norm %
++ call assert_equal([5, 1], getpos('.')[1:2])
++
++ bw!
++ endfunc
+*** ../vim-8.1.0023/src/version.c 2018-05-26 17:35:19.717625256 +0200
+--- src/version.c 2018-05-26 18:37:48.024690943 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 24,
+ /**/
+
+--
+The fastest way to get an engineer to solve a problem is to declare that the
+problem is unsolvable. No engineer can walk away from an unsolvable problem
+until it's solved.
+ (Scott Adams - The Dilbert principle)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0025 b/data/vim/patches/8.1.0025
new file mode 100644
index 000000000..90c8657c1
--- /dev/null
+++ b/data/vim/patches/8.1.0025
@@ -0,0 +1,169 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0025
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0025
+Problem: No test for the undofile() function.
+Solution: Add test. (Dominique Pelle, closes #2958)
+Files: src/testdir/test_undo.vim
+
+
+*** ../vim-8.1.0024/src/testdir/test_undo.vim 2018-02-06 22:06:44.000000000 +0100
+--- src/testdir/test_undo.vim 2018-05-26 18:45:22.924163341 +0200
+***************
+*** 85,91 ****
+ func FillBuffer()
+ for i in range(1,13)
+ put=i
+! " Set 'undolevels' to split undo.
+ exe "setg ul=" . &g:ul
+ endfor
+ endfunc
+--- 85,91 ----
+ func FillBuffer()
+ for i in range(1,13)
+ put=i
+! " Set 'undolevels' to split undo.
+ exe "setg ul=" . &g:ul
+ endfor
+ endfunc
+***************
+*** 193,211 ****
+ new
+ set ul=100
+
+! let a=execute('undolist')
+ call assert_equal("\nNothing to undo", a)
+
+ " 1 leaf (2 changes).
+ call feedkeys('achange1', 'xt')
+ call feedkeys('achange2', 'xt')
+! let a=execute('undolist')
+ call assert_match("^\nnumber changes when *saved\n *2 *2 .*$", a)
+
+ " 2 leaves.
+ call feedkeys('u', 'xt')
+ call feedkeys('achange3\<Esc>', 'xt')
+! let a=execute('undolist')
+ call assert_match("^\nnumber changes when *saved\n *2 *2 *.*\n *3 *2 .*$", a)
+ close!
+ endfunc
+--- 193,211 ----
+ new
+ set ul=100
+
+! let a = execute('undolist')
+ call assert_equal("\nNothing to undo", a)
+
+ " 1 leaf (2 changes).
+ call feedkeys('achange1', 'xt')
+ call feedkeys('achange2', 'xt')
+! let a = execute('undolist')
+ call assert_match("^\nnumber changes when *saved\n *2 *2 .*$", a)
+
+ " 2 leaves.
+ call feedkeys('u', 'xt')
+ call feedkeys('achange3\<Esc>', 'xt')
+! let a = execute('undolist')
+ call assert_match("^\nnumber changes when *saved\n *2 *2 *.*\n *3 *2 .*$", a)
+ close!
+ endfunc
+***************
+*** 339,345 ****
+ " Also test this in an empty buffer.
+ func Test_cmd_in_reg_undo()
+ enew!
+! let @a="Ox\<Esc>jAy\<Esc>kdd"
+ edit +/^$ test_undo.vim
+ normal @au
+ call assert_equal(0, &modified)
+--- 339,345 ----
+ " Also test this in an empty buffer.
+ func Test_cmd_in_reg_undo()
+ enew!
+! let @a = "Ox\<Esc>jAy\<Esc>kdd"
+ edit +/^$ test_undo.vim
+ normal @au
+ call assert_equal(0, &modified)
+***************
+*** 348,354 ****
+ normal @au
+ call assert_equal(0, &modified)
+ only!
+! let @a=''
+ endfunc
+
+ " This used to cause an illegal memory access
+--- 348,354 ----
+ normal @au
+ call assert_equal(0, &modified)
+ only!
+! let @a = ''
+ endfunc
+
+ " This used to cause an illegal memory access
+***************
+*** 410,412 ****
+--- 410,444 ----
+ exe "norm."
+ bwipe!
+ endfunc
++
++ funct Test_undofile()
++ " Test undofile() without setting 'undodir'.
++ if has('persistent_undo')
++ call assert_equal(fnamemodify('.Xundofoo.un~', ':p'), undofile('Xundofoo'))
++ else
++ call assert_equal('', undofile('Xundofoo'))
++ endif
++ call assert_equal('', undofile(''))
++
++ " Test undofile() with 'undodir' set to to an existing directory.
++ call mkdir('Xundodir')
++ set undodir=Xundodir
++ let cwd = getcwd()
++ if has('win32')
++ " Replace windows drive such as C:... into C%...
++ let cwd = substitute(cwd, '^\([A-Z]\):', '\1%', 'g')
++ endif
++ let cwd = substitute(cwd . '/Xundofoo', '/', '%', 'g')
++ if has('persistent_undo')
++ call assert_equal('Xundodir/' . cwd, undofile('Xundofoo'))
++ else
++ call assert_equal('', undofile('Xundofoo'))
++ endif
++ call assert_equal('', undofile(''))
++ call delete('Xundodir', 'd')
++
++ " Test undofile() with 'undodir' set to a non-existing directory.
++ call assert_equal('', undofile('Xundofoo'))
++
++ set undodir&
++ endfunc
+*** ../vim-8.1.0024/src/version.c 2018-05-26 18:39:29.608575858 +0200
+--- src/version.c 2018-05-26 18:43:40.832284081 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 25,
+ /**/
+
+--
+Engineers are always delighted to share wisdom, even in areas in which they
+have no experience whatsoever. Their logic provides them with inherent
+insight into any field of expertise. This can be a problem when dealing with
+the illogical people who believe that knowledge can only be derived through
+experience.
+ (Scott Adams - The Dilbert principle)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0026 b/data/vim/patches/8.1.0026
new file mode 100644
index 000000000..c60ab888e
--- /dev/null
+++ b/data/vim/patches/8.1.0026
@@ -0,0 +1,55 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0026
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0026
+Problem: Terminal test fails with very tall terminal. (Tom)
+Solution: Fix the terminal window size in the test.
+Files: src/testdir/test_terminal.vim
+
+
+*** ../vim-8.1.0025/src/testdir/test_terminal.vim 2018-05-15 23:48:29.000000000 +0200
+--- src/testdir/test_terminal.vim 2018-05-25 21:32:34.698182317 +0200
+***************
+*** 270,276 ****
+ endfunc
+
+ func Test_terminal_scrollback()
+! let buf = Run_shell_in_terminal({})
+ set termwinscroll=100
+ call writefile(range(150), 'Xtext')
+ if has('win32')
+--- 270,276 ----
+ endfunc
+
+ func Test_terminal_scrollback()
+! let buf = Run_shell_in_terminal({'term_rows': 15})
+ set termwinscroll=100
+ call writefile(range(150), 'Xtext')
+ if has('win32')
+*** ../vim-8.1.0025/src/version.c 2018-05-26 18:46:26.276087941 +0200
+--- src/version.c 2018-05-26 18:57:54.230499767 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 26,
+ /**/
+
+--
+For humans, honesty is a matter of degree. Engineers are always honest in
+matters of technology and human relationships. That's why it's a good idea
+to keep engineers away from customers, romantic interests, and other people
+who can't handle the truth.
+ (Scott Adams - The Dilbert principle)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0027 b/data/vim/patches/8.1.0027
new file mode 100644
index 000000000..46f5fd11c
--- /dev/null
+++ b/data/vim/patches/8.1.0027
@@ -0,0 +1,1480 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0027
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0027
+Problem: Difficult to make a plugin that feeds a line to a job.
+Solution: Add the nitial code for the "prompt" buftype.
+Files: runtime/doc/channel.txt, runtime/doc/eval.txt,
+ runtime/doc/options.txt, runtime/doc/tags, runtime/doc/todo.txt,
+ src/Makefile, src/buffer.c, src/channel.c, src/diff.c, src/edit.c,
+ src/evalfunc.c, src/normal.c, src/ops.c, src/option.c,
+ src/proto/buffer.pro, src/proto/channel.pro, src/proto/edit.pro,
+ src/proto/ops.pro, src/structs.h, src/testdir/Make_all.mak,
+ src/testdir/screendump.vim, src/testdir/test_prompt_buffer.vim
+
+
+*** ../vim-8.1.0026/runtime/doc/channel.txt 2018-05-17 13:40:51.000000000 +0200
+--- runtime/doc/channel.txt 2018-06-03 14:00:04.714957909 +0200
+***************
+*** 22,27 ****
+--- 22,28 ----
+ 9. Starting a job without a channel |job-start-nochannel|
+ 10. Job options |job-options|
+ 11. Controlling a job |job-control|
++ 12. Using a prompt buffer |prompt-buffer|
+
+ {Vi does not have any of these features}
+ {only when compiled with the |+channel| feature for channel stuff}
+***************
+*** 770,774 ****
+--- 771,813 ----
+
+ For more options see |job_stop()|.
+
++ ==============================================================================
++ 12. Using a prompt buffer *prompt-buffer*
++
++ If you want to type input for the job in a Vim window you have a few options:
++ - Use a normal buffer and handle all possible commands yourself.
++ This will be complicated, since there are so many possible commands.
++ - Use a terminal window. This works well if what you type goes directly to
++ the job and the job output is directly displayed in the window.
++ See |terminal-window|.
++ - Use a prompt window. This works well when entering a line for the job in Vim
++ while displaying (possibly filtered) output from the job.
++
++ A prompt buffer is created by setting 'buftype' to "prompt". You would
++ normally only do that in a newly created buffer.
++
++ The user can edit and enter one line of text at the very last line of the
++ buffer. When pressing Enter in the prompt line the callback set with
++ |prompt_setcallback()| is invoked. It would normally send the line to a job.
++ Another callback would receive the output from the job and display it in the
++ buffer, below the prompt (and above the next prompt).
++
++ Only the text in the last line, after the prompt, is editable. The rest of the
++ buffer is not modifiable with Normal mode commands. It can be modified by
++ calling functions, such as |append()|. Using other commands may mess up the
++ buffer.
++
++ After setting 'buftype' to "prompt" Vim does not automatically start Insert
++ mode, use `:startinsert` if you want to enter Insert mode, so that the user
++ can start typing a line.
++
++ The text of the prompt can be set with the |prompt_setprompt()| function.
++
++ The user can go to Normal mode and navigate through the buffer. This can be
++ useful see older output or copy text.
++
++ Any command that starts Insert mode, such as "a", "i", "A" and "I", will move
++ the cursor to the last line, after the prompt.
++
+
+ vim:tw=78:ts=8:ft=help:norl:
+*** ../vim-8.1.0026/runtime/doc/eval.txt 2018-05-22 20:35:13.550009275 +0200
+--- runtime/doc/eval.txt 2018-06-03 14:00:04.722957906 +0200
+***************
+*** 2294,2299 ****
+--- 2294,2302 ----
+ pow({x}, {y}) Float {x} to the power of {y}
+ prevnonblank({lnum}) Number line nr of non-blank line <= {lnum}
+ printf({fmt}, {expr1}...) String format text
++ prompt_addtext({buf}, {expr}) none add text to a prompt buffer
++ prompt_setprompt({buf}, {text}) none set prompt text
++ prompt_setcallback({buf}, {expr}) none set prompt callback function
+ pumvisible() Number whether popup menu is visible
+ pyeval({expr}) any evaluate |Python| expression
+ py3eval({expr}) any evaluate |python3| expression
+***************
+*** 2302,2308 ****
+ List items from {expr} to {max}
+ readfile({fname} [, {binary} [, {max}]])
+ List get list of lines from file {fname}
+! reg_executing() Number get the executing register name
+ reg_recording() String get the recording register name
+ reltime([{start} [, {end}]]) List get time value
+ reltimefloat({time}) Float turn the time value into a Float
+--- 2305,2311 ----
+ List items from {expr} to {max}
+ readfile({fname} [, {binary} [, {max}]])
+ List get list of lines from file {fname}
+! reg_executing() String get the executing register name
+ reg_recording() String get the recording register name
+ reltime([{start} [, {end}]]) List get time value
+ reltimefloat({time}) Float turn the time value into a Float
+***************
+*** 4650,4656 ****
+ from the current buffer. Example: >
+ getline(1)
+ < When {lnum} is a String that doesn't start with a
+! digit, line() is called to translate the String into a Number.
+ To get the line under the cursor: >
+ getline(".")
+ < When {lnum} is smaller than 1 or bigger than the number of
+--- 4653,4659 ----
+ from the current buffer. Example: >
+ getline(1)
+ < When {lnum} is a String that doesn't start with a
+! digit, |line()| is called to translate the String into a Number.
+ To get the line under the cursor: >
+ getline(".")
+ < When {lnum} is smaller than 1 or bigger than the number of
+***************
+*** 5822,5828 ****
+ listing.
+
+ When there is no mapping for {name}, an empty String is
+! returned.
+
+ The {name} can have special key names, like in the ":map"
+ command.
+--- 5825,5832 ----
+ listing.
+
+ When there is no mapping for {name}, an empty String is
+! returned. When the mapping for {name} is empty, then "<Nop>"
+! is returned.
+
+ The {name} can have special key names, like in the ":map"
+ command.
+***************
+*** 5889,5897 ****
+ mapping that matches with {name}, while maparg() only finds a
+ mapping for {name} exactly.
+ When there is no mapping that starts with {name}, an empty
+! String is returned. If there is one, the rhs of that mapping
+ is returned. If there are several mappings that start with
+! {name}, the rhs of one of them is returned.
+ The mappings local to the current buffer are checked first,
+ then the global mappings.
+ This function can be used to check if a mapping can be added
+--- 5893,5902 ----
+ mapping that matches with {name}, while maparg() only finds a
+ mapping for {name} exactly.
+ When there is no mapping that starts with {name}, an empty
+! String is returned. If there is one, the RHS of that mapping
+ is returned. If there are several mappings that start with
+! {name}, the RHS of one of them is returned. This will be
+! "<Nop>" if the RHS is empty.
+ The mappings local to the current buffer are checked first,
+ then the global mappings.
+ This function can be used to check if a mapping can be added
+***************
+*** 6473,6478 ****
+--- 6478,6519 ----
+ arguments an error is given. Up to 18 arguments can be used.
+
+
++ prompt_setprompt({buf}, {text}) *prompt_setprompt()*
++ Set prompt for buffer {buf} to {text}. You most likely want
++ {text} to end in a space.
++ The result is only visible if {buf} has 'buftype' set to
++ "prompt". Example: >
++ call prompt_setprompt(bufnr(''), 'command: ')
++
++
++ prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
++ Set prompt callback for buffer {buf} to {expr}. This has only
++ effect if {buf} has 'buftype' set to "prompt".
++ The callback is invoked when pressing Enter. The current
++ buffer will always be the prompt buffer. A new line for a
++ prompt is added before invoking the callback, thus the prompt
++ for which the callback was invoked will be in the last but one
++ line.
++ If the callback wants to add text to the buffer, it must
++ insert it above the last line, since that is where the current
++ prompt is. This can also be done asynchronously.
++ The callback is invoked with one argument, which is the text
++ that was entered at the prompt. This can be an empty string
++ if the user only typed Enter.
++ Example: >
++ call prompt_setcallback(bufnr(''), function('s:TextEntered'))
++ func s:TextEntered(text)
++ if a:text == 'exit' || a:text == 'quit'
++ stopinsert
++ close
++ else
++ call append(line('$') - 1, 'Entered: "' . a:text . '"')
++ " Reset 'modified' to allow the buffer to be closed.
++ set nomodified
++ endif
++ endfunc
++
++
+ pumvisible() *pumvisible()*
+ Returns non-zero when the popup menu is visible, zero
+ otherwise. See |ins-completion-menu|.
+*** ../vim-8.1.0026/runtime/doc/options.txt 2018-05-17 13:41:41.000000000 +0200
+--- runtime/doc/options.txt 2018-06-03 14:00:04.726957904 +0200
+***************
+*** 1394,1399 ****
+--- 1394,1402 ----
+ manually)
+ terminal buffer for a |terminal| (you are not supposed to set
+ this manually)
++ prompt buffer where only the last line can be edited, meant
++ to be used by a plugin, see |prompt-buffer|
++ {only when compiled with the |+channel| feature}
+
+ This option is used together with 'bufhidden' and 'swapfile' to
+ specify special kinds of buffers. See |special-buffers|.
+***************
+*** 4264,4270 ****
+ 'imactivatefunc' 'imaf' string (default "")
+ global
+ {not in Vi}
+! {only available when compiled with |+mbyte|}
+ This option specifies a function that will be called to
+ activate or deactivate the Input Method.
+ It is not used in the GUI.
+--- 4267,4274 ----
+ 'imactivatefunc' 'imaf' string (default "")
+ global
+ {not in Vi}
+! {only available when compiled with the |+multi_byte|
+! feature}
+ This option specifies a function that will be called to
+ activate or deactivate the Input Method.
+ It is not used in the GUI.
+***************
+*** 4316,4322 ****
+ 'imcmdline' 'imc' boolean (default off)
+ global
+ {not in Vi}
+! {only available when compiled with |+mbyte|}
+ When set the Input Method is always on when starting to edit a command
+ line, unless entering a search pattern (see 'imsearch' for that).
+ Setting this option is useful when your input method allows entering
+--- 4320,4327 ----
+ 'imcmdline' 'imc' boolean (default off)
+ global
+ {not in Vi}
+! {only available when compiled with the |+multi_byte|
+! feature}
+ When set the Input Method is always on when starting to edit a command
+ line, unless entering a search pattern (see 'imsearch' for that).
+ Setting this option is useful when your input method allows entering
+***************
+*** 4327,4333 ****
+ 'imdisable' 'imd' boolean (default off, on for some systems (SGI))
+ global
+ {not in Vi}
+! {only available when compiled with |+mbyte|}
+ When set the Input Method is never used. This is useful to disable
+ the IM when it doesn't work properly.
+ Currently this option is on by default for SGI/IRIX machines. This
+--- 4332,4339 ----
+ 'imdisable' 'imd' boolean (default off, on for some systems (SGI))
+ global
+ {not in Vi}
+! {only available when compiled with the |+multi_byte|
+! feature}
+ When set the Input Method is never used. This is useful to disable
+ the IM when it doesn't work properly.
+ Currently this option is on by default for SGI/IRIX machines. This
+***************
+*** 4380,4386 ****
+ 'imstatusfunc' 'imsf' string (default "")
+ global
+ {not in Vi}
+! {only available when compiled with |+mbyte|}
+ This option specifies a function that is called to obtain the status
+ of Input Method. It must return a positive number when IME is active.
+ It is not used in the GUI.
+--- 4386,4393 ----
+ 'imstatusfunc' 'imsf' string (default "")
+ global
+ {not in Vi}
+! {only available when compiled with the |+multi_byte|
+! feature}
+ This option specifies a function that is called to obtain the status
+ of Input Method. It must return a positive number when IME is active.
+ It is not used in the GUI.
+***************
+*** 5187,5193 ****
+ more depth, set 'maxfuncdepth' to a bigger number. But this will use
+ more memory, there is the danger of failing when memory is exhausted.
+ Increasing this limit above 200 also changes the maximum for Ex
+! command resursion, see |E169|.
+ See also |:function|.
+
+ *'maxmapdepth'* *'mmd'* *E223*
+--- 5194,5200 ----
+ more depth, set 'maxfuncdepth' to a bigger number. But this will use
+ more memory, there is the danger of failing when memory is exhausted.
+ Increasing this limit above 200 also changes the maximum for Ex
+! command recursion, see |E169|.
+ See also |:function|.
+
+ *'maxmapdepth'* *'mmd'* *E223*
+*** ../vim-8.1.0026/runtime/doc/tags 2018-05-17 16:27:20.000000000 +0200
+--- runtime/doc/tags 2018-06-03 14:00:04.730957903 +0200
+***************
+*** 4749,4754 ****
+--- 4749,4755 ----
+ PHP_BracesAtCodeLevel indent.txt /*PHP_BracesAtCodeLevel*
+ PHP_autoformatcomment indent.txt /*PHP_autoformatcomment*
+ PHP_default_indenting indent.txt /*PHP_default_indenting*
++ PHP_noArrowMatching indent.txt /*PHP_noArrowMatching*
+ PHP_outdentSLComments indent.txt /*PHP_outdentSLComments*
+ PHP_outdentphpescape indent.txt /*PHP_outdentphpescape*
+ PHP_removeCRwhenUnix indent.txt /*PHP_removeCRwhenUnix*
+***************
+*** 8058,8063 ****
+--- 8059,8067 ----
+ progname-variable eval.txt /*progname-variable*
+ progpath-variable eval.txt /*progpath-variable*
+ progress.vim syntax.txt /*progress.vim*
++ prompt-buffer channel.txt /*prompt-buffer*
++ prompt_setcallback() eval.txt /*prompt_setcallback()*
++ prompt_setprompt() eval.txt /*prompt_setprompt()*
+ pronounce intro.txt /*pronounce*
+ psql ft_sql.txt /*psql*
+ ptcap.vim syntax.txt /*ptcap.vim*
+***************
+*** 8198,8203 ****
+--- 8202,8209 ----
+ ref intro.txt /*ref*
+ reference intro.txt /*reference*
+ reference_toc help.txt /*reference_toc*
++ reg_executing() eval.txt /*reg_executing()*
++ reg_recording() eval.txt /*reg_recording()*
+ regexp pattern.txt /*regexp*
+ regexp-changes-5.4 version5.txt /*regexp-changes-5.4*
+ register sponsor.txt /*register*
+*** ../vim-8.1.0026/runtime/doc/todo.txt 2018-05-17 13:42:03.000000000 +0200
+--- runtime/doc/todo.txt 2018-06-03 14:00:04.730957903 +0200
+***************
+*** 38,48 ****
+ *known-bugs*
+ -------------------- Known bugs and current work -----------------------
+
+ Terminal emulator window:
+! - Win32: Termdebug doesn't work, because gdb does not support mi2.
+! This plugin: https://github.com/cpiger/NeoDebug runs gdb as a job,
+! redirecting input and output.
+! Open new console for for program with: "set new-console on"
+ - Win32: Redirecting input does not work, half of Test_terminal_redir_file()
+ is disabled.
+ - Win32: Redirecting output works but includes escape sequences.
+--- 38,60 ----
+ *known-bugs*
+ -------------------- Known bugs and current work -----------------------
+
++ Prompt buffer:
++ - Add a command line history.
++ - delay next prompt until plugin gives OK?
++ end?
++
+ Terminal emulator window:
+! - With a vertical split only one window is updated. (Linwei, 2018 Jun 2,
+! #2977)
+! - When typing : at the more prompt, instead of entering a new Vim command, the
+! : is inserted in the terminal window. Should skip terminal_loop here.
+! ()
+! - How to access selection in Terminal running a shell? (damnskippy, 2018 May
+! 27, #29620 When terminal doesn't use the mouse, use modeless selection.
+! - Win32: Termdebug doesn't work, because gdb does not support mi2 on a tty.
+! This plugin: https://github.com/cpiger/NeoDebug runs gdb as a job,
+! redirecting input and output.
+! Open new console for for program with: "set new-console on"
+ - Win32: Redirecting input does not work, half of Test_terminal_redir_file()
+ is disabled.
+ - Win32: Redirecting output works but includes escape sequences.
+***************
+*** 60,66 ****
+ after "run". Everything else works, including communication channel. Not
+ initializing mzscheme avoid the problem, thus it's not some #ifdef.
+
+! Patch to refactor efm_to_regpat(). (Yegappan Lakshmanan, 2018 May 16, #2924)
+
+ Crash when mixing matchadd and substitute()? (Max Christian Pohle, 2018 May
+ 13, #2910) Can't reproduce?
+--- 73,83 ----
+ after "run". Everything else works, including communication channel. Not
+ initializing mzscheme avoid the problem, thus it's not some #ifdef.
+
+! Patch to fix that ++bad no longer works. (Christian Brabandt, on #2947)
+!
+! Does not build with MinGW out of the box:
+! - _stat64 is not defined, need to use "struct stat" in vim.h
+! - WINVER conflict, should use 0x0600 by default?
+
+ Crash when mixing matchadd and substitute()? (Max Christian Pohle, 2018 May
+ 13, #2910) Can't reproduce?
+***************
+*** 68,76 ****
+ On Win32 when not in the console and t_Co >= 256, allow using 'tgc'.
+ (Nobuhiro Takasaki, #2833) Also check t_Co.
+
+! balloon_show() does not work properly in the terminal. (Ben Jackson, 2017 Dec
+! 20, #2481)
+! Also see #2352, want better control over balloon, perhaps set the position.
+
+ Errors found with random data:
+ heap-buffer-overflow in alist_add (#2472)
+--- 85,99 ----
+ On Win32 when not in the console and t_Co >= 256, allow using 'tgc'.
+ (Nobuhiro Takasaki, #2833) Also check t_Co.
+
+! Patch to fix arguments of :edit. (Dominique Pelle, 2018 May 28 #2966)
+!
+! Ptch to update html syntax. (Jorge Maldonado Ventura, #2974)
+!
+! Patch to fix that restoring window doesn't work when 'winheight' is large.
+! (Darrell Nash, 2018 May 30, #2971) Doesn't work? Issue #2970
+!
+! Patch to add completion to :unlet for environment vars. (Jason Franklin, 2018
+! May 30) Last update.
+
+ Errors found with random data:
+ heap-buffer-overflow in alist_add (#2472)
+***************
+*** 78,83 ****
+--- 101,122 ----
+ More warnings from static analysis:
+ https://lgtm.com/projects/g/vim/vim/alerts/?mode=list
+
++ Patch to make "is" and "as" work bettter. (Jason Franklin, 2018 May 19)
++
++ Patch to add tests for user and language completion. (Dominique Pelle, 2018
++ Jun 2, #2978)
++
++ Using ":file" in quickfix window during an autocommand doesn't work.
++ (Jason Franklin, 2018 May 23) Allow for using it when there is no argument.
++
++ Pull request #2967: Allow white space in sign text. (Ben Jackson)
++
++ Patch for xterm and vt320 builtin termcap. (Kouichi Iwamoto, 2018 May 31,
++ #2973)
++
++ Patch to add more testing for :cd command. (Dominique Pelle, 2018 May 30,
++ #2972)
++
+ Script generated by :mksession does not work well if there are windows with
+ modified buffers
+ change "silent only" into "silent only!"
+***************
+*** 85,100 ****
+--- 124,150 ----
+ skip "badd fname" if "fname" is already in the buffer list
+ remove remark about unloading buffers from documentation
+
++ Patch to make :help work for tags with a ?. (Hirohito Higashi, 2018 May 28)
++
+ Compiler warnings (geeknik, 2017 Oct 26):
+ - signed integer overflow in do_sub() (#2249)
+ - signed integer overflow in get_address() (#2248)
+ - signed integer overflow in getdecchrs() (#2254)
+ - undefined left shift in get_string_tv() (#2250)
+
++ Patch for more quickfix refactoring. (Yegappan Lakshmanan, #2950)
++
+ Tests failing for "make testgui" with GTK:
+ - Test_setbufvar_options()
+ - Test_exit_callback_interval()
+
++ Make balloon_show() work outside of 'balloonexpr'? Users expect it to work:
++ #2948. (related to #1512?)
++ On Win32 it stops showing, because showState is already ShS_SHOWING.
++ balloon_show() does not work properly in the terminal. (Ben Jackson, 2017 Dec
++ 20, #2481)
++ Also see #2352, want better control over balloon, perhaps set the position.
++
+ Try out background make plugin:
+ https://github.com/AndrewVos/vim-make-background
+ or asyncmake:
+***************
+*** 109,114 ****
+--- 159,166 ----
+
+ Cursor in wrong position when line wraps. (#2540)
+
++ Patch for Lua support. (Kazunobu Kuriyama, 2018 May 26)
++
+ Add an option similar to 'lazyredraw' to skip redrawing while executing a
+ script or function.
+
+***************
+*** 120,130 ****
+ Should add a test for every command line argument. Check coverage for what is
+ missing: --nofork, -A , -b, -h, etc.
+
+! Completing a command sometimes results in duplicates, since 7.4.672.
+! (Yegappan Lakshmanan, 2018 May 16)
+! Duplication of completion suggestions for ":!hom". Issue #539.
+! Patch by Christian, 2016 Jan 29
+! Another patch in #2733.
+
+ Improve the installer for MS-Windows. There are a few alternatives:
+ - Add silent install option. (Shane Lee, #751)
+--- 172,179 ----
+ Should add a test for every command line argument. Check coverage for what is
+ missing: --nofork, -A , -b, -h, etc.
+
+! Patch for variable tabstops. On github (Christian Brabandt, 2014 May 15)
+! Update 2018 March 12, #2711
+
+ Improve the installer for MS-Windows. There are a few alternatives:
+ - Add silent install option. (Shane Lee, #751)
+***************
+*** 141,146 ****
+--- 190,198 ----
+
+ Alternative manpager.vim. (Enno, 2018 Jan 5, #2529)
+
++ Patch to use NGETTEXT() in many more places. (Sergey Alyoshin, 2018 May 25)
++ Updated ptach May 27.
++
+ Does setting 'cursorline' cause syntax highlighting to slow down? Perhaps is
+ mess up the cache? (Mike Lee Williams, 2018 Jan 27, #2539)
+ Also: 'foldtext' is evaluated too often. (Daniel Hahler, #2773)
+***************
+*** 149,154 ****
+--- 201,207 ----
+ with packages under "start". (xtal8, #1994)
+
+ Patch to support "xxd -ps". (Erik Auerswald, 2018 May 1)
++ Lacks a test.
+
+ Column number is wrong when using 'linebreak' and 'wrap'. (Keith Smiley, 2018
+ Jan 15, #2555)
+***************
+*** 157,164 ****
+
+ Check argument of systemlist(). (Pavlov)
+
+- Patch to add reg_executing() and reg_recording(). (Hirohito Higashi, #2745)
+-
+ No maintainer for Vietnamese translations.
+ No maintainer for Simplified Chinese translations.
+
+--- 210,215 ----
+***************
+*** 1181,1189 ****
+ Patch: On MS-Windows shellescape() may have to triple double quotes.
+ (Ingo Karkat, 2015 Jan 16)
+
+- Patch for variable tabstops. On github (Christian Brabandt, 2014 May 15)
+- Update 2018 March 12, #2711
+-
+ Redo only remembers the last change. Could use "{count}g." to redo an older
+ change. How does the user know which change? At least have a way to list
+ them: ":repeats".
+--- 1232,1237 ----
+*** ../vim-8.1.0026/src/Makefile 2018-05-19 15:00:48.841017887 +0200
+--- src/Makefile 2018-06-03 14:10:39.298297816 +0200
+***************
+*** 2252,2257 ****
+--- 2252,2258 ----
+ test_popup \
+ test_preview \
+ test_profile \
++ test_prompt_buffer \
+ test_put \
+ test_python2 \
+ test_python3 \
+*** ../vim-8.1.0026/src/buffer.c 2018-05-13 18:00:51.000000000 +0200
+--- src/buffer.c 2018-06-03 14:00:04.730957903 +0200
+***************
+*** 851,856 ****
+--- 851,860 ----
+ #ifdef FEAT_TERMINAL
+ free_terminal(buf);
+ #endif
++ #ifdef FEAT_JOB_CHANNEL
++ vim_free(buf->b_prompt_text);
++ free_callback(buf->b_prompt_callback, buf->b_prompt_partial);
++ #endif
+
+ buf_hashtab_remove(buf);
+
+***************
+*** 5634,5639 ****
+--- 5638,5652 ----
+ }
+
+ /*
++ * Return TRUE if "buf" is a prompt buffer.
++ */
++ int
++ bt_prompt(buf_T *buf)
++ {
++ return buf != NULL && buf->b_p_bt[0] == 'p';
++ }
++
++ /*
+ * Return TRUE if "buf" is a "nofile", "acwrite" or "terminal" buffer.
+ * This means the buffer name is not a file name.
+ */
+***************
+*** 5642,5648 ****
+ {
+ return buf != NULL && ((buf->b_p_bt[0] == 'n' && buf->b_p_bt[2] == 'f')
+ || buf->b_p_bt[0] == 'a'
+! || buf->b_p_bt[0] == 't');
+ }
+
+ /*
+--- 5655,5662 ----
+ {
+ return buf != NULL && ((buf->b_p_bt[0] == 'n' && buf->b_p_bt[2] == 'f')
+ || buf->b_p_bt[0] == 'a'
+! || buf->b_p_bt[0] == 't'
+! || buf->b_p_bt[0] == 'p');
+ }
+
+ /*
+***************
+*** 5651,5657 ****
+ int
+ bt_dontwrite(buf_T *buf)
+ {
+! return buf != NULL && (buf->b_p_bt[0] == 'n' || buf->b_p_bt[0] == 't');
+ }
+
+ int
+--- 5665,5673 ----
+ int
+ bt_dontwrite(buf_T *buf)
+ {
+! return buf != NULL && (buf->b_p_bt[0] == 'n'
+! || buf->b_p_bt[0] == 't'
+! || buf->b_p_bt[0] == 'p');
+ }
+
+ int
+*** ../vim-8.1.0026/src/channel.c 2018-05-13 14:00:48.000000000 +0200
+--- src/channel.c 2018-06-03 14:21:30.877730377 +0200
+***************
+*** 5836,5839 ****
+--- 5836,5873 ----
+ return 1;
+ }
+
++ void
++ invoke_prompt_callback(void)
++ {
++ typval_T rettv;
++ int dummy;
++ typval_T argv[2];
++ char_u *text;
++ char_u *prompt;
++ linenr_T lnum = curbuf->b_ml.ml_line_count;
++
++ // Add a new line for the prompt before invoking the callback, so that
++ // text can always be inserted above the last line.
++ ml_append(lnum, (char_u *)"", 0, FALSE);
++ curwin->w_cursor.lnum = lnum + 1;
++ curwin->w_cursor.col = 0;
++
++ if (curbuf->b_prompt_callback == NULL)
++ return;
++ text = ml_get(lnum);
++ prompt = prompt_text();
++ if (STRLEN(text) >= STRLEN(prompt))
++ text += STRLEN(prompt);
++ argv[0].v_type = VAR_STRING;
++ argv[0].vval.v_string = vim_strsave(text);
++ argv[1].v_type = VAR_UNKNOWN;
++
++ call_func(curbuf->b_prompt_callback,
++ (int)STRLEN(curbuf->b_prompt_callback),
++ &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE,
++ curbuf->b_prompt_partial, NULL);
++ clear_tv(&argv[0]);
++ clear_tv(&rettv);
++ }
++
+ #endif /* FEAT_JOB_CHANNEL */
+*** ../vim-8.1.0026/src/diff.c 2018-04-29 12:16:29.000000000 +0200
+--- src/diff.c 2018-06-03 14:00:04.730957903 +0200
+***************
+*** 2141,2146 ****
+--- 2141,2153 ----
+ exarg_T ea;
+ char_u buf[30];
+
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf))
++ {
++ vim_beep(BO_OPER);
++ return;
++ }
++ #endif
+ if (count == 0)
+ ea.arg = (char_u *)"";
+ else
+*** ../vim-8.1.0026/src/edit.c 2018-05-22 20:35:13.562009272 +0200
+--- src/edit.c 2018-06-03 14:25:28.549560429 +0200
+***************
+*** 203,208 ****
+--- 203,211 ----
+
+ static void ins_redraw(int ready);
+ static void ins_ctrl_v(void);
++ #ifdef FEAT_JOB_CHANNEL
++ static void init_prompt(int cmdchar_todo);
++ #endif
+ static void undisplay_dollar(void);
+ static void insert_special(int, int, int);
+ static void internal_format(int textwidth, int second_indent, int flags, int format_only, int c);
+***************
+*** 351,356 ****
+--- 354,362 ----
+ int inserted_space = FALSE; /* just inserted a space */
+ int replaceState = REPLACE;
+ int nomove = FALSE; /* don't move cursor on return */
++ #ifdef FEAT_JOB_CHANNEL
++ int cmdchar_todo = cmdchar;
++ #endif
+
+ /* Remember whether editing was restarted after CTRL-O. */
+ did_restart_edit = restart_edit;
+***************
+*** 707,712 ****
+--- 713,726 ----
+ foldCheckClose();
+ #endif
+
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf))
++ {
++ init_prompt(cmdchar_todo);
++ cmdchar_todo = NUL;
++ }
++ #endif
++
+ /*
+ * If we inserted a character at the last position of the last line in
+ * the window, scroll the window one line up. This avoids an extra
+***************
+*** 1374,1379 ****
+--- 1388,1405 ----
+ goto doESCkey;
+ }
+ #endif
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf))
++ {
++ buf_T *buf = curbuf;
++
++ invoke_prompt_callback();
++ if (curbuf != buf)
++ // buffer changed, get out of Insert mode
++ goto doESCkey;
++ break;
++ }
++ #endif
+ if (ins_eol(c) == FAIL && !p_im)
+ goto doESCkey; /* out of memory */
+ auto_format(FALSE, FALSE);
+***************
+*** 1808,1813 ****
+--- 1834,1891 ----
+ }
+ }
+
++ #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
++ /*
++ * Return the effective prompt for the current buffer.
++ */
++ char_u *
++ prompt_text(void)
++ {
++ if (curbuf->b_prompt_text == NULL)
++ return (char_u *)"% ";
++ return curbuf->b_prompt_text;
++ }
++
++ /*
++ * Prepare for prompt mode: Make sure the last line has the prompt text.
++ * Move the cursor to this line.
++ */
++ static void
++ init_prompt(int cmdchar_todo)
++ {
++ char_u *prompt = prompt_text();
++ char_u *text;
++
++ curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
++ text = ml_get_curline();
++ if (STRNCMP(text, prompt, STRLEN(prompt)) != 0)
++ {
++ // prompt is missing, insert it or append a line with it
++ if (*text == NUL)
++ ml_replace(curbuf->b_ml.ml_line_count, prompt, TRUE);
++ else
++ ml_append(curbuf->b_ml.ml_line_count, prompt, 0, FALSE);
++ curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
++ coladvance((colnr_T)MAXCOL);
++ changed_bytes(curbuf->b_ml.ml_line_count, 0);
++ }
++ if (cmdchar_todo == 'A')
++ coladvance((colnr_T)MAXCOL);
++ if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt))
++ curwin->w_cursor.col = STRLEN(prompt);
++ }
++
++ /*
++ * Return TRUE if the cursor is in the editable position of the prompt line.
++ */
++ int
++ prompt_curpos_editable()
++ {
++ return curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count
++ && curwin->w_cursor.col >= (int)STRLEN(prompt_text());
++ }
++ #endif
++
+ /*
+ * Undo the previous edit_putchar().
+ */
+*** ../vim-8.1.0026/src/evalfunc.c 2018-05-22 20:35:13.554009274 +0200
+--- src/evalfunc.c 2018-06-03 14:06:18.146613314 +0200
+***************
+*** 294,299 ****
+--- 294,303 ----
+ #endif
+ static void f_prevnonblank(typval_T *argvars, typval_T *rettv);
+ static void f_printf(typval_T *argvars, typval_T *rettv);
++ #ifdef FEAT_JOB_CHANNEL
++ static void f_prompt_setcallback(typval_T *argvars, typval_T *rettv);
++ static void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
++ #endif
+ static void f_pumvisible(typval_T *argvars, typval_T *rettv);
+ #ifdef FEAT_PYTHON3
+ static void f_py3eval(typval_T *argvars, typval_T *rettv);
+***************
+*** 744,749 ****
+--- 748,757 ----
+ #endif
+ {"prevnonblank", 1, 1, f_prevnonblank},
+ {"printf", 1, 19, f_printf},
++ #ifdef FEAT_JOB_CHANNEL
++ {"prompt_setcallback", 2, 2, f_prompt_setcallback},
++ {"prompt_setprompt", 2, 2, f_prompt_setprompt},
++ #endif
+ {"pumvisible", 0, 0, f_pumvisible},
+ #ifdef FEAT_PYTHON3
+ {"py3eval", 1, 1, f_py3eval},
+***************
+*** 1240,1245 ****
+--- 1248,1258 ----
+ appended_lines_mark(lnum, added);
+ if (curwin->w_cursor.lnum > lnum)
+ curwin->w_cursor.lnum += added;
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf) && (State & INSERT))
++ // show the line with the prompt
++ update_topline();
++ #endif
+ }
+ else
+ rettv->vval.v_number = 1; /* Failed */
+***************
+*** 8379,8384 ****
+--- 8392,8448 ----
+ did_emsg |= saved_did_emsg;
+ }
+
++ #ifdef FEAT_JOB_CHANNEL
++ /*
++ * "prompt_setcallback({buffer}, {callback})" function
++ */
++ static void
++ f_prompt_setcallback(typval_T *argvars, typval_T *rettv UNUSED)
++ {
++ buf_T *buf;
++ char_u *callback;
++ partial_T *partial;
++
++ if (check_secure())
++ return;
++ buf = get_buf_tv(&argvars[0], FALSE);
++ if (buf == NULL)
++ return;
++
++ callback = get_callback(&argvars[1], &partial);
++ if (callback == NULL)
++ return;
++
++ free_callback(buf->b_prompt_callback, buf->b_prompt_partial);
++ if (partial == NULL)
++ buf->b_prompt_callback = vim_strsave(callback);
++ else
++ /* pointer into the partial */
++ buf->b_prompt_callback = callback;
++ buf->b_prompt_partial = partial;
++ }
++
++ /*
++ * "prompt_setprompt({buffer}, {text})" function
++ */
++ static void
++ f_prompt_setprompt(typval_T *argvars, typval_T *rettv UNUSED)
++ {
++ buf_T *buf;
++ char_u *text;
++
++ if (check_secure())
++ return;
++ buf = get_buf_tv(&argvars[0], FALSE);
++ if (buf == NULL)
++ return;
++
++ text = get_tv_string(&argvars[1]);
++ vim_free(buf->b_prompt_text);
++ buf->b_prompt_text = vim_strsave(text);
++ }
++ #endif
++
+ /*
+ * "pumvisible()" function
+ */
+*** ../vim-8.1.0026/src/normal.c 2018-05-22 20:35:13.558009273 +0200
+--- src/normal.c 2018-06-03 14:00:04.734957901 +0200
+***************
+*** 4180,4185 ****
+--- 4180,4190 ----
+ static void
+ nv_addsub(cmdarg_T *cap)
+ {
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf) && !prompt_curpos_editable())
++ clearopbeep(cap->oap);
++ else
++ #endif
+ if (!VIsual_active && cap->oap->op_type == OP_NOP)
+ {
+ prep_redo_cmd(cap);
+***************
+*** 6214,6219 ****
+--- 6219,6235 ----
+ cmdwin_result = CAR;
+ else
+ #endif
++ #ifdef FEAT_JOB_CHANNEL
++ /* In a prompt buffer a <CR> in the last line invokes the callback. */
++ if (bt_prompt(curbuf) && cap->cmdchar == CAR
++ && curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count)
++ {
++ invoke_prompt_callback();
++ if (restart_edit == 0)
++ restart_edit = 'a';
++ }
++ else
++ #endif
+ {
+ cap->oap->motion_type = MLINE;
+ if (cursor_down(cap->count1, cap->oap->op_type == OP_NOP) == FAIL)
+***************
+*** 6972,6977 ****
+--- 6988,7000 ----
+ {
+ if (!checkclearopq(cap->oap))
+ {
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf))
++ {
++ clearopbeep(cap->oap);
++ return;
++ }
++ #endif
+ u_undo((int)cap->count1);
+ curwin->w_set_curswant = TRUE;
+ }
+***************
+*** 6989,6994 ****
+--- 7012,7024 ----
+
+ if (checkclearop(cap->oap))
+ return;
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf) && !prompt_curpos_editable())
++ {
++ clearopbeep(cap->oap);
++ return;
++ }
++ #endif
+
+ /* get another character */
+ if (cap->nchar == Ctrl_V)
+***************
+*** 7465,7470 ****
+--- 7495,7507 ----
+ if (term_swap_diff() == OK)
+ return;
+ #endif
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf) && !prompt_curpos_editable())
++ {
++ clearopbeep(cap->oap);
++ return;
++ }
++ #endif
+ if (VIsual_active) /* "vs" and "vS" are the same as "vc" */
+ {
+ if (cap->cmdchar == 'S')
+***************
+*** 8570,8576 ****
+--- 8607,8622 ----
+ nv_tilde(cmdarg_T *cap)
+ {
+ if (!p_to && !VIsual_active && cap->oap->op_type != OP_TILDE)
++ {
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf) && !prompt_curpos_editable())
++ {
++ clearopbeep(cap->oap);
++ return;
++ }
++ #endif
+ n_swapchar(cap);
++ }
+ else
+ nv_operator(cap);
+ }
+***************
+*** 8585,8590 ****
+--- 8631,8643 ----
+ int op_type;
+
+ op_type = get_op_type(cap->cmdchar, cap->nchar);
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf) && op_is_change(op_type) && !prompt_curpos_editable())
++ {
++ clearopbeep(cap->oap);
++ return;
++ }
++ #endif
+
+ if (op_type == cap->oap->op_type) /* double operator works on lines */
+ nv_lineop(cap);
+***************
+*** 9426,9431 ****
+--- 9479,9490 ----
+ #endif
+ clearopbeep(cap->oap);
+ }
++ #ifdef FEAT_JOB_CHANNEL
++ else if (bt_prompt(curbuf) && !prompt_curpos_editable())
++ {
++ clearopbeep(cap->oap);
++ }
++ #endif
+ else
+ {
+ dir = (cap->cmdchar == 'P'
+***************
+*** 9551,9556 ****
+--- 9610,9621 ----
+ #endif
+ if (VIsual_active) /* switch start and end of visual */
+ v_swap_corners(cap->cmdchar);
++ #ifdef FEAT_JOB_CHANNEL
++ else if (bt_prompt(curbuf))
++ {
++ clearopbeep(cap->oap);
++ }
++ #endif
+ else
+ n_opencmd(cap);
+ }
+*** ../vim-8.1.0026/src/ops.c 2018-05-22 20:35:13.558009273 +0200
+--- src/ops.c 2018-06-03 14:00:04.734957901 +0200
+***************
+*** 126,168 ****
+ static int fmt_check_par(linenr_T);
+ #endif
+
+ /*
+ * The names of operators.
+ * IMPORTANT: Index must correspond with defines in vim.h!!!
+! * The third field indicates whether the operator always works on lines.
+ */
+ static char opchars[][3] =
+ {
+! {NUL, NUL, FALSE}, /* OP_NOP */
+! {'d', NUL, FALSE}, /* OP_DELETE */
+! {'y', NUL, FALSE}, /* OP_YANK */
+! {'c', NUL, FALSE}, /* OP_CHANGE */
+! {'<', NUL, TRUE}, /* OP_LSHIFT */
+! {'>', NUL, TRUE}, /* OP_RSHIFT */
+! {'!', NUL, TRUE}, /* OP_FILTER */
+! {'g', '~', FALSE}, /* OP_TILDE */
+! {'=', NUL, TRUE}, /* OP_INDENT */
+! {'g', 'q', TRUE}, /* OP_FORMAT */
+! {':', NUL, TRUE}, /* OP_COLON */
+! {'g', 'U', FALSE}, /* OP_UPPER */
+! {'g', 'u', FALSE}, /* OP_LOWER */
+! {'J', NUL, TRUE}, /* DO_JOIN */
+! {'g', 'J', TRUE}, /* DO_JOIN_NS */
+! {'g', '?', FALSE}, /* OP_ROT13 */
+! {'r', NUL, FALSE}, /* OP_REPLACE */
+! {'I', NUL, FALSE}, /* OP_INSERT */
+! {'A', NUL, FALSE}, /* OP_APPEND */
+! {'z', 'f', TRUE}, /* OP_FOLD */
+! {'z', 'o', TRUE}, /* OP_FOLDOPEN */
+! {'z', 'O', TRUE}, /* OP_FOLDOPENREC */
+! {'z', 'c', TRUE}, /* OP_FOLDCLOSE */
+! {'z', 'C', TRUE}, /* OP_FOLDCLOSEREC */
+! {'z', 'd', TRUE}, /* OP_FOLDDEL */
+! {'z', 'D', TRUE}, /* OP_FOLDDELREC */
+! {'g', 'w', TRUE}, /* OP_FORMAT2 */
+! {'g', '@', FALSE}, /* OP_FUNCTION */
+! {Ctrl_A, NUL, FALSE}, /* OP_NR_ADD */
+! {Ctrl_X, NUL, FALSE}, /* OP_NR_SUB */
+ };
+
+ /*
+--- 126,172 ----
+ static int fmt_check_par(linenr_T);
+ #endif
+
++ // Flags for third item in "opchars".
++ #define OPF_LINES 1 // operator always works on lines
++ #define OPF_CHANGE 2 // operator changes text
++
+ /*
+ * The names of operators.
+ * IMPORTANT: Index must correspond with defines in vim.h!!!
+! * The third field holds OPF_ flags.
+ */
+ static char opchars[][3] =
+ {
+! {NUL, NUL, 0}, // OP_NOP
+! {'d', NUL, OPF_CHANGE}, // OP_DELETE
+! {'y', NUL, 0}, // OP_YANK
+! {'c', NUL, OPF_CHANGE}, // OP_CHANGE
+! {'<', NUL, OPF_LINES | OPF_CHANGE}, // OP_LSHIFT
+! {'>', NUL, OPF_LINES | OPF_CHANGE}, // OP_RSHIFT
+! {'!', NUL, OPF_LINES | OPF_CHANGE}, // OP_FILTER
+! {'g', '~', OPF_CHANGE}, // OP_TILDE
+! {'=', NUL, OPF_LINES | OPF_CHANGE}, // OP_INDENT
+! {'g', 'q', OPF_LINES | OPF_CHANGE}, // OP_FORMAT
+! {':', NUL, OPF_LINES}, // OP_COLON
+! {'g', 'U', OPF_CHANGE}, // OP_UPPER
+! {'g', 'u', OPF_CHANGE}, // OP_LOWER
+! {'J', NUL, OPF_LINES | OPF_CHANGE}, // DO_JOIN
+! {'g', 'J', OPF_LINES | OPF_CHANGE}, // DO_JOIN_NS
+! {'g', '?', OPF_CHANGE}, // OP_ROT13
+! {'r', NUL, OPF_CHANGE}, // OP_REPLACE
+! {'I', NUL, OPF_CHANGE}, // OP_INSERT
+! {'A', NUL, OPF_CHANGE}, // OP_APPEND
+! {'z', 'f', OPF_LINES}, // OP_FOLD
+! {'z', 'o', OPF_LINES}, // OP_FOLDOPEN
+! {'z', 'O', OPF_LINES}, // OP_FOLDOPENREC
+! {'z', 'c', OPF_LINES}, // OP_FOLDCLOSE
+! {'z', 'C', OPF_LINES}, // OP_FOLDCLOSEREC
+! {'z', 'd', OPF_LINES}, // OP_FOLDDEL
+! {'z', 'D', OPF_LINES}, // OP_FOLDDELREC
+! {'g', 'w', OPF_LINES | OPF_CHANGE}, // OP_FORMAT2
+! {'g', '@', OPF_CHANGE}, // OP_FUNCTION
+! {Ctrl_A, NUL, OPF_CHANGE}, // OP_NR_ADD
+! {Ctrl_X, NUL, OPF_CHANGE}, // OP_NR_SUB
+ };
+
+ /*
+***************
+*** 201,207 ****
+ int
+ op_on_lines(int op)
+ {
+! return opchars[op][2];
+ }
+
+ /*
+--- 205,220 ----
+ int
+ op_on_lines(int op)
+ {
+! return opchars[op][2] & OPF_LINES;
+! }
+!
+! /*
+! * Return TRUE if operator "op" changes text.
+! */
+! int
+! op_is_change(int op)
+! {
+! return opchars[op][2] & OPF_CHANGE;
+ }
+
+ /*
+*** ../vim-8.1.0026/src/option.c 2018-05-05 16:27:58.000000000 +0200
+--- src/option.c 2018-06-03 14:00:04.738957899 +0200
+***************
+*** 3229,3235 ****
+ static char *(p_scbopt_values[]) = {"ver", "hor", "jump", NULL};
+ static char *(p_debug_values[]) = {"msg", "throw", "beep", NULL};
+ static char *(p_ead_values[]) = {"both", "ver", "hor", NULL};
+! static char *(p_buftype_values[]) = {"nofile", "nowrite", "quickfix", "help", "terminal", "acwrite", NULL};
+ static char *(p_bufhidden_values[]) = {"hide", "unload", "delete", "wipe", NULL};
+ static char *(p_bs_values[]) = {"indent", "eol", "start", NULL};
+ #ifdef FEAT_FOLDING
+--- 3229,3235 ----
+ static char *(p_scbopt_values[]) = {"ver", "hor", "jump", NULL};
+ static char *(p_debug_values[]) = {"msg", "throw", "beep", NULL};
+ static char *(p_ead_values[]) = {"both", "ver", "hor", NULL};
+! static char *(p_buftype_values[]) = {"nofile", "nowrite", "quickfix", "help", "terminal", "acwrite", "prompt", NULL};
+ static char *(p_bufhidden_values[]) = {"hide", "unload", "delete", "wipe", NULL};
+ static char *(p_bs_values[]) = {"indent", "eol", "start", NULL};
+ #ifdef FEAT_FOLDING
+*** ../vim-8.1.0026/src/proto/buffer.pro 2018-05-17 13:52:29.000000000 +0200
+--- src/proto/buffer.pro 2018-06-03 14:00:04.738957899 +0200
+***************
+*** 59,64 ****
+--- 59,65 ----
+ int bt_quickfix(buf_T *buf);
+ int bt_terminal(buf_T *buf);
+ int bt_help(buf_T *buf);
++ int bt_prompt(buf_T *buf);
+ int bt_nofile(buf_T *buf);
+ int bt_dontwrite(buf_T *buf);
+ int bt_dontwrite_msg(buf_T *buf);
+*** ../vim-8.1.0026/src/proto/channel.pro 2018-05-17 13:52:58.000000000 +0200
+--- src/proto/channel.pro 2018-06-03 14:00:04.738957899 +0200
+***************
+*** 71,74 ****
+--- 71,75 ----
+ void job_info(job_T *job, dict_T *dict);
+ void job_info_all(list_T *l);
+ int job_stop(job_T *job, typval_T *argvars, char *type);
++ void invoke_prompt_callback(void);
+ /* vim: set ft=c : */
+*** ../vim-8.1.0026/src/proto/edit.pro 2018-05-17 13:52:32.000000000 +0200
+--- src/proto/edit.pro 2018-06-03 14:22:02.357707185 +0200
+***************
+*** 1,6 ****
+--- 1,8 ----
+ /* edit.c */
+ int edit(int cmdchar, int startln, long count);
+ void edit_putchar(int c, int highlight);
++ char_u *prompt_text(void);
++ int prompt_curpos_editable(void);
+ void edit_unputchar(void);
+ void display_dollar(colnr_T col);
+ void change_indent(int type, int amount, int round, int replaced, int call_changed_bytes);
+*** ../vim-8.1.0026/src/proto/ops.pro 2018-05-17 13:52:47.000000000 +0200
+--- src/proto/ops.pro 2018-06-03 14:00:04.742957898 +0200
+***************
+*** 1,6 ****
+--- 1,7 ----
+ /* ops.c */
+ int get_op_type(int char1, int char2);
+ int op_on_lines(int op);
++ int op_is_change(int op);
+ int get_op_char(int optype);
+ int get_extra_op_char(int optype);
+ void op_shift(oparg_T *oap, int curs_top, int amount);
+*** ../vim-8.1.0026/src/structs.h 2018-05-13 14:01:15.000000000 +0200
+--- src/structs.h 2018-06-03 14:00:04.742957898 +0200
+***************
+*** 2356,2361 ****
+--- 2356,2366 ----
+
+ int b_shortname; /* this file has an 8.3 file name */
+
++ #ifdef FEAT_JOB_CHANNEL
++ char_u *b_prompt_text; // set by prompt_setprompt()
++ char_u *b_prompt_callback; // set by prompt_setcallback()
++ partial_T *b_prompt_partial; // set by prompt_setcallback()
++ #endif
+ #ifdef FEAT_MZSCHEME
+ void *b_mzscheme_ref; /* The MzScheme reference to this buffer */
+ #endif
+*** ../vim-8.1.0026/src/testdir/Make_all.mak 2018-04-10 18:52:08.000000000 +0200
+--- src/testdir/Make_all.mak 2018-06-03 14:00:04.742957898 +0200
+***************
+*** 147,152 ****
+--- 147,153 ----
+ test_perl.res \
+ test_plus_arg_edit.res \
+ test_preview.res \
++ test_prompt_buffer.res \
+ test_profile.res \
+ test_python2.res \
+ test_python3.res \
+*** ../vim-8.1.0026/src/testdir/screendump.vim 2018-05-05 16:33:08.000000000 +0200
+--- src/testdir/screendump.vim 2018-06-03 14:17:25.161921247 +0200
+***************
+*** 5,23 ****
+ finish
+ endif
+
+! " Need to be able to run terminal Vim with 256 colors. On MS-Windows the
+! " console only has 16 colors and the GUI can't run in a terminal.
+! if !has('terminal') || has('win32')
+! func CanRunVimInTerminal()
+! return 0
+! endfunc
+! finish
+! endif
+!
+ func CanRunVimInTerminal()
+! return 1
+ endfunc
+
+ source shared.vim
+
+ " Run Vim with "arguments" in a new terminal window.
+--- 5,22 ----
+ finish
+ endif
+
+! " For most tests we need to be able to run terminal Vim with 256 colors. On
+! " MS-Windows the console only has 16 colors and the GUI can't run in a
+! " terminal.
+ func CanRunVimInTerminal()
+! return has('terminal') && !has('win32')
+ endfunc
+
++ " Skip the rest if there is no terminal feature at all.
++ if !has('terminal')
++ finish
++ endif
++
+ source shared.vim
+
+ " Run Vim with "arguments" in a new terminal window.
+***************
+*** 54,59 ****
+--- 53,59 ----
+ let cols = get(a:options, 'cols', 75)
+
+ let cmd = GetVimCommandClean()
++
+ " Add -v to have gvim run in the terminal (if possible)
+ let cmd .= ' -v ' . a:arguments
+ let buf = term_start(cmd, {'curwin': 1, 'term_rows': rows, 'term_cols': cols})
+***************
+*** 64,74 ****
+ let cols = term_getsize(buf)[1]
+ endif
+
+! " Wait for "All" or "Top" of the ruler in the status line to be shown. This
+! " can be quite slow (e.g. when using valgrind).
+ " If it fails then show the terminal contents for debugging.
+ try
+! call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1})
+ catch /timed out after/
+ let lines = map(range(1, rows), {key, val -> term_getline(buf, val)})
+ call assert_report('RunVimInTerminal() failed, screen contents: ' . join(lines, "<NL>"))
+--- 64,75 ----
+ let cols = term_getsize(buf)[1]
+ endif
+
+! " Wait for "All" or "Top" of the ruler to be shown in the last line or in
+! " the status line of the last window. This can be quite slow (e.g. when
+! " using valgrind).
+ " If it fails then show the terminal contents for debugging.
+ try
+! call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1 || len(term_getline(buf, rows - 1)) >= cols - 1})
+ catch /timed out after/
+ let lines = map(range(1, rows), {key, val -> term_getline(buf, val)})
+ call assert_report('RunVimInTerminal() failed, screen contents: ' . join(lines, "<NL>"))
+***************
+*** 80,86 ****
+ " Stop a Vim running in terminal buffer "buf".
+ func StopVimInTerminal(buf)
+ call assert_equal("running", term_getstatus(a:buf))
+! call term_sendkeys(a:buf, "\<Esc>\<Esc>:qa!\<cr>")
+ call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
+ only!
+ endfunc
+--- 81,87 ----
+ " Stop a Vim running in terminal buffer "buf".
+ func StopVimInTerminal(buf)
+ call assert_equal("running", term_getstatus(a:buf))
+! call term_sendkeys(a:buf, "\<Esc>:qa!\<cr>")
+ call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
+ only!
+ endfunc
+*** ../vim-8.1.0026/src/testdir/test_prompt_buffer.vim 2018-06-03 14:39:38.860806632 +0200
+--- src/testdir/test_prompt_buffer.vim 2018-06-03 14:32:25.681281861 +0200
+***************
+*** 0 ****
+--- 1,55 ----
++ " Tests for setting 'buftype' to "prompt"
++
++ if !has('channel')
++ finish
++ endif
++
++ source shared.vim
++ source screendump.vim
++
++ func Test_prompt_basic()
++ " We need to use a terminal window to be able to feed keys without leaving
++ " Insert mode.
++ if !has('terminal')
++ call assert_report('no terminal')
++ return
++ endif
++ call writefile([
++ \ 'func TextEntered(text)',
++ \ ' if a:text == "exit"',
++ \ ' stopinsert',
++ \ ' close',
++ \ ' else',
++ \ ' " Add the output above the current prompt.',
++ \ ' call append(line("$") - 1, "Command: \"" . a:text . "\"")',
++ \ ' " Reset &modified to allow the buffer to be closed.',
++ \ ' set nomodified',
++ \ ' call timer_start(20, {id -> TimerFunc(a:text)})',
++ \ ' endif',
++ \ 'endfunc',
++ \ '',
++ \ 'func TimerFunc(text)',
++ \ ' " Add the output above the current prompt.',
++ \ ' call append(line("$") - 1, "Result: \"" . a:text . "\"")',
++ \ 'endfunc',
++ \ '',
++ \ 'call setline(1, "other buffer")',
++ \ 'new',
++ \ 'set buftype=prompt',
++ \ 'call prompt_setcallback(bufnr(""), function("TextEntered"))',
++ \ 'startinsert',
++ \ ], 'Xpromptscript')
++ let buf = RunVimInTerminal('-S Xpromptscript', {})
++ call WaitForAssert({-> assert_equal('%', term_getline(buf, 1))})
++
++ call term_sendkeys(buf, "hello\<CR>")
++ call WaitForAssert({-> assert_equal('% hello', term_getline(buf, 1))})
++ call WaitForAssert({-> assert_equal('Command: "hello"', term_getline(buf, 2))})
++ call WaitForAssert({-> assert_equal('Result: "hello"', term_getline(buf, 3))})
++
++ call term_sendkeys(buf, "exit\<CR>")
++ call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
++
++ call StopVimInTerminal(buf)
++ call delete('Xpromptscript')
++ endfunc
+*** ../vim-8.1.0026/src/version.c 2018-05-26 18:58:47.306367819 +0200
+--- src/version.c 2018-06-03 14:04:04.270811668 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 27,
+ /**/
+
+--
+Q: What is the difference between open-source and commercial software?
+A: If you have a problem with commercial software you can call a phone
+ number and they will tell you it might be solved in a future version.
+ For open-source software there isn't a phone number to call, but you
+ get the solution within a day.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0028 b/data/vim/patches/8.1.0028
new file mode 100644
index 000000000..ea9a03657
--- /dev/null
+++ b/data/vim/patches/8.1.0028
@@ -0,0 +1,55 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0028
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0028 (after 8.1.0027)
+Problem: Prompt buffer test fails on MS-Windows.
+Solution: Disable the test for now. Remove stray assert.
+Files: src/testdir/test_prompt_buffer.vim
+
+
+*** ../vim-8.1.0027/src/testdir/test_prompt_buffer.vim 2018-06-03 14:42:17.848505102 +0200
+--- src/testdir/test_prompt_buffer.vim 2018-06-03 15:07:17.978837576 +0200
+***************
+*** 11,17 ****
+ " We need to use a terminal window to be able to feed keys without leaving
+ " Insert mode.
+ if !has('terminal')
+! call assert_report('no terminal')
+ return
+ endif
+ call writefile([
+--- 11,20 ----
+ " We need to use a terminal window to be able to feed keys without leaving
+ " Insert mode.
+ if !has('terminal')
+! return
+! endif
+! if has('win32')
+! " TODO: make this work on MS-Windows
+ return
+ endif
+ call writefile([
+*** ../vim-8.1.0027/src/version.c 2018-06-03 14:42:17.848505102 +0200
+--- src/version.c 2018-06-03 15:02:58.663065129 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 28,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+26. You check your mail. It says "no new messages." So you check it again.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0029 b/data/vim/patches/8.1.0029
new file mode 100644
index 000000000..67db4902b
--- /dev/null
+++ b/data/vim/patches/8.1.0029
@@ -0,0 +1,48 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0029
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0029
+Problem: Terminal test fails on MS-Windows when "wc" exists.
+Solution: Skip test with redirection on MS-Windows.
+Files: src/testdir/test_terminal.vim
+
+
+*** ../vim-8.1.0028/src/testdir/test_terminal.vim 2018-05-26 18:58:47.306367819 +0200
+--- src/testdir/test_terminal.vim 2018-06-03 15:24:23.018768459 +0200
+***************
+*** 580,585 ****
+--- 580,589 ----
+ if !executable('wc')
+ throw 'skipped: wc command not available'
+ endif
++ if has('win32')
++ " TODO: enable once writing to stdin works on MS-Windows
++ return
++ endif
+ new
+ call setline(1, ['one', 'two', 'three'])
+ %term wc
+*** ../vim-8.1.0028/src/version.c 2018-06-03 15:07:59.090802190 +0200
+--- src/version.c 2018-06-03 15:25:29.414749796 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 29,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+27. You refer to your age as 3.x.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0030 b/data/vim/patches/8.1.0030
new file mode 100644
index 000000000..808f50736
--- /dev/null
+++ b/data/vim/patches/8.1.0030
@@ -0,0 +1,80 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0030
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0030
+Problem: Stoping Vim running in a terminal may not work.
+Solution: Instead of sending <Esc> send CTRL-O.
+Files: src/testdir/screendump.vim, src/testdir/test_prompt_buffer.vim
+
+
+*** ../vim-8.1.0029/src/testdir/screendump.vim 2018-06-03 14:42:17.848505102 +0200
+--- src/testdir/screendump.vim 2018-06-03 17:05:18.094429502 +0200
+***************
+*** 81,87 ****
+ " Stop a Vim running in terminal buffer "buf".
+ func StopVimInTerminal(buf)
+ call assert_equal("running", term_getstatus(a:buf))
+! call term_sendkeys(a:buf, "\<Esc>:qa!\<cr>")
+ call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
+ only!
+ endfunc
+--- 81,91 ----
+ " Stop a Vim running in terminal buffer "buf".
+ func StopVimInTerminal(buf)
+ call assert_equal("running", term_getstatus(a:buf))
+!
+! " CTRL-O : works both in Normal mode and Insert mode to start a command line.
+! " In Command-line it's inserted, the CTRL-U removes it again.
+! call term_sendkeys(a:buf, "\<C-O>\<C-U>:qa!\<cr>")
+!
+ call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
+ only!
+ endfunc
+*** ../vim-8.1.0029/src/testdir/test_prompt_buffer.vim 2018-06-03 15:07:59.090802190 +0200
+--- src/testdir/test_prompt_buffer.vim 2018-06-03 17:05:18.094429502 +0200
+***************
+*** 34,42 ****
+--- 34,45 ----
+ \ 'func TimerFunc(text)',
+ \ ' " Add the output above the current prompt.',
+ \ ' call append(line("$") - 1, "Result: \"" . a:text . "\"")',
++ \ ' " Reset &modified to allow the buffer to be closed.',
++ \ ' set nomodified',
+ \ 'endfunc',
+ \ '',
+ \ 'call setline(1, "other buffer")',
++ \ 'set nomodified',
+ \ 'new',
+ \ 'set buftype=prompt',
+ \ 'call prompt_setcallback(bufnr(""), function("TextEntered"))',
+*** ../vim-8.1.0029/src/version.c 2018-06-03 15:26:31.866729762 +0200
+--- src/version.c 2018-06-03 17:07:05.586362470 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 30,
+ /**/
+
+--
+Bypasses are devices that allow some people to dash from point A to
+point B very fast while other people dash from point B to point A very
+fast. People living at point C, being a point directly in between, are
+often given to wonder what's so great about point A that so many people
+from point B are so keen to get there and what's so great about point B
+that so many people from point A are so keen to get there. They often
+wish that people would just once and for all work out where the hell
+they wanted to be.
+ -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0031 b/data/vim/patches/8.1.0031
new file mode 100644
index 000000000..0cfae419b
--- /dev/null
+++ b/data/vim/patches/8.1.0031
@@ -0,0 +1,53 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0031
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0031
+Problem: Terminal test aucmd_on_close is flaky.
+Solution: Wait a bit longer.
+Files: src/testdir/test_terminal.vim
+
+
+*** ../vim-8.1.0030/src/testdir/test_terminal.vim 2018-06-03 15:26:31.866729762 +0200
+--- src/testdir/test_terminal.vim 2018-06-03 18:20:32.978001827 +0200
+***************
+*** 384,390 ****
+ func s:get_sleep_cmd()
+ if s:python != ''
+ let cmd = s:python . " test_short_sleep.py"
+! let waittime = 500
+ else
+ echo 'This will take five seconds...'
+ let waittime = 2000
+--- 384,391 ----
+ func s:get_sleep_cmd()
+ if s:python != ''
+ let cmd = s:python . " test_short_sleep.py"
+! " 500 was not enough for Travis
+! let waittime = 900
+ else
+ echo 'This will take five seconds...'
+ let waittime = 2000
+*** ../vim-8.1.0030/src/version.c 2018-06-03 17:10:36.274226639 +0200
+--- src/version.c 2018-06-03 18:21:37.361916784 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 31,
+ /**/
+
+--
+Don't Panic!
+ -- The Hitchhiker's Guide to the Galaxy
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0032 b/data/vim/patches/8.1.0032
new file mode 100644
index 000000000..f5ea02843
--- /dev/null
+++ b/data/vim/patches/8.1.0032
@@ -0,0 +1,191 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0032
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0032
+Problem: BS in prompt buffer starts new line.
+Solution: Do not allows BS over the prompt. Make term_sendkeys() handle
+ special keys. Add a test.
+Files: src/option.c, src/terminal.c, src/testdir/test_prompt_buffer.vim
+
+
+*** ../vim-8.1.0031/src/option.c 2018-06-03 14:42:17.848505102 +0200
+--- src/option.c 2018-06-04 16:51:10.811551036 +0200
+***************
+*** 12439,12444 ****
+--- 12439,12448 ----
+ can_bs(
+ int what) /* BS_INDENT, BS_EOL or BS_START */
+ {
++ #ifdef FEAT_JOB_CHANNEL
++ if (what == BS_START && bt_prompt(curbuf))
++ return FALSE;
++ #endif
+ switch (*p_bs)
+ {
+ case '2': return TRUE;
+*** ../vim-8.1.0031/src/terminal.c 2018-05-21 22:50:22.514568516 +0200
+--- src/terminal.c 2018-06-04 16:51:10.815551032 +0200
+***************
+*** 5094,5101 ****
+
+ while (*msg != NUL)
+ {
+! send_keys_to_term(term, PTR2CHAR(msg), FALSE);
+! msg += MB_CPTR2LEN(msg);
+ }
+ }
+
+--- 5094,5112 ----
+
+ while (*msg != NUL)
+ {
+! int c;
+!
+! if (*msg == K_SPECIAL && msg[1] != NUL && msg[2] != NUL)
+! {
+! c = TO_SPECIAL(msg[1], msg[2]);
+! msg += 3;
+! }
+! else
+! {
+! c = PTR2CHAR(msg);
+! msg += MB_CPTR2LEN(msg);
+! }
+! send_keys_to_term(term, c, FALSE);
+ }
+ }
+
+*** ../vim-8.1.0031/src/testdir/test_prompt_buffer.vim 2018-06-03 17:10:36.274226639 +0200
+--- src/testdir/test_prompt_buffer.vim 2018-06-04 17:13:41.298470827 +0200
+***************
+*** 7,22 ****
+ source shared.vim
+ source screendump.vim
+
+! func Test_prompt_basic()
+ " We need to use a terminal window to be able to feed keys without leaving
+ " Insert mode.
+ if !has('terminal')
+! return
+ endif
+ if has('win32')
+! " TODO: make this work on MS-Windows
+! return
+ endif
+ call writefile([
+ \ 'func TextEntered(text)',
+ \ ' if a:text == "exit"',
+--- 7,26 ----
+ source shared.vim
+ source screendump.vim
+
+! func CanTestPromptBuffer()
+ " We need to use a terminal window to be able to feed keys without leaving
+ " Insert mode.
+ if !has('terminal')
+! return 0
+ endif
+ if has('win32')
+! " TODO: make the tests work on MS-Windows
+! return 0
+ endif
++ return 1
++ endfunc
++
++ func WriteScript(name)
+ call writefile([
+ \ 'func TextEntered(text)',
+ \ ' if a:text == "exit"',
+***************
+*** 44,51 ****
+ \ 'set buftype=prompt',
+ \ 'call prompt_setcallback(bufnr(""), function("TextEntered"))',
+ \ 'startinsert',
+! \ ], 'Xpromptscript')
+! let buf = RunVimInTerminal('-S Xpromptscript', {})
+ call WaitForAssert({-> assert_equal('%', term_getline(buf, 1))})
+
+ call term_sendkeys(buf, "hello\<CR>")
+--- 48,64 ----
+ \ 'set buftype=prompt',
+ \ 'call prompt_setcallback(bufnr(""), function("TextEntered"))',
+ \ 'startinsert',
+! \ ], a:name)
+! endfunc
+!
+! func Test_prompt_basic()
+! if !CanTestPromptBuffer()
+! return
+! endif
+! let scriptName = 'XpromptscriptBasic'
+! call WriteScript(scriptName)
+!
+! let buf = RunVimInTerminal('-S ' . scriptName, {})
+ call WaitForAssert({-> assert_equal('%', term_getline(buf, 1))})
+
+ call term_sendkeys(buf, "hello\<CR>")
+***************
+*** 57,61 ****
+ call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
+
+ call StopVimInTerminal(buf)
+! call delete('Xpromptscript')
+ endfunc
+--- 70,103 ----
+ call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
+
+ call StopVimInTerminal(buf)
+! call delete(scriptName)
+! endfunc
+!
+! func Test_prompt_editing()
+! if !CanTestPromptBuffer()
+! return
+! endif
+! let scriptName = 'XpromptscriptEditing'
+! call WriteScript(scriptName)
+!
+! let buf = RunVimInTerminal('-S ' . scriptName, {})
+! call WaitForAssert({-> assert_equal('%', term_getline(buf, 1))})
+!
+! let bs = "\<BS>"
+! call term_sendkeys(buf, "hello" . bs . bs)
+! call WaitForAssert({-> assert_equal('% hel', term_getline(buf, 1))})
+!
+! let left = "\<Left>"
+! call term_sendkeys(buf, left . left . left . bs . '-')
+! call WaitForAssert({-> assert_equal('% -hel', term_getline(buf, 1))})
+!
+! let end = "\<End>"
+! call term_sendkeys(buf, end . "x")
+! call WaitForAssert({-> assert_equal('% -helx', term_getline(buf, 1))})
+!
+! call term_sendkeys(buf, "\<C-U>exit\<CR>")
+! call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
+!
+! call StopVimInTerminal(buf)
+! call delete(scriptName)
+ endfunc
+*** ../vim-8.1.0031/src/version.c 2018-06-03 18:21:57.809890160 +0200
+--- src/version.c 2018-06-04 17:05:58.770829349 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 32,
+ /**/
+
+--
+I have a drinking problem -- I can't afford it.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0033 b/data/vim/patches/8.1.0033
new file mode 100644
index 000000000..a16e8bd36
--- /dev/null
+++ b/data/vim/patches/8.1.0033
@@ -0,0 +1,53 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0033
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0033
+Problem: Keys to stop Vim in terminal are wrong. (Marius Gedminas)
+Solution: Move ":" to before CTRL-U.
+Files: src/testdir/screendump.vim
+
+
+*** ../vim-8.1.0032/src/testdir/screendump.vim 2018-06-03 17:10:36.270226642 +0200
+--- src/testdir/screendump.vim 2018-06-04 19:01:48.274497229 +0200
+***************
+*** 84,90 ****
+
+ " CTRL-O : works both in Normal mode and Insert mode to start a command line.
+ " In Command-line it's inserted, the CTRL-U removes it again.
+! call term_sendkeys(a:buf, "\<C-O>\<C-U>:qa!\<cr>")
+
+ call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
+ only!
+--- 84,90 ----
+
+ " CTRL-O : works both in Normal mode and Insert mode to start a command line.
+ " In Command-line it's inserted, the CTRL-U removes it again.
+! call term_sendkeys(a:buf, "\<C-O>:\<C-U>qa!\<cr>")
+
+ call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
+ only!
+*** ../vim-8.1.0032/src/version.c 2018-06-04 17:28:04.729961269 +0200
+--- src/version.c 2018-06-04 19:04:28.410393592 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 33,
+ /**/
+
+--
+How To Keep A Healthy Level Of Insanity:
+3. Every time someone asks you to do something, ask if they want fries
+ with that.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0034 b/data/vim/patches/8.1.0034
new file mode 100644
index 000000000..c1fb32dc1
--- /dev/null
+++ b/data/vim/patches/8.1.0034
@@ -0,0 +1,90 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0034
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0034
+Problem: Cursor not restored with ":edit #".
+Solution: Don't assume autocommands moved the cursor when it was moved to
+ the first non-blank.
+Files: src/ex_cmds.c, src/testdir/test_edit.vim
+
+
+*** ../vim-8.1.0033/src/ex_cmds.c 2018-04-10 18:37:19.000000000 +0200
+--- src/ex_cmds.c 2018-06-04 20:28:56.647447774 +0200
+***************
+*** 4193,4203 ****
+ check_arg_idx(curwin);
+
+ /* If autocommands change the cursor position or topline, we should
+! * keep it. Also when it moves within a line. */
+ if (!EQUAL_POS(curwin->w_cursor, orig_pos))
+ {
+! newlnum = curwin->w_cursor.lnum;
+! newcol = curwin->w_cursor.col;
+ }
+ if (curwin->w_topline == topline)
+ topline = 0;
+--- 4193,4210 ----
+ check_arg_idx(curwin);
+
+ /* If autocommands change the cursor position or topline, we should
+! * keep it. Also when it moves within a line. But not when it moves
+! * to the first non-blank. */
+ if (!EQUAL_POS(curwin->w_cursor, orig_pos))
+ {
+! char_u *text = ml_get_curline();
+!
+! if (curwin->w_cursor.lnum != orig_pos.lnum
+! || curwin->w_cursor.col != (int)(skipwhite(text) - text))
+! {
+! newlnum = curwin->w_cursor.lnum;
+! newcol = curwin->w_cursor.col;
+! }
+ }
+ if (curwin->w_topline == topline)
+ topline = 0;
+*** ../vim-8.1.0033/src/testdir/test_edit.vim 2018-02-09 14:37:30.000000000 +0100
+--- src/testdir/test_edit.vim 2018-06-04 20:28:56.647447774 +0200
+***************
+*** 1387,1389 ****
+--- 1387,1403 ----
+ only
+ endfunc
+
++ func Test_edit_alt()
++ " Keeping the cursor line didn't happen when the first line has indent.
++ new
++ call setline(1, [' one', 'two', 'three'])
++ w XAltFile
++ $
++ call assert_equal(3, line('.'))
++ e Xother
++ e #
++ call assert_equal(3, line('.'))
++
++ bwipe XAltFile
++ call delete('XAltFile')
++ endfunc
+*** ../vim-8.1.0033/src/version.c 2018-06-04 19:11:06.604648995 +0200
+--- src/version.c 2018-06-04 20:31:05.227428478 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 34,
+ /**/
+
+--
+How To Keep A Healthy Level Of Insanity:
+8. Don't use any punctuation marks.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0035 b/data/vim/patches/8.1.0035
new file mode 100644
index 000000000..329d2c528
--- /dev/null
+++ b/data/vim/patches/8.1.0035
@@ -0,0 +1,237 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0035
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0035
+Problem: Not easy to switch between prompt buffer and other windows.
+Solution: Accept CTRL-W commands in Insert mode. Start and stop Insert mode
+ as one would expect.
+Files: src/edit.c, src/ex_docmd.c, src/structs.h, src/window.c
+
+
+*** ../vim-8.1.0034/src/edit.c 2018-06-03 14:42:17.840505115 +0200
+--- src/edit.c 2018-06-06 09:06:43.329569894 +0200
+***************
+*** 811,816 ****
+--- 811,824 ----
+ do
+ {
+ c = safe_vgetc();
++
++ if (stop_insert_mode)
++ {
++ // Insert mode ended, possibly from a callback.
++ count = 0;
++ nomove = TRUE;
++ goto doESCkey;
++ }
+ } while (c == K_IGNORE || c == K_NOP);
+
+ /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */
+***************
+*** 1165,1170 ****
+--- 1173,1190 ----
+ break;
+
+ case Ctrl_W: /* delete word before the cursor */
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf) && (mod_mask & MOD_MASK_SHIFT) == 0)
++ {
++ // In a prompt window CTRL-W is used for window commands.
++ // Use Shift-CTRL-W to delete a word.
++ stuffcharReadbuff(Ctrl_W);
++ restart_edit = 'i';
++ nomove = TRUE;
++ count = 0;
++ goto doESCkey;
++ }
++ #endif
+ did_backspace = ins_bs(c, BACKSPACE_WORD, &inserted_space);
+ auto_format(FALSE, TRUE);
+ break;
+***************
+*** 1869,1874 ****
+--- 1889,1907 ----
+ coladvance((colnr_T)MAXCOL);
+ changed_bytes(curbuf->b_ml.ml_line_count, 0);
+ }
++
++ // Insert always starts after the prompt, allow editing text after it.
++ if (Insstart_orig.lnum != curwin->w_cursor.lnum
++ || Insstart_orig.col != (int)STRLEN(prompt))
++ {
++ Insstart.lnum = curwin->w_cursor.lnum;
++ Insstart.col = STRLEN(prompt);
++ Insstart_orig = Insstart;
++ Insstart_textlen = Insstart.col;
++ Insstart_blank_vcol = MAXCOL;
++ arrow_used = FALSE;
++ }
++
+ if (cmdchar_todo == 'A')
+ coladvance((colnr_T)MAXCOL);
+ if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt))
+*** ../vim-8.1.0034/src/ex_docmd.c 2018-05-08 21:57:39.000000000 +0200
+--- src/ex_docmd.c 2018-06-06 08:58:58.317930716 +0200
+***************
+*** 7341,7347 ****
+ {
+ if (eap->addr_count == 0)
+ ex_win_close(eap->forceit, curwin, NULL);
+! else {
+ FOR_ALL_WINDOWS(win)
+ {
+ winnr++;
+--- 7341,7348 ----
+ {
+ if (eap->addr_count == 0)
+ ex_win_close(eap->forceit, curwin, NULL);
+! else
+! {
+ FOR_ALL_WINDOWS(win)
+ {
+ winnr++;
+*** ../vim-8.1.0034/src/structs.h 2018-06-03 14:42:17.848505102 +0200
+--- src/structs.h 2018-06-06 08:58:58.317930716 +0200
+***************
+*** 2360,2365 ****
+--- 2360,2367 ----
+ char_u *b_prompt_text; // set by prompt_setprompt()
+ char_u *b_prompt_callback; // set by prompt_setcallback()
+ partial_T *b_prompt_partial; // set by prompt_setcallback()
++ int b_prompt_insert; // value for restart_edit when entering
++ // a prompt buffer window.
+ #endif
+ #ifdef FEAT_MZSCHEME
+ void *b_mzscheme_ref; /* The MzScheme reference to this buffer */
+*** ../vim-8.1.0034/src/window.c 2018-05-04 20:09:46.000000000 +0200
+--- src/window.c 2018-06-06 08:58:58.321930713 +0200
+***************
+*** 2103,2108 ****
+--- 2103,2131 ----
+ }
+ }
+
++ #ifdef FEAT_JOB_CHANNEL
++ static void
++ leaving_window(win_T *win)
++ {
++ // When leaving a prompt window stop Insert mode and perhaps restart
++ // it when entering that window again.
++ win->w_buffer->b_prompt_insert = restart_edit;
++ restart_edit = NUL;
++
++ // When leaving the window (or closing the window) was done from a
++ // callback we need to break out of the Insert mode loop.
++ if (State & INSERT)
++ stop_insert_mode = TRUE;
++ }
++
++ static void
++ entering_window(win_T *win)
++ {
++ // When entering the prompt window may restart Insert mode.
++ restart_edit = win->w_buffer->b_prompt_insert;
++ }
++ #endif
++
+ /*
+ * Close all windows for buffer "buf".
+ */
+***************
+*** 2231,2236 ****
+--- 2254,2262 ----
+ if (h != tabline_height())
+ shell_new_rows();
+ }
++ #ifdef FEAT_JOB_CHANNEL
++ entering_window(curwin);
++ #endif
+ /* Since goto_tabpage_tp above did not trigger *Enter autocommands, do
+ * that now. */
+ apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);
+***************
+*** 2296,2301 ****
+--- 2322,2330 ----
+
+ if (win == curwin)
+ {
++ #ifdef FEAT_JOB_CHANNEL
++ leaving_window(curwin);
++ #endif
+ /*
+ * Guess which window is going to be the new current window.
+ * This may change because of the autocommands (sigh).
+***************
+*** 3649,3654 ****
+--- 3678,3686 ----
+ * scrollbars. Have to update them anyway. */
+ gui_may_update_scrollbars();
+ #endif
++ #ifdef FEAT_JOB_CHANNEL
++ entering_window(curwin);
++ #endif
+
+ redraw_all_later(CLEAR);
+ apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf);
+***************
+*** 3822,3827 ****
+--- 3854,3862 ----
+ {
+ tabpage_T *tp = curtab;
+
++ #ifdef FEAT_JOB_CHANNEL
++ leaving_window(curwin);
++ #endif
+ reset_VIsual_and_resel(); /* stop Visual mode */
+ if (trigger_leave_autocmds)
+ {
+***************
+*** 4318,4323 ****
+--- 4353,4363 ----
+ if (wp == curwin && !curwin_invalid) /* nothing to do */
+ return;
+
++ #ifdef FEAT_JOB_CHANNEL
++ if (!curwin_invalid)
++ leaving_window(curwin);
++ #endif
++
+ if (!curwin_invalid && trigger_leave_autocmds)
+ {
+ /*
+***************
+*** 4389,4394 ****
+--- 4429,4437 ----
+ shorten_fnames(TRUE);
+ }
+
++ #ifdef FEAT_JOB_CHANNEL
++ entering_window(curwin);
++ #endif
+ if (trigger_new_autocmds)
+ apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf);
+ if (trigger_enter_autocmds)
+*** ../vim-8.1.0034/src/version.c 2018-06-04 20:34:07.607373577 +0200
+--- src/version.c 2018-06-06 09:01:35.521811501 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 35,
+ /**/
+
+--
+How To Keep A Healthy Level Of Insanity:
+12. Sing along at the opera.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0036 b/data/vim/patches/8.1.0036
new file mode 100644
index 000000000..4162ef227
--- /dev/null
+++ b/data/vim/patches/8.1.0036
@@ -0,0 +1,145 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0036
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0036
+Problem: Not restoring Insert mode if leaving a prompt buffer by using a
+ mouse click.
+Solution: Set b_prompt_insert appropriately. Also correct cursor position
+ when moving cursor to last line.
+Files: src/buffer.c, src/edit.c, src/window.c
+
+
+*** ../vim-8.1.0035/src/buffer.c 2018-06-03 14:42:17.840505115 +0200
+--- src/buffer.c 2018-06-06 17:51:25.004337836 +0200
+***************
+*** 5733,5738 ****
+--- 5733,5742 ----
+ #endif
+ if (buf->b_fname != NULL)
+ return buf->b_fname;
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(buf))
++ return (char_u *)_("[Prompt]");
++ #endif
+ return (char_u *)_("[Scratch]");
+ }
+
+*** ../vim-8.1.0035/src/edit.c 2018-06-06 09:11:07.253357321 +0200
+--- src/edit.c 2018-06-06 17:51:25.004337836 +0200
+***************
+*** 1411,1421 ****
+ #ifdef FEAT_JOB_CHANNEL
+ if (bt_prompt(curbuf))
+ {
+- buf_T *buf = curbuf;
+-
+ invoke_prompt_callback();
+! if (curbuf != buf)
+! // buffer changed, get out of Insert mode
+ goto doESCkey;
+ break;
+ }
+--- 1411,1420 ----
+ #ifdef FEAT_JOB_CHANNEL
+ if (bt_prompt(curbuf))
+ {
+ invoke_prompt_callback();
+! if (!bt_prompt(curbuf))
+! // buffer changed to a non-prompt buffer, get out of
+! // Insert mode
+ goto doESCkey;
+ break;
+ }
+***************
+*** 1906,1911 ****
+--- 1905,1912 ----
+ coladvance((colnr_T)MAXCOL);
+ if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt))
+ curwin->w_cursor.col = STRLEN(prompt);
++ /* Make sure the cursor is in a valid position. */
++ check_cursor();
+ }
+
+ /*
+***************
+*** 9467,9473 ****
+
+ /* If deleted before the insertion point, adjust it */
+ if (curwin->w_cursor.lnum == Insstart_orig.lnum
+! && curwin->w_cursor.col < Insstart_orig.col)
+ Insstart_orig.col = curwin->w_cursor.col;
+
+ /* vi behaviour: the cursor moves backward but the character that
+--- 9468,9474 ----
+
+ /* If deleted before the insertion point, adjust it */
+ if (curwin->w_cursor.lnum == Insstart_orig.lnum
+! && curwin->w_cursor.col < Insstart_orig.col)
+ Insstart_orig.col = curwin->w_cursor.col;
+
+ /* vi behaviour: the cursor moves backward but the character that
+***************
+*** 9517,9522 ****
+--- 9518,9528 ----
+ * previous one to stop insert there properly. */
+ curwin = old_curwin;
+ curbuf = curwin->w_buffer;
++ #ifdef FEAT_JOB_CHANNEL
++ if (bt_prompt(curbuf))
++ // Restart Insert mode when re-entering the prompt buffer.
++ curbuf->b_prompt_insert = 'A';
++ #endif
+ }
+ start_arrow(curwin == old_curwin ? &tpos : NULL);
+ if (curwin != new_curwin && win_valid(new_curwin))
+*** ../vim-8.1.0035/src/window.c 2018-06-06 09:11:07.257357317 +0200
+--- src/window.c 2018-06-06 17:51:25.012337813 +0200
+***************
+*** 2115,2126 ****
+--- 2115,2135 ----
+ // When leaving the window (or closing the window) was done from a
+ // callback we need to break out of the Insert mode loop.
+ if (State & INSERT)
++ {
+ stop_insert_mode = TRUE;
++ if (bt_prompt(win->w_buffer) && win->w_buffer->b_prompt_insert == NUL)
++ win->w_buffer->b_prompt_insert = 'A';
++ }
+ }
+
+ static void
+ entering_window(win_T *win)
+ {
++ // When switching to a prompt buffer that was in Insert mode, don't stop
++ // Insert mode, it may have been set in leaving_window().
++ if (bt_prompt(win->w_buffer) && win->w_buffer->b_prompt_insert != NUL)
++ stop_insert_mode = FALSE;
++
+ // When entering the prompt window may restart Insert mode.
+ restart_edit = win->w_buffer->b_prompt_insert;
+ }
+*** ../vim-8.1.0035/src/version.c 2018-06-06 09:11:07.261357314 +0200
+--- src/version.c 2018-06-06 17:55:55.983628274 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 36,
+ /**/
+
+--
+How To Keep A Healthy Level Of Insanity:
+15. Five days in advance, tell your friends you can't attend their
+ party because you're not in the mood.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0037 b/data/vim/patches/8.1.0037
new file mode 100644
index 000000000..d6b823354
--- /dev/null
+++ b/data/vim/patches/8.1.0037
@@ -0,0 +1,581 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0037
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0037
+Problem: Cannot easily append lines to another buffer.
+Solution: Add appendbufline().
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufline.vim, src/testdir/test_edit.vim
+
+
+*** ../vim-8.1.0036/runtime/doc/eval.txt 2018-06-03 14:42:17.824505143 +0200
+--- runtime/doc/eval.txt 2018-06-06 20:58:47.732807369 +0200
+***************
+*** 2560,2565 ****
+--- 2560,2580 ----
+ 0 for success. Example: >
+ :let failed = append(line('$'), "# THE END")
+ :let failed = append(0, ["Chapter 1", "the beginning"])
++
++ appendbufline({expr}, {lnum}, {text}) *appendbufline()*
++ Like |append()| but append the text in buffer {expr}.
++
++ For the use of {expr}, see |bufname()|.
++
++ {lnum} is used like with |append()|. Note that using |line()|
++ would use the current buffer, not the one appending to.
++ Use "$" to append at the end of the buffer.
++
++ On success 0 is returned, on failure 1 is returned.
++
++ If {expr} is not a valid buffer or {lnum} is not valid, an
++ error message is given. Example: >
++ :let failed = appendbufline(13, 0, "# THE START")
+ <
+ *argc()*
+ argc() The result is the number of files in the argument list of the
+*** ../vim-8.1.0036/src/evalfunc.c 2018-06-03 14:42:17.844505109 +0200
+--- src/evalfunc.c 2018-06-06 20:58:47.740807362 +0200
+***************
+*** 40,45 ****
+--- 40,46 ----
+ static void f_add(typval_T *argvars, typval_T *rettv);
+ static void f_and(typval_T *argvars, typval_T *rettv);
+ static void f_append(typval_T *argvars, typval_T *rettv);
++ static void f_appendbufline(typval_T *argvars, typval_T *rettv);
+ static void f_argc(typval_T *argvars, typval_T *rettv);
+ static void f_argidx(typval_T *argvars, typval_T *rettv);
+ static void f_arglistid(typval_T *argvars, typval_T *rettv);
+***************
+*** 487,492 ****
+--- 488,494 ----
+ {"add", 2, 2, f_add},
+ {"and", 2, 2, f_and},
+ {"append", 2, 2, f_append},
++ {"appendbufline", 3, 3, f_appendbufline},
+ {"argc", 0, 0, f_argc},
+ {"argidx", 0, 0, f_argidx},
+ {"arglistid", 0, 2, f_arglistid},
+***************
+*** 1192,1261 ****
+ }
+
+ /*
+! * "append(lnum, string/list)" function
+ */
+ static void
+! f_append(typval_T *argvars, typval_T *rettv)
+ {
+! long lnum;
+! char_u *line;
+ list_T *l = NULL;
+ listitem_T *li = NULL;
+- typval_T *tv;
+ long added = 0;
+
+! /* When coming here from Insert mode, sync undo, so that this can be
+! * undone separately from what was previously inserted. */
+! if (u_sync_once == 2)
+ {
+! u_sync_once = 1; /* notify that u_sync() was called */
+! u_sync(TRUE);
+ }
+
+! lnum = get_tv_lnum(argvars);
+! if (lnum >= 0
+! && lnum <= curbuf->b_ml.ml_line_count
+! && u_save(lnum, lnum + 1) == OK)
+ {
+! if (argvars[1].v_type == VAR_LIST)
+! {
+! l = argvars[1].vval.v_list;
+! if (l == NULL)
+! return;
+! li = l->lv_first;
+! }
+! for (;;)
+ {
+! if (l == NULL)
+! tv = &argvars[1]; /* append a string */
+! else if (li == NULL)
+! break; /* end of list */
+! else
+! tv = &li->li_tv; /* append item from list */
+! line = get_tv_string_chk(tv);
+! if (line == NULL) /* type error */
+ {
+! rettv->vval.v_number = 1; /* Failed */
+ break;
+ }
+! ml_append(lnum + added, line, (colnr_T)0, FALSE);
+! ++added;
+! if (l == NULL)
+ break;
+ li = li->li_next;
+ }
+
+! appended_lines_mark(lnum, added);
+! if (curwin->w_cursor.lnum > lnum)
+! curwin->w_cursor.lnum += added;
+ #ifdef FEAT_JOB_CHANNEL
+ if (bt_prompt(curbuf) && (State & INSERT))
+ // show the line with the prompt
+ update_topline();
+ #endif
+ }
+ else
+! rettv->vval.v_number = 1; /* Failed */
+ }
+
+ /*
+--- 1194,1378 ----
+ }
+
+ /*
+! * Get the lnum from the first argument.
+! * Also accepts "$", then "buf" is used.
+! * Returns 0 on error.
+! */
+! static linenr_T
+! get_tv_lnum_buf(typval_T *argvars, buf_T *buf)
+! {
+! if (argvars[0].v_type == VAR_STRING
+! && argvars[0].vval.v_string != NULL
+! && argvars[0].vval.v_string[0] == '$'
+! && buf != NULL)
+! return buf->b_ml.ml_line_count;
+! return (linenr_T)get_tv_number_chk(&argvars[0], NULL);
+! }
+!
+! /*
+! * Set line or list of lines in buffer "buf".
+ */
+ static void
+! set_buffer_lines(
+! buf_T *buf,
+! linenr_T lnum_arg,
+! int append,
+! typval_T *lines,
+! typval_T *rettv)
+ {
+! linenr_T lnum = lnum_arg + (append ? 1 : 0);
+! char_u *line = NULL;
+ list_T *l = NULL;
+ listitem_T *li = NULL;
+ long added = 0;
++ linenr_T append_lnum;
++ buf_T *curbuf_save = NULL;
++ win_T *curwin_save = NULL;
++ int is_curbuf = buf == curbuf;
+
+! /* When using the current buffer ml_mfp will be set if needed. Useful when
+! * setline() is used on startup. For other buffers the buffer must be
+! * loaded. */
+! if (buf == NULL || (!is_curbuf && buf->b_ml.ml_mfp == NULL) || lnum < 1)
+ {
+! rettv->vval.v_number = 1; /* FAIL */
+! return;
+ }
+
+! if (!is_curbuf)
+ {
+! wininfo_T *wip;
+!
+! curbuf_save = curbuf;
+! curwin_save = curwin;
+! curbuf = buf;
+! for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+ {
+! if (wip->wi_win != NULL)
+ {
+! curwin = wip->wi_win;
+ break;
+ }
+! }
+! }
+!
+! if (append)
+! // appendbufline() uses the line number below which we insert
+! append_lnum = lnum - 1;
+! else
+! // setbufline() uses the line number above which we insert, we only
+! // append if it's below the last line
+! append_lnum = curbuf->b_ml.ml_line_count;
+!
+! if (lines->v_type == VAR_LIST)
+! {
+! l = lines->vval.v_list;
+! li = l->lv_first;
+! }
+! else
+! line = get_tv_string_chk(lines);
+!
+! /* default result is zero == OK */
+! for (;;)
+! {
+! if (l != NULL)
+! {
+! /* list argument, get next string */
+! if (li == NULL)
+ break;
++ line = get_tv_string_chk(&li->li_tv);
+ li = li->li_next;
+ }
+
+! rettv->vval.v_number = 1; /* FAIL */
+! if (line == NULL || lnum > curbuf->b_ml.ml_line_count + 1)
+! break;
+!
+! /* When coming here from Insert mode, sync undo, so that this can be
+! * undone separately from what was previously inserted. */
+! if (u_sync_once == 2)
+! {
+! u_sync_once = 1; /* notify that u_sync() was called */
+! u_sync(TRUE);
+! }
+!
+! if (!append && lnum <= curbuf->b_ml.ml_line_count)
+! {
+! /* existing line, replace it */
+! if (u_savesub(lnum) == OK && ml_replace(lnum, line, TRUE) == OK)
+! {
+! changed_bytes(lnum, 0);
+! if (is_curbuf && lnum == curwin->w_cursor.lnum)
+! check_cursor_col();
+! rettv->vval.v_number = 0; /* OK */
+! }
+! }
+! else if (added > 0 || u_save(lnum - 1, lnum) == OK)
+! {
+! /* append the line */
+! ++added;
+! if (ml_append(lnum - 1, line, (colnr_T)0, FALSE) == OK)
+! rettv->vval.v_number = 0; /* OK */
+! }
+!
+! if (l == NULL) /* only one string argument */
+! break;
+! ++lnum;
+! }
+!
+! if (added > 0)
+! {
+! win_T *wp;
+! tabpage_T *tp;
+!
+! appended_lines_mark(append_lnum, added);
+! FOR_ALL_TAB_WINDOWS(tp, wp)
+! if (wp->w_buffer == buf && wp->w_cursor.lnum > append_lnum)
+! wp->w_cursor.lnum += added;
+! check_cursor_col();
+!
+ #ifdef FEAT_JOB_CHANNEL
+ if (bt_prompt(curbuf) && (State & INSERT))
+ // show the line with the prompt
+ update_topline();
+ #endif
+ }
++
++ if (!is_curbuf)
++ {
++ curbuf = curbuf_save;
++ curwin = curwin_save;
++ }
++ }
++
++ /*
++ * "append(lnum, string/list)" function
++ */
++ static void
++ f_append(typval_T *argvars, typval_T *rettv)
++ {
++ linenr_T lnum = get_tv_lnum(&argvars[0]);
++
++ set_buffer_lines(curbuf, lnum, TRUE, &argvars[1], rettv);
++ }
++
++ /*
++ * "appendbufline(buf, lnum, string/list)" function
++ */
++ static void
++ f_appendbufline(typval_T *argvars, typval_T *rettv)
++ {
++ linenr_T lnum;
++ buf_T *buf;
++
++ buf = get_buf_tv(&argvars[0], FALSE);
++ if (buf == NULL)
++ rettv->vval.v_number = 1; /* FAIL */
+ else
+! {
+! lnum = get_tv_lnum_buf(&argvars[1], buf);
+! set_buffer_lines(buf, lnum, TRUE, &argvars[2], rettv);
+! }
+ }
+
+ /*
+***************
+*** 4276,4297 ****
+ }
+
+ /*
+- * Get the lnum from the first argument.
+- * Also accepts "$", then "buf" is used.
+- * Returns 0 on error.
+- */
+- static linenr_T
+- get_tv_lnum_buf(typval_T *argvars, buf_T *buf)
+- {
+- if (argvars[0].v_type == VAR_STRING
+- && argvars[0].vval.v_string != NULL
+- && argvars[0].vval.v_string[0] == '$'
+- && buf != NULL)
+- return buf->b_ml.ml_line_count;
+- return (linenr_T)get_tv_number_chk(&argvars[0], NULL);
+- }
+-
+- /*
+ * "getbufline()" function
+ */
+ static void
+--- 4393,4398 ----
+***************
+*** 10226,10340 ****
+ }
+
+ /*
+- * Set line or list of lines in buffer "buf".
+- */
+- static void
+- set_buffer_lines(buf_T *buf, linenr_T lnum, typval_T *lines, typval_T *rettv)
+- {
+- char_u *line = NULL;
+- list_T *l = NULL;
+- listitem_T *li = NULL;
+- long added = 0;
+- linenr_T lcount;
+- buf_T *curbuf_save = NULL;
+- win_T *curwin_save = NULL;
+- int is_curbuf = buf == curbuf;
+-
+- /* When using the current buffer ml_mfp will be set if needed. Useful when
+- * setline() is used on startup. For other buffers the buffer must be
+- * loaded. */
+- if (buf == NULL || (!is_curbuf && buf->b_ml.ml_mfp == NULL) || lnum < 1)
+- {
+- rettv->vval.v_number = 1; /* FAIL */
+- return;
+- }
+-
+- if (!is_curbuf)
+- {
+- wininfo_T *wip;
+-
+- curbuf_save = curbuf;
+- curwin_save = curwin;
+- curbuf = buf;
+- for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+- {
+- if (wip->wi_win != NULL)
+- {
+- curwin = wip->wi_win;
+- break;
+- }
+- }
+- }
+-
+- lcount = curbuf->b_ml.ml_line_count;
+-
+- if (lines->v_type == VAR_LIST)
+- {
+- l = lines->vval.v_list;
+- li = l->lv_first;
+- }
+- else
+- line = get_tv_string_chk(lines);
+-
+- /* default result is zero == OK */
+- for (;;)
+- {
+- if (l != NULL)
+- {
+- /* list argument, get next string */
+- if (li == NULL)
+- break;
+- line = get_tv_string_chk(&li->li_tv);
+- li = li->li_next;
+- }
+-
+- rettv->vval.v_number = 1; /* FAIL */
+- if (line == NULL || lnum > curbuf->b_ml.ml_line_count + 1)
+- break;
+-
+- /* When coming here from Insert mode, sync undo, so that this can be
+- * undone separately from what was previously inserted. */
+- if (u_sync_once == 2)
+- {
+- u_sync_once = 1; /* notify that u_sync() was called */
+- u_sync(TRUE);
+- }
+-
+- if (lnum <= curbuf->b_ml.ml_line_count)
+- {
+- /* existing line, replace it */
+- if (u_savesub(lnum) == OK && ml_replace(lnum, line, TRUE) == OK)
+- {
+- changed_bytes(lnum, 0);
+- if (is_curbuf && lnum == curwin->w_cursor.lnum)
+- check_cursor_col();
+- rettv->vval.v_number = 0; /* OK */
+- }
+- }
+- else if (added > 0 || u_save(lnum - 1, lnum) == OK)
+- {
+- /* lnum is one past the last line, append the line */
+- ++added;
+- if (ml_append(lnum - 1, line, (colnr_T)0, FALSE) == OK)
+- rettv->vval.v_number = 0; /* OK */
+- }
+-
+- if (l == NULL) /* only one string argument */
+- break;
+- ++lnum;
+- }
+-
+- if (added > 0)
+- appended_lines_mark(lcount, added);
+-
+- if (!is_curbuf)
+- {
+- curbuf = curbuf_save;
+- curwin = curwin_save;
+- }
+- }
+-
+- /*
+ * "setbufline()" function
+ */
+ static void
+--- 10327,10332 ----
+***************
+*** 10351,10358 ****
+ else
+ {
+ lnum = get_tv_lnum_buf(&argvars[1], buf);
+!
+! set_buffer_lines(buf, lnum, &argvars[2], rettv);
+ }
+ }
+
+--- 10343,10349 ----
+ else
+ {
+ lnum = get_tv_lnum_buf(&argvars[1], buf);
+! set_buffer_lines(buf, lnum, FALSE, &argvars[2], rettv);
+ }
+ }
+
+***************
+*** 10512,10518 ****
+ {
+ linenr_T lnum = get_tv_lnum(&argvars[0]);
+
+! set_buffer_lines(curbuf, lnum, &argvars[1], rettv);
+ }
+
+ static void set_qf_ll_list(win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *what_arg, typval_T *rettv);
+--- 10503,10509 ----
+ {
+ linenr_T lnum = get_tv_lnum(&argvars[0]);
+
+! set_buffer_lines(curbuf, lnum, FALSE, &argvars[1], rettv);
+ }
+
+ static void set_qf_ll_list(win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *what_arg, typval_T *rettv);
+*** ../vim-8.1.0036/src/testdir/test_bufline.vim 2017-11-06 21:26:52.000000000 +0100
+--- src/testdir/test_bufline.vim 2018-06-06 20:58:47.740807362 +0200
+***************
+*** 1,4 ****
+! " Tests for setbufline() and getbufline()
+
+ source shared.vim
+
+--- 1,4 ----
+! " Tests for setbufline(), getbufline(), appendbufline()
+
+ source shared.vim
+
+***************
+*** 65,67 ****
+--- 65,92 ----
+ call delete('Xscript')
+ call delete('Xtest')
+ endfunc
++
++ func Test_appendbufline()
++ new
++ let b = bufnr('%')
++ hide
++ call assert_equal(0, appendbufline(b, 0, ['foo', 'bar']))
++ call assert_equal(['foo'], getbufline(b, 1))
++ call assert_equal(['bar'], getbufline(b, 2))
++ call assert_equal(['foo', 'bar'], getbufline(b, 1, 2))
++ exe "bd!" b
++ call assert_equal([], getbufline(b, 1, 2))
++
++ split Xtest
++ call setline(1, ['a', 'b', 'c'])
++ let b = bufnr('%')
++ wincmd w
++ call assert_equal(1, appendbufline(b, 4, ['x']))
++ call assert_equal(1, appendbufline(1234, 1, ['x']))
++ call assert_equal(0, appendbufline(b, 3, ['d', 'e']))
++ call assert_equal(['c'], getbufline(b, 3))
++ call assert_equal(['d'], getbufline(b, 4))
++ call assert_equal(['e'], getbufline(b, 5))
++ call assert_equal([], getbufline(b, 6))
++ exe "bwipe! " . b
++ endfunc
+*** ../vim-8.1.0036/src/testdir/test_edit.vim 2018-06-04 20:34:07.607373577 +0200
+--- src/testdir/test_edit.vim 2018-06-06 20:58:47.740807362 +0200
+***************
+*** 527,533 ****
+ " Tab in completion mode
+ let path=expand("%:p:h")
+ new
+! call setline(1, [path."/", ''])
+ call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix')
+ call assert_match('runtest\.vim', getline(1))
+ %d
+--- 527,533 ----
+ " Tab in completion mode
+ let path=expand("%:p:h")
+ new
+! call setline(1, [path. "/", ''])
+ call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix')
+ call assert_match('runtest\.vim', getline(1))
+ %d
+*** ../vim-8.1.0036/src/version.c 2018-06-06 18:02:31.402773772 +0200
+--- src/version.c 2018-06-06 21:00:46.040701324 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 37,
+ /**/
+
+--
+How To Keep A Healthy Level Of Insanity:
+16. Have your coworkers address you by your wrestling name, Rock Hard Kim.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0038 b/data/vim/patches/8.1.0038
new file mode 100644
index 000000000..323476c14
--- /dev/null
+++ b/data/vim/patches/8.1.0038
@@ -0,0 +1,55 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0038
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0038
+Problem: Popup test causes Vim to exit.
+Solution: Disable the broken part of the test for now.
+Files: src/testdir/test_popup.vim
+
+
+*** ../vim-8.1.0037/src/testdir/test_popup.vim 2018-05-08 22:37:19.000000000 +0200
+--- src/testdir/test_popup.vim 2018-06-07 15:17:15.202630184 +0200
+***************
+*** 247,252 ****
+--- 247,256 ----
+ iunmap <F5>
+ endfunc
+
++ " TODO: Fix what breaks after this line.
++ " - Do not use "q!", it may exit Vim if there is an error
++ finish
++
+ func Test_noinsert_complete()
+ function! s:complTest1() abort
+ call complete(1, ['source', 'soundfold'])
+*** ../vim-8.1.0037/src/version.c 2018-06-06 21:03:57.780523901 +0200
+--- src/version.c 2018-06-07 15:18:16.722616394 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 38,
+ /**/
+
+--
+In many of the more relaxed civilizations on the Outer Eastern Rim of the
+Galaxy, "The Hitchhiker's Guide to the Galaxy" has already supplanted the
+great "Encyclopedia Galactica" as the standard repository of all knowledge
+and wisdom, for though it has many omissions and contains much that is
+apocryphal, or at least wildly inaccurate, it scores over the older, more
+pedestrian work in two important respects.
+First, it is slightly cheaper; and second, it has the words "DON'T PANIC"
+inscribed in large friendly letters on its cover.
+ -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0039 b/data/vim/patches/8.1.0039
new file mode 100644
index 000000000..29988ae68
--- /dev/null
+++ b/data/vim/patches/8.1.0039
@@ -0,0 +1,306 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0039
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0039
+Problem: Cannot easily delete lines in another buffer.
+Solution: Add deletebufline().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_bufline.vim
+
+
+*** ../vim-8.1.0038/runtime/doc/eval.txt 2018-06-06 21:03:57.776523905 +0200
+--- runtime/doc/eval.txt 2018-06-07 18:13:41.137548220 +0200
+***************
+*** 2110,2115 ****
+--- 2110,2117 ----
+ cursor({list}) Number move cursor to position in {list}
+ deepcopy({expr} [, {noref}]) any make a full copy of {expr}
+ delete({fname} [, {flags}]) Number delete the file or directory {fname}
++ deletebufline({expr}, {first}[, {last}])
++ Number delete lines from buffer {expr}
+ did_filetype() Number |TRUE| if FileType autocmd event used
+ diff_filler({lnum}) Number diff filler lines about {lnum}
+ diff_hlID({lnum}, {col}) Number diff highlighting at {lnum}/{col}
+***************
+*** 3517,3524 ****
+ successful and -1 when the deletion failed or partly failed.
+
+ Use |remove()| to delete an item from a |List|.
+! To delete a line from the buffer use |:delete|. Use |:exe|
+! when the line number is in a variable.
+
+ *did_filetype()*
+ did_filetype() Returns |TRUE| when autocommands are being executed and the
+--- 3519,3537 ----
+ successful and -1 when the deletion failed or partly failed.
+
+ Use |remove()| to delete an item from a |List|.
+! To delete a line from the buffer use |:delete| or
+! |deletebufline()|.
+!
+! deletebufline({expr}, {first}[, {last}]) *deletebufline()*
+! Delete lines {first} to {last} (inclusive) from buffer {expr}.
+! If {last} is omitted then delete line {first} only.
+! On success 0 is returned, on failure 1 is returned.
+!
+! For the use of {expr}, see |bufname()| above.
+!
+! {first} and {last} are used like with |setline()|. Note that
+! when using |line()| this refers to the current buffer. Use "$"
+! to refer to the last line in buffer {expr}.
+
+ *did_filetype()*
+ did_filetype() Returns |TRUE| when autocommands are being executed and the
+*** ../vim-8.1.0038/src/evalfunc.c 2018-06-06 21:03:57.780523901 +0200
+--- src/evalfunc.c 2018-06-07 18:06:46.657672665 +0200
+***************
+*** 125,130 ****
+--- 125,131 ----
+ static void f_cursor(typval_T *argsvars, typval_T *rettv);
+ static void f_deepcopy(typval_T *argvars, typval_T *rettv);
+ static void f_delete(typval_T *argvars, typval_T *rettv);
++ static void f_deletebufline(typval_T *argvars, typval_T *rettv);
+ static void f_did_filetype(typval_T *argvars, typval_T *rettv);
+ static void f_diff_filler(typval_T *argvars, typval_T *rettv);
+ static void f_diff_hlID(typval_T *argvars, typval_T *rettv);
+***************
+*** 577,582 ****
+--- 578,584 ----
+ {"cursor", 1, 3, f_cursor},
+ {"deepcopy", 1, 2, f_deepcopy},
+ {"delete", 1, 2, f_delete},
++ {"deletebufline", 2, 3, f_deletebufline},
+ {"did_filetype", 0, 0, f_did_filetype},
+ {"diff_filler", 1, 1, f_diff_filler},
+ {"diff_hlID", 2, 2, f_diff_hlID},
+***************
+*** 1210,1215 ****
+--- 1212,1235 ----
+ }
+
+ /*
++ * If there is a window for "curbuf", make it the current window.
++ */
++ static void
++ find_win_for_curbuf(void)
++ {
++ wininfo_T *wip;
++
++ for (wip = curbuf->b_wininfo; wip != NULL; wip = wip->wi_next)
++ {
++ if (wip->wi_win != NULL)
++ {
++ curwin = wip->wi_win;
++ break;
++ }
++ }
++ }
++
++ /*
+ * Set line or list of lines in buffer "buf".
+ */
+ static void
+***************
+*** 1241,1259 ****
+
+ if (!is_curbuf)
+ {
+- wininfo_T *wip;
+-
+ curbuf_save = curbuf;
+ curwin_save = curwin;
+ curbuf = buf;
+! for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+! {
+! if (wip->wi_win != NULL)
+! {
+! curwin = wip->wi_win;
+! break;
+! }
+! }
+ }
+
+ if (append)
+--- 1261,1270 ----
+
+ if (!is_curbuf)
+ {
+ curbuf_save = curbuf;
+ curwin_save = curwin;
+ curbuf = buf;
+! find_win_for_curbuf();
+ }
+
+ if (append)
+***************
+*** 2808,2813 ****
+--- 2819,2911 ----
+ }
+
+ /*
++ * "deletebufline()" function
++ */
++ static void
++ f_deletebufline(argvars, rettv)
++ typval_T *argvars;
++ typval_T *rettv;
++ {
++ buf_T *buf;
++ linenr_T first, last;
++ linenr_T lnum;
++ long count;
++ int is_curbuf;
++ buf_T *curbuf_save = NULL;
++ win_T *curwin_save = NULL;
++ tabpage_T *tp;
++ win_T *wp;
++
++ buf = get_buf_tv(&argvars[0], FALSE);
++ if (buf == NULL)
++ {
++ rettv->vval.v_number = 1; /* FAIL */
++ return;
++ }
++ is_curbuf = buf == curbuf;
++
++ first = get_tv_lnum_buf(&argvars[1], buf);
++ if (argvars[2].v_type != VAR_UNKNOWN)
++ last = get_tv_lnum_buf(&argvars[2], buf);
++ else
++ last = first;
++
++ if (buf->b_ml.ml_mfp == NULL || first < 1
++ || first > buf->b_ml.ml_line_count || last < first)
++ {
++ rettv->vval.v_number = 1; /* FAIL */
++ return;
++ }
++
++ if (!is_curbuf)
++ {
++ curbuf_save = curbuf;
++ curwin_save = curwin;
++ curbuf = buf;
++ find_win_for_curbuf();
++ }
++ if (last > curbuf->b_ml.ml_line_count)
++ last = curbuf->b_ml.ml_line_count;
++ count = last - first + 1;
++
++ // When coming here from Insert mode, sync undo, so that this can be
++ // undone separately from what was previously inserted.
++ if (u_sync_once == 2)
++ {
++ u_sync_once = 1; // notify that u_sync() was called
++ u_sync(TRUE);
++ }
++
++ if (u_save(first - 1, last + 1) == FAIL)
++ {
++ rettv->vval.v_number = 1; /* FAIL */
++ return;
++ }
++
++ for (lnum = first; lnum <= last; ++lnum)
++ ml_delete(first, TRUE);
++
++ FOR_ALL_TAB_WINDOWS(tp, wp)
++ if (wp->w_buffer == buf)
++ {
++ if (wp->w_cursor.lnum > last)
++ wp->w_cursor.lnum -= count;
++ else if (wp->w_cursor.lnum> first)
++ wp->w_cursor.lnum = first;
++ if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count)
++ wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
++ }
++ check_cursor_col();
++ deleted_lines_mark(first, count);
++
++ if (!is_curbuf)
++ {
++ curbuf = curbuf_save;
++ curwin = curwin_save;
++ }
++ }
++
++ /*
+ * "did_filetype()" function
+ */
+ static void
+*** ../vim-8.1.0038/src/testdir/test_bufline.vim 2018-06-06 21:03:57.780523901 +0200
+--- src/testdir/test_bufline.vim 2018-06-07 18:06:46.657672665 +0200
+***************
+*** 1,4 ****
+! " Tests for setbufline(), getbufline(), appendbufline()
+
+ source shared.vim
+
+--- 1,4 ----
+! " Tests for setbufline(), getbufline(), appendbufline(), deletebufline()
+
+ source shared.vim
+
+***************
+*** 90,92 ****
+--- 90,114 ----
+ call assert_equal([], getbufline(b, 6))
+ exe "bwipe! " . b
+ endfunc
++
++ func Test_deletebufline()
++ new
++ let b = bufnr('%')
++ call setline(1, ['aaa', 'bbb', 'ccc'])
++ hide
++ call assert_equal(0, deletebufline(b, 2))
++ call assert_equal(['aaa', 'ccc'], getbufline(b, 1, 2))
++ call assert_equal(0, deletebufline(b, 2, 8))
++ call assert_equal(['aaa'], getbufline(b, 1, 2))
++ exe "bd!" b
++ call assert_equal(1, deletebufline(b, 1))
++
++ split Xtest
++ call setline(1, ['a', 'b', 'c'])
++ let b = bufnr('%')
++ wincmd w
++ call assert_equal(1, deletebufline(b, 4))
++ call assert_equal(0, deletebufline(b, 1))
++ call assert_equal(['b', 'c'], getbufline(b, 1, 2))
++ exe "bwipe! " . b
++ endfunc
+*** ../vim-8.1.0038/src/version.c 2018-06-07 15:18:36.826611722 +0200
+--- src/version.c 2018-06-07 18:07:51.517608846 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 39,
+ /**/
+
+--
+Now it is such a bizarrely improbable coincidence that anything as
+mind-bogglingly useful as the Babel fish could have evolved purely by chance
+that some thinkers have chosen to see it as a final and clinching proof of the
+NON-existence of God.
+The argument goes something like this: 'I refuse to prove that I exist,' says
+God, 'for proof denies faith, and without faith I am nothing.'
+'But,' says Man, 'the Babel fish is a dead giveaway, isn't it? It could not
+have evolved by chance. It proves you exist, and so therefore, by your own
+arguments, you don't. QED.'
+'Oh dear,' says God, 'I hadn't thought of that,' and promptly vanishes in a
+puff of logic.
+'Oh, that was easy,' says Man, and for an encore goes on to prove that black
+is white and gets himself killed on the next pedestrian crossing.
+ -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0040 b/data/vim/patches/8.1.0040
new file mode 100644
index 000000000..aa6d44f8a
--- /dev/null
+++ b/data/vim/patches/8.1.0040
@@ -0,0 +1,73 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0040
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0040
+Problem: Warnings from 64-bit compiler.
+Solution: Add type casts. (Mike Williams)
+Files: src/edit.c
+
+
+*** ../vim-8.1.0039/src/edit.c 2018-06-06 18:02:31.402773772 +0200
+--- src/edit.c 2018-06-10 13:11:02.468619199 +0200
+***************
+*** 1894,1900 ****
+ || Insstart_orig.col != (int)STRLEN(prompt))
+ {
+ Insstart.lnum = curwin->w_cursor.lnum;
+! Insstart.col = STRLEN(prompt);
+ Insstart_orig = Insstart;
+ Insstart_textlen = Insstart.col;
+ Insstart_blank_vcol = MAXCOL;
+--- 1894,1900 ----
+ || Insstart_orig.col != (int)STRLEN(prompt))
+ {
+ Insstart.lnum = curwin->w_cursor.lnum;
+! Insstart.col = (int)STRLEN(prompt);
+ Insstart_orig = Insstart;
+ Insstart_textlen = Insstart.col;
+ Insstart_blank_vcol = MAXCOL;
+***************
+*** 1904,1910 ****
+ if (cmdchar_todo == 'A')
+ coladvance((colnr_T)MAXCOL);
+ if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt))
+! curwin->w_cursor.col = STRLEN(prompt);
+ /* Make sure the cursor is in a valid position. */
+ check_cursor();
+ }
+--- 1904,1910 ----
+ if (cmdchar_todo == 'A')
+ coladvance((colnr_T)MAXCOL);
+ if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt))
+! curwin->w_cursor.col = (int)STRLEN(prompt);
+ /* Make sure the cursor is in a valid position. */
+ check_cursor();
+ }
+*** ../vim-8.1.0039/src/version.c 2018-06-07 18:17:42.278227523 +0200
+--- src/version.c 2018-06-10 13:12:46.188502730 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 40,
+ /**/
+
+--
+The technology involved in making anything invisible is so infinitely
+complex that nine hundred and ninety-nine billion, nine hundred and
+ninety-nine million, nine hundred and ninety-nine thousand, nine hundred
+and ninety-nine times out of a trillion it is much simpler and more
+effective just to take the thing away and do without it.
+ -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0041 b/data/vim/patches/8.1.0041
new file mode 100644
index 000000000..a244d05d1
--- /dev/null
+++ b/data/vim/patches/8.1.0041
@@ -0,0 +1,107 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0041
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0041
+Problem: Attribute "width" missing from python window attribute list.
+Solution: Add the item. (Ken Takata) Order the list like the items are used
+ in the WindowAttr() function.
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok
+
+
+*** ../vim-8.1.0040/src/if_py_both.h 2018-05-15 22:30:34.000000000 +0200
+--- src/if_py_both.h 2018-06-10 13:46:57.656741596 +0200
+***************
+*** 3836,3844 ****
+ else
+ return firstwin;
+ }
+ static char *WindowAttrs[] = {
+! "buffer", "cursor", "height", "vars", "options", "number", "row", "col",
+! "tabpage", "valid",
+ NULL
+ };
+
+--- 3836,3855 ----
+ else
+ return firstwin;
+ }
++
++ // Use the same order as in the WindowAttr() function.
+ static char *WindowAttrs[] = {
+! "buffer",
+! "cursor",
+! "height",
+! "row",
+! "width",
+! "col",
+! "vars",
+! "options",
+! "number",
+! "tabpage",
+! "valid",
+ NULL
+ };
+
+*** ../vim-8.1.0040/src/testdir/test86.ok 2017-11-09 19:53:22.000000000 +0100
+--- src/testdir/test86.ok 2018-06-10 13:54:16.580100057 +0200
+***************
+*** 443,449 ****
+ vim.current.tabpage:TabPage:True
+ current:__dir__,__members__,buffer,line,range,tabpage,window
+ buffer:__dir__,__members__,append,mark,name,number,options,range,valid,vars
+! window:__dir__,__members__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars
+ tabpage:__dir__,__members__,number,valid,vars,window,windows
+ range:__dir__,__members__,append,end,start
+ dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
+--- 443,449 ----
+ vim.current.tabpage:TabPage:True
+ current:__dir__,__members__,buffer,line,range,tabpage,window
+ buffer:__dir__,__members__,append,mark,name,number,options,range,valid,vars
+! window:__dir__,__members__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars,width
+ tabpage:__dir__,__members__,number,valid,vars,window,windows
+ range:__dir__,__members__,append,end,start
+ dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
+*** ../vim-8.1.0040/src/testdir/test87.ok 2017-11-09 19:53:46.000000000 +0100
+--- src/testdir/test87.ok 2018-06-10 13:55:00.692036859 +0200
+***************
+*** 443,449 ****
+ vim.current.tabpage:TabPage:True
+ current:__dir__,buffer,line,range,tabpage,window
+ buffer:__dir__,append,mark,name,number,options,range,valid,vars
+! window:__dir__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars
+ tabpage:__dir__,number,valid,vars,window,windows
+ range:__dir__,append,end,start
+ dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
+--- 443,449 ----
+ vim.current.tabpage:TabPage:True
+ current:__dir__,buffer,line,range,tabpage,window
+ buffer:__dir__,append,mark,name,number,options,range,valid,vars
+! window:__dir__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars,width
+ tabpage:__dir__,number,valid,vars,window,windows
+ range:__dir__,append,end,start
+ dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
+*** ../vim-8.1.0040/src/version.c 2018-06-10 13:12:52.176496009 +0200
+--- src/version.c 2018-06-10 13:51:40.632325004 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 41,
+ /**/
+
+--
+'Well, here's something to occupy you and keep your mind off things.'
+'It won't work, I have an exceptionally large mind.'
+ -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0042 b/data/vim/patches/8.1.0042
new file mode 100644
index 000000000..ad8f947cf
--- /dev/null
+++ b/data/vim/patches/8.1.0042
@@ -0,0 +1,110 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0042
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0042
+Problem: If omni completion opens a window Insert mode is stopped.
+ (Hirohito Higashi)
+Solution: Only set stop_insert_mode in a prompt buffer window.
+Files: src/window.c
+
+
+*** ../vim-8.1.0041/src/window.c 2018-06-06 18:02:31.402773772 +0200
+--- src/window.c 2018-06-10 14:33:03.071395777 +0200
+***************
+*** 2107,2123 ****
+ static void
+ leaving_window(win_T *win)
+ {
+ // When leaving a prompt window stop Insert mode and perhaps restart
+ // it when entering that window again.
+ win->w_buffer->b_prompt_insert = restart_edit;
+ restart_edit = NUL;
+
+ // When leaving the window (or closing the window) was done from a
+! // callback we need to break out of the Insert mode loop.
+ if (State & INSERT)
+ {
+ stop_insert_mode = TRUE;
+! if (bt_prompt(win->w_buffer) && win->w_buffer->b_prompt_insert == NUL)
+ win->w_buffer->b_prompt_insert = 'A';
+ }
+ }
+--- 2107,2128 ----
+ static void
+ leaving_window(win_T *win)
+ {
++ // Only matters for a prompt window.
++ if (!bt_prompt(win->w_buffer))
++ return;
++
+ // When leaving a prompt window stop Insert mode and perhaps restart
+ // it when entering that window again.
+ win->w_buffer->b_prompt_insert = restart_edit;
+ restart_edit = NUL;
+
+ // When leaving the window (or closing the window) was done from a
+! // callback we need to break out of the Insert mode loop and restart Insert
+! // mode when entering the window again.
+ if (State & INSERT)
+ {
+ stop_insert_mode = TRUE;
+! if (win->w_buffer->b_prompt_insert == NUL)
+ win->w_buffer->b_prompt_insert = 'A';
+ }
+ }
+***************
+*** 2125,2136 ****
+ static void
+ entering_window(win_T *win)
+ {
+ // When switching to a prompt buffer that was in Insert mode, don't stop
+ // Insert mode, it may have been set in leaving_window().
+! if (bt_prompt(win->w_buffer) && win->w_buffer->b_prompt_insert != NUL)
+ stop_insert_mode = FALSE;
+
+! // When entering the prompt window may restart Insert mode.
+ restart_edit = win->w_buffer->b_prompt_insert;
+ }
+ #endif
+--- 2130,2146 ----
+ static void
+ entering_window(win_T *win)
+ {
++ // Only matters for a prompt window.
++ if (!bt_prompt(win->w_buffer))
++ return;
++
+ // When switching to a prompt buffer that was in Insert mode, don't stop
+ // Insert mode, it may have been set in leaving_window().
+! if (win->w_buffer->b_prompt_insert != NUL)
+ stop_insert_mode = FALSE;
+
+! // When entering the prompt window restart Insert mode if we were in Insert
+! // mode when we left it.
+ restart_edit = win->w_buffer->b_prompt_insert;
+ }
+ #endif
+*** ../vim-8.1.0041/src/version.c 2018-06-10 13:55:48.527949068 +0200
+--- src/version.c 2018-06-10 14:38:47.846545314 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 42,
+ /**/
+
+--
+The only backup you need is the one that you didn't have time for.
+(Murphy)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0043 b/data/vim/patches/8.1.0043
new file mode 100644
index 000000000..3a03439a6
--- /dev/null
+++ b/data/vim/patches/8.1.0043
@@ -0,0 +1,109 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0043
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0043
+Problem: ++bad argument of :edit does not work properly.
+Solution: Return FAIL from get_bad_opt() only when there is no valid
+ argument. (Dominique Pelle, Christian Brabandt, closes #2966,
+ closes #2947)
+Files: src/ex_docmd.c, src/testdir/test_plus_arg_edit.vim
+
+
+*** ../vim-8.1.0042/src/ex_docmd.c 2018-06-06 09:11:07.257357317 +0200
+--- src/ex_docmd.c 2018-06-12 12:34:07.224425589 +0200
+***************
+*** 5318,5324 ****
+ eap->bad_char = BAD_DROP;
+ else if (MB_BYTE2LEN(*p) == 1 && p[1] == NUL)
+ eap->bad_char = *p;
+! return FAIL;
+ }
+ #endif
+
+--- 5318,5326 ----
+ eap->bad_char = BAD_DROP;
+ else if (MB_BYTE2LEN(*p) == 1 && p[1] == NUL)
+ eap->bad_char = *p;
+! else
+! return FAIL;
+! return OK;
+ }
+ #endif
+
+*** ../vim-8.1.0042/src/testdir/test_plus_arg_edit.vim 2017-11-21 11:34:15.000000000 +0100
+--- src/testdir/test_plus_arg_edit.vim 2018-06-12 12:34:07.228425586 +0200
+***************
+*** 1,10 ****
+ " Tests for complicated + argument to :edit command
+ function Test_edit()
+! call writefile(["foo|bar"], "Xfile1")
+! call writefile(["foo/bar"], "Xfile2")
+ edit +1|s/|/PIPE/|w Xfile1| e Xfile2|1 | s/\//SLASH/|w
+ call assert_equal(["fooPIPEbar"], readfile("Xfile1"))
+ call assert_equal(["fooSLASHbar"], readfile("Xfile2"))
+ call delete('Xfile1')
+ call delete('Xfile2')
+ endfunction
+--- 1,38 ----
+ " Tests for complicated + argument to :edit command
+ function Test_edit()
+! call writefile(["foo|bar"], "Xfile1")
+! call writefile(["foo/bar"], "Xfile2")
+ edit +1|s/|/PIPE/|w Xfile1| e Xfile2|1 | s/\//SLASH/|w
+ call assert_equal(["fooPIPEbar"], readfile("Xfile1"))
+ call assert_equal(["fooSLASHbar"], readfile("Xfile2"))
+ call delete('Xfile1')
+ call delete('Xfile2')
+ endfunction
++
++ func Test_edit_bad()
++ if !has('multi_byte')
++ finish
++ endif
++
++ " Test loading a utf8 file with bad utf8 sequences.
++ call writefile(["[\xff][\xc0][\xe2\x89\xf0][\xc2\xc2]"], "Xfile")
++ new
++
++ " Without ++bad=..., the default behavior is like ++bad=?
++ e! ++enc=utf8 Xfile
++ call assert_equal('[?][?][???][??]', getline(1))
++
++ e! ++enc=utf8 ++bad=_ Xfile
++ call assert_equal('[_][_][___][__]', getline(1))
++
++ e! ++enc=utf8 ++bad=drop Xfile
++ call assert_equal('[][][][]', getline(1))
++
++ e! ++enc=utf8 ++bad=keep Xfile
++ call assert_equal("[\xff][\xc0][\xe2\x89\xf0][\xc2\xc2]", getline(1))
++
++ call assert_fails('e! ++enc=utf8 ++bad=foo Xfile', 'E474:')
++
++ bw!
++ call delete('Xfile')
++ endfunc
+*** ../vim-8.1.0042/src/version.c 2018-06-10 14:39:47.022412206 +0200
+--- src/version.c 2018-06-12 12:37:19.442760084 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 43,
+ /**/
+
+--
+Have you heard about the new Beowulf cluster? It's so fast, it executes
+an infinite loop in 6 seconds.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0044 b/data/vim/patches/8.1.0044
new file mode 100644
index 000000000..94cc14c3d
--- /dev/null
+++ b/data/vim/patches/8.1.0044
@@ -0,0 +1,82 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0044
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0044
+Problem: If a test function exists Vim this may go unnoticed.
+Solution: Check for a test funtion quitting Vim. Fix tests that did exit
+ Vim.
+Files: src/testdir/runtest.vim, src/testdir/test_assert.vim
+
+
+*** ../vim-8.1.0043/src/testdir/runtest.vim 2018-04-10 18:56:35.000000000 +0200
+--- src/testdir/runtest.vim 2018-06-12 14:57:06.691409091 +0200
+***************
+*** 124,130 ****
+--- 124,133 ----
+ exe 'call ' . a:test
+ else
+ try
++ let s:test = a:test
++ au VimLeavePre * call EarlyExit(s:test)
+ exe 'call ' . a:test
++ au! VimLeavePre
+ catch /^\cskipped/
+ call add(s:messages, ' Skipped')
+ call add(s:skipped, 'SKIPPED ' . a:test . ': ' . substitute(v:exception, '^\S*\s\+', '', ''))
+***************
+*** 174,179 ****
+--- 177,191 ----
+ endif
+ endfunc
+
++ func EarlyExit(test)
++ " It's OK for the test we use to test the quit detection.
++ if a:test != 'Test_zz_quit_detected()'
++ call add(v:errors, 'Test caused Vim to exit: ' . a:test)
++ endif
++
++ call FinishTesting()
++ endfunc
++
+ " This function can be called by a test if it wants to abort testing.
+ func FinishTesting()
+ call AfterTheTest()
+*** ../vim-8.1.0043/src/testdir/test_assert.vim 2018-04-28 16:44:49.000000000 +0200
+--- src/testdir/test_assert.vim 2018-06-12 13:26:02.775142877 +0200
+***************
+*** 198,200 ****
+--- 198,206 ----
+ smile
+ sleep 300m
+ endfunc
++
++ " Must be last.
++ func Test_zz_quit_detected()
++ " Verify that if a test function ends Vim the test script detects this.
++ quit
++ endfunc
+*** ../vim-8.1.0043/src/version.c 2018-06-12 12:39:37.593152427 +0200
+--- src/version.c 2018-06-12 13:45:44.070675020 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 44,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+36. You miss more than five meals a week downloading the latest games from
+ Apogee.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0045 b/data/vim/patches/8.1.0045
new file mode 100644
index 000000000..b889adae6
--- /dev/null
+++ b/data/vim/patches/8.1.0045
@@ -0,0 +1,357 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0045
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0045 (after 8.1.0038)
+Problem: Popup test isn't run completely.
+Solution: Remove "finish". Clean up function definitions.
+Files: src/testdir/test_popup.vim
+
+
+*** ../vim-8.1.0044/src/testdir/test_popup.vim 2018-06-07 15:18:36.826611722 +0200
+--- src/testdir/test_popup.vim 2018-06-12 15:14:43.418467569 +0200
+***************
+*** 6,12 ****
+ let g:months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
+ let g:setting = ''
+
+! func! ListMonths()
+ if g:setting != ''
+ exe ":set" g:setting
+ endif
+--- 6,12 ----
+ let g:months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
+ let g:setting = ''
+
+! func ListMonths()
+ if g:setting != ''
+ exe ":set" g:setting
+ endif
+***************
+*** 19,25 ****
+ return ''
+ endfunc
+
+! func! Test_popup_complete2()
+ " Although the popupmenu is not visible, this does not mean completion mode
+ " has ended. After pressing <f5> to complete the currently typed char, Vim
+ " still stays in the first state of the completion (:h ins-completion-menu),
+--- 19,25 ----
+ return ''
+ endfunc
+
+! func Test_popup_complete2()
+ " Although the popupmenu is not visible, this does not mean completion mode
+ " has ended. After pressing <f5> to complete the currently typed char, Vim
+ " still stays in the first state of the completion (:h ins-completion-menu),
+***************
+*** 34,42 ****
+ call assert_equal(["Dece", "", "December2015"], getline(1,3))
+ %d
+ bw!
+! endfu
+
+! func! Test_popup_complete()
+ new
+ inoremap <f5> <c-r>=ListMonths()<cr>
+
+--- 34,42 ----
+ call assert_equal(["Dece", "", "December2015"], getline(1,3))
+ %d
+ bw!
+! endfunc
+
+! func Test_popup_complete()
+ new
+ inoremap <f5> <c-r>=ListMonths()<cr>
+
+***************
+*** 215,224 ****
+ call feedkeys("aM\<f5>\<enter>\<esc>", 'tx')
+ call assert_equal(["March", "M", "March"], getline(1,4))
+ %d
+! endfu
+
+
+! func! Test_popup_completion_insertmode()
+ new
+ inoremap <F5> <C-R>=ListMonths()<CR>
+
+--- 215,224 ----
+ call feedkeys("aM\<f5>\<enter>\<esc>", 'tx')
+ call assert_equal(["March", "M", "March"], getline(1,4))
+ %d
+! endfunc
+
+
+! func Test_popup_completion_insertmode()
+ new
+ inoremap <F5> <C-R>=ListMonths()<CR>
+
+***************
+*** 247,266 ****
+ iunmap <F5>
+ endfunc
+
+- " TODO: Fix what breaks after this line.
+- " - Do not use "q!", it may exit Vim if there is an error
+- finish
+-
+ func Test_noinsert_complete()
+! function! s:complTest1() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+! endfunction
+
+! function! s:complTest2() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+! endfunction
+
+ new
+ set completeopt+=noinsert
+--- 247,262 ----
+ iunmap <F5>
+ endfunc
+
+ func Test_noinsert_complete()
+! func! s:complTest1() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+! endfunc
+
+! func! s:complTest2() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+! endfunc
+
+ new
+ set completeopt+=noinsert
+***************
+*** 281,289 ****
+ endfunc
+
+ func Test_compl_vim_cmds_after_register_expr()
+! function! s:test_func()
+ return 'autocmd '
+! endfunction
+ augroup AAAAA_Group
+ au!
+ augroup END
+--- 277,285 ----
+ endfunc
+
+ func Test_compl_vim_cmds_after_register_expr()
+! func! s:test_func()
+ return 'autocmd '
+! endfunc
+ augroup AAAAA_Group
+ au!
+ augroup END
+***************
+*** 330,336 ****
+ else
+ return ['twodef', 'twoDEF']
+ endif
+! endfunction
+
+ " Test that nothing happens if the 'completefunc' opens
+ " a new window (no completion, no crash)
+--- 326,332 ----
+ else
+ return ['twodef', 'twoDEF']
+ endif
+! endfunc
+
+ " Test that nothing happens if the 'completefunc' opens
+ " a new window (no completion, no crash)
+***************
+*** 407,413 ****
+ q!
+ endfunc
+
+! function UndoComplete()
+ call complete(1, ['January', 'February', 'March',
+ \ 'April', 'May', 'June', 'July', 'August', 'September',
+ \ 'October', 'November', 'December'])
+--- 403,409 ----
+ q!
+ endfunc
+
+! func UndoComplete()
+ call complete(1, ['January', 'February', 'March',
+ \ 'April', 'May', 'June', 'July', 'August', 'September',
+ \ 'October', 'November', 'December'])
+***************
+*** 444,450 ****
+ q!
+ endfunc
+
+! function! DummyCompleteFive(findstart, base)
+ if a:findstart
+ return 0
+ else
+--- 440,446 ----
+ q!
+ endfunc
+
+! func DummyCompleteFive(findstart, base)
+ if a:findstart
+ return 0
+ else
+***************
+*** 489,495 ****
+ q!
+ endfunc
+
+! function! DummyCompleteSix()
+ call complete(1, ['Hello', 'World'])
+ return ''
+ endfunction
+--- 485,491 ----
+ q!
+ endfunc
+
+! func DummyCompleteSix()
+ call complete(1, ['Hello', 'World'])
+ return ''
+ endfunction
+***************
+*** 577,583 ****
+ bwipe!
+ endfunc
+
+! fun MessCompleteMonths()
+ for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep")
+ call complete_add(m)
+ if complete_check()
+--- 573,579 ----
+ bwipe!
+ endfunc
+
+! func MessCompleteMonths()
+ for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep")
+ call complete_add(m)
+ if complete_check()
+***************
+*** 585,598 ****
+ endif
+ endfor
+ return []
+! endfun
+
+! fun MessCompleteMore()
+ call complete(1, split("Oct Nov Dec"))
+ return []
+! endfun
+
+! fun MessComplete(findstart, base)
+ if a:findstart
+ let line = getline('.')
+ let start = col('.') - 1
+--- 581,594 ----
+ endif
+ endfor
+ return []
+! endfunc
+
+! func MessCompleteMore()
+ call complete(1, split("Oct Nov Dec"))
+ return []
+! endfunc
+
+! func MessComplete(findstart, base)
+ if a:findstart
+ let line = getline('.')
+ let start = col('.') - 1
+***************
+*** 605,611 ****
+ call MessCompleteMore()
+ return []
+ endif
+! endf
+
+ func Test_complete_func_mess()
+ " Calling complete() after complete_add() in 'completefunc' is wrong, but it
+--- 601,607 ----
+ call MessCompleteMore()
+ return []
+ endif
+! endfunc
+
+ func Test_complete_func_mess()
+ " Calling complete() after complete_add() in 'completefunc' is wrong, but it
+***************
+*** 835,841 ****
+ bwipe!
+ endfunc
+
+! fun! Test_complete_o_tab()
+ let s:o_char_pressed = 0
+
+ fun! s:act_on_text_changed()
+--- 831,837 ----
+ bwipe!
+ endfunc
+
+! func Test_complete_o_tab()
+ let s:o_char_pressed = 0
+
+ fun! s:act_on_text_changed()
+***************
+*** 843,849 ****
+ let s:o_char_pressed = 0
+ call feedkeys("\<c-x>\<c-n>", 'i')
+ endif
+! endf
+
+ set completeopt=menu,noselect
+ new
+--- 839,845 ----
+ let s:o_char_pressed = 0
+ call feedkeys("\<c-x>\<c-n>", 'i')
+ endif
+! endfunc
+
+ set completeopt=menu,noselect
+ new
+***************
+*** 862,868 ****
+ bwipe!
+ set completeopt&
+ delfunc s:act_on_text_changed
+! endf
+
+
+ " vim: shiftwidth=2 sts=2 expandtab
+--- 858,864 ----
+ bwipe!
+ set completeopt&
+ delfunc s:act_on_text_changed
+! endfunc
+
+
+ " vim: shiftwidth=2 sts=2 expandtab
+*** ../vim-8.1.0044/src/version.c 2018-06-12 14:58:35.566840630 +0200
+--- src/version.c 2018-06-12 15:21:43.280832536 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 45,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+37. You start looking for hot HTML addresses in public restrooms.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0046 b/data/vim/patches/8.1.0046
new file mode 100644
index 000000000..2b9682b93
--- /dev/null
+++ b/data/vim/patches/8.1.0046
@@ -0,0 +1,256 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0046
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0046
+Problem: Loading a session file fails if 'winheight' is a big number.
+Solution: Set 'minwinheight' to zero at first. Don't give an error when
+ setting 'minwinheight' while 'winheight' is a big number.
+ Fix using vertical splits. Fix setting 'minwinwidth'.
+ (closes #2970)
+Files: src/testdir/test_mksession.vim, src/option.c, src/window.c,
+ src/proto/window.pro
+
+
+*** ../vim-8.1.0045/src/testdir/test_mksession.vim 2018-03-09 21:25:55.000000000 +0100
+--- src/testdir/test_mksession.vim 2018-06-12 16:38:40.344105918 +0200
+***************
+*** 106,118 ****
+
+ func Test_mksession_winheight()
+ new
+! set winheight=10 winminheight=2
+ mksession! Xtest_mks.out
+ source Xtest_mks.out
+
+ call delete('Xtest_mks.out')
+ endfunc
+
+ func Test_mksession_arglist()
+ argdel *
+ next file1 file2 file3 file4
+--- 106,127 ----
+
+ func Test_mksession_winheight()
+ new
+! set winheight=10
+! set winminheight=2
+ mksession! Xtest_mks.out
+ source Xtest_mks.out
+
+ call delete('Xtest_mks.out')
+ endfunc
+
++ func Test_mksession_large_winheight()
++ set winheight=999
++ mksession! Xtest_mks_winheight.out
++ set winheight&
++ source Xtest_mks_winheight.out
++ call delete('Xtest_mks_winheight.out')
++ endfunc
++
+ func Test_mksession_arglist()
+ argdel *
+ next file1 file2 file3 file4
+*** ../vim-8.1.0045/src/option.c 2018-06-04 17:28:04.729961269 +0200
+--- src/option.c 2018-06-12 16:34:27.832376913 +0200
+***************
+*** 8796,8801 ****
+--- 8796,8802 ----
+ */
+ if (pp == &p_wh || pp == &p_hh)
+ {
++ // 'winheight' and 'helpheight'
+ if (p_wh < 1)
+ {
+ errmsg = e_positive;
+***************
+*** 8821,8830 ****
+ win_setheight((int)p_hh);
+ }
+ }
+-
+- /* 'winminheight' */
+ else if (pp == &p_wmh)
+ {
+ if (p_wmh < 0)
+ {
+ errmsg = e_positive;
+--- 8822,8830 ----
+ win_setheight((int)p_hh);
+ }
+ }
+ else if (pp == &p_wmh)
+ {
++ // 'winminheight'
+ if (p_wmh < 0)
+ {
+ errmsg = e_positive;
+***************
+*** 8839,8844 ****
+--- 8839,8845 ----
+ }
+ else if (pp == &p_wiw)
+ {
++ // 'winwidth'
+ if (p_wiw < 1)
+ {
+ errmsg = e_positive;
+***************
+*** 8854,8863 ****
+ if (!ONE_WINDOW && curwin->w_width < p_wiw)
+ win_setwidth((int)p_wiw);
+ }
+-
+- /* 'winminwidth' */
+ else if (pp == &p_wmw)
+ {
+ if (p_wmw < 0)
+ {
+ errmsg = e_positive;
+--- 8855,8863 ----
+ if (!ONE_WINDOW && curwin->w_width < p_wiw)
+ win_setwidth((int)p_wiw);
+ }
+ else if (pp == &p_wmw)
+ {
++ // 'winminwidth'
+ if (p_wmw < 0)
+ {
+ errmsg = e_positive;
+***************
+*** 8868,8874 ****
+ errmsg = e_winwidth;
+ p_wmw = p_wiw;
+ }
+! win_setminheight();
+ }
+
+ /* (re)set last window status line */
+--- 8868,8874 ----
+ errmsg = e_winwidth;
+ p_wmw = p_wiw;
+ }
+! win_setminwidth();
+ }
+
+ /* (re)set last window status line */
+*** ../vim-8.1.0045/src/window.c 2018-06-10 14:39:47.022412206 +0200
+--- src/window.c 2018-06-12 16:41:04.447771813 +0200
+***************
+*** 5430,5457 ****
+ }
+
+ /*
+! * Check 'winminheight' for a valid value.
+ */
+ void
+ win_setminheight(void)
+ {
+ int room;
+ int first = TRUE;
+- win_T *wp;
+
+! /* loop until there is a 'winminheight' that is possible */
+ while (p_wmh > 0)
+ {
+! /* TODO: handle vertical splits */
+! room = -p_wh;
+! FOR_ALL_WINDOWS(wp)
+! room += VISIBLE_HEIGHT(wp) - p_wmh;
+! if (room >= 0)
+ break;
+ --p_wmh;
+ if (first)
+ {
+ EMSG(_(e_noroom));
+ first = FALSE;
+ }
+ }
+--- 5430,5481 ----
+ }
+
+ /*
+! * Check 'winminheight' for a valid value and reduce it if needed.
+ */
+ void
+ win_setminheight(void)
+ {
+ int room;
++ int needed;
+ int first = TRUE;
+
+! // loop until there is a 'winminheight' that is possible
+ while (p_wmh > 0)
+ {
+! room = Rows - p_ch;
+! needed = frame_minheight(topframe, NULL);
+! if (room >= needed)
+ break;
+ --p_wmh;
+ if (first)
+ {
+ EMSG(_(e_noroom));
++ first = FALSE;
++ }
++ }
++ }
++
++ /*
++ * Check 'winminwidth' for a valid value and reduce it if needed.
++ */
++ void
++ win_setminwidth(void)
++ {
++ int room;
++ int needed;
++ int first = TRUE;
++
++ // loop until there is a 'winminheight' that is possible
++ while (p_wmw > 0)
++ {
++ room = Columns;
++ needed = frame_minwidth(topframe, NULL);
++ if (room >= needed)
++ break;
++ --p_wmw;
++ if (first)
++ {
++ EMSG(_(e_noroom));
+ first = FALSE;
+ }
+ }
+*** ../vim-8.1.0045/src/proto/window.pro 2018-05-17 13:52:56.000000000 +0200
+--- src/proto/window.pro 2018-06-12 16:34:10.876376437 +0200
+***************
+*** 54,59 ****
+--- 54,60 ----
+ void win_setwidth(int width);
+ void win_setwidth_win(int width, win_T *wp);
+ void win_setminheight(void);
++ void win_setminwidth(void);
+ void win_drag_status_line(win_T *dragwin, int offset);
+ void win_drag_vsep_line(win_T *dragwin, int offset);
+ void set_fraction(win_T *wp);
+*** ../vim-8.1.0045/src/version.c 2018-06-12 15:22:39.640579965 +0200
+--- src/version.c 2018-06-12 16:01:12.917283351 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 46,
+ /**/
+
+--
+He who laughs last, thinks slowest.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0047 b/data/vim/patches/8.1.0047
new file mode 100644
index 000000000..da8bf42f0
--- /dev/null
+++ b/data/vim/patches/8.1.0047
@@ -0,0 +1,93 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0047
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0047
+Problem: No completion for :unlet $VAR.
+Solution: Add completion. (Jason Franklin)
+Files: src/ex_docmd.c, src/testdir/test_unlet.vim
+
+
+*** ../vim-8.1.0046/src/ex_docmd.c 2018-06-12 12:39:37.585152510 +0200
+--- src/ex_docmd.c 2018-06-12 16:59:13.387246272 +0200
+***************
+*** 4056,4063 ****
+--- 4056,4071 ----
+ case CMD_unlet:
+ while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL)
+ arg = xp->xp_pattern + 1;
++
+ xp->xp_context = EXPAND_USER_VARS;
+ xp->xp_pattern = arg;
++
++ if (*xp->xp_pattern == '$')
++ {
++ xp->xp_context = EXPAND_ENV_VARS;
++ ++xp->xp_pattern;
++ }
++
+ break;
+
+ case CMD_function:
+***************
+*** 11277,11283 ****
+ * winminheight and winminwidth need to be set to avoid an error if the
+ * user has set winheight or winwidth.
+ */
+! if (put_line(fd, "set winminheight=1 winheight=1 winminwidth=1 winwidth=1") == FAIL)
+ return FAIL;
+ if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
+ return FAIL;
+--- 11285,11294 ----
+ * winminheight and winminwidth need to be set to avoid an error if the
+ * user has set winheight or winwidth.
+ */
+! if (put_line(fd, "set winminheight=0") == FAIL
+! || put_line(fd, "set winheight=1") == FAIL
+! || put_line(fd, "set winminwidth=0") == FAIL
+! || put_line(fd, "set winwidth=1") == FAIL)
+ return FAIL;
+ if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
+ return FAIL;
+*** ../vim-8.1.0046/src/testdir/test_unlet.vim 2018-05-13 15:58:22.000000000 +0200
+--- src/testdir/test_unlet.vim 2018-06-12 16:59:13.391246246 +0200
+***************
+*** 45,47 ****
+--- 45,57 ----
+
+ unlet $MUST_NOT_BE_AN_ERROR
+ endfunc
++
++ func Test_unlet_complete()
++ let g:FOOBAR = 1
++ call feedkeys(":unlet g:FOO\t\n", 'tx')
++ call assert_true(!exists('g:FOOBAR'))
++
++ let $FOOBAR = 1
++ call feedkeys(":unlet $FOO\t\n", 'tx')
++ call assert_true(!exists('$FOOBAR') || empty($FOOBAR))
++ endfunc
+*** ../vim-8.1.0046/src/version.c 2018-06-12 16:49:26.366028607 +0200
+--- src/version.c 2018-06-12 17:00:05.590909690 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 47,
+ /**/
+
+--
+Micro$oft: where do you want to go today?
+ Linux: where do you want to go tomorrow?
+ FreeBSD: are you guys coming, or what?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0048 b/data/vim/patches/8.1.0048
new file mode 100644
index 000000000..c8da45f80
--- /dev/null
+++ b/data/vim/patches/8.1.0048
@@ -0,0 +1,111 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0048
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0048
+Problem: vim_str2nr() does not handle numbers close to the maximum.
+Solution: Check for overflow more precisely. (Ken Takata, closes #2746)
+Files: src/charset.c
+
+
+*** ../vim-8.1.0047/src/charset.c 2018-04-25 21:59:10.000000000 +0200
+--- src/charset.c 2018-06-12 17:20:17.692062915 +0200
+***************
+*** 1928,1935 ****
+ while ('0' <= *ptr && *ptr <= '1')
+ {
+ /* avoid ubsan error for overflow */
+! if (un < UVARNUM_MAX / 2)
+! un = 2 * un + (unsigned long)(*ptr - '0');
+ else
+ un = UVARNUM_MAX;
+ ++ptr;
+--- 1928,1935 ----
+ while ('0' <= *ptr && *ptr <= '1')
+ {
+ /* avoid ubsan error for overflow */
+! if (un <= UVARNUM_MAX / 2)
+! un = 2 * un + (uvarnumber_T)(*ptr - '0');
+ else
+ un = UVARNUM_MAX;
+ ++ptr;
+***************
+*** 1943,1949 ****
+ while ('0' <= *ptr && *ptr <= '7')
+ {
+ /* avoid ubsan error for overflow */
+! if (un < UVARNUM_MAX / 8)
+ un = 8 * un + (uvarnumber_T)(*ptr - '0');
+ else
+ un = UVARNUM_MAX;
+--- 1943,1949 ----
+ while ('0' <= *ptr && *ptr <= '7')
+ {
+ /* avoid ubsan error for overflow */
+! if (un <= UVARNUM_MAX / 8)
+ un = 8 * un + (uvarnumber_T)(*ptr - '0');
+ else
+ un = UVARNUM_MAX;
+***************
+*** 1960,1966 ****
+ while (vim_isxdigit(*ptr))
+ {
+ /* avoid ubsan error for overflow */
+! if (un < UVARNUM_MAX / 16)
+ un = 16 * un + (uvarnumber_T)hex2nr(*ptr);
+ else
+ un = UVARNUM_MAX;
+--- 1960,1966 ----
+ while (vim_isxdigit(*ptr))
+ {
+ /* avoid ubsan error for overflow */
+! if (un <= UVARNUM_MAX / 16)
+ un = 16 * un + (uvarnumber_T)hex2nr(*ptr);
+ else
+ un = UVARNUM_MAX;
+***************
+*** 1974,1982 ****
+ /* decimal */
+ while (VIM_ISDIGIT(*ptr))
+ {
+ /* avoid ubsan error for overflow */
+! if (un < UVARNUM_MAX / 10)
+! un = 10 * un + (uvarnumber_T)(*ptr - '0');
+ else
+ un = UVARNUM_MAX;
+ ++ptr;
+--- 1974,1985 ----
+ /* decimal */
+ while (VIM_ISDIGIT(*ptr))
+ {
++ uvarnumber_T digit = (uvarnumber_T)(*ptr - '0');
++
+ /* avoid ubsan error for overflow */
+! if (un < UVARNUM_MAX / 10
+! || (un == UVARNUM_MAX / 10 && digit <= UVARNUM_MAX % 10))
+! un = 10 * un + digit;
+ else
+ un = UVARNUM_MAX;
+ ++ptr;
+*** ../vim-8.1.0047/src/version.c 2018-06-12 17:03:35.949611796 +0200
+--- src/version.c 2018-06-12 17:24:32.210718899 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 48,
+ /**/
+
+--
+Everyone has a photographic memory. Some don't have film.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0049 b/data/vim/patches/8.1.0049
new file mode 100644
index 000000000..79dfbe23a
--- /dev/null
+++ b/data/vim/patches/8.1.0049
@@ -0,0 +1,236 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0049
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0049
+Problem: Shell cannot tell running in a terminal window.
+Solution: Add the VIM_TERMINAL environment variable. (Christian Brabandt)
+Files: runtime/doc/terminal.txt, src/os_unix.c, src/os_win32.c,
+ src/testdir/test_terminal.vim
+
+
+*** ../vim-8.1.0048/runtime/doc/terminal.txt 2018-05-17 14:49:10.000000000 +0200
+--- runtime/doc/terminal.txt 2018-06-12 17:43:50.152692460 +0200
+***************
+*** 204,210 ****
+ ++rows={height} Use {height} for the terminal window
+ height. If the terminal uses the full
+ Vim height (no window above or below
+! th terminal window) the command line
+ height will be reduced as needed.
+ ++cols={width} Use {width} for the terminal window
+ width. If the terminal uses the full
+--- 204,210 ----
+ ++rows={height} Use {height} for the terminal window
+ height. If the terminal uses the full
+ Vim height (no window above or below
+! the terminal window) the command line
+ height will be reduced as needed.
+ ++cols={width} Use {width} for the terminal window
+ width. If the terminal uses the full
+***************
+*** 243,249 ****
+ You can use `CTRL-W :hide` to close the terminal window and make the buffer
+ hidden, the job keeps running. The `:buffer` command can be used to turn the
+ current window into a terminal window. If there are unsaved changes this
+! fails, use ! to force, as usual.
+
+ To have a background job run without a window, and open the window when it's
+ done, use options like this: >
+--- 243,249 ----
+ You can use `CTRL-W :hide` to close the terminal window and make the buffer
+ hidden, the job keeps running. The `:buffer` command can be used to turn the
+ current window into a terminal window. If there are unsaved changes this
+! fails, use ! to force, as usual.
+
+ To have a background job run without a window, and open the window when it's
+ done, use options like this: >
+***************
+*** 376,381 ****
+--- 376,382 ----
+ COLUMNS number of columns in the terminal initially
+ COLORS number of colors, 't_Co' (256*256*256 in the GUI)
+ VIM_SERVERNAME v:servername
++ VIM_TERMINAL v:version
+
+
+ MS-Windows ~
+*** ../vim-8.1.0048/src/os_unix.c 2018-05-12 17:42:33.000000000 +0200
+--- src/os_unix.c 2018-06-12 17:58:42.928059243 +0200
+***************
+*** 4169,4174 ****
+--- 4169,4175 ----
+ static char envbuf_Lines[20];
+ static char envbuf_Columns[20];
+ static char envbuf_Colors[20];
++ static char envbuf_Version[20];
+ # ifdef FEAT_CLIENTSERVER
+ static char envbuf_Servername[60];
+ # endif
+***************
+*** 4189,4194 ****
+--- 4190,4197 ----
+ setenv("COLUMNS", (char *)envbuf, 1);
+ sprintf((char *)envbuf, "%ld", colors);
+ setenv("COLORS", (char *)envbuf, 1);
++ sprintf((char *)envbuf, "%ld", get_vim_var_nr(VV_VERSION));
++ setenv("VIM_TERMINAL", (char *)envbuf, 1);
+ # ifdef FEAT_CLIENTSERVER
+ setenv("VIM_SERVERNAME", serverName == NULL ? "" : (char *)serverName, 1);
+ # endif
+***************
+*** 4209,4214 ****
+--- 4212,4220 ----
+ putenv(envbuf_Columns);
+ vim_snprintf(envbuf_Colors, sizeof(envbuf_Colors), "COLORS=%ld", colors);
+ putenv(envbuf_Colors);
++ vim_snprintf(envbuf_Version, sizeof(envbuf_Version), "VIM_TERMINAL=%ld",
++ get_vim_var_nr(VV_VERSION));
++ putenv(envbuf_Version);
+ # ifdef FEAT_CLIENTSERVER
+ vim_snprintf(envbuf_Servername, sizeof(envbuf_Servername),
+ "VIM_SERVERNAME=%s", serverName == NULL ? "" : (char *)serverName);
+*** ../vim-8.1.0048/src/os_win32.c 2018-05-06 17:05:39.000000000 +0200
+--- src/os_win32.c 2018-06-12 18:00:28.031513685 +0200
+***************
+*** 5275,5299 ****
+ }
+ }
+
+- # ifdef FEAT_CLIENTSERVER
+ if (is_terminal)
+ {
+ char_u *servername = get_vim_var_str(VV_SEND_SERVER);
+! size_t lval = STRLEN(servername);
+! size_t n;
+
+! if (ga_grow(gap, (int)(14 + lval + 2)) == OK)
+ {
+ for (n = 0; n < 15; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)"VIM_SERVERNAME="[n];
+! for (n = 0; n < lval; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)servername[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ }
+ }
+- # endif
+ }
+
+ void
+--- 5275,5317 ----
+ }
+ }
+
+ if (is_terminal)
+ {
++ # ifdef FEAT_CLIENTSERVER
+ char_u *servername = get_vim_var_str(VV_SEND_SERVER);
+! size_t servername_len = STRLEN(servername);
+! # endif
+! char_u *version = get_vim_var_str(VV_VERSION);
+! size_t version_len = STRLEN(version);
+! // size of "VIM_SERVERNAME=" and value,
+! // plus "VIM_TERMINAL=" and value,
+! // plus two terminating NULs
+! size_t n = 0
+! # ifdef FEAT_CLIENTSERVER
+! + 15 + servername_len
+! # endif
+! + 13 + version_len + 2;
+
+! if (ga_grow(gap, (int)n) == OK)
+ {
++ # ifdef FEAT_CLIENTSERVER
+ for (n = 0; n < 15; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)"VIM_SERVERNAME="[n];
+! for (n = 0; n < servername_len; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)servername[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
++ # endif
++ for (n = 0; n < 13; n++)
++ *((WCHAR*)gap->ga_data + gap->ga_len++) =
++ (WCHAR)"VIM_TERMINAL="[n];
++ for (n = 0; n < version_len; n++)
++ *((WCHAR*)gap->ga_data + gap->ga_len++) =
++ (WCHAR)version[n];
++ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ }
+ }
+ }
+
+ void
+*** ../vim-8.1.0048/src/testdir/test_terminal.vim 2018-06-03 18:21:57.809890160 +0200
+--- src/testdir/test_terminal.vim 2018-06-12 18:01:49.195092385 +0200
+***************
+*** 482,499 ****
+ if !has('clientserver')
+ return
+ endif
+ let buf = Run_shell_in_terminal({})
+ " Wait for the shell to display a prompt
+ call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))})
+ if has('win32')
+! call term_sendkeys(buf, "echo %VIM_SERVERNAME%\r")
+ else
+! call term_sendkeys(buf, "echo $VIM_SERVERNAME\r")
+ endif
+ call term_wait(buf)
+ call Stop_shell_in_terminal(buf)
+! call WaitFor('getline(2) == v:servername')
+! call assert_equal(v:servername, getline(2))
+
+ exe buf . 'bwipe'
+ unlet buf
+--- 482,506 ----
+ if !has('clientserver')
+ return
+ endif
++ call s:test_environment("VIM_SERVERNAME", v:servername)
++ endfunc
++
++ func Test_terminal_version()
++ call s:test_environment("VIM_TERMINAL", string(v:version))
++ endfunc
++
++ func s:test_environment(name, value)
+ let buf = Run_shell_in_terminal({})
+ " Wait for the shell to display a prompt
+ call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))})
+ if has('win32')
+! call term_sendkeys(buf, "echo %" . a:name . "%\r")
+ else
+! call term_sendkeys(buf, "echo $" . a:name . "\r")
+ endif
+ call term_wait(buf)
+ call Stop_shell_in_terminal(buf)
+! call WaitForAssert({-> assert_equal(a:value, getline(2))})
+
+ exe buf . 'bwipe'
+ unlet buf
+*** ../vim-8.1.0048/src/version.c 2018-06-12 17:25:32.054404315 +0200
+--- src/version.c 2018-06-12 18:03:17.778632563 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 49,
+ /**/
+
+--
+On the other hand, you have different fingers.
+ -- Steven Wright
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0050 b/data/vim/patches/8.1.0050
new file mode 100644
index 000000000..914d8c818
--- /dev/null
+++ b/data/vim/patches/8.1.0050
@@ -0,0 +1,414 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0050
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0050 (after 8.1.0049)
+Problem: $VIM_TERMINAL is also set when not in a terminal window.
+Solution: Pass a flag to indicate whether the job runs in a terminal.
+Files: src/channel.c, src/proto/channel.pro, src/evalfunc.c,
+ src/terminal.c, src/os_unix.c, src/proto/os_unix.pro,
+ src/os_win32.c
+
+
+*** ../vim-8.1.0049/src/channel.c 2018-06-03 14:42:17.840505115 +0200
+--- src/channel.c 2018-06-12 20:13:06.460135822 +0200
+***************
+*** 5525,5531 ****
+ * Returns NULL when out of memory.
+ */
+ job_T *
+! job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
+ {
+ job_T *job;
+ char_u *cmd = NULL;
+--- 5525,5535 ----
+ * Returns NULL when out of memory.
+ */
+ job_T *
+! job_start(
+! typval_T *argvars,
+! char **argv_arg,
+! jobopt_T *opt_arg,
+! int is_terminal UNUSED)
+ {
+ job_T *job;
+ char_u *cmd = NULL;
+***************
+*** 5679,5685 ****
+ ch_log(NULL, "Starting job: %s", (char *)ga.ga_data);
+ ga_clear(&ga);
+ }
+! mch_job_start(argv, job, &opt);
+ #else
+ ch_log(NULL, "Starting job: %s", (char *)cmd);
+ mch_job_start((char *)cmd, job, &opt);
+--- 5683,5689 ----
+ ch_log(NULL, "Starting job: %s", (char *)ga.ga_data);
+ ga_clear(&ga);
+ }
+! mch_job_start(argv, job, &opt, is_terminal);
+ #else
+ ch_log(NULL, "Starting job: %s", (char *)cmd);
+ mch_job_start((char *)cmd, job, &opt);
+*** ../vim-8.1.0049/src/proto/channel.pro 2018-06-03 14:42:17.848505102 +0200
+--- src/proto/channel.pro 2018-06-12 20:08:25.045683595 +0200
+***************
+*** 66,72 ****
+ void job_stop_on_exit(void);
+ int has_pending_job(void);
+ void job_check_ended(void);
+! job_T *job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg);
+ char *job_status(job_T *job);
+ void job_info(job_T *job, dict_T *dict);
+ void job_info_all(list_T *l);
+--- 66,72 ----
+ void job_stop_on_exit(void);
+ int has_pending_job(void);
+ void job_check_ended(void);
+! job_T *job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg, int is_terminal);
+ char *job_status(job_T *job);
+ void job_info(job_T *job, dict_T *dict);
+ void job_info_all(list_T *l);
+*** ../vim-8.1.0049/src/evalfunc.c 2018-06-07 18:17:42.278227523 +0200
+--- src/evalfunc.c 2018-06-12 20:05:33.630628161 +0200
+***************
+*** 7254,7260 ****
+ rettv->v_type = VAR_JOB;
+ if (check_restricted() || check_secure())
+ return;
+! rettv->vval.v_job = job_start(argvars, NULL, NULL);
+ }
+
+ /*
+--- 7254,7260 ----
+ rettv->v_type = VAR_JOB;
+ if (check_restricted() || check_secure())
+ return;
+! rettv->vval.v_job = job_start(argvars, NULL, NULL, FALSE);
+ }
+
+ /*
+*** ../vim-8.1.0049/src/terminal.c 2018-06-04 17:28:04.729961269 +0200
+--- src/terminal.c 2018-06-12 20:06:16.926389419 +0200
+***************
+*** 5769,5775 ****
+ #endif
+
+ /* This may change a string in "argvar". */
+! term->tl_job = job_start(argvar, argv, opt);
+ if (term->tl_job != NULL)
+ ++term->tl_job->jv_refcount;
+
+--- 5769,5775 ----
+ #endif
+
+ /* This may change a string in "argvar". */
+! term->tl_job = job_start(argvar, argv, opt, TRUE);
+ if (term->tl_job != NULL)
+ ++term->tl_job->jv_refcount;
+
+*** ../vim-8.1.0049/src/os_unix.c 2018-06-12 18:04:28.038267855 +0200
+--- src/os_unix.c 2018-06-12 20:11:20.272719511 +0200
+***************
+*** 4159,4165 ****
+ * Set the environment for a child process.
+ */
+ static void
+! set_child_environment(long rows, long columns, char *term)
+ {
+ # ifdef HAVE_SETENV
+ char envbuf[50];
+--- 4159,4169 ----
+ * Set the environment for a child process.
+ */
+ static void
+! set_child_environment(
+! long rows,
+! long columns,
+! char *term,
+! int is_terminal UNUSED)
+ {
+ # ifdef HAVE_SETENV
+ char envbuf[50];
+***************
+*** 4169,4175 ****
+--- 4173,4181 ----
+ static char envbuf_Lines[20];
+ static char envbuf_Columns[20];
+ static char envbuf_Colors[20];
++ # ifdef FEAT_TERMINAL
+ static char envbuf_Version[20];
++ # endif
+ # ifdef FEAT_CLIENTSERVER
+ static char envbuf_Servername[60];
+ # endif
+***************
+*** 4190,4197 ****
+ setenv("COLUMNS", (char *)envbuf, 1);
+ sprintf((char *)envbuf, "%ld", colors);
+ setenv("COLORS", (char *)envbuf, 1);
+! sprintf((char *)envbuf, "%ld", get_vim_var_nr(VV_VERSION));
+! setenv("VIM_TERMINAL", (char *)envbuf, 1);
+ # ifdef FEAT_CLIENTSERVER
+ setenv("VIM_SERVERNAME", serverName == NULL ? "" : (char *)serverName, 1);
+ # endif
+--- 4196,4208 ----
+ setenv("COLUMNS", (char *)envbuf, 1);
+ sprintf((char *)envbuf, "%ld", colors);
+ setenv("COLORS", (char *)envbuf, 1);
+! # ifdef FEAT_TERMINAL
+! if (is_terminal)
+! {
+! sprintf((char *)envbuf, "%ld", get_vim_var_nr(VV_VERSION));
+! setenv("VIM_TERMINAL", (char *)envbuf, 1);
+! }
+! # endif
+ # ifdef FEAT_CLIENTSERVER
+ setenv("VIM_SERVERNAME", serverName == NULL ? "" : (char *)serverName, 1);
+ # endif
+***************
+*** 4212,4220 ****
+ putenv(envbuf_Columns);
+ vim_snprintf(envbuf_Colors, sizeof(envbuf_Colors), "COLORS=%ld", colors);
+ putenv(envbuf_Colors);
+! vim_snprintf(envbuf_Version, sizeof(envbuf_Version), "VIM_TERMINAL=%ld",
+! get_vim_var_nr(VV_VERSION));
+! putenv(envbuf_Version);
+ # ifdef FEAT_CLIENTSERVER
+ vim_snprintf(envbuf_Servername, sizeof(envbuf_Servername),
+ "VIM_SERVERNAME=%s", serverName == NULL ? "" : (char *)serverName);
+--- 4223,4236 ----
+ putenv(envbuf_Columns);
+ vim_snprintf(envbuf_Colors, sizeof(envbuf_Colors), "COLORS=%ld", colors);
+ putenv(envbuf_Colors);
+! # ifdef FEAT_TERMINAL
+! if (is_terminal)
+! {
+! vim_snprintf(envbuf_Version, sizeof(envbuf_Version),
+! "VIM_TERMINAL=%ld", get_vim_var_nr(VV_VERSION));
+! putenv(envbuf_Version);
+! }
+! # endif
+ # ifdef FEAT_CLIENTSERVER
+ vim_snprintf(envbuf_Servername, sizeof(envbuf_Servername),
+ "VIM_SERVERNAME=%s", serverName == NULL ? "" : (char *)serverName);
+***************
+*** 4224,4232 ****
+ }
+
+ static void
+! set_default_child_environment(void)
+ {
+! set_child_environment(Rows, Columns, "dumb");
+ }
+ #endif
+
+--- 4240,4248 ----
+ }
+
+ static void
+! set_default_child_environment(int is_terminal)
+ {
+! set_child_environment(Rows, Columns, "dumb", is_terminal);
+ }
+ #endif
+
+***************
+*** 4689,4695 ****
+ # endif
+ }
+ # endif
+! set_default_child_environment();
+
+ /*
+ * stderr is only redirected when using the GUI, so that a
+--- 4705,4711 ----
+ # endif
+ }
+ # endif
+! set_default_child_environment(FALSE);
+
+ /*
+ * stderr is only redirected when using the GUI, so that a
+***************
+*** 5367,5373 ****
+
+ #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
+ void
+! mch_job_start(char **argv, job_T *job, jobopt_T *options)
+ {
+ pid_t pid;
+ int fd_in[2] = {-1, -1}; /* for stdin */
+--- 5383,5389 ----
+
+ #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
+ void
+! mch_job_start(char **argv, job_T *job, jobopt_T *options, int is_terminal)
+ {
+ pid_t pid;
+ int fd_in[2] = {-1, -1}; /* for stdin */
+***************
+*** 5515,5525 ****
+ set_child_environment(
+ (long)options->jo_term_rows,
+ (long)options->jo_term_cols,
+! term);
+ }
+ else
+ # endif
+! set_default_child_environment();
+
+ if (options->jo_env != NULL)
+ {
+--- 5531,5542 ----
+ set_child_environment(
+ (long)options->jo_term_rows,
+ (long)options->jo_term_cols,
+! term,
+! is_terminal);
+ }
+ else
+ # endif
+! set_default_child_environment(is_terminal);
+
+ if (options->jo_env != NULL)
+ {
+*** ../vim-8.1.0049/src/proto/os_unix.pro 2018-05-17 13:52:48.000000000 +0200
+--- src/proto/os_unix.pro 2018-06-12 20:08:29.497659084 +0200
+***************
+*** 62,68 ****
+ void mch_new_shellsize(void);
+ void may_send_sigint(int c, pid_t pid, pid_t wpid);
+ int mch_call_shell(char_u *cmd, int options);
+! void mch_job_start(char **argv, job_T *job, jobopt_T *options);
+ char *mch_job_status(job_T *job);
+ job_T *mch_detect_ended_job(job_T *job_list);
+ int mch_signal_job(job_T *job, char_u *how);
+--- 62,68 ----
+ void mch_new_shellsize(void);
+ void may_send_sigint(int c, pid_t pid, pid_t wpid);
+ int mch_call_shell(char_u *cmd, int options);
+! void mch_job_start(char **argv, job_T *job, jobopt_T *options, int is_terminal);
+ char *mch_job_status(job_T *job);
+ job_T *mch_detect_ended_job(job_T *job_list);
+ int mch_signal_job(job_T *job, char_u *how);
+*** ../vim-8.1.0049/src/os_win32.c 2018-06-12 18:04:28.038267855 +0200
+--- src/os_win32.c 2018-06-12 20:18:53.770228655 +0200
+***************
+*** 5275,5300 ****
+ }
+ }
+
+! if (is_terminal)
+ {
+! # ifdef FEAT_CLIENTSERVER
+ char_u *servername = get_vim_var_str(VV_SEND_SERVER);
+ size_t servername_len = STRLEN(servername);
+! # endif
+ char_u *version = get_vim_var_str(VV_VERSION);
+ size_t version_len = STRLEN(version);
+ // size of "VIM_SERVERNAME=" and value,
+ // plus "VIM_TERMINAL=" and value,
+ // plus two terminating NULs
+ size_t n = 0
+! # ifdef FEAT_CLIENTSERVER
+ + 15 + servername_len
+! # endif
+! + 13 + version_len + 2;
+
+ if (ga_grow(gap, (int)n) == OK)
+ {
+! # ifdef FEAT_CLIENTSERVER
+ for (n = 0; n < 15; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)"VIM_SERVERNAME="[n];
+--- 5275,5305 ----
+ }
+ }
+
+! # if defined(FEAT_CLIENTSERVER) || defined(FEAT_TERMINAL)
+ {
+! # ifdef FEAT_CLIENTSERVER
+ char_u *servername = get_vim_var_str(VV_SEND_SERVER);
+ size_t servername_len = STRLEN(servername);
+! # endif
+! # ifdef FEAT_TERMINAL
+ char_u *version = get_vim_var_str(VV_VERSION);
+ size_t version_len = STRLEN(version);
++ # endif
+ // size of "VIM_SERVERNAME=" and value,
+ // plus "VIM_TERMINAL=" and value,
+ // plus two terminating NULs
+ size_t n = 0
+! # ifdef FEAT_CLIENTSERVER
+ + 15 + servername_len
+! # endif
+! # ifdef FEAT_TERMINAL
+! + 13 + version_len + 2
+! # endif
+! ;
+
+ if (ga_grow(gap, (int)n) == OK)
+ {
+! # ifdef FEAT_CLIENTSERVER
+ for (n = 0; n < 15; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)"VIM_SERVERNAME="[n];
+***************
+*** 5302,5315 ****
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)servername[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+! # endif
+! for (n = 0; n < 13; n++)
+! *((WCHAR*)gap->ga_data + gap->ga_len++) =
+! (WCHAR)"VIM_TERMINAL="[n];
+! for (n = 0; n < version_len; n++)
+! *((WCHAR*)gap->ga_data + gap->ga_len++) =
+! (WCHAR)version[n];
+! *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ }
+ }
+ }
+--- 5307,5325 ----
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)servername[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+! # endif
+! # ifdef FEAT_TERMINAL
+! if (is_terminal)
+! {
+! for (n = 0; n < 13; n++)
+! *((WCHAR*)gap->ga_data + gap->ga_len++) =
+! (WCHAR)"VIM_TERMINAL="[n];
+! for (n = 0; n < version_len; n++)
+! *((WCHAR*)gap->ga_data + gap->ga_len++) =
+! (WCHAR)version[n];
+! *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+! }
+! # endif
+ }
+ }
+ }
+*** ../vim-8.1.0049/src/version.c 2018-06-12 18:04:28.042267834 +0200
+--- src/version.c 2018-06-12 20:21:54.749235631 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 50,
+ /**/
+
+--
+Change is inevitable, except from a vending machine.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0051 b/data/vim/patches/8.1.0051
new file mode 100644
index 000000000..2d07138b3
--- /dev/null
+++ b/data/vim/patches/8.1.0051
@@ -0,0 +1,44 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0051
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0051 (after 8.1.0050)
+Problem: MS-Windows: missing #endif.
+Solution: Add the #endif.
+Files: src/os_win32.c
+
+
+*** ../vim-8.1.0050/src/os_win32.c 2018-06-12 20:25:47.891923371 +0200
+--- src/os_win32.c 2018-06-12 21:10:04.466837989 +0200
+***************
+*** 5322,5327 ****
+--- 5322,5328 ----
+ # endif
+ }
+ }
++ # endif
+ }
+
+ void
+*** ../vim-8.1.0050/src/version.c 2018-06-12 20:25:47.891923371 +0200
+--- src/version.c 2018-06-12 21:10:42.242668187 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 51,
+ /**/
+
+--
+Those who live by the sword get shot by those who don't.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0052 b/data/vim/patches/8.1.0052
new file mode 100644
index 000000000..2293e705c
--- /dev/null
+++ b/data/vim/patches/8.1.0052
@@ -0,0 +1,50 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0052
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0052
+Problem: When a mapping to <Nop> times out the next mapping is skipped.
+Solution: Reset "timedout" when waiting for a character. (Christian
+ Brabandt, closes #2921)
+Files: src/getchar.c
+
+
+*** ../vim-8.1.0051/src/getchar.c 2018-05-23 21:53:48.352478970 +0200
+--- src/getchar.c 2018-06-12 21:22:30.771274224 +0200
+***************
+*** 2856,2861 ****
+--- 2856,2866 ----
+ /*
+ * get a character: 3. from the user - get it
+ */
++ if (typebuf.tb_len == 0)
++ // timedout may have been set while waiting for a mapping
++ // that has a <Nop> RHS.
++ timedout = FALSE;
++
+ wait_tb_len = typebuf.tb_len;
+ c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len,
+ typebuf.tb_buflen - typebuf.tb_off - typebuf.tb_len - 1,
+*** ../vim-8.1.0051/src/version.c 2018-06-12 21:11:08.626548598 +0200
+--- src/version.c 2018-06-12 21:28:00.797623373 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 52,
+ /**/
+
+--
+Portable Computer: A device invented to force businessmen
+to work at home, on vacation, and on business trips.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0053 b/data/vim/patches/8.1.0053
new file mode 100644
index 000000000..aa3ff44b1
--- /dev/null
+++ b/data/vim/patches/8.1.0053
@@ -0,0 +1,609 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0053
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0053
+Problem: The first argument given to 'completefunc' can be Number or
+ String, depending on the value.
+Solution: Avoid guessing the type of an argument, use typval_T in the
+ callers of call_vim_function(). (Ozaki Kiichi, closes #2993)
+Files: src/edit.c, src/eval.c, src/ex_getln.c, src/mbyte.c, src/normal.c,
+ src/proto/eval.pro, src/testdir/test_ins_complete.vim
+
+
+*** ../vim-8.1.0052/src/edit.c 2018-06-10 13:12:52.176496009 +0200
+--- src/edit.c 2018-06-12 21:49:32.781522896 +0200
+***************
+*** 4201,4207 ****
+ {
+ list_T *matchlist = NULL;
+ dict_T *matchdict = NULL;
+! char_u *args[2];
+ char_u *funcname;
+ pos_T pos;
+ win_T *curwin_save;
+--- 4201,4207 ----
+ {
+ list_T *matchlist = NULL;
+ dict_T *matchdict = NULL;
+! typval_T args[3];
+ char_u *funcname;
+ pos_T pos;
+ win_T *curwin_save;
+***************
+*** 4213,4227 ****
+ return;
+
+ /* Call 'completefunc' to obtain the list of matches. */
+! args[0] = (char_u *)"0";
+! args[1] = base;
+
+ pos = curwin->w_cursor;
+ curwin_save = curwin;
+ curbuf_save = curbuf;
+
+ /* Call a function, which returns a list or dict. */
+! if (call_vim_function(funcname, 2, args, FALSE, FALSE, &rettv) == OK)
+ {
+ switch (rettv.v_type)
+ {
+--- 4213,4230 ----
+ return;
+
+ /* Call 'completefunc' to obtain the list of matches. */
+! args[0].v_type = VAR_NUMBER;
+! args[0].vval.v_number = 0;
+! args[1].v_type = VAR_STRING;
+! args[1].vval.v_string = base != NULL ? base : (char_u *)"";
+! args[2].v_type = VAR_UNKNOWN;
+
+ pos = curwin->w_cursor;
+ curwin_save = curwin;
+ curbuf_save = curbuf;
+
+ /* Call a function, which returns a list or dict. */
+! if (call_vim_function(funcname, 2, args, &rettv, FALSE) == OK)
+ {
+ switch (rettv.v_type)
+ {
+***************
+*** 5528,5534 ****
+ * Call user defined function 'completefunc' with "a:findstart"
+ * set to 1 to obtain the length of text to use for completion.
+ */
+! char_u *args[2];
+ int col;
+ char_u *funcname;
+ pos_T pos;
+--- 5531,5537 ----
+ * Call user defined function 'completefunc' with "a:findstart"
+ * set to 1 to obtain the length of text to use for completion.
+ */
+! typval_T args[3];
+ int col;
+ char_u *funcname;
+ pos_T pos;
+***************
+*** 5548,5555 ****
+ return FAIL;
+ }
+
+! args[0] = (char_u *)"1";
+! args[1] = NULL;
+ pos = curwin->w_cursor;
+ curwin_save = curwin;
+ curbuf_save = curbuf;
+--- 5551,5561 ----
+ return FAIL;
+ }
+
+! args[0].v_type = VAR_NUMBER;
+! args[0].vval.v_number = 1;
+! args[1].v_type = VAR_STRING;
+! args[1].vval.v_string = (char_u *)"";
+! args[2].v_type = VAR_UNKNOWN;
+ pos = curwin->w_cursor;
+ curwin_save = curwin;
+ curbuf_save = curbuf;
+*** ../vim-8.1.0052/src/eval.c 2018-05-13 15:42:40.000000000 +0200
+--- src/eval.c 2018-06-12 21:53:10.468274335 +0200
+***************
+*** 1011,1073 ****
+
+ /*
+ * Call some Vim script function and return the result in "*rettv".
+! * Uses argv[argc] for the function arguments. Only Number and String
+! * arguments are currently supported.
+ * Returns OK or FAIL.
+ */
+ int
+ call_vim_function(
+ char_u *func,
+ int argc,
+! char_u **argv,
+! int safe, /* use the sandbox */
+! int str_arg_only, /* all arguments are strings */
+! typval_T *rettv)
+ {
+- typval_T *argvars;
+- varnumber_T n;
+- int len;
+- int i;
+ int doesrange;
+ void *save_funccalp = NULL;
+ int ret;
+
+- argvars = (typval_T *)alloc((unsigned)((argc + 1) * sizeof(typval_T)));
+- if (argvars == NULL)
+- return FAIL;
+-
+- for (i = 0; i < argc; i++)
+- {
+- /* Pass a NULL or empty argument as an empty string */
+- if (argv[i] == NULL || *argv[i] == NUL)
+- {
+- argvars[i].v_type = VAR_STRING;
+- argvars[i].vval.v_string = (char_u *)"";
+- continue;
+- }
+-
+- if (str_arg_only)
+- len = 0;
+- else
+- {
+- /* Recognize a number argument, the others must be strings. A dash
+- * is a string too. */
+- vim_str2nr(argv[i], NULL, &len, STR2NR_ALL, &n, NULL, 0);
+- if (len == 1 && *argv[i] == '-')
+- len = 0;
+- }
+- if (len != 0 && len == (int)STRLEN(argv[i]))
+- {
+- argvars[i].v_type = VAR_NUMBER;
+- argvars[i].vval.v_number = n;
+- }
+- else
+- {
+- argvars[i].v_type = VAR_STRING;
+- argvars[i].vval.v_string = argv[i];
+- }
+- }
+-
+ if (safe)
+ {
+ save_funccalp = save_funccal();
+--- 1011,1032 ----
+
+ /*
+ * Call some Vim script function and return the result in "*rettv".
+! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc]
+! * should have type VAR_UNKNOWN.
+ * Returns OK or FAIL.
+ */
+ int
+ call_vim_function(
+ char_u *func,
+ int argc,
+! typval_T *argv,
+! typval_T *rettv,
+! int safe) /* use the sandbox */
+ {
+ int doesrange;
+ void *save_funccalp = NULL;
+ int ret;
+
+ if (safe)
+ {
+ save_funccalp = save_funccal();
+***************
+*** 1075,1081 ****
+ }
+
+ rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */
+! ret = call_func(func, (int)STRLEN(func), rettv, argc, argvars, NULL,
+ curwin->w_cursor.lnum, curwin->w_cursor.lnum,
+ &doesrange, TRUE, NULL, NULL);
+ if (safe)
+--- 1034,1040 ----
+ }
+
+ rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */
+! ret = call_func(func, (int)STRLEN(func), rettv, argc, argv, NULL,
+ curwin->w_cursor.lnum, curwin->w_cursor.lnum,
+ &doesrange, TRUE, NULL, NULL);
+ if (safe)
+***************
+*** 1083,1089 ****
+ --sandbox;
+ restore_funccal(save_funccalp);
+ }
+- vim_free(argvars);
+
+ if (ret == FAIL)
+ clear_tv(rettv);
+--- 1042,1047 ----
+***************
+*** 1094,1113 ****
+ /*
+ * Call Vim script function "func" and return the result as a number.
+ * Returns -1 when calling the function fails.
+! * Uses argv[argc] for the function arguments.
+ */
+ varnumber_T
+ call_func_retnr(
+ char_u *func,
+ int argc,
+! char_u **argv,
+ int safe) /* use the sandbox */
+ {
+ typval_T rettv;
+ varnumber_T retval;
+
+! /* All arguments are passed as strings, no conversion to number. */
+! if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
+ return -1;
+
+ retval = get_tv_number_chk(&rettv, NULL);
+--- 1052,1071 ----
+ /*
+ * Call Vim script function "func" and return the result as a number.
+ * Returns -1 when calling the function fails.
+! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should
+! * have type VAR_UNKNOWN.
+ */
+ varnumber_T
+ call_func_retnr(
+ char_u *func,
+ int argc,
+! typval_T *argv,
+ int safe) /* use the sandbox */
+ {
+ typval_T rettv;
+ varnumber_T retval;
+
+! if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL)
+ return -1;
+
+ retval = get_tv_number_chk(&rettv, NULL);
+***************
+*** 1122,1141 ****
+ /*
+ * Call Vim script function "func" and return the result as a string.
+ * Returns NULL when calling the function fails.
+! * Uses argv[argc] for the function arguments.
+ */
+ void *
+ call_func_retstr(
+ char_u *func,
+ int argc,
+! char_u **argv,
+ int safe) /* use the sandbox */
+ {
+ typval_T rettv;
+ char_u *retval;
+
+! /* All arguments are passed as strings, no conversion to number. */
+! if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
+ return NULL;
+
+ retval = vim_strsave(get_tv_string(&rettv));
+--- 1080,1099 ----
+ /*
+ * Call Vim script function "func" and return the result as a string.
+ * Returns NULL when calling the function fails.
+! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should
+! * have type VAR_UNKNOWN.
+ */
+ void *
+ call_func_retstr(
+ char_u *func,
+ int argc,
+! typval_T *argv,
+ int safe) /* use the sandbox */
+ {
+ typval_T rettv;
+ char_u *retval;
+
+! if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL)
+ return NULL;
+
+ retval = vim_strsave(get_tv_string(&rettv));
+***************
+*** 1146,1165 ****
+
+ /*
+ * Call Vim script function "func" and return the result as a List.
+! * Uses argv[argc] for the function arguments.
+ * Returns NULL when there is something wrong.
+ */
+ void *
+ call_func_retlist(
+ char_u *func,
+ int argc,
+! char_u **argv,
+ int safe) /* use the sandbox */
+ {
+ typval_T rettv;
+
+! /* All arguments are passed as strings, no conversion to number. */
+! if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
+ return NULL;
+
+ if (rettv.v_type != VAR_LIST)
+--- 1104,1123 ----
+
+ /*
+ * Call Vim script function "func" and return the result as a List.
+! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should
+! * have type VAR_UNKNOWN.
+ * Returns NULL when there is something wrong.
+ */
+ void *
+ call_func_retlist(
+ char_u *func,
+ int argc,
+! typval_T *argv,
+ int safe) /* use the sandbox */
+ {
+ typval_T rettv;
+
+! if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL)
+ return NULL;
+
+ if (rettv.v_type != VAR_LIST)
+*** ../vim-8.1.0052/src/ex_getln.c 2018-05-22 16:58:43.979903077 +0200
+--- src/ex_getln.c 2018-06-12 21:56:34.139120017 +0200
+***************
+*** 5266,5272 ****
+
+
+ # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL)
+! static void * call_user_expand_func(void *(*user_expand_func)(char_u *, int, char_u **, int), expand_T *xp, int *num_file, char_u ***file);
+
+ /*
+ * Call "user_expand_func()" to invoke a user defined Vim script function and
+--- 5266,5272 ----
+
+
+ # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL)
+! static void * call_user_expand_func(void *(*user_expand_func)(char_u *, int, typval_T *, int), expand_T *xp, int *num_file, char_u ***file);
+
+ /*
+ * Call "user_expand_func()" to invoke a user defined Vim script function and
+***************
+*** 5274,5288 ****
+ */
+ static void *
+ call_user_expand_func(
+! void *(*user_expand_func)(char_u *, int, char_u **, int),
+ expand_T *xp,
+ int *num_file,
+ char_u ***file)
+ {
+ int keep = 0;
+! char_u num[50];
+! char_u *args[3];
+ int save_current_SID = current_SID;
+ void *ret;
+ struct cmdline_info save_ccline;
+
+--- 5274,5288 ----
+ */
+ static void *
+ call_user_expand_func(
+! void *(*user_expand_func)(char_u *, int, typval_T *, int),
+ expand_T *xp,
+ int *num_file,
+ char_u ***file)
+ {
+ int keep = 0;
+! typval_T args[4];
+ int save_current_SID = current_SID;
++ char_u *pat = NULL;
+ void *ret;
+ struct cmdline_info save_ccline;
+
+***************
+*** 5297,5306 ****
+ ccline.cmdbuff[ccline.cmdlen] = 0;
+ }
+
+! args[0] = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len);
+! args[1] = xp->xp_line;
+! sprintf((char *)num, "%d", xp->xp_col);
+! args[2] = num;
+
+ /* Save the cmdline, we don't know what the function may do. */
+ save_ccline = ccline;
+--- 5297,5311 ----
+ ccline.cmdbuff[ccline.cmdlen] = 0;
+ }
+
+! pat = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len);
+!
+! args[0].v_type = VAR_STRING;
+! args[0].vval.v_string = pat;
+! args[1].v_type = VAR_STRING;
+! args[1].vval.v_string = xp->xp_line;
+! args[2].v_type = VAR_NUMBER;
+! args[2].vval.v_number = xp->xp_col;
+! args[3].v_type = VAR_UNKNOWN;
+
+ /* Save the cmdline, we don't know what the function may do. */
+ save_ccline = ccline;
+***************
+*** 5315,5321 ****
+ if (ccline.cmdbuff != NULL)
+ ccline.cmdbuff[ccline.cmdlen] = keep;
+
+! vim_free(args[0]);
+ return ret;
+ }
+
+--- 5320,5326 ----
+ if (ccline.cmdbuff != NULL)
+ ccline.cmdbuff[ccline.cmdlen] = keep;
+
+! vim_free(pat);
+ return ret;
+ }
+
+*** ../vim-8.1.0052/src/mbyte.c 2018-05-17 13:06:28.000000000 +0200
+--- src/mbyte.c 2018-06-12 21:57:43.682728083 +0200
+***************
+*** 4795,4806 ****
+ static void
+ call_imactivatefunc(int active)
+ {
+! char_u *argv[1];
+
+! if (active)
+! argv[0] = (char_u *)"1";
+! else
+! argv[0] = (char_u *)"0";
+ (void)call_func_retnr(p_imaf, 1, argv, FALSE);
+ }
+
+--- 4795,4805 ----
+ static void
+ call_imactivatefunc(int active)
+ {
+! typval_T argv[2];
+
+! argv[0].v_type = VAR_NUMBER;
+! argv[0].vval.v_number = active ? 1 : 0;
+! argv[1].v_type = VAR_NUMBER;
+ (void)call_func_retnr(p_imaf, 1, argv, FALSE);
+ }
+
+*** ../vim-8.1.0052/src/normal.c 2018-06-03 14:42:17.844505109 +0200
+--- src/normal.c 2018-06-12 21:57:56.386656587 +0200
+***************
+*** 2219,2225 ****
+ op_function(oparg_T *oap UNUSED)
+ {
+ #ifdef FEAT_EVAL
+! char_u *(argv[1]);
+ # ifdef FEAT_VIRTUALEDIT
+ int save_virtual_op = virtual_op;
+ # endif
+--- 2219,2225 ----
+ op_function(oparg_T *oap UNUSED)
+ {
+ #ifdef FEAT_EVAL
+! typval_T argv[2];
+ # ifdef FEAT_VIRTUALEDIT
+ int save_virtual_op = virtual_op;
+ # endif
+***************
+*** 2235,2246 ****
+ /* Exclude the end position. */
+ decl(&curbuf->b_op_end);
+
+ if (oap->block_mode)
+! argv[0] = (char_u *)"block";
+ else if (oap->motion_type == MLINE)
+! argv[0] = (char_u *)"line";
+ else
+! argv[0] = (char_u *)"char";
+
+ # ifdef FEAT_VIRTUALEDIT
+ /* Reset virtual_op so that 'virtualedit' can be changed in the
+--- 2235,2248 ----
+ /* Exclude the end position. */
+ decl(&curbuf->b_op_end);
+
++ argv[0].v_type = VAR_STRING;
+ if (oap->block_mode)
+! argv[0].vval.v_string = (char_u *)"block";
+ else if (oap->motion_type == MLINE)
+! argv[0].vval.v_string = (char_u *)"line";
+ else
+! argv[0].vval.v_string = (char_u *)"char";
+! argv[1].v_type = VAR_UNKNOWN;
+
+ # ifdef FEAT_VIRTUALEDIT
+ /* Reset virtual_op so that 'virtualedit' can be changed in the
+*** ../vim-8.1.0052/src/proto/eval.pro 2018-05-17 13:52:32.000000000 +0200
+--- src/proto/eval.pro 2018-06-12 21:45:51.398816540 +0200
+***************
+*** 19,28 ****
+ list_T *eval_spell_expr(char_u *badword, char_u *expr);
+ int get_spellword(list_T *list, char_u **pp);
+ typval_T *eval_expr(char_u *arg, char_u **nextcmd);
+! int call_vim_function(char_u *func, int argc, char_u **argv, int safe, int str_arg_only, typval_T *rettv);
+! varnumber_T call_func_retnr(char_u *func, int argc, char_u **argv, int safe);
+! void *call_func_retstr(char_u *func, int argc, char_u **argv, int safe);
+! void *call_func_retlist(char_u *func, int argc, char_u **argv, int safe);
+ int eval_foldexpr(char_u *arg, int *cp);
+ void ex_let(exarg_T *eap);
+ void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *first);
+--- 19,28 ----
+ list_T *eval_spell_expr(char_u *badword, char_u *expr);
+ int get_spellword(list_T *list, char_u **pp);
+ typval_T *eval_expr(char_u *arg, char_u **nextcmd);
+! int call_vim_function(char_u *func, int argc, typval_T *argv, typval_T *rettv, int safe);
+! varnumber_T call_func_retnr(char_u *func, int argc, typval_T *argv, int safe);
+! void *call_func_retstr(char_u *func, int argc, typval_T *argv, int safe);
+! void *call_func_retlist(char_u *func, int argc, typval_T *argv, int safe);
+ int eval_foldexpr(char_u *arg, int *cp);
+ void ex_let(exarg_T *eap);
+ void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *first);
+*** ../vim-8.1.0052/src/testdir/test_ins_complete.vim 2018-02-10 16:12:08.000000000 +0100
+--- src/testdir/test_ins_complete.vim 2018-06-12 21:45:51.398816540 +0200
+***************
+*** 117,122 ****
+--- 117,147 ----
+ set omnifunc=
+ endfunc
+
++ func Test_completefunc_args()
++ let s:args = []
++ func! CompleteFunc(findstart, base)
++ let s:args += [[a:findstart, empty(a:base)]]
++ endfunc
++ new
++
++ set completefunc=CompleteFunc
++ call feedkeys("i\<C-X>\<C-U>\<Esc>", 'x')
++ call assert_equal(s:args[0], [1, 1])
++ call assert_equal(s:args[1][0], 0)
++ set completefunc=
++
++ let s:args = []
++ set omnifunc=CompleteFunc
++ call feedkeys("i\<C-X>\<C-O>\<Esc>", 'x')
++ call assert_equal(s:args[0], [1, 1])
++ call assert_equal(s:args[1][0], 0)
++ set omnifunc=
++
++ bwipe!
++ unlet s:args
++ delfunc CompleteFunc
++ endfunc
++
+ function! s:CompleteDone_CompleteFuncDict( findstart, base )
+ if a:findstart
+ return 0
+*** ../vim-8.1.0052/src/version.c 2018-06-12 21:35:37.518665900 +0200
+--- src/version.c 2018-06-12 21:46:24.302622304 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 53,
+ /**/
+
+--
+Bumper sticker: Honk if you love peace and quiet.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0054 b/data/vim/patches/8.1.0054
new file mode 100644
index 000000000..6f6327fd4
--- /dev/null
+++ b/data/vim/patches/8.1.0054
@@ -0,0 +1,68 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0054
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0054
+Problem: Compiler warning for using %ld for "long long".
+Solution: Add a type cast. (closes #3002)
+Files: src/os_unix.c
+
+
+*** ../vim-8.1.0053/src/os_unix.c 2018-06-12 20:25:47.887923393 +0200
+--- src/os_unix.c 2018-06-13 20:49:32.360424689 +0200
+***************
+*** 4199,4205 ****
+ # ifdef FEAT_TERMINAL
+ if (is_terminal)
+ {
+! sprintf((char *)envbuf, "%ld", get_vim_var_nr(VV_VERSION));
+ setenv("VIM_TERMINAL", (char *)envbuf, 1);
+ }
+ # endif
+--- 4199,4205 ----
+ # ifdef FEAT_TERMINAL
+ if (is_terminal)
+ {
+! sprintf((char *)envbuf, "%ld", (long)get_vim_var_nr(VV_VERSION));
+ setenv("VIM_TERMINAL", (char *)envbuf, 1);
+ }
+ # endif
+***************
+*** 4227,4233 ****
+ if (is_terminal)
+ {
+ vim_snprintf(envbuf_Version, sizeof(envbuf_Version),
+! "VIM_TERMINAL=%ld", get_vim_var_nr(VV_VERSION));
+ putenv(envbuf_Version);
+ }
+ # endif
+--- 4227,4233 ----
+ if (is_terminal)
+ {
+ vim_snprintf(envbuf_Version, sizeof(envbuf_Version),
+! "VIM_TERMINAL=%ld", (long)get_vim_var_nr(VV_VERSION));
+ putenv(envbuf_Version);
+ }
+ # endif
+*** ../vim-8.1.0053/src/version.c 2018-06-12 22:05:10.656251565 +0200
+--- src/version.c 2018-06-13 20:48:19.840840420 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 54,
+ /**/
+
+--
+A fine is a tax for doing wrong. A tax is a fine for doing well.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0055 b/data/vim/patches/8.1.0055
new file mode 100644
index 000000000..4350a1275
--- /dev/null
+++ b/data/vim/patches/8.1.0055
@@ -0,0 +1,88 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0055
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0055 (after 8.1.0053)
+Problem: Complete test has wrong order of arguments. Wrong type for
+ sentinel variable.
+Solution: Swap arguments, use VAR_UNKNOWN. (Ozaki Kiichi)
+Files: src/mbyte.c, src/testdir/test_ins_complete.vim
+
+
+*** ../vim-8.1.0054/src/mbyte.c 2018-06-12 22:05:10.656251565 +0200
+--- src/mbyte.c 2018-06-13 21:22:38.711055156 +0200
+***************
+*** 4799,4805 ****
+
+ argv[0].v_type = VAR_NUMBER;
+ argv[0].vval.v_number = active ? 1 : 0;
+! argv[1].v_type = VAR_NUMBER;
+ (void)call_func_retnr(p_imaf, 1, argv, FALSE);
+ }
+
+--- 4799,4805 ----
+
+ argv[0].v_type = VAR_NUMBER;
+ argv[0].vval.v_number = active ? 1 : 0;
+! argv[1].v_type = VAR_UNKNOWN;
+ (void)call_func_retnr(p_imaf, 1, argv, FALSE);
+ }
+
+*** ../vim-8.1.0054/src/testdir/test_ins_complete.vim 2018-06-12 22:05:10.656251565 +0200
+--- src/testdir/test_ins_complete.vim 2018-06-13 21:22:38.711055156 +0200
+***************
+*** 126,140 ****
+
+ set completefunc=CompleteFunc
+ call feedkeys("i\<C-X>\<C-U>\<Esc>", 'x')
+! call assert_equal(s:args[0], [1, 1])
+! call assert_equal(s:args[1][0], 0)
+ set completefunc=
+
+ let s:args = []
+ set omnifunc=CompleteFunc
+ call feedkeys("i\<C-X>\<C-O>\<Esc>", 'x')
+! call assert_equal(s:args[0], [1, 1])
+! call assert_equal(s:args[1][0], 0)
+ set omnifunc=
+
+ bwipe!
+--- 126,140 ----
+
+ set completefunc=CompleteFunc
+ call feedkeys("i\<C-X>\<C-U>\<Esc>", 'x')
+! call assert_equal([1, 1], s:args[0])
+! call assert_equal(0, s:args[1][0])
+ set completefunc=
+
+ let s:args = []
+ set omnifunc=CompleteFunc
+ call feedkeys("i\<C-X>\<C-O>\<Esc>", 'x')
+! call assert_equal([1, 1], s:args[0])
+! call assert_equal(0, s:args[1][0])
+ set omnifunc=
+
+ bwipe!
+*** ../vim-8.1.0054/src/version.c 2018-06-13 20:49:47.444338292 +0200
+--- src/version.c 2018-06-13 21:25:28.718171776 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 55,
+ /**/
+
+--
+Everybody lies, but it doesn't matter since nobody listens.
+ -- Lieberman's Law
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0056 b/data/vim/patches/8.1.0056
new file mode 100644
index 000000000..0dcd34411
--- /dev/null
+++ b/data/vim/patches/8.1.0056
@@ -0,0 +1,130 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0056
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0056
+Problem: Crash when using :hardcopy with illegal byte.
+Solution: Check for string_convert() returning NULL. (Dominique Pelle)
+Files: src/hardcopy.c, src/testdir/test_hardcopy.vim
+
+
+*** ../vim-8.1.0055/src/hardcopy.c 2018-02-11 15:38:21.000000000 +0100
+--- src/hardcopy.c 2018-06-16 14:43:41.918213746 +0200
+***************
+*** 3372,3379 ****
+ }
+
+ int
+! mch_print_text_out(char_u *p, int len UNUSED)
+ {
+ int need_break;
+ char_u ch;
+ char_u ch_buff[8];
+--- 3372,3380 ----
+ }
+
+ int
+! mch_print_text_out(char_u *textp, int len UNUSED)
+ {
++ char_u *p = textp;
+ int need_break;
+ char_u ch;
+ char_u ch_buff[8];
+***************
+*** 3508,3515 ****
+--- 3509,3523 ----
+
+ #ifdef FEAT_MBYTE
+ if (prt_do_conv)
++ {
+ /* Convert from multi-byte to 8-bit encoding */
+ tofree = p = string_convert(&prt_conv, p, &len);
++ if (p == NULL)
++ {
++ p = (char_u *)"";
++ len = 0;
++ }
++ }
+
+ if (prt_out_mbyte)
+ {
+*** ../vim-8.1.0055/src/testdir/test_hardcopy.vim 2017-10-26 23:41:07.000000000 +0200
+--- src/testdir/test_hardcopy.vim 2018-06-16 14:39:00.343781251 +0200
+***************
+*** 63,74 ****
+ endfunc
+
+ func Test_fname_with_spaces()
+! if has('postscript')
+! split t\ e\ s\ t.txt
+! call setline(1, ['just', 'some', 'text'])
+! hardcopy > %.ps
+! call assert_true(filereadable('t e s t.txt.ps'))
+! call delete('t e s t.txt.ps')
+! bwipe!
+ endif
+ endfunc
+--- 63,89 ----
+ endfunc
+
+ func Test_fname_with_spaces()
+! if !has('postscript')
+! return
+ endif
++ split t\ e\ s\ t.txt
++ call setline(1, ['just', 'some', 'text'])
++ hardcopy > %.ps
++ call assert_true(filereadable('t e s t.txt.ps'))
++ call delete('t e s t.txt.ps')
++ bwipe!
+ endfunc
++
++ func Test_illegal_byte()
++ if !has('postscript') || &enc != 'utf-8'
++ return
++ endif
++ new
++ " conversion of 0xff will fail, this used to cause a crash
++ call setline(1, "\xff")
++ hardcopy >Xpstest
++
++ bwipe!
++ call delete('Xpstest')
++ endfunc
++
+*** ../vim-8.1.0055/src/version.c 2018-06-13 21:27:20.213366293 +0200
+--- src/version.c 2018-06-16 14:39:45.695527854 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 56,
+ /**/
+
+--
+The real
+trick is
+this: to
+keep the
+lines as
+short as
+possible
+and keep
+the size
+the same
+yet free
+from the
+need for
+hyphena-
+Dammit!! (Matthew Winn)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0057 b/data/vim/patches/8.1.0057
new file mode 100644
index 000000000..9cf86c5c9
--- /dev/null
+++ b/data/vim/patches/8.1.0057
@@ -0,0 +1,203 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0057
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0057
+Problem: Popup menu displayed wrong when using autocmd.
+Solution: Use aucmd_prepbuf(). Force updating status line if the popup menu
+ is going to be redrawn anyway. (Christian Brabandt, closes #3009)
+Files: src/edit.c, src/screen.c, src/proto/screen.pro
+
+
+*** ../vim-8.1.0056/src/edit.c 2018-06-12 22:05:10.652251583 +0200
+--- src/edit.c 2018-06-16 15:25:18.046301708 +0200
+***************
+*** 1704,1710 ****
+--- 1704,1715 ----
+ #endif
+ )
+ {
++ aco_save_T aco;
++
++ // save and restore curwin and curbuf, in case the autocmd changes them
++ aucmd_prepbuf(&aco, curbuf);
+ apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
++ aucmd_restbuf(&aco);
+ curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
+ }
+
+***************
+*** 1716,1722 ****
+--- 1721,1732 ----
+ && curbuf->b_last_changedtick_pum != CHANGEDTICK(curbuf)
+ && pum_visible())
+ {
++ aco_save_T aco;
++
++ // save and restore curwin and curbuf, in case the autocmd changes them
++ aucmd_prepbuf(&aco, curbuf);
+ apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, FALSE, curbuf);
++ aucmd_restbuf(&aco);
+ curbuf->b_last_changedtick_pum = CHANGEDTICK(curbuf);
+ }
+ #endif
+*** ../vim-8.1.0056/src/screen.c 2018-05-22 20:35:13.566009271 +0200
+--- src/screen.c 2018-06-16 15:32:15.224125456 +0200
+***************
+*** 125,130 ****
+--- 125,131 ----
+ static schar_T *current_ScreenLine;
+
+ static void win_update(win_T *wp);
++ static void win_redr_status(win_T *wp, int ignore_pum);
+ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T hl);
+ #ifdef FEAT_FOLDING
+ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T lnum, int row);
+***************
+*** 774,780 ****
+ if (wp->w_redr_status)
+ {
+ cursor_off();
+! win_redr_status(wp);
+ }
+ }
+ #if defined(FEAT_SEARCH_EXTRA)
+--- 775,781 ----
+ if (wp->w_redr_status)
+ {
+ cursor_off();
+! win_redr_status(wp, TRUE); // any popup menu will be redrawn below
+ }
+ }
+ #if defined(FEAT_SEARCH_EXTRA)
+***************
+*** 1030,1036 ****
+ if (wp->w_redr_type != 0)
+ win_update(wp);
+ if (wp->w_redr_status)
+! win_redr_status(wp);
+ }
+
+ update_finish();
+--- 1031,1037 ----
+ if (wp->w_redr_type != 0)
+ win_update(wp);
+ if (wp->w_redr_status)
+! win_redr_status(wp, FALSE);
+ }
+
+ update_finish();
+***************
+*** 1074,1080 ****
+ || *p_stl != NUL || *wp->w_p_stl != NUL
+ # endif
+ )
+! win_redr_status(wp);
+
+ update_finish();
+ }
+--- 1075,1081 ----
+ || *p_stl != NUL || *wp->w_p_stl != NUL
+ # endif
+ )
+! win_redr_status(wp, FALSE);
+
+ update_finish();
+ }
+***************
+*** 6535,6541 ****
+
+ FOR_ALL_WINDOWS(wp)
+ if (wp->w_redr_status)
+! win_redr_status(wp);
+ if (redraw_tabline)
+ draw_tabline();
+ }
+--- 6536,6542 ----
+
+ FOR_ALL_WINDOWS(wp)
+ if (wp->w_redr_status)
+! win_redr_status(wp, FALSE);
+ if (redraw_tabline)
+ draw_tabline();
+ }
+***************
+*** 6864,6872 ****
+ * Redraw the status line of window wp.
+ *
+ * If inversion is possible we use it. Else '=' characters are used.
+ */
+! void
+! win_redr_status(win_T *wp)
+ {
+ int row;
+ char_u *p;
+--- 6865,6875 ----
+ * Redraw the status line of window wp.
+ *
+ * If inversion is possible we use it. Else '=' characters are used.
++ * If "ignore_pum" is TRUE, also redraw statusline when the popup menu is
++ * displayed.
+ */
+! static void
+! win_redr_status(win_T *wp, int ignore_pum)
+ {
+ int row;
+ char_u *p;
+***************
+*** 6890,6898 ****
+ }
+ else if (!redrawing()
+ #ifdef FEAT_INS_EXPAND
+! /* don't update status line when popup menu is visible and may be
+! * drawn over it */
+! || pum_visible()
+ #endif
+ )
+ {
+--- 6893,6901 ----
+ }
+ else if (!redrawing()
+ #ifdef FEAT_INS_EXPAND
+! // don't update status line when popup menu is visible and may be
+! // drawn over it, unless it will be redrawn later
+! || (!ignore_pum && pum_visible())
+ #endif
+ )
+ {
+*** ../vim-8.1.0056/src/proto/screen.pro 2018-05-17 13:52:50.000000000 +0200
+--- src/proto/screen.pro 2018-06-16 15:23:36.274904477 +0200
+***************
+*** 25,31 ****
+ void redraw_statuslines(void);
+ void win_redraw_last_status(frame_T *frp);
+ void win_redr_status_matches(expand_T *xp, int num_matches, char_u **matches, int match, int showtail);
+- void win_redr_status(win_T *wp);
+ int stl_connected(win_T *wp);
+ int get_keymap_str(win_T *wp, char_u *fmt, char_u *buf, int len);
+ void screen_putchar(int c, int row, int col, int attr);
+--- 25,30 ----
+*** ../vim-8.1.0056/src/version.c 2018-06-16 14:44:05.754081590 +0200
+--- src/version.c 2018-06-16 15:23:26.526962287 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 57,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+49. You never have to deal with busy signals when calling your ISP...because
+ you never log off.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0058 b/data/vim/patches/8.1.0058
new file mode 100644
index 000000000..bad287b86
--- /dev/null
+++ b/data/vim/patches/8.1.0058
@@ -0,0 +1,220 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0058
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0058
+Problem: Display problem with margins and scrolling.
+Solution: Place the cursor in the right column. (Kouichi Iwamoto,
+ closes #3016)
+Files: src/screen.c
+
+
+*** ../vim-8.1.0057/src/screen.c 2018-06-16 15:32:34.460024472 +0200
+--- src/screen.c 2018-06-16 16:14:27.022630636 +0200
+***************
+*** 9797,9802 ****
+--- 9797,9803 ----
+ int j;
+ unsigned temp;
+ int cursor_row;
++ int cursor_col = 0;
+ int type;
+ int result_empty;
+ int can_ce = can_clear(T_CE);
+***************
+*** 9893,9898 ****
+--- 9894,9902 ----
+ gui_dont_update_cursor(row + off <= gui.cursor_row);
+ #endif
+
++ if (wp != NULL && wp->w_wincol != 0 && *T_CSV != NUL && *T_CCS == NUL)
++ cursor_col = wp->w_wincol;
++
+ if (*T_CCS != NUL) /* cursor relative to region */
+ cursor_row = row;
+ else
+***************
+*** 9939,9945 ****
+ }
+
+ screen_stop_highlight();
+! windgoto(cursor_row, 0);
+ if (clear_attr != 0)
+ screen_start_highlight(clear_attr);
+
+--- 9943,9949 ----
+ }
+
+ screen_stop_highlight();
+! windgoto(cursor_row, cursor_col);
+ if (clear_attr != 0)
+ screen_start_highlight(clear_attr);
+
+***************
+*** 9958,9964 ****
+ if (type == USE_T_AL)
+ {
+ if (i && cursor_row != 0)
+! windgoto(cursor_row, 0);
+ out_str(T_AL);
+ }
+ else /* type == USE_T_SR */
+--- 9962,9968 ----
+ if (type == USE_T_AL)
+ {
+ if (i && cursor_row != 0)
+! windgoto(cursor_row, cursor_col);
+ out_str(T_AL);
+ }
+ else /* type == USE_T_SR */
+***************
+*** 9975,9981 ****
+ {
+ for (i = 0; i < line_count; ++i)
+ {
+! windgoto(off + i, 0);
+ out_str(T_CE);
+ screen_start(); /* don't know where cursor is now */
+ }
+--- 9979,9985 ----
+ {
+ for (i = 0; i < line_count; ++i)
+ {
+! windgoto(off + i, cursor_col);
+ out_str(T_CE);
+ screen_start(); /* don't know where cursor is now */
+ }
+***************
+*** 10011,10016 ****
+--- 10015,10021 ----
+ int i;
+ unsigned temp;
+ int cursor_row;
++ int cursor_col = 0;
+ int cursor_end;
+ int result_empty; /* result is empty until end of region */
+ int can_delete; /* deleting line codes can be used */
+***************
+*** 10110,10115 ****
+--- 10115,10123 ----
+ && gui.cursor_row < end + off);
+ #endif
+
++ if (wp != NULL && wp->w_wincol != 0 && *T_CSV != NUL && *T_CCS == NUL)
++ cursor_col = wp->w_wincol;
++
+ if (*T_CCS != NUL) /* cursor relative to region */
+ {
+ cursor_row = row;
+***************
+*** 10172,10184 ****
+ redraw_block(row, end, wp);
+ else if (type == USE_T_CD) /* delete the lines */
+ {
+! windgoto(cursor_row, 0);
+ out_str(T_CD);
+ screen_start(); /* don't know where cursor is now */
+ }
+ else if (type == USE_T_CDL)
+ {
+! windgoto(cursor_row, 0);
+ term_delete_lines(line_count);
+ screen_start(); /* don't know where cursor is now */
+ }
+--- 10180,10192 ----
+ redraw_block(row, end, wp);
+ else if (type == USE_T_CD) /* delete the lines */
+ {
+! windgoto(cursor_row, cursor_col);
+ out_str(T_CD);
+ screen_start(); /* don't know where cursor is now */
+ }
+ else if (type == USE_T_CDL)
+ {
+! windgoto(cursor_row, cursor_col);
+ term_delete_lines(line_count);
+ screen_start(); /* don't know where cursor is now */
+ }
+***************
+*** 10189,10195 ****
+ */
+ else if (type == USE_NL)
+ {
+! windgoto(cursor_end - 1, 0);
+ for (i = line_count; --i >= 0; )
+ out_char('\n'); /* cursor will remain on same line */
+ }
+--- 10197,10203 ----
+ */
+ else if (type == USE_NL)
+ {
+! windgoto(cursor_end - 1, cursor_col);
+ for (i = line_count; --i >= 0; )
+ out_char('\n'); /* cursor will remain on same line */
+ }
+***************
+*** 10199,10210 ****
+ {
+ if (type == USE_T_DL)
+ {
+! windgoto(cursor_row, 0);
+ out_str(T_DL); /* delete a line */
+ }
+ else /* type == USE_T_CE */
+ {
+! windgoto(cursor_row + i, 0);
+ out_str(T_CE); /* erase a line */
+ }
+ screen_start(); /* don't know where cursor is now */
+--- 10207,10218 ----
+ {
+ if (type == USE_T_DL)
+ {
+! windgoto(cursor_row, cursor_col);
+ out_str(T_DL); /* delete a line */
+ }
+ else /* type == USE_T_CE */
+ {
+! windgoto(cursor_row + i, cursor_col);
+ out_str(T_CE); /* erase a line */
+ }
+ screen_start(); /* don't know where cursor is now */
+***************
+*** 10219,10225 ****
+ {
+ for (i = line_count; i > 0; --i)
+ {
+! windgoto(cursor_end - i, 0);
+ out_str(T_CE); /* erase a line */
+ screen_start(); /* don't know where cursor is now */
+ }
+--- 10227,10233 ----
+ {
+ for (i = line_count; i > 0; --i)
+ {
+! windgoto(cursor_end - i, cursor_col);
+ out_str(T_CE); /* erase a line */
+ screen_start(); /* don't know where cursor is now */
+ }
+*** ../vim-8.1.0057/src/version.c 2018-06-16 15:32:34.460024472 +0200
+--- src/version.c 2018-06-16 16:13:43.890855764 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 58,
+ /**/
+
+--
+Never go to the toilet in a paperless office.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0059 b/data/vim/patches/8.1.0059
new file mode 100644
index 000000000..a029733c5
--- /dev/null
+++ b/data/vim/patches/8.1.0059
@@ -0,0 +1,111 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0059
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0059
+Problem: Displayed digraph for "ga" wrong with 'encoding' "cp1251".
+Solution: Convert from 'encoding' to "utf-8" if needed. (closes #3015)
+Files: src/digraph.c, src/testdir/test_digraph.vim
+
+
+*** ../vim-8.1.0058/src/digraph.c 2018-02-27 20:01:13.000000000 +0100
+--- src/digraph.c 2018-06-16 17:06:04.657272887 +0200
+***************
+*** 1979,1992 ****
+ * If not found return NULL.
+ */
+ char_u *
+! get_digraph_for_char(val)
+! int val;
+ {
+ int i;
+ int use_defaults;
+ digr_T *dp;
+ static char_u r[3];
+
+ for (use_defaults = 0; use_defaults <= 1; use_defaults++)
+ {
+ if (use_defaults == 0)
+--- 1979,2015 ----
+ * If not found return NULL.
+ */
+ char_u *
+! get_digraph_for_char(int val_arg)
+ {
++ int val = val_arg;
+ int i;
+ int use_defaults;
+ digr_T *dp;
+ static char_u r[3];
+
++ #if defined(FEAT_MBYTE) && defined(USE_UNICODE_DIGRAPHS)
++ if (!enc_utf8)
++ {
++ char_u buf[6], *to;
++ vimconv_T vc;
++
++ // convert the character from 'encoding' to Unicode
++ i = mb_char2bytes(val, buf);
++ vc.vc_type = CONV_NONE;
++ if (convert_setup(&vc, p_enc, (char_u *)"utf-8") == OK)
++ {
++ vc.vc_fail = TRUE;
++ to = string_convert(&vc, buf, &i);
++ if (to != NULL)
++ {
++ val = utf_ptr2char(to);
++ vim_free(to);
++ }
++ (void)convert_setup(&vc, NULL, NULL);
++ }
++ }
++ #endif
++
+ for (use_defaults = 0; use_defaults <= 1; use_defaults++)
+ {
+ if (use_defaults == 0)
+*** ../vim-8.1.0058/src/testdir/test_digraph.vim 2018-02-27 21:08:09.000000000 +0100
+--- src/testdir/test_digraph.vim 2018-06-16 17:15:21.629331405 +0200
+***************
+*** 465,468 ****
+--- 465,480 ----
+ bwipe!
+ endfunc
+
++ func Test_show_digraph_cp1251()
++ if !has('multi_byte')
++ return
++ endif
++ new
++ set encoding=cp1251
++ call Put_Dig("='")
++ call assert_equal("\n<\xfa> <|z> <M-z> 250, Hex fa, Oct 372, Digr ='", execute('ascii'))
++ set encoding=utf-8
++ bwipe!
++ endfunc
++
+ " vim: shiftwidth=2 sts=2 expandtab
+*** ../vim-8.1.0058/src/version.c 2018-06-16 16:20:48.772597946 +0200
+--- src/version.c 2018-06-16 17:07:11.244898262 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 59,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+53. To find out what time it is, you send yourself an e-mail and check the
+ "Date:" field.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0060 b/data/vim/patches/8.1.0060
new file mode 100644
index 000000000..b1af72ef4
--- /dev/null
+++ b/data/vim/patches/8.1.0060
@@ -0,0 +1,74 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0060
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0060
+Problem: Crash when autocommands delete the current buffer. (Dominique
+ Pelle)
+Solution: Check that autocommands don't change the buffer.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+
+*** ../vim-8.1.0059/src/quickfix.c 2018-05-21 16:56:33.683217200 +0200
+--- src/quickfix.c 2018-06-16 21:57:15.946537874 +0200
+***************
+*** 6272,6279 ****
+--- 6272,6287 ----
+ if (res >= 0)
+ qf_list_changed(qi, qi->qf_curlist);
+ if (au_name != NULL)
++ {
++ buf_T *curbuf_old = curbuf;
++
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
++ if (curbuf != curbuf_old)
++ // Autocommands changed buffer, don't jump now, "qi" may
++ // be invalid.
++ res = 0;
++ }
+ if (res > 0 && (eap->cmdidx == CMD_cbuffer ||
+ eap->cmdidx == CMD_lbuffer))
+ qf_jump(qi, 0, 0, eap->forceit); /* display first error */
+*** ../vim-8.1.0059/src/testdir/test_quickfix.vim 2018-05-15 21:53:11.000000000 +0200
+--- src/testdir/test_quickfix.vim 2018-06-16 21:49:48.980572266 +0200
+***************
+*** 3350,3352 ****
+--- 3350,3364 ----
+ call assert_equal('Errors', w:quickfix_title)
+ cclose
+ endfunc
++
++ func Test_lbuffer_with_bwipe()
++ new
++ new
++ augroup nasty
++ au * * bwipe
++ augroup END
++ lbuffer
++ augroup nasty
++ au!
++ augroup END
++ endfunc
+*** ../vim-8.1.0059/src/version.c 2018-06-16 17:25:17.997346631 +0200
+--- src/version.c 2018-06-16 21:58:12.078265886 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 60,
+ /**/
+
+--
+Keyboard not found. Think ENTER to continue.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0061 b/data/vim/patches/8.1.0061
new file mode 100644
index 000000000..e9c537e67
--- /dev/null
+++ b/data/vim/patches/8.1.0061
@@ -0,0 +1,420 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0061
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0061
+Problem: Window title is wrong after resetting and setting 'title'.
+Solution: Move resetting the title into maketitle(). (Jason Franklin)
+Files: src/option.c, src/buffer.c
+
+
+*** ../vim-8.1.0060/src/option.c 2018-06-12 16:49:26.366028607 +0200
+--- src/option.c 2018-06-16 22:36:07.814142229 +0200
+***************
+*** 3256,3264 ****
+ #ifdef FEAT_CMDWIN
+ static char_u *check_cedit(void);
+ #endif
+- #ifdef FEAT_TITLE
+- static void did_set_title(int icon);
+- #endif
+ static char_u *option_expand(int opt_idx, char_u *val);
+ static void didset_options(void);
+ static void didset_options2(void);
+--- 3256,3261 ----
+***************
+*** 5374,5400 ****
+ * the old value back.
+ */
+ static void
+! did_set_title(
+! int icon) /* Did set icon instead of title */
+ {
+ if (starting != NO_SCREEN
+ #ifdef FEAT_GUI
+ && !gui.starting
+ #endif
+ )
+- {
+ maketitle();
+- if (icon)
+- {
+- if (!p_icon)
+- mch_restore_title(2);
+- }
+- else
+- {
+- if (!p_title)
+- mch_restore_title(1);
+- }
+- }
+ }
+ #endif
+
+--- 5371,5384 ----
+ * the old value back.
+ */
+ static void
+! did_set_title(void)
+ {
+ if (starting != NO_SCREEN
+ #ifdef FEAT_GUI
+ && !gui.starting
+ #endif
+ )
+ maketitle();
+ }
+ #endif
+
+***************
+*** 6949,6956 ****
+ else
+ stl_syntax &= ~flagval;
+ # endif
+! did_set_title(varp == &p_iconstring);
+!
+ }
+ #endif
+
+--- 6933,6939 ----
+ else
+ stl_syntax &= ~flagval;
+ # endif
+! did_set_title();
+ }
+ #endif
+
+***************
+*** 8401,8414 ****
+
+ #ifdef FEAT_TITLE
+ /* when 'title' changed, may need to change the title; same for 'icon' */
+! else if ((int *)varp == &p_title)
+! {
+! did_set_title(FALSE);
+! }
+!
+! else if ((int *)varp == &p_icon)
+ {
+! did_set_title(TRUE);
+ }
+ #endif
+
+--- 8384,8392 ----
+
+ #ifdef FEAT_TITLE
+ /* when 'title' changed, may need to change the title; same for 'icon' */
+! else if ((int *)varp == &p_title || (int *)varp == &p_icon)
+ {
+! did_set_title();
+ }
+ #endif
+
+*** ../vim-8.1.0060/src/buffer.c 2018-06-06 18:02:31.402773772 +0200
+--- src/buffer.c 2018-06-16 22:57:08.067368623 +0200
+***************
+*** 38,44 ****
+ static int otherfile_buf(buf_T *buf, char_u *ffname);
+ #endif
+ #ifdef FEAT_TITLE
+! static int ti_change(char_u *str, char_u **last);
+ #endif
+ static int append_arg_number(win_T *wp, char_u *buf, int buflen, int add_file);
+ static void free_buffer(buf_T *);
+--- 38,44 ----
+ static int otherfile_buf(buf_T *buf, char_u *ffname);
+ #endif
+ #ifdef FEAT_TITLE
+! static int value_changed(char_u *str, char_u **last);
+ #endif
+ static int append_arg_number(win_T *wp, char_u *buf, int buflen, int add_file);
+ static void free_buffer(buf_T *);
+***************
+*** 3545,3564 ****
+ }
+
+ #if defined(FEAT_TITLE) || defined(PROTO)
+- /*
+- * put file name in title bar of window and in icon title
+- */
+-
+ static char_u *lasttitle = NULL;
+ static char_u *lasticon = NULL;
+
+ void
+ maketitle(void)
+ {
+ char_u *p;
+! char_u *t_str = NULL;
+! char_u *i_name;
+! char_u *i_str = NULL;
+ int maxlen = 0;
+ int len;
+ int mustset;
+--- 3545,3562 ----
+ }
+
+ #if defined(FEAT_TITLE) || defined(PROTO)
+ static char_u *lasttitle = NULL;
+ static char_u *lasticon = NULL;
+
++ /*
++ * Put the file name in the title bar and icon of the window.
++ */
+ void
+ maketitle(void)
+ {
+ char_u *p;
+! char_u *title_str = NULL;
+! char_u *icon_str = NULL;
+ int maxlen = 0;
+ int len;
+ int mustset;
+***************
+*** 3574,3580 ****
+
+ need_maketitle = FALSE;
+ if (!p_title && !p_icon && lasttitle == NULL && lasticon == NULL)
+! return;
+
+ if (p_title)
+ {
+--- 3572,3578 ----
+
+ need_maketitle = FALSE;
+ if (!p_title && !p_icon && lasttitle == NULL && lasticon == NULL)
+! return; // nothing to do
+
+ if (p_title)
+ {
+***************
+*** 3585,3591 ****
+ maxlen = 10;
+ }
+
+! t_str = buf;
+ if (*p_titlestring != NUL)
+ {
+ #ifdef FEAT_STL_OPT
+--- 3583,3589 ----
+ maxlen = 10;
+ }
+
+! title_str = buf;
+ if (*p_titlestring != NUL)
+ {
+ #ifdef FEAT_STL_OPT
+***************
+*** 3598,3604 ****
+ use_sandbox = was_set_insecurely((char_u *)"titlestring", 0);
+ # endif
+ called_emsg = FALSE;
+! build_stl_str_hl(curwin, t_str, sizeof(buf),
+ p_titlestring, use_sandbox,
+ 0, maxlen, NULL, NULL);
+ if (called_emsg)
+--- 3596,3602 ----
+ use_sandbox = was_set_insecurely((char_u *)"titlestring", 0);
+ # endif
+ called_emsg = FALSE;
+! build_stl_str_hl(curwin, title_str, sizeof(buf),
+ p_titlestring, use_sandbox,
+ 0, maxlen, NULL, NULL);
+ if (called_emsg)
+***************
+*** 3608,3614 ****
+ }
+ else
+ #endif
+! t_str = p_titlestring;
+ }
+ else
+ {
+--- 3606,3612 ----
+ }
+ else
+ #endif
+! title_str = p_titlestring;
+ }
+ else
+ {
+***************
+*** 3714,3724 ****
+ }
+ }
+ }
+! mustset = ti_change(t_str, &lasttitle);
+
+ if (p_icon)
+ {
+! i_str = buf;
+ if (*p_iconstring != NUL)
+ {
+ #ifdef FEAT_STL_OPT
+--- 3712,3722 ----
+ }
+ }
+ }
+! mustset = value_changed(title_str, &lasttitle);
+
+ if (p_icon)
+ {
+! icon_str = buf;
+ if (*p_iconstring != NUL)
+ {
+ #ifdef FEAT_STL_OPT
+***************
+*** 3731,3737 ****
+ use_sandbox = was_set_insecurely((char_u *)"iconstring", 0);
+ # endif
+ called_emsg = FALSE;
+! build_stl_str_hl(curwin, i_str, sizeof(buf),
+ p_iconstring, use_sandbox,
+ 0, 0, NULL, NULL);
+ if (called_emsg)
+--- 3729,3735 ----
+ use_sandbox = was_set_insecurely((char_u *)"iconstring", 0);
+ # endif
+ called_emsg = FALSE;
+! build_stl_str_hl(curwin, icon_str, sizeof(buf),
+ p_iconstring, use_sandbox,
+ 0, 0, NULL, NULL);
+ if (called_emsg)
+***************
+*** 3741,3772 ****
+ }
+ else
+ #endif
+! i_str = p_iconstring;
+ }
+ else
+ {
+ if (buf_spname(curbuf) != NULL)
+! i_name = buf_spname(curbuf);
+ else /* use file name only in icon */
+! i_name = gettail(curbuf->b_ffname);
+! *i_str = NUL;
+ /* Truncate name at 100 bytes. */
+! len = (int)STRLEN(i_name);
+ if (len > 100)
+ {
+ len -= 100;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! len += (*mb_tail_off)(i_name, i_name + len) + 1;
+ #endif
+! i_name += len;
+ }
+! STRCPY(i_str, i_name);
+! trans_characters(i_str, IOSIZE);
+ }
+ }
+
+! mustset |= ti_change(i_str, &lasticon);
+
+ if (mustset)
+ resettitle();
+--- 3739,3770 ----
+ }
+ else
+ #endif
+! icon_str = p_iconstring;
+ }
+ else
+ {
+ if (buf_spname(curbuf) != NULL)
+! p = buf_spname(curbuf);
+ else /* use file name only in icon */
+! p = gettail(curbuf->b_ffname);
+! *icon_str = NUL;
+ /* Truncate name at 100 bytes. */
+! len = (int)STRLEN(p);
+ if (len > 100)
+ {
+ len -= 100;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! len += (*mb_tail_off)(p, p + len) + 1;
+ #endif
+! p += len;
+ }
+! STRCPY(icon_str, p);
+! trans_characters(icon_str, IOSIZE);
+ }
+ }
+
+! mustset |= value_changed(icon_str, &lasticon);
+
+ if (mustset)
+ resettitle();
+***************
+*** 3775,3794 ****
+ /*
+ * Used for title and icon: Check if "str" differs from "*last". Set "*last"
+ * from "str" if it does.
+! * Return TRUE when "*last" changed.
+ */
+ static int
+! ti_change(char_u *str, char_u **last)
+ {
+ if ((str == NULL) != (*last == NULL)
+ || (str != NULL && *last != NULL && STRCMP(str, *last) != 0))
+ {
+ vim_free(*last);
+ if (str == NULL)
+ *last = NULL;
+ else
+ *last = vim_strsave(str);
+! return TRUE;
+ }
+ return FALSE;
+ }
+--- 3773,3797 ----
+ /*
+ * Used for title and icon: Check if "str" differs from "*last". Set "*last"
+ * from "str" if it does.
+! * Return TRUE if resettitle() is to be called.
+ */
+ static int
+! value_changed(char_u *str, char_u **last)
+ {
+ if ((str == NULL) != (*last == NULL)
+ || (str != NULL && *last != NULL && STRCMP(str, *last) != 0))
+ {
+ vim_free(*last);
+ if (str == NULL)
++ {
+ *last = NULL;
++ mch_restore_title(last == &lasttitle ? 1 : 2);
++ }
+ else
++ {
+ *last = vim_strsave(str);
+! return TRUE;
+! }
+ }
+ return FALSE;
+ }
+*** ../vim-8.1.0060/src/version.c 2018-06-16 22:16:43.232576946 +0200
+--- src/version.c 2018-06-16 22:48:20.082215622 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 61,
+ /**/
+
+--
+"I don’t know how to make a screenshot" - Richard Stallman, July 2002
+(when asked to send a screenshot of his desktop for unix.se)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0062 b/data/vim/patches/8.1.0062
new file mode 100644
index 000000000..7161478ca
--- /dev/null
+++ b/data/vim/patches/8.1.0062
@@ -0,0 +1,371 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0062
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0062
+Problem: Popup menu broken if a callback changes the window layout. (Qiming
+ Zhao)
+Solution: Recompute the popup menu position if needed. Redraw the ruler
+ even when the popup menu is displayed.
+Files: src/popupmnu.c, src/proto/popupmnu.pro, src/screen.c
+
+
+*** ../vim-8.1.0061/src/popupmnu.c 2018-05-14 23:05:31.000000000 +0200
+--- src/popupmnu.c 2018-06-17 14:41:52.487403691 +0200
+***************
+*** 29,34 ****
+--- 29,40 ----
+ static int pum_row; /* top row of pum */
+ static int pum_col; /* left column of pum */
+
++ static int pum_win_row;
++ static int pum_win_height;
++ static int pum_win_col;
++ static int pum_win_wcol;
++ static int pum_win_width;
++
+ static int pum_do_redraw = FALSE; /* do redraw anyway */
+
+ static int pum_set_selected(int n, int repeat);
+***************
+*** 81,87 ****
+ {
+ int def_width;
+ int max_width;
+- int row;
+ int context_lines;
+ int cursor_col;
+ int above_row;
+--- 87,92 ----
+***************
+*** 103,109 ****
+ validate_cursor_col();
+ pum_array = NULL;
+
+! row = curwin->w_wrow + W_WINROW(curwin);
+
+ #if defined(FEAT_QUICKFIX)
+ FOR_ALL_WINDOWS(pvwin)
+--- 108,120 ----
+ validate_cursor_col();
+ pum_array = NULL;
+
+! // Remember the essential parts of the window position and size, so we
+! // can decide when to reposition the popup menu.
+! pum_win_row = curwin->w_wrow + W_WINROW(curwin);
+! pum_win_height = curwin->w_height;
+! pum_win_col = curwin->w_wincol;
+! pum_win_wcol = curwin->w_wcol;
+! pum_win_width = curwin->w_width;
+
+ #if defined(FEAT_QUICKFIX)
+ FOR_ALL_WINDOWS(pvwin)
+***************
+*** 128,139 ****
+ if (p_ph > 0 && pum_height > p_ph)
+ pum_height = p_ph;
+
+! /* Put the pum below "row" if possible. If there are few lines decide
+ * on where there is more room. */
+! if (row + 2 >= below_row - pum_height
+! && row - above_row > (below_row - above_row) / 2)
+ {
+! /* pum above "row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_wrow - curwin->w_cline_row >= 2)
+--- 139,150 ----
+ if (p_ph > 0 && pum_height > p_ph)
+ pum_height = p_ph;
+
+! /* Put the pum below "pum_win_row" if possible. If there are few lines decide
+ * on where there is more room. */
+! if (pum_win_row + 2 >= below_row - pum_height
+! && pum_win_row - above_row > (below_row - above_row) / 2)
+ {
+! /* pum above "pum_win_row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_wrow - curwin->w_cline_row >= 2)
+***************
+*** 141,155 ****
+ else
+ context_lines = curwin->w_wrow - curwin->w_cline_row;
+
+! if (row >= size + context_lines)
+ {
+! pum_row = row - size - context_lines;
+ pum_height = size;
+ }
+ else
+ {
+ pum_row = 0;
+! pum_height = row - context_lines;
+ }
+ if (p_ph > 0 && pum_height > p_ph)
+ {
+--- 152,166 ----
+ else
+ context_lines = curwin->w_wrow - curwin->w_cline_row;
+
+! if (pum_win_row >= size + context_lines)
+ {
+! pum_row = pum_win_row - size - context_lines;
+ pum_height = size;
+ }
+ else
+ {
+ pum_row = 0;
+! pum_height = pum_win_row - context_lines;
+ }
+ if (p_ph > 0 && pum_height > p_ph)
+ {
+***************
+*** 159,165 ****
+ }
+ else
+ {
+! /* pum below "row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_cline_row
+--- 170,176 ----
+ }
+ else
+ {
+! /* pum below "pum_win_row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_cline_row
+***************
+*** 169,175 ****
+ context_lines = curwin->w_cline_row
+ + curwin->w_cline_height - curwin->w_wrow;
+
+! pum_row = row + context_lines;
+ if (size > below_row - pum_row)
+ pum_height = below_row - pum_row;
+ else
+--- 180,186 ----
+ context_lines = curwin->w_cline_row
+ + curwin->w_cline_height - curwin->w_wrow;
+
+! pum_row = pum_win_row + context_lines;
+ if (size > below_row - pum_row)
+ pum_height = below_row - pum_row;
+ else
+***************
+*** 823,828 ****
+--- 834,875 ----
+ }
+
+ /*
++ * Reposition the popup menu to adjust for window layout changes.
++ */
++ void
++ pum_may_redraw(void)
++ {
++ pumitem_T *array = pum_array;
++ int len = pum_size;
++ int selected = pum_selected;
++
++ if (!pum_visible())
++ return; // nothing to do
++
++ if (pum_win_row == curwin->w_wrow + W_WINROW(curwin)
++ && pum_win_height == curwin->w_height
++ && pum_win_col == curwin->w_wincol
++ && pum_win_width == curwin->w_width)
++ {
++ // window position didn't change, redraw in the same position
++ pum_redraw();
++ }
++ else
++ {
++ int wcol = curwin->w_wcol;
++
++ // Window layout changed, recompute the position.
++ // Use the remembered w_wcol value, the cursor may have moved when a
++ // completion was inserted, but we want the menu in the same position.
++ pum_undisplay();
++ curwin->w_wcol = pum_win_wcol;
++ curwin->w_valid |= VALID_WCOL;
++ pum_display(array, len, selected);
++ curwin->w_wcol = wcol;
++ }
++ }
++
++ /*
+ * Return the height of the popup menu, the number of entries visible.
+ * Only valid when pum_visible() returns TRUE!
+ */
+*** ../vim-8.1.0061/src/proto/popupmnu.pro 2018-05-17 13:52:48.000000000 +0200
+--- src/proto/popupmnu.pro 2018-06-17 14:12:56.177812770 +0200
+***************
+*** 4,9 ****
+--- 4,10 ----
+ void pum_undisplay(void);
+ void pum_clear(void);
+ int pum_visible(void);
++ void pum_may_redraw(void);
+ int pum_get_height(void);
+ int split_message(char_u *mesg, pumitem_T **array);
+ void ui_remove_balloon(void);
+*** ../vim-8.1.0061/src/screen.c 2018-06-16 16:20:48.768597967 +0200
+--- src/screen.c 2018-06-17 14:37:49.760753642 +0200
+***************
+*** 171,177 ****
+ static void win_redr_custom(win_T *wp, int draw_ruler);
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! static void win_redr_ruler(win_T *wp, int always);
+ #endif
+
+ /* Ugly global: overrule attribute used by screen_char() */
+--- 171,177 ----
+ static void win_redr_custom(win_T *wp, int draw_ruler);
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! static void win_redr_ruler(win_T *wp, int always, int ignore_pum);
+ #endif
+
+ /* Ugly global: overrule attribute used by screen_char() */
+***************
+*** 783,790 ****
+ #endif
+ #ifdef FEAT_INS_EXPAND
+ /* May need to redraw the popup menu. */
+! if (pum_visible())
+! pum_redraw();
+ #endif
+
+ /* Reset b_mod_set flags. Going through all windows is probably faster
+--- 783,789 ----
+ #endif
+ #ifdef FEAT_INS_EXPAND
+ /* May need to redraw the popup menu. */
+! pum_may_redraw();
+ #endif
+
+ /* Reset b_mod_set flags. Going through all windows is probably faster
+***************
+*** 7002,7008 ****
+ - 1 + wp->w_wincol), attr);
+
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(wp, TRUE);
+ #endif
+ }
+
+--- 7001,7007 ----
+ - 1 + wp->w_wincol), attr);
+
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(wp, TRUE, ignore_pum);
+ #endif
+ }
+
+***************
+*** 10455,10461 ****
+ /* If the last window has no status line, the ruler is after the mode
+ * message and must be redrawn */
+ if (redrawing() && lastwin->w_status_height == 0)
+! win_redr_ruler(lastwin, TRUE);
+ #endif
+ redraw_cmdline = FALSE;
+ clear_cmdline = FALSE;
+--- 10454,10460 ----
+ /* If the last window has no status line, the ruler is after the mode
+ * message and must be redrawn */
+ if (redrawing() && lastwin->w_status_height == 0)
+! win_redr_ruler(lastwin, TRUE, FALSE);
+ #endif
+ redraw_cmdline = FALSE;
+ clear_cmdline = FALSE;
+***************
+*** 10874,10879 ****
+--- 10873,10879 ----
+ (int)wp->w_width, FALSE);
+ }
+ #endif
++
+ /*
+ * Show current status info in ruler and various other places
+ * If always is FALSE, only show ruler if position has changed.
+***************
+*** 10899,10905 ****
+ else
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(curwin, always);
+ #endif
+
+ #ifdef FEAT_TITLE
+--- 10899,10905 ----
+ else
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(curwin, always, FALSE);
+ #endif
+
+ #ifdef FEAT_TITLE
+***************
+*** 10918,10924 ****
+
+ #ifdef FEAT_CMDL_INFO
+ static void
+! win_redr_ruler(win_T *wp, int always)
+ {
+ #define RULER_BUF_LEN 70
+ char_u buffer[RULER_BUF_LEN];
+--- 10918,10924 ----
+
+ #ifdef FEAT_CMDL_INFO
+ static void
+! win_redr_ruler(win_T *wp, int always, int ignore_pum)
+ {
+ #define RULER_BUF_LEN 70
+ char_u buffer[RULER_BUF_LEN];
+***************
+*** 10951,10958 ****
+ if (wp == lastwin && lastwin->w_status_height == 0)
+ if (edit_submode != NULL)
+ return;
+! /* Don't draw the ruler when the popup menu is visible, it may overlap. */
+! if (pum_visible())
+ return;
+ #endif
+
+--- 10951,10959 ----
+ if (wp == lastwin && lastwin->w_status_height == 0)
+ if (edit_submode != NULL)
+ return;
+! // Don't draw the ruler when the popup menu is visible, it may overlap.
+! // Except when the popup menu will be redrawn anyway.
+! if (!ignore_pum && pum_visible())
+ return;
+ #endif
+
+*** ../vim-8.1.0061/src/version.c 2018-06-16 22:58:11.791025515 +0200
+--- src/version.c 2018-06-17 14:39:53.964061772 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 62,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+58. You turn on your computer and turn off your wife.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0063 b/data/vim/patches/8.1.0063
new file mode 100644
index 000000000..b1018460a
--- /dev/null
+++ b/data/vim/patches/8.1.0063
@@ -0,0 +1,123 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0063
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0063
+Problem: Mac: NSStringPboardType is deprecated.
+Solution: Use NSPasteboardTypeString. (Akshay Hegde, closes #3022)
+Files: src/os_macosx.m
+
+
+*** ../vim-8.1.0062/src/os_macosx.m 2018-03-06 17:53:40.000000000 +0100
+--- src/os_macosx.m 2018-06-17 15:00:15.344692977 +0200
+***************
+*** 63,70 ****
+--- 63,75 ----
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
++ #ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
++ NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType,
++ NSPasteboardTypeString, nil];
++ #else
+ NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType,
+ NSStringPboardType, nil];
++ #endif
+ NSString *bestType = [pb availableTypeFromArray:supportedTypes];
+ if (!bestType) goto releasepool;
+
+***************
+*** 76,82 ****
+ /* This type should consist of an array with two objects:
+ * 1. motion type (NSNumber)
+ * 2. text (NSString)
+! * If this is not the case we fall back on using NSStringPboardType.
+ */
+ id plist = [pb propertyListForType:VimPboardType];
+ if ([plist isKindOfClass:[NSArray class]] && [plist count] == 2)
+--- 81,87 ----
+ /* This type should consist of an array with two objects:
+ * 1. motion type (NSNumber)
+ * 2. text (NSString)
+! * If this is not the case we fall back on using NSPasteboardTypeString.
+ */
+ id plist = [pb propertyListForType:VimPboardType];
+ if ([plist isKindOfClass:[NSArray class]] && [plist count] == 2)
+***************
+*** 92,101 ****
+
+ if (!string)
+ {
+! /* Use NSStringPboardType. The motion type is detected automatically.
+ */
+ NSMutableString *mstring =
+ [[pb stringForType:NSStringPboardType] mutableCopy];
+ if (!mstring) goto releasepool;
+
+ /* Replace unrecognized end-of-line sequences with \x0a (line feed). */
+--- 97,111 ----
+
+ if (!string)
+ {
+! /* Use NSPasteboardTypeString. The motion type is detected automatically.
+ */
++ #ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
++ NSMutableString *mstring =
++ [[pb stringForType:NSPasteboardTypeString] mutableCopy];
++ #else
+ NSMutableString *mstring =
+ [[pb stringForType:NSStringPboardType] mutableCopy];
++ #endif
+ if (!mstring) goto releasepool;
+
+ /* Replace unrecognized end-of-line sequences with \x0a (line feed). */
+***************
+*** 178,192 ****
+--- 188,211 ----
+
+ /* See clip_mch_request_selection() for info on pasteboard types. */
+ NSPasteboard *pb = [NSPasteboard generalPasteboard];
++ #ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
++ NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType,
++ NSPasteboardTypeString, nil];
++ #else
+ NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType,
+ NSStringPboardType, nil];
++ #endif
+ [pb declareTypes:supportedTypes owner:nil];
+
+ NSNumber *motion = [NSNumber numberWithInt:motion_type];
+ NSArray *plist = [NSArray arrayWithObjects:motion, string, nil];
+ [pb setPropertyList:plist forType:VimPboardType];
+
++ #ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
++ [pb setString:string forType:NSPasteboardTypeString];
++ #else
+ [pb setString:string forType:NSStringPboardType];
++ #endif
+
+ [string release];
+ }
+*** ../vim-8.1.0062/src/version.c 2018-06-17 14:47:50.657309005 +0200
+--- src/version.c 2018-06-17 15:00:06.472745233 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 63,
+ /**/
+
+--
+Q: Should I clean my house or work on Vim?
+A: Whatever contains more bugs.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0064 b/data/vim/patches/8.1.0064
new file mode 100644
index 000000000..66395247a
--- /dev/null
+++ b/data/vim/patches/8.1.0064
@@ -0,0 +1,100 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0064
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0064
+Problem: Typing CTRL-W in a prompt buffer shows mode "-- --".
+Solution: Set restart_edit to 'A' and check for it.
+Files: src/edit.c, src/window.c, src/screen.c
+
+
+*** ../vim-8.1.0063/src/edit.c 2018-06-16 15:32:34.460024472 +0200
+--- src/edit.c 2018-06-17 16:11:15.377294192 +0200
+***************
+*** 1179,1185 ****
+ // In a prompt window CTRL-W is used for window commands.
+ // Use Shift-CTRL-W to delete a word.
+ stuffcharReadbuff(Ctrl_W);
+! restart_edit = 'i';
+ nomove = TRUE;
+ count = 0;
+ goto doESCkey;
+--- 1179,1185 ----
+ // In a prompt window CTRL-W is used for window commands.
+ // Use Shift-CTRL-W to delete a word.
+ stuffcharReadbuff(Ctrl_W);
+! restart_edit = 'A';
+ nomove = TRUE;
+ count = 0;
+ goto doESCkey;
+*** ../vim-8.1.0063/src/window.c 2018-06-12 16:49:26.366028607 +0200
+--- src/window.c 2018-06-17 16:18:31.098815622 +0200
+***************
+*** 2114,2119 ****
+--- 2114,2121 ----
+ // When leaving a prompt window stop Insert mode and perhaps restart
+ // it when entering that window again.
+ win->w_buffer->b_prompt_insert = restart_edit;
++ if (restart_edit != 0 && mode_displayed)
++ clear_cmdline = TRUE; /* unshow mode later */
+ restart_edit = NUL;
+
+ // When leaving the window (or closing the window) was done from a
+*** ../vim-8.1.0063/src/screen.c 2018-06-17 14:47:50.657309005 +0200
+--- src/screen.c 2018-06-17 16:12:28.936871827 +0200
+***************
+*** 10263,10269 ****
+
+ do_mode = ((p_smd && msg_silent == 0)
+ && ((State & INSERT)
+! || restart_edit
+ || VIsual_active));
+ if (do_mode || reg_recording != 0)
+ {
+--- 10263,10269 ----
+
+ do_mode = ((p_smd && msg_silent == 0)
+ && ((State & INSERT)
+! || restart_edit != NUL
+ || VIsual_active));
+ if (do_mode || reg_recording != 0)
+ {
+***************
+*** 10370,10376 ****
+ #endif
+ MSG_PUTS_ATTR(_(" INSERT"), attr);
+ }
+! else if (restart_edit == 'I')
+ MSG_PUTS_ATTR(_(" (insert)"), attr);
+ else if (restart_edit == 'R')
+ MSG_PUTS_ATTR(_(" (replace)"), attr);
+--- 10370,10376 ----
+ #endif
+ MSG_PUTS_ATTR(_(" INSERT"), attr);
+ }
+! else if (restart_edit == 'I' || restart_edit == 'A')
+ MSG_PUTS_ATTR(_(" (insert)"), attr);
+ else if (restart_edit == 'R')
+ MSG_PUTS_ATTR(_(" (replace)"), attr);
+*** ../vim-8.1.0063/src/version.c 2018-06-17 15:01:00.580427088 +0200
+--- src/version.c 2018-06-17 16:23:00.305303242 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 64,
+ /**/
+
+--
+I'm trying to be an optimist, but I don't think it'll work.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0065 b/data/vim/patches/8.1.0065
new file mode 100644
index 000000000..042a3c4ec
--- /dev/null
+++ b/data/vim/patches/8.1.0065
@@ -0,0 +1,90 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0065
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0065 (after 8.1.0062)
+Problem: Balloon displayed at the wrong position.
+Solution: Do not reposition the popup menu at the cursor position.
+Files: src/popupmnu.c
+
+
+*** ../vim-8.1.0064/src/popupmnu.c 2018-06-17 14:47:50.649309059 +0200
+--- src/popupmnu.c 2018-06-17 17:06:35.634554918 +0200
+***************
+*** 29,34 ****
+--- 29,35 ----
+ static int pum_row; /* top row of pum */
+ static int pum_col; /* left column of pum */
+
++ static win_T *pum_window = NULL;
+ static int pum_win_row;
+ static int pum_win_height;
+ static int pum_win_col;
+***************
+*** 110,115 ****
+--- 111,117 ----
+
+ // Remember the essential parts of the window position and size, so we
+ // can decide when to reposition the popup menu.
++ pum_window = curwin;
+ pum_win_row = curwin->w_wrow + W_WINROW(curwin);
+ pum_win_height = curwin->w_height;
+ pum_win_col = curwin->w_wincol;
+***************
+*** 846,855 ****
+ if (!pum_visible())
+ return; // nothing to do
+
+! if (pum_win_row == curwin->w_wrow + W_WINROW(curwin)
+! && pum_win_height == curwin->w_height
+! && pum_win_col == curwin->w_wincol
+! && pum_win_width == curwin->w_width)
+ {
+ // window position didn't change, redraw in the same position
+ pum_redraw();
+--- 848,858 ----
+ if (!pum_visible())
+ return; // nothing to do
+
+! if (pum_window != curwin
+! || (pum_win_row == curwin->w_wrow + W_WINROW(curwin)
+! && pum_win_height == curwin->w_height
+! && pum_win_col == curwin->w_wincol
+! && pum_win_width == curwin->w_width))
+ {
+ // window position didn't change, redraw in the same position
+ pum_redraw();
+***************
+*** 912,917 ****
+--- 915,923 ----
+ pum_width = Columns - pum_col;
+ if (pum_width > pum_base_width + 1)
+ pum_width = pum_base_width + 1;
++
++ // Do not redraw at cursor position.
++ pum_window = NULL;
+ }
+
+ # endif
+*** ../vim-8.1.0064/src/version.c 2018-06-17 16:23:29.341140642 +0200
+--- src/version.c 2018-06-17 17:09:52.429048636 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 65,
+ /**/
+
+--
+Time is money. Especially if you make clocks.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0066 b/data/vim/patches/8.1.0066
new file mode 100644
index 000000000..7b1a2dff1
--- /dev/null
+++ b/data/vim/patches/8.1.0066
@@ -0,0 +1,129 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0066
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0066
+Problem: Nasty autocommand causes using freed memory. (Dominique Pelle)
+Solution: Do not force executing autocommands if the value of 'syntax' or
+ 'filetype' did not change.
+Files: src/option.c
+
+
+*** ../vim-8.1.0065/src/option.c 2018-06-16 22:58:11.791025515 +0200
+--- src/option.c 2018-06-17 17:30:01.421260379 +0200
+***************
+*** 6029,6035 ****
+ /* set when changing an option that only requires a redraw in the GUI */
+ int redraw_gui_only = FALSE;
+ #endif
+! int ft_changed = FALSE;
+ #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
+ int did_swaptcap = FALSE;
+ #endif
+--- 6029,6035 ----
+ /* set when changing an option that only requires a redraw in the GUI */
+ int redraw_gui_only = FALSE;
+ #endif
+! int value_changed = FALSE;
+ #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
+ int did_swaptcap = FALSE;
+ #endif
+***************
+*** 7437,7443 ****
+ if (!valid_filetype(*varp))
+ errmsg = e_invarg;
+ else
+! ft_changed = STRCMP(oldval, *varp) != 0;
+ }
+
+ #ifdef FEAT_SYN_HL
+--- 7437,7443 ----
+ if (!valid_filetype(*varp))
+ errmsg = e_invarg;
+ else
+! value_changed = STRCMP(oldval, *varp) != 0;
+ }
+
+ #ifdef FEAT_SYN_HL
+***************
+*** 7445,7450 ****
+--- 7445,7452 ----
+ {
+ if (!valid_filetype(*varp))
+ errmsg = e_invarg;
++ else
++ value_changed = STRCMP(oldval, *varp) != 0;
+ }
+ #endif
+
+***************
+*** 7565,7584 ****
+ /* When 'syntax' is set, load the syntax of that name */
+ if (varp == &(curbuf->b_p_syn))
+ {
+ apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
+! curbuf->b_fname, TRUE, curbuf);
+ }
+ #endif
+ else if (varp == &(curbuf->b_p_ft))
+ {
+ /* 'filetype' is set, trigger the FileType autocommand.
+ * Skip this when called from a modeline and the filetype was
+! * already set to this value. */
+! if (!(opt_flags & OPT_MODELINE) || ft_changed)
+ {
+ did_filetype = TRUE;
+ apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft,
+! curbuf->b_fname, TRUE, curbuf);
+ /* Just in case the old "curbuf" is now invalid. */
+ if (varp != &(curbuf->b_p_ft))
+ varp = NULL;
+--- 7567,7590 ----
+ /* When 'syntax' is set, load the syntax of that name */
+ if (varp == &(curbuf->b_p_syn))
+ {
++ // Only pass TRUE for "force" when the value changed, to avoid
++ // endless recurrence. */
+ apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
+! curbuf->b_fname, value_changed, curbuf);
+ }
+ #endif
+ else if (varp == &(curbuf->b_p_ft))
+ {
+ /* 'filetype' is set, trigger the FileType autocommand.
+ * Skip this when called from a modeline and the filetype was
+! * already set to this value.
+! * Only pass TRUE for "force" when the value changed, to avoid
+! * endless recurrence. */
+! if (!(opt_flags & OPT_MODELINE) || value_changed)
+ {
+ did_filetype = TRUE;
+ apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft,
+! curbuf->b_fname, value_changed, curbuf);
+ /* Just in case the old "curbuf" is now invalid. */
+ if (varp != &(curbuf->b_p_ft))
+ varp = NULL;
+*** ../vim-8.1.0065/src/version.c 2018-06-17 17:10:55.636590392 +0200
+--- src/version.c 2018-06-17 17:32:02.240534510 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 66,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+61. Your best friends know your e-mail address, but neither your phone number
+ nor the address where you live.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0067 b/data/vim/patches/8.1.0067
new file mode 100644
index 000000000..3a183214a
--- /dev/null
+++ b/data/vim/patches/8.1.0067
@@ -0,0 +1,95 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0067
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0067
+Problem: Syntax highlighting not working when re-entering a buffer.
+Solution: Do force executing autocommands when not called recursively.
+Files: src/option.c
+
+
+*** ../vim-8.1.0066/src/option.c 2018-06-17 17:32:55.088218019 +0200
+--- src/option.c 2018-06-17 19:01:55.382567829 +0200
+***************
+*** 7567,7590 ****
+ /* When 'syntax' is set, load the syntax of that name */
+ if (varp == &(curbuf->b_p_syn))
+ {
+! // Only pass TRUE for "force" when the value changed, to avoid
+! // endless recurrence. */
+! apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
+! curbuf->b_fname, value_changed, curbuf);
+ }
+ #endif
+ else if (varp == &(curbuf->b_p_ft))
+ {
+ /* 'filetype' is set, trigger the FileType autocommand.
+ * Skip this when called from a modeline and the filetype was
+! * already set to this value.
+! * Only pass TRUE for "force" when the value changed, to avoid
+! * endless recurrence. */
+ if (!(opt_flags & OPT_MODELINE) || value_changed)
+ {
+ did_filetype = TRUE;
+! apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft,
+! curbuf->b_fname, value_changed, curbuf);
+ /* Just in case the old "curbuf" is now invalid. */
+ if (varp != &(curbuf->b_p_ft))
+ varp = NULL;
+--- 7567,7598 ----
+ /* When 'syntax' is set, load the syntax of that name */
+ if (varp == &(curbuf->b_p_syn))
+ {
+! static int syn_recursive = 0;
+!
+! ++syn_recursive;
+! // Only pass TRUE for "force" when the value changed or not used
+! // recursively, to avoid endless recurrence.
+! apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn, curbuf->b_fname,
+! value_changed || syn_recursive == 1, curbuf);
+! --syn_recursive;
+ }
+ #endif
+ else if (varp == &(curbuf->b_p_ft))
+ {
+ /* 'filetype' is set, trigger the FileType autocommand.
+ * Skip this when called from a modeline and the filetype was
+! * already set to this value. */
+ if (!(opt_flags & OPT_MODELINE) || value_changed)
+ {
++ static int ft_recursive = 0;
++
++ ++ft_recursive;
+ did_filetype = TRUE;
+! // Only pass TRUE for "force" when the value changed or not
+! // used recursively, to avoid endless recurrence.
+! apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname,
+! value_changed || ft_recursive == 1, curbuf);
+! --ft_recursive;
+ /* Just in case the old "curbuf" is now invalid. */
+ if (varp != &(curbuf->b_p_ft))
+ varp = NULL;
+*** ../vim-8.1.0066/src/version.c 2018-06-17 17:32:55.088218019 +0200
+--- src/version.c 2018-06-17 19:07:00.000819142 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 67,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+62. If your doorbell rings, you think that new mail has arrived. And then
+ you're disappointed that it's only someone at the door.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0068 b/data/vim/patches/8.1.0068
new file mode 100644
index 000000000..21c51359d
--- /dev/null
+++ b/data/vim/patches/8.1.0068
@@ -0,0 +1,80 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0068
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0068
+Problem: Nasty autocommands can still cause using freed memory.
+Solution: Disallow using setloclist() and setqflist() recursively.
+Files: src/evalfunc.c
+
+
+*** ../vim-8.1.0067/src/evalfunc.c 2018-06-12 20:25:47.887923393 +0200
+--- src/evalfunc.c 2018-06-17 19:16:21.949606435 +0200
+***************
+*** 10621,10626 ****
+--- 10652,10658 ----
+ static char *e_invact = N_("E927: Invalid action: '%s'");
+ char_u *act;
+ int action = 0;
++ static int recursive = 0;
+ #endif
+
+ rettv->vval.v_number = -1;
+***************
+*** 10628,10633 ****
+--- 10660,10667 ----
+ #ifdef FEAT_QUICKFIX
+ if (list_arg->v_type != VAR_LIST)
+ EMSG(_(e_listreq));
++ else if (recursive != 0)
++ EMSG(_(e_au_recursive));
+ else
+ {
+ list_T *l = list_arg->vval.v_list;
+***************
+*** 10662,10670 ****
+ }
+ }
+
+ if (l != NULL && action && valid_dict && set_errorlist(wp, l, action,
+! (char_u *)(wp == NULL ? ":setqflist()" : ":setloclist()"), d) == OK)
+ rettv->vval.v_number = 0;
+ }
+ #endif
+ }
+--- 10696,10707 ----
+ }
+ }
+
++ ++recursive;
+ if (l != NULL && action && valid_dict && set_errorlist(wp, l, action,
+! (char_u *)(wp == NULL ? ":setqflist()" : ":setloclist()"),
+! d) == OK)
+ rettv->vval.v_number = 0;
++ --recursive;
+ }
+ #endif
+ }
+*** ../vim-8.1.0067/src/version.c 2018-06-17 19:08:26.476323920 +0200
+--- src/version.c 2018-06-17 19:17:27.305233384 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 68,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+63. You start using smileys in your snail mail.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0069 b/data/vim/patches/8.1.0069
new file mode 100644
index 000000000..f3f67bdc7
--- /dev/null
+++ b/data/vim/patches/8.1.0069
@@ -0,0 +1,301 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0069
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0069
+Problem: Cannot handle pressing CTRL-C in a prompt buffer.
+Solution: Add prompt_setinterrupt().
+Files: runtime/doc/eval.txt, src/edit.c, src/evalfunc.c, src/channel.c,
+ src/proto/channel.pro
+
+
+*** ../vim-8.1.0068/runtime/doc/eval.txt 2018-06-07 18:17:42.274227515 +0200
+--- runtime/doc/eval.txt 2018-06-17 18:12:12.760548966 +0200
+***************
+*** 2297,2304 ****
+ prevnonblank({lnum}) Number line nr of non-blank line <= {lnum}
+ printf({fmt}, {expr1}...) String format text
+ prompt_addtext({buf}, {expr}) none add text to a prompt buffer
+- prompt_setprompt({buf}, {text}) none set prompt text
+ prompt_setcallback({buf}, {expr}) none set prompt callback function
+ pumvisible() Number whether popup menu is visible
+ pyeval({expr}) any evaluate |Python| expression
+ py3eval({expr}) any evaluate |python3| expression
+--- 2297,2305 ----
+ prevnonblank({lnum}) Number line nr of non-blank line <= {lnum}
+ printf({fmt}, {expr1}...) String format text
+ prompt_addtext({buf}, {expr}) none add text to a prompt buffer
+ prompt_setcallback({buf}, {expr}) none set prompt callback function
++ prompt_setinterrupt({buf}, {text}) none set prompt interrupt function
++ prompt_setprompt({buf}, {text}) none set prompt text
+ pumvisible() Number whether popup menu is visible
+ pyeval({expr}) any evaluate |Python| expression
+ py3eval({expr}) any evaluate |python3| expression
+***************
+*** 6506,6522 ****
+ arguments an error is given. Up to 18 arguments can be used.
+
+
+- prompt_setprompt({buf}, {text}) *prompt_setprompt()*
+- Set prompt for buffer {buf} to {text}. You most likely want
+- {text} to end in a space.
+- The result is only visible if {buf} has 'buftype' set to
+- "prompt". Example: >
+- call prompt_setprompt(bufnr(''), 'command: ')
+-
+-
+ prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
+! Set prompt callback for buffer {buf} to {expr}. This has only
+ effect if {buf} has 'buftype' set to "prompt".
+ The callback is invoked when pressing Enter. The current
+ buffer will always be the prompt buffer. A new line for a
+ prompt is added before invoking the callback, thus the prompt
+--- 6507,6517 ----
+ arguments an error is given. Up to 18 arguments can be used.
+
+
+ prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
+! Set prompt callback for buffer {buf} to {expr}. When {expr}
+! is an empty string the callback is removed. This has only
+ effect if {buf} has 'buftype' set to "prompt".
++
+ The callback is invoked when pressing Enter. The current
+ buffer will always be the prompt buffer. A new line for a
+ prompt is added before invoking the callback, thus the prompt
+***************
+*** 6541,6546 ****
+--- 6536,6557 ----
+ endif
+ endfunc
+
++ prompt_setinterrupt({buf}, {expr}) *prompt_setinterrupt()*
++ Set a callback for buffer {buf} to {expr}. When {expr} is an
++ empty string the callback is removed. This has only effect if
++ {buf} has 'buftype' set to "prompt".
++
++ This callback will be invoked when pressing CTRL-C in Insert
++ mode. Without setting a callback Vim will exit Insert mode,
++ as in any buffer.
++
++ prompt_setprompt({buf}, {text}) *prompt_setprompt()*
++ Set prompt for buffer {buf} to {text}. You most likely want
++ {text} to end in a space.
++ The result is only visible if {buf} has 'buftype' set to
++ "prompt". Example: >
++ call prompt_setprompt(bufnr(''), 'command: ')
++
+
+ pumvisible() *pumvisible()*
+ Returns non-zero when the popup menu is visible, zero
+***************
+*** 8563,8569 ****
+ instead of using 'termwinsize'
+ "term_cols" horizontal size to use for the terminal,
+ instead of using 'termwinsize'
+! "vertical" split the window vertically
+ "curwin" use the current window, do not split the
+ window; fails if the current buffer
+ cannot be |abandon|ed
+--- 8574,8582 ----
+ instead of using 'termwinsize'
+ "term_cols" horizontal size to use for the terminal,
+ instead of using 'termwinsize'
+! "vertical" split the window vertically; note that
+! other window position can be defined with
+! command modifiers, such as |:belowright|.
+ "curwin" use the current window, do not split the
+ window; fails if the current buffer
+ cannot be |abandon|ed
+***************
+*** 9392,9402 ****
+ out if it works in the current console).
+ wildignore Compiled with 'wildignore' option.
+ wildmenu Compiled with 'wildmenu' option.
+ win32 Win32 version of Vim (MS-Windows 95 and later, 32 or
+ 64 bits)
+ win32unix Win32 version of Vim, using Unix files (Cygwin)
+ win64 Win64 version of Vim (MS-Windows 64 bit).
+! win95 Win32 version for MS-Windows 95/98/ME.
+ winaltkeys Compiled with 'winaltkeys' option.
+ windows Compiled with support for more than one window.
+ writebackup Compiled with 'writebackup' default on.
+--- 9405,9416 ----
+ out if it works in the current console).
+ wildignore Compiled with 'wildignore' option.
+ wildmenu Compiled with 'wildmenu' option.
++ win16 old version for MS-Windows 3.1 (always False)
+ win32 Win32 version of Vim (MS-Windows 95 and later, 32 or
+ 64 bits)
+ win32unix Win32 version of Vim, using Unix files (Cygwin)
+ win64 Win64 version of Vim (MS-Windows 64 bit).
+! win95 Win32 version for MS-Windows 95/98/ME (always False)
+ winaltkeys Compiled with 'winaltkeys' option.
+ windows Compiled with support for more than one window.
+ writebackup Compiled with 'writebackup' default on.
+*** ../vim-8.1.0068/src/edit.c 2018-06-17 16:23:29.337140663 +0200
+--- src/edit.c 2018-06-17 19:32:54.656479224 +0200
+***************
+*** 1016,1021 ****
+--- 1016,1034 ----
+ goto doESCkey;
+ }
+ #endif
++ #ifdef FEAT_JOB_CHANNEL
++ if (c == Ctrl_C && bt_prompt(curbuf))
++ {
++ if (invoke_prompt_interrupt())
++ {
++ if (!bt_prompt(curbuf))
++ // buffer changed to a non-prompt buffer, get out of
++ // Insert mode
++ goto doESCkey;
++ break;
++ }
++ }
++ #endif
+
+ #ifdef UNIX
+ do_intr:
+*** ../vim-8.1.0068/src/evalfunc.c 2018-06-17 19:22:48.343603795 +0200
+--- src/evalfunc.c 2018-06-17 19:16:21.949606435 +0200
+***************
+*** 298,303 ****
+--- 298,304 ----
+ static void f_printf(typval_T *argvars, typval_T *rettv);
+ #ifdef FEAT_JOB_CHANNEL
+ static void f_prompt_setcallback(typval_T *argvars, typval_T *rettv);
++ static void f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv);
+ static void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
+ #endif
+ static void f_pumvisible(typval_T *argvars, typval_T *rettv);
+***************
+*** 754,759 ****
+--- 755,761 ----
+ {"printf", 1, 19, f_printf},
+ #ifdef FEAT_JOB_CHANNEL
+ {"prompt_setcallback", 2, 2, f_prompt_setcallback},
++ {"prompt_setinterrupt", 2, 2, f_prompt_setinterrupt},
+ {"prompt_setprompt", 2, 2, f_prompt_setprompt},
+ #endif
+ {"pumvisible", 0, 0, f_pumvisible},
+***************
+*** 8622,8627 ****
+--- 8624,8658 ----
+ }
+
+ /*
++ * "prompt_setinterrupt({buffer}, {callback})" function
++ */
++ static void
++ f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED)
++ {
++ buf_T *buf;
++ char_u *callback;
++ partial_T *partial;
++
++ if (check_secure())
++ return;
++ buf = get_buf_tv(&argvars[0], FALSE);
++ if (buf == NULL)
++ return;
++
++ callback = get_callback(&argvars[1], &partial);
++ if (callback == NULL)
++ return;
++
++ free_callback(buf->b_prompt_interrupt, buf->b_prompt_int_partial);
++ if (partial == NULL)
++ buf->b_prompt_interrupt = vim_strsave(callback);
++ else
++ /* pointer into the partial */
++ buf->b_prompt_interrupt = callback;
++ buf->b_prompt_int_partial = partial;
++ }
++
++ /*
+ * "prompt_setprompt({buffer}, {text})" function
+ */
+ static void
+*** ../vim-8.1.0068/src/channel.c 2018-06-12 20:25:47.883923416 +0200
+--- src/channel.c 2018-06-17 19:33:49.264186387 +0200
+***************
+*** 5856,5862 ****
+ curwin->w_cursor.lnum = lnum + 1;
+ curwin->w_cursor.col = 0;
+
+! if (curbuf->b_prompt_callback == NULL)
+ return;
+ text = ml_get(lnum);
+ prompt = prompt_text();
+--- 5856,5862 ----
+ curwin->w_cursor.lnum = lnum + 1;
+ curwin->w_cursor.col = 0;
+
+! if (curbuf->b_prompt_callback == NULL || *curbuf->b_prompt_callback == NUL)
+ return;
+ text = ml_get(lnum);
+ prompt = prompt_text();
+***************
+*** 5874,5877 ****
+--- 5874,5901 ----
+ clear_tv(&rettv);
+ }
+
++ /*
++ * Return TRUE when the interrupt callback was invoked.
++ */
++ int
++ invoke_prompt_interrupt(void)
++ {
++ typval_T rettv;
++ int dummy;
++ typval_T argv[1];
++
++ if (curbuf->b_prompt_interrupt == NULL
++ || *curbuf->b_prompt_interrupt == NUL)
++ return FALSE;
++ argv[0].v_type = VAR_UNKNOWN;
++
++ got_int = FALSE; // don't skip executing commands
++ call_func(curbuf->b_prompt_interrupt,
++ (int)STRLEN(curbuf->b_prompt_interrupt),
++ &rettv, 0, argv, NULL, 0L, 0L, &dummy, TRUE,
++ curbuf->b_prompt_int_partial, NULL);
++ clear_tv(&rettv);
++ return TRUE;
++ }
++
+ #endif /* FEAT_JOB_CHANNEL */
+*** ../vim-8.1.0068/src/proto/channel.pro 2018-06-12 20:25:47.883923416 +0200
+--- src/proto/channel.pro 2018-06-17 19:34:32.267954974 +0200
+***************
+*** 72,75 ****
+--- 72,76 ----
+ void job_info_all(list_T *l);
+ int job_stop(job_T *job, typval_T *argvars, char *type);
+ void invoke_prompt_callback(void);
++ int invoke_prompt_interrupt(void);
+ /* vim: set ft=c : */
+*** ../vim-8.1.0068/src/version.c 2018-06-17 19:22:48.343603795 +0200
+--- src/version.c 2018-06-17 19:34:40.111912692 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 69,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+64. The remote to the T.V. is missing...and you don't even care.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0070 b/data/vim/patches/8.1.0070
new file mode 100644
index 000000000..25766d0ec
--- /dev/null
+++ b/data/vim/patches/8.1.0070
@@ -0,0 +1,48 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0070
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0070
+Problem: Missing part of the changes for prompt_setinterrupt().
+Solution: Add the missing changes.
+Files: src/structs.h
+
+
+*** ../vim-8.1.0069/src/structs.h 2018-06-06 09:11:07.257357317 +0200
+--- src/structs.h 2018-06-17 18:27:08.038723480 +0200
+***************
+*** 2360,2365 ****
+--- 2360,2367 ----
+ char_u *b_prompt_text; // set by prompt_setprompt()
+ char_u *b_prompt_callback; // set by prompt_setcallback()
+ partial_T *b_prompt_partial; // set by prompt_setcallback()
++ char_u *b_prompt_interrupt; // set by prompt_setinterrupt()
++ partial_T *b_prompt_int_partial; // set by prompt_setinterrupt()
+ int b_prompt_insert; // value for restart_edit when entering
+ // a prompt buffer window.
+ #endif
+*** ../vim-8.1.0069/src/version.c 2018-06-17 19:36:30.215317108 +0200
+--- src/version.c 2018-06-17 20:10:13.756190264 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 70,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+65. The last time you looked at the clock it was 11:30pm, and in what
+ seems like only a few seconds later, your sister runs past you to
+ catch her 7am school bus.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0071 b/data/vim/patches/8.1.0071
new file mode 100644
index 000000000..e3a8640fb
--- /dev/null
+++ b/data/vim/patches/8.1.0071
@@ -0,0 +1,792 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0071
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0071
+Problem: Terminal debugger only works with the terminal feature.
+Solution: Make it also work with a prompt buffer. Makes it possible to use
+ on MS-Windows. Various other improvements. (closes #3012)
+Files: runtime/doc/terminal.txt,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0070/runtime/doc/terminal.txt 2018-06-12 18:04:28.034267877 +0200
+--- runtime/doc/terminal.txt 2018-06-17 21:33:43.206011529 +0200
+***************
+*** 38,43 ****
+--- 38,44 ----
+ Stepping through code |termdebug-stepping|
+ Inspecting variables |termdebug-variables|
+ Other commands |termdebug-commands|
++ Prompt mode |termdebug-prompt|
+ Communication |termdebug-communication|
+ Customizing |termdebug-customizing|
+
+***************
+*** 620,625 ****
+--- 621,630 ----
+ the source code in a Vim window. Since this is completely contained inside
+ Vim this also works remotely over an ssh connection.
+
++ When the |+terminal| feature is missing, the plugin will use the "prompt"
++ buffer type, if possible. The running program will then use a newly opened
++ terminal window. See |termdebug-prompt| below for details.
++
+
+ Starting ~
+ *termdebug-starting*
+***************
+*** 799,804 ****
+--- 804,826 ----
+ isn't one
+
+
++ Prompt mode ~
++ *termdebug-prompt*
++ When the |+terminal| feature is not supported and on MS-Windows, gdb will run
++ in a buffer with 'buftype' set to "prompt". This works slightly differently:
++ - The gdb window will be in Insert mode while typing commands. Go to Normal
++ mode with <Esc>, then you can move around in the buffer, copy/paste, etc.
++ Go back to editing the gdb command with any command that starts Insert mode,
++ such as `a` or `i`.
++ - The program being debugged will run in a separate window. On MS-Windows
++ this is a new console window. On Unix, if the |+terminal| feature is
++ available a Terminal window will be opened to run the debugged program in.
++
++ *termdebug_use_prompt*
++ Prompt mode can be used even when the |+terminal| feature is present with: >
++ let g:termdebug_use_prompt = 1
++
++
+ Communication ~
+ *termdebug-communication*
+ There is another, hidden, buffer, which is used for Vim to communicate with
+***************
+*** 836,841 ****
+--- 858,871 ----
+ hi debugBreakpoint term=reverse ctermbg=red guibg=red
+
+
++ Shorcuts *termdebug_shortcuts*
++
++ You can define your own shortcuts (mappings) to control gdb, that can work in
++ any window, using the TermDebugSendCommand() function. Example: >
++ map ,w :call TermDebugSendCommand('where')<CR>
++ The argument is the gdb command.
++
++
+ Popup menu *termdebug_popup*
+
+ By default the Termdebug plugin sets 'mousemodel' to "popup_setpos" and adds
+*** ../vim-8.1.0070/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-04-16 16:16:51.000000000 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-17 21:27:00.040243063 +0200
+***************
+*** 1,27 ****
+ " Debugger plugin using gdb.
+ "
+! " WORK IN PROGRESS - much doesn't work yet
+ "
+! " Open two visible terminal windows:
+! " 1. run a pty, as with ":term NONE"
+! " 2. run gdb, passing the pty
+! " The current window is used to view source code and follows gdb.
+ "
+ " A third terminal window is hidden, it is used for communication with gdb.
+ "
+ " The communication with gdb uses GDB/MI. See:
+ " https://sourceware.org/gdb/current/onlinedocs/gdb/GDB_002fMI.html
+- "
+- " Author: Bram Moolenaar
+- " Copyright: Vim license applies, see ":help license"
+
+! " In case this gets loaded twice.
+ if exists(':Termdebug')
+ finish
+ endif
+
+! " Uncomment this line to write logging in "debuglog".
+! " call ch_logfile('debuglog', 'w')
+
+ " The command that starts debugging, e.g. ":Termdebug vim".
+ " To end type "quit" in the gdb window.
+--- 1,60 ----
+ " Debugger plugin using gdb.
+ "
+! " Author: Bram Moolenaar
+! " Copyright: Vim license applies, see ":help license"
+! " Last Update: 2018 Jun 3
+! "
+! " WORK IN PROGRESS - Only the basics work
+! " Note: On MS-Windows you need a recent version of gdb. The one included with
+! " MingW is too old (7.6.1).
+! " I used version 7.12 from http://www.equation.com/servlet/equation.cmd?fa=gdb
+! "
+! " There are two ways to run gdb:
+! " - In a terminal window; used if possible, does not work on MS-Windows
+! " Not used when g:termdebug_use_prompt is set to 1.
+! " - Using a "prompt" buffer; may use a terminal window for the program
+ "
+! " For both the current window is used to view source code and shows the
+! " current statement from gdb.
+ "
++ " USING A TERMINAL WINDOW
++ "
++ " Opens two visible terminal windows:
++ " 1. runs a pty for the debugged program, as with ":term NONE"
++ " 2. runs gdb, passing the pty of the debugged program
+ " A third terminal window is hidden, it is used for communication with gdb.
+ "
++ " USING A PROMPT BUFFER
++ "
++ " Opens a window with a prompt buffer to communicate with gdb.
++ " Gdb is run as a job with callbacks for I/O.
++ " On Unix another terminal window is opened to run the debugged program
++ " On MS-Windows a separate console is opened to run the debugged program
++ "
+ " The communication with gdb uses GDB/MI. See:
+ " https://sourceware.org/gdb/current/onlinedocs/gdb/GDB_002fMI.html
+
+! " In case this gets sourced twice.
+ if exists(':Termdebug')
+ finish
+ endif
+
+! " Need either the +terminal feature or +channel and the prompt buffer.
+! " The terminal feature does not work with gdb on win32.
+! if has('terminal') && !has('win32')
+! let s:way = 'terminal'
+! elseif has('channel') && exists('*prompt_setprompt')
+! let s:way = 'prompt'
+! else
+! if has('terminal')
+! let s:err = 'Cannot debug, missing prompt buffer support'
+! else
+! let s:err = 'Cannot debug, +channel feature is not supported'
+! endif
+! command -nargs=* -complete=file -bang Termdebug echoerr s:err
+! command -nargs=+ -complete=file -bang TermdebugCommand echoerr s:err
+! finish
+! endif
+
+ " The command that starts debugging, e.g. ":Termdebug vim".
+ " To end type "quit" in the gdb window.
+***************
+*** 59,66 ****
+ echoerr 'Terminal debugger already running'
+ return
+ endif
+
+! let s:startwin = win_getid(winnr())
+ let s:startsigncolumn = &signcolumn
+
+ let s:save_columns = 0
+--- 92,103 ----
+ echoerr 'Terminal debugger already running'
+ return
+ endif
++ let s:ptywin = 0
+
+! " Uncomment this line to write logging in "debuglog".
+! " call ch_logfile('debuglog', 'w')
+!
+! let s:sourcewin = win_getid(winnr())
+ let s:startsigncolumn = &signcolumn
+
+ let s:save_columns = 0
+***************
+*** 69,83 ****
+ let s:save_columns = &columns
+ let &columns = g:termdebug_wide
+ endif
+! let vertical = 1
+ else
+! let vertical = 0
+ endif
+
+! " Open a terminal window without a job, to run the debugged program
+ let s:ptybuf = term_start('NONE', {
+! \ 'term_name': 'gdb program',
+! \ 'vertical': vertical,
+ \ })
+ if s:ptybuf == 0
+ echoerr 'Failed to open the program terminal window'
+--- 106,136 ----
+ let s:save_columns = &columns
+ let &columns = g:termdebug_wide
+ endif
+! let s:vertical = 1
+! else
+! let s:vertical = 0
+! endif
+!
+! " Override using a terminal window by setting g:termdebug_use_prompt to 1.
+! let use_prompt = exists('g:termdebug_use_prompt') && g:termdebug_use_prompt
+! if has('terminal') && !has('win32') && !use_prompt
+! let s:way = 'terminal'
+ else
+! let s:way = 'prompt'
+ endif
+
+! if s:way == 'prompt'
+! call s:StartDebug_prompt(a:dict)
+! else
+! call s:StartDebug_term(a:dict)
+! endif
+! endfunc
+!
+! func s:StartDebug_term(dict)
+! " Open a terminal window without a job, to run the debugged program in.
+ let s:ptybuf = term_start('NONE', {
+! \ 'term_name': 'debugged program',
+! \ 'vertical': s:vertical,
+ \ })
+ if s:ptybuf == 0
+ echoerr 'Failed to open the program terminal window'
+***************
+*** 85,91 ****
+ endif
+ let pty = job_info(term_getjob(s:ptybuf))['tty_out']
+ let s:ptywin = win_getid(winnr())
+! if vertical
+ " Assuming the source code window will get a signcolumn, use two more
+ " columns for that, thus one less for the terminal window.
+ exe (&columns / 2 - 1) . "wincmd |"
+--- 138,144 ----
+ endif
+ let pty = job_info(term_getjob(s:ptybuf))['tty_out']
+ let s:ptywin = win_getid(winnr())
+! if s:vertical
+ " Assuming the source code window will get a signcolumn, use two more
+ " columns for that, thus one less for the terminal window.
+ exe (&columns / 2 - 1) . "wincmd |"
+***************
+*** 110,118 ****
+ let proc_args = get(a:dict, 'proc_args', [])
+
+ let cmd = [g:termdebugger, '-quiet', '-tty', pty] + gdb_args
+! echomsg 'executing "' . join(cmd) . '"'
+ let s:gdbbuf = term_start(cmd, {
+! \ 'exit_cb': function('s:EndDebug'),
+ \ 'term_finish': 'close',
+ \ })
+ if s:gdbbuf == 0
+--- 163,171 ----
+ let proc_args = get(a:dict, 'proc_args', [])
+
+ let cmd = [g:termdebugger, '-quiet', '-tty', pty] + gdb_args
+! call ch_log('executing "' . join(cmd) . '"')
+ let s:gdbbuf = term_start(cmd, {
+! \ 'exit_cb': function('s:EndTermDebug'),
+ \ 'term_finish': 'close',
+ \ })
+ if s:gdbbuf == 0
+***************
+*** 166,176 ****
+ " exec-interrupt, since many commands don't work properly while the target is
+ " running.
+ call s:SendCommand('-gdb-set mi-async on')
+
+ " Disable pagination, it causes everything to stop at the gdb
+ " "Type <return> to continue" prompt.
+! call s:SendCommand('-gdb-set pagination off')
+
+ " Sign used to highlight the line where the program has stopped.
+ " There can be only one.
+ sign define debugPC linehl=debugPC
+--- 219,326 ----
+ " exec-interrupt, since many commands don't work properly while the target is
+ " running.
+ call s:SendCommand('-gdb-set mi-async on')
++ " Older gdb uses a different command.
++ call s:SendCommand('-gdb-set target-async on')
+
+ " Disable pagination, it causes everything to stop at the gdb
+ " "Type <return> to continue" prompt.
+! call s:SendCommand('set pagination off')
+!
+! call s:StartDebugCommon(a:dict)
+! endfunc
+!
+! func s:StartDebug_prompt(dict)
+! " Open a window with a prompt buffer to run gdb in.
+! if s:vertical
+! vertical new
+! else
+! new
+! endif
+! let s:gdbwin = win_getid(winnr())
+! let s:promptbuf = bufnr('')
+! call prompt_setprompt(s:promptbuf, 'gdb> ')
+! set buftype=prompt
+! file gdb
+! call prompt_setcallback(s:promptbuf, function('s:PromptCallback'))
+! call prompt_setinterrupt(s:promptbuf, function('s:PromptInterrupt'))
+
++ if s:vertical
++ " Assuming the source code window will get a signcolumn, use two more
++ " columns for that, thus one less for the terminal window.
++ exe (&columns / 2 - 1) . "wincmd |"
++ endif
++
++ " Add -quiet to avoid the intro message causing a hit-enter prompt.
++ let gdb_args = get(a:dict, 'gdb_args', [])
++ let proc_args = get(a:dict, 'proc_args', [])
++
++ let cmd = [g:termdebugger, '-quiet', '--interpreter=mi2'] + gdb_args
++ call ch_log('executing "' . join(cmd) . '"')
++
++ let s:gdbjob = job_start(cmd, {
++ \ 'exit_cb': function('s:EndPromptDebug'),
++ \ 'out_cb': function('s:GdbOutCallback'),
++ \ })
++ if job_status(s:gdbjob) != "run"
++ echoerr 'Failed to start gdb'
++ exe 'bwipe! ' . s:promptbuf
++ return
++ endif
++ let s:gdb_channel = job_getchannel(s:gdbjob)
++
++ " Interpret commands while the target is running. This should usualy only
++ " be exec-interrupt, since many commands don't work properly while the
++ " target is running.
++ call s:SendCommand('-gdb-set mi-async on')
++ " Older gdb uses a different command.
++ call s:SendCommand('-gdb-set target-async on')
++
++ let s:ptybuf = 0
++ if has('win32')
++ " MS-Windows: run in a new console window for maximum compatibility
++ call s:SendCommand('set new-console on')
++ elseif has('terminal')
++ " Unix: Run the debugged program in a terminal window. Open it below the
++ " gdb window.
++ belowright let s:ptybuf = term_start('NONE', {
++ \ 'term_name': 'debugged program',
++ \ })
++ if s:ptybuf == 0
++ echoerr 'Failed to open the program terminal window'
++ call job_stop(s:gdbjob)
++ return
++ endif
++ let s:ptywin = win_getid(winnr())
++ let pty = job_info(term_getjob(s:ptybuf))['tty_out']
++ call s:SendCommand('tty ' . pty)
++
++ " Since GDB runs in a prompt window, the environment has not been set to
++ " match a terminal window, need to do that now.
++ call s:SendCommand('set env TERM = xterm-color')
++ call s:SendCommand('set env ROWS = ' . winheight(s:ptywin))
++ call s:SendCommand('set env LINES = ' . winheight(s:ptywin))
++ call s:SendCommand('set env COLUMNS = ' . winwidth(s:ptywin))
++ call s:SendCommand('set env COLORS = ' . &t_Co)
++ call s:SendCommand('set env VIM_TERMINAL = ' . v:version)
++ else
++ " TODO: open a new terminal get get the tty name, pass on to gdb
++ call s:SendCommand('show inferior-tty')
++ endif
++ call s:SendCommand('set print pretty on')
++ call s:SendCommand('set breakpoint pending on')
++ " Disable pagination, it causes everything to stop at the gdb
++ call s:SendCommand('set pagination off')
++
++ " Set arguments to be run
++ if len(proc_args)
++ call s:SendCommand('set args ' . join(proc_args))
++ endif
++
++ call s:StartDebugCommon(a:dict)
++ startinsert
++ endfunc
++
++ func s:StartDebugCommon(dict)
+ " Sign used to highlight the line where the program has stopped.
+ " There can be only one.
+ sign define debugPC linehl=debugPC
+***************
+*** 180,186 ****
+ sign define debugBreakpoint text=>> texthl=debugBreakpoint
+
+ " Install debugger commands in the text window.
+! call win_gotoid(s:startwin)
+ call s:InstallCommands()
+ call win_gotoid(s:gdbwin)
+
+--- 330,336 ----
+ sign define debugBreakpoint text=>> texthl=debugBreakpoint
+
+ " Install debugger commands in the text window.
+! call win_gotoid(s:sourcewin)
+ call s:InstallCommands()
+ call win_gotoid(s:gdbwin)
+
+***************
+*** 202,228 ****
+ au BufUnload * call s:BufUnloaded()
+ augroup END
+
+! " Run the command if the bang attribute was given
+! " and got to the window
+ if get(a:dict, 'bang', 0)
+ call s:SendCommand('-exec-run')
+ call win_gotoid(s:ptywin)
+ endif
+
+ endfunc
+
+! func s:EndDebug(job, status)
+! exe 'bwipe! ' . s:ptybuf
+ exe 'bwipe! ' . s:commbuf
+ unlet s:gdbwin
+
+ let curwinid = win_getid(winnr())
+
+! call win_gotoid(s:startwin)
+ let &signcolumn = s:startsigncolumn
+ call s:DeleteCommands()
+
+ call win_gotoid(curwinid)
+ if s:save_columns > 0
+ let &columns = s:save_columns
+ endif
+--- 352,481 ----
+ au BufUnload * call s:BufUnloaded()
+ augroup END
+
+! " Run the command if the bang attribute was given and got to the debug
+! " window.
+ if get(a:dict, 'bang', 0)
+ call s:SendCommand('-exec-run')
+ call win_gotoid(s:ptywin)
+ endif
++ endfunc
++
++ " Send a command to gdb. "cmd" is the string without line terminator.
++ func s:SendCommand(cmd)
++ call ch_log('sending to gdb: ' . a:cmd)
++ if s:way == 'prompt'
++ call ch_sendraw(s:gdb_channel, a:cmd . "\n")
++ else
++ call term_sendkeys(s:commbuf, a:cmd . "\r")
++ endif
++ endfunc
++
++ " This is global so that a user can create their mappings with this.
++ func TermDebugSendCommand(cmd)
++ if s:way == 'prompt'
++ call ch_sendraw(s:gdb_channel, a:cmd . "\n")
++ else
++ let do_continue = 0
++ if !s:stopped
++ let do_continue = 1
++ call s:SendCommand('-exec-interrupt')
++ sleep 10m
++ endif
++ call term_sendkeys(s:gdbbuf, a:cmd . "\r")
++ if do_continue
++ Continue
++ endif
++ endif
++ endfunc
++
++ " Function called when entering a line in the prompt buffer.
++ func s:PromptCallback(text)
++ call s:SendCommand(a:text)
++ endfunc
++
++ " Function called when pressing CTRL-C in the prompt buffer.
++ func s:PromptInterrupt()
++ call ch_log('Interrupting gdb')
++ call job_stop(s:gdbjob, 'int')
++ endfunc
++
++ " Function called when gdb outputs text.
++ func s:GdbOutCallback(channel, text)
++ call ch_log('received from gdb: ' . a:text)
++
++ " Drop the gdb prompt, we have our own.
++ " Drop status and echo'd commands.
++ if a:text == '(gdb) ' || a:text == '^done' || a:text[0] == '&' || a:text[0] == '='
++ return
++ endif
++ if a:text =~ '^^error,msg='
++ let text = s:DecodeMessage(a:text[11:])
++ if exists('s:evalexpr') && text =~ 'A syntax error in expression, near\|No symbol .* in current context'
++ " Silently drop evaluation errors.
++ unlet s:evalexpr
++ return
++ endif
++ elseif a:text[0] == '~'
++ let text = s:DecodeMessage(a:text[1:])
++ else
++ call s:CommOutput(a:channel, a:text)
++ return
++ endif
+
++ let curwinid = win_getid(winnr())
++ call win_gotoid(s:gdbwin)
++
++ " Add the output above the current prompt.
++ call append(line('$') - 1, text)
++ set nomodified
++
++ call win_gotoid(curwinid)
+ endfunc
+
+! " Decode a message from gdb. quotedText starts with a ", return the text up
+! " to the next ", unescaping characters.
+! func s:DecodeMessage(quotedText)
+! if a:quotedText[0] != '"'
+! echoerr 'DecodeMessage(): missing quote'
+! return
+! endif
+! let result = ''
+! let i = 1
+! while a:quotedText[i] != '"' && i < len(a:quotedText)
+! if a:quotedText[i] == '\'
+! let i += 1
+! if a:quotedText[i] == 'n'
+! " drop \n
+! let i += 1
+! continue
+! endif
+! endif
+! let result .= a:quotedText[i]
+! let i += 1
+! endwhile
+! return result
+! endfunc
+!
+! func s:EndTermDebug(job, status)
+ exe 'bwipe! ' . s:commbuf
+ unlet s:gdbwin
+
++ call s:EndDebugCommon()
++ endfunc
++
++ func s:EndDebugCommon()
+ let curwinid = win_getid(winnr())
+
+! if exists('s:ptybuf') && s:ptybuf
+! exe 'bwipe! ' . s:ptybuf
+! endif
+!
+! call win_gotoid(s:sourcewin)
+ let &signcolumn = s:startsigncolumn
+ call s:DeleteCommands()
+
+ call win_gotoid(curwinid)
++
+ if s:save_columns > 0
+ let &columns = s:save_columns
+ endif
+***************
+*** 240,245 ****
+--- 493,511 ----
+ au! TermDebug
+ endfunc
+
++ func s:EndPromptDebug(job, status)
++ let curwinid = win_getid(winnr())
++ call win_gotoid(s:gdbwin)
++ close
++ if curwinid != s:gdbwin
++ call win_gotoid(curwinid)
++ endif
++
++ call s:EndDebugCommon()
++ unlet s:gdbwin
++ call ch_log("Returning from EndPromptDebug()")
++ endfunc
++
+ " Handle a message received from gdb on the GDB/MI interface.
+ func s:CommOutput(chan, msg)
+ let msgs = split(a:msg, "\r")
+***************
+*** 275,285 ****
+ command -nargs=* Run call s:Run(<q-args>)
+ command -nargs=* Arguments call s:SendCommand('-exec-arguments ' . <q-args>)
+ command Stop call s:SendCommand('-exec-interrupt')
+! command Continue call s:SendCommand('-exec-continue')
+ command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
+ command Gdb call win_gotoid(s:gdbwin)
+ command Program call win_gotoid(s:ptywin)
+! command Source call s:GotoStartwinOrCreateIt()
+ command Winbar call s:InstallWinbar()
+
+ " TODO: can the K mapping be restored?
+--- 541,558 ----
+ command -nargs=* Run call s:Run(<q-args>)
+ command -nargs=* Arguments call s:SendCommand('-exec-arguments ' . <q-args>)
+ command Stop call s:SendCommand('-exec-interrupt')
+!
+! " using -exec-continue results in CTRL-C in gdb window not working
+! if s:way == 'prompt'
+! command Continue call s:SendCommand('continue')
+! else
+! command Continue call term_sendkeys(s:gdbbuf, "continue\r")
+! endif
+!
+ command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
+ command Gdb call win_gotoid(s:gdbwin)
+ command Program call win_gotoid(s:ptywin)
+! command Source call s:GotoSourcewinOrCreateIt()
+ command Winbar call s:InstallWinbar()
+
+ " TODO: can the K mapping be restored?
+***************
+*** 375,381 ****
+ let do_continue = 0
+ if !s:stopped
+ let do_continue = 1
+! call s:SendCommand('-exec-interrupt')
+ sleep 10m
+ endif
+ call s:SendCommand('-break-insert --source '
+--- 648,660 ----
+ let do_continue = 0
+ if !s:stopped
+ let do_continue = 1
+! if s:way == 'prompt'
+! " Need to send a signal to get the UI to listen. Strangely this is only
+! " needed once.
+! call job_stop(s:gdbjob, 'int')
+! else
+! call s:SendCommand('-exec-interrupt')
+! endif
+ sleep 10m
+ endif
+ call s:SendCommand('-break-insert --source '
+***************
+*** 391,397 ****
+ let lnum = line('.')
+ for [key, val] in items(s:breakpoints)
+ if val['fname'] == fname && val['lnum'] == lnum
+! call term_sendkeys(s:commbuf, '-break-delete ' . key . "\r")
+ " Assume this always wors, the reply is simply "^done".
+ exe 'sign unplace ' . (s:break_id + key)
+ unlet s:breakpoints[key]
+--- 670,676 ----
+ let lnum = line('.')
+ for [key, val] in items(s:breakpoints)
+ if val['fname'] == fname && val['lnum'] == lnum
+! call s:SendCommand('-break-delete ' . key)
+ " Assume this always wors, the reply is simply "^done".
+ exe 'sign unplace ' . (s:break_id + key)
+ unlet s:breakpoints[key]
+***************
+*** 400,410 ****
+ endfor
+ endfunc
+
+- " :Next, :Continue, etc - send a command to gdb
+- func s:SendCommand(cmd)
+- call term_sendkeys(s:commbuf, a:cmd . "\r")
+- endfunc
+-
+ func s:Run(args)
+ if a:args != ''
+ call s:SendCommand('-exec-arguments ' . a:args)
+--- 679,684 ----
+***************
+*** 466,472 ****
+ " Show a balloon with information of the variable under the mouse pointer,
+ " if there is any.
+ func TermDebugBalloonExpr()
+! if v:beval_winid != s:startwin
+ return
+ endif
+ let s:evalFromBalloonExpr = 1
+--- 740,751 ----
+ " Show a balloon with information of the variable under the mouse pointer,
+ " if there is any.
+ func TermDebugBalloonExpr()
+! if v:beval_winid != s:sourcewin
+! return
+! endif
+! if !s:stopped
+! " Only evaluate when stopped, otherwise setting a breakpoint using the
+! " mouse triggers a balloon.
+ return
+ endif
+ let s:evalFromBalloonExpr = 1
+***************
+*** 487,496 ****
+ echoerr substitute(a:msg, '.*msg="\(.*\)"', '\1', '')
+ endfunc
+
+! func s:GotoStartwinOrCreateIt()
+! if !win_gotoid(s:startwin)
+ new
+! let s:startwin = win_getid(winnr())
+ call s:InstallWinbar()
+ endif
+ endfunc
+--- 766,775 ----
+ echoerr substitute(a:msg, '.*msg="\(.*\)"', '\1', '')
+ endfunc
+
+! func s:GotoSourcewinOrCreateIt()
+! if !win_gotoid(s:sourcewin)
+ new
+! let s:sourcewin = win_getid(winnr())
+ call s:InstallWinbar()
+ endif
+ endfunc
+***************
+*** 506,512 ****
+ let s:stopped = 0
+ endif
+
+! call s:GotoStartwinOrCreateIt()
+
+ let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
+ if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
+--- 785,791 ----
+ let s:stopped = 0
+ endif
+
+! call s:GotoSourcewinOrCreateIt()
+
+ let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
+ if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
+***************
+*** 516,522 ****
+ if &modified
+ " TODO: find existing window
+ exe 'split ' . fnameescape(fname)
+! let s:startwin = win_getid(winnr())
+ call s:InstallWinbar()
+ else
+ exe 'edit ' . fnameescape(fname)
+--- 795,801 ----
+ if &modified
+ " TODO: find existing window
+ exe 'split ' . fnameescape(fname)
+! let s:sourcewin = win_getid(winnr())
+ call s:InstallWinbar()
+ else
+ exe 'edit ' . fnameescape(fname)
+*** ../vim-8.1.0070/src/version.c 2018-06-17 20:10:36.208066158 +0200
+--- src/version.c 2018-06-17 21:30:33.843055781 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 71,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+66. You create a homepage with the impression to cure the afflicted...but
+ your hidden agenda is to receive more e-mail.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0072 b/data/vim/patches/8.1.0072
new file mode 100644
index 000000000..e08a5d9b4
--- /dev/null
+++ b/data/vim/patches/8.1.0072
@@ -0,0 +1,97 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0072
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0072
+Problem: Use of 'termwinkey' is inconsistent.
+Solution: Change the documentation and the behavior. (Ken Takata)
+Files: src/terminal.c, runtime/doc/terminal.txt
+
+
+*** ../vim-8.1.0071/src/terminal.c 2018-06-12 20:25:47.887923393 +0200
+--- src/terminal.c 2018-06-17 22:02:22.045425925 +0200
+***************
+*** 2107,2113 ****
+--- 2107,2117 ----
+ in_terminal_loop = curbuf->b_term;
+
+ if (*curwin->w_p_twk != NUL)
++ {
+ termwinkey = string_to_key(curwin->w_p_twk, TRUE);
++ if (termwinkey == Ctrl_W)
++ termwinkey = 0;
++ }
+ position_cursor(curwin, &curbuf->b_term->tl_cursor_pos);
+ may_set_cursor_props(curbuf->b_term);
+
+***************
+*** 2203,2214 ****
+ /* "CTRL-W CTRL-C" or 'termwinkey' CTRL-C: end the job */
+ mch_signal_job(curbuf->b_term->tl_job, (char_u *)"kill");
+ }
+! else if (termwinkey == 0 && c == '.')
+ {
+ /* "CTRL-W .": send CTRL-W to the job */
+! c = Ctrl_W;
+ }
+! else if (termwinkey == 0 && c == Ctrl_BSL)
+ {
+ /* "CTRL-W CTRL-\": send CTRL-\ to the job */
+ c = Ctrl_BSL;
+--- 2207,2219 ----
+ /* "CTRL-W CTRL-C" or 'termwinkey' CTRL-C: end the job */
+ mch_signal_job(curbuf->b_term->tl_job, (char_u *)"kill");
+ }
+! else if (c == '.')
+ {
+ /* "CTRL-W .": send CTRL-W to the job */
+! /* "'termwinkey' .": send 'termwinkey' to the job */
+! c = termwinkey == 0 ? Ctrl_W : termwinkey;
+ }
+! else if (c == Ctrl_BSL)
+ {
+ /* "CTRL-W CTRL-\": send CTRL-\ to the job */
+ c = Ctrl_BSL;
+*** ../vim-8.1.0071/runtime/doc/terminal.txt 2018-06-17 21:34:08.277873656 +0200
+--- runtime/doc/terminal.txt 2018-06-17 22:03:58.916917371 +0200
+***************
+*** 87,93 ****
+ 'termwinkey' CTRL-W move focus to the next window
+ 'termwinkey' : enter an Ex command
+ 'termwinkey' 'termwinkey' send 'termwinkey' to the job in the terminal
+! 'termwinkey' . send a CTRL-W to the job in the terminal
+ 'termwinkey' N go to terminal Normal mode, see below
+ 'termwinkey' CTRL-N same as CTRL-W N
+ 'termwinkey' CTRL-C same as |t_CTRL-W_CTRL-C|
+--- 87,94 ----
+ 'termwinkey' CTRL-W move focus to the next window
+ 'termwinkey' : enter an Ex command
+ 'termwinkey' 'termwinkey' send 'termwinkey' to the job in the terminal
+! 'termwinkey' . send 'termwinkey' to the job in the terminal
+! 'termwinkey' CTRL-\ send a CTRL-\ to the job in the terminal
+ 'termwinkey' N go to terminal Normal mode, see below
+ 'termwinkey' CTRL-N same as CTRL-W N
+ 'termwinkey' CTRL-C same as |t_CTRL-W_CTRL-C|
+*** ../vim-8.1.0071/src/version.c 2018-06-17 21:34:08.277873656 +0200
+--- src/version.c 2018-06-17 22:18:19.319512827 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 72,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+68. Your cat always puts viruses on your dogs homepage
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0073 b/data/vim/patches/8.1.0073
new file mode 100644
index 000000000..7d012ab4e
--- /dev/null
+++ b/data/vim/patches/8.1.0073
@@ -0,0 +1,78 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0073
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0073
+Problem: Crash when autocommands call setloclist(). (Dominique Pelle)
+Solution: If the quickfix list changes then don't jump to the error.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+
+
+*** ../vim-8.1.0072/src/quickfix.c 2018-06-16 22:16:43.232576946 +0200
+--- src/quickfix.c 2018-06-18 20:46:57.982804364 +0200
+***************
+*** 6348,6356 ****
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+! if (res > 0 && (eap->cmdidx == CMD_cexpr ||
+! eap->cmdidx == CMD_lexpr))
+! qf_jump(qi, 0, 0, eap->forceit); /* display first error */
+ }
+ else
+ EMSG(_("E777: String or List expected"));
+--- 6348,6358 ----
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+! if (res > 0 && (eap->cmdidx == CMD_cexpr
+! || eap->cmdidx == CMD_lexpr)
+! && qi == ll_get_or_alloc_list(curwin))
+! // Jump to the first error if autocmds didn't free the list.
+! qf_jump(qi, 0, 0, eap->forceit);
+ }
+ else
+ EMSG(_("E777: String or List expected"));
+*** ../vim-8.1.0072/src/testdir/test_quickfix.vim 2018-06-16 22:16:43.232576946 +0200
+--- src/testdir/test_quickfix.vim 2018-06-18 20:48:23.134324971 +0200
+***************
+*** 3362,3364 ****
+--- 3362,3375 ----
+ au!
+ augroup END
+ endfunc
++
++ func Test_setloclist_in_aucmd()
++ " This was using freed memory.
++ augroup nasty
++ au * * call setloclist(0, [], 'f')
++ augroup END
++ lexpr "x"
++ augroup nasty
++ au!
++ augroup END
++ endfunc
+*** ../vim-8.1.0072/src/version.c 2018-06-17 22:19:07.267202961 +0200
+--- src/version.c 2018-06-18 20:51:25.897295981 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 73,
+ /**/
+
+--
+Q: How many legs does a giraffe have?
+A: Eight: two in front, two behind, two on the left and two on the right
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0074 b/data/vim/patches/8.1.0074
new file mode 100644
index 000000000..c2d37d77d
--- /dev/null
+++ b/data/vim/patches/8.1.0074
@@ -0,0 +1,54 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0074
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0074 (after 8.1.0073)
+Problem: Crash when running quickfix tests.
+Solution: Do not alloc a new location list when checking for the reference
+ to be still valid.
+Files: src/quickfix.c
+
+
+*** ../vim-8.1.0073/src/quickfix.c 2018-06-18 20:52:09.553050181 +0200
+--- src/quickfix.c 2018-06-18 21:48:30.652450833 +0200
+***************
+*** 6350,6356 ****
+ curbuf->b_fname, TRUE, curbuf);
+ if (res > 0 && (eap->cmdidx == CMD_cexpr
+ || eap->cmdidx == CMD_lexpr)
+! && qi == ll_get_or_alloc_list(curwin))
+ // Jump to the first error if autocmds didn't free the list.
+ qf_jump(qi, 0, 0, eap->forceit);
+ }
+--- 6350,6356 ----
+ curbuf->b_fname, TRUE, curbuf);
+ if (res > 0 && (eap->cmdidx == CMD_cexpr
+ || eap->cmdidx == CMD_lexpr)
+! && qi == GET_LOC_LIST(curwin))
+ // Jump to the first error if autocmds didn't free the list.
+ qf_jump(qi, 0, 0, eap->forceit);
+ }
+*** ../vim-8.1.0073/src/version.c 2018-06-18 20:52:09.553050181 +0200
+--- src/version.c 2018-06-18 21:53:12.362887962 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 74,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+75. You start wondering whether you could actually upgrade your brain
+ with a Pentium Pro microprocessor 80. The upgrade works just fine.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0075 b/data/vim/patches/8.1.0075
new file mode 100644
index 000000000..55f541a82
--- /dev/null
+++ b/data/vim/patches/8.1.0075
@@ -0,0 +1,45 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0075
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0075
+Problem: No Vim logo in README file.
+Solution: Add one. (Ãrni Dagur, closes #3024)
+Files: README.md
+
+
+*** ../vim-8.1.0074/README.md 2018-05-17 13:35:11.000000000 +0200
+--- README.md 2018-06-18 21:58:04.861300010 +0200
+***************
+*** 1,5 ****
+--- 1,7 ----
+ `README.md` for version 8.1 of Vim: Vi IMproved.
+
++ ![Vim Logo](https://github.com/vim/vim/blob/master/runtime/vimlogo.gif)
++
+ [![Build Status](https://travis-ci.org/vim/vim.svg?branch=master)](https://travis-ci.org/vim/vim)
+ [![Coverage Status](https://codecov.io/gh/vim/vim/coverage.svg?branch=master)](https://codecov.io/gh/vim/vim?branch=master)
+ [![Coverage Status](https://coveralls.io/repos/vim/vim/badge.svg?branch=master&service=github)](https://coveralls.io/github/vim/vim?branch=master)
+*** ../vim-8.1.0074/src/version.c 2018-06-18 21:53:23.514826893 +0200
+--- src/version.c 2018-06-18 21:59:37.524801670 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 75,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+76. Your ISP regards you as a business partner rather than as a customer.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0076 b/data/vim/patches/8.1.0076
new file mode 100644
index 000000000..a7bcdade0
--- /dev/null
+++ b/data/vim/patches/8.1.0076
@@ -0,0 +1,63 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0076
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0076
+Problem: Command getting cleared with CTRL-W : in a terminal window. (Jason
+ Franklin)
+Solution: Call redraw_after_callback() when editing the command line.
+Files: src/terminal.c
+
+
+*** ../vim-8.1.0075/src/terminal.c 2018-06-17 22:19:07.263202987 +0200
+--- src/terminal.c 2018-06-18 22:11:07.069048292 +0200
+***************
+*** 973,983 ****
+ * contents, thus no screen update is needed. */
+ if (!term->tl_normal_mode)
+ {
+! /* TODO: only update once in a while. */
+ ch_log(term->tl_job->jv_channel, "updating screen");
+! if (buffer == curbuf)
+ {
+! update_screen(0);
+ /* update_screen() can be slow, check the terminal wasn't closed
+ * already */
+ if (buffer == curbuf && curbuf->b_term != NULL)
+--- 973,985 ----
+ * contents, thus no screen update is needed. */
+ if (!term->tl_normal_mode)
+ {
+! // Don't use update_screen() when editing the command line, it gets
+! // cleared.
+! // TODO: only update once in a while.
+ ch_log(term->tl_job->jv_channel, "updating screen");
+! if (buffer == curbuf && (State & CMDLINE) == 0)
+ {
+! update_screen(VALID_NO_UPDATE);
+ /* update_screen() can be slow, check the terminal wasn't closed
+ * already */
+ if (buffer == curbuf && curbuf->b_term != NULL)
+*** ../vim-8.1.0075/src/version.c 2018-06-18 22:00:18.844580003 +0200
+--- src/version.c 2018-06-18 22:15:09.191722898 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 76,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+78. You find yourself dialing IP numbers on the phone.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0077 b/data/vim/patches/8.1.0077
new file mode 100644
index 000000000..cbf51e709
--- /dev/null
+++ b/data/vim/patches/8.1.0077
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0077
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0077
+Problem: Header of README file is not nice.
+Solution: Move text to the bottom.
+Files: README.md
+
+
+*** ../vim-8.1.0076/README.md 2018-06-18 22:00:18.844580003 +0200
+--- README.md 2018-06-18 22:29:22.055138356 +0200
+***************
+*** 1,5 ****
+- `README.md` for version 8.1 of Vim: Vi IMproved.
+-
+ ![Vim Logo](https://github.com/vim/vim/blob/master/runtime/vimlogo.gif)
+
+ [![Build Status](https://travis-ci.org/vim/vim.svg?branch=master)](https://travis-ci.org/vim/vim)
+--- 1,3 ----
+***************
+*** 139,141 ****
+--- 137,142 ----
+
+ Send any other comments, patches, flowers and suggestions to:
+ Bram Moolenaar <Bram@vim.org>
++
++
++ This is `README.md` for version 8.1 of Vim: Vi IMproved.
+*** ../vim-8.1.0076/src/version.c 2018-06-18 22:15:46.255521457 +0200
+--- src/version.c 2018-06-18 22:30:38.882728350 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 77,
+ /**/
+
+--
+If bankers can count, how come they have eight windows and
+only four tellers?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0078 b/data/vim/patches/8.1.0078
new file mode 100644
index 000000000..a191dd0d4
--- /dev/null
+++ b/data/vim/patches/8.1.0078
@@ -0,0 +1,140 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0078
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0078
+Problem: "..." used inconsistently in messages.
+Solution: Drop the space before " ...".
+Files: src/spellfile.c, src/regexp_nfa.c
+
+
+*** ../vim-8.1.0077/src/spellfile.c 2018-04-08 12:52:47.000000000 +0200
+--- src/spellfile.c 2018-06-19 14:17:05.329080012 +0200
+***************
+*** 2241,2247 ****
+ return NULL;
+ }
+
+! vim_snprintf((char *)IObuff, IOSIZE, _("Reading affix file %s ..."), fname);
+ spell_message(spin, IObuff);
+
+ /* Only do REP lines when not done in another .aff file already. */
+--- 2241,2247 ----
+ return NULL;
+ }
+
+! vim_snprintf((char *)IObuff, IOSIZE, _("Reading affix file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ /* Only do REP lines when not done in another .aff file already. */
+***************
+*** 3569,3575 ****
+ hash_init(&ht);
+
+ vim_snprintf((char *)IObuff, IOSIZE,
+! _("Reading dictionary file %s ..."), fname);
+ spell_message(spin, IObuff);
+
+ /* start with a message for the first line */
+--- 3569,3575 ----
+ hash_init(&ht);
+
+ vim_snprintf((char *)IObuff, IOSIZE,
+! _("Reading dictionary file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ /* start with a message for the first line */
+***************
+*** 4149,4155 ****
+ return FAIL;
+ }
+
+! vim_snprintf((char *)IObuff, IOSIZE, _("Reading word file %s ..."), fname);
+ spell_message(spin, IObuff);
+
+ /*
+--- 4149,4155 ----
+ return FAIL;
+ }
+
+! vim_snprintf((char *)IObuff, IOSIZE, _("Reading word file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ /*
+***************
+*** 5865,5871 ****
+ }
+
+ vim_snprintf((char *)IObuff, IOSIZE,
+! _("Writing suggestion file %s ..."), fname);
+ spell_message(spin, IObuff);
+
+ /*
+--- 5865,5871 ----
+ }
+
+ vim_snprintf((char *)IObuff, IOSIZE,
+! _("Writing suggestion file %s..."), fname);
+ spell_message(spin, IObuff);
+
+ /*
+***************
+*** 6150,6156 ****
+ * Write the info in the spell file.
+ */
+ vim_snprintf((char *)IObuff, IOSIZE,
+! _("Writing spell file %s ..."), wfname);
+ spell_message(&spin, IObuff);
+
+ error = write_vim_spell(&spin, wfname) == FAIL;
+--- 6150,6156 ----
+ * Write the info in the spell file.
+ */
+ vim_snprintf((char *)IObuff, IOSIZE,
+! _("Writing spell file %s..."), wfname);
+ spell_message(&spin, IObuff);
+
+ error = write_vim_spell(&spin, wfname) == FAIL;
+*** ../vim-8.1.0077/src/regexp_nfa.c 2018-02-10 18:34:41.000000000 +0100
+--- src/regexp_nfa.c 2018-06-19 14:20:14.816048075 +0200
+***************
+*** 5270,5276 ****
+ }
+ else
+ {
+! EMSG(_("Could not open temporary log file for writing, displaying on stderr ... "));
+ log_fd = stderr;
+ }
+ #endif
+--- 5270,5276 ----
+ }
+ else
+ {
+! EMSG(_("Could not open temporary log file for writing, displaying on stderr... "));
+ log_fd = stderr;
+ }
+ #endif
+*** ../vim-8.1.0077/src/version.c 2018-06-18 22:31:07.858573774 +0200
+--- src/version.c 2018-06-19 14:09:26.899529941 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 78,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+85. Choice between paying Compuserve bill and paying for kids education
+ is a no brainer -- although a bit painful for your kids.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0079 b/data/vim/patches/8.1.0079
new file mode 100644
index 000000000..6d3691524
--- /dev/null
+++ b/data/vim/patches/8.1.0079
@@ -0,0 +1,69 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0079
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0079
+Problem: Superfluous space in messages.
+Solution: Remove the spaces. (closes #3030)
+Files: src/gui_w32.c
+
+
+*** ../vim-8.1.0078/src/gui_w32.c 2018-05-17 13:57:00.000000000 +0200
+--- src/gui_w32.c 2018-06-19 14:38:12.006094737 +0200
+***************
+*** 2821,2827 ****
+ }
+
+ set_window_title(s_findrep_hwnd,
+! _("Find string (use '\\\\' to find a '\\')"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = TRUE;
+--- 2821,2827 ----
+ }
+
+ set_window_title(s_findrep_hwnd,
+! _("Find string (use '\\\\' to find a '\\')"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = TRUE;
+***************
+*** 2856,2862 ****
+ }
+
+ set_window_title(s_findrep_hwnd,
+! _("Find & Replace (use '\\\\' to find a '\\')"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = FALSE;
+--- 2856,2862 ----
+ }
+
+ set_window_title(s_findrep_hwnd,
+! _("Find & Replace (use '\\\\' to find a '\\')"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = FALSE;
+*** ../vim-8.1.0078/src/version.c 2018-06-19 14:23:50.302866911 +0200
+--- src/version.c 2018-06-19 14:38:54.921853595 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 79,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+86. E-mail Deficiency Depression (EDD) forces you to e-mail yourself.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0080 b/data/vim/patches/8.1.0080
new file mode 100644
index 000000000..03dba7e9f
--- /dev/null
+++ b/data/vim/patches/8.1.0080
@@ -0,0 +1,258 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0080
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0080
+Problem: Can't see the breakpoint number in the terminal debugger.
+Solution: Use the breakpoint number for the sign. (Christian Brabandt)
+Files: runtime/doc/terminal.txt,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0079/runtime/doc/terminal.txt 2018-06-17 22:19:07.267202961 +0200
+--- runtime/doc/terminal.txt 2018-06-19 16:55:43.126412132 +0200
+***************
+*** 19,26 ****
+ Resizing |terminal-resizing|
+ Terminal Modes |Terminal-mode|
+ Cursor style |terminal-cursor-style|
+- Special keys |terminal-special-keys|
+ Session |terminal-session|
+ Unix |terminal-unix|
+ MS-Windows |terminal-ms-windows|
+ 2. Terminal communication |terminal-communication|
+--- 19,26 ----
+ Resizing |terminal-resizing|
+ Terminal Modes |Terminal-mode|
+ Cursor style |terminal-cursor-style|
+ Session |terminal-session|
++ Special keys |terminal-special-keys|
+ Unix |terminal-unix|
+ MS-Windows |terminal-ms-windows|
+ 2. Terminal communication |terminal-communication|
+***************
+*** 116,124 ****
+
+ < *options-in-terminal*
+ After opening the terminal window and setting 'buftype' to "terminal" the
+! BufWinEnter autocommand event is triggered. This makes it possible to set
+ options specifically for the window and buffer. Example: >
+! au BufWinEnter * if &buftype == 'terminal' | setlocal bufhidden=hide | endif
+
+ Mouse events (click and drag) are passed to the terminal. Mouse move events
+ are only passed when Vim itself is receiving them. For a terminal that is
+--- 116,127 ----
+
+ < *options-in-terminal*
+ After opening the terminal window and setting 'buftype' to "terminal" the
+! TerminalOpen autocommand event is triggered. This makes it possible to set
+ options specifically for the window and buffer. Example: >
+! au TerminalOpen * if &buftype == 'terminal' | setlocal bufhidden=hide | endif
+! The <abuf> is set to the terminal buffer, but if there is no window (hidden
+! terminal) then setting options will happen in the wrong buffer, therefore the
+! check for &buftype in the example.
+
+ Mouse events (click and drag) are passed to the terminal. Mouse move events
+ are only passed when Vim itself is receiving them. For a terminal that is
+***************
+*** 449,455 ****
+ of the terminal and {argument}, the decoded JSON argument.
+ The function name must start with "Tapi_" to avoid
+ accidentally calling a function not meant to be used for the
+! terminal API
+ The user function should sanity check the argument.
+ The function can use |term_sendkeys()| to send back a reply.
+ Example in JSON: >
+--- 452,458 ----
+ of the terminal and {argument}, the decoded JSON argument.
+ The function name must start with "Tapi_" to avoid
+ accidentally calling a function not meant to be used for the
+! terminal API.
+ The user function should sanity check the argument.
+ The function can use |term_sendkeys()| to send back a reply.
+ Example in JSON: >
+***************
+*** 702,712 ****
+ Vim will start running in the program window. Put focus there and type: >
+ :help gui
+ Gdb will run into the ex_help breakpoint. The source window now shows the
+! ex_cmds.c file. A ">>" marker will appear where the breakpoint was set. The
+! line where the debugger stopped is highlighted. You can now step through the
+! program. Let's use the mouse: click on the "Next" button in the window
+! toolbar. You will see the highlighting move as the debugger executes a line
+! of source code.
+
+ Click "Next" a few times until the for loop is highlighted. Put the cursor on
+ the end of "eap->arg", then click "Eval" in the toolbar. You will see this
+--- 705,715 ----
+ Vim will start running in the program window. Put focus there and type: >
+ :help gui
+ Gdb will run into the ex_help breakpoint. The source window now shows the
+! ex_cmds.c file. A red "1 " marker will appear in the signcolumn where the
+! breakpoint was set. The line where the debugger stopped is highlighted. You
+! can now step through the program. Let's use the mouse: click on the "Next"
+! button in the window toolbar. You will see the highlighting move as the
+! debugger executes a line of source code.
+
+ Click "Next" a few times until the for loop is highlighted. Put the cursor on
+ the end of "eap->arg", then click "Eval" in the toolbar. You will see this
+***************
+*** 785,790 ****
+--- 788,800 ----
+ happens if the buffer in the source code window has been modified and can't be
+ abandoned.
+
++ Gdb gives each breakpoint a number. In Vim the number shows up in the sign
++ column, with a red background. You can use these gdb commands:
++ - info break list breakpoints
++ - delete N delete breakpoint N
++ You can also use the `:Clear` command if the cursor is in the line with the
++ breakpoint, or use the "Clear breakpoint" right-click menu entry.
++
+
+ Inspecting variables ~
+ *termdebug-variables* *:Evaluate*
+***************
+*** 828,833 ****
+--- 838,850 ----
+ gdb. The buffer name is "gdb communication". Do not delete this buffer, it
+ will break the debugger.
+
++ Gdb has some weird behavior, the plugin does its best to work around that.
++ For example, after typing "continue" in the gdb window a CTRL-C can be used to
++ interrupt the running program. But after using the MI command
++ "-exec-continue" pressing CTRL-C does not interrupt. Therefore you will see
++ "continue" being used for the `:Continue` command, instead of using the
++ communication channel.
++
+
+ Customizing ~
+
+***************
+*** 885,891 ****
+ let g:termdebug_wide = 163
+ This will set &columns to 163 when :Termdebug is used. The value is restored
+ when quitting the debugger.
+! If g:termdebug_wide is set and &Columns is already larger than
+ g:termdebug_wide then a vertical split will be used without changing &columns.
+ Set it to 1 to get a vertical split without every changing &columns (useful
+ for when the terminal can't be resized by Vim).
+--- 902,908 ----
+ let g:termdebug_wide = 163
+ This will set &columns to 163 when :Termdebug is used. The value is restored
+ when quitting the debugger.
+! If g:termdebug_wide is set and &columns is already larger than
+ g:termdebug_wide then a vertical split will be used without changing &columns.
+ Set it to 1 to get a vertical split without every changing &columns (useful
+ for when the terminal can't be resized by Vim).
+*** ../vim-8.1.0079/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-17 21:34:08.277873656 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-19 16:59:18.185759005 +0200
+***************
+*** 67,73 ****
+ endif
+
+ let s:pc_id = 12
+! let s:break_id = 13
+ let s:stopped = 1
+
+ if &background == 'light'
+--- 67,73 ----
+ endif
+
+ let s:pc_id = 12
+! let s:break_id = 13 " breakpoint number is added to this
+ let s:stopped = 1
+
+ if &background == 'light'
+***************
+*** 325,334 ****
+ " There can be only one.
+ sign define debugPC linehl=debugPC
+
+- " Sign used to indicate a breakpoint.
+- " Can be used multiple times.
+- sign define debugBreakpoint text=>> texthl=debugBreakpoint
+-
+ " Install debugger commands in the text window.
+ call win_gotoid(s:sourcewin)
+ call s:InstallCommands()
+--- 325,330 ----
+***************
+*** 345,350 ****
+--- 341,347 ----
+ endif
+ endif
+
++ " Contains breakpoints that have been placed, key is the number.
+ let s:breakpoints = {}
+
+ augroup TermDebug
+***************
+*** 813,818 ****
+--- 810,825 ----
+ call win_gotoid(wid)
+ endfunc
+
++ func s:CreateBreakpoint(nr)
++ if !exists("s:BreakpointSigns")
++ let s:BreakpointSigns = []
++ endif
++ if index(s:BreakpointSigns, a:nr) == -1
++ call add(s:BreakpointSigns, a:nr)
++ exe "sign define debugBreakpoint". a:nr . " text=" . a:nr . " texthl=debugBreakpoint"
++ endif
++ endfunc
++
+ " Handle setting a breakpoint
+ " Will update the sign that shows the breakpoint
+ func s:HandleNewBreakpoint(msg)
+***************
+*** 820,825 ****
+--- 827,833 ----
+ if nr == 0
+ return
+ endif
++ call s:CreateBreakpoint(nr)
+
+ if has_key(s:breakpoints, nr)
+ let entry = s:breakpoints[nr]
+***************
+*** 839,845 ****
+ endfunc
+
+ func s:PlaceSign(nr, entry)
+! exe 'sign place ' . (s:break_id + a:nr) . ' line=' . a:entry['lnum'] . ' name=debugBreakpoint file=' . a:entry['fname']
+ let a:entry['placed'] = 1
+ endfunc
+
+--- 847,853 ----
+ endfunc
+
+ func s:PlaceSign(nr, entry)
+! exe 'sign place ' . (s:break_id + a:nr) . ' line=' . a:entry['lnum'] . ' name=debugBreakpoint' . a:nr . ' file=' . a:entry['fname']
+ let a:entry['placed'] = 1
+ endfunc
+
+*** ../vim-8.1.0079/src/version.c 2018-06-19 14:45:33.583620880 +0200
+--- src/version.c 2018-06-19 16:57:00.654200256 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 80,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+90. Instead of calling you to dinner, your spouse sends e-mail.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0081 b/data/vim/patches/8.1.0081
new file mode 100644
index 000000000..f943be461
--- /dev/null
+++ b/data/vim/patches/8.1.0081
@@ -0,0 +1,83 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0081
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0081
+Problem: The terminal debugger doesn't adjust to changed 'background'.
+Solution: Add an OptionSet autocommand. (Christian Brabandt)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0080/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-19 16:59:31.333713053 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-19 17:24:00.106825205 +0200
+***************
+*** 70,80 ****
+ let s:break_id = 13 " breakpoint number is added to this
+ let s:stopped = 1
+
+! if &background == 'light'
+! hi default debugPC term=reverse ctermbg=lightblue guibg=lightblue
+! else
+! hi default debugPC term=reverse ctermbg=darkblue guibg=darkblue
+! endif
+ hi default debugBreakpoint term=reverse ctermbg=red guibg=red
+
+ func s:StartDebug(bang, ...)
+--- 70,85 ----
+ let s:break_id = 13 " breakpoint number is added to this
+ let s:stopped = 1
+
+! func s:Highlight(init, old, new)
+! let default = a:init ? 'default ' : ''
+! if a:new ==# 'light' && a:old !=# 'light'
+! exe "hi " . default . "debugPC term=reverse ctermbg=lightblue guibg=lightblue"
+! elseif a:new ==# 'dark' && a:old !=# 'dark'
+! exe "hi " . default . "debugPC term=reverse ctermbg=darkblue guibg=darkblue"
+! endif
+! endfunc
+!
+! call s:Highlight(1, '', &background)
+ hi default debugBreakpoint term=reverse ctermbg=red guibg=red
+
+ func s:StartDebug(bang, ...)
+***************
+*** 347,352 ****
+--- 352,358 ----
+ augroup TermDebug
+ au BufRead * call s:BufRead()
+ au BufUnload * call s:BufUnloaded()
++ au OptionSet background call s:Highlight(0, v:option_old, v:option_new)
+ augroup END
+
+ " Run the command if the bang attribute was given and got to the debug
+***************
+*** 887,890 ****
+ endif
+ endfor
+ endfunc
+-
+--- 893,895 ----
+*** ../vim-8.1.0080/src/version.c 2018-06-19 16:59:31.333713053 +0200
+--- src/version.c 2018-06-19 17:27:18.613687664 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 81,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+91. It's Saturday afternoon in the middle of May and you
+ are on computer.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0082 b/data/vim/patches/8.1.0082
new file mode 100644
index 000000000..57ff29d5c
--- /dev/null
+++ b/data/vim/patches/8.1.0082
@@ -0,0 +1,129 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0082
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0082
+Problem: In terminal window, typing : at more prompt, inserts ':' instead
+ of starting another Ex command.
+Solution: Add skip_term_loop and set it when putting ':' in the typeahead
+ buffer.
+Files: src/globals.h, src/main.c, src/message.c
+
+
+*** ../vim-8.1.0081/src/globals.h 2018-05-22 20:35:13.558009273 +0200
+--- src/globals.h 2018-06-19 17:38:48.904146780 +0200
+***************
+*** 371,376 ****
+--- 371,381 ----
+ # endif
+ # endif
+ #endif
++ #ifdef FEAT_TERMINAL
++ // When TRUE skip calling terminal_loop() once. Used when
++ // typing ':' at the more prompt.
++ EXTERN int skip_term_loop INIT(= FALSE);
++ #endif
+ #ifdef FEAT_GUI
+ EXTERN char_u *use_gvimrc INIT(= NULL); /* "-U" cmdline argument */
+ #endif
+*** ../vim-8.1.0081/src/main.c 2018-05-05 15:04:42.000000000 +0200
+--- src/main.c 2018-06-19 17:34:55.649828513 +0200
+***************
+*** 1339,1345 ****
+ #ifdef FEAT_TERMINAL
+ if (term_use_loop()
+ && oa.op_type == OP_NOP && oa.regname == NUL
+! && !VIsual_active)
+ {
+ /* If terminal_loop() returns OK we got a key that is handled
+ * in Normal model. With FAIL we first need to position the
+--- 1339,1346 ----
+ #ifdef FEAT_TERMINAL
+ if (term_use_loop()
+ && oa.op_type == OP_NOP && oa.regname == NUL
+! && !VIsual_active
+! && !skip_term_loop)
+ {
+ /* If terminal_loop() returns OK we got a key that is handled
+ * in Normal model. With FAIL we first need to position the
+***************
+*** 1349,1355 ****
+--- 1350,1361 ----
+ }
+ else
+ #endif
++ {
++ #ifdef FEAT_TERMINAL
++ skip_term_loop = FALSE;
++ #endif
+ normal_cmd(&oa, TRUE);
++ }
+ }
+ }
+ }
+***************
+*** 3320,3326 ****
+ main_msg(_("-dev <device>\t\tUse <device> for I/O"));
+ #endif
+ #ifdef FEAT_ARABIC
+! main_msg(_("-A\t\t\tstart in Arabic mode"));
+ #endif
+ #ifdef FEAT_RIGHTLEFT
+ main_msg(_("-H\t\t\tStart in Hebrew mode"));
+--- 3326,3332 ----
+ main_msg(_("-dev <device>\t\tUse <device> for I/O"));
+ #endif
+ #ifdef FEAT_ARABIC
+! main_msg(_("-A\t\t\tStart in Arabic mode"));
+ #endif
+ #ifdef FEAT_RIGHTLEFT
+ main_msg(_("-H\t\t\tStart in Hebrew mode"));
+*** ../vim-8.1.0081/src/message.c 2018-05-22 20:35:13.562009272 +0200
+--- src/message.c 2018-06-19 17:39:40.111793123 +0200
+***************
+*** 1219,1224 ****
+--- 1219,1227 ----
+ cmdline_row = msg_row;
+ skip_redraw = TRUE; /* skip redraw once */
+ do_redraw = FALSE;
++ #ifdef FEAT_TERMINAL
++ skip_term_loop = TRUE;
++ #endif
+ }
+
+ /*
+***************
+*** 2827,2832 ****
+--- 2830,2838 ----
+ /* Since got_int is set all typeahead will be flushed, but we
+ * want to keep this ':', remember that in a special way. */
+ typeahead_noflush(':');
++ #ifdef FEAT_TERMINAL
++ skip_term_loop = TRUE;
++ #endif
+ cmdline_row = Rows - 1; /* put ':' on this line */
+ skip_redraw = TRUE; /* skip redraw once */
+ need_wait_return = FALSE; /* don't wait in main() */
+*** ../vim-8.1.0081/src/version.c 2018-06-19 17:27:50.085385875 +0200
+--- src/version.c 2018-06-19 17:47:54.412556057 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 82,
+ /**/
+
+--
+From "know your smileys":
+ :^[/ mean-smiley-with-cigarette
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0083 b/data/vim/patches/8.1.0083
new file mode 100644
index 000000000..ec805d366
--- /dev/null
+++ b/data/vim/patches/8.1.0083
@@ -0,0 +1,196 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0083
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0083
+Problem: "is" and "as" have trouble with quoted punctuation.
+Solution: Check for punctuation before a quote. (Jason Franklin)
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+
+*** ../vim-8.1.0082/src/search.c 2018-05-22 17:50:38.679980719 +0200
+--- src/search.c 2018-06-19 18:19:14.194486159 +0200
+***************
+*** 2707,2716 ****
+ }
+
+ /*
+! * findsent(dir, count) - Find the start of the next sentence in direction
+! * "dir" Sentences are supposed to end in ".", "!" or "?" followed by white
+! * space or a line break. Also stop at an empty line.
+! * Return OK if the next sentence was found.
+ */
+ int
+ findsent(int dir, long count)
+--- 2707,2717 ----
+ }
+
+ /*
+! * Find the start of the next sentence, searching in the direction specified
+! * by the "dir" argument. The cursor is positioned on the start of the next
+! * sentence when found. If the next sentence is found, return OK. Return FAIL
+! * otherwise. See ":h sentence" for the precise definition of a "sentence"
+! * text object.
+ */
+ int
+ findsent(int dir, long count)
+***************
+*** 2758,2783 ****
+ else if (dir == BACKWARD)
+ decl(&pos);
+
+! /* go back to the previous non-blank char */
+ found_dot = FALSE;
+! while ((c = gchar_pos(&pos)) == ' ' || c == '\t' ||
+! (dir == BACKWARD && vim_strchr((char_u *)".!?)]\"'", c) != NULL))
+ {
+! if (vim_strchr((char_u *)".!?", c) != NULL)
+! {
+! /* Only skip over a '.', '!' and '?' once. */
+! if (found_dot)
+! break;
+ found_dot = TRUE;
+! }
+! if (decl(&pos) == -1)
+ break;
+! /* when going forward: Stop in front of empty line */
+! if (LINEEMPTY(pos.lnum) && dir == FORWARD)
+! {
+! incl(&pos);
+! goto found;
+! }
+ }
+
+ /* remember the line where the search started */
+--- 2759,2783 ----
+ else if (dir == BACKWARD)
+ decl(&pos);
+
+! // go back to the previous non-white non-punctuation character
+ found_dot = FALSE;
+! while (c = gchar_pos(&pos), VIM_ISWHITE(c)
+! || vim_strchr((char_u *)".!?)]\"'", c) != NULL)
+ {
+! tpos = pos;
+! if (decl(&tpos) == -1 || (LINEEMPTY(tpos.lnum) && dir == FORWARD))
+! break;
+!
+! if (found_dot)
+! break;
+! if (vim_strchr((char_u *) ".!?", c) != NULL)
+ found_dot = TRUE;
+!
+! if (vim_strchr((char_u *) ")]\"'", c) != NULL
+! && vim_strchr((char_u *) ".!?)]\"'", gchar_pos(&tpos)) == NULL)
+ break;
+!
+! decl(&pos);
+ }
+
+ /* remember the line where the search started */
+*** ../vim-8.1.0082/src/testdir/test_textobjects.vim 2018-02-09 18:06:35.000000000 +0100
+--- src/testdir/test_textobjects.vim 2018-06-19 18:16:20.911420342 +0200
+***************
+*** 165,167 ****
+--- 165,242 ----
+ norm it
+ q!
+ endfunc
++
++ func Test_sentence()
++ enew!
++ call setline(1, 'A sentence. A sentence? A sentence!')
++
++ normal yis
++ call assert_equal('A sentence.', @")
++ normal yas
++ call assert_equal('A sentence. ', @")
++
++ normal )
++
++ normal yis
++ call assert_equal('A sentence?', @")
++ normal yas
++ call assert_equal('A sentence? ', @")
++
++ normal )
++
++ normal yis
++ call assert_equal('A sentence!', @")
++ normal yas
++ call assert_equal(' A sentence!', @")
++
++ normal 0
++ normal 2yis
++ call assert_equal('A sentence. ', @")
++ normal 3yis
++ call assert_equal('A sentence. A sentence?', @")
++ normal 2yas
++ call assert_equal('A sentence. A sentence? ', @")
++
++ %delete _
++ endfunc
++
++ func Test_sentence_with_quotes()
++ enew!
++ call setline(1, 'A "sentence." A sentence.')
++
++ normal yis
++ call assert_equal('A "sentence."', @")
++ normal yas
++ call assert_equal('A "sentence." ', @")
++
++ normal )
++
++ normal yis
++ call assert_equal('A sentence.', @")
++ normal yas
++ call assert_equal(' A sentence.', @")
++
++ %delete _
++ endfunc
++
++ func! Test_sentence_with_cursor_on_delimiter()
++ enew!
++ call setline(1, "A '([sentence.])' A sentence.")
++
++ normal! 15|yis
++ call assert_equal("A '([sentence.])'", @")
++ normal! 15|yas
++ call assert_equal("A '([sentence.])' ", @")
++
++ normal! 16|yis
++ call assert_equal("A '([sentence.])'", @")
++ normal! 16|yas
++ call assert_equal("A '([sentence.])' ", @")
++
++ normal! 17|yis
++ call assert_equal("A '([sentence.])'", @")
++ normal! 17|yas
++ call assert_equal("A '([sentence.])' ", @")
++
++ %delete _
++ endfunc
+*** ../vim-8.1.0082/src/version.c 2018-06-19 17:49:20.300015350 +0200
+--- src/version.c 2018-06-19 18:27:12.611837877 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 83,
+ /**/
+
+--
+From "know your smileys":
+ y:-) Bad toupee
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0084 b/data/vim/patches/8.1.0084
new file mode 100644
index 000000000..9623dff2d
--- /dev/null
+++ b/data/vim/patches/8.1.0084
@@ -0,0 +1,161 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0084
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0084
+Problem: User name completion does not work on MS-Windows.
+Solution: Use NetUserEnum() to get user names. (Yasuhiro Matsumoto)
+Files: src/Make_ivc.mak, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/misc1.c
+
+
+*** ../vim-8.1.0083/src/Make_ivc.mak 2016-07-19 13:51:41.000000000 +0200
+--- src/Make_ivc.mak 2018-06-19 18:37:43.572545354 +0200
+***************
+*** 88,94 ****
+ CPP_PROJ= /nologo /MT /W3 /GX /I ".\proto" /D "WIN32" /c
+ # ADD CPP /nologo /MT /W3 /GX /I ".\proto" /D "WIN32" /c
+
+! LINK32_FLAGS= oldnames.lib kernel32.lib user32.lib gdi32.lib version.lib comdlg32.lib comctl32.lib advapi32.lib shell32.lib ole32.lib uuid.lib /nologo /machine:I386 /nodefaultlib
+ # ADD LINK32 oldnames.lib kernel32.lib user32.lib gdi32.lib version.lib comdlg32.lib comctl32.lib advapi32.lib shell32.lib ole32.lib uuid.lib /nologo /machine:I386 /nodefaultlib
+ # SUBTRACT LINK32 /incremental:yes
+
+--- 88,94 ----
+ CPP_PROJ= /nologo /MT /W3 /GX /I ".\proto" /D "WIN32" /c
+ # ADD CPP /nologo /MT /W3 /GX /I ".\proto" /D "WIN32" /c
+
+! LINK32_FLAGS= oldnames.lib kernel32.lib user32.lib gdi32.lib version.lib comdlg32.lib comctl32.lib advapi32.lib shell32.lib ole32.lib netapi32.lib uuid.lib /nologo /machine:I386 /nodefaultlib
+ # ADD LINK32 oldnames.lib kernel32.lib user32.lib gdi32.lib version.lib comdlg32.lib comctl32.lib advapi32.lib shell32.lib ole32.lib uuid.lib /nologo /machine:I386 /nodefaultlib
+ # SUBTRACT LINK32 /incremental:yes
+
+*** ../vim-8.1.0083/src/Make_cyg_ming.mak 2018-04-21 19:06:58.000000000 +0200
+--- src/Make_cyg_ming.mak 2018-06-19 18:38:21.464387436 +0200
+***************
+*** 662,668 ****
+ CFLAGS += -s
+ endif
+
+! LIB = -lkernel32 -luser32 -lgdi32 -ladvapi32 -lcomdlg32 -lcomctl32 -lversion
+ GUIOBJ = $(OUTDIR)/gui.o $(OUTDIR)/gui_w32.o $(OUTDIR)/gui_beval.o $(OUTDIR)/os_w32exe.o
+ CUIOBJ = $(OUTDIR)/iscygpty.o
+ OBJ = \
+--- 662,668 ----
+ CFLAGS += -s
+ endif
+
+! LIB = -lkernel32 -luser32 -lgdi32 -ladvapi32 -lcomdlg32 -lcomctl32 -lnetapi32 -lversion
+ GUIOBJ = $(OUTDIR)/gui.o $(OUTDIR)/gui_w32.o $(OUTDIR)/gui_beval.o $(OUTDIR)/os_w32exe.o
+ CUIOBJ = $(OUTDIR)/iscygpty.o
+ OBJ = \
+*** ../vim-8.1.0083/src/Make_mvc.mak 2018-03-26 20:41:04.000000000 +0200
+--- src/Make_mvc.mak 2018-06-19 18:40:11.891907875 +0200
+***************
+*** 489,498 ****
+
+ # need advapi32.lib for GetUserName()
+ # need shell32.lib for ExtractIcon()
+ # gdi32.lib and comdlg32.lib for printing support
+ # ole32.lib and uuid.lib are needed for FEAT_SHORTCUT
+ CON_LIB = oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib \
+! comdlg32.lib ole32.lib uuid.lib /machine:$(CPU)
+ !if "$(DELAYLOAD)" == "yes"
+ CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib
+ !endif
+--- 489,499 ----
+
+ # need advapi32.lib for GetUserName()
+ # need shell32.lib for ExtractIcon()
++ # need netapi32.lib for NetUserEnum()
+ # gdi32.lib and comdlg32.lib for printing support
+ # ole32.lib and uuid.lib are needed for FEAT_SHORTCUT
+ CON_LIB = oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib \
+! comdlg32.lib ole32.lib netapi32.lib uuid.lib /machine:$(CPU)
+ !if "$(DELAYLOAD)" == "yes"
+ CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib
+ !endif
+***************
+*** 801,807 ****
+ $(OUTDIR)\os_w32exe.obj
+ GUI_LIB = \
+ gdi32.lib version.lib $(IME_LIB) \
+! winspool.lib comctl32.lib advapi32.lib shell32.lib \
+ /machine:$(CPU)
+ !else
+ SUBSYSTEM = console
+--- 802,808 ----
+ $(OUTDIR)\os_w32exe.obj
+ GUI_LIB = \
+ gdi32.lib version.lib $(IME_LIB) \
+! winspool.lib comctl32.lib advapi32.lib shell32.lib netapi32.lib \
+ /machine:$(CPU)
+ !else
+ SUBSYSTEM = console
+*** ../vim-8.1.0083/src/misc1.c 2018-05-14 22:56:16.000000000 +0200
+--- src/misc1.c 2018-06-19 18:41:51.783452927 +0200
+***************
+*** 14,19 ****
+--- 14,23 ----
+ #include "vim.h"
+ #include "version.h"
+
++ #if defined(FEAT_CMDL_COMPL) && defined(WIN3264)
++ # include <lm.h>
++ #endif
++
+ static char_u *vim_version_dir(char_u *vimdir);
+ static char_u *remove_tail(char_u *p, char_u *pend, char_u *name);
+ #if defined(FEAT_CMDL_COMPL)
+***************
+*** 4603,4608 ****
+--- 4607,4634 ----
+ }
+ endpwent();
+ }
++ # elif defined(WIN3264)
++ {
++ char_u* user;
++ DWORD nusers = 0, ntotal = 0, i;
++ PUSER_INFO_0 uinfo;
++
++ if (NetUserEnum(NULL, 0, 0, (LPBYTE *) &uinfo, MAX_PREFERRED_LENGTH,
++ &nusers, &ntotal, NULL) == NERR_Success)
++ {
++ for (i = 0; i < nusers; i++)
++ {
++ if (ga_grow(&ga_users, 1) == FAIL)
++ break;
++ user = utf16_to_enc(uinfo[i].usri0_name, NULL);
++ if (user == NULL)
++ break;
++ ((char_u **)(ga_users.ga_data))[ga_users.ga_len++] = user;
++ }
++
++ NetApiBufferFree(uinfo);
++ }
++ }
+ # endif
+ }
+
+*** ../vim-8.1.0083/src/version.c 2018-06-19 18:27:38.271694008 +0200
+--- src/version.c 2018-06-19 18:56:50.358883504 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 84,
+ /**/
+
+--
+From "know your smileys":
+ :----} You lie like Pinocchio
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0085 b/data/vim/patches/8.1.0085
new file mode 100644
index 000000000..44d289928
--- /dev/null
+++ b/data/vim/patches/8.1.0085
@@ -0,0 +1,97 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0085
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0085
+Problem: No test for completing user name and language.
+Solution: Add tests. (Dominique Pelle, closes #2978)
+Files: src/testdir/test_cmdline.vim
+
+
+*** ../vim-8.1.0084/src/testdir/test_cmdline.vim 2018-05-22 16:58:43.979903077 +0200
+--- src/testdir/test_cmdline.vim 2018-06-19 19:07:14.403515948 +0200
+***************
+*** 1,6 ****
+ " Tests for editing the command line.
+
+-
+ func Test_complete_tab()
+ call writefile(['testfile'], 'Xtestfile')
+ call feedkeys(":e Xtest\t\r", "tx")
+--- 1,5 ----
+***************
+*** 392,397 ****
+--- 391,440 ----
+ delcommand Foo
+ endfunc
+
++ func Test_cmdline_complete_user_names()
++ if has('unix') && executable('whoami')
++ let whoami = systemlist('whoami')[0]
++ let first_letter = whoami[0]
++ if len(first_letter) > 0
++ " Trying completion of :e ~x where x is the first letter of
++ " the user name should complete to at least the user name.
++ call feedkeys(':e ~' . first_letter . "\<c-a>\<c-B>\"\<cr>", 'tx')
++ call assert_match('^"e \~.*\<' . whoami . '\>', @:)
++ endif
++ endif
++ if has('win32')
++ " Just in case: check that the system has an Administrator account.
++ let names = system('net user')
++ if names =~ 'Administrator'
++ " Trying completion of :e ~A should complete to Administrator.
++ call feedkeys(':e ~A' . "\<c-a>\<c-B>\"\<cr>", 'tx')
++ call assert_match('^"e \~Administrator', @:)
++ endif
++ endif
++ endfunc
++
++ funct Test_cmdline_complete_languages()
++ let lang = substitute(execute('language messages'), '.*"\(.*\)"$', '\1', '')
++
++ call feedkeys(":language \<c-a>\<c-b>\"\<cr>", 'tx')
++ call assert_match('^"language .*\<ctype\>.*\<messages\>.*\<time\>', @:)
++
++ if has('unix')
++ " TODO: these tests don't work on Windows. lang appears to be 'C'
++ " but C does not appear in the completion. Why?
++ call assert_match('^"language .*\<' . lang . '\>', @:)
++
++ call feedkeys(":language messages \<c-a>\<c-b>\"\<cr>", 'tx')
++ call assert_match('^"language .*\<' . lang . '\>', @:)
++
++ call feedkeys(":language ctype \<c-a>\<c-b>\"\<cr>", 'tx')
++ call assert_match('^"language .*\<' . lang . '\>', @:)
++
++ call feedkeys(":language time \<c-a>\<c-b>\"\<cr>", 'tx')
++ call assert_match('^"language .*\<' . lang . '\>', @:)
++ endif
++ endfunc
++
+ func Test_cmdline_write_alternatefile()
+ new
+ call setline('.', ['one', 'two'])
+*** ../vim-8.1.0084/src/version.c 2018-06-19 18:58:04.010489820 +0200
+--- src/version.c 2018-06-19 19:07:41.203370203 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 85,
+ /**/
+
+--
+From "know your smileys":
+¯\_(ツ)_/¯ Shrug
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0086 b/data/vim/patches/8.1.0086
new file mode 100644
index 000000000..2186846f6
--- /dev/null
+++ b/data/vim/patches/8.1.0086
@@ -0,0 +1,78 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0086
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0086
+Problem: No tests for libcall() and libcallnr().
+Solution: Add tests. (Dominique Pelle, closes #2982)
+Files: src/testdir/test_functions.vim
+
+
+*** ../vim-8.1.0085/src/testdir/test_functions.vim 2018-05-22 20:35:13.554009274 +0200
+--- src/testdir/test_functions.vim 2018-06-19 19:44:16.868201472 +0200
+***************
+*** 948,950 ****
+--- 948,986 ----
+ delfunc s:save_reg_stat
+ unlet s:reg_stat
+ endfunc
++
++ func Test_libcall_libcallnr()
++ if !has('libcall')
++ return
++ endif
++
++ if has('win32')
++ let libc = 'msvcrt.dll'
++ elseif has('mac')
++ let libc = 'libSystem.B.dylib'
++ else
++ " On Unix, libc.so can be in various places.
++ " Interestingly, using an empty string for the 1st argument of libcall
++ " allows to call functions from libc which is not documented.
++ let libc = ''
++ endif
++
++ if has('win32')
++ call assert_equal($USERPROFILE, libcall(libc, 'getenv', 'USERPROFILE'))
++ else
++ call assert_equal($HOME, libcall(libc, 'getenv', 'HOME'))
++ endif
++
++ " If function returns NULL, libcall() should return an empty string.
++ call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT'))
++
++ " Test libcallnr() with string and integer argument.
++ call assert_equal(4, libcallnr(libc, 'strlen', 'abcd'))
++ call assert_equal(char2nr('A'), libcallnr(libc, 'toupper', char2nr('a')))
++
++ call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", 'E364:')
++ call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", 'E364:')
++
++ call assert_fails("call libcall('Xdoesnotexist_', 'getenv', 'HOME')", 'E364:')
++ call assert_fails("call libcallnr('Xdoesnotexist_', 'strlen', 'abcd')", 'E364:')
++ endfunc
+*** ../vim-8.1.0085/src/version.c 2018-06-19 19:09:04.870914841 +0200
+--- src/version.c 2018-06-19 19:44:39.776148855 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 86,
+ /**/
+
+--
+From "know your smileys":
+ ;-0 Can't find shift key
+ ,-9 Kann Umschalttaste nicht finden
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0087 b/data/vim/patches/8.1.0087
new file mode 100644
index 000000000..8f6a9c65d
--- /dev/null
+++ b/data/vim/patches/8.1.0087
@@ -0,0 +1,255 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0087
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0087
+Problem: v:shell_error is always zero when using terminal for "!cmd".
+Solution: Use "exitval" of terminal-job. (Ozaki Kiichi, closes #2994)
+Files: src/os_unix.c, src/os_win32.c, src/proto/terminal.pro,
+ src/terminal.c, src/testdir/test_terminal.vim
+
+
+*** ../vim-8.1.0086/src/os_unix.c 2018-06-13 20:49:47.444338292 +0200
+--- src/os_unix.c 2018-06-19 19:53:43.794232600 +0200
+***************
+*** 4365,4370 ****
+--- 4365,4371 ----
+ char_u *tofree2 = NULL;
+ int retval = -1;
+ buf_T *buf;
++ job_T *job;
+ aco_save_T aco;
+ oparg_T oa; /* operator arguments */
+
+***************
+*** 4374,4379 ****
+--- 4375,4385 ----
+ init_job_options(&opt);
+ ch_log(NULL, "starting terminal for system command '%s'", cmd);
+ buf = term_start(NULL, argv, &opt, TERM_START_SYSTEM);
++ if (buf == NULL)
++ goto theend;
++
++ job = term_getjob(buf->b_term);
++ ++job->jv_refcount;
+
+ /* Find a window to make "buf" curbuf. */
+ aucmd_prepbuf(&aco, buf);
+***************
+*** 4391,4399 ****
+ else
+ normal_cmd(&oa, TRUE);
+ }
+! retval = 0;
+ ch_log(NULL, "system command finished");
+
+ /* restore curwin/curbuf and a few other things */
+ aucmd_restbuf(&aco);
+
+--- 4397,4407 ----
+ else
+ normal_cmd(&oa, TRUE);
+ }
+! retval = job->jv_exitval;
+ ch_log(NULL, "system command finished");
+
++ job_unref(job);
++
+ /* restore curwin/curbuf and a few other things */
+ aucmd_restbuf(&aco);
+
+*** ../vim-8.1.0086/src/os_win32.c 2018-06-12 21:11:08.626548598 +0200
+--- src/os_win32.c 2018-06-19 19:53:43.798232583 +0200
+***************
+*** 4796,4801 ****
+--- 4796,4802 ----
+ long_u cmdlen;
+ int retval = -1;
+ buf_T *buf;
++ job_T *job;
+ aco_save_T aco;
+ oparg_T oa; /* operator arguments */
+
+***************
+*** 4826,4831 ****
+--- 4827,4835 ----
+ if (buf == NULL)
+ return 255;
+
++ job = term_getjob(buf->b_term);
++ ++job->jv_refcount;
++
+ /* Find a window to make "buf" curbuf. */
+ aucmd_prepbuf(&aco, buf);
+
+***************
+*** 4842,4850 ****
+ else
+ normal_cmd(&oa, TRUE);
+ }
+! retval = 0;
+ ch_log(NULL, "system command finished");
+
+ /* restore curwin/curbuf and a few other things */
+ aucmd_restbuf(&aco);
+
+--- 4846,4856 ----
+ else
+ normal_cmd(&oa, TRUE);
+ }
+! retval = job->jv_exitval;
+ ch_log(NULL, "system command finished");
+
++ job_unref(job);
++
+ /* restore curwin/curbuf and a few other things */
+ aucmd_restbuf(&aco);
+
+*** ../vim-8.1.0086/src/proto/terminal.pro 2018-05-17 13:52:53.000000000 +0200
+--- src/proto/terminal.pro 2018-06-19 19:53:43.798232583 +0200
+***************
+*** 55,59 ****
+--- 55,60 ----
+ void f_term_start(typval_T *argvars, typval_T *rettv);
+ void f_term_wait(typval_T *argvars, typval_T *rettv);
+ void term_send_eof(channel_T *ch);
++ job_T *term_getjob(term_T *term);
+ int terminal_enabled(void);
+ /* vim: set ft=c : */
+*** ../vim-8.1.0086/src/terminal.c 2018-06-18 22:15:46.255521457 +0200
+--- src/terminal.c 2018-06-19 19:53:43.798232583 +0200
+***************
+*** 5336,5341 ****
+--- 5336,5347 ----
+ }
+ }
+
++ job_T *
++ term_getjob(term_T *term)
++ {
++ return term != NULL ? term->tl_job : NULL;
++ }
++
+ # if defined(WIN3264) || defined(PROTO)
+
+ /**************************************
+*** ../vim-8.1.0086/src/testdir/test_terminal.vim 2018-06-12 18:04:28.038267855 +0200
+--- src/testdir/test_terminal.vim 2018-06-19 19:55:56.917638761 +0200
+***************
+*** 522,550 ****
+ exe buf . 'bwipe'
+ endfunc
+
+- " must be last, we can't go back from GUI to terminal
+- func Test_zz_terminal_in_gui()
+- if !CanRunGui()
+- return
+- endif
+-
+- " Ignore the "failed to create input context" error.
+- call test_ignore_error('E285:')
+-
+- gui -f
+-
+- call assert_equal(1, winnr('$'))
+- let buf = Run_shell_in_terminal({'term_finish': 'close'})
+- call Stop_shell_in_terminal(buf)
+- call term_wait(buf)
+-
+- " closing window wipes out the terminal buffer a with finished job
+- call WaitForAssert({-> assert_equal(1, winnr('$'))})
+- call assert_equal("", bufname(buf))
+-
+- unlet g:job
+- endfunc
+-
+ func Test_terminal_list_args()
+ let buf = term_start([&shell, &shellcmdflag, 'echo "123"'])
+ call assert_fails(buf . 'bwipe', 'E517')
+--- 522,527 ----
+***************
+*** 1546,1548 ****
+--- 1523,1580 ----
+
+ exe buf . 'bwipe!'
+ endfunc
++
++ " must be nearly the last, we can't go back from GUI to terminal
++ func Test_zz1_terminal_in_gui()
++ if !CanRunGui()
++ return
++ endif
++
++ " Ignore the "failed to create input context" error.
++ call test_ignore_error('E285:')
++
++ gui -f
++
++ call assert_equal(1, winnr('$'))
++ let buf = Run_shell_in_terminal({'term_finish': 'close'})
++ call Stop_shell_in_terminal(buf)
++ call term_wait(buf)
++
++ " closing window wipes out the terminal buffer a with finished job
++ call WaitForAssert({-> assert_equal(1, winnr('$'))})
++ call assert_equal("", bufname(buf))
++
++ unlet g:job
++ endfunc
++
++ func Test_zz2_terminal_guioptions_bang()
++ if !has('gui_running')
++ return
++ endif
++ set guioptions+=!
++
++ let filename = 'Xtestscript'
++ if has('win32')
++ let filename .= '.bat'
++ let prefix = ''
++ let contents = ['@echo off', 'exit %1']
++ else
++ let filename .= '.sh'
++ let prefix = './'
++ let contents = ['#!/bin/sh', 'exit $1']
++ endif
++ call writefile(contents, filename)
++ call setfperm(filename, 'rwxrwx---')
++
++ " Check if v:shell_error is equal to the exit status.
++ let exitval = 0
++ execute printf(':!%s%s %d', prefix, filename, exitval)
++ call assert_equal(exitval, v:shell_error)
++
++ let exitval = 9
++ execute printf(':!%s%s %d', prefix, filename, exitval)
++ call assert_equal(exitval, v:shell_error)
++
++ set guioptions&
++ call delete(filename)
++ endfunc
+*** ../vim-8.1.0086/src/version.c 2018-06-19 19:46:01.703936337 +0200
+--- src/version.c 2018-06-19 19:50:34.551011945 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 87,
+ /**/
+
+--
+From "know your smileys":
+ :-) Funny
+ |-) Funny Oriental
+ (-: Funny Australian
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0088 b/data/vim/patches/8.1.0088
new file mode 100644
index 000000000..458bfa9fa
--- /dev/null
+++ b/data/vim/patches/8.1.0088
@@ -0,0 +1,56 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0088
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0088
+Problem: Terminal test for stdout and stderr is a bit flaky.
+Solution: Wait for both stdout and stderr to have been processed. (Ozaki
+ Kiichi, closes #2991)
+Files: src/testdir/test_terminal.vim
+
+
+*** ../vim-8.1.0087/src/testdir/test_terminal.vim 2018-06-19 19:59:15.248704265 +0200
+--- src/testdir/test_terminal.vim 2018-06-19 20:04:17.711202392 +0200
+***************
+*** 1487,1494 ****
+
+ let outfile = 'Xtermstdout'
+ let buf = term_start(['./Xechoerrout.sh'], {'out_io': 'file', 'out_name': outfile})
+! call WaitForAssert({-> assert_inrange(1, 2, len(readfile(outfile)))})
+! call assert_equal("this is standard out", readfile(outfile)[0])
+ call assert_equal('this is standard error', term_getline(buf, 1))
+
+ call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))})
+--- 1487,1495 ----
+
+ let outfile = 'Xtermstdout'
+ let buf = term_start(['./Xechoerrout.sh'], {'out_io': 'file', 'out_name': outfile})
+!
+! call WaitFor({-> !empty(readfile(outfile)) && !empty(term_getline(buf, 1))})
+! call assert_equal(['this is standard out'], readfile(outfile))
+ call assert_equal('this is standard error', term_getline(buf, 1))
+
+ call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))})
+*** ../vim-8.1.0087/src/version.c 2018-06-19 19:59:15.248704265 +0200
+--- src/version.c 2018-06-19 20:05:36.722799665 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 88,
+ /**/
+
+--
+From "know your smileys":
+ :~) A man with a tape recorder up his nose
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0089 b/data/vim/patches/8.1.0089
new file mode 100644
index 000000000..c993c6945
--- /dev/null
+++ b/data/vim/patches/8.1.0089
@@ -0,0 +1,199 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0089
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0089
+Problem: error when ending the terminal debugger
+Solution: Fix deleting defined signs for breakpoints. Make the debugger
+ work better on MS-Windows.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0088/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-19 17:27:50.085385875 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-19 22:33:23.557472678 +0200
+***************
+*** 408,414 ****
+
+ " Drop the gdb prompt, we have our own.
+ " Drop status and echo'd commands.
+! if a:text == '(gdb) ' || a:text == '^done' || a:text[0] == '&' || a:text[0] == '='
+ return
+ endif
+ if a:text =~ '^^error,msg='
+--- 408,414 ----
+
+ " Drop the gdb prompt, we have our own.
+ " Drop status and echo'd commands.
+! if a:text == '(gdb) ' || a:text == '^done' || a:text[0] == '&'
+ return
+ endif
+ if a:text =~ '^^error,msg='
+***************
+*** 439,445 ****
+ " to the next ", unescaping characters.
+ func s:DecodeMessage(quotedText)
+ if a:quotedText[0] != '"'
+! echoerr 'DecodeMessage(): missing quote'
+ return
+ endif
+ let result = ''
+--- 439,445 ----
+ " to the next ", unescaping characters.
+ func s:DecodeMessage(quotedText)
+ if a:quotedText[0] != '"'
+! echoerr 'DecodeMessage(): missing quote in ' . a:quotedText
+ return
+ endif
+ let result = ''
+***************
+*** 459,464 ****
+--- 459,474 ----
+ return result
+ endfunc
+
++ " Extract the "name" value from a gdb message with fullname="name".
++ func s:GetFullname(msg)
++ let name = s:DecodeMessage(substitute(a:msg, '.*fullname=', '', ''))
++ if has('win32') && name =~ ':\\\\'
++ " sometimes the name arrives double-escaped
++ let name = substitute(name, '\\\\', '\\', 'g')
++ endif
++ return name
++ endfunc
++
+ func s:EndTermDebug(job, status)
+ exe 'bwipe! ' . s:commbuf
+ unlet s:gdbwin
+***************
+*** 639,647 ****
+ for key in keys(s:breakpoints)
+ exe 'sign unplace ' . (s:break_id + key)
+ endfor
+- sign undefine debugPC
+- sign undefine debugBreakpoint
+ unlet s:breakpoints
+ endfunc
+
+ " :Break - Set a breakpoint at the cursor position.
+--- 649,661 ----
+ for key in keys(s:breakpoints)
+ exe 'sign unplace ' . (s:break_id + key)
+ endfor
+ unlet s:breakpoints
++
++ sign undefine debugPC
++ for val in s:BreakpointSigns
++ exe "sign undefine debugBreakpoint" . val
++ endfor
++ unlet s:BreakpointSigns
+ endfunc
+
+ " :Break - Set a breakpoint at the cursor position.
+***************
+*** 660,667 ****
+ endif
+ sleep 10m
+ endif
+! call s:SendCommand('-break-insert --source '
+! \ . fnameescape(expand('%:p')) . ' --line ' . line('.'))
+ if do_continue
+ call s:SendCommand('-exec-continue')
+ endif
+--- 674,682 ----
+ endif
+ sleep 10m
+ endif
+! " Use the fname:lnum format, older gdb can't handle --source.
+! call s:SendCommand('-break-insert '
+! \ . fnameescape(expand('%:p')) . ':' . line('.'))
+ if do_continue
+ call s:SendCommand('-exec-continue')
+ endif
+***************
+*** 790,796 ****
+
+ call s:GotoSourcewinOrCreateIt()
+
+! let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
+ if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
+ let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
+ if lnum =~ '^[0-9]*$'
+--- 805,815 ----
+
+ call s:GotoSourcewinOrCreateIt()
+
+! if a:msg =~ 'fullname='
+! let fname = s:GetFullname(a:msg)
+! else
+! let fname = ''
+! endif
+ if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
+ let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
+ if lnum =~ '^[0-9]*$'
+***************
+*** 816,828 ****
+ call win_gotoid(wid)
+ endfunc
+
+ func s:CreateBreakpoint(nr)
+- if !exists("s:BreakpointSigns")
+- let s:BreakpointSigns = []
+- endif
+ if index(s:BreakpointSigns, a:nr) == -1
+ call add(s:BreakpointSigns, a:nr)
+! exe "sign define debugBreakpoint". a:nr . " text=" . a:nr . " texthl=debugBreakpoint"
+ endif
+ endfunc
+
+--- 835,846 ----
+ call win_gotoid(wid)
+ endfunc
+
++ let s:BreakpointSigns = []
++
+ func s:CreateBreakpoint(nr)
+ if index(s:BreakpointSigns, a:nr) == -1
+ call add(s:BreakpointSigns, a:nr)
+! exe "sign define debugBreakpoint" . a:nr . " text=" . a:nr . " texthl=debugBreakpoint"
+ endif
+ endfunc
+
+***************
+*** 842,848 ****
+ let s:breakpoints[nr] = entry
+ endif
+
+! let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
+ let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
+ let entry['fname'] = fname
+ let entry['lnum'] = lnum
+--- 860,866 ----
+ let s:breakpoints[nr] = entry
+ endif
+
+! let fname = s:GetFullname(a:msg)
+ let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
+ let entry['fname'] = fname
+ let entry['lnum'] = lnum
+*** ../vim-8.1.0088/src/version.c 2018-06-19 20:08:10.382007834 +0200
+--- src/version.c 2018-06-19 22:31:10.318179415 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 89,
+ /**/
+
+--
+How many light bulbs does it take to change a person?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0090 b/data/vim/patches/8.1.0090
new file mode 100644
index 000000000..8ca0b8cbe
--- /dev/null
+++ b/data/vim/patches/8.1.0090
@@ -0,0 +1,146 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0090
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0090
+Problem: "..." used inconsistently in a message.
+Solution: Define the message with " ..." once. (hint by Ken Takata)
+Files: src/regexp_nfa.c
+
+
+*** ../vim-8.1.0089/src/regexp_nfa.c 2018-06-19 14:23:50.302866911 +0200
+--- src/regexp_nfa.c 2018-06-20 20:34:22.266469423 +0200
+***************
+*** 2672,2677 ****
+--- 2672,2678 ----
+
+ #ifdef ENABLE_LOG
+ static FILE *log_fd;
++ static char_u e_log_open_failed[] = N_("Could not open temporary log file for writing, displaying on stderr... ");
+
+ /*
+ * Print the postfix notation of the current regexp.
+***************
+*** 2687,2693 ****
+ {
+ fprintf(f, "\n-------------------------\n");
+ if (retval == FAIL)
+! fprintf(f, ">>> NFA engine failed ... \n");
+ else if (retval == OK)
+ fprintf(f, ">>> NFA engine succeeded !\n");
+ fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
+--- 2688,2694 ----
+ {
+ fprintf(f, "\n-------------------------\n");
+ if (retval == FAIL)
+! fprintf(f, ">>> NFA engine failed... \n");
+ else if (retval == OK)
+ fprintf(f, ">>> NFA engine succeeded !\n");
+ fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
+***************
+*** 5270,5276 ****
+ }
+ else
+ {
+! EMSG(_("Could not open temporary log file for writing, displaying on stderr... "));
+ log_fd = stderr;
+ }
+ #endif
+--- 5271,5277 ----
+ }
+ else
+ {
+! EMSG(_(e_log_open_failed));
+ log_fd = stderr;
+ }
+ #endif
+***************
+*** 5620,5626 ****
+ }
+ else
+ {
+! EMSG(_("Could not open temporary log file for writing, displaying on stderr ... "));
+ log_fd = stderr;
+ }
+ #endif
+--- 5621,5627 ----
+ }
+ else
+ {
+! EMSG(_(e_log_open_failed));
+ log_fd = stderr;
+ }
+ #endif
+***************
+*** 5704,5710 ****
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "------------------------------------------\n");
+ fprintf(log_fd, ">>> Reginput is \"%s\"\n", reginput);
+! fprintf(log_fd, ">>> Advanced one character ... Current char is %c (code %d) \n", curc, (int)curc);
+ fprintf(log_fd, ">>> Thislist has %d states available: ", thislist->n);
+ {
+ int i;
+--- 5705,5711 ----
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "------------------------------------------\n");
+ fprintf(log_fd, ">>> Reginput is \"%s\"\n", reginput);
+! fprintf(log_fd, ">>> Advanced one character... Current char is %c (code %d) \n", curc, (int)curc);
+ fprintf(log_fd, ">>> Thislist has %d states available: ", thislist->n);
+ {
+ int i;
+***************
+*** 5757,5763 ****
+ else
+ col = (int)(t->subs.norm.list.line[0].start - regline);
+ nfa_set_code(t->state->c);
+! fprintf(log_fd, "(%d) char %d %s (start col %d)%s ... \n",
+ abs(t->state->id), (int)t->state->c, code, col,
+ pim_info(&t->pim));
+ }
+--- 5758,5764 ----
+ else
+ col = (int)(t->subs.norm.list.line[0].start - regline);
+ nfa_set_code(t->state->c);
+! fprintf(log_fd, "(%d) char %d %s (start col %d)%s... \n",
+ abs(t->state->id), (int)t->state->c, code, col,
+ pim_info(&t->pim));
+ }
+***************
+*** 7282,7288 ****
+
+ if (f != NULL)
+ {
+! fprintf(f, "\n*****************************\n\n\n\n\tCompiling regexp \"%s\" ... hold on !\n", expr);
+ fclose(f);
+ }
+ }
+--- 7283,7289 ----
+
+ if (f != NULL)
+ {
+! fprintf(f, "\n*****************************\n\n\n\n\tCompiling regexp \"%s\"... hold on !\n", expr);
+ fclose(f);
+ }
+ }
+*** ../vim-8.1.0089/src/version.c 2018-06-19 22:34:39.608993263 +0200
+--- src/version.c 2018-06-20 20:29:03.511932732 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 90,
+ /**/
+
+--
+Where do you want to crash today?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0091 b/data/vim/patches/8.1.0091
new file mode 100644
index 000000000..2888abf73
--- /dev/null
+++ b/data/vim/patches/8.1.0091
@@ -0,0 +1,369 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0091
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0091
+Problem: MS-Windows: Cannot interrupt gdb when program is running.
+Solution: Add debugbreak() and use it in the terminal debugger.
+ Respect 'modified' in a prompt buffer.
+Files: src/evalfunc.c, runtime/doc/eval.txt, src/undo.c,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0090/src/evalfunc.c 2018-06-17 19:36:30.215317108 +0200
+--- src/evalfunc.c 2018-06-20 21:37:04.384279452 +0200
+***************
+*** 123,128 ****
+--- 123,131 ----
+ static void f_count(typval_T *argvars, typval_T *rettv);
+ static void f_cscope_connection(typval_T *argvars, typval_T *rettv);
+ static void f_cursor(typval_T *argsvars, typval_T *rettv);
++ #ifdef WIN3264
++ static void f_debugbreak(typval_T *argvars, typval_T *rettv);
++ #endif
+ static void f_deepcopy(typval_T *argvars, typval_T *rettv);
+ static void f_delete(typval_T *argvars, typval_T *rettv);
+ static void f_deletebufline(typval_T *argvars, typval_T *rettv);
+***************
+*** 577,582 ****
+--- 580,588 ----
+ {"count", 2, 4, f_count},
+ {"cscope_connection",0,3, f_cscope_connection},
+ {"cursor", 1, 3, f_cursor},
++ #ifdef WIN3264
++ {"debugbreak", 1, 1, f_debugbreak},
++ #endif
+ {"deepcopy", 1, 2, f_deepcopy},
+ {"delete", 1, 2, f_delete},
+ {"deletebufline", 2, 3, f_deletebufline},
+***************
+*** 2761,2766 ****
+--- 2767,2799 ----
+ rettv->vval.v_number = 0;
+ }
+
++ #ifdef WIN3264
++ /*
++ * "debugbreak()" function
++ */
++ static void
++ f_debugbreak(typval_T *argvars, typval_T *rettv)
++ {
++ int pid;
++
++ rettv->vval.v_number = FAIL;
++ pid = (int)get_tv_number(&argvars[0]);
++ if (pid == 0)
++ EMSG(_(e_invarg));
++ else
++ {
++ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
++
++ if (hProcess != NULL)
++ {
++ DebugBreakProcess(hProcess);
++ CloseHandle(hProcess);
++ rettv->vval.v_number = OK;
++ }
++ }
++ }
++ #endif
++
+ /*
+ * "deepcopy()" function
+ */
+*** ../vim-8.1.0090/runtime/doc/eval.txt 2018-06-17 19:36:30.211317130 +0200
+--- runtime/doc/eval.txt 2018-06-20 20:49:26.069391126 +0200
+***************
+*** 2108,2113 ****
+--- 2108,2114 ----
+ cursor({lnum}, {col} [, {off}])
+ Number move cursor to {lnum}, {col}, {off}
+ cursor({list}) Number move cursor to position in {list}
++ debugbreak({pid}) Number interrupt process being debugged
+ deepcopy({expr} [, {noref}]) any make a full copy of {expr}
+ delete({fname} [, {flags}]) Number delete the file or directory {fname}
+ deletebufline({expr}, {first}[, {last}])
+***************
+*** 3480,3485 ****
+--- 3481,3491 ----
+ position within a <Tab> or after the last character.
+ Returns 0 when the position could be set, -1 otherwise.
+
++ debugbreak({pid}) *debugbreak()*
++ Specifically used to interrupt a program being debugged. It
++ will cause process {pid} to get a SIGTRAP. Behavior for other
++ processes is undefined. See |terminal-debugger|.
++ {only available on MS-Windows}
+
+ deepcopy({expr} [, {noref}]) *deepcopy()* *E698*
+ Make a copy of {expr}. For Numbers and Strings this isn't
+***************
+*** 5488,5493 ****
+--- 5494,5513 ----
+ The returned Job object can be used to get the status with
+ |job_status()| and stop the job with |job_stop()|.
+
++ Note that the job object will be deleted if there are no
++ references to it. This closes the stdin and stderr, which may
++ cause the job to fail with an error. To avoid this keep a
++ reference to the job. Thus instead of: >
++ call job_start('my-command')
++ < use: >
++ let myjob = job_start('my-command')
++ < and unlet "myjob" once the job is not needed or is past the
++ point where it would fail (e.g. when it prints a message on
++ startup). Keep in mind that variables local to a function
++ will cease to exist if the function returns. Use a
++ script-local variable if needed: >
++ let s:myjob = job_start('my-command')
++ <
+ {options} must be a Dictionary. It can contain many optional
+ items, see |job-options|.
+
+*** ../vim-8.1.0090/src/undo.c 2018-04-08 12:53:24.000000000 +0200
+--- src/undo.c 2018-06-20 22:01:18.595276435 +0200
+***************
+*** 3539,3545 ****
+ int
+ bufIsChangedNotTerm(buf_T *buf)
+ {
+! return !bt_dontwrite(buf)
+ && (buf->b_changed || file_ff_differs(buf, TRUE));
+ }
+
+--- 3539,3547 ----
+ int
+ bufIsChangedNotTerm(buf_T *buf)
+ {
+! // In a "prompt" buffer we do respect 'modified', so that we can control
+! // closing the window by setting or resetting that option.
+! return (!bt_dontwrite(buf) || bt_prompt(buf))
+ && (buf->b_changed || file_ff_differs(buf, TRUE));
+ }
+
+*** ../vim-8.1.0090/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-19 22:34:39.608993263 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-20 22:35:22.126433823 +0200
+***************
+*** 98,103 ****
+--- 98,104 ----
+ return
+ endif
+ let s:ptywin = 0
++ let s:pid = 0
+
+ " Uncomment this line to write logging in "debuglog".
+ " call ch_logfile('debuglog', 'w')
+***************
+*** 271,276 ****
+--- 272,279 ----
+ exe 'bwipe! ' . s:promptbuf
+ return
+ endif
++ " Mark the buffer modified so that it's not easy to close.
++ set modified
+ let s:gdb_channel = job_getchannel(s:gdbjob)
+
+ " Interpret commands while the target is running. This should usualy only
+***************
+*** 396,405 ****
+ call s:SendCommand(a:text)
+ endfunc
+
+! " Function called when pressing CTRL-C in the prompt buffer.
+ func s:PromptInterrupt()
+! call ch_log('Interrupting gdb')
+! call job_stop(s:gdbjob, 'int')
+ endfunc
+
+ " Function called when gdb outputs text.
+--- 399,414 ----
+ call s:SendCommand(a:text)
+ endfunc
+
+! " Function called when pressing CTRL-C in the prompt buffer and when placing a
+! " breakpoint.
+ func s:PromptInterrupt()
+! if s:pid == 0
+! echoerr 'Cannot interrupt gdb, did not find a process ID'
+! else
+! call ch_log('Interrupting gdb')
+! " Using job_stop(s:gdbjob, 'int') does not work.
+! call debugbreak(s:pid)
+! endif
+ endfunc
+
+ " Function called when gdb outputs text.
+***************
+*** 430,436 ****
+
+ " Add the output above the current prompt.
+ call append(line('$') - 1, text)
+! set nomodified
+
+ call win_gotoid(curwinid)
+ endfunc
+--- 439,445 ----
+
+ " Add the output above the current prompt.
+ call append(line('$') - 1, text)
+! set modified
+
+ call win_gotoid(curwinid)
+ endfunc
+***************
+*** 509,514 ****
+--- 518,524 ----
+ func s:EndPromptDebug(job, status)
+ let curwinid = win_getid(winnr())
+ call win_gotoid(s:gdbwin)
++ set nomodified
+ close
+ if curwinid != s:gdbwin
+ call win_gotoid(curwinid)
+***************
+*** 535,540 ****
+--- 545,552 ----
+ call s:HandleNewBreakpoint(msg)
+ elseif msg =~ '^=breakpoint-deleted,'
+ call s:HandleBreakpointDelete(msg)
++ elseif msg =~ '^=thread-group-started'
++ call s:HandleProgramRun(msg)
+ elseif msg =~ '^\^done,value='
+ call s:HandleEvaluate(msg)
+ elseif msg =~ '^\^error,msg='
+***************
+*** 655,661 ****
+ for val in s:BreakpointSigns
+ exe "sign undefine debugBreakpoint" . val
+ endfor
+! unlet s:BreakpointSigns
+ endfunc
+
+ " :Break - Set a breakpoint at the cursor position.
+--- 667,673 ----
+ for val in s:BreakpointSigns
+ exe "sign undefine debugBreakpoint" . val
+ endfor
+! let s:BreakpointSigns = []
+ endfunc
+
+ " :Break - Set a breakpoint at the cursor position.
+***************
+*** 666,674 ****
+ if !s:stopped
+ let do_continue = 1
+ if s:way == 'prompt'
+! " Need to send a signal to get the UI to listen. Strangely this is only
+! " needed once.
+! call job_stop(s:gdbjob, 'int')
+ else
+ call s:SendCommand('-exec-interrupt')
+ endif
+--- 678,684 ----
+ if !s:stopped
+ let do_continue = 1
+ if s:way == 'prompt'
+! call s:PromptInterrupt()
+ else
+ call s:SendCommand('-exec-interrupt')
+ endif
+***************
+*** 798,810 ****
+ let wid = win_getid(winnr())
+
+ if a:msg =~ '^\*stopped'
+ let s:stopped = 1
+ elseif a:msg =~ '^\*running'
+ let s:stopped = 0
+ endif
+
+- call s:GotoSourcewinOrCreateIt()
+-
+ if a:msg =~ 'fullname='
+ let fname = s:GetFullname(a:msg)
+ else
+--- 808,820 ----
+ let wid = win_getid(winnr())
+
+ if a:msg =~ '^\*stopped'
++ call ch_log('program stopped')
+ let s:stopped = 1
+ elseif a:msg =~ '^\*running'
++ call ch_log('program running')
+ let s:stopped = 0
+ endif
+
+ if a:msg =~ 'fullname='
+ let fname = s:GetFullname(a:msg)
+ else
+***************
+*** 813,818 ****
+--- 823,829 ----
+ if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
+ let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
+ if lnum =~ '^[0-9]*$'
++ call s:GotoSourcewinOrCreateIt()
+ if expand('%:p') != fnamemodify(fname, ':p')
+ if &modified
+ " TODO: find existing window
+***************
+*** 828,834 ****
+ exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC file=' . fname
+ setlocal signcolumn=yes
+ endif
+! else
+ exe 'sign unplace ' . s:pc_id
+ endif
+
+--- 839,845 ----
+ exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC file=' . fname
+ setlocal signcolumn=yes
+ endif
+! elseif !s:stopped || fname != ''
+ exe 'sign unplace ' . s:pc_id
+ endif
+
+***************
+*** 892,897 ****
+--- 903,919 ----
+ endif
+ endfunc
+
++ " Handle the debugged program starting to run.
++ " Will store the process ID in s:pid
++ func s:HandleProgramRun(msg)
++ let nr = substitute(a:msg, '.*pid="\([0-9]*\)\".*', '\1', '') + 0
++ if nr == 0
++ return
++ endif
++ let s:pid = nr
++ call ch_log('Detected process ID: ' . s:pid)
++ endfunc
++
+ " Handle a BufRead autocommand event: place any signs.
+ func s:BufRead()
+ let fname = expand('<afile>:p')
+*** ../vim-8.1.0090/src/version.c 2018-06-20 20:37:32.469561678 +0200
+--- src/version.c 2018-06-20 20:50:45.560821218 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 91,
+ /**/
+
+--
+From "know your smileys":
+ :q vi user saying, "How do I get out of this damn emacs editor?"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0092 b/data/vim/patches/8.1.0092
new file mode 100644
index 000000000..1f0c1816b
--- /dev/null
+++ b/data/vim/patches/8.1.0092
@@ -0,0 +1,47 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0072
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0092 (after 8.1.0091)
+Problem: Prompt buffer test fails.
+Solution: Set 'nomodified' before closing the window. (Ozaki Kiichi,
+ closes #3051
+Files: src/testdir/test_prompt_buffer.vim
+
+
+*** ../vim-8.1.0091/src/testdir/test_prompt_buffer.vim 2018-06-04 17:28:04.729961269 +0200
+--- src/testdir/test_prompt_buffer.vim 2018-06-21 11:27:42.514152796 +0200
+***************
+*** 24,29 ****
+--- 24,31 ----
+ call writefile([
+ \ 'func TextEntered(text)',
+ \ ' if a:text == "exit"',
++ \ ' " Reset &modified to allow the buffer to be closed.',
++ \ ' set nomodified',
+ \ ' stopinsert',
+ \ ' close',
+ \ ' else',
+*** ../vim-8.1.0091/src/version.c 2018-06-20 22:37:52.658911284 +0200
+--- src/version.c 2018-06-21 12:06:40.685403486 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 92,
+ /**/
+
+--
+From "know your smileys":
+ <<<:-{ Worf (Never smiles anyways, so he's a bad smiley)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0093 b/data/vim/patches/8.1.0093
new file mode 100644
index 000000000..95fd0ca14
--- /dev/null
+++ b/data/vim/patches/8.1.0093
@@ -0,0 +1,67 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0093
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0093
+Problem: non-MS-Windows: Cannot interrupt gdb when program is running.
+Solution: Only use debugbreak() on MS-Windows.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0092/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-20 22:37:52.658911284 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-21 20:29:09.404402756 +0200
+***************
+*** 402,413 ****
+ " Function called when pressing CTRL-C in the prompt buffer and when placing a
+ " breakpoint.
+ func s:PromptInterrupt()
+! if s:pid == 0
+! echoerr 'Cannot interrupt gdb, did not find a process ID'
+ else
+! call ch_log('Interrupting gdb')
+! " Using job_stop(s:gdbjob, 'int') does not work.
+! call debugbreak(s:pid)
+ endif
+ endfunc
+
+--- 402,418 ----
+ " Function called when pressing CTRL-C in the prompt buffer and when placing a
+ " breakpoint.
+ func s:PromptInterrupt()
+! call ch_log('Interrupting gdb')
+! if has('win32')
+! " Using job_stop() does not work on MS-Windows, need to send SIGTRAP to
+! " the debugger program so that gdb responds again.
+! if s:pid == 0
+! echoerr 'Cannot interrupt gdb, did not find a process ID'
+! else
+! call debugbreak(s:pid)
+! endif
+ else
+! call job_stop(s:gdbjob, 'int')
+ endif
+ endfunc
+
+*** ../vim-8.1.0092/src/version.c 2018-06-21 12:07:00.065296930 +0200
+--- src/version.c 2018-06-21 20:30:01.052124494 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 93,
+ /**/
+
+--
+From "know your smileys":
+ (X0||) Double hamburger with lettuce and tomato
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0094 b/data/vim/patches/8.1.0094
new file mode 100644
index 000000000..10f92d15b
--- /dev/null
+++ b/data/vim/patches/8.1.0094
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0094
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0094
+Problem: Help text "usage:" is not capatalized.
+Solution: Make it "Usage:". (closes #3044)
+Files: src/main.c
+
+
+*** ../vim-8.1.0093/src/main.c 2018-06-19 17:49:20.300015350 +0200
+--- src/main.c 2018-06-21 21:35:43.324553857 +0200
+***************
+*** 3269,3275 ****
+ #endif
+
+ mch_msg(longVersion);
+! mch_msg(_("\n\nusage:"));
+ for (i = 0; ; ++i)
+ {
+ mch_msg(_(" vim [arguments] "));
+--- 3269,3275 ----
+ #endif
+
+ mch_msg(longVersion);
+! mch_msg(_("\n\nUsage:"));
+ for (i = 0; ; ++i)
+ {
+ mch_msg(_(" vim [arguments] "));
+*** ../vim-8.1.0093/src/version.c 2018-06-21 20:31:10.627749367 +0200
+--- src/version.c 2018-06-21 21:37:57.955727830 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 94,
+ /**/
+
+--
+From "know your smileys":
+ <>:-) Bishop
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0095 b/data/vim/patches/8.1.0095
new file mode 100644
index 000000000..acb4407f1
--- /dev/null
+++ b/data/vim/patches/8.1.0095
@@ -0,0 +1,85 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0095
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0095
+Problem: Dialog for ":browse tabnew" says "new window".
+Solution: Use "new tab page". (closes #3053)
+Files: src/ex_docmd.c
+
+
+*** ../vim-8.1.0094/src/ex_docmd.c 2018-06-12 17:03:35.945611819 +0200
+--- src/ex_docmd.c 2018-06-21 22:07:23.933769249 +0200
+***************
+*** 8200,8205 ****
+--- 8200,8208 ----
+ #ifdef FEAT_BROWSE
+ int browse_flag = cmdmod.browse;
+ #endif
++ int use_tab = eap->cmdidx == CMD_tabedit
++ || eap->cmdidx == CMD_tabfind
++ || eap->cmdidx == CMD_tabnew;
+
+ #ifdef FEAT_GUI
+ need_mouse_correct = TRUE;
+***************
+*** 8248,8254 ****
+ }
+ else
+ {
+! fname = do_browse(0, (char_u *)_("Edit File in new window"),
+ eap->arg, NULL, NULL, NULL, curbuf);
+ if (fname == NULL)
+ goto theend;
+--- 8251,8259 ----
+ }
+ else
+ {
+! fname = do_browse(0, (char_u *)(use_tab
+! ? _("Edit File in new tab page")
+! : _("Edit File in new window")),
+ eap->arg, NULL, NULL, NULL, curbuf);
+ if (fname == NULL)
+ goto theend;
+***************
+*** 8261,8269 ****
+ /*
+ * Either open new tab page or split the window.
+ */
+! if (eap->cmdidx == CMD_tabedit
+! || eap->cmdidx == CMD_tabfind
+! || eap->cmdidx == CMD_tabnew)
+ {
+ if (win_new_tabpage(cmdmod.tab != 0 ? cmdmod.tab
+ : eap->addr_count == 0 ? 0
+--- 8266,8272 ----
+ /*
+ * Either open new tab page or split the window.
+ */
+! if (use_tab)
+ {
+ if (win_new_tabpage(cmdmod.tab != 0 ? cmdmod.tab
+ : eap->addr_count == 0 ? 0
+*** ../vim-8.1.0094/src/version.c 2018-06-21 21:38:29.599534681 +0200
+--- src/version.c 2018-06-21 22:08:45.513304600 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 95,
+ /**/
+
+--
+From "know your smileys":
+ +<(:-) The Pope
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0096 b/data/vim/patches/8.1.0096
new file mode 100644
index 000000000..a9658784e
--- /dev/null
+++ b/data/vim/patches/8.1.0096
@@ -0,0 +1,126 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0096
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0096
+Problem: Inconsistent use of the word autocommands.
+Solution: Don't use auto-commands or "auto commands".
+Files: src/fileio.c
+
+
+*** ../vim-8.1.0095/src/fileio.c 2018-05-22 20:35:13.562009272 +0200
+--- src/fileio.c 2018-06-22 21:26:06.200765470 +0200
+***************
+*** 8412,8430 ****
+ * will be automatically executed for <event>
+ * when editing a file matching <pat>, in
+ * the current group.
+! * :autocmd <event> <pat> Show the auto-commands associated with
+ * <event> and <pat>.
+! * :autocmd <event> Show the auto-commands associated with
+ * <event>.
+! * :autocmd Show all auto-commands.
+! * :autocmd! <event> <pat> <cmd> Remove all auto-commands associated with
+ * <event> and <pat>, and add the command
+ * <cmd>, for the current group.
+! * :autocmd! <event> <pat> Remove all auto-commands associated with
+ * <event> and <pat> for the current group.
+! * :autocmd! <event> Remove all auto-commands associated with
+ * <event> for the current group.
+! * :autocmd! Remove ALL auto-commands for the current
+ * group.
+ *
+ * Multiple events and patterns may be given separated by commas. Here are
+--- 8412,8430 ----
+ * will be automatically executed for <event>
+ * when editing a file matching <pat>, in
+ * the current group.
+! * :autocmd <event> <pat> Show the autocommands associated with
+ * <event> and <pat>.
+! * :autocmd <event> Show the autocommands associated with
+ * <event>.
+! * :autocmd Show all autocommands.
+! * :autocmd! <event> <pat> <cmd> Remove all autocommands associated with
+ * <event> and <pat>, and add the command
+ * <cmd>, for the current group.
+! * :autocmd! <event> <pat> Remove all autocommands associated with
+ * <event> and <pat> for the current group.
+! * :autocmd! <event> Remove all autocommands associated with
+ * <event> for the current group.
+! * :autocmd! Remove ALL autocommands for the current
+ * group.
+ *
+ * Multiple events and patterns may be given separated by commas. Here are
+***************
+*** 8534,8540 ****
+ if (!forceit && *cmd == NUL)
+ {
+ /* Highlight title */
+! MSG_PUTS_TITLE(_("\n--- Auto-Commands ---"));
+ }
+
+ /*
+--- 8534,8540 ----
+ if (!forceit && *cmd == NUL)
+ {
+ /* Highlight title */
+! MSG_PUTS_TITLE(_("\n--- Autocommands ---"));
+ }
+
+ /*
+***************
+*** 9602,9608 ****
+ autocmd_match = fname;
+
+
+! /* Don't redraw while doing auto commands. */
+ ++RedrawingDisabled;
+ save_sourcing_name = sourcing_name;
+ sourcing_name = NULL; /* don't free this one */
+--- 9602,9608 ----
+ autocmd_match = fname;
+
+
+! /* Don't redraw while doing autocommands. */
+ ++RedrawingDisabled;
+ save_sourcing_name = sourcing_name;
+ sourcing_name = NULL; /* don't free this one */
+***************
+*** 9855,9861 ****
+ : ap->buflocal_nr == apc->arg_bufnr)
+ {
+ name = event_nr2name(apc->event);
+! s = _("%s Auto commands for \"%s\"");
+ sourcing_name = alloc((unsigned)(STRLEN(s)
+ + STRLEN(name) + ap->patlen + 1));
+ if (sourcing_name != NULL)
+--- 9855,9861 ----
+ : ap->buflocal_nr == apc->arg_bufnr)
+ {
+ name = event_nr2name(apc->event);
+! s = _("%s Autocommands for \"%s\"");
+ sourcing_name = alloc((unsigned)(STRLEN(s)
+ + STRLEN(name) + ap->patlen + 1));
+ if (sourcing_name != NULL)
+*** ../vim-8.1.0095/src/version.c 2018-06-21 22:10:04.404854396 +0200
+--- src/version.c 2018-06-22 21:30:10.251289904 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 96,
+ /**/
+
+--
+Momento mori, ergo carpe diem
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0097 b/data/vim/patches/8.1.0097
new file mode 100644
index 000000000..f84af3bb3
--- /dev/null
+++ b/data/vim/patches/8.1.0097
@@ -0,0 +1,69 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0097
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0097
+Problem: Superfluous space before exclamation mark.
+Solution: Remove the space. Don't translate debug message.
+Files: src/regexp_nfa.c
+
+
+*** ../vim-8.1.0096/src/regexp_nfa.c 2018-06-20 20:37:32.469561678 +0200
+--- src/regexp_nfa.c 2018-06-22 21:38:58.460097521 +0200
+***************
+*** 2989,2995 ****
+ fclose(df);
+ }
+ #endif
+! EMSG(_("E874: (NFA) Could not pop the stack !"));
+ }
+
+ /*
+--- 2989,2995 ----
+ fclose(df);
+ }
+ #endif
+! EMSG(_("E874: (NFA) Could not pop the stack!"));
+ }
+
+ /*
+***************
+*** 5593,5599 ****
+ debug = fopen(NFA_REGEXP_DEBUG_LOG, "a");
+ if (debug == NULL)
+ {
+! EMSG2(_("(NFA) COULD NOT OPEN %s !"), NFA_REGEXP_DEBUG_LOG);
+ return FALSE;
+ }
+ #endif
+--- 5593,5599 ----
+ debug = fopen(NFA_REGEXP_DEBUG_LOG, "a");
+ if (debug == NULL)
+ {
+! EMSG2("(NFA) COULD NOT OPEN %s!", NFA_REGEXP_DEBUG_LOG);
+ return FALSE;
+ }
+ #endif
+*** ../vim-8.1.0096/src/version.c 2018-06-22 21:30:27.355186506 +0200
+--- src/version.c 2018-06-22 21:39:55.343753790 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 97,
+ /**/
+
+--
+I AM THANKFUL...
+...for the taxes that I pay because it means that I am employed.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0098 b/data/vim/patches/8.1.0098
new file mode 100644
index 000000000..f05b16452
--- /dev/null
+++ b/data/vim/patches/8.1.0098
@@ -0,0 +1,294 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0098
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0098
+Problem: Segfault when pattern with \z() is very slow.
+Solution: Check for NULL regprog. Add "nfa_fail" to test_override() to be
+ able to test this. Fix that 'searchhl' resets called_emsg.
+Files: src/syntax.c, runtime/doc/eval.txt, src/evalfunc.c, src/vim.h,
+ src/testdir/test_syntax.vim, src/globals.h, src/screen.c,
+ src/regexp.c, src/regexp_nfa.c
+
+
+*** ../vim-8.1.0097/src/syntax.c 2018-05-20 13:35:40.193163458 +0200
+--- src/syntax.c 2018-06-23 13:47:27.294238648 +0200
+***************
+*** 3327,3332 ****
+--- 3327,3338 ----
+ profile_start(&pt);
+ #endif
+
++ if (rmp->regprog == NULL)
++ // This can happen if a previous call to vim_regexec_multi() tried to
++ // use the NFA engine, which resulted in NFA_TOO_EXPENSIVE, and
++ // compiling the pattern with the other engine fails.
++ return FALSE;
++
+ rmp->rmm_maxcol = syn_buf->b_p_smc;
+ r = vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col,
+ #ifdef FEAT_RELTIME
+*** ../vim-8.1.0097/runtime/doc/eval.txt 2018-06-20 22:37:52.658911284 +0200
+--- runtime/doc/eval.txt 2018-06-23 13:27:43.863676347 +0200
+***************
+*** 8694,8699 ****
+--- 8694,8701 ----
+ redraw disable the redrawing() function
+ char_avail disable the char_avail() function
+ starting reset the "starting" variable, see below
++ nfa_fail makes the NFA regexp engine fail to force a
++ fallback to the old engine
+ ALL clear all overrides ({val} is not used)
+
+ "starting" is to be used when a test should behave like
+*** ../vim-8.1.0097/src/evalfunc.c 2018-06-20 22:37:52.654911306 +0200
+--- src/evalfunc.c 2018-06-23 13:29:32.603042364 +0200
+***************
+*** 13090,13099 ****
+--- 13090,13102 ----
+ save_starting = -1;
+ }
+ }
++ else if (STRCMP(name, (char_u *)"nfa_fail") == 0)
++ nfa_fail_for_testing = val;
+ else if (STRCMP(name, (char_u *)"ALL") == 0)
+ {
+ disable_char_avail_for_testing = FALSE;
+ disable_redraw_for_testing = FALSE;
++ nfa_fail_for_testing = FALSE;
+ if (save_starting >= 0)
+ {
+ starting = save_starting;
+*** ../vim-8.1.0097/src/vim.h 2018-04-30 15:12:48.000000000 +0200
+--- src/vim.h 2018-06-23 14:06:57.244449803 +0200
+***************
+*** 1013,1018 ****
+--- 1013,1019 ----
+ /* values for reg_do_extmatch */
+ # define REX_SET 1 /* to allow \z\(...\), */
+ # define REX_USE 2 /* to allow \z\1 et al. */
++ # define REX_ALL (REX_SET | REX_USE)
+ #endif
+
+ /* Return values for fullpathcmp() */
+*** ../vim-8.1.0097/src/testdir/test_syntax.vim 2018-02-24 19:33:19.000000000 +0100
+--- src/testdir/test_syntax.vim 2018-06-23 14:11:40.474945470 +0200
+***************
+*** 562,564 ****
+--- 562,576 ----
+ let $COLORFGBG = ''
+ call delete('Xtest.c')
+ endfun
++
++ " Using \z() in a region with NFA failing should not crash.
++ func Test_syn_wrong_z_one()
++ new
++ call setline(1, ['just some text', 'with foo and bar to match with'])
++ syn region FooBar start="foo\z(.*\)bar" end="\z1"
++ call test_override("nfa_fail", 1)
++ redraw!
++ redraw!
++ call test_override("ALL", 0)
++ bwipe!
++ endfunc
+*** ../vim-8.1.0097/src/globals.h 2018-06-19 17:49:20.296015375 +0200
+--- src/globals.h 2018-06-23 13:30:00.290880945 +0200
+***************
+*** 1634,1639 ****
+--- 1634,1640 ----
+ /* flags set by test_override() */
+ EXTERN int disable_char_avail_for_testing INIT(= 0);
+ EXTERN int disable_redraw_for_testing INIT(= 0);
++ EXTERN int nfa_fail_for_testing INIT(= 0);
+
+ EXTERN int in_free_unref_items INIT(= FALSE);
+ #endif
+*** ../vim-8.1.0097/src/screen.c 2018-06-17 16:23:29.341140642 +0200
+--- src/screen.c 2018-06-23 14:02:46.329754550 +0200
+***************
+*** 7868,7873 ****
+--- 7868,7874 ----
+ linenr_T l;
+ colnr_T matchcol;
+ long nmatched;
++ int save_called_emsg = called_emsg;
+
+ if (shl->lnum != 0)
+ {
+***************
+*** 7986,7991 ****
+--- 7987,7995 ----
+ break; /* useful match found */
+ }
+ }
++
++ // Restore called_emsg for assert_fails().
++ called_emsg = save_called_emsg;
+ }
+
+ /*
+*** ../vim-8.1.0097/src/regexp.c 2018-02-13 16:28:11.000000000 +0100
+--- src/regexp.c 2018-06-23 14:09:21.727692568 +0200
+***************
+*** 367,373 ****
+ static char_u e_unmatchedpar[] = N_("E55: Unmatched %s)");
+ #ifdef FEAT_SYN_HL
+ static char_u e_z_not_allowed[] = N_("E66: \\z( not allowed here");
+! static char_u e_z1_not_allowed[] = N_("E67: \\z1 et al. not allowed here");
+ #endif
+ static char_u e_missing_sb[] = N_("E69: Missing ] after %s%%[");
+ static char_u e_empty_sb[] = N_("E70: Empty %s%%[]");
+--- 367,373 ----
+ static char_u e_unmatchedpar[] = N_("E55: Unmatched %s)");
+ #ifdef FEAT_SYN_HL
+ static char_u e_z_not_allowed[] = N_("E66: \\z( not allowed here");
+! static char_u e_z1_not_allowed[] = N_("E67: \\z1 - \\z9 not allowed here");
+ #endif
+ static char_u e_missing_sb[] = N_("E69: Missing ] after %s%%[");
+ static char_u e_empty_sb[] = N_("E70: Empty %s%%[]");
+***************
+*** 2139,2145 ****
+ switch (c)
+ {
+ #ifdef FEAT_SYN_HL
+! case '(': if (reg_do_extmatch != REX_SET)
+ EMSG_RET_NULL(_(e_z_not_allowed));
+ if (one_exactly)
+ EMSG_ONE_RET_NULL;
+--- 2139,2145 ----
+ switch (c)
+ {
+ #ifdef FEAT_SYN_HL
+! case '(': if ((reg_do_extmatch & REX_SET) == 0)
+ EMSG_RET_NULL(_(e_z_not_allowed));
+ if (one_exactly)
+ EMSG_ONE_RET_NULL;
+***************
+*** 2158,2164 ****
+ case '6':
+ case '7':
+ case '8':
+! case '9': if (reg_do_extmatch != REX_USE)
+ EMSG_RET_NULL(_(e_z1_not_allowed));
+ ret = regnode(ZREF + c - '0');
+ re_has_z = REX_USE;
+--- 2158,2164 ----
+ case '6':
+ case '7':
+ case '8':
+! case '9': if ((reg_do_extmatch & REX_USE) == 0)
+ EMSG_RET_NULL(_(e_z1_not_allowed));
+ ret = regnode(ZREF + c - '0');
+ re_has_z = REX_USE;
+***************
+*** 8332,8339 ****
+
+ /*
+ * Match a regexp against multiple lines.
+! * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
+! * Note: "rmp->regprog" may be freed and changed.
+ * Uses curbuf for line count and 'iskeyword'.
+ *
+ * Return zero if there is no match. Return number of lines contained in the
+--- 8332,8339 ----
+
+ /*
+ * Match a regexp against multiple lines.
+! * "rmp->regprog" must be a compiled regexp as returned by vim_regcomp().
+! * Note: "rmp->regprog" may be freed and changed, even set to NULL.
+ * Uses curbuf for line count and 'iskeyword'.
+ *
+ * Return zero if there is no match. Return number of lines contained in the
+***************
+*** 8376,8382 ****
+--- 8376,8387 ----
+ #ifdef FEAT_EVAL
+ report_re_switch(pat);
+ #endif
++ // checking for \z misuse was already done when compiling for NFA,
++ // allow all here
++ reg_do_extmatch = REX_ALL;
+ rmp->regprog = vim_regcomp(pat, re_flags);
++ reg_do_extmatch = 0;
++
+ if (rmp->regprog != NULL)
+ result = rmp->regprog->engine->regexec_multi(
+ rmp, win, buf, lnum, col, tm, timed_out);
+*** ../vim-8.1.0097/src/regexp_nfa.c 2018-06-22 21:42:26.743455036 +0200
+--- src/regexp_nfa.c 2018-06-23 14:08:50.071858765 +0200
+***************
+*** 1482,1488 ****
+ case '8':
+ case '9':
+ /* \z1...\z9 */
+! if (reg_do_extmatch != REX_USE)
+ EMSG_RET_FAIL(_(e_z1_not_allowed));
+ EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
+ /* No need to set nfa_has_backref, the sub-matches don't
+--- 1482,1488 ----
+ case '8':
+ case '9':
+ /* \z1...\z9 */
+! if ((reg_do_extmatch & REX_USE) == 0)
+ EMSG_RET_FAIL(_(e_z1_not_allowed));
+ EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
+ /* No need to set nfa_has_backref, the sub-matches don't
+***************
+*** 1491,1497 ****
+ break;
+ case '(':
+ /* \z( */
+! if (reg_do_extmatch != REX_SET)
+ EMSG_RET_FAIL(_(e_z_not_allowed));
+ if (nfa_reg(REG_ZPAREN) == FAIL)
+ return FAIL; /* cascaded error */
+--- 1491,1497 ----
+ break;
+ case '(':
+ /* \z( */
+! if ((reg_do_extmatch & REX_SET) == 0)
+ EMSG_RET_FAIL(_(e_z_not_allowed));
+ if (nfa_reg(REG_ZPAREN) == FAIL)
+ return FAIL; /* cascaded error */
+***************
+*** 5692,5698 ****
+ nextlist->n = 0; /* clear nextlist */
+ nextlist->has_pim = FALSE;
+ ++nfa_listid;
+! if (prog->re_engine == AUTOMATIC_ENGINE && nfa_listid >= NFA_MAX_STATES)
+ {
+ /* too many states, retry with old engine */
+ nfa_match = NFA_TOO_EXPENSIVE;
+--- 5692,5699 ----
+ nextlist->n = 0; /* clear nextlist */
+ nextlist->has_pim = FALSE;
+ ++nfa_listid;
+! if (prog->re_engine == AUTOMATIC_ENGINE
+! && (nfa_listid >= NFA_MAX_STATES || nfa_fail_for_testing))
+ {
+ /* too many states, retry with old engine */
+ nfa_match = NFA_TOO_EXPENSIVE;
+*** ../vim-8.1.0097/src/version.c 2018-06-22 21:42:26.747455046 +0200
+--- src/version.c 2018-06-23 13:28:43.939326081 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 98,
+ /**/
+
+--
+I AM THANKFUL...
+...for all the complaining I hear about the government
+because it means we have freedom of speech.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0099 b/data/vim/patches/8.1.0099
new file mode 100644
index 000000000..581defc93
--- /dev/null
+++ b/data/vim/patches/8.1.0099
@@ -0,0 +1,70 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0099
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0099
+Problem: Exclamation mark in error message not needed.
+Solution: Remove the exclamation mark.
+Files: src/regexp_nfa.c
+
+
+*** ../vim-8.1.0098/src/regexp_nfa.c 2018-06-23 14:21:38.471484909 +0200
+--- src/regexp_nfa.c 2018-06-23 14:30:17.432612749 +0200
+***************
+*** 2232,2238 ****
+
+ if (re_multi_type(peekchr()) != NOT_MULTI)
+ /* Can't have a multi follow a multi. */
+! EMSG_RET_FAIL(_("E871: (NFA regexp) Can't have a multi follow a multi !"));
+
+ return OK;
+ }
+--- 2232,2238 ----
+
+ if (re_multi_type(peekchr()) != NOT_MULTI)
+ /* Can't have a multi follow a multi. */
+! EMSG_RET_FAIL(_("E871: (NFA regexp) Can't have a multi follow a multi"));
+
+ return OK;
+ }
+***************
+*** 7029,7035 ****
+ fclose(f);
+ }
+ else
+! EMSG(_("Could not open temporary log file for writing "));
+ #endif
+
+ clear_sub(&subs.norm);
+--- 7029,7035 ----
+ fclose(f);
+ }
+ else
+! EMSG("Could not open temporary log file for writing");
+ #endif
+
+ clear_sub(&subs.norm);
+*** ../vim-8.1.0098/src/version.c 2018-06-23 14:21:38.471484909 +0200
+--- src/version.c 2018-06-23 14:34:08.591348883 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 99,
+ /**/
+
+--
+I AM THANKFUL...
+...for the piles of laundry and ironing because it means I
+have plenty of clothes to wear.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0100 b/data/vim/patches/8.1.0100
new file mode 100644
index 000000000..004052329
--- /dev/null
+++ b/data/vim/patches/8.1.0100
@@ -0,0 +1,49 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0100
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0100
+Problem: Terminal debugger: error when setting a watch point.
+Solution: Don't try defining a sign for a watch point.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0099/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-21 20:31:10.627749367 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-23 13:56:49.559572378 +0200
+***************
+*** 863,868 ****
+--- 863,873 ----
+ " Handle setting a breakpoint
+ " Will update the sign that shows the breakpoint
+ func s:HandleNewBreakpoint(msg)
++ if a:msg !~ 'fullname='
++ " a watch does not have a file name
++ return
++ endif
++
+ let nr = substitute(a:msg, '.*number="\([0-9]\)*\".*', '\1', '') + 0
+ if nr == 0
+ return
+*** ../vim-8.1.0099/src/version.c 2018-06-23 14:34:24.551261826 +0200
+--- src/version.c 2018-06-23 14:35:29.442908084 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 100,
+ /**/
+
+--
+From "know your smileys":
+ [:-) Frankenstein's monster
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0101 b/data/vim/patches/8.1.0101
new file mode 100644
index 000000000..046cb6f09
--- /dev/null
+++ b/data/vim/patches/8.1.0101
@@ -0,0 +1,60 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0101
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0101
+Problem: No test for getcmdwintype().
+Solution: Add a test. (Dominique Pelle, closes #3068)
+Files: src/testdir/test_cmdline.vim
+
+
+*** ../vim-8.1.0100/src/testdir/test_cmdline.vim 2018-06-19 19:09:04.870914841 +0200
+--- src/testdir/test_cmdline.vim 2018-06-23 14:53:32.194885652 +0200
+***************
+*** 511,516 ****
+--- 511,532 ----
+ cunmap <F6>
+ endfunc
+
++ func Test_getcmdwintype()
++ call feedkeys("q/:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
++ call assert_equal('/', a)
++
++ call feedkeys("q?:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
++ call assert_equal('?', a)
++
++ call feedkeys("q::let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
++ call assert_equal(':', a)
++
++ call feedkeys(":\<C-F>:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
++ call assert_equal(':', a)
++
++ call assert_equal('', getcmdwintype())
++ endfunc
++
+ func Test_verbosefile()
+ set verbosefile=Xlog
+ echomsg 'foo'
+*** ../vim-8.1.0100/src/version.c 2018-06-23 14:36:13.778666585 +0200
+--- src/version.c 2018-06-23 14:54:30.426718329 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 101,
+ /**/
+
+--
+From "know your smileys":
+ :-E Has major dental problems
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0102 b/data/vim/patches/8.1.0102
new file mode 100644
index 000000000..c924c1a58
--- /dev/null
+++ b/data/vim/patches/8.1.0102
@@ -0,0 +1,53 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0102
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0102
+Problem: Cannot build without syntax highlighting.
+Solution: Add #ifdef around using reg_do_extmatch.
+Files: src/regexp.c
+
+
+*** ../vim-8.1.0101/src/regexp.c 2018-06-23 14:21:38.471484909 +0200
+--- src/regexp.c 2018-06-23 15:07:31.635796811 +0200
+***************
+*** 8376,8386 ****
+--- 8376,8390 ----
+ #ifdef FEAT_EVAL
+ report_re_switch(pat);
+ #endif
++ #ifdef FEAT_SYN_HL
+ // checking for \z misuse was already done when compiling for NFA,
+ // allow all here
+ reg_do_extmatch = REX_ALL;
++ #endif
+ rmp->regprog = vim_regcomp(pat, re_flags);
++ #ifdef FEAT_SYN_HL
+ reg_do_extmatch = 0;
++ #endif
+
+ if (rmp->regprog != NULL)
+ result = rmp->regprog->engine->regexec_multi(
+*** ../vim-8.1.0101/src/version.c 2018-06-23 14:55:00.146628803 +0200
+--- src/version.c 2018-06-23 15:08:14.019617869 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 102,
+ /**/
+
+--
+From "know your smileys":
+ :-| :-| Deja' vu!
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0103 b/data/vim/patches/8.1.0103
new file mode 100644
index 000000000..502f643d9
--- /dev/null
+++ b/data/vim/patches/8.1.0103
@@ -0,0 +1,195 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0103
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0103
+Problem: Long version string cannot be translated.
+Solution: Build the string in init_longVersion().
+Files: src/globals.h, src/version.h, src/version.c,
+ src/proto/version.pro, src/main.c
+
+
+*** ../vim-8.1.0102/src/globals.h 2018-06-23 14:21:38.467484932 +0200
+--- src/globals.h 2018-06-23 15:43:26.522795007 +0200
+***************
+*** 1131,1142 ****
+ EXTERN char breakat_flags[256]; /* which characters are in 'breakat' */
+ #endif
+
+! /* these are in version.c */
+ extern char *Version;
+ #if defined(HAVE_DATE_TIME) && defined(VMS) && defined(VAXC)
+ extern char longVersion[];
+ #else
+! extern char *longVersion;
+ #endif
+
+ /*
+--- 1131,1142 ----
+ EXTERN char breakat_flags[256]; /* which characters are in 'breakat' */
+ #endif
+
+! /* These are in version.c, call init_longVersion() before use. */
+ extern char *Version;
+ #if defined(HAVE_DATE_TIME) && defined(VMS) && defined(VAXC)
+ extern char longVersion[];
+ #else
+! EXTERN char *longVersion;
+ #endif
+
+ /*
+*** ../vim-8.1.0102/src/version.h 2018-05-17 13:33:02.000000000 +0200
+--- src/version.h 2018-06-23 15:35:20.481563682 +0200
+***************
+*** 36,40 ****
+ #define VIM_VERSION_NODOT "vim81"
+ #define VIM_VERSION_SHORT "8.1"
+ #define VIM_VERSION_MEDIUM "8.1"
+! #define VIM_VERSION_LONG "VIM - Vi IMproved 8.1 (2018 May 18)"
+! #define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 8.1 (2018 May 18, compiled "
+--- 36,42 ----
+ #define VIM_VERSION_NODOT "vim81"
+ #define VIM_VERSION_SHORT "8.1"
+ #define VIM_VERSION_MEDIUM "8.1"
+! #define VIM_VERSION_LONG "VIM - Vi IMproved 8.1 (2018 May 18)"
+! #define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 8.1 (2018 May 18, compiled "
+! #define VIM_VERSION_LONG_ONLY "VIM - Vi IMproved 8.1"
+! #define VIM_VERSION_DATE_ONLY "2018 May 18"
+*** ../vim-8.1.0102/src/version.c 2018-06-23 15:09:02.351412460 +0200
+--- src/version.c 2018-06-23 16:11:00.128696631 +0200
+***************
+*** 37,43 ****
+ + sizeof(__TIME__) + 3];
+
+ void
+! make_version(void)
+ {
+ /*
+ * Construct the long version string. Necessary because
+--- 37,43 ----
+ + sizeof(__TIME__) + 3];
+
+ void
+! init_longVersion(void)
+ {
+ /*
+ * Construct the long version string. Necessary because
+***************
+*** 49,56 ****
+ strcat(longVersion, __TIME__);
+ strcat(longVersion, ")");
+ }
+ # else
+! char *longVersion = VIM_VERSION_LONG_DATE __DATE__ " " __TIME__ ")";
+ # endif
+ #else
+ char *longVersion = VIM_VERSION_LONG;
+--- 49,73 ----
+ strcat(longVersion, __TIME__);
+ strcat(longVersion, ")");
+ }
++
+ # else
+! void
+! init_longVersion(void)
+! {
+! char *date_time = __DATE__ " " __TIME__;
+! char *msg = _("%s (%s, compiled %s)");
+! size_t len = strlen(msg)
+! + strlen(VIM_VERSION_LONG_ONLY)
+! + strlen(VIM_VERSION_DATE_ONLY)
+! + strlen(date_time);
+!
+! longVersion = (char *)alloc(len);
+! if (longVersion == NULL)
+! longVersion = VIM_VERSION_LONG;
+! else
+! vim_snprintf(longVersion, len, msg,
+! VIM_VERSION_LONG_ONLY, VIM_VERSION_DATE_ONLY, date_time);
+! }
+ # endif
+ #else
+ char *longVersion = VIM_VERSION_LONG;
+***************
+*** 1148,1153 ****
+--- 1167,1173 ----
+ * When adding features here, don't forget to update the list of
+ * internal variables in eval.c!
+ */
++ init_longVersion();
+ MSG(longVersion);
+ #ifdef WIN3264
+ # ifdef FEAT_GUI_W32
+*** ../vim-8.1.0102/src/proto/version.pro 2018-05-17 13:52:55.000000000 +0200
+--- src/proto/version.pro 2018-06-23 15:40:19.395834338 +0200
+***************
+*** 1,5 ****
+ /* version.c */
+! void make_version(void);
+ int highest_patch(void);
+ int has_patch(int n);
+ void ex_version(exarg_T *eap);
+--- 1,5 ----
+ /* version.c */
+! void init_longVersion(void);
+ int highest_patch(void);
+ int has_patch(int n);
+ void ex_version(exarg_T *eap);
+*** ../vim-8.1.0102/src/main.c 2018-06-21 21:38:29.599534681 +0200
+--- src/main.c 2018-06-23 15:31:50.962855677 +0200
+***************
+*** 940,949 ****
+ /* Init the table of Normal mode commands. */
+ init_normal_cmds();
+
+- #if defined(HAVE_DATE_TIME) && defined(VMS) && defined(VAXC)
+- make_version(); /* Construct the long version string. */
+- #endif
+-
+ /*
+ * Allocate space for the generic buffers (needed for set_init_1() and
+ * EMSG2()).
+--- 940,945 ----
+***************
+*** 3215,3220 ****
+--- 3211,3217 ----
+ reset_signals(); /* kill us with CTRL-C here, if you like */
+ #endif
+
++ init_longVersion();
+ mch_errmsg(longVersion);
+ mch_errmsg("\n");
+ mch_errmsg(_(main_errors[n]));
+***************
+*** 3268,3273 ****
+--- 3265,3271 ----
+ reset_signals(); /* kill us with CTRL-C here, if you like */
+ #endif
+
++ init_longVersion();
+ mch_msg(longVersion);
+ mch_msg(_("\n\nUsage:"));
+ for (i = 0; ; ++i)
+*** ../vim-8.1.0102/src/version.c 2018-06-23 15:09:02.351412460 +0200
+--- src/version.c 2018-06-23 16:11:00.128696631 +0200
+***************
+*** 763,764 ****
+--- 780,783 ----
+ { /* Add new patch number below this line */
++ /**/
++ 103,
+ /**/
+
+--
+From "know your smileys":
+ |-( Contact lenses, but has lost them
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0104 b/data/vim/patches/8.1.0104
new file mode 100644
index 000000000..ae5ab594b
--- /dev/null
+++ b/data/vim/patches/8.1.0104
@@ -0,0 +1,57 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0104
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0104
+Problem: Can't build without the +eval feature.
+Solution: Add #ifdef.
+Files: src/regexp_nfa.c
+
+
+*** ../vim-8.1.0103/src/regexp_nfa.c 2018-06-23 14:34:24.551261826 +0200
+--- src/regexp_nfa.c 2018-06-23 17:13:47.102214648 +0200
+***************
+*** 5693,5699 ****
+ nextlist->has_pim = FALSE;
+ ++nfa_listid;
+ if (prog->re_engine == AUTOMATIC_ENGINE
+! && (nfa_listid >= NFA_MAX_STATES || nfa_fail_for_testing))
+ {
+ /* too many states, retry with old engine */
+ nfa_match = NFA_TOO_EXPENSIVE;
+--- 5693,5703 ----
+ nextlist->has_pim = FALSE;
+ ++nfa_listid;
+ if (prog->re_engine == AUTOMATIC_ENGINE
+! && (nfa_listid >= NFA_MAX_STATES
+! # ifdef FEAT_EVAL
+! || nfa_fail_for_testing
+! # endif
+! ))
+ {
+ /* too many states, retry with old engine */
+ nfa_match = NFA_TOO_EXPENSIVE;
+*** ../vim-8.1.0103/src/version.c 2018-06-23 16:12:15.784258242 +0200
+--- src/version.c 2018-06-23 17:14:18.414022555 +0200
+***************
+*** 780,781 ****
+--- 780,783 ----
+ { /* Add new patch number below this line */
++ /**/
++ 104,
+ /**/
+
+--
+From "know your smileys":
+ <|-) Chinese
+ <|-( Chinese and doesn't like these kind of jokes
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0105 b/data/vim/patches/8.1.0105
new file mode 100644
index 000000000..fe689753b
--- /dev/null
+++ b/data/vim/patches/8.1.0105
@@ -0,0 +1,3397 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0105
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0105
+Problem: All tab stops are the same.
+Solution: Add the variable tabstop feature. (Christian Brabandt,
+ closes #2711)
+Files: runtime/doc/change.txt, runtime/doc/options.txt,
+ runtime/doc/various.txt, runtime/optwin.vim, src/beval.c,
+ src/beval.h, src/buffer.c, src/charset.c, src/edit.c,
+ src/evalfunc.c, src/ex_cmds.c, src/feature.h, src/gui_beval.c,
+ src/gui_w32.c, src/hardcopy.c, src/message.c, src/misc1.c,
+ src/ops.c, src/option.c, src/option.h, src/proto/misc1.pro,
+ src/proto/option.pro, src/screen.c, src/structs.h,
+ src/testdir/Make_all.mak, src/testdir/gen_opt_test.vim,
+ src/testdir/test_breakindent.vim, src/testdir/test_vartabs.vim,
+ src/version.c, src/workshop.c, src/Makefile
+
+
+*** ../vim-8.1.0104/runtime/doc/change.txt 2018-05-17 13:40:51.000000000 +0200
+--- runtime/doc/change.txt 2018-06-23 17:41:10.096366118 +0200
+***************
+*** 987,992 ****
+--- 987,997 ----
+ this (that's a good habit anyway).
+ `:retab!` may also change a sequence of spaces by
+ <Tab> characters, which can mess up a printf().
++ If the |+vartabs| feature is enabled then a list of
++ tab widths separated by commas may be used in place of
++ a single tabstop. Each value in the list represents
++ the width of one tabstop, except the final value which
++ applies to all following tabstops.
+ {not in Vi}
+
+ *retab-example*
+*** ../vim-8.1.0104/runtime/doc/options.txt 2018-06-03 14:42:17.832505129 +0200
+--- runtime/doc/options.txt 2018-06-23 17:41:10.100366093 +0200
+***************
+*** 7172,7177 ****
+--- 7172,7181 ----
+ set.
+ NOTE: This option is set to 0 when 'compatible' is set.
+
++ If Vim is compiled with the |+vartabs| feature then the value of
++ 'softtabstop' will be ignored if |'varsofttabstop'| is set to
++ anything other than an empty string.
++
+ *'spell'* *'nospell'*
+ 'spell' boolean (default off)
+ local to window
+***************
+*** 7723,7728 ****
+--- 7727,7736 ----
+ though. Otherwise aligned comments will be wrong when 'tabstop' is
+ changed.
+
++ If Vim is compiled with the |+vartabs| feature then the value of
++ 'tabstop' will be ignored if |'vartabstop'| is set to anything other
++ than an empty string.
++
+ *'tagbsearch'* *'tbs'* *'notagbsearch'* *'notbs'*
+ 'tagbsearch' 'tbs' boolean (default on)
+ global
+***************
+*** 8468,8473 ****
+--- 8476,8519 ----
+ written to disk (see |crash-recovery|). Also used for the
+ |CursorHold| autocommand event.
+
++ *'varsofttabstop'* *'vsts'*
++ 'varsofttabstop' 'vsts' string (default "")
++ local to buffer
++ {only available when compiled with the |+vartabs|
++ feature}
++ {not in Vi}
++ A list of the number of spaces that a <Tab> counts for while editing,
++ such as inserting a <Tab> or using <BS>. It "feels" like variable-
++ width <Tab>s are being inserted, while in fact a mixture of spaces
++ and <Tab>s is used. Tab widths are separated with commas, with the
++ final value applying to all subsequent tabs.
++
++ For example, when editing assembly language files where statements
++ start in the 8th column and comments in the 40th, it may be useful
++ to use the following: >
++ :set varsofttabstop=8,32,8
++ < This will set soft tabstops at the 8th and 40th columns, and at every
++ 8th column thereafter.
++
++ Note that the value of |'softtabstop'| will be ignored while
++ 'varsofttabstop' is set.
++
++ *'vartabstop'* *'vts'*
++ 'vartabstop' 'vts' string (default "")
++ local to buffer
++ {only available when compiled with the |+vartabs|
++ feature}
++ {not in Vi}
++ A list of the number of spaces that a <Tab> in the file counts for,
++ separated by commas. Each value corresponds to one tab, with the
++ final value applying to all subsequent tabs. For example: >
++ :set vartabstop=4,20,10,8
++ < This will make the first tab 4 spaces wide, the second 20 spaces,
++ the third 10 spaces, and all following tabs 8 spaces.
++
++ Note that the value of |'tabstop'| will be ignored while 'vartabstop'
++ is set.
++
+ *'verbose'* *'vbs'*
+ 'verbose' 'vbs' number (default 0)
+ global
+*** ../vim-8.1.0104/runtime/doc/various.txt 2018-05-17 13:42:04.000000000 +0200
+--- runtime/doc/various.txt 2018-06-23 17:41:10.100366093 +0200
+***************
+*** 453,458 ****
+--- 453,459 ----
+ N *+title* Setting the window 'title' and 'icon'
+ N *+toolbar* |gui-toolbar|
+ N *+user_commands* User-defined commands. |user-commands|
++ B *+vartabs* Variable-width tabstops. |'vartabstop'|
+ N *+viminfo* |'viminfo'|
+ *+vertsplit* Vertically split windows |:vsplit|; Always enabled
+ since 8.0.1118.
+*** ../vim-8.1.0104/runtime/optwin.vim 2018-05-15 21:39:18.000000000 +0200
+--- runtime/optwin.vim 2018-06-23 17:41:10.100366093 +0200
+***************
+*** 856,861 ****
+--- 856,869 ----
+ call append("$", "shiftwidth\tnumber of spaces used for each step of (auto)indent")
+ call append("$", "\t(local to buffer)")
+ call <SID>OptionL("sw")
++ if has("vartabs")
++ call append("$", "vartabstop\tlist of number of spaces a tab counts for")
++ call append("$", "\t(local to buffer)")
++ call <SID>OptionL("vts")
++ call append("$", "varsofttabstop\tlist of number of spaces a soft tabsstop counts for")
++ call append("$", "\t(local to buffer)")
++ call <SID>OptionL("vsts")
++ endif
+ call append("$", "smarttab\ta <Tab> in an indent inserts 'shiftwidth' spaces")
+ call <SID>BinOptionG("sta", &sta)
+ call append("$", "softtabstop\tif non-zero, number of spaces to insert for a <Tab>")
+*** ../vim-8.1.0104/src/beval.c 2018-02-06 22:46:29.000000000 +0100
+--- src/beval.c 2018-06-23 18:34:30.918950814 +0200
+***************
+*** 124,129 ****
+--- 124,134 ----
+ *lnump = lnum;
+ *textp = lbuf;
+ *colp = col;
++ #ifdef FEAT_VARTABS
++ if (beval->vts)
++ vim_free(beval->vts);
++ beval->vts = tabstop_copy(wp->w_buffer->b_p_vts_array);
++ #endif
+ beval->ts = wp->w_buffer->b_p_ts;
+ return OK;
+ }
+*** ../vim-8.1.0104/src/beval.h 2017-11-19 20:22:17.000000000 +0100
+--- src/beval.h 2018-06-23 18:42:21.444354814 +0200
+***************
+*** 71,77 ****
+ void *clientData; /* For callback */
+ #endif
+
+! int ts; /* tabstop setting for this buffer */
+ char_u *msg;
+ } BalloonEval;
+
+--- 71,80 ----
+ void *clientData; /* For callback */
+ #endif
+
+! int ts; // tabstop setting for this buffer
+! #ifdef FEAT_VARTABS
+! int *vts; // vartabstop setting for this buffer
+! #endif
+ char_u *msg;
+ } BalloonEval;
+
+*** ../vim-8.1.0104/src/buffer.c 2018-06-16 22:58:11.791025515 +0200
+--- src/buffer.c 2018-06-23 18:34:40.502898381 +0200
+***************
+*** 271,277 ****
+ /*
+ * Set/reset the Changed flag first, autocmds may change the buffer.
+ * Apply the automatic commands, before processing the modelines.
+! * So the modelines have priority over auto commands.
+ */
+ /* When reading stdin, the buffer contents always needs writing, so set
+ * the changed flag. Unless in readonly mode: "ls | gview -".
+--- 271,277 ----
+ /*
+ * Set/reset the Changed flag first, autocmds may change the buffer.
+ * Apply the automatic commands, before processing the modelines.
+! * So the modelines have priority over autocommands.
+ */
+ /* When reading stdin, the buffer contents always needs writing, so set
+ * the changed flag. Unless in readonly mode: "ls | gview -".
+***************
+*** 2159,2164 ****
+--- 2159,2177 ----
+ clear_string_option(&buf->b_p_fo);
+ clear_string_option(&buf->b_p_flp);
+ clear_string_option(&buf->b_p_isk);
++ #ifdef FEAT_VARTABS
++ clear_string_option(&buf->b_p_vsts);
++ if (buf->b_p_vsts_nopaste)
++ vim_free(buf->b_p_vsts_nopaste);
++ buf->b_p_vsts_nopaste = NULL;
++ if (buf->b_p_vsts_array)
++ vim_free(buf->b_p_vsts_array);
++ buf->b_p_vsts_array = NULL;
++ clear_string_option(&buf->b_p_vts);
++ if (buf->b_p_vts_array)
++ vim_free(buf->b_p_vts_array);
++ buf->b_p_vts_array = NULL;
++ #endif
+ #ifdef FEAT_KEYMAP
+ clear_string_option(&buf->b_p_keymap);
+ keymap_clear(&buf->b_kmap_ga);
+***************
+*** 5190,5196 ****
+ win_close(wp, FALSE);
+ wpnext = firstwin; /* just in case an autocommand does
+ something strange with windows */
+! tpnext = first_tabpage; /* start all over...*/
+ open_wins = 0;
+ }
+ else
+--- 5203,5209 ----
+ win_close(wp, FALSE);
+ wpnext = firstwin; /* just in case an autocommand does
+ something strange with windows */
+! tpnext = first_tabpage; /* start all over... */
+ open_wins = 0;
+ }
+ else
+***************
+*** 5650,5657 ****
+ }
+
+ /*
+! * Return TRUE if "buf" is a "nofile", "acwrite" or "terminal" buffer.
+! * This means the buffer name is not a file name.
+ */
+ int
+ bt_nofile(buf_T *buf)
+--- 5663,5670 ----
+ }
+
+ /*
+! * Return TRUE if "buf" is a "nofile", "acwrite", "terminal" or "prompt"
+! * buffer. This means the buffer name is not a file name.
+ */
+ int
+ bt_nofile(buf_T *buf)
+***************
+*** 5663,5669 ****
+ }
+
+ /*
+! * Return TRUE if "buf" is a "nowrite", "nofile" or "terminal" buffer.
+ */
+ int
+ bt_dontwrite(buf_T *buf)
+--- 5676,5683 ----
+ }
+
+ /*
+! * Return TRUE if "buf" is a "nowrite", "nofile", "terminal" or "prompt"
+! * buffer.
+ */
+ int
+ bt_dontwrite(buf_T *buf)
+*** ../vim-8.1.0104/src/charset.c 2018-06-12 17:25:32.054404315 +0200
+--- src/charset.c 2018-06-23 18:42:59.804141756 +0200
+***************
+*** 812,818 ****
+ * Also see getvcol() below.
+ */
+
+! #define RET_WIN_BUF_CHARTABSIZE(wp, buf, p, col) \
+ if (*(p) == TAB && (!(wp)->w_p_list || lcs_tab1)) \
+ { \
+ int ts; \
+--- 812,827 ----
+ * Also see getvcol() below.
+ */
+
+! #ifdef FEAT_VARTABS
+! # define RET_WIN_BUF_CHARTABSIZE(wp, buf, p, col) \
+! if (*(p) == TAB && (!(wp)->w_p_list || lcs_tab1)) \
+! { \
+! return tabstop_padding(col, (buf)->b_p_ts, (buf)->b_p_vts_array); \
+! } \
+! else \
+! return ptr2cells(p);
+! #else
+! # define RET_WIN_BUF_CHARTABSIZE(wp, buf, p, col) \
+ if (*(p) == TAB && (!(wp)->w_p_list || lcs_tab1)) \
+ { \
+ int ts; \
+***************
+*** 821,826 ****
+--- 830,836 ----
+ } \
+ else \
+ return ptr2cells(p);
++ #endif
+
+ int
+ chartabsize(char_u *p, colnr_T col)
+***************
+*** 1221,1228 ****
+--- 1231,1243 ----
+
+ if (*s == TAB && (!wp->w_p_list || lcs_tab1))
+ {
++ # ifdef FEAT_VARTABS
++ return tabstop_padding(col, wp->w_buffer->b_p_ts,
++ wp->w_buffer->b_p_vts_array);
++ # else
+ n = wp->w_buffer->b_p_ts;
+ return (int)(n - (col % n));
++ # endif
+ }
+ n = ptr2cells(s);
+ /* Add one cell for a double-width character in the last column of the
+***************
+*** 1282,1287 ****
+--- 1297,1305 ----
+ char_u *line; /* start of the line */
+ int incr;
+ int head;
++ #ifdef FEAT_VARTABS
++ int *vts = wp->w_buffer->b_p_vts_array;
++ #endif
+ int ts = wp->w_buffer->b_p_ts;
+ int c;
+
+***************
+*** 1332,1338 ****
+--- 1350,1360 ----
+ }
+ /* A tab gets expanded, depending on the current column */
+ if (c == TAB)
++ #ifdef FEAT_VARTABS
++ incr = tabstop_padding(vcol, ts, vts);
++ #else
+ incr = ts - (vcol % ts);
++ #endif
+ else
+ {
+ #ifdef FEAT_MBYTE
+*** ../vim-8.1.0104/src/edit.c 2018-06-17 19:36:30.215317108 +0200
+--- src/edit.c 2018-06-23 18:56:42.835538285 +0200
+***************
+*** 742,748 ****
+ mincol = curwin->w_wcol;
+ validate_cursor_col();
+
+! 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
+--- 742,755 ----
+ mincol = curwin->w_wcol;
+ validate_cursor_col();
+
+! if (
+! #ifdef FEAT_VARTABS
+! (int)curwin->w_wcol < mincol - tabstop_at(
+! get_nolist_virtcol(), curbuf->b_p_ts,
+! curbuf->b_p_vts_array)
+! #else
+! (int)curwin->w_wcol < mincol - curbuf->b_p_ts
+! #endif
+ && curwin->w_wrow == W_WINROW(curwin)
+ + curwin->w_height - 1 - p_so
+ && (curwin->w_cursor.lnum != curwin->w_topline
+***************
+*** 9329,9351 ****
+ */
+ if ( mode == BACKSPACE_CHAR
+ && ((p_sta && in_indent)
+! || (get_sts_value() != 0
+ && curwin->w_cursor.col > 0
+ && (*(ml_get_cursor() - 1) == TAB
+ || (*(ml_get_cursor() - 1) == ' '
+ && (!*inserted_space_p
+ || arrow_used))))))
+ {
+ int ts;
+ colnr_T vcol;
+ colnr_T want_vcol;
+ colnr_T start_vcol;
+
+ *inserted_space_p = FALSE;
+ if (p_sta && in_indent)
+ ts = (int)get_sw_value(curbuf);
+ else
+ ts = (int)get_sts_value();
+ /* Compute the virtual column where we want to be. Since
+ * 'showbreak' may get in the way, need to get the last column of
+ * the previous character. */
+--- 9336,9366 ----
+ */
+ if ( mode == BACKSPACE_CHAR
+ && ((p_sta && in_indent)
+! || ((get_sts_value() != 0
+! #ifdef FEAT_VARTABS
+! || tabstop_count(curbuf->b_p_vsts_array)
+! #endif
+! )
+ && curwin->w_cursor.col > 0
+ && (*(ml_get_cursor() - 1) == TAB
+ || (*(ml_get_cursor() - 1) == ' '
+ && (!*inserted_space_p
+ || arrow_used))))))
+ {
++ #ifndef FEAT_VARTABS
+ int ts;
++ #endif
+ colnr_T vcol;
+ colnr_T want_vcol;
+ colnr_T start_vcol;
+
+ *inserted_space_p = FALSE;
++ #ifndef FEAT_VARTABS
+ if (p_sta && in_indent)
+ ts = (int)get_sw_value(curbuf);
+ else
+ ts = (int)get_sts_value();
++ #endif
+ /* Compute the virtual column where we want to be. Since
+ * 'showbreak' may get in the way, need to get the last column of
+ * the previous character. */
+***************
+*** 9354,9360 ****
+--- 9369,9383 ----
+ dec_cursor();
+ getvcol(curwin, &curwin->w_cursor, NULL, NULL, &want_vcol);
+ inc_cursor();
++ #ifdef FEAT_VARTABS
++ if (p_sta && in_indent)
++ want_vcol = (want_vcol / curbuf->b_p_sw) * curbuf->b_p_sw;
++ else
++ want_vcol = tabstop_start(want_vcol, curbuf->b_p_sts,
++ curbuf->b_p_vsts_array);
++ #else
+ want_vcol = (want_vcol / ts) * ts;
++ #endif
+
+ /* delete characters until we are at or before want_vcol */
+ while (vcol > want_vcol
+***************
+*** 10144,10153 ****
+ #endif
+
+ /*
+! * When nothing special, insert TAB like a normal character
+ */
+ if (!curbuf->b_p_et
+ && !(p_sta && ind && curbuf->b_p_ts != get_sw_value(curbuf))
+ && get_sts_value() == 0)
+ return TRUE;
+
+--- 10167,10188 ----
+ #endif
+
+ /*
+! * When nothing special, insert TAB like a normal character.
+ */
+ if (!curbuf->b_p_et
++ #ifdef FEAT_VARTABS
++ && !(p_sta && ind
++ /* These five lines mean 'tabstop' != 'shiftwidth' */
++ && ((tabstop_count(curbuf->b_p_vts_array) > 1)
++ || (tabstop_count(curbuf->b_p_vts_array) == 1
++ && tabstop_first(curbuf->b_p_vts_array)
++ != get_sw_value(curbuf))
++ || (tabstop_count(curbuf->b_p_vts_array) == 0
++ && curbuf->b_p_ts != get_sw_value(curbuf))))
++ && tabstop_count(curbuf->b_p_vsts_array) == 0
++ #else
+ && !(p_sta && ind && curbuf->b_p_ts != get_sw_value(curbuf))
++ #endif
+ && get_sts_value() == 0)
+ return TRUE;
+
+***************
+*** 10162,10167 ****
+--- 10197,10216 ----
+ #endif
+ AppendToRedobuff((char_u *)"\t");
+
++ #ifdef FEAT_VARTABS
++ if (p_sta && ind) /* insert tab in indent, use 'shiftwidth' */
++ {
++ temp = (int)curbuf->b_p_sw;
++ temp -= get_nolist_virtcol() % temp;
++ }
++ else if (tabstop_count(curbuf->b_p_vsts_array) > 0 || curbuf->b_p_sts > 0)
++ /* use 'softtabstop' when set */
++ temp = tabstop_padding(get_nolist_virtcol(), curbuf->b_p_sts,
++ curbuf->b_p_vsts_array);
++ else /* otherwise use 'tabstop' */
++ temp = tabstop_padding(get_nolist_virtcol(), curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ if (p_sta && ind) /* insert tab in indent, use 'shiftwidth' */
+ temp = (int)get_sw_value(curbuf);
+ else if (curbuf->b_p_sts != 0) /* use 'softtabstop' when set */
+***************
+*** 10169,10174 ****
+--- 10218,10224 ----
+ else /* otherwise use 'tabstop' */
+ temp = (int)curbuf->b_p_ts;
+ temp -= get_nolist_virtcol() % temp;
++ #endif
+
+ /*
+ * Insert the first space with ins_char(). It will delete one char in
+***************
+*** 10193,10199 ****
+--- 10243,10255 ----
+ /*
+ * When 'expandtab' not set: Replace spaces by TABs where possible.
+ */
++ #ifdef FEAT_VARTABS
++ if (!curbuf->b_p_et && (tabstop_count(curbuf->b_p_vsts_array) > 0
++ || get_sts_value() > 0
++ || (p_sta && ind)))
++ #else
+ if (!curbuf->b_p_et && (get_sts_value() || (p_sta && ind)))
++ #endif
+ {
+ char_u *ptr;
+ #ifdef FEAT_VREPLACE
+*** ../vim-8.1.0104/src/evalfunc.c 2018-06-23 14:21:38.467484932 +0200
+--- src/evalfunc.c 2018-06-23 17:41:10.108366044 +0200
+***************
+*** 6436,6441 ****
+--- 6436,6444 ----
+ "user-commands", /* was accidentally included in 5.4 */
+ "user_commands",
+ #endif
++ #ifdef FEAT_VARTABS
++ "vartabs",
++ #endif
+ #ifdef FEAT_VIMINFO
+ "viminfo",
+ #endif
+*** ../vim-8.1.0104/src/ex_cmds.c 2018-06-04 20:34:07.607373577 +0200
+--- src/ex_cmds.c 2018-06-23 18:49:09.570076283 +0200
+***************
+*** 673,684 ****
+ long vcol;
+ long start_col = 0; /* For start of white-space string */
+ long start_vcol = 0; /* For start of white-space string */
+- int temp;
+ long old_len;
+ char_u *ptr;
+ char_u *new_line = (char_u *)1; /* init to non-NULL */
+ int did_undo; /* called u_save for current line */
+ int new_ts;
+ int save_list;
+ linenr_T first_line = 0; /* first changed line */
+ linenr_T last_line = 0; /* last changed line */
+--- 673,689 ----
+ long vcol;
+ long start_col = 0; /* For start of white-space string */
+ long start_vcol = 0; /* For start of white-space string */
+ long old_len;
+ char_u *ptr;
+ char_u *new_line = (char_u *)1; /* init to non-NULL */
+ int did_undo; /* called u_save for current line */
++ #ifdef FEAT_VARTABS
++ int *new_ts = 0;
++ char_u *new_ts_str; /* string value of tab argument */
++ #else
++ int temp;
+ int new_ts;
++ #endif
+ int save_list;
+ linenr_T first_line = 0; /* first changed line */
+ linenr_T last_line = 0; /* last changed line */
+***************
+*** 686,691 ****
+--- 691,713 ----
+ save_list = curwin->w_p_list;
+ curwin->w_p_list = 0; /* don't want list mode here */
+
++ #ifdef FEAT_VARTABS
++ new_ts_str = eap->arg;
++ if (!tabstop_set(eap->arg, &new_ts))
++ return;
++ while (vim_isdigit(*(eap->arg)) || *(eap->arg) == ',')
++ ++(eap->arg);
++
++ // This ensures that either new_ts and new_ts_str are freshly allocated,
++ // or new_ts points to an existing array and new_ts_str is null.
++ if (new_ts == 0)
++ {
++ new_ts = curbuf->b_p_vts_array;
++ new_ts_str = NULL;
++ }
++ else
++ new_ts_str = vim_strnsave(new_ts_str, eap->arg - new_ts_str);
++ #else
+ new_ts = getdigits(&(eap->arg));
+ if (new_ts < 0)
+ {
+***************
+*** 694,699 ****
+--- 716,722 ----
+ }
+ if (new_ts == 0)
+ new_ts = curbuf->b_p_ts;
++ #endif
+ for (lnum = eap->line1; !got_int && lnum <= eap->line2; ++lnum)
+ {
+ ptr = ml_get(lnum);
+***************
+*** 726,731 ****
+--- 749,764 ----
+ num_tabs = 0;
+ if (!curbuf->b_p_et)
+ {
++ #ifdef FEAT_VARTABS
++ int t, s;
++
++ tabstop_fromto(start_vcol, vcol,
++ tabstop_count(new_ts)? 0: curbuf->b_p_ts,
++ new_ts,
++ &t, &s);
++ num_tabs = t;
++ num_spaces = s;
++ #else
+ temp = new_ts - (start_vcol % new_ts);
+ if (num_spaces >= temp)
+ {
+***************
+*** 734,739 ****
+--- 767,773 ----
+ }
+ num_tabs += num_spaces / new_ts;
+ num_spaces -= (num_spaces / new_ts) * new_ts;
++ #endif
+ }
+ if (curbuf->b_p_et || got_tab ||
+ (num_spaces + num_tabs < len))
+***************
+*** 791,804 ****
+--- 825,877 ----
+ if (got_int)
+ EMSG(_(e_interr));
+
++ #ifdef FEAT_VARTABS
++ // If a single value was given then it can be considered equal to
++ // either the value of 'tabstop' or the value of 'vartabstop'.
++ if (tabstop_count(curbuf->b_p_vts_array) == 0
++ && tabstop_count(new_ts) == 1
++ && curbuf->b_p_ts == tabstop_first(new_ts))
++ ; /* not changed */
++ else if (tabstop_count(curbuf->b_p_vts_array) > 0
++ && tabstop_eq(curbuf->b_p_vts_array, new_ts))
++ ; /* not changed */
++ else
++ redraw_curbuf_later(NOT_VALID);
++ #else
+ if (curbuf->b_p_ts != new_ts)
+ redraw_curbuf_later(NOT_VALID);
++ #endif
+ if (first_line != 0)
+ changed_lines(first_line, 0, last_line + 1, 0L);
+
+ curwin->w_p_list = save_list; /* restore 'list' */
+
++ #ifdef FEAT_VARTABS
++ if (new_ts_str != NULL) /* set the new tabstop */
++ {
++ // If 'vartabstop' is in use or if the value given to retab has more
++ // than one tabstop then update 'vartabstop'.
++ int *old_vts_ary = curbuf->b_p_vts_array;
++
++ if (tabstop_count(old_vts_ary) > 0 || tabstop_count(new_ts) > 1)
++ {
++ set_string_option_direct((char_u *)"vts", -1, new_ts_str,
++ OPT_FREE|OPT_LOCAL, 0);
++ vim_free(new_ts_str);
++ curbuf->b_p_vts_array = new_ts;
++ vim_free(old_vts_ary);
++ }
++ else
++ {
++ // 'vartabstop' wasn't in use and a single value was given to
++ // retab then update 'tabstop'.
++ curbuf->b_p_ts = tabstop_first(new_ts);
++ vim_free(new_ts);
++ }
++ }
++ #else
+ curbuf->b_p_ts = new_ts;
++ #endif
+ coladvance(curwin->w_curswant);
+
+ u_clearline();
+*** ../vim-8.1.0104/src/feature.h 2018-03-29 15:32:30.000000000 +0200
+--- src/feature.h 2018-06-23 17:41:10.108366044 +0200
+***************
+*** 806,811 ****
+--- 806,818 ----
+ #endif
+
+ /*
++ * +vartabs 'vartabstop' and 'varsofttabstop' options.
++ */
++ #ifdef FEAT_BIG
++ # define FEAT_VARTABS
++ #endif
++
++ /*
+ * Preferences:
+ * ============
+ */
+*** ../vim-8.1.0104/src/gui_beval.c 2017-11-18 21:20:07.000000000 +0100
+--- src/gui_beval.c 2018-06-23 18:50:11.437730010 +0200
+***************
+*** 130,135 ****
+--- 130,138 ----
+ beval->msg = mesg;
+ beval->msgCB = mesgCB;
+ beval->clientData = clientData;
++ #ifdef FEAT_VARTABS
++ beval->vts = NULL;
++ #endif
+
+ /*
+ * Set up event handler which will keep its eyes on the pointer,
+***************
+*** 172,177 ****
+--- 175,184 ----
+ # else
+ XtDestroyWidget(beval->balloonShell);
+ # endif
++ # ifdef FEAT_VARTABS
++ if (beval->vts)
++ vim_free(beval->vts);
++ # endif
+ vim_free(beval);
+ }
+ #endif
+*** ../vim-8.1.0104/src/gui_w32.c 2018-06-19 14:45:33.583620880 +0200
+--- src/gui_w32.c 2018-06-23 18:50:14.853710890 +0200
+***************
+*** 8934,8939 ****
+--- 8934,8942 ----
+ beval->msg = mesg;
+ beval->msgCB = mesgCB;
+ beval->clientData = clientData;
++ #ifdef FEAT_VARTABS
++ beval->vts = NULL;
++ #endif
+
+ InitCommonControls();
+ cur_beval = beval;
+***************
+*** 8990,8995 ****
+--- 8993,9002 ----
+ void
+ gui_mch_destroy_beval_area(BalloonEval *beval)
+ {
++ #ifdef FEAT_VARTABS
++ if (beval->vts)
++ vim_free(beval->vts);
++ #endif
+ vim_free(beval);
+ }
+ #endif /* FEAT_BEVAL_GUI */
+*** ../vim-8.1.0104/src/hardcopy.c 2018-06-16 14:44:05.750081612 +0200
+--- src/hardcopy.c 2018-06-23 18:35:24.530657199 +0200
+***************
+*** 915,921 ****
+--- 915,926 ----
+ if (line[col] == TAB || tab_spaces != 0)
+ {
+ if (tab_spaces == 0)
++ #ifdef FEAT_VARTABS
++ tab_spaces = tabstop_padding(print_pos, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ tab_spaces = (int)(curbuf->b_p_ts - (print_pos % curbuf->b_p_ts));
++ #endif
+
+ while (tab_spaces > 0)
+ {
+*** ../vim-8.1.0104/src/message.c 2018-06-19 17:49:20.300015350 +0200
+--- src/message.c 2018-06-23 18:35:29.794628331 +0200
+***************
+*** 1831,1837 ****
+--- 1831,1842 ----
+ if (c == TAB && (!list || lcs_tab1))
+ {
+ /* tab amount depends on current column */
++ #ifdef FEAT_VARTABS
++ n_extra = tabstop_padding(col, curbuf->b_p_ts,
++ curbuf->b_p_vts_array) - 1;
++ #else
+ n_extra = curbuf->b_p_ts - col % curbuf->b_p_ts - 1;
++ #endif
+ if (!list)
+ {
+ c = ' ';
+*** ../vim-8.1.0104/src/misc1.c 2018-06-19 18:58:04.010489820 +0200
+--- src/misc1.c 2018-06-23 18:50:28.649633665 +0200
+***************
+*** 36,42 ****
+--- 36,47 ----
+ int
+ get_indent(void)
+ {
++ #ifdef FEAT_VARTABS
++ return get_indent_str_vtab(ml_get_curline(), (int)curbuf->b_p_ts,
++ curbuf->b_p_vts_array, FALSE);
++ #else
+ return get_indent_str(ml_get_curline(), (int)curbuf->b_p_ts, FALSE);
++ #endif
+ }
+
+ /*
+***************
+*** 45,51 ****
+--- 50,61 ----
+ int
+ get_indent_lnum(linenr_T lnum)
+ {
++ #ifdef FEAT_VARTABS
++ return get_indent_str_vtab(ml_get(lnum), (int)curbuf->b_p_ts,
++ curbuf->b_p_vts_array, FALSE);
++ #else
+ return get_indent_str(ml_get(lnum), (int)curbuf->b_p_ts, FALSE);
++ #endif
+ }
+
+ #if defined(FEAT_FOLDING) || defined(PROTO)
+***************
+*** 56,62 ****
+--- 66,77 ----
+ int
+ get_indent_buf(buf_T *buf, linenr_T lnum)
+ {
++ #ifdef FEAT_VARTABS
++ return get_indent_str_vtab(ml_get_buf(buf, lnum, FALSE),
++ (int)curbuf->b_p_ts, buf->b_p_vts_array, FALSE);
++ #else
+ return get_indent_str(ml_get_buf(buf, lnum, FALSE), (int)buf->b_p_ts, FALSE);
++ #endif
+ }
+ #endif
+
+***************
+*** 91,96 ****
+--- 106,142 ----
+ return count;
+ }
+
++ #ifdef FEAT_VARTABS
++ /*
++ * Count the size (in window cells) of the indent in line "ptr", using
++ * variable tabstops.
++ * if "list" is TRUE, count only screen size for tabs.
++ */
++ int
++ get_indent_str_vtab(char_u *ptr, int ts, int *vts, int list)
++ {
++ int count = 0;
++
++ for ( ; *ptr; ++ptr)
++ {
++ if (*ptr == TAB) /* count a tab for what it is worth */
++ {
++ if (!list || lcs_tab1)
++ count += tabstop_padding(count, ts, vts);
++ else
++ /* In list mode, when tab is not set, count screen char width
++ * for Tab, displays: ^I */
++ count += ptr2cells(ptr);
++ }
++ else if (*ptr == ' ')
++ ++count; /* count a space for one */
++ else
++ break;
++ }
++ return count;
++ }
++ #endif
++
+ /*
+ * Set the indent of the current line.
+ * Leaves the cursor on the first non-blank in the line.
+***************
+*** 115,120 ****
+--- 161,169 ----
+ int line_len;
+ int doit = FALSE;
+ int ind_done = 0; /* measured in spaces */
++ #ifdef FEAT_VARTABS
++ int ind_col = 0;
++ #endif
+ int tab_pad;
+ int retval = FALSE;
+ int orig_char_len = -1; /* number of initial whitespace chars when
+***************
+*** 147,154 ****
+--- 196,208 ----
+ {
+ if (*p == TAB)
+ {
++ #ifdef FEAT_VARTABS
++ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ tab_pad = (int)curbuf->b_p_ts
+ - (ind_done % (int)curbuf->b_p_ts);
++ #endif
+ /* stop if this tab will overshoot the target */
+ if (todo < tab_pad)
+ break;
+***************
+*** 165,187 ****
+--- 219,269 ----
+ ++p;
+ }
+
++ #ifdef FEAT_VARTABS
++ /* These diverge from this point. */
++ ind_col = ind_done;
++ #endif
+ /* Set initial number of whitespace chars to copy if we are
+ * preserving indent but expandtab is set */
+ if (curbuf->b_p_et)
+ orig_char_len = ind_len;
+
+ /* Fill to next tabstop with a tab, if possible */
++ #ifdef FEAT_VARTABS
++ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
++ #endif
+ if (todo >= tab_pad && orig_char_len == -1)
+ {
+ doit = TRUE;
+ todo -= tab_pad;
+ ++ind_len;
+ /* ind_done += tab_pad; */
++ #ifdef FEAT_VARTABS
++ ind_col += tab_pad;
++ #endif
+ }
+ }
+
+ /* count tabs required for indent */
++ #ifdef FEAT_VARTABS
++ for (;;)
++ {
++ tab_pad = tabstop_padding(ind_col, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ if (todo < tab_pad)
++ break;
++ if (*p != TAB)
++ doit = TRUE;
++ else
++ ++p;
++ todo -= tab_pad;
++ ++ind_len;
++ ind_col += tab_pad;
++ }
++ #else
+ while (todo >= (int)curbuf->b_p_ts)
+ {
+ if (*p != TAB)
+***************
+*** 192,197 ****
+--- 274,280 ----
+ ++ind_len;
+ /* ind_done += (int)curbuf->b_p_ts; */
+ }
++ #endif
+ }
+ /* count spaces required for indent */
+ while (todo > 0)
+***************
+*** 266,273 ****
+--- 349,361 ----
+ {
+ if (*p == TAB)
+ {
++ #ifdef FEAT_VARTABS
++ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ tab_pad = (int)curbuf->b_p_ts
+ - (ind_done % (int)curbuf->b_p_ts);
++ #endif
+ /* stop if this tab will overshoot the target */
+ if (todo < tab_pad)
+ break;
+***************
+*** 283,303 ****
+--- 371,412 ----
+ }
+
+ /* Fill to next tabstop with a tab, if possible */
++ #ifdef FEAT_VARTABS
++ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
++ #endif
+ if (todo >= tab_pad)
+ {
+ *s++ = TAB;
+ todo -= tab_pad;
++ #ifdef FEAT_VARTABS
++ ind_done += tab_pad;
++ #endif
+ }
+
+ p = skipwhite(p);
+ }
+
++ #ifdef FEAT_VARTABS
++ for (;;)
++ {
++ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ if (todo < tab_pad)
++ break;
++ *s++ = TAB;
++ todo -= tab_pad;
++ ind_done += tab_pad;
++ }
++ #else
+ while (todo >= (int)curbuf->b_p_ts)
+ {
+ *s++ = TAB;
+ todo -= (int)curbuf->b_p_ts;
+ }
++ #endif
+ }
+ while (todo > 0)
+ {
+***************
+*** 350,355 ****
+--- 459,467 ----
+ int tab_pad;
+ int ind_done;
+ int round;
++ #ifdef FEAT_VARTABS
++ int ind_col;
++ #endif
+
+ /* Round 1: compute the number of characters needed for the indent
+ * Round 2: copy the characters. */
+***************
+*** 358,363 ****
+--- 470,478 ----
+ todo = size;
+ ind_len = 0;
+ ind_done = 0;
++ #ifdef FEAT_VARTABS
++ ind_col = 0;
++ #endif
+ s = src;
+
+ /* Count/copy the usable portion of the source line */
+***************
+*** 365,382 ****
+--- 480,508 ----
+ {
+ if (*s == TAB)
+ {
++ #ifdef FEAT_VARTABS
++ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ tab_pad = (int)curbuf->b_p_ts
+ - (ind_done % (int)curbuf->b_p_ts);
++ #endif
+ /* Stop if this tab will overshoot the target */
+ if (todo < tab_pad)
+ break;
+ todo -= tab_pad;
+ ind_done += tab_pad;
++ #ifdef FEAT_VARTABS
++ ind_col += tab_pad;
++ #endif
+ }
+ else
+ {
+ --todo;
+ ++ind_done;
++ #ifdef FEAT_VARTABS
++ ++ind_col;
++ #endif
+ }
+ ++ind_len;
+ if (p != NULL)
+***************
+*** 385,406 ****
+ }
+
+ /* Fill to next tabstop with a tab, if possible */
+ tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
+ if (todo >= tab_pad && !curbuf->b_p_et)
+ {
+ todo -= tab_pad;
+ ++ind_len;
+ if (p != NULL)
+ *p++ = TAB;
+ }
+
+ /* Add tabs required for indent */
+! while (todo >= (int)curbuf->b_p_ts && !curbuf->b_p_et)
+ {
+! todo -= (int)curbuf->b_p_ts;
+! ++ind_len;
+! if (p != NULL)
+! *p++ = TAB;
+ }
+
+ /* Count/add spaces required for indent */
+--- 511,558 ----
+ }
+
+ /* Fill to next tabstop with a tab, if possible */
++ #ifdef FEAT_VARTABS
++ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts,
++ curbuf->b_p_vts_array);
++ #else
+ tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
++ #endif
+ if (todo >= tab_pad && !curbuf->b_p_et)
+ {
+ todo -= tab_pad;
+ ++ind_len;
++ #ifdef FEAT_VARTABS
++ ind_col += tab_pad;
++ #endif
+ if (p != NULL)
+ *p++ = TAB;
+ }
+
+ /* Add tabs required for indent */
+! if (!curbuf->b_p_et)
+ {
+! #ifdef FEAT_VARTABS
+! for (;;)
+! {
+! tab_pad = tabstop_padding(ind_col, curbuf->b_p_ts,
+! curbuf->b_p_vts_array);
+! if (todo < tab_pad)
+! break;
+! todo -= tab_pad;
+! ++ind_len;
+! ind_col += tab_pad;
+! if (p != NULL)
+! *p++ = TAB;
+! }
+! #else
+! while (todo >= (int)curbuf->b_p_ts)
+! {
+! todo -= (int)curbuf->b_p_ts;
+! ++ind_len;
+! if (p != NULL)
+! *p++ = TAB;
+! }
+! #endif
+ }
+
+ /* Count/add spaces required for indent */
+***************
+*** 497,502 ****
+--- 649,657 ----
+ static long prev_ts = 0L; /* cached tabstop value */
+ static char_u *prev_line = NULL; /* cached pointer to line */
+ static varnumber_T prev_tick = 0; /* changedtick of cached value */
++ #ifdef FEAT_VARTABS
++ static int *prev_vts = NULL; /* cached vartabs values */
++ #endif
+ int bri = 0;
+ /* window width minus window margin space, i.e. what rests for text */
+ const int eff_wwidth = wp->w_width
+***************
+*** 506,518 ****
+
+ /* used cached indent, unless pointer or 'tabstop' changed */
+ if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
+! || prev_tick != CHANGEDTICK(wp->w_buffer))
+ {
+ prev_line = line;
+ prev_ts = wp->w_buffer->b_p_ts;
+ prev_tick = CHANGEDTICK(wp->w_buffer);
+ prev_indent = get_indent_str(line,
+ (int)wp->w_buffer->b_p_ts, wp->w_p_list);
+ }
+ bri = prev_indent + wp->w_p_brishift;
+
+--- 661,684 ----
+
+ /* used cached indent, unless pointer or 'tabstop' changed */
+ if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
+! || prev_tick != CHANGEDTICK(wp->w_buffer)
+! #ifdef FEAT_VARTABS
+! || prev_vts != wp->w_buffer->b_p_vts_array
+! #endif
+! )
+ {
+ prev_line = line;
+ prev_ts = wp->w_buffer->b_p_ts;
+ prev_tick = CHANGEDTICK(wp->w_buffer);
++ #ifdef FEAT_VARTABS
++ prev_vts = wp->w_buffer->b_p_vts_array;
++ prev_indent = get_indent_str_vtab(line,
++ (int)wp->w_buffer->b_p_ts,
++ wp->w_buffer->b_p_vts_array, wp->w_p_list);
++ #else
+ prev_indent = get_indent_str(line,
+ (int)wp->w_buffer->b_p_ts, wp->w_p_list);
++ #endif
+ }
+ bri = prev_indent + wp->w_p_brishift;
+
+***************
+*** 741,747 ****
+--- 907,918 ----
+ /*
+ * count white space on current line
+ */
++ #ifdef FEAT_VARTABS
++ newindent = get_indent_str_vtab(saved_line, curbuf->b_p_ts,
++ curbuf->b_p_vts_array, FALSE);
++ #else
+ newindent = get_indent_str(saved_line, (int)curbuf->b_p_ts, FALSE);
++ #endif
+ if (newindent == 0 && !(flags & OPENLINE_COM_LIST))
+ newindent = second_line_indent; /* for ^^D command in insert mode */
+
+***************
+*** 1264,1270 ****
+ || do_si
+ #endif
+ )
+! newindent = get_indent_str(leader, (int)curbuf->b_p_ts, FALSE);
+
+ /* Add the indent offset */
+ if (newindent + off < 0)
+--- 1435,1447 ----
+ || do_si
+ #endif
+ )
+! #ifdef FEAT_VARTABS
+! newindent = get_indent_str_vtab(leader, curbuf->b_p_ts,
+! curbuf->b_p_vts_array, FALSE);
+! #else
+! newindent = get_indent_str(leader,
+! (int)curbuf->b_p_ts, FALSE);
+! #endif
+
+ /* Add the indent offset */
+ if (newindent + off < 0)
+*** ../vim-8.1.0104/src/ops.c 2018-06-03 14:42:17.844505109 +0200
+--- src/ops.c 2018-06-23 18:36:27.566311089 +0200
+***************
+*** 398,403 ****
+--- 398,406 ----
+ char_u *newp, *oldp;
+ int oldcol = curwin->w_cursor.col;
+ int p_sw = (int)get_sw_value(curbuf);
++ #ifdef FEAT_VARTABS
++ int *p_vts = curbuf->b_p_vts_array;
++ #endif
+ int p_ts = (int)curbuf->b_p_ts;
+ struct block_def bd;
+ int incr;
+***************
+*** 459,470 ****
+--- 462,480 ----
+ }
+ /* OK, now total=all the VWS reqd, and textstart points at the 1st
+ * non-ws char in the block. */
++ #ifdef FEAT_VARTABS
++ if (!curbuf->b_p_et)
++ tabstop_fromto(ws_vcol, ws_vcol + total, p_ts, p_vts, &i, &j);
++ else
++ j = total;
++ #else
+ if (!curbuf->b_p_et)
+ i = ((ws_vcol % p_ts) + total) / p_ts; /* number of tabs */
+ if (i)
+ j = ((ws_vcol % p_ts) + total) % p_ts; /* number of spp */
+ else
+ j = total;
++ #endif
+ /* if we're splitting a TAB, allow for it */
+ bd.textcol -= bd.pre_whitesp_c - (bd.startspaces != 0);
+ len = (int)STRLEN(bd.textstart) + 1;
+***************
+*** 3697,3706 ****
+--- 3707,3725 ----
+ {
+ /* Don't need to insert spaces when "p" on the last position of a
+ * tab or "P" on the first position. */
++ #ifdef FEAT_VARTABS
++ int viscol = getviscol();
++ if (dir == FORWARD
++ ? tabstop_padding(viscol, curbuf->b_p_ts,
++ curbuf->b_p_vts_array) != 1
++ : curwin->w_cursor.coladd > 0)
++ coladvance_force(viscol);
++ #else
+ if (dir == FORWARD
+ ? (int)curwin->w_cursor.coladd < curbuf->b_p_ts - 1
+ : curwin->w_cursor.coladd > 0)
+ coladvance_force(getviscol());
++ #endif
+ else
+ curwin->w_cursor.coladd = 0;
+ }
+*** ../vim-8.1.0104/src/option.c 2018-06-17 19:08:26.472323943 +0200
+--- src/option.c 2018-06-23 18:53:46.500525908 +0200
+***************
+*** 182,187 ****
+--- 182,191 ----
+ # define PV_UDF OPT_BUF(BV_UDF)
+ #endif
+ #define PV_WM OPT_BUF(BV_WM)
++ #ifdef FEAT_VARTABS
++ # define PV_VSTS OPT_BUF(BV_VSTS)
++ # define PV_VTS OPT_BUF(BV_VTS)
++ #endif
+
+ /*
+ * Definition of the PV_ values for window-local options.
+***************
+*** 371,376 ****
+--- 375,384 ----
+ static int p_udf;
+ #endif
+ static long p_wm;
++ #ifdef FEAT_VARTABS
++ static char_u *p_vsts;
++ static char_u *p_vts;
++ #endif
+ #ifdef FEAT_KEYMAP
+ static char_u *p_keymap;
+ #endif
+***************
+*** 390,395 ****
+--- 398,406 ----
+ static long p_sts_nopaste;
+ static long p_tw_nopaste;
+ static long p_wm_nopaste;
++ #ifdef FEAT_VARTABS
++ static char_u *p_vsts_nopaste;
++ #endif
+
+ struct vimoption
+ {
+***************
+*** 2925,2930 ****
+--- 2936,2959 ----
+ {"updatetime", "ut", P_NUM|P_VI_DEF,
+ (char_u *)&p_ut, PV_NONE,
+ {(char_u *)4000L, (char_u *)0L} SCRIPTID_INIT},
++ {"varsofttabstop", "vsts", P_STRING|P_VI_DEF|P_VIM|P_COMMA,
++ #ifdef FEAT_VARTABS
++ (char_u *)&p_vsts, PV_VSTS,
++ {(char_u *)"", (char_u *)0L}
++ #else
++ (char_u *)NULL, PV_NONE,
++ {(char_u *)"", (char_u *)NULL}
++ #endif
++ SCRIPTID_INIT},
++ {"vartabstop", "vts", P_STRING|P_VI_DEF|P_VIM|P_RBUF|P_COMMA,
++ #ifdef FEAT_VARTABS
++ (char_u *)&p_vts, PV_VTS,
++ {(char_u *)"", (char_u *)0L}
++ #else
++ (char_u *)NULL, PV_NONE,
++ {(char_u *)"", (char_u *)NULL}
++ #endif
++ SCRIPTID_INIT},
+ {"verbose", "vbs", P_NUM|P_VI_DEF,
+ (char_u *)&p_verbose, PV_NONE,
+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+***************
+*** 5608,5613 ****
+--- 5637,5646 ----
+ /* Parse default for 'clipboard' */
+ (void)check_clipboard_option();
+ #endif
++ #ifdef FEAT_VARTABS
++ tabstop_set(curbuf->b_p_vsts, &curbuf->b_p_vsts_array);
++ tabstop_set(curbuf->b_p_vts, &curbuf->b_p_vts_array);
++ #endif
+ }
+
+ /*
+***************
+*** 5725,5730 ****
+--- 5758,5767 ----
+ #ifdef FEAT_MBYTE
+ check_string_option(&buf->b_p_menc);
+ #endif
++ #ifdef FEAT_VARTABS
++ check_string_option(&buf->b_p_vsts);
++ check_string_option(&buf->b_p_vts);
++ #endif
+ }
+
+ /*
+***************
+*** 7472,7477 ****
+--- 7509,7596 ----
+ }
+ #endif
+
++ #ifdef FEAT_VARTABS
++ /* 'varsofttabstop' */
++ else if (varp == &(curbuf->b_p_vsts))
++ {
++ char_u *cp;
++
++ if (!(*varp)[0] || ((*varp)[0] == '0' && !(*varp)[1]))
++ {
++ if (curbuf->b_p_vsts_array)
++ {
++ vim_free(curbuf->b_p_vsts_array);
++ curbuf->b_p_vsts_array = 0;
++ }
++ }
++ else
++ {
++ for (cp = *varp; *cp; ++cp)
++ {
++ if (vim_isdigit(*cp))
++ continue;
++ if (*cp == ',' && cp > *varp && *(cp-1) != ',')
++ continue;
++ errmsg = e_invarg;
++ break;
++ }
++ if (errmsg == NULL)
++ {
++ int *oldarray = curbuf->b_p_vsts_array;
++ if (tabstop_set(*varp, &(curbuf->b_p_vsts_array)))
++ {
++ if (oldarray)
++ vim_free(oldarray);
++ }
++ else
++ errmsg = e_invarg;
++ }
++ }
++ }
++
++ /* 'vartabstop' */
++ else if (varp == &(curbuf->b_p_vts))
++ {
++ char_u *cp;
++
++ if (!(*varp)[0] || ((*varp)[0] == '0' && !(*varp)[1]))
++ {
++ if (curbuf->b_p_vts_array)
++ {
++ vim_free(curbuf->b_p_vts_array);
++ curbuf->b_p_vts_array = NULL;
++ }
++ }
++ else
++ {
++ for (cp = *varp; *cp; ++cp)
++ {
++ if (vim_isdigit(*cp))
++ continue;
++ if (*cp == ',' && cp > *varp && *(cp-1) != ',')
++ continue;
++ errmsg = e_invarg;
++ break;
++ }
++ if (errmsg == NULL)
++ {
++ int *oldarray = curbuf->b_p_vts_array;
++ if (tabstop_set(*varp, &(curbuf->b_p_vts_array)))
++ {
++ if (oldarray)
++ vim_free(oldarray);
++ #ifdef FEAT_FOLDING
++ if (foldmethodIsIndent(curwin))
++ foldUpdateAll(curwin);
++ #endif /* FEAT_FOLDING */
++ }
++ else
++ errmsg = e_invarg;
++ }
++ }
++ }
++ #endif
++
+ /* Options that are a list of flags. */
+ else
+ {
+***************
+*** 8780,8786 ****
+--- 8899,8912 ----
+ if (curbuf->b_p_sw < 0)
+ {
+ errmsg = e_positive;
++ #ifdef FEAT_VARTABS
++ // Use the first 'vartabstop' value, or 'tabstop' if vts isn't in use.
++ curbuf->b_p_sw = tabstop_count(curbuf->b_p_vts_array) > 0
++ ? tabstop_first(curbuf->b_p_vts_array)
++ : curbuf->b_p_ts;
++ #else
+ curbuf->b_p_sw = curbuf->b_p_ts;
++ #endif
+ }
+
+ /*
+***************
+*** 10814,10819 ****
+--- 10940,10949 ----
+ #ifdef FEAT_SIGNS
+ case PV_SCL: return (char_u *)&(curwin->w_p_scl);
+ #endif
++ #ifdef FEAT_VARTABS
++ case PV_VSTS: return (char_u *)&(curbuf->b_p_vsts);
++ case PV_VTS: return (char_u *)&(curbuf->b_p_vts);
++ #endif
+ default: IEMSG(_("E356: get_varp ERROR"));
+ }
+ /* always return a valid pointer to avoid a crash! */
+***************
+*** 11138,11143 ****
+--- 11268,11282 ----
+ #endif
+ buf->b_p_sts = p_sts;
+ buf->b_p_sts_nopaste = p_sts_nopaste;
++ #ifdef FEAT_VARTABS
++ buf->b_p_vsts = vim_strsave(p_vsts);
++ if (p_vsts && p_vsts != empty_option)
++ tabstop_set(p_vsts, &buf->b_p_vsts_array);
++ else
++ buf->b_p_vsts_array = 0;
++ buf->b_p_vsts_nopaste = p_vsts_nopaste
++ ? vim_strsave(p_vsts_nopaste) : NULL;
++ #endif
+ buf->b_p_sn = p_sn;
+ #ifdef FEAT_COMMENTS
+ buf->b_p_com = vim_strsave(p_com);
+***************
+*** 11259,11270 ****
+--- 11398,11424 ----
+ * or to a help buffer.
+ */
+ if (dont_do_help)
++ {
+ buf->b_p_isk = save_p_isk;
++ #ifdef FEAT_VARTABS
++ if (p_vts && p_vts != empty_option && !buf->b_p_vts_array)
++ tabstop_set(p_vts, &buf->b_p_vts_array);
++ else
++ buf->b_p_vts_array = NULL;
++ #endif
++ }
+ else
+ {
+ buf->b_p_isk = vim_strsave(p_isk);
+ did_isk = TRUE;
+ buf->b_p_ts = p_ts;
++ #ifdef FEAT_VARTABS
++ buf->b_p_vts = vim_strsave(p_vts);
++ if (p_vts && p_vts != empty_option && !buf->b_p_vts_array)
++ tabstop_set(p_vts, &buf->b_p_vts_array);
++ else
++ buf->b_p_vts_array = NULL;
++ #endif
+ buf->b_help = FALSE;
+ if (buf->b_p_bt[0] == 'h')
+ clear_string_option(&buf->b_p_bt);
+***************
+*** 12084,12089 ****
+--- 12238,12249 ----
+ buf->b_p_sts_nopaste = buf->b_p_sts;
+ buf->b_p_ai_nopaste = buf->b_p_ai;
+ buf->b_p_et_nopaste = buf->b_p_et;
++ #ifdef FEAT_VARTABS
++ if (buf->b_p_vsts_nopaste)
++ vim_free(buf->b_p_vsts_nopaste);
++ buf->b_p_vsts_nopaste = buf->b_p_vsts && buf->b_p_vsts != empty_option
++ ? vim_strsave(buf->b_p_vsts) : NULL;
++ #endif
+ }
+
+ /* save global options */
+***************
+*** 12102,12107 ****
+--- 12262,12272 ----
+ p_sts_nopaste = p_sts;
+ p_tw_nopaste = p_tw;
+ p_wm_nopaste = p_wm;
++ #ifdef FEAT_VARTABS
++ if (p_vsts_nopaste)
++ vim_free(p_vsts_nopaste);
++ p_vsts_nopaste = p_vsts && p_vsts != empty_option ? vim_strsave(p_vsts) : NULL;
++ #endif
+ }
+
+ /*
+***************
+*** 12116,12121 ****
+--- 12281,12294 ----
+ buf->b_p_sts = 0; /* softtabstop is 0 */
+ buf->b_p_ai = 0; /* no auto-indent */
+ buf->b_p_et = 0; /* no expandtab */
++ #ifdef FEAT_VARTABS
++ if (buf->b_p_vsts)
++ free_string_option(buf->b_p_vsts);
++ buf->b_p_vsts = empty_option;
++ if (buf->b_p_vsts_array)
++ vim_free(buf->b_p_vsts_array);
++ buf->b_p_vsts_array = 0;
++ #endif
+ }
+
+ /* set global options */
+***************
+*** 12135,12140 ****
+--- 12308,12318 ----
+ p_wm = 0;
+ p_sts = 0;
+ p_ai = 0;
++ #ifdef FEAT_VARTABS
++ if (p_vsts)
++ free_string_option(p_vsts);
++ p_vsts = empty_option;
++ #endif
+ }
+
+ /*
+***************
+*** 12150,12155 ****
+--- 12328,12345 ----
+ buf->b_p_sts = buf->b_p_sts_nopaste;
+ buf->b_p_ai = buf->b_p_ai_nopaste;
+ buf->b_p_et = buf->b_p_et_nopaste;
++ #ifdef FEAT_VARTABS
++ if (buf->b_p_vsts)
++ free_string_option(buf->b_p_vsts);
++ buf->b_p_vsts = buf->b_p_vsts_nopaste
++ ? vim_strsave(buf->b_p_vsts_nopaste) : empty_option;
++ if (buf->b_p_vsts_array)
++ vim_free(buf->b_p_vsts_array);
++ if (buf->b_p_vsts && buf->b_p_vsts != empty_option)
++ tabstop_set(buf->b_p_vsts, &buf->b_p_vsts_array);
++ else
++ buf->b_p_vsts_array = 0;
++ #endif
+ }
+
+ /* restore global options */
+***************
+*** 12170,12175 ****
+--- 12360,12370 ----
+ p_sts = p_sts_nopaste;
+ p_tw = p_tw_nopaste;
+ p_wm = p_wm_nopaste;
++ #ifdef FEAT_VARTABS
++ if (p_vsts)
++ free_string_option(p_vsts);
++ p_vsts = p_vsts_nopaste ? vim_strsave(p_vsts_nopaste) : empty_option;
++ #endif
+ }
+
+ old_p_paste = p_paste;
+***************
+*** 12510,12515 ****
+--- 12705,12999 ----
+ return check_opt_strings(p, p_ff_values, FALSE);
+ }
+
++ #ifdef FEAT_VARTABS
++
++ /*
++ * Set the integer values corresponding to the string setting of 'vartabstop'.
++ */
++ int
++ tabstop_set(char_u *var, int **array)
++ {
++ int valcount = 1;
++ int t;
++ char_u *cp;
++
++ if ((!var[0] || (var[0] == '0' && !var[1])))
++ {
++ *array = NULL;
++ return TRUE;
++ }
++
++ for (cp = var; *cp; ++cp)
++ {
++ if (cp == var || *(cp - 1) == ',')
++ {
++ char_u *end;
++ if (strtol((char *)cp, (char **)&end, 10) <= 0)
++ {
++ if (cp != end)
++ EMSG(_(e_positive));
++ else
++ EMSG(_(e_invarg));
++ return FALSE;
++ }
++ }
++
++ if (VIM_ISDIGIT(*cp))
++ continue;
++ if (*cp == ',' && cp > var && *(cp - 1) != ',')
++ {
++ ++valcount;
++ continue;
++ }
++ EMSG(_(e_invarg));
++ return FALSE;
++ }
++
++ *array = (int *) alloc((unsigned) ((valcount + 1) * sizeof(int)));
++ (*array)[0] = valcount;
++
++ t = 1;
++ for (cp = var; *cp;)
++ {
++ (*array)[t++] = atoi((char *)cp);
++ while (*cp && *cp != ',')
++ ++cp;
++ if (*cp)
++ ++cp;
++ }
++
++ return TRUE;
++ }
++
++ /*
++ * Calculate the number of screen spaces a tab will occupy.
++ * If "vts" is set then the tab widths are taken from that array,
++ * otherwise the value of ts is used.
++ */
++ int
++ tabstop_padding(colnr_T col, int ts_arg, int *vts)
++ {
++ int ts = ts_arg == 0 ? 8 : ts_arg;
++ int tabcount;
++ colnr_T tabcol = 0;
++ int t;
++ int padding = 0;
++
++ if (vts == NULL || vts[0] == 0)
++ return ts - (col % ts);
++
++ tabcount = vts[0];
++
++ for (t = 1; t <= tabcount; ++t)
++ {
++ tabcol += vts[t];
++ if (tabcol > col)
++ {
++ padding = (int)(tabcol - col);
++ break;
++ }
++ }
++ if (t > tabcount)
++ padding = vts[tabcount] - (int)((col - tabcol) % vts[tabcount]);
++
++ return padding;
++ }
++
++ /*
++ * Find the size of the tab that covers a particular column.
++ */
++ int
++ tabstop_at(colnr_T col, int ts, int *vts)
++ {
++ int tabcount;
++ colnr_T tabcol = 0;
++ int t;
++ int tab_size = 0;
++
++ if (vts == 0 || vts[0] == 0)
++ return ts;
++
++ tabcount = vts[0];
++ for (t = 1; t <= tabcount; ++t)
++ {
++ tabcol += vts[t];
++ if (tabcol > col)
++ {
++ tab_size = vts[t];
++ break;
++ }
++ }
++ if (t > tabcount)
++ tab_size = vts[tabcount];
++
++ return tab_size;
++ }
++
++ /*
++ * Find the column on which a tab starts.
++ */
++ colnr_T
++ tabstop_start(colnr_T col, int ts, int *vts)
++ {
++ int tabcount;
++ colnr_T tabcol = 0;
++ int t;
++ int excess;
++
++ if (vts == 0 || vts[0] == 0)
++ return (col / ts) * ts;
++
++ tabcount = vts[0];
++ for (t = 1; t <= tabcount; ++t)
++ {
++ tabcol += vts[t];
++ if (tabcol > col)
++ return tabcol - vts[t];
++ }
++
++ excess = tabcol % vts[tabcount];
++ return excess + ((col - excess) / vts[tabcount]) * vts[tabcount];
++ }
++
++ /*
++ * Find the number of tabs and spaces necessary to get from one column
++ * to another.
++ */
++ void
++ tabstop_fromto(
++ colnr_T start_col,
++ colnr_T end_col,
++ int ts,
++ int *vts,
++ int *ntabs,
++ int *nspcs)
++ {
++ int spaces = end_col - start_col;
++ colnr_T tabcol = 0;
++ int padding = 0;
++ int tabcount;
++ int t;
++
++ if (vts == 0 || vts[0] == 0)
++ {
++ int tabs = 0;
++ int initspc = ts - (start_col % ts);
++ if (spaces >= initspc)
++ {
++ spaces -= initspc;
++ tabs++;
++ }
++ tabs += spaces / ts;
++ spaces -= (spaces / ts) * ts;
++
++ *ntabs = tabs;
++ *nspcs = spaces;
++ return;
++ }
++
++ /* Find the padding needed to reach the next tabstop. */
++ tabcount = vts[0];
++ for (t = 1; t <= tabcount; ++t)
++ {
++ tabcol += vts[t];
++ if (tabcol > start_col)
++ {
++ padding = (int)(tabcol - start_col);
++ break;
++ }
++ }
++ if (t > tabcount)
++ padding = vts[tabcount] - (int)((start_col - tabcol) % vts[tabcount]);
++
++ /* If the space needed is less than the padding no tabs can be used. */
++ if (spaces < padding)
++ {
++ *ntabs = 0;
++ *nspcs = spaces;
++ return;
++ }
++
++ *ntabs = 1;
++ spaces -= padding;
++
++ /* At least one tab has been used. See if any more will fit. */
++ while (spaces != 0 && ++t <= tabcount)
++ {
++ padding = vts[t];
++ if (spaces < padding)
++ {
++ *nspcs = spaces;
++ return;
++ }
++ ++*ntabs;
++ spaces -= padding;
++ }
++
++ *ntabs += spaces / vts[tabcount];
++ *nspcs = spaces % vts[tabcount];
++ }
++
++ /*
++ * See if two tabstop arrays contain the same values.
++ */
++ int
++ tabstop_eq(int *ts1, int *ts2)
++ {
++ int t;
++
++ if ((ts1 == 0 && ts2) || (ts1 && ts2 == 0))
++ return FALSE;
++ if (ts1 == ts2)
++ return TRUE;
++ if (ts1[0] != ts2[0])
++ return FALSE;
++
++ for (t = 1; t <= ts1[0]; ++t)
++ if (ts1[t] != ts2[t])
++ return FALSE;
++
++ return TRUE;
++ }
++
++ /*
++ * Copy a tabstop array, allocating space for the new array.
++ */
++ int *
++ tabstop_copy(int *oldts)
++ {
++ int *newts;
++ int t;
++
++ if (oldts == 0)
++ return 0;
++
++ newts = (int *) alloc((unsigned) ((oldts[0] + 1) * sizeof(int)));
++ for (t = 0; t <= oldts[0]; ++t)
++ newts[t] = oldts[t];
++
++ return newts;
++ }
++
++ /*
++ * Return a count of the number of tabstops.
++ */
++ int
++ tabstop_count(int *ts)
++ {
++ return ts != NULL ? ts[0] : 0;
++ }
++
++ /*
++ * Return the first tabstop, or 8 if there are no tabstops defined.
++ */
++ int
++ tabstop_first(int *ts)
++ {
++ return ts != NULL ? ts[1] : 8;
++ }
++
++ #endif
++
+ /*
+ * Return the effective shiftwidth value for current buffer, using the
+ * 'tabstop' value when 'shiftwidth' is zero.
+*** ../vim-8.1.0104/src/option.h 2018-05-05 16:28:11.000000000 +0200
+--- src/option.h 2018-06-23 17:41:10.116365995 +0200
+***************
+*** 1114,1119 ****
+--- 1114,1123 ----
+ #ifdef FEAT_TERMINAL
+ , BV_TWSL
+ #endif
++ #ifdef FEAT_VARTABS
++ , BV_VSTS
++ , BV_VTS
++ #endif
+ , BV_COUNT /* must be the last one */
+ };
+
+*** ../vim-8.1.0104/src/proto/misc1.pro 2018-05-17 13:52:45.000000000 +0200
+--- src/proto/misc1.pro 2018-06-23 18:20:45.471296904 +0200
+***************
+*** 3,8 ****
+--- 3,9 ----
+ int get_indent_lnum(linenr_T lnum);
+ int get_indent_buf(buf_T *buf, linenr_T lnum);
+ int get_indent_str(char_u *ptr, int ts, int list);
++ int get_indent_str_vtab(char_u *ptr, int ts, int *vts, int list);
+ int set_indent(int size, int flags);
+ int get_number_indent(linenr_T lnum);
+ int get_breakindent_win(win_T *wp, char_u *line);
+*** ../vim-8.1.0104/src/proto/option.pro 2018-05-17 13:52:47.000000000 +0200
+--- src/proto/option.pro 2018-06-23 18:38:40.189580238 +0200
+***************
+*** 60,65 ****
+--- 60,74 ----
+ void save_file_ff(buf_T *buf);
+ int file_ff_differs(buf_T *buf, int ignore_empty);
+ int check_ff_value(char_u *p);
++ int tabstop_set(char_u *var, int **array);
++ int tabstop_padding(colnr_T col, int ts_arg, int *vts);
++ int tabstop_at(colnr_T col, int ts, int *vts);
++ colnr_T tabstop_start(colnr_T col, int ts, int *vts);
++ void tabstop_fromto(colnr_T start_col, colnr_T end_col, int ts, int *vts, int *ntabs, int *nspcs);
++ int tabstop_eq(int *ts1, int *ts2);
++ int *tabstop_copy(int *oldts);
++ int tabstop_count(int *ts);
++ int tabstop_first(int *ts);
+ long get_sw_value(buf_T *buf);
+ long get_sts_value(void);
+ void find_mps_values(int *initc, int *findc, int *backwards, int switchit);
+*** ../vim-8.1.0104/src/screen.c 2018-06-23 14:21:38.467484932 +0200
+--- src/screen.c 2018-06-23 18:36:56.702150819 +0200
+***************
+*** 4848,4855 ****
+ vcol_adjusted = vcol - MB_CHARLEN(p_sbr);
+ #endif
+ /* tab amount depends on current column */
+ tab_len = (int)wp->w_buffer->b_p_ts
+! - vcol_adjusted % (int)wp->w_buffer->b_p_ts - 1;
+
+ #ifdef FEAT_LINEBREAK
+ if (!wp->w_p_lbr || !wp->w_p_list)
+--- 4848,4861 ----
+ vcol_adjusted = vcol - MB_CHARLEN(p_sbr);
+ #endif
+ /* tab amount depends on current column */
++ #ifdef FEAT_VARTABS
++ tab_len = tabstop_padding(vcol_adjusted,
++ wp->w_buffer->b_p_ts,
++ wp->w_buffer->b_p_vts_array) - 1;
++ #else
+ tab_len = (int)wp->w_buffer->b_p_ts
+! - vcol_adjusted % (int)wp->w_buffer->b_p_ts - 1;
+! #endif
+
+ #ifdef FEAT_LINEBREAK
+ if (!wp->w_p_lbr || !wp->w_p_list)
+*** ../vim-8.1.0104/src/structs.h 2018-06-17 20:10:36.208066158 +0200
+--- src/structs.h 2018-06-23 18:39:12.357402504 +0200
+***************
+*** 2236,2241 ****
+--- 2236,2248 ----
+ long b_p_wm; /* 'wrapmargin' */
+ long b_p_wm_nobin; /* b_p_wm saved for binary mode */
+ long b_p_wm_nopaste; /* b_p_wm saved for paste mode */
++ #ifdef FEAT_VARTABS
++ char_u *b_p_vsts; /* 'varsofttabstop' */
++ int *b_p_vsts_array; /* 'varsofttabstop' in internal format */
++ char_u *b_p_vsts_nopaste; /* b_p_vsts saved for paste mode */
++ char_u *b_p_vts; /* 'vartabstop' */
++ int *b_p_vts_array; /* 'vartabstop' in internal format */
++ #endif
+ #ifdef FEAT_KEYMAP
+ char_u *b_p_keymap; /* 'keymap' */
+ #endif
+*** ../vim-8.1.0104/src/testdir/Make_all.mak 2018-06-03 14:42:17.848505102 +0200
+--- src/testdir/Make_all.mak 2018-06-23 17:41:10.116365995 +0200
+***************
+*** 147,154 ****
+ test_perl.res \
+ test_plus_arg_edit.res \
+ test_preview.res \
+- test_prompt_buffer.res \
+ test_profile.res \
+ test_python2.res \
+ test_python3.res \
+ test_pyx2.res \
+--- 147,154 ----
+ test_perl.res \
+ test_plus_arg_edit.res \
+ test_preview.res \
+ test_profile.res \
++ test_prompt_buffer.res \
+ test_python2.res \
+ test_python3.res \
+ test_pyx2.res \
+***************
+*** 180,185 ****
+--- 180,186 ----
+ test_undo.res \
+ test_user_func.res \
+ test_usercommands.res \
++ test_vartabs.res \
+ test_viminfo.res \
+ test_vimscript.res \
+ test_visual.res \
+*** ../vim-8.1.0104/src/testdir/gen_opt_test.vim 2018-05-05 16:32:49.000000000 +0200
+--- src/testdir/gen_opt_test.vim 2018-06-23 17:41:10.116365995 +0200
+***************
+*** 136,141 ****
+--- 136,143 ----
+ \ 'toolbariconsize': [['', 'tiny', 'huge'], ['xxx']],
+ \ 'ttymouse': [['', 'xterm'], ['xxx']],
+ \ 'ttytype': [[], []],
++ \ 'varsofttabstop': [['8', '4,8,16,32'], ['xxx', '-1', '4,-1,20']],
++ \ 'vartabstop': [['8', '4,8,16,32'], ['xxx', '-1', '4,-1,20']],
+ \ 'viewoptions': [['', 'cursor', 'unix,slash'], ['xxx']],
+ \ 'viminfo': [['', '''50', '"30'], ['xxx']],
+ \ 'virtualedit': [['', 'all', 'all,block'], ['xxx']],
+*** ../vim-8.1.0104/src/testdir/test_breakindent.vim 2017-03-01 17:42:25.000000000 +0100
+--- src/testdir/test_breakindent.vim 2018-06-23 19:21:36.118945791 +0200
+***************
+*** 12,146 ****
+
+ let s:input ="\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP"
+
+! function s:screen_lines(lnum, width) abort
+ return ScreenLines([a:lnum, a:lnum + 2], a:width)
+! endfunction
+
+! function! s:compare_lines(expect, actual)
+ call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
+! endfunction
+
+! function s:test_windows(...)
+ call NewWindow(10, 20)
+ setl ts=4 sw=4 sts=4 breakindent
+ put =s:input
+ exe get(a:000, 0, '')
+! endfunction
+
+! function s:close_windows(...)
+ call CloseWindow()
+ exe get(a:000, 0, '')
+! endfunction
+
+! function Test_breakindent01()
+ " simple breakindent test
+ call s:test_windows('setl briopt=min:0')
+! let lines=s:screen_lines(line('.'),8)
+! let expect=[
+! \ " abcd",
+! \ " qrst",
+! \ " GHIJ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunction
+
+! function Test_breakindent02()
+ " simple breakindent test with showbreak set
+ call s:test_windows('setl briopt=min:0 sbr=>>')
+! let lines=s:screen_lines(line('.'),8)
+! let expect=[
+! \ " abcd",
+! \ " >>qr",
+! \ " >>EF",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+! endfunction
+
+! function Test_breakindent03()
+ " simple breakindent test with showbreak set and briopt including sbr
+ call s:test_windows('setl briopt=sbr,min:0 sbr=++')
+! let lines=s:screen_lines(line('.'),8)
+! let expect=[
+! \ " abcd",
+! \ "++ qrst",
+! \ "++ GHIJ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+! endfunction
+
+! function Test_breakindent04()
+ " breakindent set with min width 18
+ call s:test_windows('setl sbr= briopt=min:18')
+! let lines=s:screen_lines(line('.'),8)
+! let expect=[
+! \ " abcd",
+! \ " qrstuv",
+! \ " IJKLMN",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+! endfunction
+
+! function Test_breakindent05()
+ " breakindent set and shift by 2
+ call s:test_windows('setl briopt=shift:2,min:0')
+! let lines=s:screen_lines(line('.'),8)
+! let expect=[
+! \ " abcd",
+! \ " qr",
+! \ " EF",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunction
+
+! function Test_breakindent06()
+ " breakindent set and shift by -1
+ call s:test_windows('setl briopt=shift:-1,min:0')
+! let lines=s:screen_lines(line('.'),8)
+! let expect=[
+! \ " abcd",
+! \ " qrstu",
+! \ " HIJKL",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunction
+
+! function Test_breakindent07()
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 cpo+=n')
+! let lines=s:screen_lines(line('.'),10)
+! let expect=[
+! \ " 2 ab",
+! \ "? m",
+! \ "? x",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr= cpo-=n')
+! endfunction
+
+! function Test_breakindent07a()
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4')
+! let lines=s:screen_lines(line('.'),10)
+! let expect=[
+! \ " 2 ab",
+! \ " ? m",
+! \ " ? x",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+! endfunction
+
+! function Test_breakindent08()
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list cpo+=n ts=4')
+ " make sure, cache is invalidated!
+--- 12,278 ----
+
+ let s:input ="\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP"
+
+! func s:screen_lines(lnum, width) abort
+ return ScreenLines([a:lnum, a:lnum + 2], a:width)
+! endfunc
+
+! func s:compare_lines(expect, actual)
+ call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
+! endfunc
+
+! func s:test_windows(...)
+ call NewWindow(10, 20)
+ setl ts=4 sw=4 sts=4 breakindent
+ put =s:input
+ exe get(a:000, 0, '')
+! endfunc
+
+! func s:close_windows(...)
+ call CloseWindow()
+ exe get(a:000, 0, '')
+! endfunc
+
+! func Test_breakindent01()
+ " simple breakindent test
+ call s:test_windows('setl briopt=min:0')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qrst",
+! \ " GHIJ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunc
+
+! func Test_breakindent01_vartabs()
+! " like 01 but with vartabs feature
+! if !has("vartabs")
+! return
+! endif
+! call s:test_windows('setl briopt=min:0 vts=4')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qrst",
+! \ " GHIJ",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set vts&')
+! endfunc
+!
+! func Test_breakindent02()
+ " simple breakindent test with showbreak set
+ call s:test_windows('setl briopt=min:0 sbr=>>')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " >>qr",
+! \ " >>EF",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+! endfunc
+!
+! func Test_breakindent02_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " simple breakindent test with showbreak set
+! call s:test_windows('setl briopt=min:0 sbr=>> vts=4')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " >>qr",
+! \ " >>EF",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set sbr= vts&')
+! endfunc
+
+! func Test_breakindent03()
+ " simple breakindent test with showbreak set and briopt including sbr
+ call s:test_windows('setl briopt=sbr,min:0 sbr=++')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ "++ qrst",
+! \ "++ GHIJ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+! endfunc
+
+! func Test_breakindent03_vartabs()
+! " simple breakindent test with showbreak set and briopt including sbr
+! if !has("vartabs")
+! return
+! endif
+! call s:test_windows('setl briopt=sbr,min:0 sbr=++ vts=4')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ "++ qrst",
+! \ "++ GHIJ",
+! \ ]
+! call s:compare_lines(expect, lines)
+! " clean up
+! call s:close_windows('set sbr= vts&')
+! endfunc
+!
+! func Test_breakindent04()
+ " breakindent set with min width 18
+ call s:test_windows('setl sbr= briopt=min:18')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qrstuv",
+! \ " IJKLMN",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+! endfunc
+
+! func Test_breakindent04_vartabs()
+! " breakindent set with min width 18
+! if !has("vartabs")
+! return
+! endif
+! call s:test_windows('setl sbr= briopt=min:18 vts=4')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qrstuv",
+! \ " IJKLMN",
+! \ ]
+! call s:compare_lines(expect, lines)
+! " clean up
+! call s:close_windows('set sbr= vts&')
+! endfunc
+!
+! func Test_breakindent05()
+ " breakindent set and shift by 2
+ call s:test_windows('setl briopt=shift:2,min:0')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qr",
+! \ " EF",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunc
+!
+! func Test_breakindent05_vartabs()
+! " breakindent set and shift by 2
+! if !has("vartabs")
+! return
+! endif
+! call s:test_windows('setl briopt=shift:2,min:0 vts=4')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qr",
+! \ " EF",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set vts&')
+! endfunc
+
+! func Test_breakindent06()
+ " breakindent set and shift by -1
+ call s:test_windows('setl briopt=shift:-1,min:0')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qrstu",
+! \ " HIJKL",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunc
+
+! func Test_breakindent06_vartabs()
+! " breakindent set and shift by -1
+! if !has("vartabs")
+! return
+! endif
+! call s:test_windows('setl briopt=shift:-1,min:0 vts=4')
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ " abcd",
+! \ " qrstu",
+! \ " HIJKL",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set vts&')
+! endfunc
+!
+! func Test_breakindent07()
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 cpo+=n')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ab",
+! \ "? m",
+! \ "? x",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr= cpo-=n')
+! endfunc
+!
+! func Test_breakindent07_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+! call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 cpo+=n vts=4')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ab",
+! \ "? m",
+! \ "? x",
+! \ ]
+! call s:compare_lines(expect, lines)
+! " clean up
+! call s:close_windows('set sbr= cpo-=n vts&')
+! endfunc
+
+! func Test_breakindent07a()
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ab",
+! \ " ? m",
+! \ " ? x",
+! \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr=')
+! endfunc
+!
+! func Test_breakindent07a_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+! call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 vts=4')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ab",
+! \ " ? m",
+! \ " ? x",
+! \ ]
+! call s:compare_lines(expect, lines)
+! " clean up
+! call s:close_windows('set sbr= vts&')
+! endfunc
+
+! func Test_breakindent08()
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list cpo+=n ts=4')
+ " make sure, cache is invalidated!
+***************
+*** 148,190 ****
+ redraw!
+ set ts=4
+ redraw!
+! let lines=s:screen_lines(line('.'),10)
+! let expect=[
+! \ " 2 ^Iabcd",
+! \ "# opq",
+! \ "# BCD",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n')
+! endfunction
+
+! function Test_breakindent08a()
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list')
+! let lines=s:screen_lines(line('.'),10)
+! let expect=[
+! \ " 2 ^Iabcd",
+! \ " # opq",
+! \ " # BCD",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+! endfunction
+
+! function Test_breakindent09()
+ " breakindent set and shift by 1, Number and list set sbr=#
+ call s:test_windows('setl briopt=shift:1,min:0 nu nuw=4 sbr=# list')
+! let lines=s:screen_lines(line('.'),10)
+! let expect=[
+! \ " 2 ^Iabcd",
+! \ " #op",
+! \ " #AB",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+! endfunction
+
+! function Test_breakindent10()
+ " breakindent set, Number set sbr=~
+ call s:test_windows('setl cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0')
+ " make sure, cache is invalidated!
+--- 280,375 ----
+ redraw!
+ set ts=4
+ redraw!
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ^Iabcd",
+! \ "# opq",
+! \ "# BCD",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n')
+! endfunc
+
+! func Test_breakindent08_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+! call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list cpo+=n ts=4 vts=4')
+! " make sure, cache is invalidated!
+! set ts=8
+! redraw!
+! set ts=4
+! redraw!
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ^Iabcd",
+! \ "# opq",
+! \ "# BCD",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set sbr= cpo-=n vts&')
+! endfunc
+!
+! func Test_breakindent08a()
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ^Iabcd",
+! \ " # opq",
+! \ " # BCD",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+! endfunc
+!
+! func Test_breakindent08a_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+! call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list vts=4')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ^Iabcd",
+! \ " # opq",
+! \ " # BCD",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set sbr= vts&')
+! endfunc
+
+! func Test_breakindent09()
+ " breakindent set and shift by 1, Number and list set sbr=#
+ call s:test_windows('setl briopt=shift:1,min:0 nu nuw=4 sbr=# list')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ^Iabcd",
+! \ " #op",
+! \ " #AB",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr=')
+! endfunc
+
+! func Test_breakindent09_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " breakindent set and shift by 1, Number and list set sbr=#
+! call s:test_windows('setl briopt=shift:1,min:0 nu nuw=4 sbr=# list vts=4')
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ^Iabcd",
+! \ " #op",
+! \ " #AB",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set sbr= vts&')
+! endfunc
+!
+! func Test_breakindent10()
+ " breakindent set, Number set sbr=~
+ call s:test_windows('setl cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0')
+ " make sure, cache is invalidated!
+***************
+*** 192,232 ****
+ redraw!
+ set ts=4
+ redraw!
+! let lines=s:screen_lines(line('.'),10)
+! let expect=[
+! \ " 2 ab",
+! \ "~ mn",
+! \ "~ yz",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n')
+! endfunction
+
+! function Test_breakindent11()
+ " test strdisplaywidth()
+ call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
+! let text=getline(2)
+ let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
+ call assert_equal(width, strdisplaywidth(text))
+ call s:close_windows('set sbr=')
+! endfunction
+
+! function Test_breakindent12()
+ " test breakindent with long indent
+! let s:input="\t\t\t\t\t{"
+ call s:test_windows('setl breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4 list listchars=tab:>-')
+! let lines=s:screen_lines(2,16)
+! let expect=[
+! \ " 2 >--->--->--->",
+! \ " ---{ ",
+! \ "~ ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set nuw=4 listchars=')
+! endfunction
+
+! function Test_breakindent13()
+! let s:input=""
+ call s:test_windows('setl breakindent briopt=min:10 ts=8')
+ vert resize 20
+ call setline(1, [" a\tb\tc\td\te", " z y x w v"])
+--- 377,467 ----
+ redraw!
+ set ts=4
+ redraw!
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ab",
+! \ "~ mn",
+! \ "~ yz",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n')
+! endfunc
+
+! func Test_breakindent10_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " breakindent set, Number set sbr=~
+! call s:test_windows('setl cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0 vts=4')
+! " make sure, cache is invalidated!
+! set ts=8
+! redraw!
+! set ts=4
+! redraw!
+! let lines = s:screen_lines(line('.'),10)
+! let expect = [
+! \ " 2 ab",
+! \ "~ mn",
+! \ "~ yz",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set sbr= cpo-=n vts&')
+! endfunc
+!
+! func Test_breakindent11()
+ " test strdisplaywidth()
+ call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
+! let text = getline(2)
+ let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
+ call assert_equal(width, strdisplaywidth(text))
+ call s:close_windows('set sbr=')
+! endfunc
+!
+! func Test_breakindent11_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " test strdisplaywidth()
+! call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4 vts=4')
+! let text = getline(2)
+! let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
+! call assert_equal(width, strdisplaywidth(text))
+! call s:close_windows('set sbr= vts&')
+! endfunc
+
+! func Test_breakindent12()
+ " test breakindent with long indent
+! let s:input = "\t\t\t\t\t{"
+ call s:test_windows('setl breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4 list listchars=tab:>-')
+! let lines = s:screen_lines(2,16)
+! let expect = [
+! \ " 2 >--->--->--->",
+! \ " ---{ ",
+! \ "~ ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set nuw=4 listchars=')
+! endfunc
+
+! func Test_breakindent12_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " test breakindent with long indent
+! let s:input = "\t\t\t\t\t{"
+! call s:test_windows('setl breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4 list listchars=tab:>- vts=4')
+! let lines = s:screen_lines(2,16)
+! let expect = [
+! \ " 2 >--->--->--->",
+! \ " ---{ ",
+! \ "~ ",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set nuw=4 listchars= vts&')
+! endfunc
+!
+! func Test_breakindent13()
+! let s:input = ""
+ call s:test_windows('setl breakindent briopt=min:10 ts=8')
+ vert resize 20
+ call setline(1, [" a\tb\tc\td\te", " z y x w v"])
+***************
+*** 237,298 ****
+ call assert_equal('d', @a)
+ call assert_equal('w', @b)
+ call s:close_windows()
+! endfunction
+
+! function Test_breakindent14()
+! let s:input=""
+ call s:test_windows('setl breakindent briopt= ts=8')
+ vert resize 30
+ norm! 3a1234567890
+ norm! a abcde
+ exec "norm! 0\<C-V>tex"
+! let lines=s:screen_lines(line('.'),8)
+! let expect=[
+! \ "e ",
+! \ "~ ",
+! \ "~ ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunction
+
+! function Test_breakindent15()
+! let s:input=""
+ call s:test_windows('setl breakindent briopt= ts=8 sw=8')
+ vert resize 30
+ norm! 4a1234567890
+ exe "normal! >>\<C-V>3f0x"
+! let lines=s:screen_lines(line('.'),20)
+! let expect=[
+! \ " 1234567890 ",
+! \ "~ ",
+! \ "~ ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunction
+
+! function Test_breakindent16()
+ " Check that overlong lines are indented correctly.
+! let s:input=""
+ call s:test_windows('setl breakindent briopt=min:0 ts=4')
+ call setline(1, "\t".repeat("1234567890", 10))
+ resize 6
+ norm! 1gg$
+ redraw!
+! let lines=s:screen_lines(1,10)
+! let expect=[
+! \ " 789012",
+! \ " 345678",
+! \ " 901234",
+! \ ]
+! call s:compare_lines(expect, lines)
+! let lines=s:screen_lines(4,10)
+! let expect=[
+! \ " 567890",
+! \ " 123456",
+! \ " 7890 ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunction
+--- 472,617 ----
+ call assert_equal('d', @a)
+ call assert_equal('w', @b)
+ call s:close_windows()
+! endfunc
+
+! func Test_breakindent13_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! let s:input = ""
+! call s:test_windows('setl breakindent briopt=min:10 ts=8 vts=8')
+! vert resize 20
+! call setline(1, [" a\tb\tc\td\te", " z y x w v"])
+! 1
+! norm! fbgj"ayl
+! 2
+! norm! fygj"byl
+! call assert_equal('d', @a)
+! call assert_equal('w', @b)
+! call s:close_windows('set vts&')
+! endfunc
+!
+! func Test_breakindent14()
+! let s:input = ""
+ call s:test_windows('setl breakindent briopt= ts=8')
+ vert resize 30
+ norm! 3a1234567890
+ norm! a abcde
+ exec "norm! 0\<C-V>tex"
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ "e ",
+! \ "~ ",
+! \ "~ ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunc
+!
+! func Test_breakindent14_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! let s:input = ""
+! call s:test_windows('setl breakindent briopt= ts=8 vts=8')
+! vert resize 30
+! norm! 3a1234567890
+! norm! a abcde
+! exec "norm! 0\<C-V>tex"
+! let lines = s:screen_lines(line('.'),8)
+! let expect = [
+! \ "e ",
+! \ "~ ",
+! \ "~ ",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set vts&')
+! endfunc
+
+! func Test_breakindent15()
+! let s:input = ""
+ call s:test_windows('setl breakindent briopt= ts=8 sw=8')
+ vert resize 30
+ norm! 4a1234567890
+ exe "normal! >>\<C-V>3f0x"
+! let lines = s:screen_lines(line('.'),20)
+! let expect = [
+! \ " 1234567890 ",
+! \ "~ ",
+! \ "~ ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunc
+!
+! func Test_breakindent15_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! let s:input = ""
+! call s:test_windows('setl breakindent briopt= ts=8 sw=8 vts=8')
+! vert resize 30
+! norm! 4a1234567890
+! exe "normal! >>\<C-V>3f0x"
+! let lines = s:screen_lines(line('.'),20)
+! let expect = [
+! \ " 1234567890 ",
+! \ "~ ",
+! \ "~ ",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set vts&')
+! endfunc
+
+! func Test_breakindent16()
+ " Check that overlong lines are indented correctly.
+! let s:input = ""
+ call s:test_windows('setl breakindent briopt=min:0 ts=4')
+ call setline(1, "\t".repeat("1234567890", 10))
+ resize 6
+ norm! 1gg$
+ redraw!
+! let lines = s:screen_lines(1,10)
+! let expect = [
+! \ " 789012",
+! \ " 345678",
+! \ " 901234",
+! \ ]
+! call s:compare_lines(expect, lines)
+! let lines = s:screen_lines(4,10)
+! let expect = [
+! \ " 567890",
+! \ " 123456",
+! \ " 7890 ",
+! \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows()
+! endfunc
+!
+! func Test_breakindent16_vartabs()
+! if !has("vartabs")
+! return
+! endif
+! " Check that overlong lines are indented correctly.
+! let s:input = ""
+! call s:test_windows('setl breakindent briopt=min:0 ts=4 vts=4')
+! call setline(1, "\t".repeat("1234567890", 10))
+! resize 6
+! norm! 1gg$
+! redraw!
+! let lines = s:screen_lines(1,10)
+! let expect = [
+! \ " 789012",
+! \ " 345678",
+! \ " 901234",
+! \ ]
+! call s:compare_lines(expect, lines)
+! let lines = s:screen_lines(4,10)
+! let expect = [
+! \ " 567890",
+! \ " 123456",
+! \ " 7890 ",
+! \ ]
+! call s:compare_lines(expect, lines)
+! call s:close_windows('set vts&')
+! endfunc
+*** ../vim-8.1.0104/src/testdir/test_vartabs.vim 2018-06-23 19:18:52.740059396 +0200
+--- src/testdir/test_vartabs.vim 2018-06-23 18:05:31.387656858 +0200
+***************
+*** 0 ****
+--- 1,257 ----
++ " Test for variable tabstops
++
++ if !has("vartabs")
++ finish
++ endif
++
++ func! Test_vartabs()
++ new
++ %d
++
++ " Test normal operation of tabstops ...
++ set ts=4
++ call setline(1, join(split('aaaaa', '\zs'), "\t"))
++ retab 8
++ let expect = "a a\<tab>a a\<tab>a"
++ call assert_equal(expect, getline(1))
++
++ " ... and softtabstops
++ set ts=8 sts=6
++ exe "norm! Sb\<tab>b\<tab>b\<tab>b\<tab>b"
++ let expect = "b b\<tab> b\<tab> b\<tab>b"
++ call assert_equal(expect, getline(1))
++
++ " Test variable tabstops.
++ set sts=0 vts=4,8,4,8
++ exe "norm! Sc\<tab>c\<tab>c\<tab>c\<tab>c\<tab>c"
++ retab 8
++ let expect = "c c\<tab> c\<tab>c\<tab>c\<tab>c"
++ call assert_equal(expect, getline(1))
++
++ set et vts=4,8,4,8
++ exe "norm! Sd\<tab>d\<tab>d\<tab>d\<tab>d\<tab>d"
++ let expect = "d d d d d d"
++ call assert_equal(expect, getline(1))
++
++ " Changing ts should have no effect if vts is in use.
++ call cursor(1, 1)
++ set ts=6
++ exe "norm! Se\<tab>e\<tab>e\<tab>e\<tab>e\<tab>e"
++ let expect = "e e e e e e"
++ call assert_equal(expect, getline(1))
++
++ " Clearing vts should revert to using ts.
++ set vts=
++ exe "norm! Sf\<tab>f\<tab>f\<tab>f\<tab>f\<tab>f"
++ let expect = "f f f f f f"
++ call assert_equal(expect, getline(1))
++
++ " Test variable softtabstops.
++ set noet ts=8 vsts=12,2,6
++ exe "norm! Sg\<tab>g\<tab>g\<tab>g\<tab>g\<tab>g"
++ let expect = "g\<tab> g g\<tab> g\<tab> g\<tab>g"
++ call assert_equal(expect, getline(1))
++
++ " Variable tabstops and softtabstops combined.
++ set vsts=6,12,8 vts=4,6,8
++ exe "norm! Sh\<tab>h\<tab>h\<tab>h\<tab>h"
++ let expect = "h\<tab> h\<tab>\<tab>h\<tab>h\<tab>h"
++ call assert_equal(expect, getline(1))
++
++ " Retab with a single value, not using vts.
++ set ts=8 sts=0 vts= vsts=
++ exe "norm! Si\<tab>i\<tab>i\<tab>i\<tab>i"
++ retab 4
++ let expect = "i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i"
++ call assert_equal(expect, getline(1))
++
++ " Retab with a single value, using vts.
++ set ts=8 sts=0 vts=6 vsts=
++ exe "norm! Sj\<tab>j\<tab>j\<tab>j\<tab>j"
++ retab 4
++ let expect = "j\<tab> j\<tab>\<tab>j\<tab> j\<tab>\<tab>j"
++ call assert_equal(expect, getline(1))
++
++ " Retab with multiple values, not using vts.
++ set ts=6 sts=0 vts= vsts=
++ exe "norm! Sk\<tab>k\<tab>k\<tab>k\<tab>k\<tab>k"
++ retab 4,8
++ let expect = "k\<tab> k\<tab>k k\<tab> k\<tab> k"
++ call assert_equal(expect, getline(1))
++
++ " Retab with multiple values, using vts.
++ set ts=8 sts=0 vts=6 vsts=
++ exe "norm! Sl\<tab>l\<tab>l\<tab>l\<tab>l\<tab>l"
++ retab 4,8
++ let expect = "l\<tab> l\<tab>l l\<tab> l\<tab> l"
++ call assert_equal(expect, getline(1))
++
++ " Check that global and local values are set.
++ set ts=4 vts=6 sts=8 vsts=10
++ call assert_equal(&ts, 4)
++ call assert_equal(&vts, '6')
++ call assert_equal(&sts, 8)
++ call assert_equal(&vsts, '10')
++ new
++ call assert_equal(&ts, 4)
++ call assert_equal(&vts, '6')
++ call assert_equal(&sts, 8)
++ call assert_equal(&vsts, '10')
++ bwipeout!
++
++ " Check that local values only are set.
++ setlocal ts=5 vts=7 sts=9 vsts=11
++ call assert_equal(&ts, 5)
++ call assert_equal(&vts, '7')
++ call assert_equal(&sts, 9)
++ call assert_equal(&vsts, '11')
++ new
++ call assert_equal(&ts, 4)
++ call assert_equal(&vts, '6')
++ call assert_equal(&sts, 8)
++ call assert_equal(&vsts, '10')
++ bwipeout!
++
++ " Check that global values only are set.
++ setglobal ts=6 vts=8 sts=10 vsts=12
++ call assert_equal(&ts, 5)
++ call assert_equal(&vts, '7')
++ call assert_equal(&sts, 9)
++ call assert_equal(&vsts, '11')
++ new
++ call assert_equal(&ts, 6)
++ call assert_equal(&vts, '8')
++ call assert_equal(&sts, 10)
++ call assert_equal(&vsts, '12')
++ bwipeout!
++
++ set ts& vts& sts& vsts& et&
++ bwipeout!
++ endfunc
++
++ func! Test_vartabs_breakindent()
++ if !exists("+breakindent")
++ return
++ endif
++ new
++ %d
++
++ " Test normal operation of tabstops ...
++ set ts=4
++ call setline(1, join(split('aaaaa', '\zs'), "\t"))
++ retab 8
++ let expect = "a a\<tab>a a\<tab>a"
++ call assert_equal(expect, getline(1))
++
++ " ... and softtabstops
++ set ts=8 sts=6
++ exe "norm! Sb\<tab>b\<tab>b\<tab>b\<tab>b"
++ let expect = "b b\<tab> b\<tab> b\<tab>b"
++ call assert_equal(expect, getline(1))
++
++ " Test variable tabstops.
++ set sts=0 vts=4,8,4,8
++ exe "norm! Sc\<tab>c\<tab>c\<tab>c\<tab>c\<tab>c"
++ retab 8
++ let expect = "c c\<tab> c\<tab>c\<tab>c\<tab>c"
++ call assert_equal(expect, getline(1))
++
++ set et vts=4,8,4,8
++ exe "norm! Sd\<tab>d\<tab>d\<tab>d\<tab>d\<tab>d"
++ let expect = "d d d d d d"
++ call assert_equal(expect, getline(1))
++
++ " Changing ts should have no effect if vts is in use.
++ call cursor(1, 1)
++ set ts=6
++ exe "norm! Se\<tab>e\<tab>e\<tab>e\<tab>e\<tab>e"
++ let expect = "e e e e e e"
++ call assert_equal(expect, getline(1))
++
++ " Clearing vts should revert to using ts.
++ set vts=
++ exe "norm! Sf\<tab>f\<tab>f\<tab>f\<tab>f\<tab>f"
++ let expect = "f f f f f f"
++ call assert_equal(expect, getline(1))
++
++ " Test variable softtabstops.
++ set noet ts=8 vsts=12,2,6
++ exe "norm! Sg\<tab>g\<tab>g\<tab>g\<tab>g\<tab>g"
++ let expect = "g\<tab> g g\<tab> g\<tab> g\<tab>g"
++ call assert_equal(expect, getline(1))
++
++ " Variable tabstops and softtabstops combined.
++ set vsts=6,12,8 vts=4,6,8
++ exe "norm! Sh\<tab>h\<tab>h\<tab>h\<tab>h"
++ let expect = "h\<tab> h\<tab>\<tab>h\<tab>h\<tab>h"
++ call assert_equal(expect, getline(1))
++
++ " Retab with a single value, not using vts.
++ set ts=8 sts=0 vts= vsts=
++ exe "norm! Si\<tab>i\<tab>i\<tab>i\<tab>i"
++ retab 4
++ let expect = "i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i"
++ call assert_equal(expect, getline(1))
++
++ " Retab with a single value, using vts.
++ set ts=8 sts=0 vts=6 vsts=
++ exe "norm! Sj\<tab>j\<tab>j\<tab>j\<tab>j"
++ retab 4
++ let expect = "j\<tab> j\<tab>\<tab>j\<tab> j\<tab>\<tab>j"
++ call assert_equal(expect, getline(1))
++
++ " Retab with multiple values, not using vts.
++ set ts=6 sts=0 vts= vsts=
++ exe "norm! Sk\<tab>k\<tab>k\<tab>k\<tab>k\<tab>k"
++ retab 4,8
++ let expect = "k\<tab> k\<tab>k k\<tab> k\<tab> k"
++ call assert_equal(expect, getline(1))
++
++ " Retab with multiple values, using vts.
++ set ts=8 sts=0 vts=6 vsts=
++ exe "norm! Sl\<tab>l\<tab>l\<tab>l\<tab>l\<tab>l"
++ retab 4,8
++ let expect = "l\<tab> l\<tab>l l\<tab> l\<tab> l"
++ call assert_equal(expect, getline(1))
++
++ " Check that global and local values are set.
++ set ts=4 vts=6 sts=8 vsts=10
++ call assert_equal(&ts, 4)
++ call assert_equal(&vts, '6')
++ call assert_equal(&sts, 8)
++ call assert_equal(&vsts, '10')
++ new
++ call assert_equal(&ts, 4)
++ call assert_equal(&vts, '6')
++ call assert_equal(&sts, 8)
++ call assert_equal(&vsts, '10')
++ bwipeout!
++
++ " Check that local values only are set.
++ setlocal ts=5 vts=7 sts=9 vsts=11
++ call assert_equal(&ts, 5)
++ call assert_equal(&vts, '7')
++ call assert_equal(&sts, 9)
++ call assert_equal(&vsts, '11')
++ new
++ call assert_equal(&ts, 4)
++ call assert_equal(&vts, '6')
++ call assert_equal(&sts, 8)
++ call assert_equal(&vsts, '10')
++ bwipeout!
++
++ " Check that global values only are set.
++ setglobal ts=6 vts=8 sts=10 vsts=12
++ call assert_equal(&ts, 5)
++ call assert_equal(&vts, '7')
++ call assert_equal(&sts, 9)
++ call assert_equal(&vsts, '11')
++ new
++ call assert_equal(&ts, 6)
++ call assert_equal(&vts, '8')
++ call assert_equal(&sts, 10)
++ call assert_equal(&vsts, '12')
++ bwipeout!
++
++ bwipeout!
++ endfunc
+*** ../vim-8.1.0104/src/version.c 2018-06-23 17:14:36.801909989 +0200
+--- src/version.c 2018-06-23 19:18:18.788276086 +0200
+***************
+*** 677,682 ****
+--- 677,687 ----
+ #else
+ "-user_commands",
+ #endif
++ #ifdef FEAT_VARTABS
++ "+vartabs",
++ #else
++ "-vartabs",
++ #endif
+ "+vertsplit",
+ #ifdef FEAT_VIRTUALEDIT
+ "+virtualedit",
+*** ../vim-8.1.0104/src/workshop.c 2017-11-18 21:10:42.000000000 +0100
+--- src/workshop.c 2018-06-23 17:41:10.116365995 +0200
+***************
+*** 49,55 ****
+--- 49,59 ----
+ static void warp_to_pc(int);
+ #ifdef FEAT_BEVAL_GUI
+ void workshop_beval_cb(BalloonEval *, int);
++ # ifdef FEAT_VARTABS
++ static int computeIndex(int, char_u *, int, int *);
++ # else
+ static int computeIndex(int, char_u *, int);
++ # endif
+ #endif
+ static char *fixAccelText(char *);
+ static void addMenu(char *, char *, char *);
+***************
+*** 1534,1540 ****
+--- 1538,1548 ----
+ * a column number. Compute the index from col. Also set
+ * line to 0 because thats what dbx expects.
+ */
++ #ifdef FEAT_VARTABS
++ idx = computeIndex(col, text, beval->ts, beval->vts);
++ #else
+ idx = computeIndex(col, text, beval->ts);
++ #endif
+ if (idx > 0)
+ {
+ lnum = 0;
+***************
+*** 1569,1575 ****
+ computeIndex(
+ int wantedCol,
+ char_u *line,
+! int ts)
+ {
+ int col = 0;
+ int idx = 0;
+--- 1577,1587 ----
+ computeIndex(
+ int wantedCol,
+ char_u *line,
+! int ts
+! #ifdef FEAT_VARTABS
+! int *vts
+! #else
+! )
+ {
+ int col = 0;
+ int idx = 0;
+***************
+*** 1577,1583 ****
+--- 1589,1599 ----
+ while (line[idx])
+ {
+ if (line[idx] == '\t')
++ #ifdef FEAT_VARTABS
++ col += tabstop_padding(col, ts, vts);
++ #else
+ col += ts - (col % ts);
++ #endif
+ else
+ col++;
+ idx++;
+*** ../vim-8.1.0104/src/Makefile 2018-06-03 14:42:17.836505122 +0200
+--- src/Makefile 2018-06-23 18:09:24.498279403 +0200
+***************
+*** 2305,2310 ****
+--- 2305,2311 ----
+ test_usercommands \
+ test_utf8 \
+ test_utf8_comparisons \
++ test_vartabs \
+ test_viminfo \
+ test_vimscript \
+ test_virtualedit \
+*** ../vim-8.1.0104/src/version.c 2018-06-23 17:14:36.801909989 +0200
+--- src/version.c 2018-06-23 19:18:18.788276086 +0200
+***************
+*** 780,781 ****
+--- 785,788 ----
+ { /* Add new patch number below this line */
++ /**/
++ 105,
+ /**/
+
+--
+# echo reboot >universe
+# chmod +x universe
+# ./universe
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0106 b/data/vim/patches/8.1.0106
new file mode 100644
index 000000000..af7b56a3c
--- /dev/null
+++ b/data/vim/patches/8.1.0106
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0106
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0106 (after 8.1.0103)
+Problem: Build fails when HAVE_DATE_TIME is undefined.
+Solution: Always define init_longVersion(). (Christian Brabandt,
+ closes #3075)
+Files: src/version.c
+
+
+*** ../vim-8.1.0105/src/version.c 2018-06-23 19:22:45.618486231 +0200
+--- src/version.c 2018-06-24 14:44:21.454379055 +0200
+***************
+*** 71,76 ****
+--- 71,82 ----
+ # endif
+ #else
+ char *longVersion = VIM_VERSION_LONG;
++
++ void
++ init_longVersion(void)
++ {
++ // nothing to do
++ }
+ #endif
+
+ static void list_features(void);
+*** ../vim-8.1.0105/src/version.c 2018-06-23 19:22:45.618486231 +0200
+--- src/version.c 2018-06-24 14:44:21.454379055 +0200
+***************
+*** 785,786 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 106,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+97. Your mother tells you to remember something, and you look for
+ a File/Save command.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0107 b/data/vim/patches/8.1.0107
new file mode 100644
index 000000000..4f0262d36
--- /dev/null
+++ b/data/vim/patches/8.1.0107
@@ -0,0 +1,93 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0107
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0107
+Problem: Python: getting buffer option clears message. (Jacob Niehus)
+Solution: Don't use aucmd_prepbuf(). (closes #3079)
+Files: src/option.c
+
+
+*** ../vim-8.1.0106/src/option.c 2018-06-23 19:22:45.614486258 +0200
+--- src/option.c 2018-06-24 15:13:42.200150566 +0200
+***************
+*** 9692,9698 ****
+ * consider it set when 'ff' or 'fenc' changed. */
+ if (p->indir == PV_MOD)
+ {
+! *numval = bufIsChanged((buf_T *) from);
+ varp = NULL;
+ }
+ #ifdef FEAT_CRYPT
+--- 9692,9698 ----
+ * consider it set when 'ff' or 'fenc' changed. */
+ if (p->indir == PV_MOD)
+ {
+! *numval = bufIsChanged((buf_T *)from);
+ varp = NULL;
+ }
+ #ifdef FEAT_CRYPT
+***************
+*** 9705,9721 ****
+ #endif
+ else
+ {
+! aco_save_T aco;
+! aucmd_prepbuf(&aco, (buf_T *) from);
+ varp = get_varp(p);
+! aucmd_restbuf(&aco);
+ }
+ }
+ else if (opt_type == SREQ_WIN)
+ {
+! win_T *save_curwin;
+! save_curwin = curwin;
+! curwin = (win_T *) from;
+ curbuf = curwin->w_buffer;
+ varp = get_varp(p);
+ curwin = save_curwin;
+--- 9705,9725 ----
+ #endif
+ else
+ {
+! buf_T *save_curbuf = curbuf;
+!
+! // only getting a pointer, no need to use aucmd_prepbuf()
+! curbuf = (buf_T *)from;
+! curwin->w_buffer = curbuf;
+ varp = get_varp(p);
+! curbuf = save_curbuf;
+! curwin->w_buffer = curbuf;
+ }
+ }
+ else if (opt_type == SREQ_WIN)
+ {
+! win_T *save_curwin = curwin;
+!
+! curwin = (win_T *)from;
+ curbuf = curwin->w_buffer;
+ varp = get_varp(p);
+ curwin = save_curwin;
+*** ../vim-8.1.0106/src/version.c 2018-06-24 14:44:42.282243290 +0200
+--- src/version.c 2018-06-24 15:11:21.536911391 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 107,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+99. The hum of a cooling fan and the click of keys is comforting to you.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0108 b/data/vim/patches/8.1.0108
new file mode 100644
index 000000000..13a497324
--- /dev/null
+++ b/data/vim/patches/8.1.0108
@@ -0,0 +1,7847 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0108
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0108
+Problem: No Danish translations.
+Solution: Add Danish message translations. (closes #3073) Move list of
+ languages to a common makefile.
+Files: src/po/Makefile, src/po/Make_cyg.mak, src/po/Make_mvc.mak,
+ src/po/Make_ming.mak, src/po/Make_all.mak, src/po/da.po
+
+
+*** ../vim-8.1.0107/src/po/Makefile 2018-04-29 12:09:57.000000000 +0200
+--- src/po/Makefile 2018-06-24 15:50:59.192329630 +0200
+***************
+*** 3,138 ****
+ # Include stuff found by configure.
+ include ../auto/config.mk
+
+! # TODO make this configurable
+ # Note: ja.sjis, *.cp1250 and zh_CN.cp936 are only for MS-Windows, they are
+ # not installed on Unix
+
+- LANGUAGES = \
+- af \
+- ca \
+- cs \
+- de \
+- en_GB \
+- eo \
+- es \
+- fi \
+- fr \
+- ga \
+- it \
+- ja \
+- ko \
+- ko.UTF-8 \
+- lv \
+- nb \
+- nl \
+- no \
+- pl \
+- pt_BR \
+- ru \
+- sk \
+- sr \
+- sv \
+- uk \
+- vi \
+- zh_CN \
+- zh_CN.UTF-8 \
+- zh_TW \
+- zh_TW.UTF-8
+-
+- CONVERTED = \
+- cs.cp1250 \
+- ja.sjis \
+- ja.euc-jp \
+- pl.cp1250 \
+- pl.UTF-8 \
+- ru.cp1251 \
+- sk.cp1250 \
+- uk.cp1251 \
+- zh_CN.cp936
+-
+- MOFILES = \
+- af.mo \
+- ca.mo \
+- cs.mo \
+- de.mo \
+- en_GB.mo \
+- eo.mo \
+- es.mo \
+- fi.mo \
+- fr.mo \
+- ga.mo \
+- it.mo \
+- ja.mo \
+- ko.mo \
+- ko.UTF-8.mo \
+- lv.mo \
+- nb.mo \
+- nl.mo \
+- no.mo \
+- pl.mo \
+- pt_BR.mo \
+- ru.mo \
+- sk.mo \
+- sr.mo \
+- sv.mo \
+- uk.mo \
+- vi.mo \
+- zh_CN.UTF-8.mo \
+- zh_CN.mo \
+- zh_TW.UTF-8.mo \
+- zh_TW.mo
+-
+- MOCONVERTED = \
+- cs.cp1250.mo \
+- ja.sjis.mo \
+- ja.euc-jp.mo \
+- pl.cp1250.mo \
+- pl.UTF-8.mo \
+- ru.cp1251.mo \
+- sk.cp1250.mo \
+- uk.cp1251.mo \
+- zh_CN.cp936.mo
+-
+- CHECKFILES = \
+- af.ck \
+- ca.ck \
+- cs.ck \
+- de.ck \
+- en_GB.ck \
+- eo.ck \
+- es.ck \
+- fi.ck \
+- fr.ck \
+- ga.ck \
+- it.ck \
+- ja.ck \
+- ko.ck \
+- ko.UTF-8.ck \
+- nb.ck \
+- nl.ck \
+- no.ck \
+- pl.ck \
+- pt_BR.ck \
+- ru.ck \
+- sk.ck \
+- sr.ck \
+- sv.ck \
+- uk.ck \
+- vi.ck \
+- zh_CN.UTF-8.ck \
+- zh_CN.ck \
+- zh_TW.UTF-8.ck \
+- zh_TW.ck \
+- cs.cp1250.ck \
+- ja.sjis.ck \
+- ja.euc-jp.ck \
+- pl.cp1250.ck \
+- pl.UTF-8.ck \
+- ru.cp1251.ck \
+- sk.cp1250.ck \
+- uk.cp1251.ck \
+- zh_CN.cp936.ck
+-
+ PACKAGE = vim
+ SHELL = /bin/sh
+ VIM = ../vim
+--- 3,14 ----
+ # Include stuff found by configure.
+ include ../auto/config.mk
+
+! # get LANGUAGES, MOFILES, MOCONVERTED and CHECKFILES
+! include Make_all.mak
+!
+ # Note: ja.sjis, *.cp1250 and zh_CN.cp936 are only for MS-Windows, they are
+ # not installed on Unix
+
+ PACKAGE = vim
+ SHELL = /bin/sh
+ VIM = ../vim
+***************
+*** 147,153 ****
+
+ .SUFFIXES:
+ .SUFFIXES: .po .mo .pot .ck
+! .PHONY: all install uninstall prefixcheck converted check clean checkclean distclean update-po $(LANGUAGES) $(CONVERTED)
+
+ .po.mo:
+ $(MSGFMTCMD) -o $@ $<
+--- 23,29 ----
+
+ .SUFFIXES:
+ .SUFFIXES: .po .mo .pot .ck
+! .PHONY: all install uninstall prefixcheck converted check clean checkclean distclean update-po $(LANGUAGES)
+
+ .po.mo:
+ $(MSGFMTCMD) -o $@ $<
+***************
+*** 162,168 ****
+
+ install: $(MOFILES) $(MOCONVERTED)
+ @$(MAKE) prefixcheck
+! for lang in $(LANGUAGES) $(CONVERTED); do \
+ dir=$(LOCALEDIR)/$$lang/; \
+ if test ! -x "$$dir"; then \
+ mkdir $$dir; chmod 755 $$dir; \
+--- 38,44 ----
+
+ install: $(MOFILES) $(MOCONVERTED)
+ @$(MAKE) prefixcheck
+! for lang in $(LANGUAGES); do \
+ dir=$(LOCALEDIR)/$$lang/; \
+ if test ! -x "$$dir"; then \
+ mkdir $$dir; chmod 755 $$dir; \
+***************
+*** 257,269 ****
+ ru.cp1251.po: ru.po
+ rm -f ru.cp1251.po
+ iconv -f utf-8 -t cp1251 ru.po | \
+! sed -e 's/charset=utf-8/charset=cp1251/' -e 's/# Original translations/# Generated from ru.po, DO NOT EDIT/' > ru.cp1251.po
+
+ # Convert uk.po to create uk.cp1251.po.
+ uk.cp1251.po: uk.po
+ rm -f uk.cp1251.po
+ iconv -f utf-8 -t cp1251 uk.po | \
+! sed -e 's/charset=utf-8/charset=cp1251/' -e 's/# Original translations/# Generated from uk.po, DO NOT EDIT/' > uk.cp1251.po
+
+ prefixcheck:
+ @if test "x" = "x$(prefix)"; then \
+--- 133,145 ----
+ ru.cp1251.po: ru.po
+ rm -f ru.cp1251.po
+ iconv -f utf-8 -t cp1251 ru.po | \
+! sed -e 's/charset=[uU][tT][fF]-8/charset=cp1251/' -e 's/# Original translations/# Generated from ru.po, DO NOT EDIT/' > ru.cp1251.po
+
+ # Convert uk.po to create uk.cp1251.po.
+ uk.cp1251.po: uk.po
+ rm -f uk.cp1251.po
+ iconv -f utf-8 -t cp1251 uk.po | \
+! sed -e 's/charset=[uU][tT][fF]-8/charset=cp1251/' -e 's/# Original translations/# Generated from uk.po, DO NOT EDIT/' > uk.cp1251.po
+
+ prefixcheck:
+ @if test "x" = "x$(prefix)"; then \
+*** ../vim-8.1.0107/src/po/Make_cyg.mak 2018-04-29 12:09:57.000000000 +0200
+--- src/po/Make_cyg.mak 2018-06-24 15:41:25.979639598 +0200
+***************
+*** 12,96 ****
+ VIMRUNTIME = ../../runtime
+ endif
+
+! LANGUAGES = \
+! af \
+! ca \
+! cs \
+! cs.cp1250 \
+! de \
+! en_GB \
+! eo \
+! es \
+! fi \
+! fr \
+! ga \
+! it \
+! ja \
+! ja.euc-jp \
+! ja.sjis \
+! ko \
+! ko.UTF-8 \
+! nb \
+! nl \
+! no \
+! pl \
+! pl.cp1250 \
+! pl.UTF-8 \
+! pt_BR \
+! ru \
+! ru.cp1251 \
+! sk \
+! sk.cp1250 \
+! sr \
+! sv \
+! uk \
+! uk.cp1251 \
+! vi \
+! zh_CN \
+! zh_CN.cp936 \
+! zh_CN.UTF-8 \
+! zh_TW \
+! zh_TW.UTF-8 \
+!
+! MOFILES = \
+! af.mo \
+! ca.mo \
+! cs.cp1250.mo \
+! cs.mo \
+! de.mo \
+! en_GB.mo \
+! eo.mo \
+! es.mo \
+! fi.mo \
+! fr.mo \
+! ga.mo \
+! it.mo \
+! ja.euc-jp.mo \
+! ja.mo \
+! ja.sjis.mo \
+! ko.mo \
+! ko.UTF-8.mo \
+! nb.mo \
+! nl.mo \
+! no.mo \
+! pl.cp1250.mo \
+! pl.mo \
+! pl.UTF-8.mo \
+! pt_BR.mo \
+! ru.cp1251.mo \
+! ru.mo \
+! sk.cp1250.mo \
+! sk.mo \
+! sr.mo \
+! sv.mo \
+! uk.cp1251.mo \
+! uk.mo \
+! vi.mo \
+! zh_CN.mo \
+! zh_CN.cp936.mo \
+! zh_CN.UTF-8.mo \
+! zh_TW.mo \
+! zh_TW.UTF-8.mo \
+
+ PACKAGE = vim
+
+--- 12,19 ----
+ VIMRUNTIME = ../../runtime
+ endif
+
+! # get LANGUAGES, MOFILES and MOCONVERTED
+! include Make_all.mak
+
+ PACKAGE = vim
+
+***************
+*** 126,132 ****
+ .po.mo:
+ $(MSGFMT) -o $@ $<
+
+! all: $(MOFILES)
+
+ first_time:
+ $(XGETTEXT) --default-domain=$(LANGUAGE) \
+--- 49,55 ----
+ .po.mo:
+ $(MSGFMT) -o $@ $<
+
+! all: $(MOFILES) $(MOCONVERTED)
+
+ first_time:
+ $(XGETTEXT) --default-domain=$(LANGUAGE) \
+***************
+*** 141,147 ****
+ $(MSGMERGE) $@.po.old $(PACKAGE).pot -o $@.po
+ $(RM) $@.po.old
+
+! install: $(MOFILES)
+ for TARGET in $(LANGUAGES); do \
+ $(MKD) $(VIMRUNTIME)/lang/$$TARGET/LC_MESSAGES ; \
+ $(CP) $$TARGET.mo $(VIMRUNTIME)/lang/$$TARGET/LC_MESSAGES/$(PACKAGE).mo ; \
+--- 64,70 ----
+ $(MSGMERGE) $@.po.old $(PACKAGE).pot -o $@.po
+ $(RM) $@.po.old
+
+! install: $(MOFILES) $(MOCONVERTED)
+ for TARGET in $(LANGUAGES); do \
+ $(MKD) $(VIMRUNTIME)/lang/$$TARGET/LC_MESSAGES ; \
+ $(CP) $$TARGET.mo $(VIMRUNTIME)/lang/$$TARGET/LC_MESSAGES/$(PACKAGE).mo ; \
+*** ../vim-8.1.0107/src/po/Make_mvc.mak 2018-04-29 12:09:57.000000000 +0200
+--- src/po/Make_mvc.mak 2018-06-24 15:42:00.171455825 +0200
+***************
+*** 10,94 ****
+ VIMRUNTIME = ..\..\runtime
+ !endif
+
+! LANGUAGES = \
+! af \
+! ca \
+! cs \
+! cs.cp1250 \
+! de \
+! en_GB \
+! eo \
+! es \
+! fi \
+! fr \
+! ga \
+! it \
+! ja \
+! ja.euc-jp \
+! ja.sjis \
+! ko \
+! ko.UTF-8 \
+! nb \
+! nl \
+! no \
+! pl \
+! pl.cp1250 \
+! pl.UTF-8 \
+! pt_BR \
+! ru \
+! ru.cp1251 \
+! sk \
+! sk.cp1250 \
+! sr \
+! sv \
+! uk \
+! uk.cp1251 \
+! vi \
+! zh_CN \
+! zh_CN.cp936 \
+! zh_CN.UTF-8 \
+! zh_TW \
+! zh_TW.UTF-8 \
+!
+! MOFILES = \
+! af.mo \
+! ca.mo \
+! cs.cp1250.mo \
+! cs.mo \
+! de.mo \
+! en_GB.mo \
+! eo.mo \
+! es.mo \
+! fi.mo \
+! fr.mo \
+! ga.mo \
+! it.mo \
+! ja.euc-jp.mo \
+! ja.mo \
+! ja.sjis.mo \
+! ko.mo \
+! ko.UTF-8.mo \
+! nb.mo \
+! nl.mo \
+! no.mo \
+! pl.cp1250.mo \
+! pl.mo \
+! pl.UTF-8.mo \
+! pt_BR.mo \
+! ru.cp1251.mo \
+! ru.mo \
+! sk.cp1250.mo \
+! sk.mo \
+! sr.mo \
+! sv.mo \
+! uk.cp1251.mo \
+! uk.mo \
+! vi.mo \
+! zh_CN.mo \
+! zh_CN.cp936.mo \
+! zh_CN.UTF-8.mo \
+! zh_TW.mo \
+! zh_TW.UTF-8.mo \
+
+ PACKAGE = vim
+
+--- 10,17 ----
+ VIMRUNTIME = ..\..\runtime
+ !endif
+
+! # get LANGUAGES, MOFILES and MOCONVERTED
+! !include Make_all.mak
+
+ PACKAGE = vim
+
+***************
+*** 116,122 ****
+ set OLD_PO_FILE_INPUT=yes
+ $(MSGFMT) -o $@ $<
+
+! all: $(MOFILES)
+
+ files:
+ $(LS) $(LSFLAGS) ..\*.c ..\if_perl.xs ..\GvimExt\gvimext.cpp ..\globals.h ..\if_py_both.h ..\vim.h > .\files
+--- 39,45 ----
+ set OLD_PO_FILE_INPUT=yes
+ $(MSGFMT) -o $@ $<
+
+! all: $(MOFILES) $(MOCONVERTED)
+
+ files:
+ $(LS) $(LSFLAGS) ..\*.c ..\if_perl.xs ..\GvimExt\gvimext.cpp ..\globals.h ..\if_py_both.h ..\vim.h > .\files
+*** ../vim-8.1.0107/src/po/Make_ming.mak 2018-04-29 12:09:57.000000000 +0200
+--- src/po/Make_ming.mak 2018-06-24 15:41:39.523566813 +0200
+***************
+*** 18,102 ****
+ endif
+ endif
+
+! LANGUAGES = \
+! af \
+! ca \
+! cs \
+! cs.cp1250 \
+! de \
+! en_GB \
+! eo \
+! es \
+! fi \
+! fr \
+! ga \
+! it \
+! ja \
+! ja.euc-jp \
+! ja.sjis \
+! ko \
+! ko.UTF-8 \
+! nb \
+! nl \
+! no \
+! pl \
+! pl.cp1250 \
+! pl.UTF-8 \
+! pt_BR \
+! ru \
+! ru.cp1251 \
+! sk \
+! sk.cp1250 \
+! sr \
+! sv \
+! uk \
+! uk.cp1251 \
+! vi \
+! zh_CN \
+! zh_CN.cp936 \
+! zh_CN.UTF-8 \
+! zh_TW \
+! zh_TW.UTF-8 \
+!
+! MOFILES = \
+! af.mo \
+! ca.mo \
+! cs.cp1250.mo \
+! cs.mo \
+! de.mo \
+! en_GB.mo \
+! eo.mo \
+! es.mo \
+! fi.mo \
+! fr.mo \
+! ga.mo \
+! it.mo \
+! ja.euc-jp.mo \
+! ja.mo \
+! ja.sjis.mo \
+! ko.mo \
+! ko.UTF-8.mo \
+! nb.mo \
+! nl.mo \
+! no.mo \
+! pl.cp1250.mo \
+! pl.mo \
+! pl.UTF-8.mo \
+! pt_BR.mo \
+! ru.cp1251.mo \
+! ru.mo \
+! sk.cp1250.mo \
+! sk.mo \
+! sr.mo \
+! sv.mo \
+! uk.cp1251.mo \
+! uk.mo \
+! vi.mo \
+! zh_CN.mo \
+! zh_CN.cp936.mo \
+! zh_CN.UTF-8.mo \
+! zh_TW.mo \
+! zh_TW.UTF-8.mo \
+
+ PACKAGE = vim
+
+--- 18,25 ----
+ endif
+ endif
+
+! # get LANGUAGES, MOFILES and MOCONVERTED
+! include Make_all.mak
+
+ PACKAGE = vim
+
+***************
+*** 135,141 ****
+ .po.mo:
+ $(MSGFMT) -o $@ $<
+
+! all: $(MOFILES)
+
+ first_time:
+ $(XGETTEXT) --default-domain=$(LANGUAGE) \
+--- 58,64 ----
+ .po.mo:
+ $(MSGFMT) -o $@ $<
+
+! all: $(MOFILES) $(MOCONVERTED)
+
+ first_time:
+ $(XGETTEXT) --default-domain=$(LANGUAGE) \
+*** ../vim-8.1.0107/src/po/Make_all.mak 2018-06-24 15:50:12.300626368 +0200
+--- src/po/Make_all.mak 2018-06-24 15:43:56.730828750 +0200
+***************
+*** 0 ****
+--- 1,135 ----
++ #
++ # Common po Makefile, defines the list of languages.
++ #
++
++ LANGUAGES = \
++ af \
++ ca \
++ cs \
++ cs.cp1250 \
++ da \
++ de \
++ en_GB \
++ eo \
++ es \
++ fi \
++ fr \
++ ga \
++ it \
++ ja \
++ ja.euc-jp \
++ ja.sjis \
++ ko \
++ ko.UTF-8 \
++ nb \
++ nl \
++ no \
++ pl \
++ pl.UTF-8 \
++ pl.cp1250 \
++ pt_BR \
++ ru \
++ ru.cp1251 \
++ sk \
++ sk.cp1250 \
++ sr \
++ sv \
++ uk \
++ uk.cp1251 \
++ vi \
++ zh_CN \
++ zh_CN.UTF-8 \
++ zh_CN.cp936 \
++ zh_TW \
++ zh_TW.UTF-8 \
++ lv \
++
++
++ MOFILES = \
++ af.mo \
++ ca.mo \
++ cs.mo \
++ da.mo \
++ de.mo \
++ en_GB.mo \
++ eo.mo \
++ es.mo \
++ fi.mo \
++ fr.mo \
++ ga.mo \
++ it.mo \
++ ja.mo \
++ ko.UTF-8.mo \
++ ko.mo \
++ nb.mo \
++ nl.mo \
++ no.mo \
++ pl.mo \
++ pt_BR.mo \
++ ru.mo \
++ sk.mo \
++ sr.mo \
++ sv.mo \
++ uk.mo \
++ vi.mo \
++ zh_CN.UTF-8.mo \
++ zh_CN.mo \
++ zh_TW.UTF-8.mo \
++ zh_TW.mo \
++ lv.mo \
++
++
++ MOCONVERTED = \
++ cs.cp1250.mo \
++ ja.euc-jp.mo \
++ ja.sjis.mo \
++ pl.UTF-8.mo \
++ pl.cp1250.mo \
++ ru.cp1251.mo \
++ sk.cp1250.mo \
++ uk.cp1251.mo \
++ zh_CN.cp936.mo \
++
++
++ CHECKFILES = \
++ af.ck \
++ ca.ck \
++ cs.ck \
++ cs.cp1250.ck \
++ da.ck \
++ de.ck \
++ en_GB.ck \
++ eo.ck \
++ es.ck \
++ fi.ck \
++ fr.ck \
++ ga.ck \
++ it.ck \
++ ja.ck \
++ ja.euc-jp.ck \
++ ja.sjis.ck \
++ ko.UTF-8.ck \
++ ko.ck \
++ lv.ck \
++ nb.ck \
++ nl.ck \
++ no.ck \
++ pl.UTF-8.ck \
++ pl.ck \
++ pl.cp1250.ck \
++ pt_BR.ck \
++ ru.ck \
++ ru.cp1251.ck \
++ sk.ck \
++ sk.cp1250.ck \
++ sr.ck \
++ sv.ck \
++ uk.ck \
++ uk.cp1251.ck \
++ vi.ck \
++ zh_CN.UTF-8.ck \
++ zh_CN.ck \
++ zh_CN.cp936.ck \
++ zh_TW.UTF-8.ck \
++ zh_TW.ck \
++
+*** ../vim-8.1.0107/src/po/da.po 2018-06-24 15:50:12.304626342 +0200
+--- src/po/da.po 2018-06-24 15:18:44.246744941 +0200
+***************
+*** 0 ****
+--- 1,7088 ----
++ # Danish translation for Vim
++ # Copyright (C) 2018 The Vim authors
++ # This file is distributed under the same license as the vim package.
++ # scootergrisen, 2018.
++ msgid ""
++ msgstr ""
++ "Project-Id-Version: Vim 8.1\n"
++ "Report-Msgid-Bugs-To: \n"
++ "POT-Creation-Date: 2018-06-08 22:09+0200\n"
++ "PO-Revision-Date: 2018-06-23 23:30+0200\n"
++ "Last-Translator: scootergrisen\n"
++ "Language-Team: Danish\n"
++ "Language: da\n"
++ "MIME-Version: 1.0\n"
++ "Content-Type: text/plain; charset=UTF-8\n"
++ "Content-Transfer-Encoding: 8bit\n"
++ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++ msgid "E831: bf_key_init() called with empty password"
++ msgstr "E831: bf_key_init() kaldt med tom adgangskode"
++
++ msgid "E820: sizeof(uint32_t) != 4"
++ msgstr "E820: sizeof(uint32_t) != 4"
++
++ msgid "E817: Blowfish big/little endian use wrong"
++ msgstr "E817: Forkert brug af stor/lille byterækkefølge for blowfish"
++
++ msgid "E818: sha256 test failed"
++ msgstr "E818: sha256-test mislykkede"
++
++ msgid "E819: Blowfish test failed"
++ msgstr "E819: Blowfish-test mislykkede"
++
++ msgid "[Location List]"
++ msgstr "[Placeringsliste]"
++
++ msgid "[Quickfix List]"
++ msgstr "[Quickfix-liste]"
++
++ msgid "E855: Autocommands caused command to abort"
++ msgstr "E855: Autokommandoer forårsagede afbrydelse af kommando"
++
++ msgid "E82: Cannot allocate any buffer, exiting..."
++ msgstr "E82: Kan ikke allokere buffer, afslutter..."
++
++ msgid "E83: Cannot allocate buffer, using other one..."
++ msgstr "E83: Kan ikke allokere buffer, bruger en anden..."
++
++ msgid "E931: Buffer cannot be registered"
++ msgstr "E931: Buffer kan ikke registreres"
++
++ msgid "E937: Attempt to delete a buffer that is in use"
++ msgstr "E937: Forsøg på at slette en buffer som er i brug"
++
++ msgid "E515: No buffers were unloaded"
++ msgstr "E515: Ingen buffere blev udlæst"
++
++ msgid "E516: No buffers were deleted"
++ msgstr "E516: Ingen brugere blev slettet"
++
++ msgid "E517: No buffers were wiped out"
++ msgstr "E517: Ingen buffere blev ryddet"
++
++ msgid "1 buffer unloaded"
++ msgstr "1 buffer udlæst"
++
++ #, c-format
++ msgid "%d buffers unloaded"
++ msgstr "%d buffere udlæst"
++
++ msgid "1 buffer deleted"
++ msgstr "1 buffer slettet"
++
++ #, c-format
++ msgid "%d buffers deleted"
++ msgstr "%d buffere slettet"
++
++ msgid "1 buffer wiped out"
++ msgstr "1 buffer ryddet"
++
++ #, c-format
++ msgid "%d buffers wiped out"
++ msgstr "%d buffere ryddet"
++
++ msgid "E90: Cannot unload last buffer"
++ msgstr "E90: Kan ikke udlæse sidste buffer"
++
++ msgid "E84: No modified buffer found"
++ msgstr "E84: Fandt ingen ændret buffer"
++
++ msgid "E85: There is no listed buffer"
++ msgstr "E85: Der er ingen oplistet buffer"
++
++ msgid "E87: Cannot go beyond last buffer"
++ msgstr "E87: Kan ikke gå over sidste buffer"
++
++ msgid "E88: Cannot go before first buffer"
++ msgstr "E88: Kan ikke gå før første buffer"
++
++ #, c-format
++ msgid "E89: No write since last change for buffer %ld (add ! to override)"
++ msgstr ""
++ "E89: Ingen skrivning siden sidste ændring for bufferen %ld (tilføj ! for at "
++ "tilsidesætte)"
++
++ msgid "E948: Job still running (add ! to end the job)"
++ msgstr "E948: Job kører stadig (tilføj ! for at afslutte jobbet)"
++
++ msgid "E37: No write since last change (add ! to override)"
++ msgstr ""
++ "E37: Ingen skrivning siden sidste ændring (tilføj ! for at tilsidesætte)"
++
++ msgid "E948: Job still running"
++ msgstr "E948: Job kører stadig"
++
++ msgid "E37: No write since last change"
++ msgstr "E37: Ingen skrivning siden sidste ændring"
++
++ msgid "W14: Warning: List of file names overflow"
++ msgstr "W14: Advarsel: Overløb i liste over filnavne"
++
++ #, c-format
++ msgid "E92: Buffer %ld not found"
++ msgstr "E92: Bufferen %ld blev ikke fundet"
++
++ #, c-format
++ msgid "E93: More than one match for %s"
++ msgstr "E93: Flere end ét match for %s"
++
++ #, c-format
++ msgid "E94: No matching buffer for %s"
++ msgstr "E94: Ingen matchende buffer for %s"
++
++ #, c-format
++ msgid "line %ld"
++ msgstr "linje %ld"
++
++ msgid "E95: Buffer with this name already exists"
++ msgstr "E95: Buffer med dette navn findes allerede"
++
++ msgid " [Modified]"
++ msgstr " [Ændret]"
++
++ msgid "[Not edited]"
++ msgstr "[Ikke redigeret]"
++
++ msgid "[New file]"
++ msgstr "[Ny fil]"
++
++ msgid "[Read errors]"
++ msgstr "[Læsefejl]"
++
++ msgid "[RO]"
++ msgstr "[SB]"
++
++ msgid "[readonly]"
++ msgstr "[skrivebeskyttet]"
++
++ #, c-format
++ msgid "1 line --%d%%--"
++ msgstr "1 linje --%d%%--"
++
++ #, c-format
++ msgid "%ld lines --%d%%--"
++ msgstr "%ld linjer --%d%%--"
++
++ #, c-format
++ msgid "line %ld of %ld --%d%%-- col "
++ msgstr "linje %ld af %ld --%d%%-- kol "
++
++ msgid "[No Name]"
++ msgstr "[Intet navn]"
++
++ msgid "help"
++ msgstr "hjælp"
++
++ msgid "[Help]"
++ msgstr "[Hjælp]"
++
++ msgid "[Preview]"
++ msgstr "[Forhåndsvisning]"
++
++ msgid "All"
++ msgstr "Alt"
++
++ msgid "Bot"
++ msgstr "Ned"
++
++ msgid "Top"
++ msgstr "Øve"
++
++ msgid ""
++ "\n"
++ "# Buffer list:\n"
++ msgstr ""
++ "\n"
++ "# Bufferliste:\n"
++
++ msgid "E382: Cannot write, 'buftype' option is set"
++ msgstr "E382: Kan ikke skrive, 'buftype'-tilvalget er sat"
++
++ msgid "[Prompt]"
++ msgstr "[Prompt]"
++
++ msgid "[Scratch]"
++ msgstr "[Kladdeblok]"
++
++ msgid ""
++ "\n"
++ "--- Signs ---"
++ msgstr ""
++ "\n"
++ "--- Signs ---"
++
++ #, c-format
++ msgid "Signs for %s:"
++ msgstr "Signs for %s:"
++
++ #, c-format
++ msgid " line=%ld id=%d name=%s"
++ msgstr " linje=%ld id=%d navn=%s"
++
++ msgid "E902: Cannot connect to port"
++ msgstr "E902: Kan ikke oprette forbindelse til port"
++
++ msgid "E901: gethostbyname() in channel_open()"
++ msgstr "E901: gethostbyname() i channel_open()"
++
++ msgid "E898: socket() in channel_open()"
++ msgstr "E898: socket() i channel_open()"
++
++ msgid "E903: received command with non-string argument"
++ msgstr "E903: modtog kommando med argument som ikke er en streng"
++
++ msgid "E904: last argument for expr/call must be a number"
++ msgstr "E904: sidste argument for udtryk/kald skal være et nummer"
++
++ msgid "E904: third argument for call must be a list"
++ msgstr "E904: tredje argument for kald skal være en liste"
++
++ #, c-format
++ msgid "E905: received unknown command: %s"
++ msgstr "E905: modtog ukendt kommando: %s"
++
++ #, c-format
++ msgid "E630: %s(): write while not connected"
++ msgstr "E630: %s(): skrivning mens der ikke er forbindelse"
++
++ #, c-format
++ msgid "E631: %s(): write failed"
++ msgstr "E631: %s(): skrivning mislykkedes"
++
++ #, c-format
++ msgid "E917: Cannot use a callback with %s()"
++ msgstr "E917: Kan ikke bruge et callback med %s()"
++
++ msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel"
++ msgstr ""
++ "E912: kan ikke bruge ch_evalexpr()/ch_sendexpr() med en rå- eller nl-kanal"
++
++ msgid "E906: not an open channel"
++ msgstr "E906: ikke en åben kanal"
++
++ msgid "E920: _io file requires _name to be set"
++ msgstr "E920: _io-fil kræver at _name er sat"
++
++ msgid "E915: in_io buffer requires in_buf or in_name to be set"
++ msgstr "E915: in_io-buffer kræver at in_buf eller in_name er sat"
++
++ #, c-format
++ msgid "E918: buffer must be loaded: %s"
++ msgstr "E918: buffer skal være indlæst: %s"
++
++ msgid "E821: File is encrypted with unknown method"
++ msgstr "E821: Filen er krypteret med ukendt metode"
++
++ msgid "Warning: Using a weak encryption method; see :help 'cm'"
++ msgstr "Advarsel: Bruger en svag krypteringsmetode; se :help 'cm'"
++
++ msgid "Enter encryption key: "
++ msgstr "Indtast krypteringsnøgle: "
++
++ msgid "Enter same key again: "
++ msgstr "Indtast samme nøgle igen: "
++
++ msgid "Keys don't match!"
++ msgstr "Nøglerne er ikke ens!"
++
++ msgid "[crypted]"
++ msgstr "[crypted]"
++
++ #, c-format
++ msgid "E720: Missing colon in Dictionary: %s"
++ msgstr "E720: Manglende kolon i ordbog: %s"
++
++ #, c-format
++ msgid "E721: Duplicate key in Dictionary: \"%s\""
++ msgstr "E721: Duplikeret nøgle i ordbog: \"%s\""
++
++ #, c-format
++ msgid "E722: Missing comma in Dictionary: %s"
++ msgstr "E722: Manglende komma i ordbog: %s"
++
++ #, c-format
++ msgid "E723: Missing end of Dictionary '}': %s"
++ msgstr "E723: Manglende slutning på ordbog '}': %s"
++
++ msgid "extend() argument"
++ msgstr "extend()-argument"
++
++ #, c-format
++ msgid "E737: Key already exists: %s"
++ msgstr "E737: Nøgle findes allerede: %s"
++
++ #, c-format
++ msgid "E96: Cannot diff more than %ld buffers"
++ msgstr "E96: Kan ikke diff'e flere end %ld buffere"
++
++ msgid "E810: Cannot read or write temp files"
++ msgstr "E810: Kan ikke læse eller skrive midlertidige filer"
++
++ msgid "E97: Cannot create diffs"
++ msgstr "E97: Kan ikke oprette diff'er"
++
++ msgid "Patch file"
++ msgstr "Patch-fil"
++
++ msgid "E816: Cannot read patch output"
++ msgstr "E816: Kan ikke læse patch-output"
++
++ msgid "E98: Cannot read diff output"
++ msgstr "E98: Kan ikke læse diff-output"
++
++ msgid "E99: Current buffer is not in diff mode"
++ msgstr "E99: Nuværende buffer er ikke i diff-tilstand"
++
++ msgid "E793: No other buffer in diff mode is modifiable"
++ msgstr "E793: Ingen anden buffer i diff-tilstand kan ændres"
++
++ msgid "E100: No other buffer in diff mode"
++ msgstr "E100: Ingen anden buffer i diff-tilstand"
++
++ msgid "E101: More than two buffers in diff mode, don't know which one to use"
++ msgstr ""
++ "E101: Mere end to buffere i diff-tilstand, ved ikke hvilke der skal bruges"
++
++ #, c-format
++ msgid "E102: Can't find buffer \"%s\""
++ msgstr "E102: Kan ikke finde bufferen \"%s\""
++
++ #, c-format
++ msgid "E103: Buffer \"%s\" is not in diff mode"
++ msgstr "E103: Bufferen \"%s\" er ikke i diff-tilstand"
++
++ msgid "E787: Buffer changed unexpectedly"
++ msgstr "E787: Buffer ændret uventet"
++
++ msgid "E104: Escape not allowed in digraph"
++ msgstr "E104: Escape ikke tilladt i digraf"
++
++ msgid "E544: Keymap file not found"
++ msgstr "E544: Keymap-fil ikke fundet"
++
++ msgid "E105: Using :loadkeymap not in a sourced file"
++ msgstr "E105: Bruger :loadkeymap ikke i en sourced fil"
++
++ msgid "E791: Empty keymap entry"
++ msgstr "E791: Tom keymap-post"
++
++ msgid " Keyword completion (^N^P)"
++ msgstr " Fuldførelse af nøgleord (^N^P)"
++
++ msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
++ msgstr " ^X tilstand (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"
++
++ msgid " Whole line completion (^L^N^P)"
++ msgstr " Fuldførelse af hel linje (^L^N^P)"
++
++ msgid " File name completion (^F^N^P)"
++ msgstr " Fuldførelse af filnavn (^F^N^P)"
++
++ msgid " Tag completion (^]^N^P)"
++ msgstr " Fuldførelse af tag (^]^N^P)"
++
++ msgid " Path pattern completion (^N^P)"
++ msgstr " Fuldførelse af sti (^N^P)"
++
++ msgid " Definition completion (^D^N^P)"
++ msgstr " Fuldførelse af definition (^D^N^P)"
++
++ msgid " Dictionary completion (^K^N^P)"
++ msgstr " Fuldførelse af ordbog (^K^N^P)"
++
++ msgid " Thesaurus completion (^T^N^P)"
++ msgstr " Fuldførelse af tesaurus (^T^N^P)"
++
++ msgid " Command-line completion (^V^N^P)"
++ msgstr " Fuldførelse af kommandolinje (^V^N^P)"
++
++ msgid " User defined completion (^U^N^P)"
++ msgstr " Fuldførelse af brugerdefineret (^U^N^P)"
++
++ msgid " Omni completion (^O^N^P)"
++ msgstr " Fuldførelse af omni (^O^N^P)"
++
++ msgid " Spelling suggestion (s^N^P)"
++ msgstr " Staveforslag (s^N^P)"
++
++ msgid " Keyword Local completion (^N^P)"
++ msgstr " Fuldførelse af nøgleord local (^N^P)"
++
++ msgid "Hit end of paragraph"
++ msgstr "Stødte på slutningen af afsnit"
++
++ msgid "E839: Completion function changed window"
++ msgstr "E839: Fuldførelse-funktion ændrede vindue"
++
++ msgid "E840: Completion function deleted text"
++ msgstr "E840: Fuldførelse-funktion slettede tekst"
++
++ msgid "'dictionary' option is empty"
++ msgstr "'dictionary'-tilvalget er tomt"
++
++ msgid "'thesaurus' option is empty"
++ msgstr "'thesaurus'-tilvalget er tomt"
++
++ #, c-format
++ msgid "Scanning dictionary: %s"
++ msgstr "Skanner ordbog: %s"
++
++ msgid " (insert) Scroll (^E/^Y)"
++ msgstr " (indsæt) Rul (^E/^Y)"
++
++ msgid " (replace) Scroll (^E/^Y)"
++ msgstr " (erstat) Rul (^E/^Y)"
++
++ #, c-format
++ msgid "Scanning: %s"
++ msgstr "Skanner: %s"
++
++ msgid "Scanning tags."
++ msgstr "Skanner tags."
++
++ msgid "match in file"
++ msgstr "match i fil"
++
++ msgid " Adding"
++ msgstr " Tilføjer"
++
++ msgid "-- Searching..."
++ msgstr "-- Søger..."
++
++ msgid "Back at original"
++ msgstr "Tilbage ved original"
++
++ msgid "Word from other line"
++ msgstr "Ord fra anden linje"
++
++ msgid "The only match"
++ msgstr "Det eneste match"
++
++ #, c-format
++ msgid "match %d of %d"
++ msgstr "match %d af %d"
++
++ #, c-format
++ msgid "match %d"
++ msgstr "match %d"
++
++ msgid "E18: Unexpected characters in :let"
++ msgstr "E18: Uventede tegn i :let"
++
++ #, c-format
++ msgid "E121: Undefined variable: %s"
++ msgstr "E121: Udefineret variabel: %s"
++
++ msgid "E111: Missing ']'"
++ msgstr "E111: Manglende ']'"
++
++ msgid "E719: Cannot use [:] with a Dictionary"
++ msgstr "E719: Kan ikke bruge [:] med en ordbog"
++
++ #, c-format
++ msgid "E734: Wrong variable type for %s="
++ msgstr "E734: Forkert variabeltype for %s="
++
++ #, c-format
++ msgid "E461: Illegal variable name: %s"
++ msgstr "E461: Ulovligt variabelnavn: %s"
++
++ msgid "E806: using Float as a String"
++ msgstr "E806: bruger flydende kommatal som en streng"
++
++ msgid "E687: Less targets than List items"
++ msgstr "E687: Færre mål end listepunkter"
++
++ msgid "E688: More targets than List items"
++ msgstr "E688: Flere mål end listepunkter"
++
++ msgid "Double ; in list of variables"
++ msgstr "Dobbelt ; i liste over variabler"
++
++ #, c-format
++ msgid "E738: Can't list variables for %s"
++ msgstr "E738: Kan ikke opliste variabler for %s"
++
++ msgid "E689: Can only index a List or Dictionary"
++ msgstr "E689: Kan kun indeksere en liste eller ordbog"
++
++ msgid "E708: [:] must come last"
++ msgstr "E708: [:] skal være sidst"
++
++ msgid "E709: [:] requires a List value"
++ msgstr "E709: [:] kræver en listeværdi"
++
++ msgid "E710: List value has more items than target"
++ msgstr "E710: Listeværdi har flere punkter end mål"
++
++ msgid "E711: List value has not enough items"
++ msgstr "E711: Listeværdi har ikke nok punkter"
++
++ msgid "E690: Missing \"in\" after :for"
++ msgstr "E690: Manglende \"in\" efter :for"
++
++ #, c-format
++ msgid "E108: No such variable: \"%s\""
++ msgstr "E108: Ingen sådan variabel: \"%s\""
++
++ #, c-format
++ msgid "E940: Cannot lock or unlock variable %s"
++ msgstr "E940: Kan ikke låse eller låse op for variablen %s"
++
++ msgid "E743: variable nested too deep for (un)lock"
++ msgstr "E743: variabel indlejret for dybt til at blive låst/låst op"
++
++ msgid "E109: Missing ':' after '?'"
++ msgstr "E109: Manglende ':' efter '?'"
++
++ msgid "E804: Cannot use '%' with Float"
++ msgstr "E804: Kan ikke bruge '%' med flydende kommatal"
++
++ msgid "E110: Missing ')'"
++ msgstr "E110: Manglende ')'"
++
++ msgid "E695: Cannot index a Funcref"
++ msgstr "E695: Kan ikke indeksere en funcref"
++
++ msgid "E909: Cannot index a special variable"
++ msgstr "E909: Kan ikke indeksere en speciel variabel"
++
++ #, c-format
++ msgid "E112: Option name missing: %s"
++ msgstr "E112: Tilvalgsnavn mangler: %s"
++
++ #, c-format
++ msgid "E113: Unknown option: %s"
++ msgstr "E113: Ukendt tilvalg: %s"
++
++ #, c-format
++ msgid "E114: Missing quote: %s"
++ msgstr "E114: Manglende citationstegn: %s"
++
++ #, c-format
++ msgid "E115: Missing quote: %s"
++ msgstr "E115: Manglende citationstegn: %s"
++
++ msgid "Not enough memory to set references, garbage collection aborted!"
++ msgstr "Ikke nok hukommelse til at sætte referencer, affaldsindsamling afbrudt!"
++
++ msgid "E724: variable nested too deep for displaying"
++ msgstr "E724: variabel indlejret for dybt til at blive vist"
++
++ msgid "E805: Using a Float as a Number"
++ msgstr "E805: Bruger et flydende kommatal som et nummer"
++
++ msgid "E703: Using a Funcref as a Number"
++ msgstr "E703: Bruger en funcref som et nummer"
++
++ msgid "E745: Using a List as a Number"
++ msgstr "E745: Bruger en liste som et nummer"
++
++ msgid "E728: Using a Dictionary as a Number"
++ msgstr "E728: Bruger en ordbog som et nummer"
++
++ msgid "E910: Using a Job as a Number"
++ msgstr "E910: Bruger et job som et nummer"
++
++ msgid "E913: Using a Channel as a Number"
++ msgstr "E913: Bruger en kanal som et nummer"
++
++ msgid "E891: Using a Funcref as a Float"
++ msgstr "E891: Bruger en funcref som et fyldende kommatal"
++
++ msgid "E892: Using a String as a Float"
++ msgstr "E892: Bruger en streng som et flydende kommatal"
++
++ msgid "E893: Using a List as a Float"
++ msgstr "E893: Bruger en liste som et flydende kommatal"
++
++ msgid "E894: Using a Dictionary as a Float"
++ msgstr "E894: Bruger en ordbog som et flydende kommatal"
++
++ msgid "E907: Using a special value as a Float"
++ msgstr "E907: Bruger en speciel værdi som et flydende kommatal"
++
++ msgid "E911: Using a Job as a Float"
++ msgstr "E911: Bruger et job som et flydende kommatal"
++
++ msgid "E914: Using a Channel as a Float"
++ msgstr "E914: Bruger en kanal som et flydende kommatal"
++
++ msgid "E729: using Funcref as a String"
++ msgstr "E729: bruger funcref som en streng"
++
++ msgid "E730: using List as a String"
++ msgstr "E730: bruger liste som en streng"
++
++ msgid "E731: using Dictionary as a String"
++ msgstr "E731: bruger ordbog som en streng"
++
++ msgid "E908: using an invalid value as a String"
++ msgstr "E908: bruger en ugyldig værdi som en streng"
++
++ #, c-format
++ msgid "E795: Cannot delete variable %s"
++ msgstr "E795: Kan ikke slette variablen %s"
++
++ #, c-format
++ msgid "E704: Funcref variable name must start with a capital: %s"
++ msgstr "E704: Funcref-variabelnavn skal begynde med et stort bogstav: %s"
++
++ #, c-format
++ msgid "E705: Variable name conflicts with existing function: %s"
++ msgstr "E705: Variabelnavn er i konflikt med eksisterende funktion: %s"
++
++ #, c-format
++ msgid "E741: Value is locked: %s"
++ msgstr "E741: Værdien er låst: %s"
++
++ msgid "Unknown"
++ msgstr "Ukendt"
++
++ #, c-format
++ msgid "E742: Cannot change value of %s"
++ msgstr "E742: Kan ikke ændre værdien af %s"
++
++ msgid "E698: variable nested too deep for making a copy"
++ msgstr "E698: variabel indlejret for dybt til at lave en kopi"
++
++ msgid ""
++ "\n"
++ "# global variables:\n"
++ msgstr ""
++ "\n"
++ "# globale variabler:\n"
++
++ msgid ""
++ "\n"
++ "\tLast set from "
++ msgstr ""
++ "\n"
++ "\tSidst sat fra "
++
++ msgid "E691: Can only compare List with List"
++ msgstr "E691: Kan kun sammenligne liste med liste"
++
++ msgid "E692: Invalid operation for List"
++ msgstr "E692: Ugyldig handling for liste"
++
++ msgid "E735: Can only compare Dictionary with Dictionary"
++ msgstr "E735: Kan kun sammenligne ordbog med ordbog"
++
++ msgid "E736: Invalid operation for Dictionary"
++ msgstr "E736: Ugyldig handling for ordbog"
++
++ msgid "E694: Invalid operation for Funcrefs"
++ msgstr "E694: Ugyldig handling for funcref'er"
++
++ msgid "map() argument"
++ msgstr "map()-argument"
++
++ msgid "filter() argument"
++ msgstr "filter()-argument"
++
++ #, c-format
++ msgid "E686: Argument of %s must be a List"
++ msgstr "E686: Argument af %s skal være en liste"
++
++ msgid "E928: String required"
++ msgstr "E928: Streng kræves"
++
++ msgid "E808: Number or Float required"
++ msgstr "E808: Nummer eller flydende kommatal kræves"
++
++ msgid "add() argument"
++ msgstr "add()-argument"
++
++ msgid "E785: complete() can only be used in Insert mode"
++ msgstr "E785: complete() kan kun bruges i indsæt-tilstand"
++
++ msgid "&Ok"
++ msgstr "&Ok"
++
++ #, c-format
++ msgid "+-%s%3ld line: "
++ msgid_plural "+-%s%3ld lines: "
++ msgstr[0] "+-%s%3ld linje: "
++ msgstr[1] "+-%s%3ld linjer: "
++
++ #, c-format
++ msgid "E700: Unknown function: %s"
++ msgstr "E700: Ukendt funktion: %s"
++
++ msgid "E922: expected a dict"
++ msgstr "E922: ventede en ordbog"
++
++ msgid "E923: Second argument of function() must be a list or a dict"
++ msgstr "E923: Andet argument af function() skal være en liste eller en ordbog"
++
++ msgid ""
++ "&OK\n"
++ "&Cancel"
++ msgstr ""
++ "&OK\n"
++ "&Annuller"
++
++ msgid "called inputrestore() more often than inputsave()"
++ msgstr "kaldte inputrestore() flere gange end inputsave()"
++
++ msgid "insert() argument"
++ msgstr "insert()-argument"
++
++ msgid "E786: Range not allowed"
++ msgstr "E786: Område ikke tilladt"
++
++ msgid "E916: not a valid job"
++ msgstr "E916: ikke et gyldigt job"
++
++ msgid "E701: Invalid type for len()"
++ msgstr "E701: Ugyldig type for len()"
++
++ #, c-format
++ msgid "E798: ID is reserved for \":match\": %ld"
++ msgstr "E798: ID er reserveret til \":match\": %ld"
++
++ msgid "E726: Stride is zero"
++ msgstr "E726: Stride er nul"
++
++ msgid "E727: Start past end"
++ msgstr "E727: Start efter slutningen"
++
++ msgid "<empty>"
++ msgstr "<tom>"
++
++ msgid "E240: No connection to the X server"
++ msgstr "E240: Ingen forbindelse til X-serveren"
++
++ #, c-format
++ msgid "E241: Unable to send to %s"
++ msgstr "E241: Kan ikke sende til %s"
++
++ msgid "E277: Unable to read a server reply"
++ msgstr "E277: Kan ikke læse et serversvar"
++
++ msgid "E941: already started a server"
++ msgstr "E941: allerede startet en server"
++
++ msgid "E942: +clientserver feature not available"
++ msgstr "E942: +clientserver-funktionalitet ikke tilgængelig"
++
++ msgid "remove() argument"
++ msgstr "remove()-argument"
++
++ msgid "E655: Too many symbolic links (cycle?)"
++ msgstr "E655: For mange symbolske links (cyklus?)"
++
++ msgid "reverse() argument"
++ msgstr "reverse()-argument"
++
++ msgid "E258: Unable to send to client"
++ msgstr "E258: Kan ikke sende til klient"
++
++ #, c-format
++ msgid "E927: Invalid action: '%s'"
++ msgstr "E927: Ugyldig handling: '%s'"
++
++ msgid "sort() argument"
++ msgstr "sort()-argument"
++
++ msgid "uniq() argument"
++ msgstr "uniq()-argument"
++
++ msgid "E702: Sort compare function failed"
++ msgstr "E702: Sort-sammenligningsfunktion mislykkedes"
++
++ msgid "E882: Uniq compare function failed"
++ msgstr "E882: Uniq-sammenligningsfunktion mislykkedes"
++
++ msgid "(Invalid)"
++ msgstr "(Ugyldig)"
++
++ #, c-format
++ msgid "E935: invalid submatch number: %d"
++ msgstr "E935: ugyldigt undermatch-nummer: %d"
++
++ msgid "E677: Error writing temp file"
++ msgstr "E677: Fejl ved skrivning af midlertidig fil"
++
++ msgid "E921: Invalid callback argument"
++ msgstr "E921: Ugyldigt callback-argument"
++
++ #, c-format
++ msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s"
++ msgstr "<%s>%s%s %d, hex %02x, oct %03o, digr %s"
++
++ #, c-format
++ msgid "<%s>%s%s %d, Hex %02x, Octal %03o"
++ msgstr "<%s>%s%s %d, hex %02x, octal %03o"
++
++ #, c-format
++ msgid "> %d, Hex %04x, Oct %o, Digr %s"
++ msgstr "> %d, hex %04x, oct %o, digr %s"
++
++ #, c-format
++ msgid "> %d, Hex %08x, Oct %o, Digr %s"
++ msgstr "> %d, hex %08x, oct %o, digr %s"
++
++ #, c-format
++ msgid "> %d, Hex %04x, Octal %o"
++ msgstr "> %d, hex %04x, octal %o"
++
++ #, c-format
++ msgid "> %d, Hex %08x, Octal %o"
++ msgstr "> %d, hex %08x, octal %o"
++
++ msgid "E134: Move lines into themselves"
++ msgstr "E134: flyt linjer ind i dem selv"
++
++ msgid "1 line moved"
++ msgstr "1 linje flyttet"
++
++ #, c-format
++ msgid "%ld lines moved"
++ msgstr "%ld linjer flyttet"
++
++ #, c-format
++ msgid "%ld lines filtered"
++ msgstr "%ld linjer filtreret"
++
++ msgid "E135: *Filter* Autocommands must not change current buffer"
++ msgstr "E135: *Filter*-autokommandoer må ikke ændre nuværende buffer"
++
++ msgid "[No write since last change]\n"
++ msgstr "[Ingen skrivning siden sidste ændring]\n"
++
++ #, c-format
++ msgid "%sviminfo: %s in line: "
++ msgstr "%sviminfo: %s på linje: "
++
++ msgid "E136: viminfo: Too many errors, skipping rest of file"
++ msgstr "E136: viminfo: For mange fejl, springer resten af filen over"
++
++ #, c-format
++ msgid "Reading viminfo file \"%s\"%s%s%s"
++ msgstr "Læser viminfo-filen \"%s\"%s%s%s"
++
++ msgid " info"
++ msgstr " info"
++
++ msgid " marks"
++ msgstr " mærker"
++
++ msgid " oldfiles"
++ msgstr " gamle filer"
++
++ msgid " FAILED"
++ msgstr " MISLYKKEDES"
++
++ #, c-format
++ msgid "E137: Viminfo file is not writable: %s"
++ msgstr "E137: Viminfo-filen er skrivebeskyttet: %s"
++
++ #, c-format
++ msgid "E929: Too many viminfo temp files, like %s!"
++ msgstr "E929: For mange midlertidige filer for viminfo, såsom %s!"
++
++ #, c-format
++ msgid "E138: Can't write viminfo file %s!"
++ msgstr "E138: Kan ikke skrive viminfo-filen %s!"
++
++ #, c-format
++ msgid "Writing viminfo file \"%s\""
++ msgstr "Skriver viminfo-filen \"%s\""
++
++ #, c-format
++ msgid "E886: Can't rename viminfo file to %s!"
++ msgstr "E886: Kan ikke omdøbe viminfo-fil til %s!"
++
++ #, c-format
++ msgid "# This viminfo file was generated by Vim %s.\n"
++ msgstr "# Denne viminfo-fil blev genereret af Vim %s.\n"
++
++ msgid ""
++ "# You may edit it if you're careful!\n"
++ "\n"
++ msgstr ""
++ "# Du kan redigere den, hvis du er forsigtig!\n"
++ "\n"
++
++ msgid "# Value of 'encoding' when this file was written\n"
++ msgstr "# Værdien af 'encoding' da filen blev skrevet\n"
++
++ msgid "Illegal starting char"
++ msgstr "Ulovligt tegn i begyndelsen"
++
++ msgid ""
++ "\n"
++ "# Bar lines, copied verbatim:\n"
++ msgstr ""
++ "\n"
++ "#-bjælkelinjer, kopieret ordret:\n"
++
++ msgid "Save As"
++ msgstr "Gem som"
++
++ msgid "Write partial file?"
++ msgstr "Skriv ufuldstændig fil?"
++
++ msgid "E140: Use ! to write partial buffer"
++ msgstr "E140: Brug ! til at skrive ufuldstændig buffer"
++
++ #, c-format
++ msgid "Overwrite existing file \"%s\"?"
++ msgstr "Overskriv eksisterende fil \"%s\"?"
++
++ #, c-format
++ msgid "Swap file \"%s\" exists, overwrite anyway?"
++ msgstr "Swap-filen \"%s\" findes, overskriv alligevel?"
++
++ #, c-format
++ msgid "E768: Swap file exists: %s (:silent! overrides)"
++ msgstr "E768: Swap-filen findes: %s (:silent! tilsidesætter)"
++
++ #, c-format
++ msgid "E141: No file name for buffer %ld"
++ msgstr "E141: Intet filnavn for buffer %ld"
++
++ msgid "E142: File not written: Writing is disabled by 'write' option"
++ msgstr "E142: Fil ikke skrevet: Skrivning er deaktiveret af 'write'-tilvalget"
++
++ #, c-format
++ msgid ""
++ "'readonly' option is set for \"%s\".\n"
++ "Do you wish to write anyway?"
++ msgstr ""
++ "'readonly'-tilvalget er sat for \"%s\".\n"
++ "Vil du skrive alligevel?"
++
++ #, c-format
++ msgid ""
++ "File permissions of \"%s\" are read-only.\n"
++ "It may still be possible to write it.\n"
++ "Do you wish to try?"
++ msgstr ""
++ "Filtilladelserne for \"%s\" er skrivebeskyttede.\n"
++ "Der kan stadig være mulighed for at skrive den.\n"
++ "Vil du prøve?"
++
++ #, c-format
++ msgid "E505: \"%s\" is read-only (add ! to override)"
++ msgstr "E505: \"%s\" er skrivebeskyttet (tilføj ! for at tilsidesætte)"
++
++ msgid "Edit File"
++ msgstr "Rediger fil"
++
++ #, c-format
++ msgid "E143: Autocommands unexpectedly deleted new buffer %s"
++ msgstr "E143: Autokommandoer slettede uventede ny buffer %s"
++
++ msgid "E144: non-numeric argument to :z"
++ msgstr "E144: ikke-numerisk argument til :z"
++
++ msgid "E145: Shell commands not allowed in rvim"
++ msgstr "E145: Skalkommandoer er ikke tilladt i rvim"
++
++ msgid "E146: Regular expressions can't be delimited by letters"
++ msgstr "E146: Regulære udtryk kan ikke afgrænses af bogstaver"
++
++ #, c-format
++ msgid "replace with %s (y/n/a/q/l/^E/^Y)?"
++ msgstr "erstat med %s (y/n/a/q/l/^E/^Y)?"
++
++ msgid "(Interrupted) "
++ msgstr "(Afbrudt) "
++
++ msgid "1 match"
++ msgstr "1 match"
++
++ msgid "1 substitution"
++ msgstr "1 erstatning"
++
++ #, c-format
++ msgid "%ld matches"
++ msgstr "%ld match"
++
++ #, c-format
++ msgid "%ld substitutions"
++ msgstr "%ld erstatninger"
++
++ msgid " on 1 line"
++ msgstr " på 1 linje"
++
++ #, c-format
++ msgid " on %ld lines"
++ msgstr " på %ld linjer"
++
++ msgid "E147: Cannot do :global recursive with a range"
++ msgstr "E147: Kan ikke foretage :global rekursivt med et område"
++
++ msgid "E148: Regular expression missing from global"
++ msgstr "E148: Regulære udtryk mangler fra global"
++
++ #, c-format
++ msgid "Pattern found in every line: %s"
++ msgstr "Mønster fundet på hver linje: %s"
++
++ #, c-format
++ msgid "Pattern not found: %s"
++ msgstr "Mønster ikke fundet: %s"
++
++ msgid ""
++ "\n"
++ "# Last Substitute String:\n"
++ "$"
++ msgstr ""
++ "\n"
++ "# Sidste erstatningsstreng:\n"
++ "$"
++
++ msgid "E478: Don't panic!"
++ msgstr "E478: Tag det bare helt roligt!"
++
++ #, c-format
++ msgid "E661: Sorry, no '%s' help for %s"
++ msgstr "E661: Beklager, ingen '%s' hjælp til %s"
++
++ #, c-format
++ msgid "E149: Sorry, no help for %s"
++ msgstr "E149: Beklager, ingen hjælp til %s"
++
++ #, c-format
++ msgid "Sorry, help file \"%s\" not found"
++ msgstr "Beklager, hjælpfilen \"%s\" ikke fundet"
++
++ #, c-format
++ msgid "E151: No match: %s"
++ msgstr "E151: Intet match: %s"
++
++ #, c-format
++ msgid "E152: Cannot open %s for writing"
++ msgstr "E152: Kan ikke åbne %s til skrivning"
++
++ #, c-format
++ msgid "E153: Unable to open %s for reading"
++ msgstr "E153: Kan ikke åbne %s til læsning"
++
++ #, c-format
++ msgid "E670: Mix of help file encodings within a language: %s"
++ msgstr "E670: Blanding af kodninger for hjælpfiler i samme sprog: %s"
++
++ #, c-format
++ msgid "E154: Duplicate tag \"%s\" in file %s/%s"
++ msgstr "E154: Duplikeret tag \"%s\" i fil %s/%s"
++
++ #, c-format
++ msgid "E150: Not a directory: %s"
++ msgstr "E150: Ikke en mappe: %s"
++
++ #, c-format
++ msgid "E160: Unknown sign command: %s"
++ msgstr "E160: Ukendt sign-kommando: %s"
++
++ msgid "E156: Missing sign name"
++ msgstr "E156: Manglende sign-navn"
++
++ msgid "E612: Too many signs defined"
++ msgstr "E612: For mange signs defineret"
++
++ #, c-format
++ msgid "E239: Invalid sign text: %s"
++ msgstr "E239: Ugyldig sign-tekst: %s"
++
++ #, c-format
++ msgid "E155: Unknown sign: %s"
++ msgstr "E155: Ukendt sign: %s"
++
++ msgid "E159: Missing sign number"
++ msgstr "E159: Manglende sign-nummer"
++
++ #, c-format
++ msgid "E158: Invalid buffer name: %s"
++ msgstr "E158: Ugyldigt buffernavn: %s"
++
++ msgid "E934: Cannot jump to a buffer that does not have a name"
++ msgstr "E934: Kan ikke hoppe til en buffer som ikke har et navn"
++
++ #, c-format
++ msgid "E157: Invalid sign ID: %ld"
++ msgstr "E157: Ugyldigt sign-ID: %ld"
++
++ #, c-format
++ msgid "E885: Not possible to change sign %s"
++ msgstr "E885: Det er ikke muligt at ændre sign %s"
++
++ msgid " (NOT FOUND)"
++ msgstr " (IKKE FUNDET)"
++
++ msgid " (not supported)"
++ msgstr " (understøttes ikke)"
++
++ msgid "[Deleted]"
++ msgstr "[Slettet]"
++
++ msgid "No old files"
++ msgstr "Ingen gamle filer"
++
++ msgid "Entering Debug mode. Type \"cont\" to continue."
++ msgstr "Går i fejlretningstilstand. Skriv \"cont\" for at fortsætte."
++
++ #, c-format
++ msgid "Oldval = \"%s\""
++ msgstr "Oldval = \"%s\""
++
++ #, c-format
++ msgid "Newval = \"%s\""
++ msgstr "Newval = \"%s\""
++
++ #, c-format
++ msgid "line %ld: %s"
++ msgstr "linje %ld: %s"
++
++ #, c-format
++ msgid "cmd: %s"
++ msgstr "cmd: %s"
++
++ msgid "frame is zero"
++ msgstr "ramme er nul"
++
++ #, c-format
++ msgid "frame at highest level: %d"
++ msgstr "ramme på højeste niveau: %d"
++
++ #, c-format
++ msgid "Breakpoint in \"%s%s\" line %ld"
++ msgstr "Breakpoint i \"%s%s\" linje %ld"
++
++ #, c-format
++ msgid "E161: Breakpoint not found: %s"
++ msgstr "E161: Breakpoint ikke fundet: %s"
++
++ msgid "No breakpoints defined"
++ msgstr "Ingen breakpoints defineret"
++
++ #, c-format
++ msgid "%3d %s %s line %ld"
++ msgstr "%3d %s %s linje %ld"
++
++ #, c-format
++ msgid "%3d expr %s"
++ msgstr "%3d udtryk %s"
++
++ msgid "E750: First use \":profile start {fname}\""
++ msgstr "E750: Brug først \":profile start {fname}\""
++
++ #, c-format
++ msgid "Save changes to \"%s\"?"
++ msgstr "Gem ændringer til \"%s\"?"
++
++ #, c-format
++ msgid "E947: Job still running in buffer \"%s\""
++ msgstr "E947: Job kører stadig i bufferen \"%s\""
++
++ #, c-format
++ msgid "E162: No write since last change for buffer \"%s\""
++ msgstr "E162: Ingen skrivning siden sidste ændring for bufferen \"%s\""
++
++ msgid "Warning: Entered other buffer unexpectedly (check autocommands)"
++ msgstr "Advarsel: Indtastede anden buffer uventede (tjek autokommandoer)"
++
++ msgid "E163: There is only one file to edit"
++ msgstr "E163: Der er kun én fil at redigere"
++
++ msgid "E164: Cannot go before first file"
++ msgstr "E164: Kan ikke gå før første fil"
++
++ msgid "E165: Cannot go beyond last file"
++ msgstr "E165: Kan ikke gå over sidste fil"
++
++ #, c-format
++ msgid "E666: compiler not supported: %s"
++ msgstr "E666: kompiler understøttes ikke: %s"
++
++ #, c-format
++ msgid "Searching for \"%s\" in \"%s\""
++ msgstr "Søger efter \"%s\" i \"%s\""
++
++ #, c-format
++ msgid "Searching for \"%s\""
++ msgstr "Søger efter \"%s\""
++
++ #, c-format
++ msgid "not found in '%s': \"%s\""
++ msgstr "ikke fundet i '%s': \"%s\""
++
++ #, c-format
++ msgid "W20: Required python version 2.x not supported, ignoring file: %s"
++ msgstr "W20: Krævede python-version 2.x understøttes ikke, ignorerer fil: %s"
++
++ #, c-format
++ msgid "W21: Required python version 3.x not supported, ignoring file: %s"
++ msgstr "W21: Krævede python-version 3.x understøttes ikke, ignorerer fil: %s"
++
++ msgid "Source Vim script"
++ msgstr "Source Vim-script"
++
++ #, c-format
++ msgid "Cannot source a directory: \"%s\""
++ msgstr "Kan ikke source en mappe: \"%s\""
++
++ #, c-format
++ msgid "could not source \"%s\""
++ msgstr "kunne ikke source \"%s\""
++
++ #, c-format
++ msgid "line %ld: could not source \"%s\""
++ msgstr "linje %ld: kunne ikke source \"%s\""
++
++ #, c-format
++ msgid "sourcing \"%s\""
++ msgstr "sourcing \"%s\""
++
++ #, c-format
++ msgid "line %ld: sourcing \"%s\""
++ msgstr "linje %ld: sourcing \"%s\""
++
++ #, c-format
++ msgid "finished sourcing %s"
++ msgstr "færdig med sourcing af %s"
++
++ #, c-format
++ msgid "continuing in %s"
++ msgstr "fortsætter i %s"
++
++ msgid "modeline"
++ msgstr "tilstandslinje"
++
++ msgid "--cmd argument"
++ msgstr "--cmd-argument"
++
++ msgid "-c argument"
++ msgstr "-c-argument"
++
++ msgid "environment variable"
++ msgstr "miljøvariabel"
++
++ msgid "error handler"
++ msgstr "fejlhåndtering"
++
++ msgid "W15: Warning: Wrong line separator, ^M may be missing"
++ msgstr "W15: Advarsel: Forkert linjeseparator, ^M mangler muligvis"
++
++ msgid "E167: :scriptencoding used outside of a sourced file"
++ msgstr "E167: :scriptencoding brugt udenfor en sourced fil"
++
++ msgid "E168: :finish used outside of a sourced file"
++ msgstr "E168: :finish udenfor en sourced fil"
++
++ #, c-format
++ msgid "Current %slanguage: \"%s\""
++ msgstr "Nuværende %ssprog: \"%s\""
++
++ #, c-format
++ msgid "E197: Cannot set language to \"%s\""
++ msgstr "E197: Kan ikke sætte sprog til \"%s\""
++
++ msgid "Entering Ex mode. Type \"visual\" to go to Normal mode."
++ msgstr "Går i Ex-tilstand. Skriv \"visual\" for at gå til normal tilstand."
++
++ msgid "E501: At end-of-file"
++ msgstr "E501: Ved filens slutning"
++
++ msgid "E169: Command too recursive"
++ msgstr "E169: Kommando for rekursiv"
++
++ #, c-format
++ msgid "E605: Exception not caught: %s"
++ msgstr "E605: Undtagelse ikke fanget: %s"
++
++ msgid "End of sourced file"
++ msgstr "Slut på sourced fil"
++
++ msgid "End of function"
++ msgstr "Slutning af funktion"
++
++ msgid "E464: Ambiguous use of user-defined command"
++ msgstr "E464: Flertydig brug af brugerdefineret kommando"
++
++ msgid "E492: Not an editor command"
++ msgstr "E492: Ikke en editor-kommando"
++
++ msgid "E493: Backwards range given"
++ msgstr "E493: Baglæns område givet"
++
++ msgid "Backwards range given, OK to swap"
++ msgstr "Baglæns område givet, OK at bytte om"
++
++ msgid "E494: Use w or w>>"
++ msgstr "E494: Brug w eller w>>"
++
++ msgid "E943: Command table needs to be updated, run 'make cmdidxs'"
++ msgstr "E943: Kommandotabel skal opdateres, kør 'make cmdidxs'"
++
++ msgid "E319: Sorry, the command is not available in this version"
++ msgstr "E319: Beklager, kommandoen er ikke tilgængelig i denne version"
++
++ msgid "1 more file to edit. Quit anyway?"
++ msgstr "1 fil mere at redigere. Afslut alligevel?"
++
++ #, c-format
++ msgid "%d more files to edit. Quit anyway?"
++ msgstr "%d filer mere at redigere. Afslut alligevel?"
++
++ msgid "E173: 1 more file to edit"
++ msgstr "E173: 1 fil mere at redigere"
++
++ #, c-format
++ msgid "E173: %ld more files to edit"
++ msgstr "E173: %ld filer mere at redigere"
++
++ msgid "E174: Command already exists: add ! to replace it"
++ msgstr "E174: Kommandoen findes allerede: tilføj ! for at erstatte den"
++
++ msgid ""
++ "\n"
++ " Name Args Address Complete Definition"
++ msgstr ""
++ "\n"
++ " Navn Argumenter Adresse Fuldført Definition"
++
++ msgid "No user-defined commands found"
++ msgstr "Fandt ingen brugerdefinerede kommandoer"
++
++ msgid "E175: No attribute specified"
++ msgstr "E175: Ingen attribut angivet"
++
++ msgid "E176: Invalid number of arguments"
++ msgstr "E176: Ugyldigt antal argumenter"
++
++ msgid "E177: Count cannot be specified twice"
++ msgstr "E177: Tælling må ikke angives to gange"
++
++ msgid "E178: Invalid default value for count"
++ msgstr "E178: Ugyldig standardværdi for tælling"
++
++ msgid "E179: argument required for -complete"
++ msgstr "E179: argument kræves til -complete"
++
++ msgid "E179: argument required for -addr"
++ msgstr "E179: argument kræves til -addr"
++
++ #, c-format
++ msgid "E181: Invalid attribute: %s"
++ msgstr "E181: Ugyldig attribut: %s"
++
++ msgid "E182: Invalid command name"
++ msgstr "E182: Ugyldigt kommandonavn"
++
++ msgid "E183: User defined commands must start with an uppercase letter"
++ msgstr "E183: Brugerdefinerede kommandoer skal begynde med et stort bogstav"
++
++ msgid "E841: Reserved name, cannot be used for user defined command"
++ msgstr "E841: Reserveret navn, kan ikke bruges til brugerdefineret kommando"
++
++ #, c-format
++ msgid "E184: No such user-defined command: %s"
++ msgstr "E184: Ingen sådan brugerdefineret kommando: %s"
++
++ #, c-format
++ msgid "E180: Invalid address type value: %s"
++ msgstr "E180: Ugyldig værdi for adressetype: %s"
++
++ #, c-format
++ msgid "E180: Invalid complete value: %s"
++ msgstr "E180: Ugyldig complete-værdi: %s"
++
++ msgid "E468: Completion argument only allowed for custom completion"
++ msgstr "E468: Fuldførelse-argument kun tilladt for tilpasset fuldførelse"
++
++ msgid "E467: Custom completion requires a function argument"
++ msgstr "E467: Tilpasset fuldførelse kræver et funktion-argument"
++
++ msgid "unknown"
++ msgstr "ukendt"
++
++ #, c-format
++ msgid "E185: Cannot find color scheme '%s'"
++ msgstr "E185: Kan ikke finde farveskemaet '%s'"
++
++ msgid "Greetings, Vim user!"
++ msgstr "Hejsa, Vim-bruger!"
++
++ msgid "E784: Cannot close last tab page"
++ msgstr "E784: Kan ikke lukke sidste fanebladsside"
++
++ msgid "Already only one tab page"
++ msgstr "Allerede kun én fanebladsside"
++
++ msgid "Edit File in new window"
++ msgstr "Rediger fil i nyt vindue"
++
++ #, c-format
++ msgid "Tab page %d"
++ msgstr "Fanebladsside %d"
++
++ msgid "No swap file"
++ msgstr "Ingen swap-fil"
++
++ msgid "Append File"
++ msgstr "Tilføj fil til slutningen"
++
++ msgid "E747: Cannot change directory, buffer is modified (add ! to override)"
++ msgstr ""
++ "E747: Kan ikke skifte mappe, buffer er ændret (tilføj ! for at tilsidesætte)"
++
++ msgid "E186: No previous directory"
++ msgstr "E186: Ingen tidligere ordbog"
++
++ msgid "E187: Unknown"
++ msgstr "E187: Ukendt"
++
++ msgid "E465: :winsize requires two number arguments"
++ msgstr "E465: :winsize kræver to nummer-argumenter"
++
++ #, c-format
++ msgid "Window position: X %d, Y %d"
++ msgstr "Vinduesplacering: X %d, Y %d"
++
++ msgid "E188: Obtaining window position not implemented for this platform"
++ msgstr ""
++ "E188: Indhentelse af vinduesplacering ikke implementeret på denne platform"
++
++ msgid "E466: :winpos requires two number arguments"
++ msgstr "E466: :winpos kræver to nummer-argumenter"
++
++ msgid "E930: Cannot use :redir inside execute()"
++ msgstr "E930: Kan ikke bruge :redir i execute()"
++
++ msgid "Save Redirection"
++ msgstr "Gem omdirigering"
++
++ msgid "Save View"
++ msgstr "Gem visning"
++
++ msgid "Save Session"
++ msgstr "Gem session"
++
++ msgid "Save Setup"
++ msgstr "Gem opsætning"
++
++ #, c-format
++ msgid "E739: Cannot create directory: %s"
++ msgstr "E739: Kan ikke oprette mappe: %s"
++
++ #, c-format
++ msgid "E189: \"%s\" exists (add ! to override)"
++ msgstr "E189: \"%s\" findes (tilføj ! for at tilsidesætte)"
++
++ #, c-format
++ msgid "E190: Cannot open \"%s\" for writing"
++ msgstr "E190: Kan ikke åbne \"%s\" til skrivning"
++
++ msgid "E191: Argument must be a letter or forward/backward quote"
++ msgstr ""
++ "E191: Argument skal være et bogstav eller retvendt/omvendt citationstegn"
++
++ msgid "E192: Recursive use of :normal too deep"
++ msgstr "E192: Rekursiv brug af :normal for dyb"
++
++ msgid "E809: #< is not available without the +eval feature"
++ msgstr "E809: #< er ikke tilgængelig uden +eval-funktionaliteten"
++
++ msgid "E194: No alternate file name to substitute for '#'"
++ msgstr "E194: Intet alternate-filnavn til erstatning for '#'"
++
++ msgid "E495: no autocommand file name to substitute for \"<afile>\""
++ msgstr "E495: intet autokommando-filnavn til erstatning for \"<afile>\""
++
++ msgid "E496: no autocommand buffer number to substitute for \"<abuf>\""
++ msgstr "E496: intet autokommando-buffernummer til erstatning for \"<abuf>\""
++
++ msgid "E497: no autocommand match name to substitute for \"<amatch>\""
++ msgstr "E497: intet autokommando-matchnavn til erstatning for \"<amatch>\""
++
++ msgid "E498: no :source file name to substitute for \"<sfile>\""
++ msgstr "E498: intet :source-filnavn til erstatning for \"<sfile>\""
++
++ msgid "E842: no line number to use for \"<slnum>\""
++ msgstr "E842: intet linjenummer til brug for \"<slnum>\""
++
++ #, no-c-format
++ msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
++ msgstr "E499: Tomt filnavn for '%' eller '#', virker kun med \":p:h\""
++
++ msgid "E500: Evaluates to an empty string"
++ msgstr "E500: Evaluerer til en tom streng"
++
++ msgid "E195: Cannot open viminfo file for reading"
++ msgstr "E195: Kan ikke åbne viminfo-fil til læsning"
++
++ msgid "Untitled"
++ msgstr "Unavngivet"
++
++ msgid "E196: No digraphs in this version"
++ msgstr "E196: Ingen digraffer i denne version"
++
++ msgid "E608: Cannot :throw exceptions with 'Vim' prefix"
++ msgstr "E608: Kan ikke :throw-undtagelser med 'Vim'-præfiks"
++
++ #, c-format
++ msgid "Exception thrown: %s"
++ msgstr "Undtagelse kastet: %s"
++
++ #, c-format
++ msgid "Exception finished: %s"
++ msgstr "Undtagelse færdig: %s"
++
++ #, c-format
++ msgid "Exception discarded: %s"
++ msgstr "Undtagelse forkastet: %s"
++
++ #, c-format
++ msgid "%s, line %ld"
++ msgstr "%s, linje %ld"
++
++ #, c-format
++ msgid "Exception caught: %s"
++ msgstr "Undtagelse fanget: %s"
++
++ #, c-format
++ msgid "%s made pending"
++ msgstr "%s gjort afventende"
++
++ #, c-format
++ msgid "%s resumed"
++ msgstr "%s genoptaget"
++
++ #, c-format
++ msgid "%s discarded"
++ msgstr "%s forkastet"
++
++ msgid "Exception"
++ msgstr "Undtagelse"
++
++ msgid "Error and interrupt"
++ msgstr "Fejl og afbryd"
++
++ msgid "Error"
++ msgstr "Fejl"
++
++ msgid "Interrupt"
++ msgstr "Afbryd"
++
++ msgid "E579: :if nesting too deep"
++ msgstr "E579: :if-indlejring for dyb"
++
++ msgid "E580: :endif without :if"
++ msgstr "E580: :endif uden :if"
++
++ msgid "E581: :else without :if"
++ msgstr "E581: :else uden :if"
++
++ msgid "E582: :elseif without :if"
++ msgstr "E582: :elseif uden :if"
++
++ msgid "E583: multiple :else"
++ msgstr "E583: flere :else"
++
++ msgid "E584: :elseif after :else"
++ msgstr "E584: :elseif efter :else"
++
++ msgid "E585: :while/:for nesting too deep"
++ msgstr "E585: :while/:for-indlejring for dyb"
++
++ msgid "E586: :continue without :while or :for"
++ msgstr "E586: :continue uden :while eller :for"
++
++ msgid "E587: :break without :while or :for"
++ msgstr "E587: :break uden :while eller :for"
++
++ msgid "E732: Using :endfor with :while"
++ msgstr "E732: Bruger :endfor med :while"
++
++ msgid "E733: Using :endwhile with :for"
++ msgstr "E733: Bruger :endwhile med :for"
++
++ msgid "E601: :try nesting too deep"
++ msgstr "E601: :try-indlejring for dyb"
++
++ msgid "E603: :catch without :try"
++ msgstr "E603: :catch uden :try"
++
++ msgid "E604: :catch after :finally"
++ msgstr "E604: :catch efter :finally"
++
++ msgid "E606: :finally without :try"
++ msgstr "E606: :finally uden :try"
++
++ msgid "E607: multiple :finally"
++ msgstr "E607: flere :finally"
++
++ msgid "E602: :endtry without :try"
++ msgstr "E602: :endtry uden :try"
++
++ msgid "E193: :endfunction not inside a function"
++ msgstr "E193: :endfunction ikke i en funktion"
++
++ msgid "E788: Not allowed to edit another buffer now"
++ msgstr "E788: Ikke tilladt at redigere anden buffer nu"
++
++ msgid "E811: Not allowed to change buffer information now"
++ msgstr "E811: Ikke tilladt at ændre bufferinformation nu"
++
++ msgid "tagname"
++ msgstr "tagnavn"
++
++ msgid " kind file\n"
++ msgstr " kind-fil\n"
++
++ msgid "'history' option is zero"
++ msgstr "'history'-tilvalget er nul"
++
++ #, c-format
++ msgid ""
++ "\n"
++ "# %s History (newest to oldest):\n"
++ msgstr ""
++ "\n"
++ "# %s Historik (nyeste til ældste):\n"
++
++ msgid "Command Line"
++ msgstr "Kommandolinje"
++
++ msgid "Search String"
++ msgstr "Søgestreng"
++
++ msgid "Expression"
++ msgstr "Udtryk"
++
++ msgid "Input Line"
++ msgstr "Inputlinje"
++
++ msgid "Debug Line"
++ msgstr "Fejlretningslinje"
++
++ msgid "E198: cmd_pchar beyond the command length"
++ msgstr "E198: cmd_pchar efter kommandolængden"
++
++ msgid "E199: Active window or buffer deleted"
++ msgstr "E199: Aktivt vindue eller buffer slettet"
++
++ msgid "E812: Autocommands changed buffer or buffer name"
++ msgstr "E812: Autokommandoer ændrede buffer eller buffernavn"
++
++ msgid "Illegal file name"
++ msgstr "Ulovlig filnavn"
++
++ msgid "is a directory"
++ msgstr "er en mappe"
++
++ msgid "is not a file"
++ msgstr "er ikke en fil"
++
++ msgid "is a device (disabled with 'opendevice' option)"
++ msgstr "er en enhed (deaktiveret med 'opendevice'-tilvalget)"
++
++ msgid "[New File]"
++ msgstr "[Ny fil]"
++
++ msgid "[New DIRECTORY]"
++ msgstr "[Ny MAPPE]"
++
++ msgid "[File too big]"
++ msgstr "[Filen er for stor]"
++
++ msgid "[Permission Denied]"
++ msgstr "[Tilladelse nægtet]"
++
++ msgid "E200: *ReadPre autocommands made the file unreadable"
++ msgstr "E200: *ReadPre-autokommandoer gjorde filen ulæselig"
++
++ msgid "E201: *ReadPre autocommands must not change current buffer"
++ msgstr "E201: *ReadPre-autokommandoer må ikke ændre nuværende buffer"
++
++ msgid "Vim: Reading from stdin...\n"
++ msgstr "Vim: Læser fra stdin...\n"
++
++ msgid "Reading from stdin..."
++ msgstr "Læser fra stdin..."
++
++ msgid "E202: Conversion made file unreadable!"
++ msgstr "E202: Konvertering gjorde filen ulæselig!"
++
++ msgid "[fifo/socket]"
++ msgstr "[fifo/sokkel]"
++
++ msgid "[fifo]"
++ msgstr "[fifo]"
++
++ msgid "[socket]"
++ msgstr "[sokkel]"
++
++ msgid "[character special]"
++ msgstr "[character special]"
++
++ msgid "[CR missing]"
++ msgstr "[CR mangler]"
++
++ msgid "[long lines split]"
++ msgstr "[opdeling af lange linjer]"
++
++ msgid "[NOT converted]"
++ msgstr "[IKKE konverteret]"
++
++ msgid "[converted]"
++ msgstr "[konverteret]"
++
++ #, c-format
++ msgid "[CONVERSION ERROR in line %ld]"
++ msgstr "[KONVERTERINGSFEJL på linje %ld]"
++
++ #, c-format
++ msgid "[ILLEGAL BYTE in line %ld]"
++ msgstr "[ULOVLIG BYTE på linje %ld]"
++
++ msgid "[READ ERRORS]"
++ msgstr "[LÆSEFEJL]"
++
++ msgid "Can't find temp file for conversion"
++ msgstr "Kan ikke finde midlertidig fil til konvertering"
++
++ msgid "Conversion with 'charconvert' failed"
++ msgstr "Konvertering med 'charconvert' mislykkedes"
++
++ msgid "can't read output of 'charconvert'"
++ msgstr "kan ikke læse output af 'charconvert'"
++
++ msgid "E676: No matching autocommands for acwrite buffer"
++ msgstr "E676: Ingen matchende autokommandoer for acwrite-buffer"
++
++ msgid "E203: Autocommands deleted or unloaded buffer to be written"
++ msgstr "E203: Autokommandoer slettet eller udlæste buffer som skal skrives"
++
++ msgid "E204: Autocommand changed number of lines in unexpected way"
++ msgstr "E204: Autokommando ændrede antal linjer på en uventede måde"
++
++ msgid "NetBeans disallows writes of unmodified buffers"
++ msgstr "NetBeans tillader ikke skrivninger af uændrede buffere"
++
++ msgid "Partial writes disallowed for NetBeans buffers"
++ msgstr "Ufuldstændige skrivninger er ikke tilladt for NetBeans-buffere"
++
++ msgid "is not a file or writable device"
++ msgstr "er ikke en fil eller enhed som der kan skrives til"
++
++ msgid "writing to device disabled with 'opendevice' option"
++ msgstr "skrivning til enhed er deaktiveret med 'opendevice'-tilvalget"
++
++ msgid "is read-only (add ! to override)"
++ msgstr "er skrivebeskyttet (tilføj ! for at tilsidesætte)"
++
++ msgid "E506: Can't write to backup file (add ! to override)"
++ msgstr ""
++ "E506: Kan ikke skrive til sikkerhedskopieret fil (tilføj ! for at "
++ "tilsidesætte)"
++
++ msgid "E507: Close error for backup file (add ! to override)"
++ msgstr ""
++ "E507: Fejl ved lukning af sikkerhedskopieret fil (tilføj ! for at "
++ "tilsidesætte)"
++
++ msgid "E508: Can't read file for backup (add ! to override)"
++ msgstr ""
++ "E508: Kan ikke læse fil til sikkerhedskopiering (tilføj ! for at "
++ "tilsidesætte)"
++
++ msgid "E509: Cannot create backup file (add ! to override)"
++ msgstr ""
++ "E509: Kan ikke oprette (create) sikkerhedskopieret fil (tilføj ! for at "
++ "tilsidesætte)"
++
++ msgid "E510: Can't make backup file (add ! to override)"
++ msgstr ""
++ "E510: Kan ikke oprette (make) sikkerhedskopieret fil (tilføj ! for at "
++ "tilsidesætte)"
++
++ msgid "E214: Can't find temp file for writing"
++ msgstr "E214: Kan ikke finde midlertidig fil til skrivning"
++
++ msgid "E213: Cannot convert (add ! to write without conversion)"
++ msgstr "E213: Kan ikke konvertere (tilføj ! for at skrive uden konvertering)"
++
++ msgid "E166: Can't open linked file for writing"
++ msgstr "E166: Kan ikke åbne linket fil til skrivning"
++
++ msgid "E212: Can't open file for writing"
++ msgstr "E212: Kan ikke åbne filen til skrivning"
++
++ msgid "E949: File changed while writing"
++ msgstr "E949: Filen blev ændret ved skrivning"
++
++ msgid "E512: Close failed"
++ msgstr "E512: Lukning mislykkedes"
++
++ msgid "E513: write error, conversion failed (make 'fenc' empty to override)"
++ msgstr ""
++ "E513: fejl ved skrivning, konvertering mislykkedes (gør 'fenc' tom for at "
++ "tilsidesætte)"
++
++ #, c-format
++ msgid ""
++ "E513: write error, conversion failed in line %ld (make 'fenc' empty to "
++ "override)"
++ msgstr ""
++ "E513: fejl ved skrivning, konvertering mislykkedes på linje %ld (gør 'fenc' "
++ "tom for at tilsidesætte)"
++
++ msgid "E514: write error (file system full?)"
++ msgstr "E514: skrivefejl (er filsystemet fuldt?)"
++
++ msgid " CONVERSION ERROR"
++ msgstr " KONVERTERINGSFEJL"
++
++ #, c-format
++ msgid " in line %ld;"
++ msgstr " på linje %ld;"
++
++ msgid "[Device]"
++ msgstr "[Enhed]"
++
++ msgid "[New]"
++ msgstr "[Ny]"
++
++ msgid " [a]"
++ msgstr " [a]"
++
++ msgid " appended"
++ msgstr " tilføjet i slutningen"
++
++ msgid " [w]"
++ msgstr " [s]"
++
++ msgid " written"
++ msgstr " skrevet"
++
++ msgid "E205: Patchmode: can't save original file"
++ msgstr "E205: Patchmode: kan ikke gemme original fil"
++
++ msgid "E206: patchmode: can't touch empty original file"
++ msgstr "E206: patchmode: kan ikke touch tom original fil"
++
++ msgid "E207: Can't delete backup file"
++ msgstr "E207: Kan ikke slette sikkerhedskopieret fil"
++
++ msgid ""
++ "\n"
++ "WARNING: Original file may be lost or damaged\n"
++ msgstr ""
++ "\n"
++ "ADVARSEL: Den originale fil kan man mistet eller beskadiget\n"
++
++ msgid "don't quit the editor until the file is successfully written!"
++ msgstr "afslut ikke editoren inden filen er blevet skrevet!"
++
++ msgid "[dos]"
++ msgstr "[dos]"
++
++ msgid "[dos format]"
++ msgstr "[dos-format]"
++
++ msgid "[mac]"
++ msgstr "[mac]"
++
++ msgid "[mac format]"
++ msgstr "[mac-format]"
++
++ msgid "[unix]"
++ msgstr "[unix]"
++
++ msgid "[unix format]"
++ msgstr "[unix-format]"
++
++ msgid "1 line, "
++ msgstr "1 linje, "
++
++ #, c-format
++ msgid "%ld lines, "
++ msgstr "%ld linjer, "
++
++ msgid "1 character"
++ msgstr "1 tegn"
++
++ #, c-format
++ msgid "%lld characters"
++ msgstr "%lld tegn"
++
++ msgid "[noeol]"
++ msgstr "[ingen eol]"
++
++ msgid "[Incomplete last line]"
++ msgstr "[Ufuldstændig sidste linje]"
++
++ msgid "WARNING: The file has been changed since reading it!!!"
++ msgstr "ADVARSEL: Filen er blevet ændret siden den blev læst!!!"
++
++ msgid "Do you really want to write to it"
++ msgstr "Vil du virkelig skrive den"
++
++ #, c-format
++ msgid "E208: Error writing to \"%s\""
++ msgstr "E208: Fejl ved skrivning til \"%s\""
++
++ #, c-format
++ msgid "E209: Error closing \"%s\""
++ msgstr "E209: Fejl ved lukning af \"%s\""
++
++ #, c-format
++ msgid "E210: Error reading \"%s\""
++ msgstr "E210: Fejl ved læsning af \"%s\""
++
++ msgid "E246: FileChangedShell autocommand deleted buffer"
++ msgstr "E246: FileChangedShell-autokommando slettede buffer"
++
++ #, c-format
++ msgid "E211: File \"%s\" no longer available"
++ msgstr "E211: Filen \"%s\" er ikke længere tilgængelig"
++
++ #, c-format
++ msgid ""
++ "W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as "
++ "well"
++ msgstr ""
++ "W12: Advarsel: Filen \"%s\" er blevet ændret og bufferen blev også ændret i "
++ "Vim"
++
++ msgid "See \":help W12\" for more info."
++ msgstr "Se \":help W12\" for mere info."
++
++ #, c-format
++ msgid "W11: Warning: File \"%s\" has changed since editing started"
++ msgstr "W11: Advarsel: Filen \"%s\" er blevet ændret siden redigeringen startede"
++
++ msgid "See \":help W11\" for more info."
++ msgstr "Se \":help W11\" for mere info."
++
++ #, c-format
++ msgid "W16: Warning: Mode of file \"%s\" has changed since editing started"
++ msgstr ""
++ "W16: Advarsel: Tilstanden af filen \"%s\" er blevet ændret siden redigeringen "
++ "startede"
++
++ msgid "See \":help W16\" for more info."
++ msgstr "Se \":help W16\" for mere info."
++
++ #, c-format
++ msgid "W13: Warning: File \"%s\" has been created after editing started"
++ msgstr ""
++ "W13: Advarsel: Filen \"%s\" er blevet oprettet efter redigeringen startede"
++
++ msgid "Warning"
++ msgstr "Advarsel"
++
++ msgid ""
++ "&OK\n"
++ "&Load File"
++ msgstr ""
++ "&OK\n"
++ "&Indlæs fil"
++
++ #, c-format
++ msgid "E462: Could not prepare for reloading \"%s\""
++ msgstr "E462: Kunne ikke forbedre til genindlæsning af \"%s\""
++
++ #, c-format
++ msgid "E321: Could not reload \"%s\""
++ msgstr "E321: Kunne ikke genindlæse \"%s\""
++
++ msgid "--Deleted--"
++ msgstr "--Slettet--"
++
++ #, c-format
++ msgid "auto-removing autocommand: %s <buffer=%d>"
++ msgstr "auto-removing-autokommando: %s <buffer=%d>"
++
++ #, c-format
++ msgid "E367: No such group: \"%s\""
++ msgstr "E367: Ingen sådan gruppe: \"%s\""
++
++ msgid "E936: Cannot delete the current group"
++ msgstr "E936: Kan ikke slette den nuværende gruppe"
++
++ msgid "W19: Deleting augroup that is still in use"
++ msgstr "W19: Sletter augroup som stadig er i brug"
++
++ #, c-format
++ msgid "E215: Illegal character after *: %s"
++ msgstr "E215: Ulovligt tegn efter *: %s"
++
++ #, c-format
++ msgid "E216: No such event: %s"
++ msgstr "E216: Ingen sådan hændelse: %s"
++
++ #, c-format
++ msgid "E216: No such group or event: %s"
++ msgstr "E216: Ingen sådan gruppe eller hændelse: %s"
++
++ msgid ""
++ "\n"
++ "--- Auto-Commands ---"
++ msgstr ""
++ "\n"
++ "--- Auto-kommandoer ---"
++
++ #, c-format
++ msgid "E680: <buffer=%d>: invalid buffer number "
++ msgstr "E680: <buffer=%d>: ugyldigt buffernummer "
++
++ msgid "E217: Can't execute autocommands for ALL events"
++ msgstr "E217: Kan ikke udføre autokommandoer for ALLE hændelser"
++
++ msgid "No matching autocommands"
++ msgstr "Ingen matchende autokommandoer"
++
++ msgid "E218: autocommand nesting too deep"
++ msgstr "E218: autokommando indlejret for dyb"
++
++ #, c-format
++ msgid "%s Auto commands for \"%s\""
++ msgstr "%s Auto-kommandoer for \"%s\""
++
++ #, c-format
++ msgid "Executing %s"
++ msgstr "Udfører %s"
++
++ #, c-format
++ msgid "autocommand %s"
++ msgstr "autokommando %s"
++
++ msgid "E219: Missing {."
++ msgstr "E219: Manglende {."
++
++ msgid "E220: Missing }."
++ msgstr "E220: Manglende }."
++
++ msgid "E490: No fold found"
++ msgstr "E490: Ingen sammenfoldning fundet"
++
++ msgid "E350: Cannot create fold with current 'foldmethod'"
++ msgstr "E350: Kan ikke oprette sammenfoldning med nuværende 'foldmethod'"
++
++ msgid "E351: Cannot delete fold with current 'foldmethod'"
++ msgstr "E351: Kan ikke slette sammenfoldning med nuværende 'foldmethod'"
++
++ #, c-format
++ msgid "+--%3ld line folded "
++ msgid_plural "+--%3ld lines folded "
++ msgstr[0] "+--%3ld linje sammenfoldet "
++ msgstr[1] "+--%3ld linjer sammenfoldet "
++
++ msgid "E222: Add to read buffer"
++ msgstr "E222: Tilføj til læsebuffer"
++
++ msgid "E223: recursive mapping"
++ msgstr "E223: rekursiv mapping"
++
++ #, c-format
++ msgid "E224: global abbreviation already exists for %s"
++ msgstr "E224: global forkortelse findes allerede for %s"
++
++ #, c-format
++ msgid "E225: global mapping already exists for %s"
++ msgstr "E225: global mapping findes allerede for %s"
++
++ #, c-format
++ msgid "E226: abbreviation already exists for %s"
++ msgstr "E226: forkortelse findes allerede for %s"
++
++ #, c-format
++ msgid "E227: mapping already exists for %s"
++ msgstr "E227: mapping findes allerede for %s"
++
++ msgid "No abbreviation found"
++ msgstr "Ingen forkortelse fundet"
++
++ msgid "No mapping found"
++ msgstr "Ingen mapping fundet"
++
++ msgid "E228: makemap: Illegal mode"
++ msgstr "E228: makemap: Ulovlig tilstand"
++
++ msgid "E851: Failed to create a new process for the GUI"
++ msgstr "E851: Kunne ikke oprette en ny proces for GUI'en"
++
++ msgid "E852: The child process failed to start the GUI"
++ msgstr "E852: Barneprocessen kunne ikke starte GUI'en"
++
++ msgid "E229: Cannot start the GUI"
++ msgstr "E229: Kan ikke starte GUI'en"
++
++ #, c-format
++ msgid "E230: Cannot read from \"%s\""
++ msgstr "E230: Kan ikke læse fra \"%s\""
++
++ msgid "E665: Cannot start GUI, no valid font found"
++ msgstr "E665: Kan ikke starte GUI, ingen gyldig skrifttype fundet"
++
++ msgid "E231: 'guifontwide' invalid"
++ msgstr "E231: 'guifontwide' ugyldig"
++
++ msgid "E599: Value of 'imactivatekey' is invalid"
++ msgstr "E599: Værdien af 'imactivatekey' er ugyldig"
++
++ #, c-format
++ msgid "E254: Cannot allocate color %s"
++ msgstr "E254: Kan ikke allokere farven %s"
++
++ msgid "No match at cursor, finding next"
++ msgstr "Intet match ved markør, finder næste"
++
++ msgid "<cannot open> "
++ msgstr "<kan ikke åbne> "
++
++ #, c-format
++ msgid "E616: vim_SelFile: can't get font %s"
++ msgstr "E616: vim_SelFile: kan ikke hente skrifttypen %s"
++
++ msgid "E614: vim_SelFile: can't return to current directory"
++ msgstr "E614: vim_SelFile: kan ikke vende tilbage til nuværende mappe"
++
++ msgid "Pathname:"
++ msgstr "Stinavn:"
++
++ msgid "E615: vim_SelFile: can't get current directory"
++ msgstr "E615: vim_SelFile: kan ikke hente nuværende mappe"
++
++ msgid "OK"
++ msgstr "OK"
++
++ msgid "Cancel"
++ msgstr "Annuller"
++
++ msgid "Scrollbar Widget: Could not get geometry of thumb pixmap."
++ msgstr ""
++ "Rullebjælke-widget: Kunne ikke hente geometri eller pixelkort til miniature."
++
++ msgid "Vim dialog"
++ msgstr "Vim-dialog"
++
++ msgid "E232: Cannot create BalloonEval with both message and callback"
++ msgstr "E232: Kan ikke oprette BalloonEval med både meddelelse og callback"
++
++ msgid "_Cancel"
++ msgstr "_Annuller"
++
++ msgid "_Save"
++ msgstr "_Gem"
++
++ msgid "_Open"
++ msgstr "_Ã…bn"
++
++ msgid "_OK"
++ msgstr "_OK"
++
++ msgid ""
++ "&Yes\n"
++ "&No\n"
++ "&Cancel"
++ msgstr ""
++ "&Ja\n"
++ "&Nej\n"
++ "&Annuller"
++
++ msgid "Yes"
++ msgstr "Ja"
++
++ msgid "No"
++ msgstr "Nej"
++
++ msgid "Input _Methods"
++ msgstr "Input_metoder"
++
++ msgid "VIM - Search and Replace..."
++ msgstr "VIM - Søg og erstat..."
++
++ msgid "VIM - Search..."
++ msgstr "VIM - Søg..."
++
++ msgid "Find what:"
++ msgstr "Find hvad:"
++
++ msgid "Replace with:"
++ msgstr "Erstat med:"
++
++ msgid "Match whole word only"
++ msgstr "Match kun hele ord"
++
++ msgid "Match case"
++ msgstr "Der skelnes ikke mellem store og små bogstaver"
++
++ msgid "Direction"
++ msgstr "Retning"
++
++ msgid "Up"
++ msgstr "Op"
++
++ msgid "Down"
++ msgstr "Ned"
++
++ msgid "Find Next"
++ msgstr "Find næste"
++
++ msgid "Replace"
++ msgstr "Erstat"
++
++ msgid "Replace All"
++ msgstr "Erstat alle"
++
++ msgid "_Close"
++ msgstr "_Luk"
++
++ msgid "Vim: Received \"die\" request from session manager\n"
++ msgstr "Vim: Modtog \"die\"-anmodning fra sessionshåndtering\n"
++
++ msgid "Close tab"
++ msgstr "Luk faneblad"
++
++ msgid "New tab"
++ msgstr "Nyt faneblad"
++
++ msgid "Open Tab..."
++ msgstr "Ã…bn faneblad..."
++
++ msgid "Vim: Main window unexpectedly destroyed\n"
++ msgstr "Vim: Hovedvindue uventet ødelagt\n"
++
++ msgid "&Filter"
++ msgstr "&Filter"
++
++ msgid "&Cancel"
++ msgstr "&Annuller"
++
++ msgid "Directories"
++ msgstr "Mapper"
++
++ msgid "Filter"
++ msgstr "Filter"
++
++ msgid "&Help"
++ msgstr "&Hjælp"
++
++ msgid "Files"
++ msgstr "Filer"
++
++ msgid "&OK"
++ msgstr "&OK"
++
++ msgid "Selection"
++ msgstr "Markering"
++
++ msgid "Find &Next"
++ msgstr "Find &næste"
++
++ msgid "&Replace"
++ msgstr "&Erstat"
++
++ msgid "Replace &All"
++ msgstr "Erstat &alle"
++
++ msgid "&Undo"
++ msgstr "&Fortryd"
++
++ msgid "Open tab..."
++ msgstr "Ã…bn faneblad..."
++
++ msgid "Find string (use '\\\\' to find a '\\')"
++ msgstr "Find streng (brug '\\\\' til at finde et '\\')"
++
++ msgid "Find & Replace (use '\\\\' to find a '\\')"
++ msgstr "Find og erstat (brug '\\\\' til at finde et '\\')"
++
++ msgid "Not Used"
++ msgstr "Ikke brugt"
++
++ msgid "Directory\t*.nothing\n"
++ msgstr "Mappe\t\t*.nothing\n"
++
++ #, c-format
++ msgid "E671: Cannot find window title \"%s\""
++ msgstr "E671: Kan ikke finde vinduestitlen \"%s\""
++
++ #, c-format
++ msgid "E243: Argument not supported: \"-%s\"; Use the OLE version."
++ msgstr "E243: Argumentet understøttes ikke: \"-%s\"; Brug OLE-versionen."
++
++ msgid "E672: Unable to open window inside MDI application"
++ msgstr "E672: Kan ikke åbne vindue i MDI-program"
++
++ msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect"
++ msgstr ""
++ "Vim E458: Kan ikke allokere colormap-post, nogle farver kan være forkerte"
++
++ #, c-format
++ msgid "E250: Fonts for the following charsets are missing in fontset %s:"
++ msgstr "E250: Skrifttyper for følgende tegnsæt mangler i skrifttypesættet %s:"
++
++ #, c-format
++ msgid "E252: Fontset name: %s"
++ msgstr "E252: Skrifttypesætnavn: %s"
++
++ #, c-format
++ msgid "Font '%s' is not fixed-width"
++ msgstr "Skrifttypen '%s' er ikke med fast bredde"
++
++ #, c-format
++ msgid "E253: Fontset name: %s"
++ msgstr "E253: Skrifttypesætnavn: %s"
++
++ #, c-format
++ msgid "Font0: %s"
++ msgstr "Skrifttype0: %s"
++
++ #, c-format
++ msgid "Font1: %s"
++ msgstr "Skrifttype1: %s"
++
++ #, c-format
++ msgid "Font%ld width is not twice that of font0"
++ msgstr "Bredden på skrifttype%ld er ikke det dobbelte af skrifttype0"
++
++ #, c-format
++ msgid "Font0 width: %ld"
++ msgstr "Bredden på skrifttype0: %ld"
++
++ #, c-format
++ msgid "Font1 width: %ld"
++ msgstr "Bredden på skrifttype1: %ld"
++
++ msgid "Invalid font specification"
++ msgstr "Ugyldig skrifttypespecifikation"
++
++ msgid "&Dismiss"
++ msgstr "&Luk"
++
++ msgid "no specific match"
++ msgstr "intet specifikt match"
++
++ msgid "Vim - Font Selector"
++ msgstr "Vim - Skrifttypevælger"
++
++ msgid "Name:"
++ msgstr "Navn:"
++
++ msgid "Show size in Points"
++ msgstr "Vis størrelse i punkter"
++
++ msgid "Encoding:"
++ msgstr "Kodning:"
++
++ msgid "Font:"
++ msgstr "Skrifttype:"
++
++ msgid "Style:"
++ msgstr "Stil:"
++
++ msgid "Size:"
++ msgstr "Størrelse:"
++
++ msgid "E256: Hangul automata ERROR"
++ msgstr "E256: FEJL ved Hangul automata"
++
++ msgid "E550: Missing colon"
++ msgstr "E550: Manglende kolon"
++
++ msgid "E551: Illegal component"
++ msgstr "E551: Ulovlig komponent"
++
++ msgid "E552: digit expected"
++ msgstr "E552: ciffer ventet"
++
++ #, c-format
++ msgid "Page %d"
++ msgstr "Side %d"
++
++ msgid "No text to be printed"
++ msgstr "Ingen tekst at udskrive"
++
++ #, c-format
++ msgid "Printing page %d (%d%%)"
++ msgstr "Udskriver side %d (%d%%)"
++
++ #, c-format
++ msgid " Copy %d of %d"
++ msgstr " Kopi %d af %d"
++
++ #, c-format
++ msgid "Printed: %s"
++ msgstr "Udskrev: %s"
++
++ msgid "Printing aborted"
++ msgstr "Udskrivning afbrudt"
++
++ msgid "E455: Error writing to PostScript output file"
++ msgstr "E455: Fejl ved skrivning til PostScript-output-fil"
++
++ #, c-format
++ msgid "E624: Can't open file \"%s\""
++ msgstr "E624: Kan ikke åbne filen \"%s\""
++
++ #, c-format
++ msgid "E457: Can't read PostScript resource file \"%s\""
++ msgstr "E457: Kan ikke læse PostScript-ressourcefilen \"%s\""
++
++ #, c-format
++ msgid "E618: file \"%s\" is not a PostScript resource file"
++ msgstr "E618: filen \"%s\" er ikke en PostScript-ressourcefil"
++
++ #, c-format
++ msgid "E619: file \"%s\" is not a supported PostScript resource file"
++ msgstr "E619: filen \"%s\" er ikke en understøttet PostScript-ressourcefil"
++
++ #, c-format
++ msgid "E621: \"%s\" resource file has wrong version"
++ msgstr "E621: \"%s\"-ressourcefilen har forkert version"
++
++ msgid "E673: Incompatible multi-byte encoding and character set."
++ msgstr "E673: Inkompatibel multibyte-kodning og -tegnsæt."
++
++ msgid "E674: printmbcharset cannot be empty with multi-byte encoding."
++ msgstr "E674: printmbcharset må ikke være tom med multibyte-kodning."
++
++ msgid "E675: No default font specified for multi-byte printing."
++ msgstr "E675: Ingen standardskrifttype angivet for multibyte-udskrivning."
++
++ msgid "E324: Can't open PostScript output file"
++ msgstr "E324: Kan ikke åbne PostScript-output-fil"
++
++ #, c-format
++ msgid "E456: Can't open file \"%s\""
++ msgstr "E456: Kan ikke åbne filen \"%s\""
++
++ msgid "E456: Can't find PostScript resource file \"prolog.ps\""
++ msgstr "E456: Kan ikke finde PostScript-ressourcefilen \"prolog.ps\""
++
++ msgid "E456: Can't find PostScript resource file \"cidfont.ps\""
++ msgstr "E456: Kan ikke finde PostScript-ressourcefilen \"cidfont.ps\""
++
++ #, c-format
++ msgid "E456: Can't find PostScript resource file \"%s.ps\""
++ msgstr "E456: Kan ikke finde PostScript-ressourcefilen \"%s.ps\""
++
++ #, c-format
++ msgid "E620: Unable to convert to print encoding \"%s\""
++ msgstr "E620: Kan ikke konvertere til udskrivningskodningen \"%s\""
++
++ msgid "Sending to printer..."
++ msgstr "Sender til printer..."
++
++ msgid "E365: Failed to print PostScript file"
++ msgstr "E365: Kunne ikke udskrive PostScript-fil"
++
++ msgid "Print job sent."
++ msgstr "Udskrivningsjob sendt."
++
++ msgid "Add a new database"
++ msgstr "Tilføj en ny database"
++
++ msgid "Query for a pattern"
++ msgstr "Forespørgsel til et mønster"
++
++ msgid "Show this message"
++ msgstr "Vis denne meddelelse"
++
++ msgid "Kill a connection"
++ msgstr "Dræb en forbindelse"
++
++ msgid "Reinit all connections"
++ msgstr "Geninitialisere alle forbindelser"
++
++ msgid "Show connections"
++ msgstr "Vis forbindelser"
++
++ #, c-format
++ msgid "E560: Usage: cs[cope] %s"
++ msgstr "E560: Anvendelse: cs[cope] %s"
++
++ msgid "This cscope command does not support splitting the window.\n"
++ msgstr "Denne cscope-kommando understøtter ikke opdeling af vinduet.\n"
++
++ msgid "E562: Usage: cstag <ident>"
++ msgstr "E562: Anvendelse: cstag <ident>"
++
++ msgid "E257: cstag: tag not found"
++ msgstr "E257: cstag: tag ikke fundet"
++
++ #, c-format
++ msgid "E563: stat(%s) error: %d"
++ msgstr "E563: fejl ved stat(%s): %d"
++
++ msgid "E563: stat error"
++ msgstr "E563: fejl ved stat"
++
++ #, c-format
++ msgid "E564: %s is not a directory or a valid cscope database"
++ msgstr "E564: %s er ikke en mappe eller en gyldig cscope-database"
++
++ #, c-format
++ msgid "Added cscope database %s"
++ msgstr "Tilføjede cscope-databasen %s"
++
++ #, c-format
++ msgid "E262: error reading cscope connection %ld"
++ msgstr "E262: fejl ved læsning af cscope-forbindelse %ld"
++
++ msgid "E561: unknown cscope search type"
++ msgstr "E561: ukendt cscope-søgetype"
++
++ msgid "E566: Could not create cscope pipes"
++ msgstr "E566: Kunne ikke oprette cscope-pipes"
++
++ msgid "E622: Could not fork for cscope"
++ msgstr "E622: Kunne ikke fork for cscope"
++
++ msgid "cs_create_connection setpgid failed"
++ msgstr "cs_create_connection setpgid mislykkedes"
++
++ msgid "cs_create_connection exec failed"
++ msgstr "cs_create_connection exec mislykkedes"
++
++ msgid "cs_create_connection: fdopen for to_fp failed"
++ msgstr "cs_create_connection: fdopen for to_fp mislykkedes"
++
++ msgid "cs_create_connection: fdopen for fr_fp failed"
++ msgstr "cs_create_connection: fdopen for fr_fp mislykkedes"
++
++ msgid "E623: Could not spawn cscope process"
++ msgstr "E623: Kunne ikke spawn cscope-proces"
++
++ msgid "E567: no cscope connections"
++ msgstr "E567: ingen cscope-forbindelser"
++
++ #, c-format
++ msgid "E469: invalid cscopequickfix flag %c for %c"
++ msgstr "E469: ugyldigt cscopequickfix-flag %c for %c"
++
++ #, c-format
++ msgid "E259: no matches found for cscope query %s of %s"
++ msgstr "E259: ingen match fundet for cscope-forespørgsel %s af %s"
++
++ msgid "cscope commands:\n"
++ msgstr "cscope-kommandoer:\n"
++
++ #, c-format
++ msgid "%-5s: %s%*s (Usage: %s)"
++ msgstr "%-5s: %s%*s (Anvendelse: %s)"
++
++ msgid ""
++ "\n"
++ " a: Find assignments to this symbol\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 this text string\n"
++ msgstr ""
++ "\n"
++ " a: Find tildelinger til symbolet\n"
++ " c: Find funktioner som kalder funktionen\n"
++ " d: Find funktioner som kaldes af funktionen\n"
++ " e: Find dette egrep-mønster\n"
++ " f: Find filen\n"
++ " g: Find definitionen\n"
++ " i: Find filer som #inkludere filen\n"
++ " s: Find C-symbolet\n"
++ " t: Find tekststrengen\n"
++
++ #, c-format
++ msgid "E625: cannot open cscope database: %s"
++ msgstr "E625: kan ikke åbne cscope-database: %s"
++
++ msgid "E626: cannot get cscope database information"
++ msgstr "E626: kan ikke hente information for cscope-database"
++
++ msgid "E568: duplicate cscope database not added"
++ msgstr "E568: duplikeret cscope-database ikke tilføjet"
++
++ #, c-format
++ msgid "E261: cscope connection %s not found"
++ msgstr "E261: cscope-forbindelsen %s ikke fundet"
++
++ #, c-format
++ msgid "cscope connection %s closed"
++ msgstr "cscope-forbindelsen %s lukket"
++
++ msgid "E570: fatal error in cs_manage_matches"
++ msgstr "E570: fatal fejl i cs_manage_matches"
++
++ #, c-format
++ msgid "Cscope tag: %s"
++ msgstr "Cscope-tag: %s"
++
++ msgid ""
++ "\n"
++ " # line"
++ msgstr ""
++ "\n"
++ " # linje"
++
++ msgid "filename / context / line\n"
++ msgstr "filnavn/kontekst/linje\n"
++
++ #, c-format
++ msgid "E609: Cscope error: %s"
++ msgstr "E609: Fejl ved cscope: %s"
++
++ msgid "All cscope databases reset"
++ msgstr "Alle cscope-databaser nulstillet"
++
++ msgid "no cscope connections\n"
++ msgstr "ingen cscope-forbindelser\n"
++
++ msgid " # pid database name prepend path\n"
++ msgstr " # pid databasenavn prepend-sti\n"
++
++ msgid "Lua library cannot be loaded."
++ msgstr "Lua-bibliotek kan ikke indlæses."
++
++ msgid "cannot save undo information"
++ msgstr "kan ikke gemme fortrydinformation"
++
++ msgid ""
++ "E815: Sorry, this command is disabled, the MzScheme libraries could not be "
++ "loaded."
++ msgstr ""
++ "E815: Beklager, kommandoen er deaktiveret, MzScheme-bibliotekerne kunne ikke "
++ "indlæses."
++
++ msgid ""
++ "E895: Sorry, this command is disabled, the MzScheme's racket/base module "
++ "could not be loaded."
++ msgstr ""
++ "E895: Beklager, kommandoen er deaktiveret, MzScheme's racket-/base-modul "
++ "kunne ikke indlæses."
++
++ msgid "invalid expression"
++ msgstr "ugyldigt udtryk"
++
++ msgid "expressions disabled at compile time"
++ msgstr "udtryk deaktiveret ved kompileringstid"
++
++ msgid "hidden option"
++ msgstr "skjult tilvalg"
++
++ msgid "unknown option"
++ msgstr "ukendt tilvalg"
++
++ msgid "window index is out of range"
++ msgstr "vinduesindeks udenfor område"
++
++ msgid "couldn't open buffer"
++ msgstr "kan ikke åbne buffer"
++
++ msgid "cannot delete line"
++ msgstr "kan ikke slette linje"
++
++ msgid "cannot replace line"
++ msgstr "kan ikke erstatte linje"
++
++ msgid "cannot insert line"
++ msgstr "kan ikke indsætte linje"
++
++ msgid "string cannot contain newlines"
++ msgstr "streng må ikke indeholde linjeskift"
++
++ msgid "error converting Scheme values to Vim"
++ msgstr "fejl ved konvertering af Scheme-værdier til Vim"
++
++ msgid "Vim error: ~a"
++ msgstr "Fejl ved Vim: ~a"
++
++ msgid "Vim error"
++ msgstr "Fejl ved Vim"
++
++ msgid "buffer is invalid"
++ msgstr "buffer er ugyldig"
++
++ msgid "window is invalid"
++ msgstr "vindue er ugyldigt"
++
++ msgid "linenr out of range"
++ msgstr "linjenummer udenfor område"
++
++ msgid "not allowed in the Vim sandbox"
++ msgstr "ikke tilladt i Vim-sandboksen"
++
++ msgid "E836: This Vim cannot execute :python after using :py3"
++ msgstr "E836: Denne Vim kan ikke udføre :python efter brug af :py3"
++
++ msgid ""
++ "E263: Sorry, this command is disabled, the Python library could not be "
++ "loaded."
++ msgstr ""
++ "E263: Beklager, kommandoen er deaktiveret, Python-biblioteket kunne ikke "
++ "indlæses."
++
++ msgid ""
++ "E887: Sorry, this command is disabled, the Python's site module could not be "
++ "loaded."
++ msgstr ""
++ "E887: Beklager, kommandoen er deaktiveret, Python's site-modul kunne ikke "
++ "indlæses."
++
++ msgid "E659: Cannot invoke Python recursively"
++ msgstr "E659: Kan ikke starte Python rekursivt"
++
++ msgid "E837: This Vim cannot execute :py3 after using :python"
++ msgstr "E837: Denne Vim kan ikke udføre :py3 efter brug af :python"
++
++ msgid "E265: $_ must be an instance of String"
++ msgstr "E265: $_ skal være en instans af streng"
++
++ msgid ""
++ "E266: Sorry, this command is disabled, the Ruby library could not be loaded."
++ msgstr ""
++ "E266: Beklager, kommandoen er deaktiveret, Ruby-biblioteket kunne ikke "
++ "indlæses."
++
++ msgid "E267: unexpected return"
++ msgstr "E267: uventet return"
++
++ msgid "E268: unexpected next"
++ msgstr "E268: uventet next"
++
++ msgid "E269: unexpected break"
++ msgstr "E269: uventet break"
++
++ msgid "E270: unexpected redo"
++ msgstr "E270: uventet redo"
++
++ msgid "E271: retry outside of rescue clause"
++ msgstr "E271: prøv igen udenfor rescue clause"
++
++ msgid "E272: unhandled exception"
++ msgstr "E272: uhåndteret undtagelse"
++
++ #, c-format
++ msgid "E273: unknown longjmp status %d"
++ msgstr "E273: ukendt longjmp-status %d"
++
++ msgid "invalid buffer number"
++ msgstr "ugyldigt buffernummer"
++
++ msgid "not implemented yet"
++ msgstr "endnu ikke implementeret"
++
++ msgid "cannot set line(s)"
++ msgstr "kan ikke sætte linje(r)"
++
++ msgid "invalid mark name"
++ msgstr "ugyldigt mærkenavn"
++
++ msgid "mark not set"
++ msgstr "mærke ikke sat"
++
++ #, c-format
++ msgid "row %d column %d"
++ msgstr "række %d kolonne %d"
++
++ msgid "cannot insert/append line"
++ msgstr "kan ikke indsætte/tilføje linje"
++
++ msgid "line number out of range"
++ msgstr "linjenummer udenfor område"
++
++ msgid "unknown flag: "
++ msgstr "ukendt flag: "
++
++ msgid "unknown vimOption"
++ msgstr "ukendt vimOption"
++
++ msgid "keyboard interrupt"
++ msgstr "tastaturafbryd"
++
++ msgid "vim error"
++ msgstr "fejl ved vim"
++
++ msgid "cannot create buffer/window command: object is being deleted"
++ msgstr "kan ikke oprette buffer-/vindue-kommando: objekt slettes"
++
++ msgid ""
++ "cannot register callback command: buffer/window is already being deleted"
++ msgstr ""
++ "kan ikke registrere callback-kommando: buffer/vindue er allerede ved at "
++ "blive slettet"
++
++ msgid ""
++ "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim."
++ "org"
++ msgstr ""
++ "E280: FATAL FEJL VED TCL: reflist korrupt!? Rapportér det venligst til vim-"
++ "dev@vim.org"
++
++ msgid "cannot register callback command: buffer/window reference not found"
++ msgstr ""
++ "kan ikke registrere callback-kommando: buffer-/vindue-reference ikke fundet"
++
++ msgid ""
++ "E571: Sorry, this command is disabled: the Tcl library could not be loaded."
++ msgstr ""
++ "E571: Beklager, kommandoen er deaktiveret: Tcl-biblioteket kunne ikke "
++ "indlæses."
++
++ #, c-format
++ msgid "E572: exit code %d"
++ msgstr "E572: afslutningskode %d"
++
++ msgid "cannot get line"
++ msgstr "kan ikke hente linje"
++
++ msgid "Unable to register a command server name"
++ msgstr "Kan ikke registrere et kommandoservernavn"
++
++ msgid "E248: Failed to send command to the destination program"
++ msgstr "E248: Kunne ikke sende kommando til destinationsprogrammet"
++
++ #, c-format
++ msgid "E573: Invalid server id used: %s"
++ msgstr "E573: Ugyldigt server-id brugt: %s"
++
++ msgid "E251: VIM instance registry property is badly formed. Deleted!"
++ msgstr ""
++ "E251: Registreringsegenskab for VIM-instans er dårligt udformet. Slettet!"
++
++ #, c-format
++ msgid "E938: Duplicate key in JSON: \"%s\""
++ msgstr "E938: Duplikeret nøgle i JSON: \"%s\""
++
++ #, c-format
++ msgid "E696: Missing comma in List: %s"
++ msgstr "E696: Manglende komma i liste: %s"
++
++ #, c-format
++ msgid "E697: Missing end of List ']': %s"
++ msgstr "E697: Manglende slutning på List ']': %s"
++
++ msgid "Unknown option argument"
++ msgstr "Ukendt tilvalgsargument"
++
++ msgid "Too many edit arguments"
++ msgstr "For mange redigeringsargumenter"
++
++ msgid "Argument missing after"
++ msgstr "Argument mangler efter"
++
++ msgid "Garbage after option argument"
++ msgstr "Affald efter tilvalgsargument"
++
++ msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments"
++ msgstr ""
++ "For mange \"+kommando\"-, \"-c kommando\"- eller \"--cmd kommando\"-argumenter"
++
++ msgid "Invalid argument for"
++ msgstr "Ugyldigt argument for"
++
++ #, c-format
++ msgid "%d files to edit\n"
++ msgstr "%d filer at redigere\n"
++
++ msgid "netbeans is not supported with this GUI\n"
++ msgstr "netbeans understøttes ikke med denne GUI\n"
++
++ msgid "'-nb' cannot be used: not enabled at compile time\n"
++ msgstr "'-nb' kan ikke bruges: ikke aktiveret ved kompileringstid\n"
++
++ msgid "This Vim was not compiled with the diff feature."
++ msgstr "Denne Vim blev ikke kompileret med diff-funktionaliteten."
++
++ msgid "Attempt to open script file again: \""
++ msgstr "Forsøg på at åbne scriptfil igen: \""
++
++ msgid "Cannot open for reading: \""
++ msgstr "Kan ikke åbne til læsning: \""
++
++ msgid "Cannot open for script output: \""
++ msgstr "Kan ikke åbne for script-output: \""
++
++ msgid "Vim: Error: Failure to start gvim from NetBeans\n"
++ msgstr "Vim: Fejl: Kunne ikke starte gvim fra NetBeans\n"
++
++ msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n"
++ msgstr "Vim: Fejl: Denne version af Vim kører ikke i en Cygwin-terminal\n"
++
++ msgid "Vim: Warning: Output is not to a terminal\n"
++ msgstr "Vim: Advarsel: Output er ikke til en terminal\n"
++
++ msgid "Vim: Warning: Input is not from a terminal\n"
++ msgstr "Vim: Advarsel: Input er ikke fra en terminal\n"
++
++ msgid "pre-vimrc command line"
++ msgstr "pre-vimrc-kommandolinje"
++
++ #, c-format
++ msgid "E282: Cannot read from \"%s\""
++ msgstr "E282: Kan ikke læse fra \"%s\""
++
++ msgid ""
++ "\n"
++ "More info with: \"vim -h\"\n"
++ msgstr ""
++ "\n"
++ "Mere info med: \"vim -h\"\n"
++
++ msgid "[file ..] edit specified file(s)"
++ msgstr "[fil ..] rediger angivne fil(er)"
++
++ msgid "- read text from stdin"
++ msgstr "- læs tekst fra stdin"
++
++ msgid "-t tag edit file where tag is defined"
++ msgstr "-t tag rediger fil hvor tag er defineret"
++
++ msgid "-q [errorfile] edit file with first error"
++ msgstr "-q [fejlfil] rediger fil med første fejl"
++
++ msgid ""
++ "\n"
++ "\n"
++ "usage:"
++ msgstr ""
++ "\n"
++ "\n"
++ "anvendelse:"
++
++ msgid " vim [arguments] "
++ msgstr " vim [argumenter] "
++
++ msgid ""
++ "\n"
++ " or:"
++ msgstr ""
++ "\n"
++ " eller:"
++
++ msgid ""
++ "\n"
++ "Where case is ignored prepend / to make flag upper case"
++ msgstr ""
++ "\n"
++ "Når der ikke skelnes mellem store og små bogstaver, så tilføj / i "
++ "begyndelsen for at gøre flag til store bogstaver"
++
++ msgid ""
++ "\n"
++ "\n"
++ "Arguments:\n"
++ msgstr ""
++ "\n"
++ "\n"
++ "Argumenter:\n"
++
++ msgid "--\t\t\tOnly file names after this"
++ msgstr "--\t\t\tKun filnavne herefter"
++
++ msgid "--literal\t\tDon't expand wildcards"
++ msgstr "--literal\t\tUdvid ikke jokertegn"
++
++ msgid "-register\t\tRegister this gvim for OLE"
++ msgstr "-register\t\tRegistrer denne gvim til OLE"
++
++ msgid "-unregister\t\tUnregister gvim for OLE"
++ msgstr "-unregister\t\tAfregistrer gvim for OLE"
++
++ msgid "-g\t\t\tRun using GUI (like \"gvim\")"
++ msgstr "-g\t\t\tKør med GUI (ligesom \"gvim\")"
++
++ msgid "-f or --nofork\tForeground: Don't fork when starting GUI"
++ msgstr "-f eller --nofork\tForgrund: Fork ikke når GUI startes"
++
++ msgid "-v\t\t\tVi mode (like \"vi\")"
++ msgstr "-v\t\t\tVi-tilstand (ligesom \"vi\")"
++
++ msgid "-e\t\t\tEx mode (like \"ex\")"
++ msgstr "-e\t\t\tEx-tilstand (ligesom \"ex\")"
++
++ msgid "-E\t\t\tImproved Ex mode"
++ msgstr "-E\t\t\tForbedret Ex-tilstand"
++
++ msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")"
++ msgstr "-s\t\t\tStille (batch) tilstand (kun til \"ex\")"
++
++ msgid "-d\t\t\tDiff mode (like \"vimdiff\")"
++ msgstr "-d\t\t\tDiff-tilstand (ligesom \"vimdiff\")"
++
++ msgid "-y\t\t\tEasy mode (like \"evim\", modeless)"
++ msgstr "-y\t\t\tEasy-tilstand (ligesom \"evim\", tilstandsløs)"
++
++ msgid "-R\t\t\tReadonly mode (like \"view\")"
++ msgstr "-R\t\t\tSkrivebeskyttet tilstand (ligesom \"view\")"
++
++ msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
++ msgstr "-Z\t\t\tRestriktiv tilstand (ligesom \"rvim\")"
++
++ msgid "-m\t\t\tModifications (writing files) not allowed"
++ msgstr "-m\t\t\tÆndringer (skrivning af filer) ikke tilladt"
++
++ msgid "-M\t\t\tModifications in text not allowed"
++ msgstr "-M\t\t\tÆndringer i tekst ikke tilladt"
++
++ msgid "-b\t\t\tBinary mode"
++ msgstr "-b\t\t\tBinær tilstand"
++
++ msgid "-l\t\t\tLisp mode"
++ msgstr "-l\t\t\tLisp-tilstand"
++
++ msgid "-C\t\t\tCompatible with Vi: 'compatible'"
++ msgstr "-C\t\t\tKompatibel med Vi: 'compatible'"
++
++ msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'"
++ msgstr "-N\t\t\tIkke fuldt ud Vi-kompatibel: 'nocompatible'"
++
++ msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]"
++ msgstr "-V[N][fnavn]\t\tVær uddybende [niveau N] [log meddelelser til fnavn]"
++
++ msgid "-D\t\t\tDebugging mode"
++ msgstr "-D\t\t\tFejlretningstilstand"
++
++ msgid "-n\t\t\tNo swap file, use memory only"
++ msgstr "-n\t\t\tIngen swap-fil, brug kun hukommelse"
++
++ msgid "-r\t\t\tList swap files and exit"
++ msgstr "-r\t\t\tOplist swap-filer og afslut"
++
++ msgid "-r (with file name)\tRecover crashed session"
++ msgstr "-r (med filnavn)\tGendan session som holdt op med at virke"
++
++ msgid "-L\t\t\tSame as -r"
++ msgstr "-L\t\t\tSamme som -r"
++
++ msgid "-f\t\t\tDon't use newcli to open window"
++ msgstr "-f\t\t\tBrug ikke newcli til at åbne vindue"
++
++ msgid "-dev <device>\t\tUse <device> for I/O"
++ msgstr "-dev <enhed>\t\tBrug <enhed> til I/O"
++
++ msgid "-A\t\t\tstart in Arabic mode"
++ msgstr "-A\t\t\tstart i arabisk tilstand"
++
++ msgid "-H\t\t\tStart in Hebrew mode"
++ msgstr "-H\t\t\tStart i hebraisk tilstand"
++
++ msgid "-F\t\t\tStart in Farsi mode"
++ msgstr "-F\t\t\tStart i persisk tilstand"
++
++ msgid "-T <terminal>\tSet terminal type to <terminal>"
++ msgstr "-T <terminal>\tSæt terminaltype til <terminal>"
++
++ msgid "--not-a-term\t\tSkip warning for input/output not being a terminal"
++ msgstr ""
++ "--not-a-term\t\tSpring advarsel over for input/output som ikke er en terminal"
++
++ msgid "--ttyfail\t\tExit if input or output is not a terminal"
++ msgstr "--ttyfail\t\tAfslut hvis input eller output ikke er en terminal"
++
++ msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc"
++ msgstr "-u <vimrc>\t\tBrug <vimrc> i stedet for nogen .vimrc"
++
++ msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc"
++ msgstr "-U <gvimrc>\t\tBrug <gvimrc> i stedet for nogen .gvimrc"
++
++ msgid "--noplugin\t\tDon't load plugin scripts"
++ msgstr "--noplugin\t\tIndlæs ikke plugin-scripts"
++
++ msgid "-p[N]\t\tOpen N tab pages (default: one for each file)"
++ msgstr "-p[N]\t\tÅbn N fanebladssider (standard: én pr. fil)"
++
++ msgid "-o[N]\t\tOpen N windows (default: one for each file)"
++ msgstr "-o[N]\t\tÅbn N vinduer (standard: én pr. fil)"
++
++ msgid "-O[N]\t\tLike -o but split vertically"
++ msgstr "-O[N]\t\tLigesom -o men opdel lodret"
++
++ msgid "+\t\t\tStart at end of file"
++ msgstr "+\t\t\tBegynd ved slutningen af filen"
++
++ msgid "+<lnum>\t\tStart at line <lnum>"
++ msgstr "+<lnum>\t\tBegynd ved linje <lnum>"
++
++ msgid "--cmd <command>\tExecute <command> before loading any vimrc file"
++ msgstr "--cmd <kommando>\tUdfør <kommando> inden indlæsning af vimrc-filer"
++
++ msgid "-c <command>\t\tExecute <command> after loading the first file"
++ msgstr "-c <kommando>\tUdfør <kommando> efter indlæsning af den første fil"
++
++ msgid "-S <session>\t\tSource file <session> after loading the first file"
++ msgstr "-S <session>\t\tSource filen <session> efter indlæsning af den første fil"
++
++ msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>"
++ msgstr "-s <scriptind>\tLæs normal tilstand-kommandoer fra filen <scriptind>"
++
++ msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>"
++ msgstr ""
++ "-w <scriptud>\tTilføj alle indtastede kommandoer til slutningen af filen "
++ "<scriptud>"
++
++ msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>"
++ msgstr "-W <scriptud>\tSkriv alle indtastede kommandoer til filen <scriptud>"
++
++ msgid "-x\t\t\tEdit encrypted files"
++ msgstr "-x\t\t\tRediger krypterede filer"
++
++ msgid "-display <display>\tConnect vim to this particular X-server"
++ msgstr "-display <display>\tForbind vim til denne X-server"
++
++ msgid "-X\t\t\tDo not connect to X server"
++ msgstr "-X\t\t\tOpret ikke forbindelse til X-server"
++
++ msgid "--remote <files>\tEdit <files> in a Vim server if possible"
++ msgstr "--remote <filer>\tRediger <filer> i en Vim-server, hvis det er muligt"
++
++ msgid "--remote-silent <files> Same, don't complain if there is no server"
++ msgstr ""
++ "--remote-silent <filer> Samme, men vær tavs hvis der ikke er nogen server"
++
++ msgid ""
++ "--remote-wait <files> As --remote but wait for files to have been edited"
++ msgstr ""
++ "--remote-wait <filer> Som --remote men vent på filer som skal redigeres"
++
++ msgid ""
++ "--remote-wait-silent <files> Same, don't complain if there is no server"
++ msgstr ""
++ "--remote-wait-silent <filer> Samme, men vær tavs hvis der ikke er nogen "
++ "server"
++
++ msgid ""
++ "--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"
++ msgstr ""
++ "--remote-tab[-wait][-silent] <filer> Som --remote men brug fanebladsside "
++ "pr. fil"
++
++ msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit"
++ msgstr "--remote-send <nøgler>\tSend <nøgler> til en Vim-server og afslut"
++
++ msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"
++ msgstr ""
++ "--remote-expr <udtryk>\tEvaluér <udtryk> i en Vim-server og udskriv "
++ "resultatet"
++
++ msgid "--serverlist\t\tList available Vim server names and exit"
++ msgstr "--serverlist\t\tOplist tilgængelige Vim-servernavne og afslut"
++
++ msgid "--servername <name>\tSend to/become the Vim server <name>"
++ msgstr "--servername <navn>\tSend til/bliv Vim-serveren <navn>"
++
++ msgid "--startuptime <file>\tWrite startup timing messages to <file>"
++ msgstr "--startuptime <fil>\tSkriv meddelelser om opstartstiming til <fil>"
++
++ msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo"
++ msgstr "-i <viminfo>\t\tBrug <viminfo> i stedet for .viminfo"
++
++ msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo"
++ msgstr "--clean\t\t'nocompatible', Vim-standarder, ingen plugins, ingen viminfo"
++
++ msgid "-h or --help\tPrint Help (this message) and exit"
++ msgstr "-h eller --help\tUdskriv hjælp (denne meddelelse) og afslut"
++
++ msgid "--version\t\tPrint version information and exit"
++ msgstr "--version\t\tUdskriv versionsinformation og afslut"
++
++ msgid ""
++ "\n"
++ "Arguments recognised by gvim (Motif version):\n"
++ msgstr ""
++ "\n"
++ "Argumenter som genkendes af gvim (Motif-version):\n"
++
++ msgid ""
++ "\n"
++ "Arguments recognised by gvim (neXtaw version):\n"
++ msgstr ""
++ "\n"
++ "Argumenter som genkendes af gvim (neXtaw-version):\n"
++
++ msgid ""
++ "\n"
++ "Arguments recognised by gvim (Athena version):\n"
++ msgstr ""
++ "\n"
++ "Argumenter som genkendes af gvim (Athena-version):\n"
++
++ msgid "-display <display>\tRun vim on <display>"
++ msgstr "-display <display>\tKør vim på <display>"
++
++ msgid "-iconic\t\tStart vim iconified"
++ msgstr "-iconic\t\tStart vim som ikon"
++
++ msgid "-background <color>\tUse <color> for the background (also: -bg)"
++ msgstr "-background <farve>\tBrug <farve> til baggrunden (også: -bg)"
++
++ msgid "-foreground <color>\tUse <color> for normal text (also: -fg)"
++ msgstr "-foreground <farve>\tBrug <farve> til normal tekst (også: -fg)"
++
++ msgid "-font <font>\t\tUse <font> for normal text (also: -fn)"
++ msgstr "-font <skrifttype>\tBrug <skrifttype> til normal tekst (også: -fn)"
++
++ msgid "-boldfont <font>\tUse <font> for bold text"
++ msgstr "-boldfont <skrifttype>\tBrug <skrifttype> til fed tekst"
++
++ msgid "-italicfont <font>\tUse <font> for italic text"
++ msgstr "-italicfont <skriftt.>\tBrug <skrifttype> til kursiv tekst"
++
++ msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)"
++ msgstr "-geometry <geom>\tBrug <geom> for indledende geometri (også: -geom)"
++
++ msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)"
++ msgstr "-borderwidth <bredde>\tBrug en kantbredde på <bredde> (også: -bw)"
++
++ msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)"
++ msgstr ""
++ "-scrollbarwidth <bredde> Brug en rullebjælkebredde på <bredde> (også: -sw)"
++
++ msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)"
++ msgstr "-menuheight <højde>\tBrug en menulinjehøjde på <højde> (også: -mh)"
++
++ msgid "-reverse\t\tUse reverse video (also: -rv)"
++ msgstr "-reverse\t\tBrug omvendt grafik (også: -rv)"
++
++ msgid "+reverse\t\tDon't use reverse video (also: +rv)"
++ msgstr "+reverse\t\tBrug ikke omvendt grafik (også: +rv)"
++
++ msgid "-xrm <resource>\tSet the specified resource"
++ msgstr "-xrm <ressource>\tSæt den angivne ressource"
++
++ msgid ""
++ "\n"
++ "Arguments recognised by gvim (GTK+ version):\n"
++ msgstr ""
++ "\n"
++ "Argumenter genkendt af gvim (GTK+-version):\n"
++
++ msgid "-display <display>\tRun vim on <display> (also: --display)"
++ msgstr "-display <display>\tKør vim på <display> (også: --display)"
++
++ msgid "--role <role>\tSet a unique role to identify the main window"
++ msgstr "--role <rolle>\tSæt en unik rolle til at identificere hovedvinduet"
++
++ msgid "--socketid <xid>\tOpen Vim inside another GTK widget"
++ msgstr "--socketid <xid>\tÃ…bn Vim i en anden GTK-widget"
++
++ msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout"
++ msgstr "--echo-wid\t\tFÃ¥ gvim til at skrive vinduets ID til stdout"
++
++ msgid "-P <parent title>\tOpen Vim inside parent application"
++ msgstr "-P <forældertitel>\tÅbn Vim i forælderprogram"
++
++ msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
++ msgstr "--windowid <HWND>\tÃ…bn Vim i en anden win32-widget"
++
++ msgid "No display"
++ msgstr "Intet display"
++
++ msgid ": Send failed.\n"
++ msgstr ": Sending mislykkedes.\n"
++
++ msgid ": Send failed. Trying to execute locally\n"
++ msgstr ": Sending mislykkedes. Prøver at udføre lokalt\n"
++
++ #, c-format
++ msgid "%d of %d edited"
++ msgstr "%d af %d redigeret"
++
++ msgid "No display: Send expression failed.\n"
++ msgstr "Intet display: Send-udtryk mislykkedes.\n"
++
++ msgid ": Send expression failed.\n"
++ msgstr ": Send-udtryk mislykkedes.\n"
++
++ msgid "No marks set"
++ msgstr "Ingen mærker sat"
++
++ #, c-format
++ msgid "E283: No marks matching \"%s\""
++ msgstr "E283: Ingen mærker matcher \"%s\""
++
++ msgid ""
++ "\n"
++ "mark line col file/text"
++ msgstr ""
++ "\n"
++ "mærke linje kol fil/tekst"
++
++ msgid ""
++ "\n"
++ " jump line col file/text"
++ msgstr ""
++ "\n"
++ " hop linje kol fil/tekst"
++
++ msgid ""
++ "\n"
++ "change line col text"
++ msgstr ""
++ "\n"
++ "skift linje kol tekst"
++
++ msgid ""
++ "\n"
++ "# File marks:\n"
++ msgstr ""
++ "\n"
++ "# Filmærker:\n"
++
++ msgid ""
++ "\n"
++ "# Jumplist (newest first):\n"
++ msgstr ""
++ "\n"
++ "# Hopliste (nyeste først):\n"
++
++ msgid ""
++ "\n"
++ "# History of marks within files (newest to oldest):\n"
++ msgstr ""
++ "\n"
++ "# Historik over mærker i filer (nyeste til ældste):\n"
++
++ msgid "Missing '>'"
++ msgstr "Manglende '>'"
++
++ msgid "E543: Not a valid codepage"
++ msgstr "E543: Ikke en gyldig tegnkodningstabel"
++
++ msgid "E284: Cannot set IC values"
++ msgstr "E284: Kan ikke sætte IC-værdier"
++
++ msgid "E285: Failed to create input context"
++ msgstr "E285: Kunne ikke oprette inputkontekst"
++
++ msgid "E286: Failed to open input method"
++ msgstr "E286: Kunne ikke åbne inputmetode"
++
++ msgid "E287: Warning: Could not set destroy callback to IM"
++ msgstr "E287: Advarsel: Kunne ikke sætte destroy callback til IM"
++
++ msgid "E288: input method doesn't support any style"
++ msgstr "E288: inputmetode understøtter ikke nogen stil"
++
++ msgid "E289: input method doesn't support my preedit type"
++ msgstr "E289: inputmetode understøtter ikke min preedit-type"
++
++ msgid "E293: block was not locked"
++ msgstr "E293: blok blev ikke låst"
++
++ msgid "E294: Seek error in swap file read"
++ msgstr "E294: Søgefejl ved læsning af swap-fil"
++
++ msgid "E295: Read error in swap file"
++ msgstr "E295: Læsefejl i swap-fil"
++
++ msgid "E296: Seek error in swap file write"
++ msgstr "E296: Søgefejl ved skrivning af swap-fil"
++
++ msgid "E297: Write error in swap file"
++ msgstr "E297: Skrivefejl i swap-fil"
++
++ msgid "E300: Swap file already exists (symlink attack?)"
++ msgstr "E300: Swap-filen findes allerede (symlink angreb?)"
++
++ msgid "E298: Didn't get block nr 0?"
++ msgstr "E298: Blev blok nr. 0 ikke hentet?"
++
++ msgid "E298: Didn't get block nr 1?"
++ msgstr "E298: Blev blok nr. 1 ikke hentet?"
++
++ msgid "E298: Didn't get block nr 2?"
++ msgstr "E298: Blev blok nr. 2 ikke hentet?"
++
++ msgid "E843: Error while updating swap file crypt"
++ msgstr "E843: Fejl ved opdatering af crypt for swap-fil"
++
++ msgid "E301: Oops, lost the swap file!!!"
++ msgstr "E301: Ups, mistede swap-filen!!!"
++
++ msgid "E302: Could not rename swap file"
++ msgstr "E302: Kunne ikke omdøbe swap-fil"
++
++ #, c-format
++ msgid "E303: Unable to open swap file for \"%s\", recovery impossible"
++ msgstr "E303: Kan ikke åbne swap-filen for \"%s\", gendannelse er ikke muligt"
++
++ msgid "E304: ml_upd_block0(): Didn't get block 0??"
++ msgstr "E304: ml_upd_block0(): Blev blok 0 ikke hentet??"
++
++ #, c-format
++ msgid "E305: No swap file found for %s"
++ msgstr "E305: Fandt ingen swap-fil for %s"
++
++ msgid "Enter number of swap file to use (0 to quit): "
++ msgstr "Indtast antal swap-filer som der skal bruges (0 for at afslutte): "
++
++ #, c-format
++ msgid "E306: Cannot open %s"
++ msgstr "E306: Kan ikke åbne %s"
++
++ msgid "Unable to read block 0 from "
++ msgstr "Kan ikke læse blok 0 fra "
++
++ msgid ""
++ "\n"
++ "Maybe no changes were made or Vim did not update the swap file."
++ msgstr ""
++ "\n"
++ "Måske er der ikke foretaget nogen ændringer eller Vim opdaterede ikke swap-"
++ "filen."
++
++ msgid " cannot be used with this version of Vim.\n"
++ msgstr " kan ikke bruges med denne version af Vim.\n"
++
++ msgid "Use Vim version 3.0.\n"
++ msgstr "Brug Vim version 3.0.\n"
++
++ #, c-format
++ msgid "E307: %s does not look like a Vim swap file"
++ msgstr "E307: %s ligner ikke en Vim swap-fil"
++
++ msgid " cannot be used on this computer.\n"
++ msgstr " kan ikke bruges på denne computer.\n"
++
++ msgid "The file was created on "
++ msgstr "Filen blev oprettet på "
++
++ msgid ""
++ ",\n"
++ "or the file has been damaged."
++ msgstr ""
++ ",\n"
++ "eller filen er beskadiget."
++
++ #, c-format
++ msgid ""
++ "E833: %s is encrypted and this version of Vim does not support encryption"
++ msgstr ""
++ "E833: %s er krypteret og denne version af Vim understøtter ikke kryptering"
++
++ msgid " has been damaged (page size is smaller than minimum value).\n"
++ msgstr " er beskadiget (sidestørrelsen er mindre end minimumsværdien).\n"
++
++ #, c-format
++ msgid "Using swap file \"%s\""
++ msgstr "Bruger swap-filen \"%s\""
++
++ #, c-format
++ msgid "Original file \"%s\""
++ msgstr "Den originale fil \"%s\""
++
++ msgid "E308: Warning: Original file may have been changed"
++ msgstr "E308: Advarsel: Den originale fil kan være ændret"
++
++ #, c-format
++ msgid "Swap file is encrypted: \"%s\""
++ msgstr "Swap-filen er krypteret: \"%s\""
++
++ msgid ""
++ "\n"
++ "If you entered a new crypt key but did not write the text file,"
++ msgstr ""
++ "\n"
++ "Hvis du indtastede en ny crypt-nøgle men ikke skrev tekstfilen,"
++
++ msgid ""
++ "\n"
++ "enter the new crypt key."
++ msgstr ""
++ "\n"
++ "så indtast den nye crypt-nøgle."
++
++ msgid ""
++ "\n"
++ "If you wrote the text file after changing the crypt key press enter"
++ msgstr ""
++ "\n"
++ "Hvis du skrev tekstfilen efter crypt-nøglen blev ændret, så tryk på enter"
++
++ msgid ""
++ "\n"
++ "to use the same key for text file and swap file"
++ msgstr ""
++ "\n"
++ "for at bruge den samme nøgle til tekstfilen og swap-filen"
++
++ #, c-format
++ msgid "E309: Unable to read block 1 from %s"
++ msgstr "E309: Kan ikke læse blok 1 fra %s"
++
++ msgid "???MANY LINES MISSING"
++ msgstr "???MANGE LINJER MANGLER"
++
++ msgid "???LINE COUNT WRONG"
++ msgstr "???LINJEANTAL FORKERT"
++
++ msgid "???EMPTY BLOCK"
++ msgstr "???TOM BLOK"
++
++ msgid "???LINES MISSING"
++ msgstr "???LINJER MANGLER"
++
++ #, c-format
++ msgid "E310: Block 1 ID wrong (%s not a .swp file?)"
++ msgstr "E310: Forkert ID for blok 1 (%s ikke en .swp-fil?)"
++
++ msgid "???BLOCK MISSING"
++ msgstr "???BLOK MANGLER"
++
++ msgid "??? from here until ???END lines may be messed up"
++ msgstr "??? herfra indtil ???SLUT kan linjer være rodet"
++
++ msgid "??? from here until ???END lines may have been inserted/deleted"
++ msgstr "??? herfra indtil ???SLUT kan linjer være indsat/slettet"
++
++ msgid "???END"
++ msgstr "???SLUT"
++
++ msgid "E311: Recovery Interrupted"
++ msgstr "E311: Gendannelse afbrudt"
++
++ msgid ""
++ "E312: Errors detected while recovering; look for lines starting with ???"
++ msgstr ""
++ "E312: Fejl registreret ved gendannelse; kig efter linjer som begynder med "
++ "???"
++
++ msgid "See \":help E312\" for more information."
++ msgstr "Se \":help E312\" for mere information."
++
++ msgid "Recovery completed. You should check if everything is OK."
++ msgstr "Gendannelse gennemført. Du bør tjekke om alt er OK."
++
++ msgid ""
++ "\n"
++ "(You might want to write out this file under another name\n"
++ msgstr ""
++ "\n"
++ "(Det kan være du vil skrive filen under et andet navn\n"
++
++ msgid "and run diff with the original file to check for changes)"
++ msgstr "og kør diff men den originale fil for at tjekke for ændringer)"
++
++ msgid "Recovery completed. Buffer contents equals file contents."
++ msgstr ""
++ "Gendannelse gennemført. Bufferens indhold er det samme som filens indhold."
++
++ msgid ""
++ "\n"
++ "You may want to delete the .swp file now.\n"
++ "\n"
++ msgstr ""
++ "\n"
++ "Det kan være du vil slette .swp-filen nu.\n"
++ "\n"
++
++ msgid "Using crypt key from swap file for the text file.\n"
++ msgstr "Bruger crypt-nøglen fra swap-filen til tekstfilen.\n"
++
++ msgid "Swap files found:"
++ msgstr "Swap-filer fundet:"
++
++ msgid " In current directory:\n"
++ msgstr " I nuværende mappe:\n"
++
++ msgid " Using specified name:\n"
++ msgstr " Bruger angivne navn:\n"
++
++ msgid " In directory "
++ msgstr " I mappe "
++
++ msgid " -- none --\n"
++ msgstr " -- ingen --\n"
++
++ msgid " owned by: "
++ msgstr " ejet af: "
++
++ msgid " dated: "
++ msgstr " dateret: "
++
++ msgid " dated: "
++ msgstr " dateret: "
++
++ msgid " [from Vim version 3.0]"
++ msgstr " [fra Vim version 3.0]"
++
++ msgid " [does not look like a Vim swap file]"
++ msgstr " [ligner ikke en Vim swap-fil]"
++
++ msgid " file name: "
++ msgstr " filnavn: "
++
++ msgid ""
++ "\n"
++ " modified: "
++ msgstr ""
++ "\n"
++ " ændret: "
++
++ msgid "YES"
++ msgstr "JA"
++
++ msgid "no"
++ msgstr "nej"
++
++ msgid ""
++ "\n"
++ " user name: "
++ msgstr ""
++ "\n"
++ " brugernavn: "
++
++ msgid " host name: "
++ msgstr " værtsnavn: "
++
++ msgid ""
++ "\n"
++ " host name: "
++ msgstr ""
++ "\n"
++ " værtsnavn: "
++
++ msgid ""
++ "\n"
++ " process ID: "
++ msgstr ""
++ "\n"
++ " proces-ID: "
++
++ msgid " (still running)"
++ msgstr " (kører stadig)"
++
++ msgid ""
++ "\n"
++ " [not usable with this version of Vim]"
++ msgstr ""
++ "\n"
++ " [ikke anvendelig med denne version af Vim]"
++
++ msgid ""
++ "\n"
++ " [not usable on this computer]"
++ msgstr ""
++ "\n"
++ " [ikke anvendelig på denne computer]"
++
++ msgid " [cannot be read]"
++ msgstr " [kan ikke læses]"
++
++ msgid " [cannot be opened]"
++ msgstr " [kan ikke åbnes]"
++
++ msgid "E313: Cannot preserve, there is no swap file"
++ msgstr "E313: Kan ikke bevares, der er ikke nogen swap-fil"
++
++ msgid "File preserved"
++ msgstr "Fil bevaret"
++
++ msgid "E314: Preserve failed"
++ msgstr "E314: Bevaring mislykkedes"
++
++ #, c-format
++ msgid "E315: ml_get: invalid lnum: %ld"
++ msgstr "E315: ml_get: ugyldig lnum: %ld"
++
++ #, c-format
++ msgid "E316: ml_get: cannot find line %ld"
++ msgstr "E316: ml_get: kan ikke finde linje %ld"
++
++ msgid "E317: pointer block id wrong 3"
++ msgstr "E317: forkert blok-id for pointer 3"
++
++ msgid "stack_idx should be 0"
++ msgstr "stack_idx skal være 0"
++
++ msgid "E318: Updated too many blocks?"
++ msgstr "E318: Opdaterede for mange blokke?"
++
++ msgid "E317: pointer block id wrong 4"
++ msgstr "E317: forkert blok-id for pointer 4"
++
++ msgid "deleted block 1?"
++ msgstr "slettede blok 1?"
++
++ #, c-format
++ msgid "E320: Cannot find line %ld"
++ msgstr "E320: Kan ikke finde linje %ld"
++
++ msgid "E317: pointer block id wrong"
++ msgstr "E317: forkert blok-id for pointer"
++
++ msgid "pe_line_count is zero"
++ msgstr "pe_line_count er nul"
++
++ #, c-format
++ msgid "E322: line number out of range: %ld past the end"
++ msgstr "E322: linjenummer udenfor område: %ld efter slutningen"
++
++ #, c-format
++ msgid "E323: line count wrong in block %ld"
++ msgstr "E323: linje antal forkert i blok %ld"
++
++ msgid "Stack size increases"
++ msgstr "Stakstørrelse øges"
++
++ msgid "E317: pointer block id wrong 2"
++ msgstr "E317: forkert blok-id for pointer 2"
++
++ #, c-format
++ msgid "E773: Symlink loop for \"%s\""
++ msgstr "E773: Symlink-løkke for \"%s\""
++
++ msgid "E325: ATTENTION"
++ msgstr "E325: OBS"
++
++ msgid ""
++ "\n"
++ "Found a swap file by the name \""
++ msgstr ""
++ "\n"
++ "Fandt en swap-fil ved navn \""
++
++ msgid "While opening file \""
++ msgstr "Ved åbning af filen \""
++
++ msgid " NEWER than swap file!\n"
++ msgstr " NYERE end swap-fil!\n"
++
++ msgid ""
++ "\n"
++ "(1) Another program may be editing the same file. If this is the case,\n"
++ " be careful not to end up with two different instances of the same\n"
++ " file when making changes. Quit, or continue with caution.\n"
++ msgstr ""
++ "\n"
++ "(1) Et andet program redigere muligvis den samme fil. Hvis det er tilfældet,\n"
++ " så pas på ikke at ende med to forskellige instanser af den samme\n"
++ " fil når der foretages ændringer. Afslut, eller fortsæt med forsigtighed.\n"
++
++ msgid "(2) An edit session for this file crashed.\n"
++ msgstr "(2) En redigeringssession for filen holdt op med at virke.\n"
++
++ msgid " If this is the case, use \":recover\" or \"vim -r "
++ msgstr " Hvis det er tilfældet, så brug \":recover\" eller \"vim -r "
++
++ msgid ""
++ "\"\n"
++ " to recover the changes (see \":help recovery\").\n"
++ msgstr ""
++ "\"\n"
++ " for at gendanne ændringerne (se \":help recovery\").\n"
++
++ msgid " If you did this already, delete the swap file \""
++ msgstr " Hvis du allerede har gjort det, så slet swap-filen \""
++
++ msgid ""
++ "\"\n"
++ " to avoid this message.\n"
++ msgstr ""
++ "\"\n"
++ " for at undgå denne meddelelse.\n"
++
++ msgid "Swap file \""
++ msgstr "Swap-filen \""
++
++ msgid "\" already exists!"
++ msgstr "\" findes allerede!"
++
++ msgid "VIM - ATTENTION"
++ msgstr "VIM - OBS"
++
++ msgid "Swap file already exists!"
++ msgstr "Swap-filen findes allerede!"
++
++ msgid ""
++ "&Open Read-Only\n"
++ "&Edit anyway\n"
++ "&Recover\n"
++ "&Quit\n"
++ "&Abort"
++ msgstr ""
++ "&Ã…bn skrivebeskyttet\n"
++ "&Rediger alligevel\n"
++ "&Gendan\n"
++ "&Afslut\n"
++ "&Afbryd"
++
++ msgid ""
++ "&Open Read-Only\n"
++ "&Edit anyway\n"
++ "&Recover\n"
++ "&Delete it\n"
++ "&Quit\n"
++ "&Abort"
++ msgstr ""
++ "&Ã…bn skrivebeskyttet\n"
++ "&Rediger alligevel\n"
++ "&Gendan\n"
++ "&Slet den\n"
++ "&Afslut\n"
++ "&Afbryd"
++
++ msgid "E326: Too many swap files found"
++ msgstr "E326: For mange swap-filer fundet"
++
++ msgid "E327: Part of menu-item path is not sub-menu"
++ msgstr "E327: Del af sti til menupunkt er ikke undermenu"
++
++ msgid "E328: Menu only exists in another mode"
++ msgstr "E328: Menuen findes kun i en anden tilstand"
++
++ #, c-format
++ msgid "E329: No menu \"%s\""
++ msgstr "E329: Ingen menu \"%s\""
++
++ msgid "E792: Empty menu name"
++ msgstr "E792: Tomt menunavn"
++
++ msgid "E330: Menu path must not lead to a sub-menu"
++ msgstr "E330: Menusti må ikke lede til en undermenu"
++
++ msgid "E331: Must not add menu items directly to menu bar"
++ msgstr "E331: Må ikke tilføje menupunkter direkte til menulinje"
++
++ msgid "E332: Separator cannot be part of a menu path"
++ msgstr "E332: Separator må ikke være del af en menusti"
++
++ msgid ""
++ "\n"
++ "--- Menus ---"
++ msgstr ""
++ "\n"
++ "--- Menuer ---"
++
++ msgid "Tear off this menu"
++ msgstr "Løsriv menuen"
++
++ #, c-format
++ msgid "E335: Menu not defined for %s mode"
++ msgstr "E335: Menu ikke defineret for %s-tilstand"
++
++ msgid "E333: Menu path must lead to a menu item"
++ msgstr "E333: Menusti skal lede til et menupunkt"
++
++ #, c-format
++ msgid "E334: Menu not found: %s"
++ msgstr "E334: Menu ikke fundet: %s"
++
++ msgid "E336: Menu path must lead to a sub-menu"
++ msgstr "E336: Menusti skal lede til en undermenu"
++
++ msgid "E337: Menu not found - check menu names"
++ msgstr "E337: Menu ikke fundet - tjek menunavne"
++
++ #, c-format
++ msgid "Error detected while processing %s:"
++ msgstr "Fejl registreret ved behandling af %s:"
++
++ #, c-format
++ msgid "line %4ld:"
++ msgstr "linje %4ld:"
++
++ #, c-format
++ msgid "E354: Invalid register name: '%s'"
++ msgstr "E354: Ugyldigt registernavn: '%s'"
++
++ msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>"
++ msgstr "Oversætter: scootergrisen"
++
++ msgid "Interrupt: "
++ msgstr "Afbryd: "
++
++ msgid "Press ENTER or type command to continue"
++ msgstr "Tryk på ENTER eller skriv kommando for at fortsætte"
++
++ #, c-format
++ msgid "%s line %ld"
++ msgstr "%s linje %ld"
++
++ msgid "-- More --"
++ msgstr "-- Mere --"
++
++ msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "
++ msgstr " MELLEMRUM/d/j: skærm/side/linje ned, b/u/k: op, q: afslut "
++
++ msgid "Question"
++ msgstr "Spørgsmål"
++
++ msgid ""
++ "&Yes\n"
++ "&No"
++ msgstr ""
++ "&Ja\n"
++ "&Nej"
++
++ msgid ""
++ "&Yes\n"
++ "&No\n"
++ "Save &All\n"
++ "&Discard All\n"
++ "&Cancel"
++ msgstr ""
++ "&Ja\n"
++ "&Nej\n"
++ "Gem &alle\n"
++ "&Forkast alle\n"
++ "&Annuller"
++
++ msgid "Select Directory dialog"
++ msgstr "Vælg mappe-dialog"
++
++ msgid "Save File dialog"
++ msgstr "Gem fil-dialog"
++
++ msgid "Open File dialog"
++ msgstr "Ã…bn fil-dialog"
++
++ msgid "E338: Sorry, no file browser in console mode"
++ msgstr "E338: Beklager, ingen filbrowser i konsol-tilstand"
++
++ msgid "E766: Insufficient arguments for printf()"
++ msgstr "E766: Ikke nok argumenter for printf()"
++
++ msgid "E807: Expected Float argument for printf()"
++ msgstr "E807: Ventede flydende kommatal-argument for printf()"
++
++ msgid "E767: Too many arguments to printf()"
++ msgstr "E767: For mange argumenter til printf()"
++
++ msgid "W10: Warning: Changing a readonly file"
++ msgstr "W10: Advarsel: Ændre en skrivebeskyttet fil"
++
++ msgid "Type number and <Enter> or click with mouse (empty cancels): "
++ msgstr "Skriv nummer og <Enter> eller klik med musen (tom annullerer): "
++
++ msgid "Type number and <Enter> (empty cancels): "
++ msgstr "Skriv nummer og <Enter> (tom annullerer): "
++
++ msgid "1 more line"
++ msgstr "1 linje mere"
++
++ msgid "1 line less"
++ msgstr "1 linje mindre"
++
++ #, c-format
++ msgid "%ld more lines"
++ msgstr "%ld linjer mere"
++
++ #, c-format
++ msgid "%ld fewer lines"
++ msgstr "%ld linjere mindre"
++
++ msgid " (Interrupted)"
++ msgstr " (Afbrudt)"
++
++ msgid "Beep!"
++ msgstr "Bip!"
++
++ msgid "ERROR: "
++ msgstr "FEJL: "
++
++ #, c-format
++ msgid ""
++ "\n"
++ "[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"
++ msgstr ""
++ "\n"
++ "[byte] samlet allok-frigivet %lu-%lu, i brug %lu, spidspunktsbrug %lu\n"
++
++ #, c-format
++ msgid ""
++ "[calls] total re/malloc()'s %lu, total free()'s %lu\n"
++ "\n"
++ msgstr ""
++ "[kald] samlet re/malloc()'er %lu, samlet free()'er %lu\n"
++ "\n"
++
++ msgid "E340: Line is becoming too long"
++ msgstr "E340: Linje er ved at blive for lang"
++
++ #, c-format
++ msgid "E341: Internal error: lalloc(%ld, )"
++ msgstr "E341: Intern fejl: lalloc(%ld, )"
++
++ #, c-format
++ msgid "E342: Out of memory! (allocating %lu bytes)"
++ msgstr "E342: Ikke mere ledig hukommelse! (allokerer %lu byte)"
++
++ #, c-format
++ msgid "Calling shell to execute: \"%s\""
++ msgstr "Kalder skal til udførelse af: \"%s\""
++
++ msgid "E545: Missing colon"
++ msgstr "E545: Manglende kolon"
++
++ msgid "E546: Illegal mode"
++ msgstr "E546: Ulovlig tilstand"
++
++ msgid "E547: Illegal mouseshape"
++ msgstr "E547: Ulovlig museform"
++
++ msgid "E548: digit expected"
++ msgstr "E548: ciffer ventet"
++
++ msgid "E549: Illegal percentage"
++ msgstr "E549: Ulovlig procent"
++
++ msgid "E854: path too long for completion"
++ msgstr "E854: sti for lang til fuldførelse"
++
++ #, c-format
++ msgid ""
++ "E343: Invalid path: '**[number]' must be at the end of the path or be "
++ "followed by '%s'."
++ msgstr ""
++ "E343: Ugyldig sti: '**[nummer]' skal være i slutningen af stien eller "
++ "efterfølges af '%s'."
++
++ #, c-format
++ msgid "E344: Can't find directory \"%s\" in cdpath"
++ msgstr "E344: Kan ikke finde mappen \"%s\" i cdpath"
++
++ #, c-format
++ msgid "E345: Can't find file \"%s\" in path"
++ msgstr "E345: Kan ikke finde filen \"%s\" i path"
++
++ #, c-format
++ msgid "E346: No more directory \"%s\" found in cdpath"
++ msgstr "E346: Ikke flere mappe \"%s\" fundet i cdpath"
++
++ #, c-format
++ msgid "E347: No more file \"%s\" found in path"
++ msgstr "E347: Ikke flere fil \"%s\" fundet i path"
++
++ #, c-format
++ msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\""
++ msgstr "E668: Forkert adgangstilstand for NetBeans-forbindelsens info-fil: \"%s\""
++
++ #, c-format
++ msgid "E658: NetBeans connection lost for buffer %ld"
++ msgstr "E658: NetBeans-forbindelse mistet for buffer %ld"
++
++ msgid "E838: netbeans is not supported with this GUI"
++ msgstr "E838: netbeans understøttes ikke med denne GUI"
++
++ msgid "E511: netbeans already connected"
++ msgstr "E511: netbeans allerede forbundet"
++
++ #, c-format
++ msgid "E505: %s is read-only (add ! to override)"
++ msgstr "E505: %s er skrivebeskyttet (tilføj ! for at tilsidesætte)"
++
++ msgid "E349: No identifier under cursor"
++ msgstr "E349: Ingen identifikator under markør"
++
++ msgid "E774: 'operatorfunc' is empty"
++ msgstr "E774: 'operatorfunc' er tom"
++
++ msgid "E775: Eval feature not available"
++ msgstr "E775: Eval-funktionalitet ikke tilgængelig"
++
++ msgid "Warning: terminal cannot highlight"
++ msgstr "Advarsel: terminal kan ikke fremhæve"
++
++ msgid "E348: No string under cursor"
++ msgstr "E348: Ingen streng under markør"
++
++ msgid "E352: Cannot erase folds with current 'foldmethod'"
++ msgstr "E352: Kan ikke slette sammenfoldninger med nuværende 'foldmethod'"
++
++ msgid "E664: changelist is empty"
++ msgstr "E664: ændringsliste er tom"
++
++ msgid "E662: At start of changelist"
++ msgstr "E662: Ved begyndelsen af ændringsliste"
++
++ msgid "E663: At end of changelist"
++ msgstr "E663: Ved slutningen af ændringsliste"
++
++ msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim"
++ msgstr ""
++ "Skriv :qa! og tryk på <Enter> for at droppe alle ændringer og afslut Vim"
++
++ #, c-format
++ msgid "1 line %sed 1 time"
++ msgstr "1 linje %sed 1 gang"
++
++ #, c-format
++ msgid "1 line %sed %d times"
++ msgstr "1 linje %sed %d gange"
++
++ #, c-format
++ msgid "%ld lines %sed 1 time"
++ msgstr "%ld linjer %sed 1 gang"
++
++ #, c-format
++ msgid "%ld lines %sed %d times"
++ msgstr "%ld linjer %sed %d gange"
++
++ #, c-format
++ msgid "%ld lines to indent... "
++ msgstr "%ld linjer at indrykke... "
++
++ msgid "1 line indented "
++ msgstr "1 linje indrykket "
++
++ #, c-format
++ msgid "%ld lines indented "
++ msgstr "%ld linjer indrykket "
++
++ msgid "E748: No previously used register"
++ msgstr "E748: Intet tidligere brugt register"
++
++ msgid "cannot yank; delete anyway"
++ msgstr "kan ikke rykke; slet alligevel"
++
++ msgid "1 line changed"
++ msgstr "1 linje ændret"
++
++ #, c-format
++ msgid "%ld lines changed"
++ msgstr "%ld linjer ændret"
++
++ #, c-format
++ msgid "freeing %ld lines"
++ msgstr "frigør %ld linjer"
++
++ #, c-format
++ msgid " into \"%c"
++ msgstr " i \"%c"
++
++ #, c-format
++ msgid "block of 1 line yanked%s"
++ msgstr "blok på 1 linje rykket%s"
++
++ #, c-format
++ msgid "1 line yanked%s"
++ msgstr "1 linje rykket%s"
++
++ #, c-format
++ msgid "block of %ld lines yanked%s"
++ msgstr "blok på %ld linjer rykket%s"
++
++ #, c-format
++ msgid "%ld lines yanked%s"
++ msgstr "%ld linjer rykket%s"
++
++ #, c-format
++ msgid "E353: Nothing in register %s"
++ msgstr "E353: Intet i register %s"
++
++ msgid ""
++ "\n"
++ "--- Registers ---"
++ msgstr ""
++ "\n"
++ "--- Registre ---"
++
++ msgid "Illegal register name"
++ msgstr "Ulovligt registernavn"
++
++ msgid ""
++ "\n"
++ "# Registers:\n"
++ msgstr ""
++ "\n"
++ "# Registre:\n"
++
++ #, c-format
++ msgid "E574: Unknown register type %d"
++ msgstr "E574: Ukendt registertype %d"
++
++ msgid ""
++ "E883: search pattern and expression register may not contain two or more "
++ "lines"
++ msgstr ""
++ "E883: søgemønster og udtryksregister må ikke indeholde to eller flere linjer"
++
++ #, c-format
++ msgid "%ld Cols; "
++ msgstr "%ld kolonner; "
++
++ #, c-format
++ msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"
++ msgstr "Markerede %s%ld af %ld linje; %lld af %lld ord; %lld af %lld byte"
++
++ #, c-format
++ msgid ""
++ "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of "
++ "%lld Bytes"
++ msgstr ""
++ "Markerede %s%ld af %ld linje; %lld af %lld ord; %lld af %lld tegn; %lld af %"
++ "lld byte"
++
++ #, c-format
++ msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"
++ msgstr "Kol %s af %s; Linje %ld af %ld; Ord %lld af %lld; Byte %lld af %lld"
++
++ #, c-format
++ msgid ""
++ "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte "
++ "%lld of %lld"
++ msgstr ""
++ "Kol %s af %s; Linje %ld af %ld; Ord %lld af %lld; Tegn %lld af %lld; Byte %"
++ "lld af %lld"
++
++ #, c-format
++ msgid "(+%lld for BOM)"
++ msgstr "(+%lld for BOM)"
++
++ msgid "Thanks for flying Vim"
++ msgstr "Tak fordi du fløj med Vim"
++
++ msgid "E518: Unknown option"
++ msgstr "E518: Ukendt tilvalg"
++
++ msgid "E519: Option not supported"
++ msgstr "E519: Tilvalg understøttes ikke"
++
++ msgid "E520: Not allowed in a modeline"
++ msgstr "E520: Ikke tilladt på en tilstandslinje"
++
++ msgid "E846: Key code not set"
++ msgstr "E846: Tastekode ikke sat"
++
++ msgid "E521: Number required after ="
++ msgstr "E521: Nummer kræves efter ="
++
++ msgid "E522: Not found in termcap"
++ msgstr "E522: Ikke fundet i termcap"
++
++ #, c-format
++ msgid "E539: Illegal character <%s>"
++ msgstr "E539: Ulovligt tegn <%s>"
++
++ #, c-format
++ msgid "For option %s"
++ msgstr "For tilvalget %s"
++
++ msgid "E529: Cannot set 'term' to empty string"
++ msgstr "E529: Kan ikke sætte 'term' til tom streng"
++
++ msgid "E530: Cannot change term in GUI"
++ msgstr "E530: Kan ikke skifte term i GUI"
++
++ msgid "E531: Use \":gui\" to start the GUI"
++ msgstr "E531: Brug \":gui\" til at starte GUI'en"
++
++ msgid "E589: 'backupext' and 'patchmode' are equal"
++ msgstr "E589: 'backupext' og 'patchmode' er ens"
++
++ msgid "E834: Conflicts with value of 'listchars'"
++ msgstr "E834: Er i konflikt med værdien af 'listchars'"
++
++ msgid "E835: Conflicts with value of 'fillchars'"
++ msgstr "E835: Er i konflikt med værdien af 'fillchars'"
++
++ msgid "E617: Cannot be changed in the GTK+ 2 GUI"
++ msgstr "E617: Kan ikke ændres i GTK+ 2 GUI'en"
++
++ #, c-format
++ msgid "E950: Cannot convert between %s and %s"
++ msgstr "E950: Kan ikke konvertere mellem %s og %s"
++
++ msgid "E524: Missing colon"
++ msgstr "E524: Manglende kolon"
++
++ msgid "E525: Zero length string"
++ msgstr "E525: Streng uden længde"
++
++ #, c-format
++ msgid "E526: Missing number after <%s>"
++ msgstr "E526: Manglende nummer efter <%s>"
++
++ msgid "E527: Missing comma"
++ msgstr "E527: Manglende komma"
++
++ msgid "E528: Must specify a ' value"
++ msgstr "E528: Skal angive en '-værdi"
++
++ msgid "E595: contains unprintable or wide character"
++ msgstr "E595: indeholder tegn som ikke kan udskrives eller er bredt"
++
++ msgid "E596: Invalid font(s)"
++ msgstr "E596: Ugyldig skrifttype(r)"
++
++ msgid "E597: can't select fontset"
++ msgstr "E597: kan ikke vælge skrifttypesæt"
++
++ msgid "E598: Invalid fontset"
++ msgstr "E598: Ugyldigt skrifttypesæt"
++
++ msgid "E533: can't select wide font"
++ msgstr "E533: kan ikke vælge bred skrifttype"
++
++ msgid "E534: Invalid wide font"
++ msgstr "E534: Ugyldig bred skrifttype"
++
++ #, c-format
++ msgid "E535: Illegal character after <%c>"
++ msgstr "E535: Ulovligt tegn efter <%c>"
++
++ msgid "E536: comma required"
++ msgstr "E536: komma kræves"
++
++ #, c-format
++ msgid "E537: 'commentstring' must be empty or contain %s"
++ msgstr "E537: 'commentstring' skal være tom eller indeholde %s"
++
++ msgid "E538: No mouse support"
++ msgstr "E538: Ingen understøttelse af mus"
++
++ msgid "E540: Unclosed expression sequence"
++ msgstr "E540: Ulukket udtryk-sekvens"
++
++ msgid "E541: too many items"
++ msgstr "E541: for mange punkter"
++
++ msgid "E542: unbalanced groups"
++ msgstr "E542: ubalancerede grupper"
++
++ msgid "E946: Cannot make a terminal with running job modifiable"
++ msgstr "E946: Kan ikke gøre en terminal med kørende job ændringsbar"
++
++ msgid "E590: A preview window already exists"
++ msgstr "E590: Der findes allerede et forhåndsvisningsvindue"
++
++ msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'"
++ msgstr "W17: Arabisk kræver UTF-8, brug ':set encoding=utf-8'"
++
++ msgid "E954: 24-bit colors are not supported on this environment"
++ msgstr "E954: 24-bit farver understøttes ikke i dette miljø"
++
++ #, c-format
++ msgid "E593: Need at least %d lines"
++ msgstr "E593: Skal være mindst %d linjer"
++
++ #, c-format
++ msgid "E594: Need at least %d columns"
++ msgstr "E594: Skal være mindst %d kolonner"
++
++ #, c-format
++ msgid "E355: Unknown option: %s"
++ msgstr "E355: Ukendt tilvalg: %s"
++
++ #, c-format
++ msgid "E521: Number required: &%s = '%s'"
++ msgstr "E521: Nummer kræves: &%s = '%s'"
++
++ msgid ""
++ "\n"
++ "--- Terminal codes ---"
++ msgstr ""
++ "\n"
++ "--- Terminal-koder ---"
++
++ msgid ""
++ "\n"
++ "--- Global option values ---"
++ msgstr ""
++ "\n"
++ "--- Værdier for globale tilvalg ---"
++
++ msgid ""
++ "\n"
++ "--- Local option values ---"
++ msgstr ""
++ "\n"
++ "--- Værdier for lokale tilvalg ---"
++
++ msgid ""
++ "\n"
++ "--- Options ---"
++ msgstr ""
++ "\n"
++ "--- Tilvalg ---"
++
++ msgid "E356: get_varp ERROR"
++ msgstr "E356: Fejl ved get_varp"
++
++ #, c-format
++ msgid "E357: 'langmap': Matching character missing for %s"
++ msgstr "E357: 'langmap': Matchende tegn mangler for %s"
++
++ #, c-format
++ msgid "E358: 'langmap': Extra characters after semicolon: %s"
++ msgstr "E358: 'langmap': Ekstra tegn efter semikolon: %s"
++
++ msgid "cannot open "
++ msgstr "kan ikke åbne "
++
++ msgid "VIM: Can't open window!\n"
++ msgstr "VIM: Kan ikke åbne vindue!\n"
++
++ msgid "Need Amigados version 2.04 or later\n"
++ msgstr "Behøver Amigados version 2.04 eller senere\n"
++
++ #, c-format
++ msgid "Need %s version %ld\n"
++ msgstr "Behøver %s version %ld\n"
++
++ msgid "Cannot open NIL:\n"
++ msgstr "Kan ikke åbne NIL:\n"
++
++ msgid "Cannot create "
++ msgstr "Kan ikke oprette "
++
++ #, c-format
++ msgid "Vim exiting with %d\n"
++ msgstr "Vim afsluttede med %d\n"
++
++ msgid "cannot change console mode ?!\n"
++ msgstr "kan ikke skifte konsoltilstand ?!\n"
++
++ msgid "mch_get_shellsize: not a console??\n"
++ msgstr "mch_get_shellsize: ikke en konsol??\n"
++
++ msgid "E360: Cannot execute shell with -f option"
++ msgstr "E360: Kan ikke udføre skal med -f-tilvalget"
++
++ msgid "Cannot execute "
++ msgstr "Kan ikke udføre "
++
++ msgid "shell "
++ msgstr "skal "
++
++ msgid " returned\n"
++ msgstr " returnerede\n"
++
++ msgid "ANCHOR_BUF_SIZE too small."
++ msgstr "ANCHOR_BUF_SIZE for lille."
++
++ msgid "I/O ERROR"
++ msgstr "FEJL VED I/O"
++
++ msgid "Message"
++ msgstr "Meddelelse"
++
++ msgid "E237: Printer selection failed"
++ msgstr "E237: Valg af printer mislykkedes"
++
++ #, c-format
++ msgid "to %s on %s"
++ msgstr "til %s på %s"
++
++ #, c-format
++ msgid "E613: Unknown printer font: %s"
++ msgstr "E613: Ukendt skrifttype til printer: %s"
++
++ #, c-format
++ msgid "E238: Print error: %s"
++ msgstr "E238: Fejl ved udskrivning: %s"
++
++ #, c-format
++ msgid "Printing '%s'"
++ msgstr "Udskriver '%s'"
++
++ #, c-format
++ msgid "E244: Illegal charset name \"%s\" in font name \"%s\""
++ msgstr "E244: Ulovligt tegnsætnavn \"%s\" i skrifttypenavnet \"%s\""
++
++ #, c-format
++ msgid "E244: Illegal quality name \"%s\" in font name \"%s\""
++ msgstr "E244: Ulovligt kvalitetsnavn \"%s\" i skrifttypenavnet \"%s\""
++
++ #, c-format
++ msgid "E245: Illegal char '%c' in font name \"%s\""
++ msgstr "E245: Ulovligt tegn '%c' i skrifttypenavnet \"%s\""
++
++ #, c-format
++ msgid "Opening the X display took %ld msec"
++ msgstr "Ã…bningen af X-displayet tog %ld ms"
++
++ msgid ""
++ "\n"
++ "Vim: Got X error\n"
++ msgstr ""
++ "\n"
++ "Vim: Fik fejl ved X\n"
++
++ msgid "Testing the X display failed"
++ msgstr "Test af X-displayet mislykkedes"
++
++ msgid "Opening the X display timed out"
++ msgstr "Ã…bningen af X-displayet fik timeout"
++
++ msgid ""
++ "\n"
++ "Could not get security context for "
++ msgstr ""
++ "\n"
++ "Kunne ikke hente sikkerhedskontekst for "
++
++ msgid ""
++ "\n"
++ "Could not set security context for "
++ msgstr ""
++ "\n"
++ "Kunne ikke sætte sikkerhedskontekst for "
++
++ #, c-format
++ msgid "Could not set security context %s for %s"
++ msgstr "Kunne ikke sætte sikkerhedskonteksten %s for %s"
++
++ #, c-format
++ msgid "Could not get security context %s for %s. Removing it!"
++ msgstr "Kunne ikke hente sikkerhedskonteksten %s for %s. Fjerner den!"
++
++ msgid ""
++ "\n"
++ "Cannot execute shell sh\n"
++ msgstr ""
++ "\n"
++ "Kan ikke udføre skallen sh\n"
++
++ msgid ""
++ "\n"
++ "shell returned "
++ msgstr ""
++ "\n"
++ "skal returnerede "
++
++ msgid ""
++ "\n"
++ "Cannot create pipes\n"
++ msgstr ""
++ "\n"
++ "Kan ikke oprette pipes\n"
++
++ msgid ""
++ "\n"
++ "Cannot fork\n"
++ msgstr ""
++ "\n"
++ "Kan ikke fork\n"
++
++ msgid ""
++ "\n"
++ "Cannot execute shell "
++ msgstr ""
++ "\n"
++ "Kan ikke udføre skallen "
++
++ msgid ""
++ "\n"
++ "Command terminated\n"
++ msgstr ""
++ "\n"
++ "Kommando termineret\n"
++
++ msgid "XSMP lost ICE connection"
++ msgstr "XSMP mistede ICE-forbindelse"
++
++ #, c-format
++ msgid "dlerror = \"%s\""
++ msgstr "dlerror = \"%s\""
++
++ msgid "Opening the X display failed"
++ msgstr "Ã…bningen af X-displayet mislykkedes"
++
++ msgid "XSMP handling save-yourself request"
++ msgstr "XSMP-håndtering save-yourself-anmodning"
++
++ msgid "XSMP opening connection"
++ msgstr "XSMP åbner forbindelse"
++
++ msgid "XSMP ICE connection watch failed"
++ msgstr "XSMP ICE-forbindelse watch mislykkedes"
++
++ #, c-format
++ msgid "XSMP SmcOpenConnection failed: %s"
++ msgstr "XSMP SmcOpenConnection mislykkedes: %s"
++
++ msgid "At line"
++ msgstr "PÃ¥ linje"
++
++ msgid "Could not load vim32.dll!"
++ msgstr "Kunne ikke indlæse vim32.dll!"
++
++ msgid "VIM Error"
++ msgstr "Fejl ved VIM"
++
++ msgid "Could not fix up function pointers to the DLL!"
++ msgstr "Kunne ikke rette op på funktion-pointere til DLL'en!"
++
++ #, c-format
++ msgid "Vim: Caught %s event\n"
++ msgstr "Vim: Fangede %s-hændelse\n"
++
++ msgid "close"
++ msgstr "luk"
++
++ msgid "logoff"
++ msgstr "log ud"
++
++ msgid "shutdown"
++ msgstr "luk ned"
++
++ msgid "E371: Command not found"
++ msgstr "E371: Kommando ikke fundet"
++
++ msgid ""
++ "VIMRUN.EXE not found in your $PATH.\n"
++ "External commands will not pause after completion.\n"
++ "See :help win32-vimrun for more information."
++ msgstr ""
++ "VIMRUN.EXE ikke fundet i din $PATH.\n"
++ "Eksterne kommandoer sættes ikke på pause efter fuldførelse.\n"
++ "Se :help win32-vimrun for mere information."
++
++ msgid "Vim Warning"
++ msgstr "Advarsel ved Vim"
++
++ #, c-format
++ msgid "shell returned %d"
++ msgstr "skal returnerede %d"
++
++ msgid "E926: Current location list was changed"
++ msgstr "E926: Nuværende placeringsliste blev ændret"
++
++ #, c-format
++ msgid "E372: Too many %%%c in format string"
++ msgstr "E372: For mange %%%c i formatet streng"
++
++ #, c-format
++ msgid "E373: Unexpected %%%c in format string"
++ msgstr "E373: Uventet %%%c i formatet streng"
++
++ msgid "E374: Missing ] in format string"
++ msgstr "E374: Manglende ] i formatet streng"
++
++ #, c-format
++ msgid "E375: Unsupported %%%c in format string"
++ msgstr "E375: Ikke-understøttet %%%c i formatet streng"
++
++ #, c-format
++ msgid "E376: Invalid %%%c in format string prefix"
++ msgstr "E376: Ugyldig %%%c i præfiks for formatet streng"
++
++ #, c-format
++ msgid "E377: Invalid %%%c in format string"
++ msgstr "E377: Ugyldig %%%c i formatet streng"
++
++ msgid "E378: 'errorformat' contains no pattern"
++ msgstr "E378: 'errorformat' indeholder ikke noget mønter"
++
++ msgid "E379: Missing or empty directory name"
++ msgstr "E379: Manglende eller tomt mappenavn"
++
++ msgid "E553: No more items"
++ msgstr "E553: Ikke flere punkter"
++
++ msgid "E924: Current window was closed"
++ msgstr "E924: Nuværende vindue blev lukket"
++
++ msgid "E925: Current quickfix was changed"
++ msgstr "E925: Nuværende quickfix blev ændret"
++
++ #, c-format
++ msgid "(%d of %d)%s%s: "
++ msgstr "(%d af %d)%s%s: "
++
++ msgid " (line deleted)"
++ msgstr " (linje slettet)"
++
++ #, c-format
++ msgid "%serror list %d of %d; %d errors "
++ msgstr "%sfejlliste %d af %d; %d fejl "
++
++ msgid "E380: At bottom of quickfix stack"
++ msgstr "E380: Nederst i quickfix-stakken"
++
++ msgid "E381: At top of quickfix stack"
++ msgstr "E381: Øverst i quickfix-stakken"
++
++ msgid "No entries"
++ msgstr "Ingen poster"
++
++ msgid "Error file"
++ msgstr "Fejlfil"
++
++ msgid "E683: File name missing or invalid pattern"
++ msgstr "E683: Filnavn mangler eller ugyldigt mønster"
++
++ #, c-format
++ msgid "Cannot open file \"%s\""
++ msgstr "Kan ikke åbne filen \"%s\""
++
++ msgid "E681: Buffer is not loaded"
++ msgstr "E681: Buffer er ikke indlæst"
++
++ msgid "E777: String or List expected"
++ msgstr "E777: Streng eller liste ventet"
++
++ #, c-format
++ msgid "E369: invalid item in %s%%[]"
++ msgstr "E369: ugyldigt punkt i %s%%[]"
++
++ #, c-format
++ msgid "E769: Missing ] after %s["
++ msgstr "E769: Manglende ] efter %s["
++
++ msgid "E944: Reverse range in character class"
++ msgstr "E944: Baglæns område i tegnklasse"
++
++ msgid "E945: Range too large in character class"
++ msgstr "E945: Område for stort i tegnklasse"
++
++ #, c-format
++ msgid "E53: Unmatched %s%%("
++ msgstr "E53: Ikke-matchet %s%%("
++
++ #, c-format
++ msgid "E54: Unmatched %s("
++ msgstr "E54: Ikke-matchet %s("
++
++ #, c-format
++ msgid "E55: Unmatched %s)"
++ msgstr "E55: Ikke-matchet %s)"
++
++ msgid "E66: \\z( not allowed here"
++ msgstr "E66: \\z( ikke tilladt her"
++
++ msgid "E67: \\z1 et al. not allowed here"
++ msgstr "E67: \\z1 og andre ikke tilladt her"
++
++ #, c-format
++ msgid "E69: Missing ] after %s%%["
++ msgstr "E69: Manglende ] efter %s%%["
++
++ #, c-format
++ msgid "E70: Empty %s%%[]"
++ msgstr "E70: Tom %s%%[]"
++
++ msgid "E65: Illegal back reference"
++ msgstr "E65: Ulovlig tilbage-reference"
++
++ msgid "E339: Pattern too long"
++ msgstr "E339: Mønster for langt"
++
++ msgid "E50: Too many \\z("
++ msgstr "E50: For mange \\z("
++
++ #, c-format
++ msgid "E51: Too many %s("
++ msgstr "E51: For mange %s("
++
++ msgid "E52: Unmatched \\z("
++ msgstr "E52: Ikke-matchet \\z("
++
++ #, c-format
++ msgid "E59: invalid character after %s@"
++ msgstr "E59: ugyldigt tegn efter %s@"
++
++ #, c-format
++ msgid "E60: Too many complex %s{...}s"
++ msgstr "E60: For mange komplekse %s{...}s"
++
++ #, c-format
++ msgid "E61: Nested %s*"
++ msgstr "E61: Indlejret %s*"
++
++ #, c-format
++ msgid "E62: Nested %s%c"
++ msgstr "E62: Indlejret %s%c"
++
++ msgid "E63: invalid use of \\_"
++ msgstr "E63: ugyldig brug af \\_"
++
++ #, c-format
++ msgid "E64: %s%c follows nothing"
++ msgstr "E64: %s%c efterfølger intet"
++
++ msgid "E68: Invalid character after \\z"
++ msgstr "E68: Ugyldigt tegn efter \\z"
++
++ #, c-format
++ msgid "E678: Invalid character after %s%%[dxouU]"
++ msgstr "E678: Ugyldigt tegn efter %s%%[dxouU]"
++
++ #, c-format
++ msgid "E71: Invalid character after %s%%"
++ msgstr "E71: Ugyldigt tegn efter %s%%"
++
++ #, c-format
++ msgid "E554: Syntax error in %s{...}"
++ msgstr "E554: Fejl ved syntaks i %s{...}"
++
++ msgid "External submatches:\n"
++ msgstr "Eksterne undermatch:\n"
++
++ #, c-format
++ msgid "E888: (NFA regexp) cannot repeat %s"
++ msgstr "E888: (NFA regexp) kan ikke gentage %s"
++
++ msgid ""
++ "E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be "
++ "used "
++ msgstr ""
++ "E864: \\%#= må kun efterfølges af 0, 1 eller 2. Bruger den automatiske motor "
++
++ msgid "Switching to backtracking RE engine for pattern: "
++ msgstr "Skifter til backtracking RE-motor for mønster: "
++
++ msgid "E865: (NFA) Regexp end encountered prematurely"
++ msgstr "E865: (NFA) Mødte slutningen på regulært udtryk for tidligt"
++
++ #, c-format
++ msgid "E866: (NFA regexp) Misplaced %c"
++ msgstr "E866: (NFA regexp) Forkert placeret %c"
++
++ #, c-format
++ msgid "E877: (NFA regexp) Invalid character class: %ld"
++ msgstr "E877: (NFA regexp) Ugyldig tegnklasse: %ld"
++
++ #, c-format
++ msgid "E867: (NFA) Unknown operator '\\z%c'"
++ msgstr "E867: (NFA) Ukendt operator '\\z%c'"
++
++ msgid "E951: \\% value too large"
++ msgstr "E951: \\%-værdi for stor"
++
++ #, c-format
++ msgid "E867: (NFA) Unknown operator '\\%%%c'"
++ msgstr "E867: (NFA) Ukendt operator '\\%%%c'"
++
++ msgid "E868: Error building NFA with equivalence class!"
++ msgstr "E868: Fejl ved bygning af NFA med ligestillet klasse!"
++
++ #, c-format
++ msgid "E869: (NFA) Unknown operator '\\@%c'"
++ msgstr "E869: (NFA) Ukendt operator '\\@%c'"
++
++ msgid "E870: (NFA regexp) Error reading repetition limits"
++ msgstr "E870: (NFA regexp) Fejl ved læsning af gentagelsesgrænser"
++
++ msgid "E871: (NFA regexp) Can't have a multi follow a multi !"
++ msgstr "E871: (NFA regexp) En multi må ikke efterfølges af en multi !"
++
++ msgid "E872: (NFA regexp) Too many '('"
++ msgstr "E872: (NFA regexp) For mange '('"
++
++ msgid "E879: (NFA regexp) Too many \\z("
++ msgstr "E879: (NFA regexp) For mange \\z("
++
++ msgid "E873: (NFA regexp) proper termination error"
++ msgstr "E873: (NFA regexp) fejl ved korrekt terminering"
++
++ msgid "E874: (NFA) Could not pop the stack !"
++ msgstr "E874: (NFA) Kunne ikke pop'e stakken !"
++
++ msgid ""
++ "E875: (NFA regexp) (While converting from postfix to NFA), too many states "
++ "left on stack"
++ msgstr ""
++ "E875: (NFA regexp) (Ved konvertering fra postfix til NFA), for mange "
++ "tilstande tilbage på stak"
++
++ msgid "E876: (NFA regexp) Not enough space to store the whole NFA "
++ msgstr "E876: (NFA regexp) Ikke nok plads til at lagre hele NFA'en "
++
++ msgid "E878: (NFA) Could not allocate memory for branch traversal!"
++ msgstr "E878: (NFA) Kunne ikke allokere hukommelse til gennemgang af gren!"
++
++ msgid ""
++ "Could not open temporary log file for writing, displaying on stderr ... "
++ msgstr "Kunne ikke åbne midlertidig logfil til skrivning, viser på stderr ... "
++
++ #, c-format
++ msgid "(NFA) COULD NOT OPEN %s !"
++ msgstr "(NFA) KUNNE IKKE Ã…BNE %s !"
++
++ msgid "Could not open temporary log file for writing "
++ msgstr "Kunne ikke åbne midlertidig logfil til skrivning "
++
++ msgid " VREPLACE"
++ msgstr " VERSTAT"
++
++ msgid " REPLACE"
++ msgstr " ERSTAT"
++
++ msgid " REVERSE"
++ msgstr " BAGLÆNS"
++
++ msgid " INSERT"
++ msgstr " INDSÆT"
++
++ msgid " (insert)"
++ msgstr " (indsæt)"
++
++ msgid " (replace)"
++ msgstr " (erstat)"
++
++ msgid " (vreplace)"
++ msgstr " (verstat)"
++
++ msgid " Hebrew"
++ msgstr " Hebraisk"
++
++ msgid " Arabic"
++ msgstr " Arabisk"
++
++ msgid " (paste)"
++ msgstr " (indsæt)"
++
++ msgid " VISUAL"
++ msgstr " VISUEL"
++
++ msgid " VISUAL LINE"
++ msgstr " VISUEL LINJE"
++
++ msgid " VISUAL BLOCK"
++ msgstr " VISUEL BLOK"
++
++ msgid " SELECT"
++ msgstr " VÆLG"
++
++ msgid " SELECT LINE"
++ msgstr " VÆLG LINJE"
++
++ msgid " SELECT BLOCK"
++ msgstr " VÆLG BLOK"
++
++ msgid "recording"
++ msgstr "optager"
++
++ #, c-format
++ msgid "E383: Invalid search string: %s"
++ msgstr "E383: Ugyldig søgestreng: %s"
++
++ #, c-format
++ msgid "E384: search hit TOP without match for: %s"
++ msgstr "E384: søgning ramte ØVERST uden match for: %s"
++
++ #, c-format
++ msgid "E385: search hit BOTTOM without match for: %s"
++ msgstr "E385: søgning ramte NEDERST uden match for: %s"
++
++ msgid "E386: Expected '?' or '/' after ';'"
++ msgstr "E386: Ventede '?' eller '/' efter ';'"
++
++ msgid " (includes previously listed match)"
++ msgstr " (inkluderer tidligere oplistet match)"
++
++ msgid "--- Included files "
++ msgstr "--- Inkluderede filer "
++
++ msgid "not found "
++ msgstr "ikke fundet "
++
++ msgid "in path ---\n"
++ msgstr "i sti ---\n"
++
++ msgid " (Already listed)"
++ msgstr " (Allerede oplistet)"
++
++ msgid " NOT FOUND"
++ msgstr " IKKE FUNDET"
++
++ #, c-format
++ msgid "Scanning included file: %s"
++ msgstr "Skanner inkluderede filer: %s"
++
++ #, c-format
++ msgid "Searching included file %s"
++ msgstr "Søger efter inkluderede fil %s"
++
++ msgid "E387: Match is on current line"
++ msgstr "E387: Match er på nuværende linje"
++
++ msgid "All included files were found"
++ msgstr "Alle inkluderede filer blev fundet"
++
++ msgid "No included files"
++ msgstr "Ingen inkluderede filer"
++
++ msgid "E388: Couldn't find definition"
++ msgstr "E388: Kunne ikke finde definition"
++
++ msgid "E389: Couldn't find pattern"
++ msgstr "E389: Kunne ikke finde mønster"
++
++ msgid "Substitute "
++ msgstr "Erstatning "
++
++ #, c-format
++ msgid ""
++ "\n"
++ "# Last %sSearch Pattern:\n"
++ "~"
++ msgstr ""
++ "\n"
++ "# Sidste %sSøgemønster:\n"
++ "~"
++
++ msgid "E756: Spell checking is not enabled"
++ msgstr "E756: Stavekontrol er ikke aktiveret"
++
++ #, c-format
++ msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""
++ msgstr "Advarsel: Kan ikke finde ordlisten \"%s_%s.spl\" eller \"%s_ascii.spl\""
++
++ #, c-format
++ msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""
++ msgstr "Advarsel: Kan ikke finde ordlisten \"%s.%s.spl\" eller \"%s.ascii.spl\""
++
++ msgid "E797: SpellFileMissing autocommand deleted buffer"
++ msgstr "E797: SpellFileMissing-autokommando slettede buffer"
++
++ #, c-format
++ msgid "Warning: region %s not supported"
++ msgstr "Advarsel: regionen %s understøttes ikke"
++
++ msgid "Sorry, no suggestions"
++ msgstr "Beklager, ingen forslag"
++
++ #, c-format
++ msgid "Sorry, only %ld suggestions"
++ msgstr "Beklager, kun %ld forslag"
++
++ #, c-format
++ msgid "Change \"%.*s\" to:"
++ msgstr "Ændr \"%.*s\" til:"
++
++ #, c-format
++ msgid " < \"%.*s\""
++ msgstr " < \"%.*s\""
++
++ msgid "E752: No previous spell replacement"
++ msgstr "E752: Ingen tidligere staveerstatning"
++
++ #, c-format
++ msgid "E753: Not found: %s"
++ msgstr "E753: Ikke fundet: %s"
++
++ msgid "E758: Truncated spell file"
++ msgstr "E758: Afkortet spell-fil"
++
++ #, c-format
++ msgid "Trailing text in %s line %d: %s"
++ msgstr "Efterstillede tekst i %s linje %d: %s"
++
++ #, c-format
++ msgid "Affix name too long in %s line %d: %s"
++ msgstr "Affix-navn for langt i %s linje %d: %s"
++
++ msgid "E761: Format error in affix file FOL, LOW or UPP"
++ msgstr "E761: Fejl i format i affix-filens FOL, LOW eller UPP"
++
++ msgid "E762: Character in FOL, LOW or UPP is out of range"
++ msgstr "E762: Tegn i FOL, LOW eller UPP er udenfor område"
++
++ msgid "Compressing word tree..."
++ msgstr "Komprimerer ordtræ..."
++
++ #, c-format
++ msgid "Reading spell file \"%s\""
++ msgstr "Læser spell-filen \"%s\""
++
++ msgid "E757: This does not look like a spell file"
++ msgstr "E757: Det ligner ikke en spell-fil"
++
++ msgid "E771: Old spell file, needs to be updated"
++ msgstr "E771: Gammel spell-fil, som skal opdateres"
++
++ msgid "E772: Spell file is for newer version of Vim"
++ msgstr "E772: Spell-filen er til en nyere version af Vim"
++
++ msgid "E770: Unsupported section in spell file"
++ msgstr "E770: Ikke-understøttet sektion i spell-fil"
++
++ #, c-format
++ msgid "E778: This does not look like a .sug file: %s"
++ msgstr "E778: ligner ikke en .sug-fil: %s"
++
++ #, c-format
++ msgid "E779: Old .sug file, needs to be updated: %s"
++ msgstr "E779: Gammel .sug-fil, som skal opdateres: %s"
++
++ #, c-format
++ msgid "E780: .sug file is for newer version of Vim: %s"
++ msgstr "E780: .sug-filen er til en nyere version af Vim: %s"
++
++ #, c-format
++ msgid "E781: .sug file doesn't match .spl file: %s"
++ msgstr "E781: .sug-filen matcher ikke .spl-filen: %s"
++
++ #, c-format
++ msgid "E782: error while reading .sug file: %s"
++ msgstr "E782: fejl ved læsning af .sug-fil: %s"
++
++ #, c-format
++ msgid "Reading affix file %s ..."
++ msgstr "Læser affix-filen %s ..."
++
++ #, c-format
++ msgid "Conversion failure for word in %s line %d: %s"
++ msgstr "Mislykkede konvertering for ordet %s linje %d: %s"
++
++ #, c-format
++ msgid "Conversion in %s not supported: from %s to %s"
++ msgstr "Konvertering i %s understøttes ikke: fra %s til %s"
++
++ #, c-format
++ msgid "Conversion in %s not supported"
++ msgstr "Konvertering i %s understøttes ikke"
++
++ #, c-format
++ msgid "Invalid value for FLAG in %s line %d: %s"
++ msgstr "Ugyldig værdi for FLAG i %s linje %d: %s"
++
++ #, c-format
++ msgid "FLAG after using flags in %s line %d: %s"
++ msgstr "FLAG efter brug af flag i %s linje %d: %s"
++
++ #, c-format
++ msgid ""
++ "Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line "
++ "%d"
++ msgstr ""
++ "Definering af COMPOUNDFORBIDFLAG efter PFX-punkt kan give forkerte "
++ "resultater i %s linje %d"
++
++ #, c-format
++ msgid ""
++ "Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line "
++ "%d"
++ msgstr ""
++ "Definering af COMPOUNDPERMITFLAG efter PFX-punkt kan give forkerte "
++ "resultater i %s linje %d"
++
++ #, c-format
++ msgid "Wrong COMPOUNDRULES value in %s line %d: %s"
++ msgstr "Forkert COMPOUNDRULES-værdi i %s linje %d: %s"
++
++ #, c-format
++ msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s"
++ msgstr "Forkert COMPOUNDWORDMAX-værdi i %s linje %d: %s"
++
++ #, c-format
++ msgid "Wrong COMPOUNDMIN value in %s line %d: %s"
++ msgstr "Forkert COMPOUNDMIN-værdi i %s linje %d: %s"
++
++ #, c-format
++ msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s"
++ msgstr "Forkert COMPOUNDSYLMAX-værdi i %s linje %d: %s"
++
++ #, c-format
++ msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"
++ msgstr "Forkert CHECKCOMPOUNDPATTERN-værdi i %s linje %d: %s"
++
++ #, c-format
++ msgid "Different combining flag in continued affix block in %s line %d: %s"
++ msgstr "Forskellige kombineringsflag i fortsat affix-blok i %s linje %d: %s"
++
++ #, c-format
++ msgid "Duplicate affix in %s line %d: %s"
++ msgstr "Duplikeret affix i %s linje %d: %s"
++
++ #, c-format
++ msgid ""
++ "Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s "
++ "line %d: %s"
++ msgstr ""
++ "Affix også brugt for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST i %s "
++ "linje %d: %s"
++
++ #, c-format
++ msgid "Expected Y or N in %s line %d: %s"
++ msgstr "Ventede Y eller N i %s linje %d: %s"
++
++ #, c-format
++ msgid "Broken condition in %s line %d: %s"
++ msgstr "Ødelagt betingelse i %s linje %d: %s"
++
++ #, c-format
++ msgid "Expected REP(SAL) count in %s line %d"
++ msgstr "Ventede REP(SAL)-tælling i %s linje %d"
++
++ #, c-format
++ msgid "Expected MAP count in %s line %d"
++ msgstr "Ventede MAP-tælling i %s linje %d"
++
++ #, c-format
++ msgid "Duplicate character in MAP in %s line %d"
++ msgstr "Duplikeret tegn i MAP i %s linje %d"
++
++ #, c-format
++ msgid "Unrecognized or duplicate item in %s line %d: %s"
++ msgstr "Ikke-genkendt eller duplikeret punkt i %s linje %d: %s"
++
++ #, c-format
++ msgid "Missing FOL/LOW/UPP line in %s"
++ msgstr "Manglende FOL-/LOW-/UPP-linje i %s"
++
++ msgid "COMPOUNDSYLMAX used without SYLLABLE"
++ msgstr "COMPOUNDSYLMAX brugt uden SYLLABLE"
++
++ msgid "Too many postponed prefixes"
++ msgstr "For mange udskudte præfikser"
++
++ msgid "Too many compound flags"
++ msgstr "For mange compound-flag"
++
++ msgid "Too many postponed prefixes and/or compound flags"
++ msgstr "For mange udskudte præfikser og/eller compound-flag"
++
++ #, c-format
++ msgid "Missing SOFO%s line in %s"
++ msgstr "Manglende SOFO%s-linje i %s"
++
++ #, c-format
++ msgid "Both SAL and SOFO lines in %s"
++ msgstr "BÃ¥de SAL- og SOFO-linjer i %s"
++
++ #, c-format
++ msgid "Flag is not a number in %s line %d: %s"
++ msgstr "Flag er ikke et nummer i %s linje %d: %s"
++
++ #, c-format
++ msgid "Illegal flag in %s line %d: %s"
++ msgstr "Ulovligt flag i %s linje %d: %s"
++
++ #, c-format
++ msgid "%s value differs from what is used in another .aff file"
++ msgstr "%s-værdi er ikke den samme som bruges i en anden .aff-fil"
++
++ #, c-format
++ msgid "Reading dictionary file %s ..."
++ msgstr "Læser ordbogsfilen %s ..."
++
++ #, c-format
++ msgid "E760: No word count in %s"
++ msgstr "E760: Ingen ordtælling i %s"
++
++ #, c-format
++ msgid "line %6d, word %6ld - %s"
++ msgstr "linje %6d, ord %6ld - %s"
++
++ #, c-format
++ msgid "Duplicate word in %s line %d: %s"
++ msgstr "Duplikeret ord i %s linje %d: %s"
++
++ #, c-format
++ msgid "First duplicate word in %s line %d: %s"
++ msgstr "Første duplikeret ord i %s linje %d: %s"
++
++ #, c-format
++ msgid "%d duplicate word(s) in %s"
++ msgstr "%d duplikeret ord i %s"
++
++ #, c-format
++ msgid "Ignored %d word(s) with non-ASCII characters in %s"
++ msgstr "Ignorerede %d ord med ikke-ASCII-tegn i %s"
++
++ #, c-format
++ msgid "Reading word file %s ..."
++ msgstr "Læser ordfilen %s ..."
++
++ #, c-format
++ msgid "Duplicate /encoding= line ignored in %s line %d: %s"
++ msgstr "Duplikeret /encoding=-linje ignoreret i %s linje %d: %s"
++
++ #, c-format
++ msgid "/encoding= line after word ignored in %s line %d: %s"
++ msgstr "/encoding=-linje efter ord ignoreret i %s linje %d: %s"
++
++ #, c-format
++ msgid "Duplicate /regions= line ignored in %s line %d: %s"
++ msgstr "Duplikerede /regions=-linjer ignoreret i %s linje %d: %s"
++
++ #, c-format
++ msgid "Too many regions in %s line %d: %s"
++ msgstr "For mange regioner i %s linje %d: %s"
++
++ #, c-format
++ msgid "/ line ignored in %s line %d: %s"
++ msgstr "/-linje ignoreret i %s linje %d: %s"
++
++ #, c-format
++ msgid "Invalid region nr in %s line %d: %s"
++ msgstr "Ugyldigt regisionsnummer i %s linje %d: %s"
++
++ #, c-format
++ msgid "Unrecognized flags in %s line %d: %s"
++ msgstr "Ugenkendte flag i %s linje %d: %s"
++
++ #, c-format
++ msgid "Ignored %d words with non-ASCII characters"
++ msgstr "Ignorerer %d ord med ikke-ASCII-tegn"
++
++ msgid "E845: Insufficient memory, word list will be incomplete"
++ msgstr "E845: Ikke nok hukommelse, ordlisten vil være ufuldstændig"
++
++ #, c-format
++ msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
++ msgstr "Komprimerede %d af %d punkter; %d (%d%%) tilbage"
++
++ msgid "Reading back spell file..."
++ msgstr "Læser spell-fil tilbage..."
++
++ msgid "Performing soundfolding..."
++ msgstr "Udfører lydsammenfoldning..."
++
++ #, c-format
++ msgid "Number of words after soundfolding: %ld"
++ msgstr "Antal ord efter lydsammenfoldning: %ld"
++
++ #, c-format
++ msgid "Total number of words: %d"
++ msgstr "Samlet antal ord: %d"
++
++ #, c-format
++ msgid "Writing suggestion file %s ..."
++ msgstr "Skriver forslagsfilen %s ..."
++
++ #, c-format
++ msgid "Estimated runtime memory use: %d bytes"
++ msgstr "Anslået brug af afviklingshukommelse: %d byte"
++
++ msgid "E751: Output file name must not have region name"
++ msgstr "E751: Outputfilnavn må ikke have regionsnavn"
++
++ #, c-format
++ msgid "E754: Only up to %ld regions supported"
++ msgstr "E754: Kun op til %ld regioner understøttes"
++
++ #, c-format
++ msgid "E755: Invalid region in %s"
++ msgstr "E755: Ugyldig region i %s"
++
++ msgid "Warning: both compounding and NOBREAK specified"
++ msgstr "Advarsel: både compounding og NOBREAK angivet"
++
++ #, c-format
++ msgid "Writing spell file %s ..."
++ msgstr "Skriver spell-filen %s ..."
++
++ msgid "Done!"
++ msgstr "Færdig!"
++
++ #, c-format
++ msgid "E765: 'spellfile' does not have %ld entries"
++ msgstr "E765: 'spellfile' har ingen %ld-poster"
++
++ #, c-format
++ msgid "Word '%.*s' removed from %s"
++ msgstr "Ordet '%.*s' fjernet fra %s"
++
++ #, c-format
++ msgid "Word '%.*s' added to %s"
++ msgstr "Ordet '%.*s' tilføjet til %s"
++
++ msgid "E763: Word characters differ between spell files"
++ msgstr "E763: Ordtegn er ikke ens i spell-filer"
++
++ msgid "E783: duplicate char in MAP entry"
++ msgstr "E783: duplikeret tegn i MAP-post"
++
++ msgid "No Syntax items defined for this buffer"
++ msgstr "Ingen syntakspunkter defineret for denne buffer"
++
++ msgid "syntax conceal on"
++ msgstr "syntax conceal on"
++
++ msgid "syntax conceal off"
++ msgstr "syntax conceal off"
++
++ #, c-format
++ msgid "E390: Illegal argument: %s"
++ msgstr "E390: Ulovligt argument: %s"
++
++ msgid "syntax case ignore"
++ msgstr "syntax case ignore"
++
++ msgid "syntax case match"
++ msgstr "syntax case match"
++
++ msgid "syntax spell toplevel"
++ msgstr "syntax spell toplevel"
++
++ msgid "syntax spell notoplevel"
++ msgstr "syntax spell notoplevel"
++
++ msgid "syntax spell default"
++ msgstr "syntax spell default"
++
++ msgid "syntax iskeyword "
++ msgstr "syntax iskeyword "
++
++ #, c-format
++ msgid "E391: No such syntax cluster: %s"
++ msgstr "E391: Ingen sådan syntaks-cluster: %s"
++
++ msgid "syncing on C-style comments"
++ msgstr "synkronisering på C-style-kommentarer"
++
++ msgid "no syncing"
++ msgstr "ingen synkronisering"
++
++ msgid "syncing starts "
++ msgstr "synkronisering starter "
++
++ msgid " lines before top line"
++ msgstr " linjer inden øverste linje"
++
++ msgid ""
++ "\n"
++ "--- Syntax sync items ---"
++ msgstr ""
++ "\n"
++ "--- Syntaks-synkroniseringspunkter ---"
++
++ msgid ""
++ "\n"
++ "syncing on items"
++ msgstr ""
++ "\n"
++ "synkroniserer på punkter"
++
++ msgid ""
++ "\n"
++ "--- Syntax items ---"
++ msgstr ""
++ "\n"
++ "--- Syntakspunkter ---"
++
++ #, c-format
++ msgid "E392: No such syntax cluster: %s"
++ msgstr "E392: Ingen sådan syntaks-cluster: %s"
++
++ msgid "minimal "
++ msgstr "minimal "
++
++ msgid "maximal "
++ msgstr "maksimal "
++
++ msgid "; match "
++ msgstr "; match "
++
++ msgid " line breaks"
++ msgstr " linjeombrydninger"
++
++ msgid "E395: contains argument not accepted here"
++ msgstr "E395: indeholder argument som ikke accepteres her"
++
++ msgid "E844: invalid cchar value"
++ msgstr "E844: ugyldig cchar-værdi"
++
++ msgid "E393: group[t]here not accepted here"
++ msgstr "E393: group[t]here accepteres ikke her"
++
++ #, c-format
++ msgid "E394: Didn't find region item for %s"
++ msgstr "E394: Find ikke regionspunkter for %s"
++
++ msgid "E397: Filename required"
++ msgstr "E397: Filnavn kræves"
++
++ msgid "E847: Too many syntax includes"
++ msgstr "E847: For mange syntaks inkluderinger"
++
++ #, c-format
++ msgid "E789: Missing ']': %s"
++ msgstr "E789: Manglende ']': %s"
++
++ #, c-format
++ msgid "E890: trailing char after ']': %s]%s"
++ msgstr "E890: efterstillede tegn efter ']': %s]%s"
++
++ #, c-format
++ msgid "E398: Missing '=': %s"
++ msgstr "E398: Manglende '=': %s"
++
++ #, c-format
++ msgid "E399: Not enough arguments: syntax region %s"
++ msgstr "E399: For mange argumenter: syntaks region %s"
++
++ msgid "E848: Too many syntax clusters"
++ msgstr "E848: For mange syntaks-clusters"
++
++ msgid "E400: No cluster specified"
++ msgstr "E400: Ingen cluster angivet"
++
++ #, c-format
++ msgid "E401: Pattern delimiter not found: %s"
++ msgstr "E401: Mønsterafgrænser ikke fundet: %s"
++
++ #, c-format
++ msgid "E402: Garbage after pattern: %s"
++ msgstr "E402: Affald efter mønster: %s"
++
++ msgid "E403: syntax sync: line continuations pattern specified twice"
++ msgstr ""
++ "E403: syntaks synkronisering: linjefortsættelsesmønster angivet to gange"
++
++ #, c-format
++ msgid "E404: Illegal arguments: %s"
++ msgstr "E404: Ulovlige argumenter: %s"
++
++ #, c-format
++ msgid "E405: Missing equal sign: %s"
++ msgstr "E405: Manglende lighedstegn: %s"
++
++ #, c-format
++ msgid "E406: Empty argument: %s"
++ msgstr "E406: Tomt argument: %s"
++
++ #, c-format
++ msgid "E407: %s not allowed here"
++ msgstr "E407: %s ikke tilladt her"
++
++ #, c-format
++ msgid "E408: %s must be first in contains list"
++ msgstr "E408: %s skal være først i contains-liste"
++
++ #, c-format
++ msgid "E409: Unknown group name: %s"
++ msgstr "E409: Ukendt gruppenavn: %s"
++
++ #, c-format
++ msgid "E410: Invalid :syntax subcommand: %s"
++ msgstr "E410: Ugyldig :syntax-underkommando: %s"
++
++ msgid ""
++ " TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"
++ msgstr ""
++ " SAMLET ANTAL MATCH LANGSOMST GENNEMS. NAVN MØNSTER"
++
++ msgid "E679: recursive loop loading syncolor.vim"
++ msgstr "E679: rekursiv løkke ved indlæsning af syncolor.vim"
++
++ #, c-format
++ msgid "E411: highlight group not found: %s"
++ msgstr "E411: fremhævningsgruppe ikke fundet: %s"
++
++ #, c-format
++ msgid "E412: Not enough arguments: \":highlight link %s\""
++ msgstr "E412: Ikke nok argumenter: \":highlight link %s\""
++
++ #, c-format
++ msgid "E413: Too many arguments: \":highlight link %s\""
++ msgstr "E413: For mange argumenter: \":highlight link %s\""
++
++ msgid "E414: group has settings, highlight link ignored"
++ msgstr "E414: gruppe har indstillinger, highlight link ignoreret"
++
++ #, c-format
++ msgid "E415: unexpected equal sign: %s"
++ msgstr "E415: uventet lighedstegn: %s"
++
++ #, c-format
++ msgid "E416: missing equal sign: %s"
++ msgstr "E416: manglende lighedstegn: %s"
++
++ #, c-format
++ msgid "E417: missing argument: %s"
++ msgstr "E417: manglende argument: %s"
++
++ #, c-format
++ msgid "E418: Illegal value: %s"
++ msgstr "E418: Ulovlig værdi: %s"
++
++ msgid "E419: FG color unknown"
++ msgstr "E419: Forgrundsfarve ukendt"
++
++ msgid "E420: BG color unknown"
++ msgstr "E420: Baggrundsfarve ukendt"
++
++ #, c-format
++ msgid "E421: Color name or number not recognized: %s"
++ msgstr "E421: Farvenavn eller -nummer ikke genkendt: %s"
++
++ #, c-format
++ msgid "E422: terminal code too long: %s"
++ msgstr "E422: terminalkode for lang: %s"
++
++ #, c-format
++ msgid "E423: Illegal argument: %s"
++ msgstr "E423: Ulovligt argument: %s"
++
++ msgid "E424: Too many different highlighting attributes in use"
++ msgstr "E424: For mange forskellige fremhævningsattributter i brug"
++
++ msgid "E669: Unprintable character in group name"
++ msgstr "E669: Tegn som ikke kan udskrives i gruppenavn"
++
++ msgid "W18: Invalid character in group name"
++ msgstr "W18: Ugyldige tegn i gruppenavn"
++
++ msgid "E849: Too many highlight and syntax groups"
++ msgstr "E849: For mange fremhævnings- og syntaksgrupper"
++
++ msgid "E555: at bottom of tag stack"
++ msgstr "E555: nederst i tag-stak"
++
++ msgid "E556: at top of tag stack"
++ msgstr "E556: øverst i tag-stak"
++
++ msgid "E425: Cannot go before first matching tag"
++ msgstr "E425: Kan ikke gå efter første matchende tag"
++
++ #, c-format
++ msgid "E426: tag not found: %s"
++ msgstr "E426: tag ikke fundet: %s"
++
++ msgid " # pri kind tag"
++ msgstr " # pri kind tag"
++
++ msgid "file\n"
++ msgstr "fil\n"
++
++ msgid "E427: There is only one matching tag"
++ msgstr "E427: Der er kun ét matchende tag"
++
++ msgid "E428: Cannot go beyond last matching tag"
++ msgstr "E428: Kan ikke gå efter sidste matchende tag"
++
++ #, c-format
++ msgid "File \"%s\" does not exist"
++ msgstr "Filen \"%s\" findes ikke"
++
++ #, c-format
++ msgid "tag %d of %d%s"
++ msgstr "tag %d af %d%s"
++
++ msgid " or more"
++ msgstr " eller flere"
++
++ msgid " Using tag with different case!"
++ msgstr " Bruger tag med anden versaltype!"
++
++ #, c-format
++ msgid "E429: File \"%s\" does not exist"
++ msgstr "E429: Filen \"%s\" findes ikke"
++
++ msgid ""
++ "\n"
++ " # TO tag FROM line in file/text"
++ msgstr ""
++ "\n"
++ " # TIL tag FRA linje i fil/tekst"
++
++ #, c-format
++ msgid "Searching tags file %s"
++ msgstr "Søger i tags-filen %s"
++
++ #, c-format
++ msgid "E430: Tag file path truncated for %s\n"
++ msgstr "E430: Tag-filens sti afkortet for %s\n"
++
++ msgid "Ignoring long line in tags file"
++ msgstr "Ignorerer lang linje i tags-fil"
++
++ #, c-format
++ msgid "E431: Format error in tags file \"%s\""
++ msgstr "E431: Fejl ved format i tags-filen \"%s\""
++
++ #, c-format
++ msgid "Before byte %ld"
++ msgstr "Inden byte %ld"
++
++ #, c-format
++ msgid "E432: Tags file not sorted: %s"
++ msgstr "E432: Tags-fil ikke sorteret: %s"
++
++ msgid "E433: No tags file"
++ msgstr "E433: Ingen tags-fil"
++
++ msgid "E434: Can't find tag pattern"
++ msgstr "E434: Kan ikke finde tag-mønster"
++
++ msgid "E435: Couldn't find tag, just guessing!"
++ msgstr "E435: Kunne ikke finde tag, gætter bare!"
++
++ #, c-format
++ msgid "Duplicate field name: %s"
++ msgstr "Duplikeret feltnavn: %s"
++
++ msgid "' not known. Available builtin terminals are:"
++ msgstr "' ikke kendt. Tilgængelige indbyggede terminaler:"
++
++ msgid "defaulting to '"
++ msgstr "bruger standarden '"
++
++ msgid "E557: Cannot open termcap file"
++ msgstr "E557: Kan ikke åbne termcap-fil"
++
++ msgid "E558: Terminal entry not found in terminfo"
++ msgstr "E558: Terminal-post ikke fundet i terminfo"
++
++ msgid "E559: Terminal entry not found in termcap"
++ msgstr "E559: Terminal-post ikke fundet i termcap"
++
++ #, c-format
++ msgid "E436: No \"%s\" entry in termcap"
++ msgstr "E436: Ingen \"%s\"-post i termcap"
++
++ msgid "E437: terminal capability \"cm\" required"
++ msgstr "E437: terminal-formåenheden \"cm\" kræves"
++
++ msgid ""
++ "\n"
++ "--- Terminal keys ---"
++ msgstr ""
++ "\n"
++ "--- Terminal-taster ---"
++
++ msgid "Cannot open $VIMRUNTIME/rgb.txt"
++ msgstr "Kan ikke åbne $VIMRUNTIME/rgb.txt"
++
++ #, c-format
++ msgid "Kill job in \"%s\"?"
++ msgstr "Dræb job i \"%s\"?"
++
++ msgid "Terminal"
++ msgstr "Terminal"
++
++ msgid "Terminal-finished"
++ msgstr "Terminal-færdig"
++
++ msgid "active"
++ msgstr "aktiv"
++
++ msgid "running"
++ msgstr "køre"
++
++ msgid "finished"
++ msgstr "færdig"
++
++ #, c-format
++ msgid "E953: File exists: %s"
++ msgstr "E953: Filen findes: %s"
++
++ msgid "E955: Not a terminal buffer"
++ msgstr "E955: Ikke en terminal-buffer"
++
++ msgid "new shell started\n"
++ msgstr "ny skal startet\n"
++
++ msgid "Vim: Error reading input, exiting...\n"
++ msgstr "Vim: Fejl ved læsning af input, afslutter...\n"
++
++ msgid "Used CUT_BUFFER0 instead of empty selection"
++ msgstr "Brugte CUT_BUFFER0 i stedet for tom markering"
++
++ msgid "E881: Line count changed unexpectedly"
++ msgstr "E881: Linjeantal ændret uventet"
++
++ msgid "No undo possible; continue anyway"
++ msgstr "Ingen fortryd mulig; fortsætter alligevel"
++
++ #, c-format
++ msgid "E828: Cannot open undo file for writing: %s"
++ msgstr "E828: Kan ikke åbne fortrydelsesfil til skrivning: %s"
++
++ #, c-format
++ msgid "E825: Corrupted undo file (%s): %s"
++ msgstr "E825: Korrupt fortrydelsesfil (%s): %s"
++
++ msgid "Cannot write undo file in any directory in 'undodir'"
++ msgstr "Kan ikke skrive fortrydelsesfil i nogen mappe i 'undodir'"
++
++ #, c-format
++ msgid "Will not overwrite with undo file, cannot read: %s"
++ msgstr "Overskriver ikke med fortrydelsesfil, kan ikke læse: %s"
++
++ #, c-format
++ msgid "Will not overwrite, this is not an undo file: %s"
++ msgstr "Overskriver ikke, det er ikke en fortrydelsesfil: %s"
++
++ msgid "Skipping undo file write, nothing to undo"
++ msgstr "Springer skrivning af fortrydelsesfil over, intet at fortryde"
++
++ #, c-format
++ msgid "Writing undo file: %s"
++ msgstr "Skriver fortrydelsesfil: %s"
++
++ #, c-format
++ msgid "E829: write error in undo file: %s"
++ msgstr "E829: fejl ved skrivning i fortrydelsesfil: %s"
++
++ #, c-format
++ msgid "Not reading undo file, owner differs: %s"
++ msgstr "Læser ikke fortrydelsesfil, ejer er ikke den samme: %s"
++
++ #, c-format
++ msgid "Reading undo file: %s"
++ msgstr "Læser fortrydelsesfil: %s"
++
++ #, c-format
++ msgid "E822: Cannot open undo file for reading: %s"
++ msgstr "E822: Kan ikke åbne fortrydelsesfil til læsning: %s"
++
++ #, c-format
++ msgid "E823: Not an undo file: %s"
++ msgstr "E823: Ikke en fortrydelsesfil: %s"
++
++ #, c-format
++ msgid "E832: Non-encrypted file has encrypted undo file: %s"
++ msgstr "E832: Ikke-krypteret fil har krypteret fortrydelsesfil: %s"
++
++ #, c-format
++ msgid "E826: Undo file decryption failed: %s"
++ msgstr "E826: Dekryptering af fortrydelsesfil mislykkedes: %s"
++
++ #, c-format
++ msgid "E827: Undo file is encrypted: %s"
++ msgstr "E827: Fortrydelsesfilen er krypteret: %s"
++
++ #, c-format
++ msgid "E824: Incompatible undo file: %s"
++ msgstr "E824: Inkompatibel fortrydelsesfil: %s"
++
++ msgid "File contents changed, cannot use undo info"
++ msgstr "Filindholdet ændret, kan ikke bruge fortrydelsesinfo"
++
++ #, c-format
++ msgid "Finished reading undo file %s"
++ msgstr "Færdig med at læse fortrydelsesfilen %s"
++
++ msgid "Already at oldest change"
++ msgstr "Allerede ved ældste ændring"
++
++ msgid "Already at newest change"
++ msgstr "Allerede ved nyeste ændring"
++
++ #, c-format
++ msgid "E830: Undo number %ld not found"
++ msgstr "E830: Fortrydelsesnummer %ld ikke fundet"
++
++ msgid "E438: u_undo: line numbers wrong"
++ msgstr "E438: u_undo: linjenumre forkerte"
++
++ msgid "more line"
++ msgstr "linje mere"
++
++ msgid "more lines"
++ msgstr "linjer mere"
++
++ msgid "line less"
++ msgstr "linje mindre"
++
++ msgid "fewer lines"
++ msgstr "linjere mindre"
++
++ msgid "change"
++ msgstr "ændring"
++
++ msgid "changes"
++ msgstr "ændringer"
++
++ #, c-format
++ msgid "%ld %s; %s #%ld %s"
++ msgstr "%ld %s; %s #%ld %s"
++
++ msgid "before"
++ msgstr "inden"
++
++ msgid "after"
++ msgstr "efter"
++
++ msgid "Nothing to undo"
++ msgstr "Intet at fortryde"
++
++ msgid "number changes when saved"
++ msgstr "nummer ændrin. hvornår gemt"
++
++ #, c-format
++ msgid "%ld seconds ago"
++ msgstr "%ld sekunder siden"
++
++ msgid "E790: undojoin is not allowed after undo"
++ msgstr "E790: undojoin ikke tilladt efter undo"
++
++ msgid "E439: undo list corrupt"
++ msgstr "E439: fortrydelsesliste korrupt"
++
++ msgid "E440: undo line missing"
++ msgstr "E440: fortrydelseslinje mangler"
++
++ #, c-format
++ msgid "E122: Function %s already exists, add ! to replace it"
++ msgstr "E122: Funktionen %s findes allerede, tilføj ! for at erstatte den"
++
++ msgid "E717: Dictionary entry already exists"
++ msgstr "E717: Ordbog-post findes allerede"
++
++ msgid "E718: Funcref required"
++ msgstr "E718: Funcref kræves"
++
++ #, c-format
++ msgid "E130: Unknown function: %s"
++ msgstr "E130: Ukendt funktion: %s"
++
++ #, c-format
++ msgid "E125: Illegal argument: %s"
++ msgstr "E125: Ulovligt argument: %s"
++
++ #, c-format
++ msgid "E853: Duplicate argument name: %s"
++ msgstr "E853: Duplikeret argumentnavn: %s"
++
++ #, c-format
++ msgid "E740: Too many arguments for function %s"
++ msgstr "E740: For mange argumenter til funktionen %s"
++
++ #, c-format
++ msgid "E116: Invalid arguments for function %s"
++ msgstr "E116: Ugyldige argumenter til funktionen %s"
++
++ msgid "E132: Function call depth is higher than 'maxfuncdepth'"
++ msgstr "E132: Dybden af funktionskald er større end 'maxfuncdepth'"
++
++ #, c-format
++ msgid "calling %s"
++ msgstr "kalder %s"
++
++ #, c-format
++ msgid "%s aborted"
++ msgstr "%s afbrudt"
++
++ #, c-format
++ msgid "%s returning #%ld"
++ msgstr "%s returnerer #%ld"
++
++ #, c-format
++ msgid "%s returning %s"
++ msgstr "%s returnerer %s"
++
++ msgid "E699: Too many arguments"
++ msgstr "E699: For mange argumenter"
++
++ #, c-format
++ msgid "E117: Unknown function: %s"
++ msgstr "E117: Ukendt funktion: %s"
++
++ #, c-format
++ msgid "E933: Function was deleted: %s"
++ msgstr "E933: Funktion blev slettet: %s"
++
++ #, c-format
++ msgid "E119: Not enough arguments for function: %s"
++ msgstr "E119: Ikke nok argumenter til funktionen: %s"
++
++ #, c-format
++ msgid "E120: Using <SID> not in a script context: %s"
++ msgstr "E120: Bruger <SID> ikke i et script kontekst: %s"
++
++ #, c-format
++ msgid "E725: Calling dict function without Dictionary: %s"
++ msgstr "E725: Kalder dict-funktion uden ordbog: %s"
++
++ msgid "E129: Function name required"
++ msgstr "E129: Funktionsnavn kræves"
++
++ #, c-format
++ msgid "E128: Function name must start with a capital or \"s:\": %s"
++ msgstr "E128: Funktionsnavnet skal begynde med et stort bogstav eller \"s:\": %s"
++
++ #, c-format
++ msgid "E884: Function name cannot contain a colon: %s"
++ msgstr "E884: Funktionsnavnet må ikke indeholdet et kolon: %s"
++
++ #, c-format
++ msgid "E123: Undefined function: %s"
++ msgstr "E123: Udefineret funktion: %s"
++
++ #, c-format
++ msgid "E124: Missing '(': %s"
++ msgstr "E124: Manglende '(': %s"
++
++ msgid "E862: Cannot use g: here"
++ msgstr "E862: Kan ikke bruge g: her"
++
++ #, c-format
++ msgid "E932: Closure function should not be at top level: %s"
++ msgstr "E932: Closure-funktion skal ikke være på topniveau: %s"
++
++ msgid "E126: Missing :endfunction"
++ msgstr "E126: Manglende :endfunction"
++
++ #, c-format
++ msgid "W22: Text found after :endfunction: %s"
++ msgstr "W22: Tekst fundet efter :endfunction: %s"
++
++ #, c-format
++ msgid "E707: Function name conflicts with variable: %s"
++ msgstr "E707: Funktionsnavnet er i konflikt med variablen: %s"
++
++ #, c-format
++ msgid "E127: Cannot redefine function %s: It is in use"
++ msgstr "E127: Kan ikke redefinere funktionen %s: Den er i brug"
++
++ #, c-format
++ msgid "E746: Function name does not match script file name: %s"
++ msgstr "E746: Funktionsnavn matcher ikke scriptfilnavn: %s"
++
++ #, c-format
++ msgid "E131: Cannot delete function %s: It is in use"
++ msgstr "E131: Kan ikke slette funktionen %s: Den er i brug"
++
++ msgid "E133: :return not inside a function"
++ msgstr "E133: :return ikke i en funktion"
++
++ #, c-format
++ msgid "E107: Missing parentheses: %s"
++ msgstr "E107: Manglende parenteser: %s"
++
++ msgid ""
++ "\n"
++ "MS-Windows 64-bit GUI version"
++ msgstr ""
++ "\n"
++ "MS-Windows 64-bit GUI-version"
++
++ msgid ""
++ "\n"
++ "MS-Windows 32-bit GUI version"
++ msgstr ""
++ "\n"
++ "MS-Windows 32-bit GUI-version"
++
++ msgid " with OLE support"
++ msgstr " med understøttelse af OLE"
++
++ msgid ""
++ "\n"
++ "MS-Windows 64-bit console version"
++ msgstr ""
++ "\n"
++ "MS-Windows 64-bit konsol-version"
++
++ msgid ""
++ "\n"
++ "MS-Windows 32-bit console version"
++ msgstr ""
++ "\n"
++ "MS-Windows 32-bit konsol-version"
++
++ msgid ""
++ "\n"
++ "macOS version"
++ msgstr ""
++ "\n"
++ "macOS-version"
++
++ msgid ""
++ "\n"
++ "macOS version w/o darwin feat."
++ msgstr ""
++ "\n"
++ "macOS-version med/uden darwin-funktionalitet."
++
++ msgid ""
++ "\n"
++ "OpenVMS version"
++ msgstr ""
++ "\n"
++ "OpenVMS-version"
++
++ msgid ""
++ "\n"
++ "Included patches: "
++ msgstr ""
++ "\n"
++ "Rettelser som er med: "
++
++ msgid ""
++ "\n"
++ "Extra patches: "
++ msgstr ""
++ "\n"
++ "Ekstra rettelser: "
++
++ msgid "Modified by "
++ msgstr "Ændret af "
++
++ msgid ""
++ "\n"
++ "Compiled "
++ msgstr ""
++ "\n"
++ "Kompileret "
++
++ msgid "by "
++ msgstr "af "
++
++ msgid ""
++ "\n"
++ "Huge version "
++ msgstr ""
++ "\n"
++ "Huge-version "
++
++ msgid ""
++ "\n"
++ "Big version "
++ msgstr ""
++ "\n"
++ "Big-version "
++
++ msgid ""
++ "\n"
++ "Normal version "
++ msgstr ""
++ "\n"
++ "Normal-version "
++
++ msgid ""
++ "\n"
++ "Small version "
++ msgstr ""
++ "\n"
++ "Small-version "
++
++ msgid ""
++ "\n"
++ "Tiny version "
++ msgstr ""
++ "\n"
++ "Tiny-version "
++
++ msgid "without GUI."
++ msgstr "uden GUI."
++
++ msgid "with GTK3 GUI."
++ msgstr "med GTK3-GUI."
++
++ msgid "with GTK2-GNOME GUI."
++ msgstr "med GTK2-GNOME-GUI."
++
++ msgid "with GTK2 GUI."
++ msgstr "med GTK2-GUI."
++
++ msgid "with X11-Motif GUI."
++ msgstr "med X11-Motif-GUI."
++
++ msgid "with X11-neXtaw GUI."
++ msgstr "med X11-neXtaw-GUI."
++
++ msgid "with X11-Athena GUI."
++ msgstr "med X11-Athena-GUI."
++
++ msgid "with Photon GUI."
++ msgstr "med Photon-GUI."
++
++ msgid "with GUI."
++ msgstr "med GUI."
++
++ msgid "with Carbon GUI."
++ msgstr "med Carbon-GUI."
++
++ msgid "with Cocoa GUI."
++ msgstr "med Cocoa-GUI."
++
++ msgid " Features included (+) or not (-):\n"
++ msgstr " Funktionaliteter som er med (+) eller ikke (-):\n"
++
++ msgid " system vimrc file: \""
++ msgstr " system vimrc-fil: \""
++
++ msgid " user vimrc file: \""
++ msgstr " bruger vimrc-fil: \""
++
++ msgid " 2nd user vimrc file: \""
++ msgstr " 2. bruger vimrc-fil: \""
++
++ msgid " 3rd user vimrc file: \""
++ msgstr " 3. bruger vimrc-fil: \""
++
++ msgid " user exrc file: \""
++ msgstr " bruger exrc-fil: \""
++
++ msgid " 2nd user exrc file: \""
++ msgstr " 2. bruger exrc-fil: \""
++
++ msgid " system gvimrc file: \""
++ msgstr " system gvimrc-fil: \""
++
++ msgid " user gvimrc file: \""
++ msgstr " bruger gvimrc-fil: \""
++
++ msgid "2nd user gvimrc file: \""
++ msgstr "2. bruger gvimrc-fil: \""
++
++ msgid "3rd user gvimrc file: \""
++ msgstr "3. bruger gvimrc-fil: \""
++
++ msgid " defaults file: \""
++ msgstr " defaults-fil: \""
++
++ msgid " system menu file: \""
++ msgstr " system menu-fil: \""
++
++ msgid " fall-back for $VIM: \""
++ msgstr " fall-back for $VIM: \""
++
++ msgid " f-b for $VIMRUNTIME: \""
++ msgstr " f-b for $VIMRUNTIME: \""
++
++ msgid "Compilation: "
++ msgstr "Kompilering: "
++
++ msgid "Compiler: "
++ msgstr "Kompiler: "
++
++ msgid "Linking: "
++ msgstr "Linking: "
++
++ msgid " DEBUG BUILD"
++ msgstr " FEJLRETNINGSBYG"
++
++ msgid "VIM - Vi IMproved"
++ msgstr "VIM - Vi IMproved"
++
++ msgid "version "
++ msgstr "version "
++
++ msgid "by Bram Moolenaar et al."
++ msgstr "af Bram Moolenaar og andre"
++
++ msgid "Vim is open source and freely distributable"
++ msgstr "Vim er open source og kan frit distribueres"
++
++ msgid "Help poor children in Uganda!"
++ msgstr "Hjælp fattige børn i Uganda!"
++
++ msgid "type :help iccf<Enter> for information "
++ msgstr "skriv :help iccf<Enter> for information "
++
++ msgid "type :q<Enter> to exit "
++ msgstr "skriv :q<Enter> for at afslutte "
++
++ msgid "type :help<Enter> or <F1> for on-line help"
++ msgstr "skriv :help<Enter> eller <F1> for onlinehjælp "
++
++ msgid "type :help version8<Enter> for version info"
++ msgstr "skriv :help version8<Enter> for versionsinfo"
++
++ msgid "Running in Vi compatible mode"
++ msgstr "Kører i Vi-kompatibel-tilstand"
++
++ msgid "type :set nocp<Enter> for Vim defaults"
++ msgstr "skriv :set nocp<Enter> for Vim-standarder"
++
++ msgid "type :help cp-default<Enter> for info on this"
++ msgstr "skriv :help cp-default<Enter> for info om det "
++
++ msgid "menu Help->Orphans for information "
++ msgstr "menu Hjælp->Forældreløse børnfor information "
++
++ msgid "Running modeless, typed text is inserted"
++ msgstr "Kører tilstandsløs, skrevet tekst indsættes"
++
++ msgid "menu Edit->Global Settings->Toggle Insert Mode "
++ msgstr "menu Rediger->Globale indstillinger->Indsæt-tilstand til/fra "
++
++ msgid " for two modes "
++ msgstr " for to-tilstande "
++
++ msgid "menu Edit->Global Settings->Toggle Vi Compatible"
++ msgstr "menu Rediger->Globale indstillinger->Vi-kompatibel til/fra"
++
++ msgid " for Vim defaults "
++ msgstr " for Vim-standarder "
++
++ msgid "Sponsor Vim development!"
++ msgstr "Sponsorer udviklingen af Vim!"
++
++ msgid "Become a registered Vim user!"
++ msgstr "Bliv en registreret Vim-bruger!"
++
++ msgid "type :help sponsor<Enter> for information "
++ msgstr "skriv :help sponsor<Enter> for information "
++
++ msgid "type :help register<Enter> for information "
++ msgstr "skriv :help register<Enter> for information "
++
++ msgid "menu Help->Sponsor/Register for information "
++ msgstr "menu Hjælp->Sponsorer/registrer for information "
++
++ msgid "Already only one window"
++ msgstr "Allerede kun ét vindue"
++
++ msgid "E441: There is no preview window"
++ msgstr "E441: Der er ikke noget forhåndsvisningsvindue"
++
++ msgid "E442: Can't split topleft and botright at the same time"
++ msgstr "E442: Kan ikke opdele øverste venstre og nederste højre på samme tid"
++
++ msgid "E443: Cannot rotate when another window is split"
++ msgstr "E443: Kan ikke rotere når et andet vindue er opdelt"
++
++ msgid "E444: Cannot close last window"
++ msgstr "E444: Kan ikke lukke sidste vindue"
++
++ msgid "E813: Cannot close autocmd window"
++ msgstr "E813: Kan ikke lukke autocmd-vindue"
++
++ msgid "E814: Cannot close window, only autocmd window would remain"
++ msgstr "E814: Kan ikke lukke vindue, kun autocmd-vindue ville være tilbage"
++
++ msgid "E445: Other window contains changes"
++ msgstr "E445: Et andet vindue indeholder ændringer"
++
++ msgid "E446: No file name under cursor"
++ msgstr "E446: Intet filnavn under markør"
++
++ #, c-format
++ msgid "E447: Can't find file \"%s\" in path"
++ msgstr "E447: Kan ikke finde filen \"%s\" i sti"
++
++ #, c-format
++ msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)"
++ msgstr "E799: Ugyldigt ID: %ld (skal være større end eller lig med 1)"
++
++ #, c-format
++ msgid "E801: ID already taken: %ld"
++ msgstr "E801: ID allerede taget: %ld"
++
++ msgid "List or number required"
++ msgstr "Liste eller nummer kræves"
++
++ #, c-format
++ msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)"
++ msgstr "E802: Ugyldigt ID: %ld (skal være større end eller lig med 1)"
++
++ #, c-format
++ msgid "E803: ID not found: %ld"
++ msgstr "E803: ID ikke fundet: %ld"
++
++ #, c-format
++ msgid "E370: Could not load library %s"
++ msgstr "E370: Kunne ikke indlæse biblioteket %s"
++
++ msgid "Sorry, this command is disabled: the Perl library could not be loaded."
++ msgstr ""
++ "Beklager, kommandoen er deaktiveret: Perl-biblioteket kunne ikke indlæses."
++
++ msgid "E299: Perl evaluation forbidden in sandbox without the Safe module"
++ msgstr "E299: Perl-evaluering forbudt i sandbox uden Safe-modulet"
++
++ msgid "Edit with &multiple Vims"
++ msgstr "Rediger med &flere Vim'er"
++
++ msgid "Edit with single &Vim"
++ msgstr "Rediger med én &Vim"
++
++ msgid "Diff with Vim"
++ msgstr "Diff med Vim"
++
++ msgid "Edit with &Vim"
++ msgstr "Rediger med &Vim"
++
++ msgid "Edit with existing Vim - "
++ msgstr "Rediger med eksisterende Vim - "
++
++ msgid "Edits the selected file(s) with Vim"
++ msgstr "Redigerer den valgt fil(er) med Vim"
++
++ msgid "Error creating process: Check if gvim is in your path!"
++ msgstr "Fejl ved oprettelse af proces: Tjek om gvim er i din sti!"
++
++ msgid "gvimext.dll error"
++ msgstr "fejl ved gvimext.dll"
++
++ msgid "Path length too long!"
++ msgstr "Stiens længde er for lang!"
++
++ msgid "--No lines in buffer--"
++ msgstr "--Ingen linjer i buffer--"
++
++ msgid "E470: Command aborted"
++ msgstr "E470: Kommando afbrudt"
++
++ msgid "E471: Argument required"
++ msgstr "E471: Argument kræves"
++
++ msgid "E10: \\ should be followed by /, ? or &"
++ msgstr "E10: \\ skal efterføles af /, ? eller &"
++
++ msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits"
++ msgstr "E11: Ugyldig i kommandolinjevindue; <CR> udfører, CTRL-C afslutter"
++
++ msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search"
++ msgstr ""
++ "E12: Kommando ikke tilladt fra exrc/vimrc i nuværende mappe- eller "
++ "tagsøgning"
++
++ msgid "E171: Missing :endif"
++ msgstr "E171: Manglende :endif"
++
++ msgid "E600: Missing :endtry"
++ msgstr "E600: Manglende :endtry"
++
++ msgid "E170: Missing :endwhile"
++ msgstr "E170: Manglende :endwhile"
++
++ msgid "E170: Missing :endfor"
++ msgstr "E170: Manglende :endfor"
++
++ msgid "E588: :endwhile without :while"
++ msgstr "E588: :endwhile uden :while"
++
++ msgid "E588: :endfor without :for"
++ msgstr "E588: :endfor uden :for"
++
++ msgid "E13: File exists (add ! to override)"
++ msgstr "E13: Filen findes (tilføj ! for at tilsidesætte)"
++
++ msgid "E472: Command failed"
++ msgstr "E472: Kommando mislykkede"
++
++ #, c-format
++ msgid "E234: Unknown fontset: %s"
++ msgstr "E234: Ukendt skrifttypesæt: %s"
++
++ #, c-format
++ msgid "E235: Unknown font: %s"
++ msgstr "E235: Ukendt skrifttype: %s"
++
++ #, c-format
++ msgid "E236: Font \"%s\" is not fixed-width"
++ msgstr "E236: Skrifttypen \"%s\" er ikke med fast bredde"
++
++ msgid "E473: Internal error"
++ msgstr "E473: Intern fejl"
++
++ #, c-format
++ msgid "E685: Internal error: %s"
++ msgstr "E685: Intern fejl: %s"
++
++ msgid "Interrupted"
++ msgstr "Afbrudt"
++
++ msgid "E14: Invalid address"
++ msgstr "E14: Ugyldig adresse"
++
++ msgid "E474: Invalid argument"
++ msgstr "E474: Ugyldigt argument"
++
++ #, c-format
++ msgid "E475: Invalid argument: %s"
++ msgstr "E475: Ugyldigt argument: %s"
++
++ #, c-format
++ msgid "E475: Invalid value for argument %s"
++ msgstr "E475: Ugyldig værdi for argumentet %s"
++
++ #, c-format
++ msgid "E475: Invalid value for argument %s: %s"
++ msgstr "E475: Ugyldig værdi for argumentet %s: %s"
++
++ #, c-format
++ msgid "E15: Invalid expression: %s"
++ msgstr "E15: Ugyldigt udtryk: %s"
++
++ msgid "E16: Invalid range"
++ msgstr "E16: Ugyldigt område"
++
++ msgid "E476: Invalid command"
++ msgstr "E476: Ugyldig kommando"
++
++ #, c-format
++ msgid "E17: \"%s\" is a directory"
++ msgstr "E17: \"%s\" er en mappe"
++
++ #, c-format
++ msgid "E364: Library call failed for \"%s()\""
++ msgstr "E364: Kald af bibliotek mislykkedes for \"%s()\""
++
++ msgid "E667: Fsync failed"
++ msgstr "E667: Fsync mislykkedes"
++
++ #, c-format
++ msgid "E448: Could not load library function %s"
++ msgstr "E448: Kunne ikke indlæse biblioteksfunktionen %s"
++
++ msgid "E19: Mark has invalid line number"
++ msgstr "E19: Mærke har ugyldigt linjenummer"
++
++ msgid "E20: Mark not set"
++ msgstr "E20: Mærke ikke sat"
++
++ msgid "E21: Cannot make changes, 'modifiable' is off"
++ msgstr "E21: Kan ikke foretage ændringer, 'modifiable' er slået fra"
++
++ msgid "E22: Scripts nested too deep"
++ msgstr "E22: Scripts indlejret for dybt"
++
++ msgid "E23: No alternate file"
++ msgstr "E23: Ingen alternate-fil"
++
++ msgid "E24: No such abbreviation"
++ msgstr "E24: Ingen sådan forkortelse"
++
++ msgid "E477: No ! allowed"
++ msgstr "E477: Ingen ! tilladt"
++
++ msgid "E25: GUI cannot be used: Not enabled at compile time"
++ msgstr "E25: GUI kan ikke bruges: Ikke aktiveret ved kompileringstid"
++
++ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n"
++ msgstr "E26: Hebraisk kan ikke bruges: Ikke aktiveret ved kompileringstid\n"
++
++ msgid "E27: Farsi cannot be used: Not enabled at compile time\n"
++ msgstr ""
++ "E27: Persisk kan ikke bruges: Ikke aktiveret ved kompileringstid\n"
++ "\n"
++
++ msgid "E800: Arabic cannot be used: Not enabled at compile time\n"
++ msgstr "E800: Arabisk kan ikke bruges: Ikke aktiveret ved kompileringstid\n"
++
++ #, c-format
++ msgid "E28: No such highlight group name: %s"
++ msgstr "E28: Intet sådan fremhævningsgruppenavn: %s"
++
++ msgid "E29: No inserted text yet"
++ msgstr "E29: Endnu ingen indsat tekst"
++
++ msgid "E30: No previous command line"
++ msgstr "E30: Ingen tidligere kommandolinje"
++
++ msgid "E31: No such mapping"
++ msgstr "E31: Ingen sådan mapping"
++
++ msgid "E479: No match"
++ msgstr "E479: Intet match"
++
++ #, c-format
++ msgid "E480: No match: %s"
++ msgstr "E480: Intet match: %s"
++
++ msgid "E32: No file name"
++ msgstr "E32: Intet filnavn"
++
++ msgid "E33: No previous substitute regular expression"
++ msgstr "E33: Ingen tidligere erstatnings regulært udtryk"
++
++ msgid "E34: No previous command"
++ msgstr "E34: Ingen tidligere kommando"
++
++ msgid "E35: No previous regular expression"
++ msgstr "E35: Ingen tidligere regulære udtryk"
++
++ msgid "E481: No range allowed"
++ msgstr "E481: Intet område tilladt"
++
++ msgid "E36: Not enough room"
++ msgstr "E36: Ikke plads nok"
++
++ #, c-format
++ msgid "E247: no registered server named \"%s\""
++ msgstr "E247: ingen registreret server ved navn \"%s\""
++
++ #, c-format
++ msgid "E482: Can't create file %s"
++ msgstr "E482: Kan ikke oprette filen %s"
++
++ msgid "E483: Can't get temp file name"
++ msgstr "E483: Kan ikke hente midlertidigt filnavn"
++
++ #, c-format
++ msgid "E484: Can't open file %s"
++ msgstr "E484: Kan ikke åbne filen %s"
++
++ #, c-format
++ msgid "E485: Can't read file %s"
++ msgstr "E485: Kan ikke læse filen %s"
++
++ msgid "E38: Null argument"
++ msgstr "E38: Null-argument"
++
++ msgid "E39: Number expected"
++ msgstr "E39: Nummer ventet"
++
++ #, c-format
++ msgid "E40: Can't open errorfile %s"
++ msgstr "E40: Kan ikke åbne fejlfilen %s"
++
++ msgid "E233: cannot open display"
++ msgstr "E233: kan ikke åbne display"
++
++ msgid "E41: Out of memory!"
++ msgstr "E41: Ikke mere ledig hukommelse!"
++
++ msgid "Pattern not found"
++ msgstr "Mønster ikke fundet"
++
++ #, c-format
++ msgid "E486: Pattern not found: %s"
++ msgstr "E486: Mønster ikke fundet: %s"
++
++ msgid "E487: Argument must be positive"
++ msgstr "E487: Argument skal være positivt"
++
++ msgid "E459: Cannot go back to previous directory"
++ msgstr "E459: Kan ikke gå tilbage til tidligere mappe"
++
++ msgid "E42: No Errors"
++ msgstr "E42: Ingen fejl"
++
++ msgid "E776: No location list"
++ msgstr "E776: Ingen placeringsliste"
++
++ msgid "E43: Damaged match string"
++ msgstr "E43: Beskadiget matchstreng"
++
++ msgid "E44: Corrupted regexp program"
++ msgstr "E44: Korrupt regexp-program"
++
++ msgid "E45: 'readonly' option is set (add ! to override)"
++ msgstr "E45: 'readonly'-tilvalget er sat (tilføj ! for at tilsidesætte)"
++
++ #, c-format
++ msgid "E46: Cannot change read-only variable \"%s\""
++ msgstr "E46: Kan ikke ændre skrivebeskyttet variabel \"%s\""
++
++ #, c-format
++ msgid "E794: Cannot set variable in the sandbox: \"%s\""
++ msgstr "E794: Kan ikke sætte variabel i sandboksen: \"%s\""
++
++ msgid "E713: Cannot use empty key for Dictionary"
++ msgstr "E713: Kan ikke bruge tom nøgle til ordbog"
++
++ msgid "E715: Dictionary required"
++ msgstr "E715: Ordbog kræves"
++
++ #, c-format
++ msgid "E684: list index out of range: %ld"
++ msgstr "E684: listeindeks udenfor område: %ld"
++
++ #, c-format
++ msgid "E118: Too many arguments for function: %s"
++ msgstr "E118: For mange argumenter til funktion: %s"
++
++ #, c-format
++ msgid "E716: Key not present in Dictionary: %s"
++ msgstr "E716: Nøgle findes ikke i ordbog: %s"
++
++ msgid "E714: List required"
++ msgstr "E714: Liste kræves"
++
++ #, c-format
++ msgid "E712: Argument of %s must be a List or Dictionary"
++ msgstr "E712: Argument af %s skal være en liste eller ordbog"
++
++ msgid "E47: Error while reading errorfile"
++ msgstr "E47: Fejl ved læsning af fejlfil"
++
++ msgid "E48: Not allowed in sandbox"
++ msgstr "E48: Ikke tilladt i sandboks"
++
++ msgid "E523: Not allowed here"
++ msgstr "E523: Ikke tilladt her"
++
++ msgid "E359: Screen mode setting not supported"
++ msgstr "E359: Skærmtilstand-indstilling understøttes ikke"
++
++ msgid "E49: Invalid scroll size"
++ msgstr "E49: Ugyldig rullestørrelse"
++
++ msgid "E91: 'shell' option is empty"
++ msgstr "E91: 'shell'-tilvalget er tomt"
++
++ msgid "E255: Couldn't read in sign data!"
++ msgstr "E255: Kunne ikke læse i sign-data!"
++
++ msgid "E72: Close error on swap file"
++ msgstr "E72: Fejl ved lukning af swap-fil"
++
++ msgid "E73: tag stack empty"
++ msgstr "E73: tag-stak tom"
++
++ msgid "E74: Command too complex"
++ msgstr "E74: Kommando for kompleks"
++
++ msgid "E75: Name too long"
++ msgstr "E75: Navn for langt"
++
++ msgid "E76: Too many ["
++ msgstr "E76: For mange ["
++
++ msgid "E77: Too many file names"
++ msgstr "E77: For mange filnavne"
++
++ msgid "E488: Trailing characters"
++ msgstr "E488: Efterstillede tegn"
++
++ msgid "E78: Unknown mark"
++ msgstr "E78: Ukendt mærke"
++
++ msgid "E79: Cannot expand wildcards"
++ msgstr "E79: Kan ikke udvide jokertegn"
++
++ msgid "E591: 'winheight' cannot be smaller than 'winminheight'"
++ msgstr "E591: 'winheight' må ikke være mindre end 'winminheight'"
++
++ msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'"
++ msgstr "E592: 'winwidth' må ikke være mindre end 'winminwidth'"
++
++ msgid "E80: Error while writing"
++ msgstr "E80: Fejl ved skrivning"
++
++ msgid "E939: Positive count required"
++ msgstr "E939: Positiv tælling kræves"
++
++ msgid "E81: Using <SID> not in a script context"
++ msgstr "E81: Bruger <SID> ikke i et script kontekst"
++
++ msgid "E449: Invalid expression received"
++ msgstr "E449: Ugyldigt udtryk modtaget"
++
++ msgid "E463: Region is guarded, cannot modify"
++ msgstr "E463: Regionen er beskyttet, kan ikke ændre"
++
++ msgid "E744: NetBeans does not allow changes in read-only files"
++ msgstr "E744: NetBeans tillader ikke ændringer i skrivebeskyttede filer"
++
++ msgid "E363: pattern uses more memory than 'maxmempattern'"
++ msgstr "E363: mønster bruger mere hukommelse end 'maxmempattern'"
++
++ msgid "E749: empty buffer"
++ msgstr "E749: tom buffer"
++
++ #, c-format
++ msgid "E86: Buffer %ld does not exist"
++ msgstr "E86: Bufferen %ld findes ikke"
++
++ msgid "E682: Invalid search pattern or delimiter"
++ msgstr "E682: Ugyldigt søgemønster eller -afgrænser"
++
++ msgid "E139: File is loaded in another buffer"
++ msgstr "E139: Filen er indlæst i en anden buffer"
++
++ #, c-format
++ msgid "E764: Option '%s' is not set"
++ msgstr "E764: Tilvalget '%s' er ikke sat"
++
++ msgid "E850: Invalid register name"
++ msgstr "E850: Ugyldigt registernavn"
++
++ #, c-format
++ msgid "E919: Directory not found in '%s': \"%s\""
++ msgstr "E919: Mappe ikke fundet i '%s': \"%s\""
++
++ msgid "E952: Autocommand caused recursive behavior"
++ msgstr "E952: Autokommando forårsagede rekursiv opførsel"
++
++ msgid "search hit TOP, continuing at BOTTOM"
++ msgstr "søgning ramte ØVERST, fortsætter ved NEDERST"
++
++ msgid "search hit BOTTOM, continuing at TOP"
++ msgstr "søgning ramte NEDERST, fortsætter ved ØVERST"
++
++ #, c-format
++ msgid "Need encryption key for \"%s\""
++ msgstr "Behøver krypteringsnøgle til \"%s\""
++
++ msgid "empty keys are not allowed"
++ msgstr "tomme nøgler er ikke tilladt"
++
++ msgid "dictionary is locked"
++ msgstr "ordbog er låst"
++
++ msgid "list is locked"
++ msgstr "liste er låst"
++
++ #, c-format
++ msgid "failed to add key '%s' to dictionary"
++ msgstr "kunne ikke tilføje nøglen '%s' til ordbog"
++
++ #, c-format
++ msgid "index must be int or slice, not %s"
++ msgstr "indeks skal være heltal eller slice, ikke %s"
++
++ #, c-format
++ msgid "expected str() or unicode() instance, but got %s"
++ msgstr "ventede str()- eller unicode()-instans, men fik %s"
++
++ #, c-format
++ msgid "expected bytes() or str() instance, but got %s"
++ msgstr "ventede bytes()- eller str()-instans, min fik %s"
++
++ #, c-format
++ msgid ""
++ "expected int(), long() or something supporting coercing to long(), but got %s"
++ msgstr ""
++ "ventede int(), long() eller noget som understøtter coercing til long(), min "
++ "fik %s"
++
++ #, c-format
++ msgid "expected int() or something supporting coercing to int(), but got %s"
++ msgstr ""
++ "ventede int() eller noget som understøtter coercing til int(), min fik %s"
++
++ msgid "value is too large to fit into C int type"
++ msgstr "værdi er for stor til at passe i C-heltalstype"
++
++ msgid "value is too small to fit into C int type"
++ msgstr "værdi er for lille til at passe i C-heltalstype"
++
++ msgid "number must be greater than zero"
++ msgstr "nummer skal være større end nul"
++
++ msgid "number must be greater or equal to zero"
++ msgstr "nummer skal være større end eller lig med nul"
++
++ msgid "can't delete OutputObject attributes"
++ msgstr "kan ikke slette OutputObject-attributter"
++
++ #, c-format
++ msgid "invalid attribute: %s"
++ msgstr "ugyldig attribut: %s"
++
++ msgid "E264: Python: Error initialising I/O objects"
++ msgstr "E264: Python: Fejl ved initialisering af I/O-objekter"
++
++ msgid "failed to change directory"
++ msgstr "kunne ikke skifte mappe"
++
++ #, c-format
++ msgid "expected 3-tuple as imp.find_module() result, but got %s"
++ msgstr "ventede 3-tuple som imp.find_module() resultat, men fik %s"
++
++ #, c-format
++ msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d"
++ msgstr ""
++ "ventede 3-tuple som imp.find_module() resultat, men fik tuple af størrelse %"
++ "d"
++
++ msgid "internal error: imp.find_module returned tuple with NULL"
++ msgstr "intern fejl: imp.find_module returnerede tuple med NULL"
++
++ msgid "cannot delete vim.Dictionary attributes"
++ msgstr "kan ikke slette vim.Dictionary-attributter"
++
++ msgid "cannot modify fixed dictionary"
++ msgstr "kan ikke ændre fast ordbog"
++
++ #, c-format
++ msgid "cannot set attribute %s"
++ msgstr "kan ikke sætte attributten %s"
++
++ msgid "hashtab changed during iteration"
++ msgstr "hashtab ændret under gennemløb"
++
++ #, c-format
++ msgid "expected sequence element of size 2, but got sequence of size %d"
++ msgstr "ventede sekvenselement af størrelse 2, men fik sekvens af størrelse %d"
++
++ msgid "list constructor does not accept keyword arguments"
++ msgstr "liste-constructor accepterer ikke nøgleord-argumenter"
++
++ msgid "list index out of range"
++ msgstr "listeindeks udenfor område"
++
++ #, c-format
++ msgid "internal error: failed to get vim list item %d"
++ msgstr "intern fejl: kunne ikke hente vim-listepunkt %d"
++
++ msgid "slice step cannot be zero"
++ msgstr "slice-trin må ikke være nul"
++
++ #, c-format
++ msgid "attempt to assign sequence of size greater than %d to extended slice"
++ msgstr "forsøg på at tildele sekvens som er større end %d til udvidet slice"
++
++ #, c-format
++ msgid "internal error: no vim list item %d"
++ msgstr "intern fejl: intet vim-listepunkt %d"
++
++ msgid "internal error: not enough list items"
++ msgstr "intern fejl: ikke nok listepunkter"
++
++ msgid "internal error: failed to add item to list"
++ msgstr "intern fejl: kunne ikke tilføje punkt til liste"
++
++ #, c-format
++ msgid "attempt to assign sequence of size %d to extended slice of size %d"
++ msgstr ""
++ "forsøg på at tildele sekvens af størrelsen %d til udvidet slice af "
++ "størrelsen %d"
++
++ msgid "failed to add item to list"
++ msgstr "kunne ikke tilføje punkt til liste"
++
++ msgid "cannot delete vim.List attributes"
++ msgstr "kan ikke slette vim.List-attributter"
++
++ msgid "cannot modify fixed list"
++ msgstr "kan ikke ændre fast liste"
++
++ #, c-format
++ msgid "unnamed function %s does not exist"
++ msgstr "unavngivet funktion %s findes ikke"
++
++ #, c-format
++ msgid "function %s does not exist"
++ msgstr "funktionen %s findes ikke"
++
++ #, c-format
++ msgid "failed to run function %s"
++ msgstr "kunne ikke køre funktionen %s"
++
++ msgid "unable to get option value"
++ msgstr "kan ikke hente tilvalgsværdi"
++
++ msgid "internal error: unknown option type"
++ msgstr "intern fejl: ukendt tilvalgstype"
++
++ msgid "problem while switching windows"
++ msgstr "problem ved skift af vinduer"
++
++ #, c-format
++ msgid "unable to unset global option %s"
++ msgstr "kan ikke fjerne det globale tilvalg %s"
++
++ #, c-format
++ msgid "unable to unset option %s which does not have global value"
++ msgstr "kan ikke fjerne tilvalget %s som ikke har global værdi"
++
++ msgid "attempt to refer to deleted tab page"
++ msgstr "forsøg på at referere til slettet fanebladsside"
++
++ msgid "no such tab page"
++ msgstr "ingen sådan fanebladsside"
++
++ msgid "attempt to refer to deleted window"
++ msgstr "forsøg på at referere til slettet vindue"
++
++ msgid "readonly attribute: buffer"
++ msgstr "skrivebeskyttet attribut: buffer"
++
++ msgid "cursor position outside buffer"
++ msgstr "markørposition udenfor buffer"
++
++ msgid "no such window"
++ msgstr "intet sådan vindue"
++
++ msgid "attempt to refer to deleted buffer"
++ msgstr "forsøg på at referere til slettet buffer"
++
++ msgid "failed to rename buffer"
++ msgstr "kunne ikke omdøbe bufferen"
++
++ msgid "mark name must be a single character"
++ msgstr "mærkenavn skal være ét tegn"
++
++ #, c-format
++ msgid "expected vim.Buffer object, but got %s"
++ msgstr "ventede vim.Buffer-objekt, men fik %s"
++
++ #, c-format
++ msgid "failed to switch to buffer %d"
++ msgstr "kunne ikke skifte til bufferen %d"
++
++ #, c-format
++ msgid "expected vim.Window object, but got %s"
++ msgstr "ventede vim.Window-objekt, men fik %s"
++
++ msgid "failed to find window in the current tab page"
++ msgstr "kunne ikke finde vindue i den nuværende fanebladsside"
++
++ msgid "did not switch to the specified window"
++ msgstr "skiftede ikke til det angivne vindue"
++
++ #, c-format
++ msgid "expected vim.TabPage object, but got %s"
++ msgstr "ventede vim.TabPage-objekt, men fik %s"
++
++ msgid "did not switch to the specified tab page"
++ msgstr "skiftede ikke til den angivne fanebladsside"
++
++ msgid "failed to run the code"
++ msgstr "kunne ikke køre koden"
++
++ msgid "E858: Eval did not return a valid python object"
++ msgstr "E858: Eval returnerede ikke et gyldigt python-objekt"
++
++ msgid "E859: Failed to convert returned python object to vim value"
++ msgstr "E859: Kunne ikke konvertere returnerede python-objekt til vim-værdi"
++
++ #, c-format
++ msgid "unable to convert %s to vim dictionary"
++ msgstr "kan ikke konvertere %s til vim-ordbog"
++
++ #, c-format
++ msgid "unable to convert %s to vim list"
++ msgstr "kan ikke konvertere %s til vim-liste"
++
++ #, c-format
++ msgid "unable to convert %s to vim structure"
++ msgstr "kan ikke konvertere %s til vim-struktur"
++
++ msgid "internal error: NULL reference passed"
++ msgstr "intern fejl: NULL-reference givet"
++
++ msgid "internal error: invalid value type"
++ msgstr "intern fejl: ugyldig værditype"
++
++ msgid ""
++ "Failed to set path hook: sys.path_hooks is not a list\n"
++ "You should now do the following:\n"
++ "- append vim.path_hook to sys.path_hooks\n"
++ "- append vim.VIM_SPECIAL_PATH to sys.path\n"
++ msgstr ""
++ "Kunne ikke sætte sti-hook: sys.path_hooks er ikke en liste\n"
++ "Du bør nu gøre følgende:\n"
++ "- tilføj vim.path_hook til slutningen af sys.path_hooks\n"
++ "- tilføj vim.VIM_SPECIAL_PATH til slutningen af sys.path\n"
++
++ msgid ""
++ "Failed to set path: sys.path is not a list\n"
++ "You should now append vim.VIM_SPECIAL_PATH to sys.path"
++ msgstr ""
++ "Kunne ikke sætte sti: sys.path er ikke en liste\n"
++ "Du bør nu tilføje vim.VIM_SPECIAL_PATH til slutningen af sys.path"
++
++ msgid ""
++ "Vim macro files (*.vim)\t*.vim\n"
++ "All Files (*.*)\t*.*\n"
++ msgstr ""
++ "Vim-makrofiler (*.vim)\t*.vim\n"
++ "Alle filer (*.*)\t*.*\n"
++
++ msgid "All Files (*.*)\t*.*\n"
++ msgstr "Alle filer (*.*)\t*.*\n"
++
++ msgid ""
++ "All Files (*.*)\t*.*\n"
++ "C source (*.c, *.h)\t*.c;*.h\n"
++ "C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
++ "VB code (*.bas, *.frm)\t*.bas;*.frm\n"
++ "Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
++ msgstr ""
++ "Alle filer (*.*)\t*.*\n"
++ "C-kildekode (*.c, *.h)\t*.c;*.h\n"
++ "C++-kildekode (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
++ "VB-kode (*.bas, *.frm)\t*.bas;*.frm\n"
++ "Vim-filer (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
++
++ msgid ""
++ "Vim macro files (*.vim)\t*.vim\n"
++ "All Files (*)\t*\n"
++ msgstr ""
++ "Vim-makrofiler (*.vim)\t*.vim\n"
++ "Alle filer (*)\t*\n"
++
++ msgid "All Files (*)\t*\n"
++ msgstr "Alle filer (*)\t*\n"
++
++ msgid ""
++ "All Files (*)\t*\n"
++ "C source (*.c, *.h)\t*.c;*.h\n"
++ "C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
++ "Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
++ msgstr ""
++ "Alle filer (*)\t*\n"
++ "C-kildekode (*.c, *.h)\t*.c;*.h\n"
++ "C++-kildekode (*.cpp, *.hpp)\t*.cpp;*.hpp\n"
++ "Vim-filer (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n"
+*** ../vim-8.1.0107/src/version.c 2018-06-24 15:14:02.224061917 +0200
+--- src/version.c 2018-06-24 15:49:32.812878767 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 108,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+100. The most exciting sporting events you noticed during summer 1996
+ was Netscape vs. Microsoft.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0109 b/data/vim/patches/8.1.0109
new file mode 100644
index 000000000..6199bf1ba
--- /dev/null
+++ b/data/vim/patches/8.1.0109
@@ -0,0 +1,45 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0109
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0109
+Problem: New po makefile missing from distribution.
+Solution: Add it to the file list.
+Files: Filelist
+
+
+*** ../vim-8.1.0108/Filelist 2018-04-25 21:35:37.000000000 +0200
+--- Filelist 2018-06-24 15:54:13.943126126 +0200
+***************
+*** 907,912 ****
+--- 907,913 ----
+ src/po/check.vim \
+ src/po/cleanup.vim \
+ src/po/Makefile \
++ src/po/Make_all.mak \
+ src/po/Make_cyg.mak \
+ src/po/Make_ming.mak \
+ src/po/Make_mvc.mak \
+*** ../vim-8.1.0108/src/version.c 2018-06-24 15:52:37.083719389 +0200
+--- src/version.c 2018-06-24 15:55:43.546585056 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 109,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+101. U can read htis w/o ny porblm and cant figur eout Y its evn listd.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0110 b/data/vim/patches/8.1.0110
new file mode 100644
index 000000000..5d074f91d
--- /dev/null
+++ b/data/vim/patches/8.1.0110
@@ -0,0 +1,84 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0110
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0110
+Problem: File name not displayed with ":file" when 'F' is in 'shortmess'.
+Solution: Always display the file name when there is no argument (Christian
+ Brabandt, closes #3070)
+Files: src/ex_cmds.c, src/testdir/test_options.vim
+
+
+*** ../vim-8.1.0109/src/ex_cmds.c 2018-06-23 19:22:45.606486311 +0200
+--- src/ex_cmds.c 2018-06-24 16:53:22.557962803 +0200
+***************
+*** 3094,3104 ****
+ {
+ if (rename_buffer(eap->arg) == FAIL)
+ return;
+ }
+! /* print full file name if :cd used */
+! if (!shortmess(SHM_FILEINFO))
+ fileinfo(FALSE, FALSE, eap->forceit);
+- redraw_tabline = TRUE;
+ }
+
+ /*
+--- 3094,3105 ----
+ {
+ if (rename_buffer(eap->arg) == FAIL)
+ return;
++ redraw_tabline = TRUE;
+ }
+!
+! // print file name if no argument or 'F' is not in 'shortmess'
+! if (*eap->arg == NUL || !shortmess(SHM_FILEINFO))
+ fileinfo(FALSE, FALSE, eap->forceit);
+ }
+
+ /*
+*** ../vim-8.1.0109/src/testdir/test_options.vim 2018-05-13 17:56:20.000000000 +0200
+--- src/testdir/test_options.vim 2018-06-24 16:36:00.704103065 +0200
+***************
+*** 400,402 ****
+--- 400,416 ----
+ call assert_equal(4,&numberwidth)
+ bw!
+ endfunc
++
++ func Test_shortmess_F()
++ new
++ call assert_match('\[No Name\]', execute('file'))
++ set shortmess+=F
++ call assert_match('\[No Name\]', execute('file'))
++ call assert_match('^\s*$', execute('file foo'))
++ call assert_match('foo', execute('file'))
++ set shortmess-=F
++ call assert_match('bar', execute('file bar'))
++ call assert_match('bar', execute('file'))
++ set shortmess&
++ bwipe
++ endfunc
+*** ../vim-8.1.0109/src/version.c 2018-06-24 15:56:20.602363176 +0200
+--- src/version.c 2018-06-24 16:32:41.109320897 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 110,
+ /**/
+
+
+--
+To be rich is not the end, but only a change of worries.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0111 b/data/vim/patches/8.1.0111
new file mode 100644
index 000000000..c8efeab6b
--- /dev/null
+++ b/data/vim/patches/8.1.0111
@@ -0,0 +1,149 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0111
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0111
+Problem: .po files do not use recommended names.
+Solution: Give a warning if the recommended name is not used. Accept the
+ recommended name for conversion. (Christian Brabandt, Ken Takata)
+Files: src/po/Makefile, src/po/sjiscorr.c, src/po/check.vim
+
+
+*** ../vim-8.1.0110/src/po/Makefile 2018-06-24 15:52:37.075719437 +0200
+--- src/po/Makefile 2018-06-24 17:58:04.858324254 +0200
+***************
+*** 87,93 ****
+
+ ja.euc-jp.po: ja.po
+ iconv -f utf-8 -t euc-jp ja.po | \
+! sed -e 's/charset=utf-8/charset=euc-jp/' -e 's/# Original translations/# Generated from ja.po, DO NOT EDIT/' > ja.euc-jp.po
+
+ # Convert cs.po to create cs.cp1250.po.
+ cs.cp1250.po: cs.po
+--- 87,93 ----
+
+ ja.euc-jp.po: ja.po
+ iconv -f utf-8 -t euc-jp ja.po | \
+! sed -e 's/charset=[uU][tT][fF]-8/charset=euc-jp/' -e 's/# Original translations/# Generated from ja.po, DO NOT EDIT/' > ja.euc-jp.po
+
+ # Convert cs.po to create cs.cp1250.po.
+ cs.cp1250.po: cs.po
+***************
+*** 105,111 ****
+ pl.UTF-8.po: pl.po
+ rm -f pl.UTF-8.po
+ iconv -f iso-8859-2 -t utf-8 pl.po | \
+! sed -e 's/charset=ISO-8859-2/charset=utf-8/' -e 's/# Original translations/# Generated from pl.po, DO NOT EDIT/' > pl.UTF-8.po
+
+ # Convert sk.po to create sk.cp1250.po.
+ sk.cp1250.po: sk.po
+--- 105,111 ----
+ pl.UTF-8.po: pl.po
+ rm -f pl.UTF-8.po
+ iconv -f iso-8859-2 -t utf-8 pl.po | \
+! sed -e 's/charset=ISO-8859-2/charset=UTF-8/' -e 's/# Original translations/# Generated from pl.po, DO NOT EDIT/' > pl.UTF-8.po
+
+ # Convert sk.po to create sk.cp1250.po.
+ sk.cp1250.po: sk.po
+***************
+*** 119,125 ****
+ zh_CN.cp936.po: zh_CN.UTF-8.po
+ rm -f zh_CN.cp936.po
+ iconv -f UTF-8 -t cp936 zh_CN.UTF-8.po | \
+! sed -e 's/charset=utf-8/charset=gbk/' -e 's/# Original translations/# Generated from zh_CN.UTF-8.po, DO NOT EDIT/' > zh_CN.cp936.po
+
+ # Convert ko.UTF-8.po to create ko.po.
+ ko.po: ko.UTF-8.po
+--- 119,125 ----
+ zh_CN.cp936.po: zh_CN.UTF-8.po
+ rm -f zh_CN.cp936.po
+ iconv -f UTF-8 -t cp936 zh_CN.UTF-8.po | \
+! sed -e 's/charset=[uU][tT][fF]-8/charset=gbk/' -e 's/# Original translations/# Generated from zh_CN.UTF-8.po, DO NOT EDIT/' > zh_CN.cp936.po
+
+ # Convert ko.UTF-8.po to create ko.po.
+ ko.po: ko.UTF-8.po
+*** ../vim-8.1.0110/src/po/sjiscorr.c 2016-01-31 17:13:47.000000000 +0100
+--- src/po/sjiscorr.c 2018-06-24 17:58:04.858324254 +0200
+***************
+*** 16,22 ****
+ {
+ for (p = buffer; *p != 0; p++)
+ {
+! if (strncmp(p, "charset=utf-8", 13) == 0)
+ {
+ fputs("charset=cp932", stdout);
+ p += 12;
+--- 16,23 ----
+ {
+ for (p = buffer; *p != 0; p++)
+ {
+! if (strncmp(p, "charset=utf-8", 13) == 0
+! || strncmp(p, "charset=UTF-8", 13) == 0)
+ {
+ fputs("charset=cp932", stdout);
+ p += 12;
+*** ../vim-8.1.0110/src/po/check.vim 2018-05-08 16:05:44.000000000 +0200
+--- src/po/check.vim 2018-06-24 17:57:34.634490594 +0200
+***************
+*** 173,184 ****
+--- 173,209 ----
+ " We allow for a stray plural header, msginit adds one.
+ endif
+
++ " Check that 8bit encoding is used instead of 8-bit
++ let cte = search('^"Content-Transfer-Encoding:\s\+8-bit', 'n')
++ let ctc = search('^"Content-Type:.*;\s\+\<charset=[iI][sS][oO]_', 'n')
++ let ctu = search('^"Content-Type:.*;\s\+\<charset=utf-8', 'n')
++ if cte
++ echomsg "Content-Transfer-Encoding should be 8bit instead of 8-bit"
++ " TODO: make this an error
++ " if error == 0
++ " let error = cte
++ " endif
++ elseif ctc
++ echomsg "Content-Type charset should be 'ISO-...' instead of 'ISO_...'"
++ " TODO: make this an error
++ " if error == 0
++ " let error = ct
++ " endif
++ elseif ctu
++ echomsg "Content-Type charset should be 'UTF-8' instead of 'utf-8'"
++ " TODO: make this an error
++ " if error == 0
++ " let error = ct
++ " endif
++ endif
++
+
+ if error == 0
+ " If all was OK restore the view.
+ call winrestview(wsv)
+ echomsg "OK"
+ else
++ " Put the cursor on the line with the error.
+ exe error
+ endif
+
+*** ../vim-8.1.0110/src/version.c 2018-06-24 16:53:31.649909925 +0200
+--- src/version.c 2018-06-24 18:04:11.412305463 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 111,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+104. When people ask about the Presidential Election you ask "Which country?"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0112 b/data/vim/patches/8.1.0112
new file mode 100644
index 000000000..e55f3a260
--- /dev/null
+++ b/data/vim/patches/8.1.0112
@@ -0,0 +1,139 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0112
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0112
+Problem: No error when using bad arguments with searchpair().
+Solution: Add error messages.
+Files: src/evalfunc.c, src/testdir/test_search.vim
+
+
+*** ../vim-8.1.0111/src/evalfunc.c 2018-06-23 19:22:45.602486336 +0200
+--- src/evalfunc.c 2018-06-24 18:42:08.826927103 +0200
+***************
+*** 10152,10158 ****
+ long lnum_stop = 0;
+ long time_limit = 0;
+
+! /* Get the three pattern arguments: start, middle, end. */
+ spat = get_tv_string_chk(&argvars[0]);
+ mpat = get_tv_string_buf_chk(&argvars[1], nbuf1);
+ epat = get_tv_string_buf_chk(&argvars[2], nbuf2);
+--- 10152,10159 ----
+ long lnum_stop = 0;
+ long time_limit = 0;
+
+! /* Get the three pattern arguments: start, middle, end. Will result in an
+! * error if not a valid argument. */
+ spat = get_tv_string_chk(&argvars[0]);
+ mpat = get_tv_string_buf_chk(&argvars[1], nbuf1);
+ epat = get_tv_string_buf_chk(&argvars[2], nbuf2);
+***************
+*** 10189,10207 ****
+--- 10190,10215 ----
+ && skip->v_type != VAR_STRING)
+ {
+ /* Type error */
++ EMSG2(_(e_invarg2), get_tv_string(&argvars[4]));
+ goto theend;
+ }
+ if (argvars[5].v_type != VAR_UNKNOWN)
+ {
+ lnum_stop = (long)get_tv_number_chk(&argvars[5], NULL);
+ if (lnum_stop < 0)
++ {
++ EMSG2(_(e_invarg2), get_tv_string(&argvars[5]));
+ goto theend;
++ }
+ #ifdef FEAT_RELTIME
+ if (argvars[6].v_type != VAR_UNKNOWN)
+ {
+ time_limit = (long)get_tv_number_chk(&argvars[6], NULL);
+ if (time_limit < 0)
++ {
++ EMSG2(_(e_invarg2), get_tv_string(&argvars[6]));
+ goto theend;
++ }
+ }
+ #endif
+ }
+*** ../vim-8.1.0111/src/testdir/test_search.vim 2018-04-30 13:22:53.000000000 +0200
+--- src/testdir/test_search.vim 2018-06-24 18:48:30.844524919 +0200
+***************
+*** 287,302 ****
+ new
+ call setline(1, ['other code here', '', '[', '" cursor here', ']'])
+ 4
+! let a=searchpair('\[','',']','bW')
+ call assert_equal(3, a)
+ set nomagic
+ 4
+! let a=searchpair('\[','',']','bW')
+ call assert_equal(3, a)
+ set magic
+ q!
+ endfunc
+
+ func Test_searchpair_skip()
+ func Zero()
+ return 0
+--- 287,312 ----
+ new
+ call setline(1, ['other code here', '', '[', '" cursor here', ']'])
+ 4
+! let a = searchpair('\[','',']','bW')
+ call assert_equal(3, a)
+ set nomagic
+ 4
+! let a = searchpair('\[','',']','bW')
+ call assert_equal(3, a)
+ set magic
+ q!
+ endfunc
+
++ func Test_searchpair_errors()
++ call assert_fails("call searchpair([0], 'middle', 'end', 'bW', 'skip', 99, 100)", 'E730: using List as a String')
++ call assert_fails("call searchpair('start', {-> 0}, 'end', 'bW', 'skip', 99, 100)", 'E729: using Funcref as a String')
++ call assert_fails("call searchpair('start', 'middle', {'one': 1}, 'bW', 'skip', 99, 100)", 'E731: using Dictionary as a String')
++ call assert_fails("call searchpair('start', 'middle', 'end', 'flags', 'skip', 99, 100)", 'E475: Invalid argument: flags')
++ call assert_fails("call searchpair('start', 'middle', 'end', 'bW', 0, 99, 100)", 'E475: Invalid argument: 0')
++ call assert_fails("call searchpair('start', 'middle', 'end', 'bW', 'func', -99, 100)", 'E475: Invalid argument: -99')
++ call assert_fails("call searchpair('start', 'middle', 'end', 'bW', 'func', 99, -100)", 'E475: Invalid argument: -100')
++ endfunc
++
+ func Test_searchpair_skip()
+ func Zero()
+ return 0
+***************
+*** 311,318 ****
+ 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', {-> 0}))
+ 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', function('Zero')))
+ 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', function('Partial', [0])))
+- " invalid argument
+- 3 | call assert_equal(0, searchpair('{', '', '}', 'bWn', 0))
+ bw!
+ endfunc
+
+--- 321,326 ----
+*** ../vim-8.1.0111/src/version.c 2018-06-24 18:04:45.440091103 +0200
+--- src/version.c 2018-06-24 18:10:31.957980576 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 112,
+ /**/
+
+--
+Laughing helps. It's like jogging on the inside.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0113 b/data/vim/patches/8.1.0113
new file mode 100644
index 000000000..b1f9bfca7
--- /dev/null
+++ b/data/vim/patches/8.1.0113
@@ -0,0 +1,53 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0113
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0113
+Problem: Compiler warning for unused variable. (Yegappan Lakshmanan)
+Solution: Add UNUSED. (Christian Brabandt)
+Files: src/screen.c
+
+
+*** ../vim-8.1.0112/src/screen.c 2018-06-23 19:22:45.614486258 +0200
+--- src/screen.c 2018-06-24 19:20:57.281940880 +0200
+***************
+*** 6874,6880 ****
+ * displayed.
+ */
+ static void
+! win_redr_status(win_T *wp, int ignore_pum)
+ {
+ int row;
+ char_u *p;
+--- 6879,6885 ----
+ * displayed.
+ */
+ static void
+! win_redr_status(win_T *wp, int ignore_pum UNUSED)
+ {
+ int row;
+ char_u *p;
+*** ../vim-8.1.0112/src/version.c 2018-06-24 19:01:55.411752372 +0200
+--- src/version.c 2018-06-24 19:22:02.657626019 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 113,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+108. While reading a magazine, you look for the Zoom icon for a better
+ look at a photograph.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0114 b/data/vim/patches/8.1.0114
new file mode 100644
index 000000000..d6f78f5ac
--- /dev/null
+++ b/data/vim/patches/8.1.0114
@@ -0,0 +1,218 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0114
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0114
+Problem: Confusing variable name.
+Solution: Rename new_ts to new_vts_array. Change zero to NULL.
+Files: src/ex_cmds.c, src/option.c
+
+
+*** ../vim-8.1.0113/src/ex_cmds.c 2018-06-24 16:53:31.649909925 +0200
+--- src/ex_cmds.c 2018-06-24 22:04:12.929793169 +0200
+***************
+*** 678,684 ****
+ char_u *new_line = (char_u *)1; /* init to non-NULL */
+ int did_undo; /* called u_save for current line */
+ #ifdef FEAT_VARTABS
+! int *new_ts = 0;
+ char_u *new_ts_str; /* string value of tab argument */
+ #else
+ int temp;
+--- 678,684 ----
+ char_u *new_line = (char_u *)1; /* init to non-NULL */
+ int did_undo; /* called u_save for current line */
+ #ifdef FEAT_VARTABS
+! int *new_vts_array = NULL;
+ char_u *new_ts_str; /* string value of tab argument */
+ #else
+ int temp;
+***************
+*** 693,708 ****
+
+ #ifdef FEAT_VARTABS
+ new_ts_str = eap->arg;
+! if (!tabstop_set(eap->arg, &new_ts))
+ return;
+ while (vim_isdigit(*(eap->arg)) || *(eap->arg) == ',')
+ ++(eap->arg);
+
+! // This ensures that either new_ts and new_ts_str are freshly allocated,
+! // or new_ts points to an existing array and new_ts_str is null.
+! if (new_ts == 0)
+ {
+! new_ts = curbuf->b_p_vts_array;
+ new_ts_str = NULL;
+ }
+ else
+--- 693,709 ----
+
+ #ifdef FEAT_VARTABS
+ new_ts_str = eap->arg;
+! if (!tabstop_set(eap->arg, &new_vts_array))
+ return;
+ while (vim_isdigit(*(eap->arg)) || *(eap->arg) == ',')
+ ++(eap->arg);
+
+! // This ensures that either new_vts_array and new_ts_str are freshly
+! // allocated, or new_vts_array points to an existing array and new_ts_str
+! // is null.
+! if (new_vts_array == NULL)
+ {
+! new_vts_array = curbuf->b_p_vts_array;
+ new_ts_str = NULL;
+ }
+ else
+***************
+*** 753,761 ****
+ int t, s;
+
+ tabstop_fromto(start_vcol, vcol,
+! tabstop_count(new_ts)? 0: curbuf->b_p_ts,
+! new_ts,
+! &t, &s);
+ num_tabs = t;
+ num_spaces = s;
+ #else
+--- 754,760 ----
+ int t, s;
+
+ tabstop_fromto(start_vcol, vcol,
+! curbuf->b_p_ts, new_vts_array, &t, &s);
+ num_tabs = t;
+ num_spaces = s;
+ #else
+***************
+*** 829,839 ****
+ // If a single value was given then it can be considered equal to
+ // either the value of 'tabstop' or the value of 'vartabstop'.
+ if (tabstop_count(curbuf->b_p_vts_array) == 0
+! && tabstop_count(new_ts) == 1
+! && curbuf->b_p_ts == tabstop_first(new_ts))
+ ; /* not changed */
+ else if (tabstop_count(curbuf->b_p_vts_array) > 0
+! && tabstop_eq(curbuf->b_p_vts_array, new_ts))
+ ; /* not changed */
+ else
+ redraw_curbuf_later(NOT_VALID);
+--- 828,838 ----
+ // If a single value was given then it can be considered equal to
+ // either the value of 'tabstop' or the value of 'vartabstop'.
+ if (tabstop_count(curbuf->b_p_vts_array) == 0
+! && tabstop_count(new_vts_array) == 1
+! && curbuf->b_p_ts == tabstop_first(new_vts_array))
+ ; /* not changed */
+ else if (tabstop_count(curbuf->b_p_vts_array) > 0
+! && tabstop_eq(curbuf->b_p_vts_array, new_vts_array))
+ ; /* not changed */
+ else
+ redraw_curbuf_later(NOT_VALID);
+***************
+*** 853,872 ****
+ // than one tabstop then update 'vartabstop'.
+ int *old_vts_ary = curbuf->b_p_vts_array;
+
+! if (tabstop_count(old_vts_ary) > 0 || tabstop_count(new_ts) > 1)
+ {
+ set_string_option_direct((char_u *)"vts", -1, new_ts_str,
+ OPT_FREE|OPT_LOCAL, 0);
+ vim_free(new_ts_str);
+! curbuf->b_p_vts_array = new_ts;
+ vim_free(old_vts_ary);
+ }
+ else
+ {
+ // 'vartabstop' wasn't in use and a single value was given to
+ // retab then update 'tabstop'.
+! curbuf->b_p_ts = tabstop_first(new_ts);
+! vim_free(new_ts);
+ }
+ }
+ #else
+--- 852,871 ----
+ // than one tabstop then update 'vartabstop'.
+ int *old_vts_ary = curbuf->b_p_vts_array;
+
+! if (tabstop_count(old_vts_ary) > 0 || tabstop_count(new_vts_array) > 1)
+ {
+ set_string_option_direct((char_u *)"vts", -1, new_ts_str,
+ OPT_FREE|OPT_LOCAL, 0);
+ vim_free(new_ts_str);
+! curbuf->b_p_vts_array = new_vts_array;
+ vim_free(old_vts_ary);
+ }
+ else
+ {
+ // 'vartabstop' wasn't in use and a single value was given to
+ // retab then update 'tabstop'.
+! curbuf->b_p_ts = tabstop_first(new_vts_array);
+! vim_free(new_vts_array);
+ }
+ }
+ #else
+*** ../vim-8.1.0113/src/option.c 2018-06-24 15:14:02.224061917 +0200
+--- src/option.c 2018-06-24 22:03:45.413912296 +0200
+***************
+*** 12844,12850 ****
+ int t;
+ int excess;
+
+! if (vts == 0 || vts[0] == 0)
+ return (col / ts) * ts;
+
+ tabcount = vts[0];
+--- 12844,12850 ----
+ int t;
+ int excess;
+
+! if (vts == NULL || vts[0] == 0)
+ return (col / ts) * ts;
+
+ tabcount = vts[0];
+***************
+*** 12878,12887 ****
+ int tabcount;
+ int t;
+
+! if (vts == 0 || vts[0] == 0)
+ {
+ int tabs = 0;
+ int initspc = ts - (start_col % ts);
+ if (spaces >= initspc)
+ {
+ spaces -= initspc;
+--- 12878,12888 ----
+ int tabcount;
+ int t;
+
+! if (vts == NULL || vts[0] == 0)
+ {
+ int tabs = 0;
+ int initspc = ts - (start_col % ts);
++
+ if (spaces >= initspc)
+ {
+ spaces -= initspc;
+*** ../vim-8.1.0113/src/version.c 2018-06-24 19:23:59.989047923 +0200
+--- src/version.c 2018-06-24 22:05:27.937462580 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 114,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+109. You actually read -- and enjoy -- lists like this.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0115 b/data/vim/patches/8.1.0115
new file mode 100644
index 000000000..046669e75
--- /dev/null
+++ b/data/vim/patches/8.1.0115
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0115
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0115
+Problem: The matchparen plugin may throw an error.
+Solution: Change the skip argument from zero to "0".
+Files: runtime/plugin/matchparen.vim
+
+
+*** ../vim-8.1.0114/runtime/plugin/matchparen.vim 2017-09-30 14:51:57.000000000 +0200
+--- runtime/plugin/matchparen.vim 2018-06-25 00:01:59.103022741 +0200
+***************
+*** 114,120 ****
+ " within those syntax types (i.e., not skip). Otherwise, the cursor is
+ " outside of the syntax types and s_skip should keep its value so we skip any
+ " matching pair inside the syntax types.
+! execute 'if' s_skip '| let s_skip = 0 | endif'
+
+ " Limit the search to lines visible in the window.
+ let stoplinebottom = line('w$')
+--- 114,120 ----
+ " within those syntax types (i.e., not skip). Otherwise, the cursor is
+ " outside of the syntax types and s_skip should keep its value so we skip any
+ " matching pair inside the syntax types.
+! execute 'if' s_skip '| let s_skip = "0" | endif'
+
+ " Limit the search to lines visible in the window.
+ let stoplinebottom = line('w$')
+*** ../vim-8.1.0114/src/version.c 2018-06-24 23:53:25.153526495 +0200
+--- src/version.c 2018-06-25 00:03:27.870567571 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 115,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+110. You actually volunteer to become your employer's webmaster.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0116 b/data/vim/patches/8.1.0116
new file mode 100644
index 000000000..c1fdabebf
--- /dev/null
+++ b/data/vim/patches/8.1.0116
@@ -0,0 +1,95 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0116
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0116
+Problem: Display problem with 'vartabstop' and 'linebreak'. (Chauca
+ Fuentes)
+Solution: Call tabstop_padding(). (Christian Brabandt, closes #3076)
+Files: src/screen.c, src/testdir/test_vartabs.vim
+
+
+*** ../vim-8.1.0115/src/screen.c 2018-06-24 19:23:59.989047923 +0200
+--- src/screen.c 2018-06-25 21:21:42.002042548 +0200
+***************
+*** 4753,4760 ****
+--- 4753,4765 ----
+ n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol,
+ NULL) - 1;
+ if (c == TAB && n_extra + col > wp->w_width)
++ #ifdef FEAT_VARTABS
++ n_extra = tabstop_padding(vcol, wp->w_buffer->b_p_ts,
++ wp->w_buffer->b_p_vts_array) - 1;
++ #else
+ n_extra = (int)wp->w_buffer->b_p_ts
+ - vcol % (int)wp->w_buffer->b_p_ts - 1;
++ #endif
+
+ # ifdef FEAT_MBYTE
+ c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' ';
+*** ../vim-8.1.0115/src/testdir/test_vartabs.vim 2018-06-23 19:22:45.618486231 +0200
+--- src/testdir/test_vartabs.vim 2018-06-25 21:22:50.237671137 +0200
+***************
+*** 4,9 ****
+--- 4,14 ----
+ finish
+ endif
+
++ source view_util.vim
++ function! s:compare_lines(expect, actual)
++ call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
++ endfunction
++
+ func! Test_vartabs()
+ new
+ %d
+***************
+*** 255,257 ****
+--- 260,282 ----
+
+ bwipeout!
+ endfunc
++
++ func! Test_vartabs_linebreak()
++ if winwidth(0) < 80
++ return
++ endif
++ new
++ 70vnew
++ %d
++ setl linebreak vartabstop=10,15,20,40
++ call setline(1, "\tx\tx\tx\tx")
++
++ let lines = ScreenLines([1, 2], winwidth(0))
++ let expect = [' x x x ',
++ \ ' x ']
++ call s:compare_lines(expect, lines)
++
++ " cleanup
++ bw!
++ bw!
++ endfunc
+*** ../vim-8.1.0115/src/version.c 2018-06-25 00:05:55.901799630 +0200
+--- src/version.c 2018-06-25 21:24:22.389089360 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 116,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+115. You are late picking up your kid from school and try to explain
+ to the teacher you were stuck in Web traffic.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0117 b/data/vim/patches/8.1.0117
new file mode 100644
index 000000000..f102405a0
--- /dev/null
+++ b/data/vim/patches/8.1.0117
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0117
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0117
+Problem: URL in install program still points to SourceForge.
+Solution: Change it to www.vim.org. (closes #3100)
+Files: src/dosinst.c
+
+
+*** ../vim-8.1.0116/src/dosinst.c 2018-05-11 19:52:42.000000000 +0200
+--- src/dosinst.c 2018-06-26 23:09:12.956537417 +0200
+***************
+*** 1878,1884 ****
+ add_pathsep(shell_folder_path);
+ strcat(shell_folder_path, "Vim Online.url");
+ if (!WritePrivateProfileString("InternetShortcut", "URL",
+! "http://vim.sf.net/", shell_folder_path))
+ {
+ printf("Creating the Vim online URL failed\n");
+ return;
+--- 1878,1884 ----
+ add_pathsep(shell_folder_path);
+ strcat(shell_folder_path, "Vim Online.url");
+ if (!WritePrivateProfileString("InternetShortcut", "URL",
+! "https://www.vim.org/", shell_folder_path))
+ {
+ printf("Creating the Vim online URL failed\n");
+ return;
+*** ../vim-8.1.0116/src/version.c 2018-06-25 21:24:47.288934354 +0200
+--- src/version.c 2018-06-26 23:09:53.416289165 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 117,
+ /**/
+
+--
+An actual excerpt from a classified section of a city newspaper:
+"Illiterate? Write today for free help!"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0118 b/data/vim/patches/8.1.0118
new file mode 100644
index 000000000..afcdf937e
--- /dev/null
+++ b/data/vim/patches/8.1.0118
@@ -0,0 +1,136 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0118
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0118
+Problem: Duplicate error message for put command.
+Solution: Check return value of u_save(). (Jason Franklin)
+Files: src/ops.c, src/testdir/test_messages.vim src/testdir/test_put.vim
+
+
+*** ../vim-8.1.0117/src/ops.c 2018-06-23 19:22:45.610486284 +0200
+--- src/ops.c 2018-06-27 20:35:21.160021864 +0200
+***************
+*** 3551,3559 ****
+ return;
+ }
+
+! /* Autocommands may be executed when saving lines for undo, which may make
+! * y_array invalid. Start undo now to avoid that. */
+! u_save(curwin->w_cursor.lnum, curwin->w_cursor.lnum + 1);
+
+ if (insert_string != NULL)
+ {
+--- 3551,3560 ----
+ return;
+ }
+
+! /* Autocommands may be executed when saving lines for undo. This might
+! * make "y_array" invalid, so we start undo now to avoid that. */
+! if (u_save(curwin->w_cursor.lnum, curwin->w_cursor.lnum + 1) == FAIL)
+! goto end;
+
+ if (insert_string != NULL)
+ {
+*** ../vim-8.1.0117/src/testdir/test_messages.vim 2018-05-19 14:43:26.779509715 +0200
+--- src/testdir/test_messages.vim 2018-06-27 20:35:21.160021864 +0200
+***************
+*** 39,45 ****
+ endtry
+ endfunction
+
+! " Patch 7.4.1696 defined the "clearmode()" command for clearing the mode
+ " indicator (e.g., "-- INSERT --") when ":stopinsert" is invoked. Message
+ " output could then be disturbed when 'cmdheight' was greater than one.
+ " This test ensures that the bugfix for this issue remains in place.
+--- 39,45 ----
+ endtry
+ endfunction
+
+! " Patch 7.4.1696 defined the "clearmode()" function for clearing the mode
+ " indicator (e.g., "-- INSERT --") when ":stopinsert" is invoked. Message
+ " output could then be disturbed when 'cmdheight' was greater than one.
+ " This test ensures that the bugfix for this issue remains in place.
+*** ../vim-8.1.0117/src/testdir/test_put.vim 2018-05-23 21:53:48.352478970 +0200
+--- src/testdir/test_put.vim 2018-06-27 20:48:28.788199160 +0200
+***************
+*** 1,3 ****
+--- 1,4 ----
++ " Tests for put commands, e.g. ":put", "p", "gp", "P", "gP", etc.
+
+ func Test_put_block()
+ if !has('multi_byte')
+***************
+*** 58,60 ****
+--- 59,106 ----
+ call assert_equal(['A1','A2','A3','4A','5A','6A'], getline(1,'$'))
+ bw!
+ endfunc
++
++ func Test_put_fails_when_nomodifiable()
++ new
++ set nomodifiable
++
++ normal! yy
++ call assert_fails(':put', 'E21')
++ call assert_fails(':put!', 'E21')
++ call assert_fails(':normal! p', 'E21')
++ call assert_fails(':normal! gp', 'E21')
++ call assert_fails(':normal! P', 'E21')
++ call assert_fails(':normal! gP', 'E21')
++
++ if has('mouse')
++ set mouse=n
++ call assert_fails('execute "normal! \<MiddleMouse>"', 'E21')
++ set mouse&
++ endif
++
++ bwipeout!
++ endfunc
++
++ " A bug was discovered where the Normal mode put commands (e.g., "p") would
++ " output duplicate error messages when invoked in a non-modifiable buffer.
++ func Test_put_p_errmsg_nodup()
++ new
++ set nomodifiable
++
++ normal! yy
++
++ func Capture_p_error()
++ redir => s:p_err
++ normal! p
++ redir END
++ endfunc
++
++ silent! call Capture_p_error()
++
++ " Error message output within a function should be three lines (the function
++ " name, the line number, and the error message).
++ call assert_equal(3, count(s:p_err, "\n"))
++
++ delfunction Capture_p_error
++ bwipeout!
++ endfunc
+*** ../vim-8.1.0117/src/version.c 2018-06-26 23:18:40.593167147 +0200
+--- src/version.c 2018-06-27 20:36:32.259661095 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 118,
+ /**/
+
+--
+Would you care for a drink? I mean, if it were, like,
+disabled and you had to look after it?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0119 b/data/vim/patches/8.1.0119
new file mode 100644
index 000000000..902f0bf7d
--- /dev/null
+++ b/data/vim/patches/8.1.0119
@@ -0,0 +1,71 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0119
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0119
+Problem: Failing test goes unnoticed because testdir/messages is not
+ written.
+Solution: Set 'nomodifiable' only local to the buffer.
+Files: src/testdir/test_put.vim
+
+
+*** ../vim-8.1.0118/src/testdir/test_put.vim 2018-06-27 20:49:40.571862365 +0200
+--- src/testdir/test_put.vim 2018-06-27 22:21:37.122498815 +0200
+***************
+*** 62,68 ****
+
+ func Test_put_fails_when_nomodifiable()
+ new
+! set nomodifiable
+
+ normal! yy
+ call assert_fails(':put', 'E21')
+--- 62,68 ----
+
+ func Test_put_fails_when_nomodifiable()
+ new
+! setlocal nomodifiable
+
+ normal! yy
+ call assert_fails(':put', 'E21')
+***************
+*** 85,91 ****
+ " output duplicate error messages when invoked in a non-modifiable buffer.
+ func Test_put_p_errmsg_nodup()
+ new
+! set nomodifiable
+
+ normal! yy
+
+--- 85,91 ----
+ " output duplicate error messages when invoked in a non-modifiable buffer.
+ func Test_put_p_errmsg_nodup()
+ new
+! setlocal nomodifiable
+
+ normal! yy
+
+*** ../vim-8.1.0118/src/version.c 2018-06-27 20:49:40.571862365 +0200
+--- src/version.c 2018-06-27 23:11:22.293187958 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 119,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+125. You begin to wonder how often it REALLY is necessary to get up
+ and shower or bathe.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0120 b/data/vim/patches/8.1.0120
new file mode 100644
index 000000000..d16fae336
--- /dev/null
+++ b/data/vim/patches/8.1.0120
@@ -0,0 +1,217 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0120
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0120
+Problem: Buffer 'modified' set even when :sort has no changes.
+Solution: Only set 'modified' when lines are moved. (Jason Franklin)
+Files: src/ex_cmds.c, src/testdir/test_sort.vim
+
+
+*** ../vim-8.1.0119/src/ex_cmds.c 2018-06-24 23:53:25.149526513 +0200
+--- src/ex_cmds.c 2018-06-28 11:22:44.383108832 +0200
+***************
+*** 398,403 ****
+--- 398,404 ----
+ colnr_T end_col;
+ int sort_what = 0;
+ int format_found = 0;
++ int change_occurred = FALSE; // Buffer contents changed.
+
+ /* Sorting one line is really quick! */
+ if (count <= 1)
+***************
+*** 616,627 ****
+ lnum = eap->line2;
+ for (i = 0; i < count; ++i)
+ {
+! s = ml_get(nrs[eap->forceit ? count - i - 1 : i].lnum);
+ if (!unique || i == 0
+ || (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0)
+ {
+! /* Copy the line into a buffer, it may become invalid in
+! * ml_append(). And it's needed for "unique". */
+ STRCPY(sortbuf1, s);
+ if (ml_append(lnum++, sortbuf1, (colnr_T)0, FALSE) == FAIL)
+ break;
+--- 617,635 ----
+ lnum = eap->line2;
+ for (i = 0; i < count; ++i)
+ {
+! linenr_T get_lnum = nrs[eap->forceit ? count - i - 1 : i].lnum;
+!
+! // If the original line number of the line being placed is not the same
+! // as "lnum" (accounting for offset), we know that the buffer changed.
+! if (get_lnum + ((linenr_T)count - 1) != lnum)
+! change_occurred = TRUE;
+!
+! s = ml_get(get_lnum);
+ if (!unique || i == 0
+ || (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0)
+ {
+! // Copy the line into a buffer, it may become invalid in
+! // ml_append(). And it's needed for "unique".
+ STRCPY(sortbuf1, s);
+ if (ml_append(lnum++, sortbuf1, (colnr_T)0, FALSE) == FAIL)
+ break;
+***************
+*** 644,650 ****
+ mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted);
+ else if (deleted < 0)
+ mark_adjust(eap->line2, MAXLNUM, -deleted, 0L);
+! changed_lines(eap->line1, 0, eap->line2 + 1, -deleted);
+
+ curwin->w_cursor.lnum = eap->line1;
+ beginline(BL_WHITE | BL_FIX);
+--- 652,660 ----
+ mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted);
+ else if (deleted < 0)
+ mark_adjust(eap->line2, MAXLNUM, -deleted, 0L);
+!
+! if (change_occurred || deleted != 0)
+! changed_lines(eap->line1, 0, eap->line2 + 1, -deleted);
+
+ curwin->w_cursor.lnum = eap->line1;
+ beginline(BL_WHITE | BL_FIX);
+*** ../vim-8.1.0119/src/testdir/test_sort.vim 2017-09-23 18:58:18.000000000 +0200
+--- src/testdir/test_sort.vim 2018-06-28 11:21:15.071564844 +0200
+***************
+*** 1,13 ****
+! " Test sort()
+
+! :func Compare1(a, b) abort
+ call sort(range(3), 'Compare2')
+ return a:a - a:b
+! :endfunc
+
+! :func Compare2(a, b) abort
+ return a:a - a:b
+! :endfunc
+
+ func Test_sort_strings()
+ " numbers compared as strings
+--- 1,13 ----
+! " Tests for the "sort()" function and for the ":sort" command.
+
+! func Compare1(a, b) abort
+ call sort(range(3), 'Compare2')
+ return a:a - a:b
+! endfunc
+
+! func Compare2(a, b) abort
+ return a:a - a:b
+! endfunc
+
+ func Test_sort_strings()
+ " numbers compared as strings
+***************
+*** 45,51 ****
+ call assert_fails('call sort([3.3, 1, "2"], 3)', "E474")
+ endfunc
+
+! " Tests for the :sort command
+ func Test_sort_cmd()
+ let tests = [
+ \ {
+--- 45,51 ----
+ call assert_fails('call sort([3.3, 1, "2"], 3)', "E474")
+ endfunc
+
+! " Tests for the ":sort" command.
+ func Test_sort_cmd()
+ let tests = [
+ \ {
+***************
+*** 1167,1181 ****
+ \ '1.234',
+ \ '123.456'
+ \ ]
+! \ }
+ \ ]
+
+ for t in tests
+ enew!
+ call append(0, t.input)
+ $delete _
+! exe t.cmd
+ call assert_equal(t.expected, getline(1, '$'), t.name)
+ endfor
+
+ call assert_fails('sort no', 'E474')
+--- 1167,1220 ----
+ \ '1.234',
+ \ '123.456'
+ \ ]
+! \ },
+! \ {
+! \ 'name' : 'alphabetical, sorted input',
+! \ 'cmd' : 'sort',
+! \ 'input' : [
+! \ 'a',
+! \ 'b',
+! \ 'c',
+! \ ],
+! \ 'expected' : [
+! \ 'a',
+! \ 'b',
+! \ 'c',
+! \ ]
+! \ },
+! \ {
+! \ 'name' : 'alphabetical, sorted input, unique at end',
+! \ 'cmd' : 'sort u',
+! \ 'input' : [
+! \ 'aa',
+! \ 'bb',
+! \ 'cc',
+! \ 'cc',
+! \ ],
+! \ 'expected' : [
+! \ 'aa',
+! \ 'bb',
+! \ 'cc',
+! \ ]
+! \ },
+ \ ]
+
+ for t in tests
+ enew!
+ call append(0, t.input)
+ $delete _
+! setlocal nomodified
+! execute t.cmd
+!
+ call assert_equal(t.expected, getline(1, '$'), t.name)
++
++ " Previously, the ":sort" command would set 'modified' even if the buffer
++ " contents did not change. Here, we check that this problem is fixed.
++ if t.input == t.expected
++ call assert_false(&modified, t.name . ': &mod is not correct')
++ else
++ call assert_true(&modified, t.name . ': &mod is not correct')
++ endif
+ endfor
+
+ call assert_fails('sort no', 'E474')
+*** ../vim-8.1.0119/src/version.c 2018-06-27 23:12:30.608811033 +0200
+--- src/version.c 2018-06-28 11:09:56.954947638 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 120,
+ /**/
+
+--
+You cannot have a baby in one month by getting nine women pregnant.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0121 b/data/vim/patches/8.1.0121
new file mode 100644
index 000000000..ee442239c
--- /dev/null
+++ b/data/vim/patches/8.1.0121
@@ -0,0 +1,175 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0121
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0121
+Problem: Crash when using ballooneval related to 'vartabstop'.
+Solution: Initialize balloonEval->vts to NULL. (Markus Braun)
+Files: src/ex_cmds2.c, src/gui_beval.c, src/gui_w32.c, src/gui.c
+
+
+*** ../vim-8.1.0120/src/ex_cmds2.c 2018-05-12 15:36:03.000000000 +0200
+--- src/ex_cmds2.c 2018-06-28 11:54:26.812645846 +0200
+***************
+*** 1419,1425 ****
+ bevalexpr_due_set = FALSE;
+ if (balloonEval == NULL)
+ {
+! balloonEval = (BalloonEval *)alloc(sizeof(BalloonEval));
+ balloonEvalForTerm = TRUE;
+ }
+ if (balloonEval != NULL)
+--- 1419,1425 ----
+ bevalexpr_due_set = FALSE;
+ if (balloonEval == NULL)
+ {
+! balloonEval = (BalloonEval *)alloc_clear(sizeof(BalloonEval));
+ balloonEvalForTerm = TRUE;
+ }
+ if (balloonEval != NULL)
+*** ../vim-8.1.0120/src/gui_beval.c 2018-06-23 19:22:45.606486311 +0200
+--- src/gui_beval.c 2018-06-28 11:58:57.003085639 +0200
+***************
+*** 111,138 ****
+ return NULL;
+ }
+
+! beval = (BalloonEval *)alloc(sizeof(BalloonEval));
+ if (beval != NULL)
+ {
+ #ifdef FEAT_GUI_GTK
+ beval->target = GTK_WIDGET(target);
+- beval->balloonShell = NULL;
+- beval->timerID = 0;
+ #else
+ beval->target = (Widget)target;
+- beval->balloonShell = NULL;
+- beval->timerID = (XtIntervalId)NULL;
+ beval->appContext = XtWidgetToApplicationContext((Widget)target);
+ #endif
+ beval->showState = ShS_NEUTRAL;
+- beval->x = 0;
+- beval->y = 0;
+ beval->msg = mesg;
+ beval->msgCB = mesgCB;
+ beval->clientData = clientData;
+- #ifdef FEAT_VARTABS
+- beval->vts = NULL;
+- #endif
+
+ /*
+ * Set up event handler which will keep its eyes on the pointer,
+--- 111,129 ----
+ return NULL;
+ }
+
+! beval = (BalloonEval *)alloc_clear(sizeof(BalloonEval));
+ if (beval != NULL)
+ {
+ #ifdef FEAT_GUI_GTK
+ beval->target = GTK_WIDGET(target);
+ #else
+ beval->target = (Widget)target;
+ beval->appContext = XtWidgetToApplicationContext((Widget)target);
+ #endif
+ beval->showState = ShS_NEUTRAL;
+ beval->msg = mesg;
+ beval->msgCB = mesgCB;
+ beval->clientData = clientData;
+
+ /*
+ * Set up event handler which will keep its eyes on the pointer,
+*** ../vim-8.1.0120/src/gui_w32.c 2018-06-23 19:22:45.606486311 +0200
+--- src/gui_w32.c 2018-06-28 11:59:35.478867007 +0200
+***************
+*** 8922,8949 ****
+ return NULL;
+ }
+
+! beval = (BalloonEval *)alloc(sizeof(BalloonEval));
+ if (beval != NULL)
+ {
+ beval->target = s_textArea;
+- beval->balloon = NULL;
+
+ beval->showState = ShS_NEUTRAL;
+- beval->x = 0;
+- beval->y = 0;
+ beval->msg = mesg;
+ beval->msgCB = mesgCB;
+ beval->clientData = clientData;
+- #ifdef FEAT_VARTABS
+- beval->vts = NULL;
+- #endif
+
+ InitCommonControls();
+ cur_beval = beval;
+
+ if (p_beval)
+ gui_mch_enable_beval_area(beval);
+-
+ }
+ return beval;
+ }
+--- 8922,8942 ----
+ return NULL;
+ }
+
+! beval = (BalloonEval *)alloc_clear(sizeof(BalloonEval));
+ if (beval != NULL)
+ {
+ beval->target = s_textArea;
+
+ beval->showState = ShS_NEUTRAL;
+ beval->msg = mesg;
+ beval->msgCB = mesgCB;
+ beval->clientData = clientData;
+
+ InitCommonControls();
+ cur_beval = beval;
+
+ if (p_beval)
+ gui_mch_enable_beval_area(beval);
+ }
+ return beval;
+ }
+*** ../vim-8.1.0120/src/gui.c 2018-05-13 17:03:53.000000000 +0200
+--- src/gui.c 2018-06-28 12:01:22.930259972 +0200
+***************
+*** 745,751 ****
+--- 745,756 ----
+ /* Always create the Balloon Evaluation area, but disable it when
+ * 'ballooneval' is off. */
+ if (balloonEval != NULL)
++ {
++ # ifdef FEAT_VARTABS
++ vim_free(balloonEval->vts);
++ # endif
+ vim_free(balloonEval);
++ }
+ balloonEvalForTerm = FALSE;
+ # ifdef FEAT_GUI_GTK
+ balloonEval = gui_mch_create_beval_area(gui.drawarea, NULL,
+*** ../vim-8.1.0120/src/version.c 2018-06-28 11:28:04.797455530 +0200
+--- src/version.c 2018-06-28 12:02:15.657963770 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 121,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+129. You cancel your newspaper subscription.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0122 b/data/vim/patches/8.1.0122
new file mode 100644
index 000000000..62b00d4bc
--- /dev/null
+++ b/data/vim/patches/8.1.0122
@@ -0,0 +1,49 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0122
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0122
+Problem: Translators don't always understand the maintainer message.
+Solution: Add a comment that ends up in the generated po file. (Christian
+ Brabandt, closes #3037)
+Files: src/message.c
+
+
+*** ../vim-8.1.0121/src/message.c 2018-06-23 19:22:45.610486284 +0200
+--- src/message.c 2018-06-28 14:52:34.909193468 +0200
+***************
+*** 982,988 ****
+--- 982,992 ----
+ {
+ s = mch_getenv((char_u *)"LANG");
+ if (s != NULL && *s != NUL)
++ // The next comment is extracted by xgettext and put in po file for
++ // translators to read.
+ msg_attr((char_u *)
++ // Translator: Please replace the name and email address
++ // with the appropriate text for your translation.
+ _("Messages maintainer: Bram Moolenaar <Bram@vim.org>"),
+ HL_ATTR(HLF_T));
+ }
+*** ../vim-8.1.0121/src/version.c 2018-06-28 12:05:07.089006904 +0200
+--- src/version.c 2018-06-28 14:53:46.820830021 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 122,
+ /**/
+
+--
+In a world without fences, who needs Gates and Windows?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0123 b/data/vim/patches/8.1.0123
new file mode 100644
index 000000000..e9494588f
--- /dev/null
+++ b/data/vim/patches/8.1.0123
@@ -0,0 +1,62 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0123
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0123
+Problem: MS-Windows: colors are wrong after setting 'notgc'.
+Solution: Only call control_console_color_rgb() for the win32 terminal.
+ (Nobuhiro Takasaki, closes #3107)
+Files: src/option.c
+
+
+*** ../vim-8.1.0122/src/option.c 2018-06-24 23:53:25.153526495 +0200
+--- src/option.c 2018-06-28 15:26:10.110799983 +0200
+***************
+*** 8819,8828 ****
+ # endif
+ highlight_gui_started();
+ # ifdef FEAT_VTP
+- control_console_color_rgb();
+ /* reset t_Co */
+ if (is_term_win32())
+ set_termname(T_NAME);
+ # endif
+ }
+ #endif
+--- 8819,8831 ----
+ # endif
+ highlight_gui_started();
+ # ifdef FEAT_VTP
+ /* reset t_Co */
+ if (is_term_win32())
++ {
++ control_console_color_rgb();
+ set_termname(T_NAME);
++ init_highlight(TRUE, FALSE);
++ }
+ # endif
+ }
+ #endif
+*** ../vim-8.1.0122/src/version.c 2018-06-28 14:54:38.764565527 +0200
+--- src/version.c 2018-06-28 15:29:00.809904697 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 123,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+132. You come back and check this list every half-hour.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0124 b/data/vim/patches/8.1.0124
new file mode 100644
index 000000000..48bcf4f6d
--- /dev/null
+++ b/data/vim/patches/8.1.0124
@@ -0,0 +1,51 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0124
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0124
+Problem: has('vcon') returns true even for non-win32 terminal.
+Solution: Check the terminal type. (Nobuhiro Takasaki, closes #3106)
+Files: src/evalfunc.c
+
+
+*** ../vim-8.1.0123/src/evalfunc.c 2018-06-24 19:01:55.411752372 +0200
+--- src/evalfunc.c 2018-06-28 15:48:43.199224854 +0200
+***************
+*** 6609,6615 ****
+ #endif
+ #ifdef FEAT_VTP
+ else if (STRICMP(name, "vcon") == 0)
+! n = has_vtp_working();
+ #endif
+ #ifdef FEAT_NETBEANS_INTG
+ else if (STRICMP(name, "netbeans_enabled") == 0)
+--- 6609,6615 ----
+ #endif
+ #ifdef FEAT_VTP
+ else if (STRICMP(name, "vcon") == 0)
+! n = is_term_win32() && has_vtp_working();
+ #endif
+ #ifdef FEAT_NETBEANS_INTG
+ else if (STRICMP(name, "netbeans_enabled") == 0)
+*** ../vim-8.1.0123/src/version.c 2018-06-28 15:29:48.085656078 +0200
+--- src/version.c 2018-06-28 15:49:29.070921349 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 124,
+ /**/
+
+--
+There are three kinds of persons: Those who can count and those who can't.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0125 b/data/vim/patches/8.1.0125
new file mode 100644
index 000000000..697ddffba
--- /dev/null
+++ b/data/vim/patches/8.1.0125
@@ -0,0 +1,197 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0125
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0125
+Problem: Virtual edit replace with multi-byte fails at end of line. (Lukas
+ Werling)
+Solution: use ins_char() to add the character. (Christian Brabandt,
+ closes #3114) Rename PCHAR() to PBYTE() to avoid mistakes like
+ this.
+Files: src/ops.c, src/testdir/test_virtualedit.vim, src/macros.h
+
+
+*** ../vim-8.1.0124/src/ops.c 2018-06-27 20:49:40.567862384 +0200
+--- src/ops.c 2018-06-28 19:20:39.671555865 +0200
+***************
+*** 2146,2151 ****
+--- 2146,2170 ----
+ #endif
+
+ #if defined(FEAT_VISUALEXTRA) || defined(PROTO)
++
++ # ifdef FEAT_MBYTE
++ /*
++ * Replace the character under the cursor with "c".
++ * This takes care of multi-byte characters.
++ */
++ static void
++ replace_character(int c)
++ {
++ int n = State;
++
++ State = REPLACE;
++ ins_char(c);
++ State = n;
++ /* Backup to the replaced character. */
++ dec_cursor();
++ }
++
++ # endif
+ /*
+ * Replace a whole area with one character.
+ */
+***************
+*** 2331,2342 ****
+ * with a multi-byte and the other way around. */
+ if (curwin->w_cursor.lnum == oap->end.lnum)
+ oap->end.col += (*mb_char2len)(c) - (*mb_char2len)(n);
+! n = State;
+! State = REPLACE;
+! ins_char(c);
+! State = n;
+! /* Backup to the replaced character. */
+! dec_cursor();
+ }
+ else
+ #endif
+--- 2350,2356 ----
+ * with a multi-byte and the other way around. */
+ if (curwin->w_cursor.lnum == oap->end.lnum)
+ oap->end.col += (*mb_char2len)(c) - (*mb_char2len)(n);
+! replace_character(c);
+ }
+ else
+ #endif
+***************
+*** 2358,2364 ****
+ getvpos(&oap->end, end_vcol);
+ }
+ #endif
+! PCHAR(curwin->w_cursor, c);
+ }
+ }
+ #ifdef FEAT_VIRTUALEDIT
+--- 2372,2378 ----
+ getvpos(&oap->end, end_vcol);
+ }
+ #endif
+! PBYTE(curwin->w_cursor, c);
+ }
+ }
+ #ifdef FEAT_VIRTUALEDIT
+***************
+*** 2377,2385 ****
+ curwin->w_cursor.col -= (virtcols + 1);
+ for (; virtcols >= 0; virtcols--)
+ {
+! PCHAR(curwin->w_cursor, c);
+! if (inc(&curwin->w_cursor) == -1)
+! break;
+ }
+ }
+ #endif
+--- 2391,2404 ----
+ curwin->w_cursor.col -= (virtcols + 1);
+ for (; virtcols >= 0; virtcols--)
+ {
+! #ifdef FEAT_MBYTE
+! if ((*mb_char2len)(c) > 1)
+! replace_character(c);
+! else
+! #endif
+! PBYTE(curwin->w_cursor, c);
+! if (inc(&curwin->w_cursor) == -1)
+! break;
+ }
+ }
+ #endif
+***************
+*** 2619,2625 ****
+ }
+ else
+ #endif
+! PCHAR(*pos, nc);
+ return TRUE;
+ }
+ return FALSE;
+--- 2638,2644 ----
+ }
+ else
+ #endif
+! PBYTE(*pos, nc);
+ return TRUE;
+ }
+ return FALSE;
+*** ../vim-8.1.0124/src/testdir/test_virtualedit.vim 2018-04-25 21:58:46.000000000 +0200
+--- src/testdir/test_virtualedit.vim 2018-06-28 19:12:57.486074037 +0200
+***************
+*** 42,47 ****
+--- 42,63 ----
+ set virtualedit=
+ endfunc
+
++ func Test_replace_end_of_line()
++ new
++ set virtualedit=all
++ call setline(1, range(20))
++ exe "normal! gg2jv10lr-"
++ call assert_equal(["1", "-----------", "3"], getline(2,4))
++ if has('multi_byte')
++ call setline(1, range(20))
++ exe "normal! gg2jv10lr\<c-k>hh"
++ call assert_equal(["1", "───────────", "3"], getline(2,4))
++ endif
++
++ bwipe!
++ set virtualedit=
++ endfunc
++
+ func Test_edit_CTRL_G()
+ new
+ set virtualedit=insert
+*** ../vim-8.1.0124/src/macros.h 2018-04-10 18:37:19.000000000 +0200
+--- src/macros.h 2018-06-28 19:15:50.801135759 +0200
+***************
+*** 14,22 ****
+ */
+
+ /*
+! * PCHAR(lp, c) - put character 'c' at position 'lp'
+ */
+! #define PCHAR(lp, c) (*(ml_get_buf(curbuf, (lp).lnum, TRUE) + (lp).col) = (c))
+
+ /*
+ * Position comparisons
+--- 14,22 ----
+ */
+
+ /*
+! * PBYTE(lp, c) - put byte 'c' at position 'lp'
+ */
+! #define PBYTE(lp, c) (*(ml_get_buf(curbuf, (lp).lnum, TRUE) + (lp).col) = (c))
+
+ /*
+ * Position comparisons
+*** ../vim-8.1.0124/src/version.c 2018-06-28 15:50:23.178568297 +0200
+--- src/version.c 2018-06-28 19:11:53.922415636 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 125,
+ /**/
+
+--
+The coffee just wasn't strong enough to defend itself -- Tom Waits
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0126 b/data/vim/patches/8.1.0126
new file mode 100644
index 000000000..a179307be
--- /dev/null
+++ b/data/vim/patches/8.1.0126
@@ -0,0 +1,213 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0126
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0126
+Problem: Various problems with 'vartabstop'.
+Solution: Fix memory leak. Fix crash. Add a few more tests. (Christian
+ Brabandt, closes #3076)
+Files: src/ex_cmds.c, src/option.c, src/screen.c,
+ src/testdir/test_vartabs.vim
+
+
+*** ../vim-8.1.0125/src/ex_cmds.c 2018-06-28 11:28:04.793455550 +0200
+--- src/ex_cmds.c 2018-06-28 20:37:11.354721386 +0200
+***************
+*** 866,872 ****
+ {
+ set_string_option_direct((char_u *)"vts", -1, new_ts_str,
+ OPT_FREE|OPT_LOCAL, 0);
+- vim_free(new_ts_str);
+ curbuf->b_p_vts_array = new_vts_array;
+ vim_free(old_vts_ary);
+ }
+--- 866,871 ----
+***************
+*** 877,882 ****
+--- 876,882 ----
+ curbuf->b_p_ts = tabstop_first(new_vts_array);
+ vim_free(new_vts_array);
+ }
++ vim_free(new_ts_str);
+ }
+ #else
+ curbuf->b_p_ts = new_ts;
+*** ../vim-8.1.0125/src/option.c 2018-06-28 15:29:48.081656098 +0200
+--- src/option.c 2018-06-28 20:40:51.173370370 +0200
+***************
+*** 12870,12876 ****
+ tabstop_fromto(
+ colnr_T start_col,
+ colnr_T end_col,
+! int ts,
+ int *vts,
+ int *ntabs,
+ int *nspcs)
+--- 12870,12876 ----
+ tabstop_fromto(
+ colnr_T start_col,
+ colnr_T end_col,
+! int ts_arg,
+ int *vts,
+ int *ntabs,
+ int *nspcs)
+***************
+*** 12880,12891 ****
+ int padding = 0;
+ int tabcount;
+ int t;
+
+ if (vts == NULL || vts[0] == 0)
+ {
+ int tabs = 0;
+! int initspc = ts - (start_col % ts);
+
+ if (spaces >= initspc)
+ {
+ spaces -= initspc;
+--- 12880,12893 ----
+ int padding = 0;
+ int tabcount;
+ int t;
++ int ts = ts_arg == 0 ? curbuf->b_p_ts : ts_arg;
+
+ if (vts == NULL || vts[0] == 0)
+ {
+ int tabs = 0;
+! int initspc = 0;
+
++ initspc = ts - (start_col % ts);
+ if (spaces >= initspc)
+ {
+ spaces -= initspc;
+*** ../vim-8.1.0125/src/screen.c 2018-06-25 21:24:47.284934379 +0200
+--- src/screen.c 2018-06-28 20:38:50.538108113 +0200
+***************
+*** 4753,4765 ****
+ n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol,
+ NULL) - 1;
+ if (c == TAB && n_extra + col > wp->w_width)
+! #ifdef FEAT_VARTABS
+ n_extra = tabstop_padding(vcol, wp->w_buffer->b_p_ts,
+! wp->w_buffer->b_p_vts_array) - 1;
+! #else
+ n_extra = (int)wp->w_buffer->b_p_ts
+ - vcol % (int)wp->w_buffer->b_p_ts - 1;
+! #endif
+
+ # ifdef FEAT_MBYTE
+ c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' ';
+--- 4753,4765 ----
+ n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol,
+ NULL) - 1;
+ if (c == TAB && n_extra + col > wp->w_width)
+! # ifdef FEAT_VARTABS
+ n_extra = tabstop_padding(vcol, wp->w_buffer->b_p_ts,
+! wp->w_buffer->b_p_vts_array) - 1;
+! # else
+ n_extra = (int)wp->w_buffer->b_p_ts
+ - vcol % (int)wp->w_buffer->b_p_ts - 1;
+! # endif
+
+ # ifdef FEAT_MBYTE
+ c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' ';
+***************
+*** 4902,4907 ****
+--- 4902,4912 ----
+ p_extra_free = p;
+ for (i = 0; i < tab_len; i++)
+ {
++ if (*p == NUL)
++ {
++ tab_len = i;
++ break;
++ }
+ #ifdef FEAT_MBYTE
+ mb_char2bytes(lcs_tab2, p);
+ p += mb_char2len(lcs_tab2);
+*** ../vim-8.1.0125/src/testdir/test_vartabs.vim 2018-06-25 21:24:47.284934379 +0200
+--- src/testdir/test_vartabs.vim 2018-06-28 20:42:19.772833210 +0200
+***************
+*** 262,282 ****
+ endfunc
+
+ func! Test_vartabs_linebreak()
+! if winwidth(0) < 80
+ return
+ endif
+ new
+! 70vnew
+ %d
+! setl linebreak vartabstop=10,15,20,40
+ call setline(1, "\tx\tx\tx\tx")
+
+! let lines = ScreenLines([1, 2], winwidth(0))
+! let expect = [' x x x ',
+! \ ' x ']
+ call s:compare_lines(expect, lines)
+
+ " cleanup
+ bw!
+ bw!
+ endfunc
+--- 262,298 ----
+ endfunc
+
+ func! Test_vartabs_linebreak()
+! if winwidth(0) < 40
+ return
+ endif
+ new
+! 40vnew
+ %d
+! setl linebreak vartabstop=10,20,30,40
+ call setline(1, "\tx\tx\tx\tx")
+
+! let expect = [' x ',
+! \ 'x x ',
+! \ 'x ']
+! let lines = ScreenLines([1, 3], winwidth(0))
+! call s:compare_lines(expect, lines)
+! setl list listchars=tab:>-
+! let expect = ['>---------x>------------------ ',
+! \ 'x>------------------x>------------------',
+! \ 'x ']
+! let lines = ScreenLines([1, 3], winwidth(0))
+! call s:compare_lines(expect, lines)
+! setl linebreak vartabstop=40
+! let expect = ['>---------------------------------------',
+! \ 'x>--------------------------------------',
+! \ 'x>--------------------------------------',
+! \ 'x>--------------------------------------',
+! \ 'x ']
+! let lines = ScreenLines([1, 5], winwidth(0))
+ call s:compare_lines(expect, lines)
+
+ " cleanup
+ bw!
+ bw!
++ set nolist listchars&vim
+ endfunc
+*** ../vim-8.1.0125/src/version.c 2018-06-28 19:26:24.321655175 +0200
+--- src/version.c 2018-06-28 20:36:19.043047749 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 126,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+138. You develop a liking for cold coffee.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0127 b/data/vim/patches/8.1.0127
new file mode 100644
index 000000000..48599b5df
--- /dev/null
+++ b/data/vim/patches/8.1.0127
@@ -0,0 +1,54 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0127
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0127
+Problem: Build failure when disabling the session feature. (Pawel Slowik)
+Solution: Adjust #ifdef for vim_chdirfile().
+Files: src/misc2.c
+
+
+*** ../vim-8.1.0126/src/misc2.c 2018-04-21 23:24:12.000000000 +0200
+--- src/misc2.c 2018-06-29 20:25:56.182566403 +0200
+***************
+*** 3381,3388 ****
+ && pathcmp((char *)ffname, (char *)f2, (int)(t1 - ffname)) == 0);
+ }
+
+! #if defined(FEAT_SESSION) || defined(MSWIN) || defined(FEAT_GUI_MAC) \
+! || defined(FEAT_GUI_GTK) \
+ || defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
+ || defined(PROTO)
+ /*
+--- 3381,3388 ----
+ && pathcmp((char *)ffname, (char *)f2, (int)(t1 - ffname)) == 0);
+ }
+
+! #if defined(FEAT_SESSION) || defined(FEAT_AUTOCHDIR) \
+! || defined(MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK) \
+ || defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
+ || defined(PROTO)
+ /*
+*** ../vim-8.1.0126/src/version.c 2018-06-28 22:22:56.233315600 +0200
+--- src/version.c 2018-06-29 20:28:20.233705119 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 127,
+ /**/
+
+--
+I wish there was a knob on the TV to turn up the intelligence.
+There's a knob called "brightness", but it doesn't seem to work.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0128 b/data/vim/patches/8.1.0128
new file mode 100644
index 000000000..5b9907bda
--- /dev/null
+++ b/data/vim/patches/8.1.0128
@@ -0,0 +1,487 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0128
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0128
+Problem: Building with MinGW does not work out-of-the-box.
+Solution: Add instructions for MSYS2. Set default WINVER. Add batch files
+ to set $PATH for MSYS2.
+Files: src/Make_cyg_ming.mak, src/INSTALLpc.txt, src/msys32.bat,
+ src/msys64.bat, Filelist
+
+
+*** ../vim-8.1.0127/src/Make_cyg_ming.mak 2018-06-19 18:58:04.006489842 +0200
+--- src/Make_cyg_ming.mak 2018-06-30 15:56:42.425768825 +0200
+***************
+*** 75,83 ****
+ # Set to yes to enable OLE support.
+ OLE=no
+
+! # Set the default $(WINVER) to make it work with WinXP.
+ ifndef WINVER
+! WINVER = 0x0501
+ endif
+
+ # Set to yes to enable Cscope support.
+--- 75,84 ----
+ # Set to yes to enable OLE support.
+ OLE=no
+
+! # Set the default $(WINVER). Use 0x0501 to make it work with WinXP.
+ ifndef WINVER
+! # WINVER = 0x0501
+! WINVER = 0x0600
+ endif
+
+ # Set to yes to enable Cscope support.
+*** ../vim-8.1.0127/src/INSTALLpc.txt 2017-12-14 13:07:27.000000000 +0100
+--- src/INSTALLpc.txt 2018-06-30 16:08:36.949674031 +0200
+***************
+*** 22,44 ****
+
+ Contents:
+ 1. Microsoft Visual C++
+! 2. Using MinGW
+! 3. Cygwin
+! 4. Borland
+! 5. Cross compiling for Win32 from a Linux machine
+! 6. Building with Python support
+! 7. Building with Python3 support
+! 8. Building with Racket or MzScheme support
+! 9. Building with Lua support
+! 10. Building with Perl support
+! 11. Building with Ruby support
+! 12. Building with Tcl support
+! 13. Building with Terminal support
+! 14. Building with DirectX (DirectWrite) support
+! 15. Windows 3.1
+! 16. MS-DOS
+
+! 17. Installing after building from sources
+
+
+ The currently recommended way (that means it has been verified to work) is
+--- 22,45 ----
+
+ Contents:
+ 1. Microsoft Visual C++
+! 2. Using MSYS2 with MinGW
+! 3. Using MinGW
+! 4. Cygwin
+! 5. Borland
+! 6. Cross compiling for Win32 from a Linux machine
+! 7. Building with Python support
+! 8. Building with Python3 support
+! 9. Building with Racket or MzScheme support
+! 10. Building with Lua support
+! 11. Building with Perl support
+! 12. Building with Ruby support
+! 13. Building with Tcl support
+! 14. Building with Terminal support
+! 15. Building with DirectX (DirectWrite) support
+! 16. Windows 3.1
+! 17. MS-DOS
+
+! 18. Installing after building from sources
+
+
+ The currently recommended way (that means it has been verified to work) is
+***************
+*** 261,268 ****
+ http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/default.aspx
+
+
+
+! 2. MinGW
+ ========
+
+ (written by Ron Aaron: <ronaharon@yahoo.com>)
+--- 262,348 ----
+ http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/default.aspx
+
+
++ 2. MSYS2 with MinGW
++ ===================
+
+! 2.1. Setup the basic msys2 environment
+!
+! Go to the official page of MSYS2: https://www.msys2.org
+! Download an installer:
+!
+! * msys2-x86_64-YYYYMMDD.exe for 64-bit Windows
+! (Even if you want to build 32-bit Vim)
+! * msys2-i686-YYYYMMDD.exe for 32-bit Windows
+!
+! Execute the installer and follow the instructions to update basic packages.
+! At the end keep the checkbox checked to run msys2 now. If needed, you can
+! open the window from the start menu, MSYS2 64 bit / MSYS2 MSYS
+!
+! Execute:
+! $ pacman -Syu
+!
+! And restart MSYS2 window (select "MSYS2 MSYS" icon from the Start Menu).
+! Then execute:
+! $ pacman -Su
+!
+! If pacman complains that `catgets` and `libcatgets` conflict with another
+! package, select `y` to remove them.
+!
+!
+! 2.2. Install additional packages for building Vim
+!
+! The following package groups are required for building Vim:
+!
+! * base-devel
+! * mingw-w64-i686-toolchain (for building 32-bit Vim)
+! * mingw-w64-x86_64-toolchain (for building 64-bit Vim)
+!
+! Use the following command to install them:
+!
+! $ pacman -S base-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain
+!
+! Or you can use the `pacboy` command to avoid long package names:
+!
+! $ pacboy -S base-devel: toolchain:m
+!
+! (See `pacboy help` for the help.)
+!
+!
+! 2.3. Keep the build environment up-to-date
+!
+! After you have installed the build environment, you may want to keep it
+! up-to-date (E.g. always use the latest GCC).
+! In that case, you just need to execute the command:
+! $ pacman -Syu
+!
+!
+! # Build Vim
+!
+! Select one of the following icon from the Start Menu:
+!
+! * MSYS2 MinGW 32-bit (To build 32-bit versions of Vim)
+! * MSYS2 MinGW 64-bit (To build 64-bit versions of Vim)
+!
+! Go to the source directory of Vim, then execute the make command. E.g.:
+!
+! make -f Make_ming.mak
+! make -f Make_ming.mak GUI=no
+! make -f Make_ming.mak GUI=no DEBUG=yes
+!
+! NOTE: you can't execute the vim.exe in the MSYS console, open a normal Windows
+! console for that. You need to set $PATH to be able to build there, e.g.:
+!
+! set PATH=c:\msys64\mingw32\bin;c:\msys64\usr\bin;%PATH%
+!
+! This command is in msys32.bat. Or or the 64 bit compiler use msys64.bat:
+!
+! set PATH=c:\msys64\mingw64\bin;c:\msys64\usr\bin;%PATH%
+!
+! If you have msys64 in another location you will need to adjust the paths for
+! that.
+!
+!
+! 3. MinGW
+ ========
+
+ (written by Ron Aaron: <ronaharon@yahoo.com>)
+***************
+*** 344,350 ****
+ You need to uncomment lines in Make_ming.mak to have NLS defined.
+
+
+! 3. Cygwin
+ =========
+
+ Use Make_cyg.mak with Cygwin's GCC. See
+--- 424,430 ----
+ You need to uncomment lines in Make_ming.mak to have NLS defined.
+
+
+! 4. Cygwin
+ =========
+
+ Use Make_cyg.mak with Cygwin's GCC. See
+***************
+*** 356,369 ****
+ with the other makefiles).
+
+
+! 4. Borland
+ ===========
+
+ Use Make_bc5.mak with Borland C++ 5.x. See
+ http://users.skynet.be/antoine.mechelynck/vim/compile.htm
+
+
+! 5. Cross compiling for Win32 from a Linux machine
+ =================================================
+
+ [Update of 1) needs to be verified]
+--- 436,449 ----
+ with the other makefiles).
+
+
+! 5. Borland
+ ===========
+
+ Use Make_bc5.mak with Borland C++ 5.x. See
+ http://users.skynet.be/antoine.mechelynck/vim/compile.htm
+
+
+! 6. Cross compiling for Win32 from a Linux machine
+ =================================================
+
+ [Update of 1) needs to be verified]
+***************
+*** 383,389 ****
+ Now you have created the Windows binary from your Linux box! Have fun...
+
+
+! 6. Building with Python support
+ ===============================
+
+ For building with MSVC 2008 the "Windows Installer" from www.python.org
+--- 463,469 ----
+ Now you have created the Windows binary from your Linux box! Have fun...
+
+
+! 7. Building with Python support
+ ===============================
+
+ For building with MSVC 2008 the "Windows Installer" from www.python.org
+***************
+*** 435,441 ****
+ You will end up with a Python-enabled, Win32 version. Enjoy!
+
+
+! 7. Building with Python3 support
+ ================================
+
+ For building with MSVC 2008 the "Windows Installer" from www.python.org
+--- 515,521 ----
+ You will end up with a Python-enabled, Win32 version. Enjoy!
+
+
+! 8. Building with Python3 support
+ ================================
+
+ For building with MSVC 2008 the "Windows Installer" from www.python.org
+***************
+*** 466,472 ****
+ (This is for 64-bit builds. For 32-bit builds, replace mingw64 with mingw32.)
+
+
+! 8. Building with Racket or MzScheme support
+ ========================================
+
+ 1) Building with Racket support (newest)
+--- 546,552 ----
+ (This is for 64-bit builds. For 32-bit builds, replace mingw64 with mingw32.)
+
+
+! 9. Building with Racket or MzScheme support
+ ========================================
+
+ 1) Building with Racket support (newest)
+***************
+*** 556,562 ****
+
+
+
+! 9. Building with Lua support
+ ============================
+
+ Vim with Lua support can be built with either MSVC or MinGW (or maybe Cygwin).
+--- 636,642 ----
+
+
+
+! 10. Building with Lua support
+ ============================
+
+ Vim with Lua support can be built with either MSVC or MinGW (or maybe Cygwin).
+***************
+*** 611,617 ****
+ LUA=/cygdrive/c/projects/lua53 DYNAMIC_LUA=yes LUA_VER=53
+
+
+! 10. Building with Perl support
+ ==============================
+
+ Vim with Perl support can be built with either MSVC or MinGW (or Cygwin).
+--- 691,697 ----
+ LUA=/cygdrive/c/projects/lua53 DYNAMIC_LUA=yes LUA_VER=53
+
+
+! 11. Building with Perl support
+ ==============================
+
+ Vim with Perl support can be built with either MSVC or MinGW (or Cygwin).
+***************
+*** 637,643 ****
+ PERL=C:/Perl DYNAMIC_PERL=yes PERL_VER=522
+
+
+! 11. Building with Ruby support
+ ==============================
+
+ Vim with Ruby support can be built with either MSVC or MinGW (or Cygwin).
+--- 717,723 ----
+ PERL=C:/Perl DYNAMIC_PERL=yes PERL_VER=522
+
+
+! 12. Building with Ruby support
+ ==============================
+
+ Vim with Ruby support can be built with either MSVC or MinGW (or Cygwin).
+***************
+*** 745,751 ****
+
+
+
+! 12. Building with Tcl support
+ =============================
+
+ Vim with Tcl support can be built with either MSVC or MinGW (or Cygwin).
+--- 825,831 ----
+
+
+
+! 13. Building with Tcl support
+ =============================
+
+ Vim with Tcl support can be built with either MSVC or MinGW (or Cygwin).
+***************
+*** 777,783 ****
+ TCL=C:/Tcl86 DYNAMIC_TCL=yes TCL_VER=86 TCL_VER_LONG=8.6
+
+
+! 13. Building with Terminal support
+ ==================================
+
+ Vim with Terminal support can be built with either MSVC, MinGW or Cygwin.
+--- 857,863 ----
+ TCL=C:/Tcl86 DYNAMIC_TCL=yes TCL_VER=86 TCL_VER_LONG=8.6
+
+
+! 14. Building with Terminal support
+ ==================================
+
+ Vim with Terminal support can be built with either MSVC, MinGW or Cygwin.
+***************
+*** 793,799 ****
+ mingw32-make -f Make_ming.mak TERMINAL=yes
+
+
+! 14. Building with DirectX (DirectWrite) support
+ ===============================================
+
+ Vim with DirectX (DirectWrite) support can be built with either MSVC or MinGW.
+--- 873,879 ----
+ mingw32-make -f Make_ming.mak TERMINAL=yes
+
+
+! 15. Building with DirectX (DirectWrite) support
+ ===============================================
+
+ Vim with DirectX (DirectWrite) support can be built with either MSVC or MinGW.
+***************
+*** 827,846 ****
+ mingw32-make -f Make_ming.mak DIRECTX=yes
+
+
+! 15. Windows 3.1x
+ ================
+
+ The Windows 3.1x support was removed in patch 7.4.1364.
+
+
+! 16. MS-DOS
+ ==========
+
+ The MS-DOS support was removed in patch 7.4.1399. Only very old Vim versions
+ work on MS-DOS because of the limited amount of memory available.
+
+
+! 17. Installing after building from sources
+ ==========================================
+
+ [provided by Michael Soyka, updated by Ken Takata]
+--- 907,926 ----
+ mingw32-make -f Make_ming.mak DIRECTX=yes
+
+
+! 16. Windows 3.1x
+ ================
+
+ The Windows 3.1x support was removed in patch 7.4.1364.
+
+
+! 17. MS-DOS
+ ==========
+
+ The MS-DOS support was removed in patch 7.4.1399. Only very old Vim versions
+ work on MS-DOS because of the limited amount of memory available.
+
+
+! 18. Installing after building from sources
+ ==========================================
+
+ [provided by Michael Soyka, updated by Ken Takata]
+*** ../vim-8.1.0127/src/msys32.bat 2018-06-30 16:24:02.228096012 +0200
+--- src/msys32.bat 2018-06-30 16:23:34.768256429 +0200
+***************
+*** 0 ****
+--- 1,6 ----
++ @echo off
++ rem To be used on MS-Windows for Msys2 with the 32 bit MinGW compiler.
++ rem Adjust the "c:\msys64" part to match your installation.
++ @echo on
++
++ set PATH=c:\msys64\mingw32\bin;c:\msys64\usr\bin;%PATH%
+*** ../vim-8.1.0127/src/msys64.bat 2018-06-30 16:24:02.236095965 +0200
+--- src/msys64.bat 2018-06-30 16:23:33.832261898 +0200
+***************
+*** 0 ****
+--- 1,6 ----
++ @echo off
++ rem To be used on MS-Windows for Msys2 with the 64 bit MinGW compiler.
++ rem Adjust the "c:\msys64" part to match your installation.
++ @echo on
++
++ set PATH=c:\msys64\mingw64\bin;c:\msys64\usr\bin;%PATH%
+*** ../vim-8.1.0127/Filelist 2018-06-24 15:56:20.602363176 +0200
+--- Filelist 2018-06-30 16:15:24.499158371 +0200
+***************
+*** 412,417 ****
+--- 412,419 ----
+ src/msvc2008.bat \
+ src/msvc2010.bat \
+ src/msvc2015.bat \
++ src/msys32.bat \
++ src/msys64.bat \
+ src/dimm.idl \
+ src/dlldata.c \
+ src/dosinst.c \
+*** ../vim-8.1.0127/src/version.c 2018-06-29 20:28:27.505661796 +0200
+--- src/version.c 2018-06-30 16:24:09.380054257 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 128,
+ /**/
+
+--
+Fingers not found - Pound head on keyboard to continue.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0129 b/data/vim/patches/8.1.0129
new file mode 100644
index 000000000..8d9c59f1c
--- /dev/null
+++ b/data/vim/patches/8.1.0129
@@ -0,0 +1,50 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0129
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0129
+Problem: Still some xterm-like terminals get a stray "p" on startup.
+Solution: Consider all terminals that reply with a version smaller than 95
+ as not an xterm. (James McCoy)
+Files: src/term.c
+
+
+*** ../vim-8.1.0128/src/term.c 2018-05-23 20:30:52.738566360 +0200
+--- src/term.c 2018-06-30 17:02:55.602235946 +0200
+***************
+*** 4690,4695 ****
+--- 4690,4700 ----
+ && STRNCMP(tp + extra - 2, "0;115;0c", 8) == 0)
+ is_not_xterm = TRUE;
+
++ // Xterm first responded to this request at patch level
++ // 95, so assume anything below 95 is not xterm.
++ if (version < 95)
++ is_not_xterm = TRUE;
++
+ /* Only request the cursor style if t_SH and t_RS are
+ * set. Only supported properly by xterm since version
+ * 279 (otherwise it returns 0x18).
+*** ../vim-8.1.0128/src/version.c 2018-06-30 17:09:12.656017847 +0200
+--- src/version.c 2018-06-30 17:04:03.133837926 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 129,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+147. You finally give up smoking...because it made the monitor dirty.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0130 b/data/vim/patches/8.1.0130
new file mode 100644
index 000000000..ba2232eed
--- /dev/null
+++ b/data/vim/patches/8.1.0130
@@ -0,0 +1,169 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0130
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0130
+Problem: ":profdel func" does not work if func was called already.
+ (Dominique Pelle)
+Solution: Reset uf_profiling and add a flag to indicate initialization was
+ done.
+Files: src/structs.h, src/userfunc.c
+
+
+*** ../vim-8.1.0129/src/structs.h 2018-06-23 19:22:45.614486258 +0200
+--- src/structs.h 2018-06-30 18:12:48.678664711 +0200
+***************
+*** 1345,1350 ****
+--- 1345,1351 ----
+ garray_T uf_lines; /* function lines */
+ #ifdef FEAT_PROFILE
+ int uf_profiling; /* TRUE when func is being profiled */
++ int uf_prof_initialized;
+ /* profiling the function as a whole */
+ int uf_tm_count; /* nr of calls */
+ proftime_T uf_tm_total; /* time spent in function + children */
+*** ../vim-8.1.0129/src/userfunc.c 2018-05-22 18:31:30.001365739 +0200
+--- src/userfunc.c 2018-06-30 18:20:15.704075693 +0200
+***************
+*** 293,302 ****
+ fp->uf_scoped = NULL;
+
+ #ifdef FEAT_PROFILE
+- fp->uf_tml_count = NULL;
+- fp->uf_tml_total = NULL;
+- fp->uf_tml_self = NULL;
+- fp->uf_profiling = FALSE;
+ if (prof_def_func())
+ func_do_profile(fp);
+ #endif
+--- 293,298 ----
+***************
+*** 706,711 ****
+--- 702,708 ----
+ #ifdef FEAT_PROFILE
+ proftime_T wait_start;
+ proftime_T call_start;
++ int started_profiling = FALSE;
+ #endif
+
+ /* If depth of calling is getting too high, don't execute the function */
+***************
+*** 921,927 ****
+--- 918,927 ----
+ if (do_profiling == PROF_YES)
+ {
+ if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
++ {
++ started_profiling = TRUE;
+ func_do_profile(fp);
++ }
+ if (fp->uf_profiling
+ || (fc->caller != NULL && fc->caller->func->uf_profiling))
+ {
+***************
+*** 965,970 ****
+--- 965,973 ----
+ profile_add(&fc->caller->func->uf_tm_children, &call_start);
+ profile_add(&fc->caller->func->uf_tml_children, &call_start);
+ }
++ if (started_profiling)
++ // make a ":profdel func" stop profiling the function
++ fp->uf_profiling = FALSE;
+ }
+ #endif
+
+***************
+*** 2522,2544 ****
+ {
+ int len = fp->uf_lines.ga_len;
+
+! if (len == 0)
+! len = 1; /* avoid getting error for allocating zero bytes */
+! fp->uf_tm_count = 0;
+! profile_zero(&fp->uf_tm_self);
+! profile_zero(&fp->uf_tm_total);
+! if (fp->uf_tml_count == NULL)
+! fp->uf_tml_count = (int *)alloc_clear((unsigned) (sizeof(int) * len));
+! if (fp->uf_tml_total == NULL)
+! fp->uf_tml_total = (proftime_T *)alloc_clear((unsigned)
+! (sizeof(proftime_T) * len));
+! if (fp->uf_tml_self == NULL)
+! fp->uf_tml_self = (proftime_T *)alloc_clear((unsigned)
+! (sizeof(proftime_T) * len));
+! fp->uf_tml_idx = -1;
+! if (fp->uf_tml_count == NULL || fp->uf_tml_total == NULL
+! || fp->uf_tml_self == NULL)
+! return; /* out of memory */
+
+ fp->uf_profiling = TRUE;
+ }
+--- 2525,2552 ----
+ {
+ int len = fp->uf_lines.ga_len;
+
+! if (!fp->uf_prof_initialized)
+! {
+! if (len == 0)
+! len = 1; /* avoid getting error for allocating zero bytes */
+! fp->uf_tm_count = 0;
+! profile_zero(&fp->uf_tm_self);
+! profile_zero(&fp->uf_tm_total);
+! if (fp->uf_tml_count == NULL)
+! fp->uf_tml_count = (int *)alloc_clear(
+! (unsigned)(sizeof(int) * len));
+! if (fp->uf_tml_total == NULL)
+! fp->uf_tml_total = (proftime_T *)alloc_clear(
+! (unsigned)(sizeof(proftime_T) * len));
+! if (fp->uf_tml_self == NULL)
+! fp->uf_tml_self = (proftime_T *)alloc_clear(
+! (unsigned)(sizeof(proftime_T) * len));
+! fp->uf_tml_idx = -1;
+! if (fp->uf_tml_count == NULL || fp->uf_tml_total == NULL
+! || fp->uf_tml_self == NULL)
+! return; /* out of memory */
+! fp->uf_prof_initialized = TRUE;
+! }
+
+ fp->uf_profiling = TRUE;
+ }
+***************
+*** 2568,2574 ****
+ {
+ --todo;
+ fp = HI2UF(hi);
+! if (fp->uf_profiling)
+ {
+ if (sorttab != NULL)
+ sorttab[st_len++] = fp;
+--- 2576,2582 ----
+ {
+ --todo;
+ fp = HI2UF(hi);
+! if (fp->uf_prof_initialized)
+ {
+ if (sorttab != NULL)
+ sorttab[st_len++] = fp;
+*** ../vim-8.1.0129/src/version.c 2018-06-30 17:09:23.039956879 +0200
+--- src/version.c 2018-06-30 18:12:14.990860555 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 130,
+ /**/
+
+
+--
+hundred-and-one symptoms of being an internet addict:
+149. You find your computer sexier than your girlfriend
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0131 b/data/vim/patches/8.1.0131
new file mode 100644
index 000000000..c0c0e2335
--- /dev/null
+++ b/data/vim/patches/8.1.0131
@@ -0,0 +1,196 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0131
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0131
+Problem: :profdel is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3123)
+Files: src/testdir/test_profile.vim
+
+
+*** ../vim-8.1.0130/src/testdir/test_profile.vim 2017-12-05 16:42:08.000000000 +0100
+--- src/testdir/test_profile.vim 2018-06-30 21:16:50.974593817 +0200
+***************
+*** 5,10 ****
+--- 5,12 ----
+
+ func Test_profile_func()
+ let lines = [
++ \ 'profile start Xprofile_func.log',
++ \ 'profile func Foo*"',
+ \ "func! Foo1()",
+ \ "endfunc",
+ \ "func! Foo2()",
+***************
+*** 33,41 ****
+
+ call writefile(lines, 'Xprofile_func.vim')
+ call system(v:progpath
+! \ . ' -es -u NONE -U NONE -i NONE --noplugin'
+! \ . ' -c "profile start Xprofile_func.log"'
+! \ . ' -c "profile func Foo*"'
+ \ . ' -c "so Xprofile_func.vim"'
+ \ . ' -c "qall!"')
+ call assert_equal(0, v:shell_error)
+--- 35,41 ----
+
+ call writefile(lines, 'Xprofile_func.vim')
+ call system(v:progpath
+! \ . ' -es --clean'
+ \ . ' -c "so Xprofile_func.vim"'
+ \ . ' -c "qall!"')
+ call assert_equal(0, v:shell_error)
+***************
+*** 97,103 ****
+
+ call writefile(lines, 'Xprofile_file.vim')
+ call system(v:progpath
+! \ . ' -es -u NONE -U NONE -i NONE --noplugin'
+ \ . ' -c "profile start Xprofile_file.log"'
+ \ . ' -c "profile file Xprofile_file.vim"'
+ \ . ' -c "so Xprofile_file.vim"'
+--- 97,103 ----
+
+ call writefile(lines, 'Xprofile_file.vim')
+ call system(v:progpath
+! \ . ' -es --clean'
+ \ . ' -c "profile start Xprofile_file.log"'
+ \ . ' -c "profile file Xprofile_file.vim"'
+ \ . ' -c "so Xprofile_file.vim"'
+***************
+*** 152,168 ****
+ let lines = readfile('Xprofile_file.log')
+ call assert_equal(11, len(lines))
+
+! call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0])
+! call assert_equal('Sourced 1 time', lines[1])
+! call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2])
+! call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
+! call assert_equal('', lines[4])
+! call assert_equal('count total (s) self (s)', lines[5])
+! call assert_match(' 1 0.\d\+ echo "hello', lines[6])
+! call assert_equal(' \ world"', lines[7])
+! call assert_match(' 1 0.\d\+ echo "foo ', lines[8])
+! call assert_equal(' \bar"', lines[9])
+! call assert_equal('', lines[10])
+
+ call delete('Xprofile_file.vim')
+ call delete('Xprofile_file.log')
+--- 152,168 ----
+ let lines = readfile('Xprofile_file.log')
+ call assert_equal(11, len(lines))
+
+! call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0])
+! call assert_equal('Sourced 1 time', lines[1])
+! call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2])
+! call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
+! call assert_equal('', lines[4])
+! call assert_equal('count total (s) self (s)', lines[5])
+! call assert_match(' 1 0.\d\+ echo "hello', lines[6])
+! call assert_equal(' \ world"', lines[7])
+! call assert_match(' 1 0.\d\+ echo "foo ', lines[8])
+! call assert_equal(' \bar"', lines[9])
+! call assert_equal('', lines[10])
+
+ call delete('Xprofile_file.vim')
+ call delete('Xprofile_file.log')
+***************
+*** 221,224 ****
+--- 221,294 ----
+
+ call delete('Xprofile_file.vim')
+ call delete('Xprofile_file.log')
++ endfunc
++
++ func Test_profdel_func()
++ let lines = [
++ \ 'profile start Xprofile_file.log',
++ \ 'func! Foo1()',
++ \ 'endfunc',
++ \ 'func! Foo2()',
++ \ 'endfunc',
++ \ 'func! Foo3()',
++ \ 'endfunc',
++ \ '',
++ \ 'profile func Foo1',
++ \ 'profile func Foo2',
++ \ 'call Foo1()',
++ \ 'call Foo2()',
++ \ '',
++ \ 'profile func Foo3',
++ \ 'profdel func Foo2',
++ \ 'profdel func Foo3',
++ \ 'call Foo1()',
++ \ 'call Foo2()',
++ \ 'call Foo3()' ]
++ call writefile(lines, 'Xprofile_file.vim')
++ call system(v:progpath . ' -es --clean -c "so Xprofile_file.vim" -c q')
++ call assert_equal(0, v:shell_error)
++
++ let lines = readfile('Xprofile_file.log')
++ call assert_equal(24, len(lines))
++
++ " Check that:
++ " - Foo1() is called twice (profdel not invoked)
++ " - Foo2() is called once (profdel invoked after it was called)
++ " - Foo3() is not called (profdel invoked before it was called)
++ call assert_equal('FUNCTION Foo1()', lines[0])
++ call assert_equal('Called 2 times', lines[1])
++ call assert_equal('FUNCTION Foo2()', lines[7])
++ call assert_equal('Called 1 time', lines[8])
++ call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[14])
++ call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[19])
++
++ call delete('Xprofile_file.vim')
++ call delete('Xprofile_file.log')
++ endfunc
++
++ func Test_profdel_star()
++ " Foo() is invoked once before and once after 'profdel *'.
++ " So profiling should report it only once.
++ let lines = [
++ \ 'profile start Xprofile_file.log',
++ \ 'func! Foo()',
++ \ 'endfunc',
++ \ 'profile func Foo',
++ \ 'call Foo()',
++ \ 'profdel *',
++ \ 'call Foo()' ]
++ call writefile(lines, 'Xprofile_file.vim')
++ call system(v:progpath . ' -es --clean -c "so Xprofile_file.vim" -c q')
++ call assert_equal(0, v:shell_error)
++
++ let lines = readfile('Xprofile_file.log')
++ call assert_equal(15, len(lines))
++
++ call assert_equal('FUNCTION Foo()', lines[0])
++ call assert_equal('Called 1 time', lines[1])
++ call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[7])
++ call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[11])
++
++ call delete('Xprofile_file.vim')
++ call delete('Xprofile_file.log')
+ endfunc
+*** ../vim-8.1.0130/src/version.c 2018-06-30 18:27:59.901025116 +0200
+--- src/version.c 2018-06-30 21:16:22.754692467 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 131,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+154. You fondle your mouse.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0132 b/data/vim/patches/8.1.0132
new file mode 100644
index 000000000..2271859db
--- /dev/null
+++ b/data/vim/patches/8.1.0132
@@ -0,0 +1,737 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0132
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0132
+Problem: Lua tests are old style.
+Solution: Convert to new style tests. Improve coverage. (Dominique Pelle,
+ closes #3091)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_vms.mms,
+ src/testdir/test85.in, src/testdir/test_lua.vim
+
+
+*** ../vim-8.1.0131/src/Makefile 2018-06-23 19:22:45.618486231 +0200
+--- src/Makefile 2018-06-30 21:22:17.965276852 +0200
+***************
+*** 2119,2125 ****
+ test52 test59 \
+ test64 test69 \
+ test70 test72 \
+! test85 test86 test87 test88 \
+ test94 test95 test99 test108:
+ cd testdir; rm -f $@.out; $(MAKE) -f Makefile $@.out VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
+
+--- 2119,2125 ----
+ test52 test59 \
+ test64 test69 \
+ test70 test72 \
+! test86 test87 test88 \
+ test94 test95 test99 test108:
+ cd testdir; rm -f $@.out; $(MAKE) -f Makefile $@.out VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
+
+*** ../vim-8.1.0131/src/testdir/Make_all.mak 2018-06-23 19:22:45.614486258 +0200
+--- src/testdir/Make_all.mak 2018-06-30 21:20:58.605620983 +0200
+***************
+*** 36,42 ****
+ SCRIPTS_MORE1 = \
+ test11.out \
+ test52.out \
+- test85.out \
+ test86.out \
+ test87.out
+
+--- 36,41 ----
+*** ../vim-8.1.0131/src/testdir/Make_amiga.mak 2017-11-02 20:58:54.000000000 +0100
+--- src/testdir/Make_amiga.mak 2018-06-30 21:20:58.605620983 +0200
+***************
+*** 14,20 ****
+ # test10 'errorformat' is different
+ # test11 "cat" doesn't work properly
+ # test52 only for Win32
+- # test85 no Lua interface
+ # test86, 87 no Python interface
+
+ SCRIPTS = $(SCRIPTS_ALL) $(SCRIPTS_MORE4)
+--- 14,19 ----
+*** ../vim-8.1.0131/src/testdir/Make_vms.mms 2018-01-31 19:23:08.000000000 +0100
+--- src/testdir/Make_vms.mms 2018-06-30 21:20:58.605620983 +0200
+***************
+*** 93,99 ****
+ #
+ # test72: bug - Vim hangs at :rename (while rename works well otherwise)
+ # test78: bug - Vim dies at :recover Xtest
+- # test85: no Lua interface
+ # test89: bug - findfile() does not work on VMS (just in the current directory)
+ # test102: Just ODS-5 supports space and special chars in the filename.
+ # On ODS-2 tests fail.
+--- 93,98 ----
+***************
+*** 119,127 ****
+ SCRIPT_MZSCH = test70.out
+ .ENDIF
+
+! .IFDEF HAVE_ODS5
+! SCRIPT_ODS5 = test102.out
+! .ENDIF
+
+ .IFDEF HAVE_GZIP
+ SCRIPT_GZIP = test11.out
+--- 118,126 ----
+ SCRIPT_MZSCH = test70.out
+ .ENDIF
+
+! .IFDEF HAVE_ODS5
+! SCRIPT_ODS5 = test102.out
+! .ENDIF
+
+ .IFDEF HAVE_GZIP
+ SCRIPT_GZIP = test11.out
+***************
+*** 131,140 ****
+ SCRIPT_GDIFF = test47.out
+ .ENDIF
+
+- .IFDEF HAVE_LUA
+- SCRIPT_LUA = test85.out
+- .ENDIF
+-
+ .IFDEF HAVE_PYTHON
+ SCRIPT_PYTHON = test86.out test87.out
+ .ENDIF
+--- 130,135 ----
+*** ../vim-8.1.0131/src/testdir/test85.in 2017-03-08 22:48:59.000000000 +0100
+--- src/testdir/test85.in 1970-01-01 01:00:00.000000000 +0100
+***************
+*** 1,86 ****
+- Test for Lua interface and luaeval() function
+-
+- STARTTEST
+- :so small.vim
+- :set belloff=all
+- :so lua.vim
+- :set nocompatible viminfo+=nviminfo
+- :lua l = vim.list():add"item0":add"dictionary with list OK":add"item2"
+- :lua h = vim.dict(); h.list = l
+- :call garbagecollect()
+- /^1
+- :" change buffer contents
+- :lua curbuf = vim.buffer()
+- :lua curline = vim.eval"line('.')"
+- :lua curbuf[curline] = "1 changed line 1"
+- :" scalar test
+- :let tmp_string = luaeval('"string"')
+- :let tmp_1000 = luaeval('1000')
+- :if printf("%s%.0f", 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 = luaeval("h").list[1]
+- :/^2/put =tmp
+- :" circular list (at the same time test lists containing lists)
+- :lua l[2] = l
+- :let l2 = luaeval("h").list
+- :if l2[2] == l2
+- :let res = "OK"
+- :else
+- :let res = "FAILED"
+- :endif
+- :call setline(search("^3"), "circular test " . res)
+-
+- :let l = []
+- :lua l = vim.eval("l")
+- :lua l:add(123)
+- :lua l:add("abc")
+- :lua l:add(vim.eval("[1, 2, 3]"))
+- :lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
+- :lua l:insert(123)
+- :lua l:insert("abc")
+- :lua l:insert(vim.eval("[1, 2, 3]"))
+- :lua l:insert(vim.eval("{'a':1, 'b':2, 'c':3}"))
+- :lua l[0] = l[0]
+- :lua l[1] = l[1]
+- :lua l[2] = l[2]
+- :lua l[3] = l[3]
+- :lua l[0] = 123
+- :lua l[1] = "abc"
+- :lua l[2] = vim.eval("[1, 2, 3]")
+- :lua l[3] = vim.eval("{'a':1, 'b':2, 'c':3}")
+- :lua l[3] = nil
+- :lua l[2] = nil
+- :lua l[1] = nil
+- :lua l[0] = nil
+- :lua l = nil
+- :$put =string(l)
+-
+- :let d = {}
+- :lua d = vim.eval("d")
+- :lua d[0] = 123
+- :lua d[1] = "abc"
+- :lua d[2] = vim.eval("[1, 2, 3]")
+- :lua d[3] = vim.eval("{'a':1, 'b':2, 'c':3}")
+- :lua d[4] = d[0]
+- :lua d[5] = d[1]
+- :lua d[6] = d[2]
+- :lua d[7] = d[3]
+- :lua d[3] = nil
+- :lua d[2] = nil
+- :lua d[1] = nil
+- :lua d[0] = nil
+- :lua d = nil
+- :$put =string(d)
+-
+- :?^1?,$w! test.out
+- :qa!
+- ENDTEST
+-
+- 1 line 1
+- 2 line 2
+- 3 line 3
+--- 0 ----
+*** ../vim-8.1.0131/src/testdir/test_lua.vim 2017-01-29 22:39:50.000000000 +0100
+--- src/testdir/test_lua.vim 2018-06-30 21:20:58.609620966 +0200
+***************
+*** 1,22 ****
+ " Tests for Lua.
+- " TODO: move tests from test85.in here.
+
+ if !has('lua')
+ finish
+ endif
+
+! func Test_luado()
+! new
+! call setline(1, ['one', 'two', 'three'])
+! luado vim.command("%d_")
+! bwipe!
+!
+! " Check switching to another buffer does not trigger ml_get error.
+ new
+ let wincount = winnr('$')
+ call setline(1, ['one', 'two', 'three'])
+ luado vim.command("new")
+ call assert_equal(wincount + 1, winnr('$'))
+ bwipe!
+ bwipe!
+ endfunc
+--- 1,494 ----
+ " Tests for Lua.
+
+ if !has('lua')
+ finish
+ endif
+
+! " Check that switching to another buffer does not trigger ml_get error.
+! func Test_command_new_no_ml_get_error()
+ new
+ let wincount = winnr('$')
+ call setline(1, ['one', 'two', 'three'])
+ luado vim.command("new")
+ call assert_equal(wincount + 1, winnr('$'))
++ %bwipe!
++ endfunc
++
++ " Test vim.command()
++ func Test_command()
++ new
++ call setline(1, ['one', 'two', 'three'])
++ luado vim.command("1,2d_")
++ call assert_equal(['three'], getline(1, '$'))
++ bwipe!
++ endfunc
++
++ " Test vim.eval()
++ func Test_eval()
++ " lua.eval with a number
++ lua v = vim.eval('123')
++ call assert_equal('number', luaeval('vim.type(v)'))
++ call assert_equal(123.0, luaeval('v'))
++
++ " lua.eval with a string
++ lua v = vim.eval('"abc"')
++ call assert_equal('string', luaeval('vim.type(v)'))
++ call assert_equal('abc', luaeval('v'))
++
++ " lua.eval with a list
++ lua v = vim.eval("['a']")
++ call assert_equal('list', luaeval('vim.type(v)'))
++ call assert_equal(['a'], luaeval('v'))
++
++ " lua.eval with a dict
++ lua v = vim.eval("{'a':'b'}")
++ call assert_equal('dict', luaeval('vim.type(v)'))
++ call assert_equal({'a':'b'}, luaeval('v'))
++
++ call assert_fails('lua v = vim.eval(nil)',
++ \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got nil)")
++ call assert_fails('lua v = vim.eval(true)',
++ \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got boolean)")
++ call assert_fails('lua v = vim.eval({})',
++ \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got table)")
++ call assert_fails('lua v = vim.eval(print)',
++ \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got function)")
++ call assert_fails('lua v = vim.eval(vim.buffer())',
++ \ "[string \"vim chunk\"]:1: bad argument #1 to 'eval' (string expected, got userdata)")
++
++ lua v = nil
++ endfunc
++
++ " Test vim.window()
++ func Test_window()
++ e Xfoo2
++ new Xfoo1
++
++ " Window 1 (top window) contains Xfoo1
++ " Window 2 (bottom window) contains Xfoo2
++ call assert_equal('Xfoo1', luaeval('vim.window(1):buffer().name'))
++ call assert_equal('Xfoo2', luaeval('vim.window(2):buffer().name'))
++
++ " Window 3 does not exist so vim.window(3) should return nil
++ call assert_equal('nil', luaeval('tostring(vim.window(3))'))
++
++ %bwipe!
++ endfunc
++
++ " Test vim.window().height
++ func Test_window_height()
++ new
++ lua vim.window().height = 2
++ call assert_equal(2, winheight(0))
++ lua vim.window().height = vim.window().height + 1
++ call assert_equal(3, winheight(0))
++ bwipe!
++ endfunc
++
++ " Test vim.window().width
++ func Test_window_width()
++ vert new
++ lua vim.window().width = 2
++ call assert_equal(2, winwidth(0))
++ lua vim.window().width = vim.window().width + 1
++ call assert_equal(3, winwidth(0))
++ bwipe!
++ endfunc
++
++ " Test vim.window().line and vim.window.col
++ func Test_window_line_col()
++ new
++ call setline(1, ['line1', 'line2', 'line3'])
++ lua vim.window().line = 2
++ lua vim.window().col = 4
++ call assert_equal([0, 2, 4, 0], getpos('.'))
++ lua vim.window().line = vim.window().line + 1
++ lua vim.window().col = vim.window().col - 1
++ call assert_equal([0, 3, 3, 0], getpos('.'))
++
++ call assert_fails('lua vim.window().line = 10',
++ \ '[string "vim chunk"]:1: line out of range')
++ bwipe!
++ endfunc
++
++ " Test setting the current window
++ func Test_window_set_current()
++ new Xfoo1
++ lua w1 = vim.window()
++ new Xfoo2
++ lua w2 = vim.window()
++
++ call assert_equal('Xfoo2', bufname('%'))
++ lua w1()
++ call assert_equal('Xfoo1', bufname('%'))
++ lua w2()
++ call assert_equal('Xfoo2', bufname('%'))
++
++ lua w1, w2 = nil, nil
++ %bwipe!
++ endfunc
++
++ " Test vim.window().buffer
++ func Test_window_buffer()
++ new Xfoo1
++ lua w1 = vim.window()
++ lua b1 = w1.buffer()
++ new Xfoo2
++ lua w2 = vim.window()
++ lua b2 = w2.buffer()
++
++ lua b1()
++ call assert_equal('Xfoo1', bufname('%'))
++ lua b2()
++ call assert_equal('Xfoo2', bufname('%'))
++
++ lua b1, b2 = nil, nil
++ %bwipe!
++ endfunc
++
++ " Test vim.window():previous() and vim.window():next()
++ func Test_window_next_previous()
++ new Xfoo1
++ new Xfoo2
++ new Xfoo3
++ wincmd j
++
++ call assert_equal('Xfoo2', luaeval('vim.window().buffer().name'))
++ call assert_equal('Xfoo1', luaeval('vim.window():next():buffer().name'))
++ call assert_equal('Xfoo3', luaeval('vim.window():previous():buffer().name'))
++
++ %bwipe!
++ endfunc
++
++ " Test vim.window():isvalid()
++ func Test_window_isvalid()
++ new Xfoo
++ lua w = vim.window()
++ call assert_true(luaeval('w:isvalid()'))
++
++ " FIXME: how to test the case when isvalid() returns v:false?
++ " isvalid() gives errors when the window is deleted. Is it a bug?
++
++ lua w = nil
++ bwipe!
++ endfunc
++
++ " Test vim.buffer() with and without argument
++ func Test_buffer()
++ new Xfoo1
++ let bn1 = bufnr('%')
++ new Xfoo2
++ let bn2 = bufnr('%')
++
++ " Test vim.buffer() without argument.
++ call assert_equal('Xfoo2', luaeval("vim.buffer().name"))
++
++ " Test vim.buffer() with string argument.
++ call assert_equal('Xfoo1', luaeval("vim.buffer('Xfoo1').name"))
++ call assert_equal('Xfoo2', luaeval("vim.buffer('Xfoo2').name"))
++
++ " Test vim.buffer() with integer argument.
++ call assert_equal('Xfoo1', luaeval("vim.buffer(" . bn1 . ").name"))
++ call assert_equal('Xfoo2', luaeval("vim.buffer(" . bn2 . ").name"))
++
++ lua bn1, bn2 = nil, nil
++ %bwipe!
++ endfunc
++
++ " Test vim.buffer().name and vim.buffer().fname
++ func Test_buffer_name()
++ new
++ " FIXME: for an unnamed buffer, I would expect
++ " vim.buffer().name to give an empty string, but
++ " it returns 0. Is it a bug?
++ " so this assert_equal is commented out.
++ " call assert_equal('', luaeval('vim.buffer().name'))
++ bwipe!
++
++ new Xfoo
++ call assert_equal('Xfoo', luaeval('vim.buffer().name'))
++ call assert_equal(expand('%:p'), luaeval('vim.buffer().fname'))
++ bwipe!
++ endfunc
++
++ " Test vim.buffer().number
++ func Test_buffer_number()
++ " All numbers in Lua are floating points number (no integers).
++ call assert_equal(bufnr('%'), float2nr(luaeval('vim.buffer().number')))
++ endfunc
++
++ " Test inserting lines in buffer.
++ func Test_buffer_insert()
++ new
++ lua vim.buffer()[1] = '3'
++ lua vim.buffer():insert('1', 0)
++ lua vim.buffer():insert('2', 1)
++ lua vim.buffer():insert('4', 10)
++
++ call assert_equal(['1', '2', '3', '4'], getline(1, '$'))
++ bwipe!
++ endfunc
++
++ " Test deleting line in buffer
++ func Test_buffer_delete()
++ new
++ call setline(1, ['1', '2', '3'])
++ lua vim.buffer()[2] = nil
++ call assert_equal(['1', '3'], getline(1, '$'))
++
++ call assert_fails('lua vim.buffer()[3] = nil',
++ \ '[string "vim chunk"]:1: invalid line number')
++ bwipe!
++ endfunc
++
++ " Test #vim.buffer() i.e. number of lines in buffer
++ func Test_buffer_number_lines()
++ new
++ call setline(1, ['a', 'b', 'c'])
++ call assert_equal(3.0, luaeval('#vim.buffer()'))
++ bwipe!
++ endfunc
++
++ " Test vim.buffer():next() and vim.buffer():previous()
++ " Note that these functions get the next or previous buffers
++ " but do not switch buffer.
++ func Test_buffer_next_previous()
++ new Xfoo1
++ new Xfoo2
++ new Xfoo3
++ b Xfoo2
++
++ lua bn = vim.buffer():next()
++ lua bp = vim.buffer():previous()
++
++ call assert_equal('Xfoo2', luaeval('vim.buffer().name'))
++ call assert_equal('Xfoo1', luaeval('bp.name'))
++ call assert_equal('Xfoo3', luaeval('bn.name'))
++
++ call assert_equal('Xfoo2', bufname('%'))
++
++ lua bn()
++ call assert_equal('Xfoo3', luaeval('vim.buffer().name'))
++ call assert_equal('Xfoo3', bufname('%'))
++
++ lua bp()
++ call assert_equal('Xfoo1', luaeval('vim.buffer().name'))
++ call assert_equal('Xfoo1', bufname('%'))
++
++ lua bn, bp = nil, nil
++ %bwipe!
++ endfunc
++
++ " Test vim.buffer():isvalid()
++ func Test_buffer_isvalid()
++ new Xfoo
++ lua b = vim.buffer()
++ call assert_true(luaeval('b:isvalid()'))
++
++ " FIXME: how to test the case when isvalid() returns v:false?
++ " isvalid() gives errors when the buffer is wiped. Is it a bug?
++
++ lua b = nil
+ bwipe!
++ endfunc
++
++ func Test_list()
++ call assert_equal([], luaeval('vim.list()'))
++
++ " Same example as in :help lua-vim.
++ " FIXME: test is disabled because it does not work.
++ " See https://github.com/vim/vim/issues/3086
++ " lua t = {math.pi, false, say = 'hi'}
++ " call assert_equal([3.141593, 0], luaeval('vim.list(t)'))
++
++ let l = []
++ lua l = vim.eval('l')
++ lua l:add(123)
++ lua l:add('abc')
++ lua l:add(true)
++ lua l:add(false)
++ lua l:add(vim.eval("[1, 2, 3]"))
++ lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
++ call assert_equal([123.0, 'abc', v:true, v:false, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
++ call assert_equal(6.0, luaeval('#l'))
++ call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
++
++ lua l[0] = 124
++ lua l[4] = nil
++ lua l:insert('first')
++ lua l:insert('xx', 3)
++ call assert_equal(['first', 124.0, 'abc', 'xx', v:true, v:false, {'a': 1, 'b': 2, 'c': 3}], l)
++
++ lua l = nil
++ endfunc
++
++ " Test l() i.e. iterator on list
++ func Test_list_iter()
++ lua l = vim.list():add('foo'):add('bar')
++ lua str = ''
++ lua for v in l() do str = str .. v end
++ call assert_equal('foobar', luaeval('str'))
++
++ lua str, v, l = nil, nil, nil
++ endfunc
++
++ func Test_recursive_list()
++ lua l = vim.list():add(1):add(2)
++ lua l = l:add(l)
++
++ call assert_equal(1.0, luaeval('l[0]'))
++ call assert_equal(2.0, luaeval('l[1]'))
++
++ call assert_equal(1.0, luaeval('l[2][0]'))
++ call assert_equal(2.0, luaeval('l[2][1]'))
++
++ call assert_equal(1.0, luaeval('l[2][2][0]'))
++ call assert_equal(2.0, luaeval('l[2][2][1]'))
++
++ call assert_equal('[1.0, 2.0, [...]]', string(luaeval('l')))
++
++ call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
++ call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])'))
++
++ call assert_equal(luaeval('l'), luaeval('l[2]'))
++ call assert_equal(luaeval('l'), luaeval('l[2][2]'))
++
++ lua l = nil
++ endfunc
++
++ func Test_dict()
++ call assert_equal({}, luaeval('vim.dict()'))
++
++ " Same example as in :help lua-vim.
++ " FIXME: test is disabled because it does not work.
++ " See https://github.com/vim/vim/issues/3086
++ " lua t = {math.pi, false, say = 'hi'}
++ " call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
++
++ let d = {}
++ lua d = vim.eval('d')
++ lua d[0] = 123
++ lua d[1] = "abc"
++ lua d[2] = true
++ lua d[3] = false
++ lua d[4] = vim.eval("[1, 2, 3]")
++ lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
++ call assert_equal({'0':123.0, '1':'abc', '2':v:true, '3':v:false, '4': [1, 2, 3], '5': {'a':1, 'b':2, 'c':3}}, d)
++ call assert_equal(6.0, luaeval('#d'))
++ call assert_match('^dict: 0x\x\+$', luaeval('tostring(d)'))
++
++ call assert_equal('abc', luaeval('d[1]'))
++
++ lua d[0] = 124
++ lua d[4] = nil
++ call assert_equal({'0':124.0, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d)
++
++ lua d = nil
++ endfunc
++
++ " Test d() i.e. iterator on dictionary
++ func Test_dict_iter()
++ let d = {'a': 1, 'b':2}
++ lua d = vim.eval('d')
++ lua str = ''
++ lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
++ call assert_equal('a:1,b:2,', luaeval('str'))
++
++ lua str, k, v, d = nil, nil, nil, nil
++ endfunc
++
++ " Test vim.type()
++ func Test_type()
++ " The following values are identical to Lua's type function.
++ call assert_equal('string', luaeval('vim.type("foo")'))
++ call assert_equal('number', luaeval('vim.type(1)'))
++ call assert_equal('number', luaeval('vim.type(1.2)'))
++ call assert_equal('function', luaeval('vim.type(print)'))
++ call assert_equal('table', luaeval('vim.type({})'))
++ call assert_equal('boolean', luaeval('vim.type(true)'))
++ call assert_equal('boolean', luaeval('vim.type(false)'))
++ call assert_equal('nil', luaeval('vim.type(nil)'))
++
++ " The following values are specific to Vim.
++ call assert_equal('window', luaeval('vim.type(vim.window())'))
++ call assert_equal('buffer', luaeval('vim.type(vim.buffer())'))
++ call assert_equal('list', luaeval('vim.type(vim.list())'))
++ call assert_equal('dict', luaeval('vim.type(vim.dict())'))
++ endfunc
++
++ " Test vim.open()
++ func Test_open()
++ call assert_notmatch('XOpen', execute('ls'))
++
++ " Open a buffer XOpen1, but do not jump to it.
++ lua b = vim.open('XOpen1')
++ call assert_equal('XOpen1', luaeval('b.name'))
++ call assert_equal('', bufname('%'))
++
++ call assert_match('XOpen1', execute('ls'))
++ call assert_notequal('XOpen2', bufname('%'))
++
++ " Open a buffer XOpen2 and jump to it.
++ lua b = vim.open('XOpen2')()
++ call assert_equal('XOpen2', luaeval('b.name'))
++ call assert_equal('XOpen2', bufname('%'))
++
++ lua b = nil
++ %bwipe!
++ endfunc
++
++ " Test vim.line()
++ func Test_line()
++ new
++ call setline(1, ['first line', 'second line'])
++ 1
++ call assert_equal('first line', luaeval('vim.line()'))
++ 2
++ call assert_equal('second line', luaeval('vim.line()'))
++ bwipe!
++ endfunc
++
++ " Test vim.beep()
++ func Test_beep()
++ call assert_beeps('lua vim.beep()')
++ endfunc
++
++ " Test errors in luaeval()
++ func Test_luaeval_error()
++ " Compile error
++ call assert_fails("call luaeval('-nil')",
++ \ '[string "luaeval"]:1: attempt to perform arithmetic on a nil value')
++ call assert_fails("call luaeval(']')",
++ \ "[string \"luaeval\"]:1: unexpected symbol near ']'")
++ endfunc
++
++ " Test :luafile foo.lua
++ func Test_luafile()
++ call delete('Xlua_file')
++ call writefile(["str = 'hello'", "num = 123.0" ], 'Xlua_file')
++ call setfperm('Xlua_file', 'r-xr-xr-x')
++
++ luafile Xlua_file
++ call assert_equal('hello', luaeval('str'))
++ call assert_equal(123.0, luaeval('num'))
++
++ lua str, num = nil, nil
++ call delete('Xlua_file')
++ endfunc
++
++ " Test :luafile %
++ func Test_luafile_percent()
++ new Xlua_file
++ append
++ str, num = 'foo', 321.0
++ print(string.format('str=%s, num=%d', str, num))
++ .
++ w!
++ luafile %
++ let msg = split(execute('message'), "\n")[-1]
++ call assert_equal('str=foo, num=321', msg)
++
++ lua str, num = nil, nil
++ call delete('Xlua_file')
+ bwipe!
+ endfunc
+*** ../vim-8.1.0131/src/version.c 2018-06-30 21:18:10.486300954 +0200
+--- src/version.c 2018-06-30 21:22:03.417340889 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 132,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+155. You forget to eat because you're too busy surfing the net.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0133 b/data/vim/patches/8.1.0133
new file mode 100644
index 000000000..b1f6d2253
--- /dev/null
+++ b/data/vim/patches/8.1.0133
@@ -0,0 +1,141 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0133
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0133
+Problem: tagfiles() can have duplicate entries.
+Solution: Simplify the filename to make checking for duplicates work better.
+ Add a test. (Dominique Pelle, closes #2979)
+Files: src/tag.c, src/testdir/test_taglist.vim
+
+
+*** ../vim-8.1.0132/src/tag.c 2018-04-27 22:44:39.000000000 +0200
+--- src/tag.c 2018-06-30 22:40:27.157629813 +0200
+***************
+*** 2595,2601 ****
+ }
+
+ static garray_T tag_fnames = GA_EMPTY;
+- static void found_tagfile_cb(char_u *fname, void *cookie);
+
+ /*
+ * Callback function for finding all "tags" and "tags-??" files in
+--- 2595,2600 ----
+***************
+*** 2605,2612 ****
+ found_tagfile_cb(char_u *fname, void *cookie UNUSED)
+ {
+ if (ga_grow(&tag_fnames, 1) == OK)
+! ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] =
+! vim_strsave(fname);
+ }
+
+ #if defined(EXITFREE) || defined(PROTO)
+--- 2604,2618 ----
+ found_tagfile_cb(char_u *fname, void *cookie UNUSED)
+ {
+ if (ga_grow(&tag_fnames, 1) == OK)
+! {
+! char_u *tag_fname = vim_strsave(fname);
+!
+! #ifdef BACKSLASH_IN_FILENAME
+! slash_adjust(tag_fname);
+! #endif
+! simplify_filename(tag_fname);
+! ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] = tag_fname;
+! }
+ }
+
+ #if defined(EXITFREE) || defined(PROTO)
+***************
+*** 2638,2643 ****
+--- 2644,2650 ----
+ {
+ char_u *fname = NULL;
+ char_u *r_ptr;
++ int i;
+
+ if (first)
+ vim_memset(tnp, 0, sizeof(tagname_T));
+***************
+*** 2679,2684 ****
+--- 2686,2699 ----
+ ++tnp->tn_hf_idx;
+ STRCPY(buf, p_hf);
+ STRCPY(gettail(buf), "tags");
++ #ifdef BACKSLASH_IN_FILENAME
++ slash_adjust(buf);
++ #endif
++ simplify_filename(buf);
++
++ for (i = 0; i < tag_fnames.ga_len; ++i)
++ if (STRCMP(buf, ((char_u **)(tag_fnames.ga_data))[i]) == 0)
++ return FAIL; // avoid duplicate file names
+ }
+ else
+ vim_strncpy(buf, ((char_u **)(tag_fnames.ga_data))[
+*** ../vim-8.1.0132/src/testdir/test_taglist.vim 2018-02-09 18:25:21.000000000 +0100
+--- src/testdir/test_taglist.vim 2018-06-30 22:33:05.044664951 +0200
+***************
+*** 1,4 ****
+! " test 'taglist' function and :tags command
+
+ func Test_taglist()
+ call writefile([
+--- 1,4 ----
+! " test taglist(), tagfiles() functions and :tags command
+
+ func Test_taglist()
+ call writefile([
+***************
+*** 61,63 ****
+--- 61,86 ----
+ call assert_fails('tag ' . repeat('x', 1020), 'E426')
+ tags
+ endfunc
++
++ func Test_tagfiles()
++ call assert_equal([], tagfiles())
++
++ call writefile(["FFoo\tXfoo\t1"], 'Xtags1')
++ call writefile(["FBar\tXbar\t1"], 'Xtags2')
++ set tags=Xtags1,Xtags2
++ call assert_equal(['Xtags1', 'Xtags2'], tagfiles())
++
++ help
++ let tf = tagfiles()
++ call assert_equal(1, len(tf))
++ call assert_equal(fnamemodify(expand('$VIMRUNTIME/doc/tags'), ':p:gs?\\?/?'),
++ \ fnamemodify(tf[0], ':p:gs?\\?/?'))
++ helpclose
++ call assert_equal(['Xtags1', 'Xtags2'], tagfiles())
++ set tags&
++ call assert_equal([], tagfiles())
++
++ call delete('Xtags1')
++ call delete('Xtags2')
++ bd
++ endfunc
+*** ../vim-8.1.0132/src/version.c 2018-06-30 21:50:16.856674912 +0200
+--- src/version.c 2018-06-30 22:33:36.756434678 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 133,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+158. You get a tuner card so you can watch TV while surfing.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0134 b/data/vim/patches/8.1.0134
new file mode 100644
index 000000000..ff07dfe27
--- /dev/null
+++ b/data/vim/patches/8.1.0134
@@ -0,0 +1,724 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0134
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0134
+Problem: Lua interface does not support funcref.
+Solution: Add funcref support. (Luis Carvalho)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+
+*** ../vim-8.1.0133/src/if_lua.c 2017-12-16 18:17:27.000000000 +0100
+--- src/if_lua.c 2018-07-01 14:49:42.013143173 +0200
+***************
+*** 28,37 ****
+--- 28,43 ----
+ typedef win_T *luaV_Window;
+ typedef dict_T *luaV_Dict;
+ typedef list_T *luaV_List;
++ typedef struct {
++ typval_T tv; // funcref
++ typval_T args;
++ dict_T *self; // selfdict
++ } luaV_Funcref;
+ typedef void (*msgfunc_T)(char_u *);
+
+ static const char LUAVIM_DICT[] = "dict";
+ static const char LUAVIM_LIST[] = "list";
++ static const char LUAVIM_FUNCREF[] = "funcref";
+ static const char LUAVIM_BUFFER[] = "buffer";
+ static const char LUAVIM_WINDOW[] = "window";
+ static const char LUAVIM_FREE[] = "luaV_free";
+***************
+*** 55,63 ****
+ if (sandbox) luaL_error((L), "not allowed in sandbox")
+ #define luaV_msg(L) luaV_msgfunc((L), (msgfunc_T) msg)
+ #define luaV_emsg(L) luaV_msgfunc((L), (msgfunc_T) emsg)
+!
+! static luaV_List *luaV_pushlist (lua_State *L, list_T *lis);
+! static luaV_Dict *luaV_pushdict (lua_State *L, dict_T *dic);
+
+ #if LUA_VERSION_NUM <= 501
+ #define luaV_openlib(L, l, n) luaL_openlib(L, NULL, l, n)
+--- 61,75 ----
+ if (sandbox) luaL_error((L), "not allowed in sandbox")
+ #define luaV_msg(L) luaV_msgfunc((L), (msgfunc_T) msg)
+ #define luaV_emsg(L) luaV_msgfunc((L), (msgfunc_T) emsg)
+! #define luaV_checktypval(L, a, v, msg) \
+! do { \
+! if (luaV_totypval(L, a, v) == FAIL) \
+! luaL_error(L, msg ": cannot convert value"); \
+! } while (0)
+!
+! static luaV_List *luaV_pushlist(lua_State *L, list_T *lis);
+! static luaV_Dict *luaV_pushdict(lua_State *L, dict_T *dic);
+! static luaV_Funcref *luaV_pushfuncref(lua_State *L, typval_T *tv);
+
+ #if LUA_VERSION_NUM <= 501
+ #define luaV_openlib(L, l, n) luaL_openlib(L, NULL, l, n)
+***************
+*** 506,521 ****
+ else
+ lua_pushnil(L);
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ }
+
+! /* converts lua value at 'pos' to typval 'tv' */
+! static void
+! luaV_totypval (lua_State *L, int pos, typval_T *tv)
+ {
+! switch(lua_type(L, pos)) {
+ case LUA_TBOOLEAN:
+ tv->v_type = VAR_SPECIAL;
+ tv->vval.v_number = (varnumber_T) lua_toboolean(L, pos);
+--- 518,542 ----
+ else
+ lua_pushnil(L);
+ break;
++ case VAR_FUNC:
++ luaV_pushfuncref(L, tv);
++ break;
+ default:
+ lua_pushnil(L);
+ }
+ }
+
+! /*
+! * Converts lua value at 'pos' to typval 'tv'.
+! * Returns OK or FAIL.
+! */
+! static int
+! luaV_totypval(lua_State *L, int pos, typval_T *tv)
+ {
+! int status = OK;
+!
+! switch (lua_type(L, pos))
+! {
+ case LUA_TBOOLEAN:
+ tv->v_type = VAR_SPECIAL;
+ tv->vval.v_number = (varnumber_T) lua_toboolean(L, pos);
+***************
+*** 533,540 ****
+ tv->vval.v_number = (varnumber_T) lua_tointeger(L, pos);
+ #endif
+ break;
+! case LUA_TUSERDATA: {
+ void *p = lua_touserdata(L, pos);
+ if (lua_getmetatable(L, pos)) /* has metatable? */
+ {
+ /* check list */
+--- 554,563 ----
+ tv->vval.v_number = (varnumber_T) lua_tointeger(L, pos);
+ #endif
+ break;
+! case LUA_TUSERDATA:
+! {
+ void *p = lua_touserdata(L, pos);
++
+ if (lua_getmetatable(L, pos)) /* has metatable? */
+ {
+ /* check list */
+***************
+*** 545,551 ****
+ tv->vval.v_list = *((luaV_List *) p);
+ ++tv->vval.v_list->lv_refcount;
+ lua_pop(L, 2); /* MTs */
+! return;
+ }
+ /* check dict */
+ luaV_getfield(L, LUAVIM_DICT);
+--- 568,574 ----
+ tv->vval.v_list = *((luaV_List *) p);
+ ++tv->vval.v_list->lv_refcount;
+ lua_pop(L, 2); /* MTs */
+! break;
+ }
+ /* check dict */
+ luaV_getfield(L, LUAVIM_DICT);
+***************
+*** 555,570 ****
+ tv->vval.v_dict = *((luaV_Dict *) p);
+ ++tv->vval.v_dict->dv_refcount;
+ lua_pop(L, 3); /* MTs */
+! return;
+ }
+! lua_pop(L, 3); /* MTs */
+ }
+- break;
+ }
+ default:
+ tv->v_type = VAR_NUMBER;
+ tv->vval.v_number = 0;
+ }
+ }
+
+ /* similar to luaL_addlstring, but replaces \0 with \n if toline and
+--- 578,604 ----
+ tv->vval.v_dict = *((luaV_Dict *) p);
+ ++tv->vval.v_dict->dv_refcount;
+ lua_pop(L, 3); /* MTs */
+! break;
+ }
+! /* check funcref */
+! luaV_getfield(L, LUAVIM_FUNCREF);
+! if (lua_rawequal(L, -1, -4))
+! {
+! luaV_Funcref *f = (luaV_Funcref *) p;
+! copy_tv(&f->tv, tv);
+! lua_pop(L, 4); /* MTs */
+! break;
+! }
+! lua_pop(L, 4); /* MTs */
+ }
+ }
++ /* FALLTHROUGH */
+ default:
+ tv->v_type = VAR_NUMBER;
+ tv->vval.v_number = 0;
++ status = FAIL;
+ }
++ return status;
+ }
+
+ /* similar to luaL_addlstring, but replaces \0 with \n if toline and
+***************
+*** 646,652 ****
+
+ #define luaV_pushtype(typ,tname,luatyp) \
+ static luatyp * \
+! luaV_push##tname (lua_State *L, typ *obj) \
+ { \
+ luatyp *o = NULL; \
+ if (obj == NULL) \
+--- 680,686 ----
+
+ #define luaV_pushtype(typ,tname,luatyp) \
+ static luatyp * \
+! luaV_push##tname(lua_State *L, typ *obj) \
+ { \
+ luatyp *o = NULL; \
+ if (obj == NULL) \
+***************
+*** 766,772 ****
+ else
+ {
+ typval_T v;
+! luaV_totypval(L, 3, &v);
+ clear_tv(&li->li_tv);
+ copy_tv(&v, &li->li_tv);
+ clear_tv(&v);
+--- 800,806 ----
+ else
+ {
+ typval_T v;
+! luaV_checktypval(L, 3, &v, "setting list item");
+ clear_tv(&li->li_tv);
+ copy_tv(&v, &li->li_tv);
+ clear_tv(&v);
+***************
+*** 783,793 ****
+ if (l->lv_lock)
+ luaL_error(L, "list is locked");
+ lua_settop(L, 2);
+! luaV_totypval(L, 2, &v);
+ if (list_append_tv(l, &v) == FAIL)
+ {
+ clear_tv(&v);
+! luaL_error(L, "Failed to add item to list");
+ }
+ clear_tv(&v);
+ lua_settop(L, 1);
+--- 817,827 ----
+ if (l->lv_lock)
+ luaL_error(L, "list is locked");
+ lua_settop(L, 2);
+! luaV_checktypval(L, 2, &v, "adding list item");
+ if (list_append_tv(l, &v) == FAIL)
+ {
+ clear_tv(&v);
+! luaL_error(L, "failed to add item to list");
+ }
+ clear_tv(&v);
+ lua_settop(L, 1);
+***************
+*** 811,821 ****
+ luaL_error(L, "invalid position");
+ }
+ lua_settop(L, 2);
+! luaV_totypval(L, 2, &v);
+ if (list_insert_tv(l, &v, li) == FAIL)
+ {
+ clear_tv(&v);
+! luaL_error(L, "Failed to add item to list");
+ }
+ clear_tv(&v);
+ lua_settop(L, 1);
+--- 845,855 ----
+ luaL_error(L, "invalid position");
+ }
+ lua_settop(L, 2);
+! luaV_checktypval(L, 2, &v, "inserting list item");
+ if (list_insert_tv(l, &v, li) == FAIL)
+ {
+ clear_tv(&v);
+! luaL_error(L, "failed to add item to list");
+ }
+ clear_tv(&v);
+ lua_settop(L, 1);
+***************
+*** 894,919 ****
+ }
+
+ static int
+! luaV_dict_index (lua_State *L)
+ {
+ dict_T *d = luaV_unbox(L, luaV_Dict, 1);
+ char_u *key = (char_u *) luaL_checkstring(L, 2);
+ dictitem_T *di = dict_find(d, key, -1);
+ if (di == NULL)
+ lua_pushnil(L);
+ else
+ luaV_pushtypval(L, &di->di_tv);
+ return 1;
+ }
+
+ static int
+! luaV_dict_newindex (lua_State *L)
+ {
+ dict_T *d = luaV_unbox(L, luaV_Dict, 1);
+ char_u *key = (char_u *) luaL_checkstring(L, 2);
+ dictitem_T *di;
+ if (d->dv_lock)
+ luaL_error(L, "dict is locked");
+ di = dict_find(d, key, -1);
+ if (di == NULL) /* non-existing key? */
+ {
+--- 928,970 ----
+ }
+
+ static int
+! luaV_dict_index(lua_State *L)
+ {
+ dict_T *d = luaV_unbox(L, luaV_Dict, 1);
+ char_u *key = (char_u *) luaL_checkstring(L, 2);
+ dictitem_T *di = dict_find(d, key, -1);
++
+ if (di == NULL)
+ lua_pushnil(L);
+ else
++ {
+ luaV_pushtypval(L, &di->di_tv);
++ if (di->di_tv.v_type == VAR_FUNC) /* funcref? */
++ {
++ luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, -1);
++ f->self = d; /* keep "self" reference */
++ d->dv_refcount++;
++ }
++ }
+ return 1;
+ }
+
+ static int
+! luaV_dict_newindex(lua_State *L)
+ {
+ dict_T *d = luaV_unbox(L, luaV_Dict, 1);
+ char_u *key = (char_u *) luaL_checkstring(L, 2);
+ dictitem_T *di;
++ typval_T v;
+ if (d->dv_lock)
+ luaL_error(L, "dict is locked");
++ if (key != NULL && *key == NUL)
++ luaL_error(L, "empty key");
++ if (!lua_isnil(L, 3)) { /* read value? */
++ luaV_checktypval(L, 3, &v, "setting dict item");
++ if (d->dv_scope == VAR_DEF_SCOPE && v.v_type == VAR_FUNC)
++ luaL_error(L, "cannot assign funcref to builtin scope");
++ }
+ di = dict_find(d, key, -1);
+ if (di == NULL) /* non-existing key? */
+ {
+***************
+*** 934,942 ****
+ hash_remove(&d->dv_hashtab, hi);
+ dictitem_free(di);
+ }
+! else {
+! typval_T v;
+! luaV_totypval(L, 3, &v);
+ copy_tv(&v, &di->di_tv);
+ clear_tv(&v);
+ }
+--- 985,992 ----
+ hash_remove(&d->dv_hashtab, hi);
+ dictitem_free(di);
+ }
+! else
+! {
+ copy_tv(&v, &di->di_tv);
+ clear_tv(&v);
+ }
+***************
+*** 953,958 ****
+--- 1003,1094 ----
+ };
+
+
++ /* ======= Funcref type ======= */
++
++ static luaV_Funcref *
++ luaV_newfuncref(lua_State *L, char_u *name)
++ {
++ luaV_Funcref *f = (luaV_Funcref *)lua_newuserdata(L, sizeof(luaV_Funcref));
++
++ if (name != NULL)
++ {
++ func_ref(name); /* as in copy_tv */
++ f->tv.vval.v_string = vim_strsave(name);
++ }
++ f->tv.v_type = VAR_FUNC;
++ f->args.v_type = VAR_LIST;
++ f->self = NULL;
++ luaV_getfield(L, LUAVIM_FUNCREF);
++ lua_setmetatable(L, -2);
++ return f;
++ }
++
++ static luaV_Funcref *
++ luaV_pushfuncref(lua_State *L, typval_T *tv)
++ {
++ luaV_Funcref *f = luaV_newfuncref(L, NULL);
++ copy_tv(tv, &f->tv);
++ clear_tv(tv);
++ return f;
++ }
++
++
++ luaV_type_tostring(funcref, LUAVIM_FUNCREF)
++
++ static int
++ luaV_funcref_gc(lua_State *L)
++ {
++ luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, 1);
++
++ func_unref(f->tv.vval.v_string);
++ vim_free(f->tv.vval.v_string);
++ dict_unref(f->self);
++ return 0;
++ }
++
++ /* equivalent to string(funcref) */
++ static int
++ luaV_funcref_len(lua_State *L)
++ {
++ luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, 1);
++
++ lua_pushstring(L, (const char *) f->tv.vval.v_string);
++ return 1;
++ }
++
++ static int
++ luaV_funcref_call(lua_State *L)
++ {
++ luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, 1);
++ int i, n = lua_gettop(L) - 1; /* #args */
++ int status;
++ typval_T v, rettv;
++
++ f->args.vval.v_list = list_alloc();
++ rettv.v_type = VAR_UNKNOWN; /* as in clear_tv */
++ for (i = 0; i < n; i++) {
++ luaV_checktypval(L, i + 2, &v, "calling funcref");
++ list_append_tv(f->args.vval.v_list, &v);
++ }
++ status = func_call(f->tv.vval.v_string, &f->args, NULL, f->self, &rettv);
++ if (status == OK)
++ luaV_pushtypval(L, &rettv);
++ clear_tv(&f->args);
++ clear_tv(&rettv);
++ if (status != OK)
++ luaL_error(L, "cannot call funcref");
++ return 1;
++ }
++
++ static const luaL_Reg luaV_Funcref_mt[] = {
++ {"__tostring", luaV_funcref_tostring},
++ {"__gc", luaV_funcref_gc},
++ {"__len", luaV_funcref_len},
++ {"__call", luaV_funcref_call},
++ {NULL, NULL}
++ };
++
++
+ /* ======= Buffer type ======= */
+
+ luaV_newtype(buf_T, buffer, luaV_Buffer, LUAVIM_BUFFER)
+***************
+*** 1033,1039 ****
+ curbuf = buf;
+ luaL_error(L, "cannot delete line");
+ }
+! else {
+ deleted_lines_mark(n, 1L);
+ if (b == curwin->w_buffer) /* fix cursor in current window? */
+ {
+--- 1169,1176 ----
+ curbuf = buf;
+ luaL_error(L, "cannot delete line");
+ }
+! else
+! {
+ deleted_lines_mark(n, 1L);
+ if (b == curwin->w_buffer) /* fix cursor in current window? */
+ {
+***************
+*** 1371,1392 ****
+ static int
+ luaV_list(lua_State *L)
+ {
+! list_T *l = list_alloc();
+ if (l == NULL)
+ lua_pushnil(L);
+ else
+ luaV_newlist(L, l);
+ return 1;
+ }
+
+ static int
+ luaV_dict(lua_State *L)
+ {
+! dict_T *d = dict_alloc();
+ if (d == NULL)
+ lua_pushnil(L);
+ else
+ luaV_newdict(L, d);
+ return 1;
+ }
+
+--- 1508,1591 ----
+ static int
+ luaV_list(lua_State *L)
+ {
+! list_T *l;
+! int initarg = !lua_isnoneornil(L, 1);
+!
+! if (initarg && lua_type(L, 1) != LUA_TTABLE)
+! luaL_error(L, "table expected, got %s", luaL_typename(L, 1));
+! l = list_alloc();
+ if (l == NULL)
+ lua_pushnil(L);
+ else
++ {
+ luaV_newlist(L, l);
++ if (initarg) { /* traverse table to init dict */
++ int notnil, i = 0;
++ typval_T v;
++ do {
++ lua_rawgeti(L, 1, ++i);
++ notnil = !lua_isnil(L, -1);
++ if (notnil) {
++ luaV_checktypval(L, -1, &v, "vim.list");
++ list_append_tv(l, &v);
++ }
++ lua_pop(L, 1); /* value */
++ } while (notnil);
++ }
++ }
+ return 1;
+ }
+
+ static int
+ luaV_dict(lua_State *L)
+ {
+! dict_T *d;
+! int initarg = !lua_isnoneornil(L, 1);
+!
+! if (initarg && lua_type(L, 1) != LUA_TTABLE)
+! luaL_error(L, "table expected, got %s", luaL_typename(L, 1));
+! d = dict_alloc();
+ if (d == NULL)
+ lua_pushnil(L);
+ else
++ {
+ luaV_newdict(L, d);
++ if (initarg) /* traverse table to init dict */
++ {
++ lua_pushnil(L);
++ while (lua_next(L, 1))
++ {
++ char_u *key;
++ dictitem_T *di;
++ typval_T v;
++ lua_pushvalue(L, -2); /* dup key in case it's a number */
++ key = (char_u *) lua_tostring(L, -1);
++ if (key != NULL && *key == NUL)
++ luaL_error(L, "table has empty key");
++ luaV_checktypval(L, -2, &v, "vim.dict"); /* value */
++ di = dictitem_alloc(key);
++ if (di == NULL || dict_add(d, di) == FAIL) {
++ vim_free(di);
++ lua_pushnil(L);
++ return 1;
++ }
++ copy_tv(&v, &di->di_tv);
++ clear_tv(&v);
++ lua_pop(L, 2); /* key copy and value */
++ }
++ }
++ }
++ return 1;
++ }
++
++ static int
++ luaV_funcref(lua_State *L)
++ {
++ const char *name = luaL_checkstring(L, 1);
++ /* note: not checking if function exists (needs function_exists) */
++ if (name == NULL || *name == NUL || VIM_ISDIGIT(*name))
++ luaL_error(L, "invalid function name: %s", name);
++ luaV_newfuncref(L, (char_u *) name);
+ return 1;
+ }
+
+***************
+*** 1402,1408 ****
+ FOR_ALL_BUFFERS(buf)
+ if (buf->b_fnum == n) break;
+ }
+! else { /* by name */
+ size_t l;
+ const char *s = lua_tolstring(L, 1, &l);
+ FOR_ALL_BUFFERS(buf)
+--- 1601,1608 ----
+ FOR_ALL_BUFFERS(buf)
+ if (buf->b_fnum == n) break;
+ }
+! else // by name
+! {
+ size_t l;
+ const char *s = lua_tolstring(L, 1, &l);
+ FOR_ALL_BUFFERS(buf)
+***************
+*** 1472,1477 ****
+--- 1672,1683 ----
+ lua_pushstring(L, "dict");
+ return 1;
+ }
++ luaV_getfield(L, LUAVIM_FUNCREF);
++ if (lua_rawequal(L, -1, 2))
++ {
++ lua_pushstring(L, "funcref");
++ return 1;
++ }
+ luaV_getfield(L, LUAVIM_BUFFER);
+ if (lua_rawequal(L, -1, 2))
+ {
+***************
+*** 1497,1502 ****
+--- 1703,1709 ----
+ {"line", luaV_line},
+ {"list", luaV_list},
+ {"dict", luaV_dict},
++ {"funcref", luaV_funcref},
+ {"buffer", luaV_buffer},
+ {"window", luaV_window},
+ {"open", luaV_open},
+***************
+*** 1537,1543 ****
+ luaV_emsg(L);
+ return 0;
+ }
+! luaV_totypval(L, -1, rettv);
+ return 0;
+ }
+
+--- 1744,1751 ----
+ luaV_emsg(L);
+ return 0;
+ }
+! if (luaV_totypval(L, -1, rettv) == FAIL)
+! EMSG("luaeval: cannot convert value");
+ return 0;
+ }
+
+***************
+*** 1612,1617 ****
+--- 1820,1828 ----
+ luaV_newmetatable(L, LUAVIM_DICT);
+ lua_pushvalue(L, 1);
+ luaV_openlib(L, luaV_Dict_mt, 1);
++ luaV_newmetatable(L, LUAVIM_FUNCREF);
++ lua_pushvalue(L, 1);
++ luaV_openlib(L, luaV_Funcref_mt, 1);
+ luaV_newmetatable(L, LUAVIM_BUFFER);
+ lua_pushvalue(L, 1); /* cache table */
+ luaV_openlib(L, luaV_Buffer_mt, 1);
+*** ../vim-8.1.0133/src/testdir/test_lua.vim 2018-06-30 21:50:16.856674912 +0200
+--- src/testdir/test_lua.vim 2018-07-01 15:00:55.884371772 +0200
+***************
+*** 397,402 ****
+--- 397,425 ----
+ lua str, k, v, d = nil, nil, nil, nil
+ endfunc
+
++ func Test_funcref()
++ function I(x)
++ return a:x
++ endfunction
++ let R = function('I')
++ lua i1 = vim.funcref"I"
++ lua i2 = vim.eval"R"
++ lua msg = "funcref|test|" .. (#i2(i1) == #i1(i2) and "OK" or "FAIL")
++ lua msg = vim.funcref"tr"(msg, "|", " ")
++ call assert_equal("funcref test OK", luaeval('msg'))
++
++ " dict funcref
++ function Mylen() dict
++ return len(self.data)
++ endfunction
++ let l = [0, 1, 2, 3]
++ let mydict = {'data': l}
++ lua d = vim.eval"mydict"
++ lua d.len = vim.funcref"Mylen" -- assign d as 'self'
++ lua res = (d.len() == vim.funcref"len"(vim.eval"l")) and "OK" or "FAIL"
++ call assert_equal("OK", luaeval('res'))
++ endfunc
++
+ " Test vim.type()
+ func Test_type()
+ " The following values are identical to Lua's type function.
+***************
+*** 414,419 ****
+--- 437,443 ----
+ call assert_equal('buffer', luaeval('vim.type(vim.buffer())'))
+ call assert_equal('list', luaeval('vim.type(vim.list())'))
+ call assert_equal('dict', luaeval('vim.type(vim.dict())'))
++ call assert_equal('funcref', luaeval('vim.type(vim.funcref("Test_type"))'))
+ endfunc
+
+ " Test vim.open()
+*** ../vim-8.1.0133/src/version.c 2018-06-30 22:40:39.097551835 +0200
+--- src/version.c 2018-07-01 15:01:56.939951330 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 134,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+162. You go outside and look for a brightness knob to turn down the sun.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0135 b/data/vim/patches/8.1.0135
new file mode 100644
index 000000000..f12030c9f
--- /dev/null
+++ b/data/vim/patches/8.1.0135
@@ -0,0 +1,95 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0135
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0135
+Problem: Undo message delays screen update for CTRL-O u.
+Solution: Add smsg_attr_keep(). (closes #3125)
+Files: src/message.c, src/proto.h, src/undo.c
+
+
+*** ../vim-8.1.0134/src/message.c 2018-06-28 14:54:38.764565527 +0200
+--- src/message.c 2018-07-01 16:35:40.549594202 +0200
+***************
+*** 399,404 ****
+--- 399,418 ----
+ return msg_attr(IObuff, attr);
+ }
+
++ int
++ # ifdef __BORLANDC__
++ _RTLENTRYF
++ # endif
++ smsg_attr_keep(int attr, char_u *s, ...)
++ {
++ va_list arglist;
++
++ va_start(arglist, s);
++ vim_vsnprintf((char *)IObuff, IOSIZE, (char *)s, arglist);
++ va_end(arglist);
++ return msg_attr_keep(IObuff, attr, TRUE);
++ }
++
+ #endif
+
+ /*
+*** ../vim-8.1.0134/src/proto.h 2018-04-10 12:40:16.000000000 +0200
+--- src/proto.h 2018-07-01 16:37:05.753116076 +0200
+***************
+*** 119,124 ****
+--- 119,130 ----
+ # ifdef __BORLANDC__
+ _RTLENTRYF
+ # endif
++ smsg_attr_keep(int, char_u *, ...);
++
++ int
++ # ifdef __BORLANDC__
++ _RTLENTRYF
++ # endif
+ vim_snprintf_add(char *, size_t, char *, ...)
+ #ifdef USE_PRINTF_FORMAT_ATTRIBUTE
+ __attribute__((format(printf, 3, 4)))
+*** ../vim-8.1.0134/src/undo.c 2018-06-20 22:37:52.658911284 +0200
+--- src/undo.c 2018-07-01 16:37:22.233023025 +0200
+***************
+*** 2968,2974 ****
+ }
+ #endif
+
+! smsg((char_u *)_("%ld %s; %s #%ld %s"),
+ u_oldcount < 0 ? -u_oldcount : u_oldcount,
+ _(msgstr),
+ did_undo ? _("before") : _("after"),
+--- 2968,2974 ----
+ }
+ #endif
+
+! smsg_attr_keep(0, (char_u *)_("%ld %s; %s #%ld %s"),
+ u_oldcount < 0 ? -u_oldcount : u_oldcount,
+ _(msgstr),
+ did_undo ? _("before") : _("after"),
+*** ../vim-8.1.0134/src/version.c 2018-07-01 15:12:00.224057865 +0200
+--- src/version.c 2018-07-01 16:43:21.810957974 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 135,
+ /**/
+
+
+--
+hundred-and-one symptoms of being an internet addict:
+164. You got out to buy software, instead of going out for a beer.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0136 b/data/vim/patches/8.1.0136
new file mode 100644
index 000000000..659431504
--- /dev/null
+++ b/data/vim/patches/8.1.0136
@@ -0,0 +1,342 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0136
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0136
+Problem: Lua tests don't cover new features.
+Solution: Add more tests. (Dominique Pelle, closes #3130)
+Files: runtime/doc/if_lua.txt, src/testdir/test_lua.vim
+
+
+*** ../vim-8.1.0135/runtime/doc/if_lua.txt 2018-05-17 13:41:41.000000000 +0200
+--- runtime/doc/if_lua.txt 2018-07-01 19:45:39.183210699 +0200
+***************
+*** 127,133 ****
+ rules. Example: >
+ :lua t = {math.pi, false, say = 'hi'}
+ :echo luaeval('vim.list(t)')
+! :" [3.141593, 0], 'say' is ignored
+ <
+ vim.dict([arg]) Returns an empty dictionary or, if "arg" is a
+ Lua table, returns a dict d such that d[k] =
+--- 127,133 ----
+ rules. Example: >
+ :lua t = {math.pi, false, say = 'hi'}
+ :echo luaeval('vim.list(t)')
+! :" [3.141593, v:false], 'say' is ignored
+ <
+ vim.dict([arg]) Returns an empty dictionary or, if "arg" is a
+ Lua table, returns a dict d such that d[k] =
+***************
+*** 141,148 ****
+ :" {'say': 'hi'}, numeric keys ignored
+ <
+ vim.funcref({name}) Returns a Funcref to function {name} (see
+! |Funcref|). It is equivalent to Vim's
+! "function". NOT IMPLEMENTED YET
+
+ vim.buffer([arg]) If "arg" is a number, returns buffer with
+ number "arg" in the buffer list or, if "arg"
+--- 141,147 ----
+ :" {'say': 'hi'}, numeric keys ignored
+ <
+ vim.funcref({name}) Returns a Funcref to function {name} (see
+! |Funcref|). It is equivalent to Vim's function().
+
+ vim.buffer([arg]) If "arg" is a number, returns buffer with
+ number "arg" in the buffer list or, if "arg"
+***************
+*** 166,172 ****
+ or window, respectively. Examples: >
+ :lua l = vim.list()
+ :lua print(type(l), vim.type(l))
+! :" userdata list
+ <
+ vim.command({cmd}) Executes the vim (ex-mode) command {cmd}.
+ Examples: >
+--- 165,171 ----
+ or window, respectively. Examples: >
+ :lua l = vim.list()
+ :lua print(type(l), vim.type(l))
+! :" list
+ <
+ vim.command({cmd}) Executes the vim (ex-mode) command {cmd}.
+ Examples: >
+*** ../vim-8.1.0135/src/testdir/test_lua.vim 2018-07-01 15:12:00.224057865 +0200
+--- src/testdir/test_lua.vim 2018-07-01 19:45:39.183210699 +0200
+***************
+*** 124,130 ****
+ lua w2()
+ call assert_equal('Xfoo2', bufname('%'))
+
+! lua w1, w2 = nil, nil
+ %bwipe!
+ endfunc
+
+--- 124,130 ----
+ lua w2()
+ call assert_equal('Xfoo2', bufname('%'))
+
+! lua w1, w2 = nil
+ %bwipe!
+ endfunc
+
+***************
+*** 142,148 ****
+ lua b2()
+ call assert_equal('Xfoo2', bufname('%'))
+
+! lua b1, b2 = nil, nil
+ %bwipe!
+ endfunc
+
+--- 142,148 ----
+ lua b2()
+ call assert_equal('Xfoo2', bufname('%'))
+
+! lua b1, b2, w1, w2 = nil
+ %bwipe!
+ endfunc
+
+***************
+*** 191,197 ****
+ call assert_equal('Xfoo1', luaeval("vim.buffer(" . bn1 . ").name"))
+ call assert_equal('Xfoo2', luaeval("vim.buffer(" . bn2 . ").name"))
+
+! lua bn1, bn2 = nil, nil
+ %bwipe!
+ endfunc
+
+--- 191,197 ----
+ call assert_equal('Xfoo1', luaeval("vim.buffer(" . bn1 . ").name"))
+ call assert_equal('Xfoo2', luaeval("vim.buffer(" . bn2 . ").name"))
+
+! lua bn1, bn2 = nil
+ %bwipe!
+ endfunc
+
+***************
+*** 275,281 ****
+ call assert_equal('Xfoo1', luaeval('vim.buffer().name'))
+ call assert_equal('Xfoo1', bufname('%'))
+
+! lua bn, bp = nil, nil
+ %bwipe!
+ endfunc
+
+--- 275,281 ----
+ call assert_equal('Xfoo1', luaeval('vim.buffer().name'))
+ call assert_equal('Xfoo1', bufname('%'))
+
+! lua bn, bp = nil
+ %bwipe!
+ endfunc
+
+***************
+*** 295,306 ****
+ func Test_list()
+ call assert_equal([], luaeval('vim.list()'))
+
+- " Same example as in :help lua-vim.
+- " FIXME: test is disabled because it does not work.
+- " See https://github.com/vim/vim/issues/3086
+- " lua t = {math.pi, false, say = 'hi'}
+- " call assert_equal([3.141593, 0], luaeval('vim.list(t)'))
+-
+ let l = []
+ lua l = vim.eval('l')
+ lua l:add(123)
+--- 295,300 ----
+***************
+*** 319,327 ****
+--- 313,338 ----
+ lua l:insert('xx', 3)
+ call assert_equal(['first', 124.0, 'abc', 'xx', v:true, v:false, {'a': 1, 'b': 2, 'c': 3}], l)
+
++ lockvar 1 l
++ call assert_fails('lua l:add("x")', '[string "vim chunk"]:1: list is locked')
++
+ lua l = nil
+ endfunc
+
++ func Test_list_table()
++ " See :help lua-vim
++ " Non-numeric keys should not be used to initialize the list
++ " so say = 'hi' should be ignored.
++ lua t = {3.14, 'hello', false, true, say = 'hi'}
++ call assert_equal([3.14, 'hello', v:false, v:true], luaeval('vim.list(t)'))
++ lua t = nil
++
++ call assert_fails('lua vim.list(1)', '[string "vim chunk"]:1: table expected, got number')
++ call assert_fails('lua vim.list("x")', '[string "vim chunk"]:1: table expected, got string')
++ call assert_fails('lua vim.list(print)', '[string "vim chunk"]:1: table expected, got function')
++ call assert_fails('lua vim.list(true)', '[string "vim chunk"]:1: table expected, got boolean')
++ endfunc
++
+ " Test l() i.e. iterator on list
+ func Test_list_iter()
+ lua l = vim.list():add('foo'):add('bar')
+***************
+*** 329,335 ****
+ lua for v in l() do str = str .. v end
+ call assert_equal('foobar', luaeval('str'))
+
+! lua str, v, l = nil, nil, nil
+ endfunc
+
+ func Test_recursive_list()
+--- 340,346 ----
+ lua for v in l() do str = str .. v end
+ call assert_equal('foobar', luaeval('str'))
+
+! lua str, l = nil
+ endfunc
+
+ func Test_recursive_list()
+***************
+*** 359,370 ****
+ func Test_dict()
+ call assert_equal({}, luaeval('vim.dict()'))
+
+- " Same example as in :help lua-vim.
+- " FIXME: test is disabled because it does not work.
+- " See https://github.com/vim/vim/issues/3086
+- " lua t = {math.pi, false, say = 'hi'}
+- " call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
+-
+ let d = {}
+ lua d = vim.eval('d')
+ lua d[0] = 123
+--- 370,375 ----
+***************
+*** 383,391 ****
+--- 388,419 ----
+ lua d[4] = nil
+ call assert_equal({'0':124.0, '1':'abc', '2':v:true, '3':v:false, '5': {'a':1, 'b':2, 'c':3}}, d)
+
++ lockvar 1 d
++ call assert_fails('lua d[6] = 1', '[string "vim chunk"]:1: dict is locked')
++
+ lua d = nil
+ endfunc
+
++ func Test_dict_table()
++ lua t = {key1 = 'x', key2 = 3.14, key3 = true, key4 = false}
++ call assert_equal({'key1': 'x', 'key2': 3.14, 'key3': v:true, 'key4': v:false},
++ \ luaeval('vim.dict(t)'))
++
++ " Same example as in :help lua-vim.
++ lua t = {math.pi, false, say = 'hi'}
++ " FIXME: commented out as it currently does not work as documented:
++ " Expected {'say': 'hi'}
++ " but got {'1': 3.141593, '2': v:false, 'say': 'hi'}
++ " Is the documentation or the code wrong?
++ "call assert_equal({'say' : 'hi'}, luaeval('vim.dict(t)'))
++ lua t = nil
++
++ call assert_fails('lua vim.dict(1)', '[string "vim chunk"]:1: table expected, got number')
++ call assert_fails('lua vim.dict("x")', '[string "vim chunk"]:1: table expected, got string')
++ call assert_fails('lua vim.dict(print)', '[string "vim chunk"]:1: table expected, got function')
++ call assert_fails('lua vim.dict(true)', '[string "vim chunk"]:1: table expected, got boolean')
++ endfunc
++
+ " Test d() i.e. iterator on dictionary
+ func Test_dict_iter()
+ let d = {'a': 1, 'b':2}
+***************
+*** 394,400 ****
+ lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
+ call assert_equal('a:1,b:2,', luaeval('str'))
+
+! lua str, k, v, d = nil, nil, nil, nil
+ endfunc
+
+ func Test_funcref()
+--- 422,428 ----
+ lua for k,v in d() do str = str .. k ..':' .. v .. ',' end
+ call assert_equal('a:1,b:2,', luaeval('str'))
+
+! lua str, d = nil
+ endfunc
+
+ func Test_funcref()
+***************
+*** 418,423 ****
+--- 446,453 ----
+ lua d.len = vim.funcref"Mylen" -- assign d as 'self'
+ lua res = (d.len() == vim.funcref"len"(vim.eval"l")) and "OK" or "FAIL"
+ call assert_equal("OK", luaeval('res'))
++
++ lua i1, i2, msg, d, res = nil
+ endfunc
+
+ " Test vim.type()
+***************
+*** 496,502 ****
+ call assert_equal('hello', luaeval('str'))
+ call assert_equal(123.0, luaeval('num'))
+
+! lua str, num = nil, nil
+ call delete('Xlua_file')
+ endfunc
+
+--- 526,532 ----
+ call assert_equal('hello', luaeval('str'))
+ call assert_equal(123.0, luaeval('num'))
+
+! lua str, num = nil
+ call delete('Xlua_file')
+ endfunc
+
+***************
+*** 512,518 ****
+ let msg = split(execute('message'), "\n")[-1]
+ call assert_equal('str=foo, num=321', msg)
+
+! lua str, num = nil, nil
+ call delete('Xlua_file')
+ bwipe!
+ endfunc
+--- 542,560 ----
+ let msg = split(execute('message'), "\n")[-1]
+ call assert_equal('str=foo, num=321', msg)
+
+! lua str, num = nil
+! call delete('Xlua_file')
+! bwipe!
+! endfunc
+!
+! " Test :luafile with syntax error
+! func Test_luafile_error()
+! new Xlua_file
+! call writefile(['nil = 0' ], 'Xlua_file')
+! call setfperm('Xlua_file', 'r-xr-xr-x')
+!
+! call assert_fails('luafile Xlua_file', "Xlua_file:1: unexpected symbol near 'nil'")
+!
+ call delete('Xlua_file')
+ bwipe!
+ endfunc
+*** ../vim-8.1.0135/src/version.c 2018-07-01 16:43:59.850736541 +0200
+--- src/version.c 2018-07-01 19:47:47.126402301 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 136,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+165. You have a web page burned into your glasses
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0137 b/data/vim/patches/8.1.0137
new file mode 100644
index 000000000..22e45b23d
--- /dev/null
+++ b/data/vim/patches/8.1.0137
@@ -0,0 +1,137 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0137
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0137
+Problem: CI does not run with TCL.
+Solution: Add TCL to the travis config. (Dominique Pelle, closes #3133)
+Files: .travis.yml
+
+
+*** ../vim-8.1.0136/.travis.yml 2018-04-12 20:05:02.000000000 +0200
+--- .travis.yml 2018-07-01 21:11:02.830191643 +0200
+***************
+*** 11,28 ****
+
+ env:
+ - BUILD=yes TEST=scripttests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp'"
+ - BUILD=no TEST=unittests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=yes
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=normal CONFOPT= SHADOWOPT="-C src/shadow" SRCDIR=./src/shadow CHECK_AUTOCONF=no
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=small CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=tiny CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ # Mac OSX build
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp'"
+ # ASAN build
+ - BUILD=yes TEST=test SANITIZER_CFLAGS="-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize=address -fno-omit-frame-pointer"
+ FEATURES=huge SRCDIR=./src CHECK_AUTOCONF=no ASAN_OPTIONS="print_stacktrace=1 log_path=asan" LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/src/testdir/lsan-suppress.txt"
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp'"
+
+ sudo: false
+
+--- 11,28 ----
+
+ env:
+ - BUILD=yes TEST=scripttests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp'"
+ - BUILD=no TEST=unittests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=yes
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=normal CONFOPT= SHADOWOPT="-C src/shadow" SRCDIR=./src/shadow CHECK_AUTOCONF=no
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=small CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=tiny CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ # Mac OSX build
+ - BUILD=yes TEST=test COVERAGE=no FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp --enable-tclinterp'"
+ # ASAN build
+ - BUILD=yes TEST=test SANITIZER_CFLAGS="-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize=address -fno-omit-frame-pointer"
+ FEATURES=huge SRCDIR=./src CHECK_AUTOCONF=no ASAN_OPTIONS="print_stacktrace=1 log_path=asan" LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/src/testdir/lsan-suppress.txt"
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp --enable-tclinterp'"
+
+ sudo: false
+
+***************
+*** 39,54 ****
+ env: BUILD=yes TEST=test COVERAGE=no FEATURES=small CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ - os: osx
+ env: BUILD=yes TEST=scripttests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp'"
+ - os: osx
+ env: BUILD=yes TEST=test SANITIZER_CFLAGS="-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize=address -fno-omit-frame-pointer"
+ FEATURES=huge SRCDIR=./src CHECK_AUTOCONF=no ASAN_OPTIONS="print_stacktrace=1 log_path=asan" LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/src/testdir/lsan-suppress.txt"
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp'"
+ - os: linux
+ compiler: clang
+ env: BUILD=yes TEST=test SANITIZER_CFLAGS="-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize=address -fno-omit-frame-pointer"
+ FEATURES=huge SRCDIR=./src CHECK_AUTOCONF=no ASAN_OPTIONS="print_stacktrace=1 log_path=asan" LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/src/testdir/lsan-suppress.txt"
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp'"
+ - os: linux
+ compiler: clang
+ env: BUILD=no TEST=unittests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=yes
+--- 39,54 ----
+ env: BUILD=yes TEST=test COVERAGE=no FEATURES=small CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ - os: osx
+ env: BUILD=yes TEST=scripttests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp'"
+ - os: osx
+ env: BUILD=yes TEST=test SANITIZER_CFLAGS="-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize=address -fno-omit-frame-pointer"
+ FEATURES=huge SRCDIR=./src CHECK_AUTOCONF=no ASAN_OPTIONS="print_stacktrace=1 log_path=asan" LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/src/testdir/lsan-suppress.txt"
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp --enable-tclinterp'"
+ - os: linux
+ compiler: clang
+ env: BUILD=yes TEST=test SANITIZER_CFLAGS="-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize=address -fno-omit-frame-pointer"
+ FEATURES=huge SRCDIR=./src CHECK_AUTOCONF=no ASAN_OPTIONS="print_stacktrace=1 log_path=asan" LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/src/testdir/lsan-suppress.txt"
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp --enable-tclinterp'"
+ - os: linux
+ compiler: clang
+ env: BUILD=no TEST=unittests COVERAGE=yes CFLAGS=--coverage LDFLAGS=--coverage FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=yes
+***************
+*** 57,63 ****
+ env: BUILD=yes TEST=test COVERAGE=no FEATURES=small CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ - os: linux
+ env: BUILD=yes TEST=test COVERAGE=no FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp'"
+
+ branches:
+ except:
+--- 57,63 ----
+ env: BUILD=yes TEST=test COVERAGE=no FEATURES=small CONFOPT= SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+ - os: linux
+ env: BUILD=yes TEST=test COVERAGE=no FEATURES=huge SHADOWOPT= SRCDIR=./src CHECK_AUTOCONF=no
+! "CONFOPT='--enable-perlinterp --enable-pythoninterp --enable-rubyinterp --enable-luainterp --enable-tclinterp'"
+
+ branches:
+ except:
+***************
+*** 75,80 ****
+--- 75,81 ----
+ - liblua5.2-dev
+ - lua5.2
+ - ruby-dev
++ - tcl-dev
+ - cscope
+ - libgtk2.0-dev
+
+*** ../vim-8.1.0136/src/version.c 2018-07-01 19:49:23.605793273 +0200
+--- src/version.c 2018-07-01 21:12:17.361760352 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 137,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+166. You have been on your computer soo long that you didn't realize
+ you had grandchildren.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0138 b/data/vim/patches/8.1.0138
new file mode 100644
index 000000000..14beff0f8
--- /dev/null
+++ b/data/vim/patches/8.1.0138
@@ -0,0 +1,153 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0138
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0138
+Problem: Negative value of 'softtabstop' not used correctly.
+Solution: Use get_sts_value(). (Tom Ryder)
+Files: src/edit.c, src/option.c, src/Makefile, src/testdir/test_tab.vim
+
+
+*** ../vim-8.1.0137/src/edit.c 2018-06-23 19:22:45.602486336 +0200
+--- src/edit.c 2018-07-02 20:48:14.924888068 +0200
+***************
+*** 9373,9379 ****
+ if (p_sta && in_indent)
+ want_vcol = (want_vcol / curbuf->b_p_sw) * curbuf->b_p_sw;
+ else
+! want_vcol = tabstop_start(want_vcol, curbuf->b_p_sts,
+ curbuf->b_p_vsts_array);
+ #else
+ want_vcol = (want_vcol / ts) * ts;
+--- 9373,9379 ----
+ if (p_sta && in_indent)
+ want_vcol = (want_vcol / curbuf->b_p_sw) * curbuf->b_p_sw;
+ else
+! want_vcol = tabstop_start(want_vcol, get_sts_value(),
+ curbuf->b_p_vsts_array);
+ #else
+ want_vcol = (want_vcol / ts) * ts;
+***************
+*** 10203,10211 ****
+ temp = (int)curbuf->b_p_sw;
+ temp -= get_nolist_virtcol() % temp;
+ }
+! else if (tabstop_count(curbuf->b_p_vsts_array) > 0 || curbuf->b_p_sts > 0)
+ /* use 'softtabstop' when set */
+! temp = tabstop_padding(get_nolist_virtcol(), curbuf->b_p_sts,
+ curbuf->b_p_vsts_array);
+ else /* otherwise use 'tabstop' */
+ temp = tabstop_padding(get_nolist_virtcol(), curbuf->b_p_ts,
+--- 10203,10211 ----
+ temp = (int)curbuf->b_p_sw;
+ temp -= get_nolist_virtcol() % temp;
+ }
+! else if (tabstop_count(curbuf->b_p_vsts_array) > 0 || curbuf->b_p_sts != 0)
+ /* use 'softtabstop' when set */
+! temp = tabstop_padding(get_nolist_virtcol(), get_sts_value(),
+ curbuf->b_p_vsts_array);
+ else /* otherwise use 'tabstop' */
+ temp = tabstop_padding(get_nolist_virtcol(), curbuf->b_p_ts,
+*** ../vim-8.1.0137/src/option.c 2018-06-28 22:22:56.229315623 +0200
+--- src/option.c 2018-07-02 20:21:42.957136087 +0200
+***************
+*** 13016,13022 ****
+
+ /*
+ * Return the effective softtabstop value for the current buffer, using the
+! * 'tabstop' value when 'softtabstop' is negative.
+ */
+ long
+ get_sts_value(void)
+--- 13016,13022 ----
+
+ /*
+ * Return the effective softtabstop value for the current buffer, using the
+! * 'shiftwidth' value when 'softtabstop' is negative.
+ */
+ long
+ get_sts_value(void)
+*** ../vim-8.1.0137/src/Makefile 2018-06-30 21:50:16.852674935 +0200
+--- src/Makefile 2018-07-02 20:29:59.606438353 +0200
+***************
+*** 2288,2293 ****
+--- 2288,2294 ----
+ test_syn_attr \
+ test_syntax \
+ test_system \
++ test_tab \
+ test_tabline \
+ test_tabpage \
+ test_tagcase \
+*** ../vim-8.1.0137/src/testdir/test_tab.vim 2017-10-26 19:57:28.000000000 +0200
+--- src/testdir/test_tab.vim 2018-07-02 20:47:37.277090611 +0200
+***************
+*** 1,3 ****
+--- 1,4 ----
++ " Various tests for inserting a Tab.
+
+ " Tests for "r<Tab>" with 'smarttab' and 'expandtab' set/not set.
+ " Also test that dv_ works correctly
+***************
+*** 43,45 ****
+--- 44,81 ----
+ enew!
+ set expandtab& smartindent& copyindent& ts& sw& sts&
+ endfunc
++
++ func Test_softtabstop()
++ new
++ set sts=0 sw=0
++ exe "normal ix\<Tab>x\<Esc>"
++ call assert_equal("x\tx", getline(1))
++
++ call setline(1, '')
++ set sts=4
++ exe "normal ix\<Tab>x\<Esc>"
++ call assert_equal("x x", getline(1))
++
++ call setline(1, '')
++ set sts=-1 sw=4
++ exe "normal ix\<Tab>x\<Esc>"
++ call assert_equal("x x", getline(1))
++
++ call setline(1, 'x ')
++ set sts=0 sw=0 backspace=start
++ exe "normal A\<BS>x\<Esc>"
++ call assert_equal("x x", getline(1))
++
++ call setline(1, 'x ')
++ set sts=4
++ exe "normal A\<BS>x\<Esc>"
++ call assert_equal("x x", getline(1))
++
++ call setline(1, 'x ')
++ set sts=-1 sw=4
++ exe "normal A\<BS>x\<Esc>"
++ call assert_equal("x x", getline(1))
++
++ set sts=0 sw=0 backspace&
++ bwipe!
++ endfunc
+*** ../vim-8.1.0137/src/version.c 2018-07-01 21:12:49.765572778 +0200
+--- src/version.c 2018-07-02 20:19:59.125722660 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 138,
+ /**/
+
+--
+"Hit any key to continue" is very confusing when you have two keyboards.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0139 b/data/vim/patches/8.1.0139
new file mode 100644
index 000000000..69bdcfc6f
--- /dev/null
+++ b/data/vim/patches/8.1.0139
@@ -0,0 +1,86 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0139
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0139
+Problem: Lua tests fail on some platforms.
+Solution: Accept a hex number with and without "0x". (Ken Takata,
+ closes #3137)
+Files: src/testdir/test_lua.vim
+
+
+*** ../vim-8.1.0138/src/testdir/test_lua.vim 2018-07-01 19:49:23.605793273 +0200
+--- src/testdir/test_lua.vim 2018-07-02 22:51:02.549409377 +0200
+***************
+*** 305,311 ****
+ lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
+ call assert_equal([123.0, 'abc', v:true, v:false, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
+ call assert_equal(6.0, luaeval('#l'))
+! call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
+
+ lua l[0] = 124
+ lua l[4] = nil
+--- 305,311 ----
+ lua l:add(vim.eval("{'a':1, 'b':2, 'c':3}"))
+ call assert_equal([123.0, 'abc', v:true, v:false, [1, 2, 3], {'a': 1, 'b': 2, 'c': 3}], l)
+ call assert_equal(6.0, luaeval('#l'))
+! call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
+
+ lua l[0] = 124
+ lua l[4] = nil
+***************
+*** 358,364 ****
+
+ call assert_equal('[1.0, 2.0, [...]]', string(luaeval('l')))
+
+! call assert_match('^list: 0x\x\+$', luaeval('tostring(l)'))
+ call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])'))
+
+ call assert_equal(luaeval('l'), luaeval('l[2]'))
+--- 358,364 ----
+
+ call assert_equal('[1.0, 2.0, [...]]', string(luaeval('l')))
+
+! call assert_match('^list: \%(0x\)\?\x\+$', luaeval('tostring(l)'))
+ call assert_equal(luaeval('tostring(l)'), luaeval('tostring(l[2])'))
+
+ call assert_equal(luaeval('l'), luaeval('l[2]'))
+***************
+*** 380,386 ****
+ lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
+ call assert_equal({'0':123.0, '1':'abc', '2':v:true, '3':v:false, '4': [1, 2, 3], '5': {'a':1, 'b':2, 'c':3}}, d)
+ call assert_equal(6.0, luaeval('#d'))
+! call assert_match('^dict: 0x\x\+$', luaeval('tostring(d)'))
+
+ call assert_equal('abc', luaeval('d[1]'))
+
+--- 380,386 ----
+ lua d[5] = vim.eval("{'a':1, 'b':2, 'c':3}")
+ call assert_equal({'0':123.0, '1':'abc', '2':v:true, '3':v:false, '4': [1, 2, 3], '5': {'a':1, 'b':2, 'c':3}}, d)
+ call assert_equal(6.0, luaeval('#d'))
+! call assert_match('^dict: \%(0x\)\?\x\+$', luaeval('tostring(d)'))
+
+ call assert_equal('abc', luaeval('d[1]'))
+
+*** ../vim-8.1.0138/src/version.c 2018-07-02 20:51:21.035882093 +0200
+--- src/version.c 2018-07-02 22:52:54.644808570 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 139,
+ /**/
+
+--
+An error has occurred. Hit any user to continue.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0140 b/data/vim/patches/8.1.0140
new file mode 100644
index 000000000..cbf5b77b1
--- /dev/null
+++ b/data/vim/patches/8.1.0140
@@ -0,0 +1,108 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0140
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0140
+Problem: Recording into a register has focus events. (Michael Naumann)
+Solution: Don't record K_FOCUSGAINED and K_FOCUSLOST. (closes #3143)
+Files: src/getchar.c
+
+
+*** ../vim-8.1.0139/src/getchar.c 2018-06-12 21:35:37.518665900 +0200
+--- src/getchar.c 2018-07-03 14:44:36.364310432 +0200
+***************
+*** 1246,1272 ****
+ static void
+ gotchars(char_u *chars, int len)
+ {
+! char_u *s = chars;
+! int c;
+! char_u buf[2];
+! int todo = len;
+
+- /* remember how many chars were last recorded */
+- if (reg_recording != 0)
+- last_recorded_len += len;
+-
+- buf[1] = NUL;
+ while (todo--)
+ {
+ /* Handle one byte at a time; no translation to be done. */
+! c = *s++;
+! updatescript(c);
+
+ if (reg_recording != 0)
+ {
+! buf[0] = c;
+! add_buff(&recordbuff, buf, 1L);
+ }
+ }
+ may_sync_undo();
+
+--- 1246,1288 ----
+ static void
+ gotchars(char_u *chars, int len)
+ {
+! char_u *s = chars;
+! int i;
+! static char_u buf[4];
+! static int buflen = 0;
+! int todo = len;
+
+ while (todo--)
+ {
++ buf[buflen++] = *s++;
++
++ // When receiving a special key sequence, store it until we have all
++ // the bytes and we can decide what to do with it.
++ if (buflen == 1 && buf[0] == K_SPECIAL)
++ continue;
++ if (buflen == 2)
++ continue;
++ if (buflen == 3 && buf[1] == KS_EXTRA
++ && (buf[2] == KE_FOCUSGAINED || buf[2] == KE_FOCUSLOST))
++ {
++ // Drop K_FOCUSGAINED and K_FOCUSLOST, they are not useful in a
++ // recording.
++ buflen = 0;
++ continue;
++ }
++
+ /* Handle one byte at a time; no translation to be done. */
+! for (i = 0; i < buflen; ++i)
+! updatescript(buf[i]);
+
+ if (reg_recording != 0)
+ {
+! buf[buflen] = NUL;
+! add_buff(&recordbuff, buf, (long)buflen);
+! /* remember how many chars were last recorded */
+! last_recorded_len += buflen;
+ }
++ buflen = 0;
+ }
+ may_sync_undo();
+
+*** ../vim-8.1.0139/src/version.c 2018-07-02 22:54:32.488278811 +0200
+--- src/version.c 2018-07-03 14:40:15.567864170 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 140,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+171. You invent another person and chat with yourself in empty chat rooms.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0141 b/data/vim/patches/8.1.0141
new file mode 100644
index 000000000..40b1a6775
--- /dev/null
+++ b/data/vim/patches/8.1.0141
@@ -0,0 +1,558 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0141
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0141
+Problem: :cexpr no longer jumps to the first error.
+Solution: Use the quickfix list identifier. (Yegappan Lakshmanan,
+ closes #3092)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+
+*** ../vim-8.1.0140/src/quickfix.c 2018-06-18 21:53:23.514826893 +0200
+--- src/quickfix.c 2018-07-03 16:50:52.302649159 +0200
+***************
+*** 2231,2237 ****
+ }
+
+ /*
+! * When loading a file from the quickfix, the auto commands may modify it.
+ * This may invalidate the current quickfix entry. This function checks
+ * whether an entry is still present in the quickfix list.
+ * Similar to location list.
+--- 2231,2237 ----
+ }
+
+ /*
+! * When loading a file from the quickfix, the autocommands may modify it.
+ * This may invalidate the current quickfix entry. This function checks
+ * whether an entry is still present in the quickfix list.
+ * Similar to location list.
+***************
+*** 2579,2585 ****
+ if (win->w_llist == NULL)
+ {
+ win->w_llist = ll_ref;
+! ll_ref->qf_refcount++;
+ }
+ }
+
+--- 2579,2586 ----
+ if (win->w_llist == NULL)
+ {
+ win->w_llist = ll_ref;
+! if (ll_ref != NULL)
+! ll_ref->qf_refcount++;
+ }
+ }
+
+***************
+*** 2986,2993 ****
+ if (curbuf == old_curbuf)
+ setpcmark();
+
+! qf_jump_goto_line(qf_ptr->qf_lnum, qf_ptr->qf_col, qf_ptr->qf_viscol,
+! qf_ptr->qf_pattern);
+
+ #ifdef FEAT_FOLDING
+ if ((fdo_flags & FDO_QUICKFIX) && old_KeyTyped)
+--- 2987,2995 ----
+ if (curbuf == old_curbuf)
+ setpcmark();
+
+! if (qf_ptr != NULL)
+! qf_jump_goto_line(qf_ptr->qf_lnum, qf_ptr->qf_col,
+! qf_ptr->qf_viscol, qf_ptr->qf_pattern);
+
+ #ifdef FEAT_FOLDING
+ if ((fdo_flags & FDO_QUICKFIX) && old_KeyTyped)
+***************
+*** 4056,4061 ****
+--- 4058,4078 ----
+ }
+
+ /*
++ * Return the quickfix/location list number with the given identifier.
++ * Returns -1 if list is not found.
++ */
++ static int
++ qf_id2nr(qf_info_T *qi, int_u qfid)
++ {
++ int qf_idx;
++
++ for (qf_idx = 0; qf_idx < qi->qf_listcount; qf_idx++)
++ if (qi->qf_lists[qf_idx].qf_id == qfid)
++ return qf_idx;
++ return INVALID_QFIDX;
++ }
++
++ /*
+ * Return TRUE when using ":vimgrep" for ":grep".
+ */
+ int
+***************
+*** 4083,4088 ****
+--- 4100,4106 ----
+ qf_info_T *qi = &ql_info;
+ int res;
+ char_u *au_name = NULL;
++ int_u save_qfid;
+
+ /* Redirect ":grep" to ":vimgrep" if 'grepprg' is "internal". */
+ if (grep_internal(eap->cmdidx))
+***************
+*** 4161,4181 ****
+ && eap->cmdidx != CMD_lgrepadd),
+ qf_cmdtitle(*eap->cmdlinep), enc);
+ if (wp != NULL)
+ qi = GET_LOC_LIST(wp);
+! if (res >= 0 && qi != NULL)
+ qf_list_changed(qi, qi->qf_curlist);
+ if (au_name != NULL)
+- {
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+! if (qi != NULL && qi->qf_curlist < qi->qf_listcount)
+! res = qi->qf_lists[qi->qf_curlist].qf_count;
+! else
+! res = 0;
+! }
+! if (res > 0 && !eap->forceit)
+ qf_jump(qi, 0, 0, FALSE); /* display first error */
+
+ mch_remove(fname);
+ vim_free(fname);
+ vim_free(cmd);
+--- 4179,4206 ----
+ && eap->cmdidx != CMD_lgrepadd),
+ qf_cmdtitle(*eap->cmdlinep), enc);
+ if (wp != NULL)
++ {
+ qi = GET_LOC_LIST(wp);
+! if (qi == NULL)
+! goto cleanup;
+! }
+! if (res >= 0)
+ qf_list_changed(qi, qi->qf_curlist);
++ // Remember the current quickfix list identifier, so that we can
++ // check for autocommands changing the current quickfix list.
++ save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+! if (res > 0 && !eap->forceit && qflist_valid(wp, save_qfid))
+! {
+! // If autocommands changed the current list, then restore it
+! if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
+! qi->qf_curlist = qf_id2nr(qi, save_qfid);
+ qf_jump(qi, 0, 0, FALSE); /* display first error */
++ }
+
++ cleanup:
+ mch_remove(fname);
+ vim_free(fname);
+ vim_free(cmd);
+***************
+*** 4502,4508 ****
+ win_T *wp = NULL;
+ qf_info_T *qi = &ql_info;
+ char_u *au_name = NULL;
+! int save_qfid = 0; /* init for gcc */
+ int res;
+
+ switch (eap->cmdidx)
+--- 4527,4533 ----
+ win_T *wp = NULL;
+ qf_info_T *qi = &ql_info;
+ char_u *au_name = NULL;
+! int_u save_qfid = 0; /* init for gcc */
+ int res;
+
+ switch (eap->cmdidx)
+***************
+*** 4555,4589 ****
+ && eap->cmdidx != CMD_laddfile),
+ qf_cmdtitle(*eap->cmdlinep), enc);
+ if (wp != NULL)
+ qi = GET_LOC_LIST(wp);
+! if (res >= 0 && qi != NULL)
+ qf_list_changed(qi, qi->qf_curlist);
+! if (qi != NULL)
+! save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, FALSE, curbuf);
+
+! /* An autocmd might have freed the quickfix/location list. Check whether it
+! * is still valid. */
+! if (qi != NULL && !qflist_valid(wp, save_qfid))
+! return;
+! if (res > 0 && (eap->cmdidx == CMD_cfile || eap->cmdidx == CMD_lfile))
+ qf_jump(qi, 0, 0, eap->forceit); /* display first error */
+! }
+!
+! /*
+! * Return the quickfix/location list number with the given identifier.
+! * Returns -1 if list is not found.
+! */
+! static int
+! qf_id2nr(qf_info_T *qi, int_u qfid)
+! {
+! int qf_idx;
+!
+! for (qf_idx = 0; qf_idx < qi->qf_listcount; qf_idx++)
+! if (qi->qf_lists[qf_idx].qf_id == qfid)
+! return qf_idx;
+! return INVALID_QFIDX;
+ }
+
+ /*
+--- 4580,4606 ----
+ && eap->cmdidx != CMD_laddfile),
+ qf_cmdtitle(*eap->cmdlinep), enc);
+ if (wp != NULL)
++ {
+ qi = GET_LOC_LIST(wp);
+! if (qi == NULL)
+! return;
+! }
+! if (res >= 0)
+ qf_list_changed(qi, qi->qf_curlist);
+! save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, FALSE, curbuf);
+
+! // Jump to the first error for a new list and if autocmds didn't
+! // free the list.
+! if (res > 0 && (eap->cmdidx == CMD_cfile || eap->cmdidx == CMD_lfile)
+! && qflist_valid(wp, save_qfid))
+! {
+! // If autocommands changed the current list, then restore it
+! if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
+! qi->qf_curlist = qf_id2nr(qi, save_qfid);
+ qf_jump(qi, 0, 0, eap->forceit); /* display first error */
+! }
+ }
+
+ /*
+***************
+*** 5070,5075 ****
+--- 5087,5096 ----
+ if (!qflist_valid(wp, save_qfid))
+ goto theend;
+
++ // If autocommands changed the current list, then restore it
++ if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
++ qi->qf_curlist = qf_id2nr(qi, save_qfid);
++
+ /* Jump to first match. */
+ if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
+ {
+***************
+*** 5162,5168 ****
+ /* need to open the memfile before putting the buffer in a window */
+ if (ml_open(newbuf) == OK)
+ {
+! /* Make sure this buffer isn't wiped out by auto commands. */
+ ++newbuf->b_locked;
+
+ /* set curwin/curbuf to buf and save a few things */
+--- 5183,5189 ----
+ /* need to open the memfile before putting the buffer in a window */
+ if (ml_open(newbuf) == OK)
+ {
+! /* Make sure this buffer isn't wiped out by autocommands. */
+ ++newbuf->b_locked;
+
+ /* set curwin/curbuf to buf and save a few things */
+***************
+*** 6205,6210 ****
+--- 6226,6233 ----
+ qf_info_T *qi = &ql_info;
+ char_u *au_name = NULL;
+ int res;
++ int_u save_qfid;
++ win_T *wp = NULL;
+
+ switch (eap->cmdidx)
+ {
+***************
+*** 6233,6238 ****
+--- 6256,6262 ----
+ qi = ll_get_or_alloc_list(curwin);
+ if (qi == NULL)
+ return;
++ wp = curwin;
+ }
+
+ if (*eap->arg == NUL)
+***************
+*** 6271,6276 ****
+--- 6295,6304 ----
+ qf_title, NULL);
+ if (res >= 0)
+ qf_list_changed(qi, qi->qf_curlist);
++
++ // Remember the current quickfix list identifier, so that we can
++ // check for autocommands changing the current quickfix list.
++ save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+ if (au_name != NULL)
+ {
+ buf_T *curbuf_old = curbuf;
+***************
+*** 6282,6290 ****
+ // be invalid.
+ res = 0;
+ }
+ if (res > 0 && (eap->cmdidx == CMD_cbuffer ||
+! eap->cmdidx == CMD_lbuffer))
+ qf_jump(qi, 0, 0, eap->forceit); /* display first error */
+ }
+ }
+ }
+--- 6310,6326 ----
+ // be invalid.
+ res = 0;
+ }
++ // Jump to the first error for a new list and if autocmds didn't
++ // free the list.
+ if (res > 0 && (eap->cmdidx == CMD_cbuffer ||
+! eap->cmdidx == CMD_lbuffer)
+! && qflist_valid(wp, save_qfid))
+! {
+! // If autocommands changed the current list, then restore it
+! if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
+! qi->qf_curlist = qf_id2nr(qi, save_qfid);
+ qf_jump(qi, 0, 0, eap->forceit); /* display first error */
++ }
+ }
+ }
+ }
+***************
+*** 6301,6306 ****
+--- 6337,6344 ----
+ qf_info_T *qi = &ql_info;
+ char_u *au_name = NULL;
+ int res;
++ int_u save_qfid;
++ win_T *wp = NULL;
+
+ switch (eap->cmdidx)
+ {
+***************
+*** 6328,6333 ****
+--- 6366,6372 ----
+ qi = ll_get_or_alloc_list(curwin);
+ if (qi == NULL)
+ return;
++ wp = curwin;
+ }
+
+ /* Evaluate the expression. When the result is a string or a list we can
+***************
+*** 6345,6358 ****
+ qf_cmdtitle(*eap->cmdlinep), NULL);
+ if (res >= 0)
+ qf_list_changed(qi, qi->qf_curlist);
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+ if (res > 0 && (eap->cmdidx == CMD_cexpr
+ || eap->cmdidx == CMD_lexpr)
+! && qi == GET_LOC_LIST(curwin))
+! // Jump to the first error if autocmds didn't free the list.
+ qf_jump(qi, 0, 0, eap->forceit);
+ }
+ else
+ EMSG(_("E777: String or List expected"));
+--- 6384,6408 ----
+ qf_cmdtitle(*eap->cmdlinep), NULL);
+ if (res >= 0)
+ qf_list_changed(qi, qi->qf_curlist);
++
++ // Remember the current quickfix list identifier, so that we can
++ // check for autocommands changing the current quickfix list.
++ save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
++
++ // Jump to the first error for a new list and if autocmds didn't
++ // free the list.
+ if (res > 0 && (eap->cmdidx == CMD_cexpr
+ || eap->cmdidx == CMD_lexpr)
+! && qflist_valid(wp, save_qfid))
+! {
+! // If autocommands changed the current list, then restore it
+! if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
+! qi->qf_curlist = qf_id2nr(qi, save_qfid);
+ qf_jump(qi, 0, 0, eap->forceit);
++ }
+ }
+ else
+ EMSG(_("E777: String or List expected"));
+*** ../vim-8.1.0140/src/testdir/test_quickfix.vim 2018-06-18 20:52:09.553050181 +0200
+--- src/testdir/test_quickfix.vim 2018-07-03 16:50:52.302649159 +0200
+***************
+*** 3363,3375 ****
+ augroup END
+ endfunc
+
+! func Test_setloclist_in_aucmd()
+ " This was using freed memory.
+ augroup nasty
+! au * * call setloclist(0, [], 'f')
+ augroup END
+! lexpr "x"
+ augroup nasty
+ au!
+ augroup END
+ endfunc
+--- 3363,3486 ----
+ augroup END
+ endfunc
+
+! " Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
+! " running
+! func Xexpr_acmd_freelist(cchar)
+! call s:setup_commands(a:cchar)
+!
+ " This was using freed memory.
+ augroup nasty
+! au * * call g:Xsetlist([], 'f')
+ augroup END
+! Xexpr "x"
+ augroup nasty
+ au!
+ augroup END
+ endfunc
++
++ func Test_cexpr_acmd_freelist()
++ call Xexpr_acmd_freelist('c')
++ call Xexpr_acmd_freelist('l')
++ endfunc
++
++ " Test for commands that create a new quickfix/location list and jump to the
++ " first error automatically.
++ func Xjumpto_first_error_test(cchar)
++ call s:setup_commands(a:cchar)
++
++ call s:create_test_file('Xtestfile1')
++ call s:create_test_file('Xtestfile2')
++ let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
++
++ " Test for cexpr/lexpr
++ enew
++ Xexpr l
++ call assert_equal('Xtestfile1', bufname(''))
++ call assert_equal(2, line('.'))
++
++ " Test for cfile/lfile
++ enew
++ call writefile(l, 'Xerr')
++ Xfile Xerr
++ call assert_equal('Xtestfile1', bufname(''))
++ call assert_equal(2, line('.'))
++
++ " Test for cbuffer/lbuffer
++ edit Xerr
++ Xbuffer
++ call assert_equal('Xtestfile1', bufname(''))
++ call assert_equal(2, line('.'))
++
++ call delete('Xerr')
++ call delete('Xtestfile1')
++ call delete('Xtestfile2')
++ endfunc
++
++ func Test_jumpto_first_error()
++ call Xjumpto_first_error_test('c')
++ call Xjumpto_first_error_test('l')
++ endfunc
++
++ " Test for a quickfix autocmd changing the quickfix/location list before
++ " jumping to the first error in the new list.
++ func Xautocmd_changelist(cchar)
++ call s:setup_commands(a:cchar)
++
++ " Test for cfile/lfile
++ call s:create_test_file('Xtestfile1')
++ call s:create_test_file('Xtestfile2')
++ Xexpr 'Xtestfile1:2:Line2'
++ autocmd QuickFixCmdPost * Xolder
++ call writefile(['Xtestfile2:4:Line4'], 'Xerr')
++ Xfile Xerr
++ call assert_equal('Xtestfile2', bufname(''))
++ call assert_equal(4, line('.'))
++ autocmd! QuickFixCmdPost
++
++ " Test for cbuffer/lbuffer
++ call g:Xsetlist([], 'f')
++ Xexpr 'Xtestfile1:2:Line2'
++ autocmd QuickFixCmdPost * Xolder
++ call writefile(['Xtestfile2:4:Line4'], 'Xerr')
++ edit Xerr
++ Xbuffer
++ call assert_equal('Xtestfile2', bufname(''))
++ call assert_equal(4, line('.'))
++ autocmd! QuickFixCmdPost
++
++ " Test for cexpr/lexpr
++ call g:Xsetlist([], 'f')
++ Xexpr 'Xtestfile1:2:Line2'
++ autocmd QuickFixCmdPost * Xolder
++ Xexpr 'Xtestfile2:4:Line4'
++ call assert_equal('Xtestfile2', bufname(''))
++ call assert_equal(4, line('.'))
++ autocmd! QuickFixCmdPost
++
++ " Test for grep/lgrep
++ call g:Xsetlist([], 'f')
++ Xexpr 'Xtestfile1:2:Line2'
++ autocmd QuickFixCmdPost * Xolder
++ silent Xgrep Line5 Xtestfile2
++ call assert_equal('Xtestfile2', bufname(''))
++ call assert_equal(5, line('.'))
++ autocmd! QuickFixCmdPost
++
++ " Test for vimgrep/lvimgrep
++ call g:Xsetlist([], 'f')
++ Xexpr 'Xtestfile1:2:Line2'
++ autocmd QuickFixCmdPost * Xolder
++ silent Xvimgrep Line5 Xtestfile2
++ call assert_equal('Xtestfile2', bufname(''))
++ call assert_equal(5, line('.'))
++ autocmd! QuickFixCmdPost
++
++ call delete('Xerr')
++ call delete('Xtestfile1')
++ call delete('Xtestfile2')
++ endfunc
++
++ func Test_autocmd_changelist()
++ call Xautocmd_changelist('c')
++ call Xautocmd_changelist('l')
++ endfunc
+*** ../vim-8.1.0140/src/version.c 2018-07-03 14:48:11.877218375 +0200
+--- src/version.c 2018-07-03 16:50:31.718764552 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 141,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+175. You send yourself e-mail before you go to bed to remind you
+ what to do when you wake up.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0142 b/data/vim/patches/8.1.0142
new file mode 100644
index 000000000..c172faa19
--- /dev/null
+++ b/data/vim/patches/8.1.0142
@@ -0,0 +1,103 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0142
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0142
+Problem: Xterm and vt320 builtin termcap missing keypad keys.
+Solution: Add the escape sequences. (Kouichi Iwamoto, closes #2973)
+Files: src/term.c
+
+
+*** ../vim-8.1.0141/src/term.c 2018-06-30 17:09:23.039956879 +0200
+--- src/term.c 2018-07-03 17:14:08.563027961 +0200
+***************
+*** 671,677 ****
+ /*
+ * VT320 is working as an ANSI terminal compatible DEC terminal.
+ * (it covers VT1x0, VT2x0 and VT3x0 up to VT320 on VMS as well)
+- * Note: K_F1...K_F5 are for internal use, should not be defined.
+ * TODO:- rewrite ESC[ codes to CSI
+ * - keyboard languages (CSI ? 26 n)
+ */
+--- 671,676 ----
+***************
+*** 723,728 ****
+--- 722,729 ----
+ {K_DOWN, IF_EB("\033[B", ESC_STR "[B")},
+ {K_RIGHT, IF_EB("\033[C", ESC_STR "[C")},
+ {K_LEFT, IF_EB("\033[D", ESC_STR "[D")},
++ // Note: cursor key sequences for application cursor mode are omitted,
++ // because they interfere with typed commands: <Esc>OA.
+ {K_F1, IF_EB("\033[11~", ESC_STR "[11~")},
+ {K_F2, IF_EB("\033[12~", ESC_STR "[12~")},
+ {K_F3, IF_EB("\033[13~", ESC_STR "[13~")},
+***************
+*** 749,759 ****
+--- 750,772 ----
+ {K_END, IF_EB("\033[4~", ESC_STR "[4~")},
+ {K_PAGEUP, IF_EB("\033[5~", ESC_STR "[5~")},
+ {K_PAGEDOWN, IF_EB("\033[6~", ESC_STR "[6~")},
++ // These sequences starting with <Esc> O may interfere with what the user
++ // is typing. Remove these if that bothers you.
+ {K_KPLUS, IF_EB("\033Ok", ESC_STR "Ok")}, /* keypad plus */
+ {K_KMINUS, IF_EB("\033Om", ESC_STR "Om")}, /* keypad minus */
+ {K_KDIVIDE, IF_EB("\033Oo", ESC_STR "Oo")}, /* keypad / */
+ {K_KMULTIPLY, IF_EB("\033Oj", ESC_STR "Oj")}, /* keypad * */
+ {K_KENTER, IF_EB("\033OM", ESC_STR "OM")}, /* keypad Enter */
++ {K_K0, IF_EB("\033Op", ESC_STR "Op")}, /* keypad 0 */
++ {K_K1, IF_EB("\033Oq", ESC_STR "Oq")}, /* keypad 1 */
++ {K_K2, IF_EB("\033Or", ESC_STR "Or")}, /* keypad 2 */
++ {K_K3, IF_EB("\033Os", ESC_STR "Os")}, /* keypad 3 */
++ {K_K4, IF_EB("\033Ot", ESC_STR "Ot")}, /* keypad 4 */
++ {K_K5, IF_EB("\033Ou", ESC_STR "Ou")}, /* keypad 5 */
++ {K_K6, IF_EB("\033Ov", ESC_STR "Ov")}, /* keypad 6 */
++ {K_K7, IF_EB("\033Ow", ESC_STR "Ow")}, /* keypad 7 */
++ {K_K8, IF_EB("\033Ox", ESC_STR "Ox")}, /* keypad 8 */
++ {K_K9, IF_EB("\033Oy", ESC_STR "Oy")}, /* keypad 9 */
+ {K_BS, "\x7f"}, /* for some reason 0177 doesn't work */
+ # endif
+
+***************
+*** 960,965 ****
+--- 973,988 ----
+ {K_KMULTIPLY, IF_EB("\033O*j", ESC_STR "O*j")}, /* keypad * */
+ {K_KENTER, IF_EB("\033O*M", ESC_STR "O*M")}, /* keypad Enter */
+ {K_KPOINT, IF_EB("\033O*n", ESC_STR "O*n")}, /* keypad . */
++ {K_K0, IF_EB("\033O*p", ESC_STR "O*p")}, /* keypad 0 */
++ {K_K1, IF_EB("\033O*q", ESC_STR "O*q")}, /* keypad 1 */
++ {K_K2, IF_EB("\033O*r", ESC_STR "O*r")}, /* keypad 2 */
++ {K_K3, IF_EB("\033O*s", ESC_STR "O*s")}, /* keypad 3 */
++ {K_K4, IF_EB("\033O*t", ESC_STR "O*t")}, /* keypad 4 */
++ {K_K5, IF_EB("\033O*u", ESC_STR "O*u")}, /* keypad 5 */
++ {K_K6, IF_EB("\033O*v", ESC_STR "O*v")}, /* keypad 6 */
++ {K_K7, IF_EB("\033O*w", ESC_STR "O*w")}, /* keypad 7 */
++ {K_K8, IF_EB("\033O*x", ESC_STR "O*x")}, /* keypad 8 */
++ {K_K9, IF_EB("\033O*y", ESC_STR "O*y")}, /* keypad 9 */
+ {K_KDEL, IF_EB("\033[3;*~", ESC_STR "[3;*~")}, /* keypad Del */
+ {K_PS, IF_EB("\033[200~", ESC_STR "[200~")}, /* paste start */
+ {K_PE, IF_EB("\033[201~", ESC_STR "[201~")}, /* paste end */
+*** ../vim-8.1.0141/src/version.c 2018-07-03 16:54:18.241509389 +0200
+--- src/version.c 2018-07-03 17:09:33.568507424 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 142,
+ /**/
+
+--
+If Apple would build a car...
+... it would be powered by the sun, be reliable, five times
+as fast and twice as easy to drive; but would only run on
+five percent of the roads.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0143 b/data/vim/patches/8.1.0143
new file mode 100644
index 000000000..d9d03c15b
--- /dev/null
+++ b/data/vim/patches/8.1.0143
@@ -0,0 +1,163 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0143
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0143
+Problem: Matchit and matchparen don't handle E363.
+Solution: Catch the E363 error. (Christian Brabandt)
+Files: runtime/pack/dist/opt/matchit/plugin/matchit.vim,
+ runtime/plugin/matchparen.vim
+
+
+*** ../vim-8.1.0142/runtime/pack/dist/opt/matchit/plugin/matchit.vim 2017-09-15 22:24:05.000000000 +0200
+--- runtime/pack/dist/opt/matchit/plugin/matchit.vim 2018-07-03 18:08:21.939478130 +0200
+***************
+*** 1,5 ****
+ " matchit.vim: (global plugin) Extended "%" matching
+! " Last Change: 2017 Sep 15
+ " Maintainer: Benji Fisher PhD <benji@member.AMS.org>
+ " Version: 1.13.3, for Vim 6.3+
+ " Fix from Fernando Torres included.
+--- 1,5 ----
+ " matchit.vim: (global plugin) Extended "%" matching
+! " Last Change: 2018 Jul 3 by Christian Brabandt
+ " Maintainer: Benji Fisher PhD <benji@member.AMS.org>
+ " Version: 1.13.3, for Vim 6.3+
+ " Fix from Fernando Torres included.
+***************
+*** 272,278 ****
+ " execute "normal!" . curcol . "l"
+ " endif
+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
+! let skip = "0"
+ else
+ execute "if " . skip . "| let skip = '0' | endif"
+ endif
+--- 272,278 ----
+ " execute "normal!" . curcol . "l"
+ " endif
+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
+! let skip = '0'
+ else
+ execute "if " . skip . "| let skip = '0' | endif"
+ endif
+***************
+*** 719,728 ****
+ let openpat = substitute(openpat, ',', '\\|', 'g')
+ let closepat = substitute(close, '\(\\\@<!\(\\\\\)*\)\@<=\\(', '\\%(', 'g')
+ let closepat = substitute(closepat, ',', '\\|', 'g')
+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
+ let skip = '0'
+ else
+! execute "if " . skip . "| let skip = '0' | endif"
+ endif
+ mark '
+ while level
+--- 719,734 ----
+ let openpat = substitute(openpat, ',', '\\|', 'g')
+ let closepat = substitute(close, '\(\\\@<!\(\\\\\)*\)\@<=\\(', '\\%(', 'g')
+ let closepat = substitute(closepat, ',', '\\|', 'g')
++
+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
+ let skip = '0'
+ else
+! try
+! execute "if " . skip . "| let skip = '0' | endif"
+! catch /^Vim\%((\a\+)\)\=:E363/
+! " We won't find anything, so skip searching, should keep Vim responsive.
+! return
+! endtry
+ endif
+ mark '
+ while level
+*** ../vim-8.1.0142/runtime/plugin/matchparen.vim 2018-06-25 00:05:55.897799652 +0200
+--- runtime/plugin/matchparen.vim 2018-07-03 18:14:30.337154571 +0200
+***************
+*** 1,6 ****
+ " Vim plugin for showing matching parens
+ " Maintainer: Bram Moolenaar <Bram@vim.org>
+! " Last Change: 2017 Sep 30
+
+ " Exit quickly when:
+ " - this plugin was already loaded (or disabled)
+--- 1,6 ----
+ " Vim plugin for showing matching parens
+ " Maintainer: Bram Moolenaar <Bram@vim.org>
+! " Last Change: 2018 Jul 3
+
+ " Exit quickly when:
+ " - this plugin was already loaded (or disabled)
+***************
+*** 103,120 ****
+ call cursor(c_lnum, c_col - before)
+ endif
+
+! " Build an expression that detects whether the current cursor position is in
+! " certain syntax types (string, comment, etc.), for use as searchpairpos()'s
+! " skip argument.
+! " We match "escape" for special items, such as lispEscapeSpecial.
+! let s_skip = '!empty(filter(map(synstack(line("."), col(".")), ''synIDattr(v:val, "name")''), ' .
+ \ '''v:val =~? "string\\|character\\|singlequote\\|escape\\|comment"''))'
+! " If executing the expression determines that the cursor is currently in
+! " one of the syntax types, then we want searchpairpos() to find the pair
+! " within those syntax types (i.e., not skip). Otherwise, the cursor is
+! " outside of the syntax types and s_skip should keep its value so we skip any
+! " matching pair inside the syntax types.
+! execute 'if' s_skip '| let s_skip = "0" | endif'
+
+ " Limit the search to lines visible in the window.
+ let stoplinebottom = line('w$')
+--- 103,130 ----
+ call cursor(c_lnum, c_col - before)
+ endif
+
+! if !has("syntax") || !exists("g:syntax_on")
+! let s_skip = "0"
+! else
+! " Build an expression that detects whether the current cursor position is
+! " in certain syntax types (string, comment, etc.), for use as
+! " searchpairpos()'s skip argument.
+! " We match "escape" for special items, such as lispEscapeSpecial.
+! let s_skip = '!empty(filter(map(synstack(line("."), col(".")), ''synIDattr(v:val, "name")''), ' .
+ \ '''v:val =~? "string\\|character\\|singlequote\\|escape\\|comment"''))'
+! " If executing the expression determines that the cursor is currently in
+! " one of the syntax types, then we want searchpairpos() to find the pair
+! " within those syntax types (i.e., not skip). Otherwise, the cursor is
+! " outside of the syntax types and s_skip should keep its value so we skip
+! " any matching pair inside the syntax types.
+! " Catch if this throws E363: pattern uses more memory than 'maxmempattern'.
+! try
+! execute 'if ' . s_skip . ' | let s_skip = "0" | endif'
+! catch /^Vim\%((\a\+)\)\=:E363/
+! " We won't find anything, so skip searching, should keep Vim responsive.
+! return
+! endtry
+! endif
+
+ " Limit the search to lines visible in the window.
+ let stoplinebottom = line('w$')
+*** ../vim-8.1.0142/src/version.c 2018-07-03 17:16:55.626135028 +0200
+--- src/version.c 2018-07-03 18:16:06.620560417 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 143,
+ /**/
+
+--
+If Microsoft would build a car...
+... Occasionally, executing a maneuver such as a left turn
+would cause your car to shut down and refuse to restart, in
+which case you would have to reinstall the engine.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0144 b/data/vim/patches/8.1.0144
new file mode 100644
index 000000000..d923b9675
--- /dev/null
+++ b/data/vim/patches/8.1.0144
@@ -0,0 +1,97 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0144
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0144
+Problem: The :cd command does not have good test coverage.
+Solution: Add more tests. (Dominique Pelle, closes #2972)
+Files: src/testdir/test_cd.vim
+
+
+*** ../vim-8.1.0143/src/testdir/test_cd.vim 2017-03-19 21:32:54.000000000 +0100
+--- src/testdir/test_cd.vim 2018-07-03 18:35:26.589670346 +0200
+***************
+*** 8,13 ****
+--- 8,67 ----
+ func Test_cd_up_and_down()
+ let path = getcwd()
+ cd ..
++ call assert_notequal(path, getcwd())
+ exe 'cd ' . path
+ call assert_equal(path, getcwd())
+ endfunc
++
++ func Test_cd_no_arg()
++ if has('unix')
++ " Test that cd without argument goes to $HOME directory on Unix systems.
++ let path = getcwd()
++ cd
++ call assert_equal($HOME, getcwd())
++ call assert_notequal(path, getcwd())
++ exe 'cd ' . path
++ call assert_equal(path, getcwd())
++ else
++ " Test that cd without argument echoes cwd on non-Unix systems.
++ call assert_match(getcwd(), execute('cd'))
++ endif
++ endfunc
++
++ func Test_cd_minus()
++ " Test the :cd - goes back to the previous directory.
++ let path = getcwd()
++ cd ..
++ let path_dotdot = getcwd()
++ call assert_notequal(path, path_dotdot)
++ cd -
++ call assert_equal(path, getcwd())
++ cd -
++ call assert_equal(path_dotdot, getcwd())
++ cd -
++ call assert_equal(path, getcwd())
++ endfunc
++
++ func Test_cd_with_cpo_chdir()
++ e Xfoo
++ call setline(1, 'foo')
++ let path = getcwd()
++ set cpo+=.
++
++ " :cd should fail when buffer is modified and 'cpo' contains dot.
++ call assert_fails('cd ..', 'E747:')
++ call assert_equal(path, getcwd())
++
++ " :cd with exclamation mark should succeed.
++ cd! ..
++ call assert_notequal(path, getcwd())
++
++ " :cd should succeed when buffer has been written.
++ w!
++ exe 'cd ' . path
++ call assert_equal(path, getcwd())
++
++ call delete('Xfoo')
++ set cpo&
++ bw!
++ endfunc
+*** ../vim-8.1.0143/src/version.c 2018-07-03 18:17:24.664083244 +0200
+--- src/version.c 2018-07-03 18:28:12.884213499 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 144,
+ /**/
+
+--
+I'm so disorganized my keyboard isn't even in alphabetical order!
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0145 b/data/vim/patches/8.1.0145
new file mode 100644
index 000000000..2457f5cbd
--- /dev/null
+++ b/data/vim/patches/8.1.0145
@@ -0,0 +1,73 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0145
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0145
+Problem: Test with grep is failing on MS-Windows.
+Solution: Skip the test.
+Files: src/testdir/test_quickfix.vim
+
+
+*** ../vim-8.1.0144/src/testdir/test_quickfix.vim 2018-07-03 16:54:18.241509389 +0200
+--- src/testdir/test_quickfix.vim 2018-07-03 19:13:52.523893686 +0200
+***************
+*** 3457,3470 ****
+ call assert_equal(4, line('.'))
+ autocmd! QuickFixCmdPost
+
+! " Test for grep/lgrep
+! call g:Xsetlist([], 'f')
+! Xexpr 'Xtestfile1:2:Line2'
+! autocmd QuickFixCmdPost * Xolder
+! silent Xgrep Line5 Xtestfile2
+! call assert_equal('Xtestfile2', bufname(''))
+! call assert_equal(5, line('.'))
+! autocmd! QuickFixCmdPost
+
+ " Test for vimgrep/lvimgrep
+ call g:Xsetlist([], 'f')
+--- 3457,3473 ----
+ call assert_equal(4, line('.'))
+ autocmd! QuickFixCmdPost
+
+! " The grepprg may not be set on non-Unix systems
+! if has('unix')
+! " Test for grep/lgrep
+! call g:Xsetlist([], 'f')
+! Xexpr 'Xtestfile1:2:Line2'
+! autocmd QuickFixCmdPost * Xolder
+! silent Xgrep Line5 Xtestfile2
+! call assert_equal('Xtestfile2', bufname(''))
+! call assert_equal(5, line('.'))
+! autocmd! QuickFixCmdPost
+! endif
+
+ " Test for vimgrep/lvimgrep
+ call g:Xsetlist([], 'f')
+*** ../vim-8.1.0144/src/version.c 2018-07-03 18:36:23.041340530 +0200
+--- src/version.c 2018-07-03 19:14:29.267677389 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 145,
+ /**/
+
+--
+If Microsoft would build a car...
+... Occasionally your car would die on the freeway for no
+reason. You would have to pull over to the side of the road,
+close all of the car windows, shut it off, restart it, and
+reopen the windows before you could continue. For some reason
+you would simply accept this.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0146 b/data/vim/patches/8.1.0146
new file mode 100644
index 000000000..ac5393501
--- /dev/null
+++ b/data/vim/patches/8.1.0146
@@ -0,0 +1,49 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0146
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0146
+Problem: When $LANG is set the compiler test may fail.
+Solution: Unset $LANG.
+Files: src/testdir/test_compiler.vim
+
+
+*** ../vim-8.1.0145/src/testdir/test_compiler.vim Sat May 19 16:45:12 2018
+--- src/testdir/test_compiler.vim Tue Jul 3 21:24:51 2018
+***************
+*** 5,10 ****
+--- 5,15 ----
+ return
+ endif
+
++ " $LANG changes the output of Perl.
++ if $LANG != ''
++ unlet $LANG
++ endif
++
+ e Xfoo.pl
+ compiler perl
+ call assert_equal('perl', b:current_compiler)
+*** ../vim-8.1.0145/src/version.c Tue Jul 3 19:15:56 2018
+--- src/version.c Tue Jul 3 21:25:38 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 146,
+ /**/
+
+--
+If Microsoft would build a car...
+... You'd have to press the "Start" button to turn the engine off.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0147 b/data/vim/patches/8.1.0147
new file mode 100644
index 000000000..dd8b126e0
--- /dev/null
+++ b/data/vim/patches/8.1.0147
@@ -0,0 +1,78 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0147
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0147
+Problem: Compiler warning when building with Python 3.7.
+Solution: #undef PySlice_GetIndicesEx before redefining it. (Ozaki Kiichi,
+ closes #3153)
+Files: src/if_python3.c
+
+
+*** ../vim-8.1.0146/src/if_python3.c 2018-04-14 13:54:46.000000000 +0200
+--- src/if_python3.c 2018-07-04 21:55:38.545469805 +0200
+***************
+*** 167,172 ****
+--- 167,177 ----
+ # define PySequence_Fast py3_PySequence_Fast
+ # define PyTuple_Size py3_PyTuple_Size
+ # define PyTuple_GetItem py3_PyTuple_GetItem
++ # if PY_VERSION_HEX >= 0x030601f0
++ # define PySlice_AdjustIndices py3_PySlice_AdjustIndices
++ # define PySlice_Unpack py3_PySlice_Unpack
++ # endif
++ # undef PySlice_GetIndicesEx
+ # define PySlice_GetIndicesEx py3_PySlice_GetIndicesEx
+ # define PyImport_ImportModule py3_PyImport_ImportModule
+ # define PyObject_Init py3__PyObject_Init
+***************
+*** 305,310 ****
+--- 310,321 ----
+ static PyObject* (*py3_PyTuple_GetItem)(PyObject *, Py_ssize_t);
+ static int (*py3_PyMapping_Check)(PyObject *);
+ static PyObject* (*py3_PyMapping_Keys)(PyObject *);
++ # if PY_VERSION_HEX >= 0x030601f0
++ static int (*py3_PySlice_AdjustIndices)(Py_ssize_t length,
++ Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step);
++ static int (*py3_PySlice_Unpack)(PyObject *slice,
++ Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
++ # endif
+ static int (*py3_PySlice_GetIndicesEx)(PySliceObject_T *r, Py_ssize_t length,
+ Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
+ Py_ssize_t *slicelen);
+***************
+*** 474,479 ****
+--- 485,494 ----
+ {"PySequence_Fast", (PYTHON_PROC*)&py3_PySequence_Fast},
+ {"PyTuple_Size", (PYTHON_PROC*)&py3_PyTuple_Size},
+ {"PyTuple_GetItem", (PYTHON_PROC*)&py3_PyTuple_GetItem},
++ # if PY_VERSION_HEX >= 0x030601f0
++ {"PySlice_AdjustIndices", (PYTHON_PROC*)&py3_PySlice_AdjustIndices},
++ {"PySlice_Unpack", (PYTHON_PROC*)&py3_PySlice_Unpack},
++ # endif
+ {"PySlice_GetIndicesEx", (PYTHON_PROC*)&py3_PySlice_GetIndicesEx},
+ {"PyErr_NoMemory", (PYTHON_PROC*)&py3_PyErr_NoMemory},
+ {"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize},
+*** ../vim-8.1.0146/src/version.c 2018-07-03 21:26:33.820587829 +0200
+--- src/version.c 2018-07-04 22:00:23.391752084 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 147,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+177. You log off of your system because it's time to go to work.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0148 b/data/vim/patches/8.1.0148
new file mode 100644
index 000000000..60e8ef0a5
--- /dev/null
+++ b/data/vim/patches/8.1.0148
@@ -0,0 +1,48 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0148
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0148
+Problem: Memory leak when using :tcl expr command.
+Solution: Free the result of expression evaluation. (Dominique Pelle,
+ closes #3150)
+Files: src/if_tcl.c
+
+
+*** ../vim-8.1.0147/src/if_tcl.c 2017-09-16 19:58:18.000000000 +0200
+--- src/if_tcl.c 2018-07-04 22:09:29.189322096 +0200
+***************
+*** 1385,1391 ****
+--- 1385,1394 ----
+ if (str == NULL)
+ Tcl_SetResult(interp, _("invalid expression"), TCL_STATIC);
+ else
++ {
+ Tcl_SetResult(interp, str, TCL_VOLATILE);
++ vim_free(str);
++ }
+ err = vimerror(interp);
+ #else
+ Tcl_SetResult(interp, _("expressions disabled at compile time"), TCL_STATIC);
+*** ../vim-8.1.0147/src/version.c 2018-07-04 22:03:22.110919832 +0200
+--- src/version.c 2018-07-04 22:08:39.721556114 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 148,
+ /**/
+
+--
+Rule #1: Don't give somebody a tool that he's going to hurt himself with.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0149 b/data/vim/patches/8.1.0149
new file mode 100644
index 000000000..af951193b
--- /dev/null
+++ b/data/vim/patches/8.1.0149
@@ -0,0 +1,263 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0149
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0149
+Problem: The generated sessions file does not restore tabs properly if :lcd
+ was used in one of them.
+Solution: Create the tab pages before setting the directory. (Yee Cheng
+ Chin, closes #3152)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+
+*** ../vim-8.1.0148/src/ex_docmd.c 2018-06-21 22:10:04.404854396 +0200
+--- src/ex_docmd.c 2018-07-04 22:21:20.461625002 +0200
+***************
+*** 5491,5497 ****
+ ex_autocmd(exarg_T *eap)
+ {
+ /*
+! * Disallow auto commands from .exrc and .vimrc in current
+ * directory for security reasons.
+ */
+ if (secure)
+--- 5491,5497 ----
+ ex_autocmd(exarg_T *eap)
+ {
+ /*
+! * Disallow autocommands from .exrc and .vimrc in current
+ * directory for security reasons.
+ */
+ if (secure)
+***************
+*** 11080,11089 ****
+ #endif
+
+ /*
+! * Close all windows but one.
+ */
+ if (put_line(fd, "silent only") == FAIL)
+ return FAIL;
+
+ /*
+ * Now a :cd command to the session directory or the current directory
+--- 11080,11092 ----
+ #endif
+
+ /*
+! * Close all windows and tabs but one.
+ */
+ if (put_line(fd, "silent only") == FAIL)
+ return FAIL;
++ if ((ssop_flags & SSOP_TABPAGES)
++ && put_line(fd, "silent tabonly") == FAIL)
++ return FAIL;
+
+ /*
+ * Now a :cd command to the session directory or the current directory
+***************
+*** 11193,11201 ****
+ */
+ tab_firstwin = firstwin; /* first window in tab page "tabnr" */
+ tab_topframe = topframe;
+ for (tabnr = 1; ; ++tabnr)
+ {
+! int need_tabnew = FALSE;
+ int cnr = 1;
+
+ if ((ssop_flags & SSOP_TABPAGES))
+--- 11196,11228 ----
+ */
+ tab_firstwin = firstwin; /* first window in tab page "tabnr" */
+ tab_topframe = topframe;
++ if ((ssop_flags & SSOP_TABPAGES))
++ {
++ int num_tabs;
++
++ /*
++ * Similar to ses_win_rec() below, populate the tab pages first so
++ * later local options won't be copied to the new tabs.
++ */
++ for (tabnr = 1; ; ++tabnr)
++ {
++ tabpage_T *tp = find_tabpage(tabnr);
++
++ if (tp == NULL) /* done all tab pages */
++ break;
++
++ if (tabnr > 1 && put_line(fd, "tabnew") == FAIL)
++ return FAIL;
++ }
++
++ num_tabs = tabnr - 1;
++ if (num_tabs > 1 && (fprintf(fd, "tabnext -%d", num_tabs - 1) < 0
++ || put_eol(fd) == FAIL))
++ return FAIL;
++ }
+ for (tabnr = 1; ; ++tabnr)
+ {
+! int need_tabnext = FALSE;
+ int cnr = 1;
+
+ if ((ssop_flags & SSOP_TABPAGES))
+***************
+*** 11215,11221 ****
+ tab_topframe = tp->tp_topframe;
+ }
+ if (tabnr > 1)
+! need_tabnew = TRUE;
+ }
+
+ /*
+--- 11242,11248 ----
+ tab_topframe = tp->tp_topframe;
+ }
+ if (tabnr > 1)
+! need_tabnext = TRUE;
+ }
+
+ /*
+***************
+*** 11233,11243 ****
+ #endif
+ )
+ {
+! if (fputs(need_tabnew ? "tabedit " : "edit ", fd) < 0
+ || ses_fname(fd, wp->w_buffer, &ssop_flags, TRUE)
+ == FAIL)
+ return FAIL;
+- need_tabnew = FALSE;
+ if (!wp->w_arg_idx_invalid)
+ edited_win = wp;
+ break;
+--- 11260,11273 ----
+ #endif
+ )
+ {
+! if (need_tabnext && put_line(fd, "tabnext") == FAIL)
+! return FAIL;
+! need_tabnext = FALSE;
+!
+! if (fputs("edit ", fd) < 0
+ || ses_fname(fd, wp->w_buffer, &ssop_flags, TRUE)
+ == FAIL)
+ return FAIL;
+ if (!wp->w_arg_idx_invalid)
+ edited_win = wp;
+ break;
+***************
+*** 11245,11251 ****
+ }
+
+ /* If no file got edited create an empty tab page. */
+! if (need_tabnew && put_line(fd, "tabnew") == FAIL)
+ return FAIL;
+
+ /*
+--- 11275,11281 ----
+ }
+
+ /* If no file got edited create an empty tab page. */
+! if (need_tabnext && put_line(fd, "tabnext") == FAIL)
+ return FAIL;
+
+ /*
+***************
+*** 11348,11354 ****
+ /*
+ * Wipe out an empty unnamed buffer we started in.
+ */
+! if (put_line(fd, "if exists('s:wipebuf') && s:wipebuf != bufnr('%')")
+ == FAIL)
+ return FAIL;
+ if (put_line(fd, " silent exe 'bwipe ' . s:wipebuf") == FAIL)
+--- 11378,11384 ----
+ /*
+ * Wipe out an empty unnamed buffer we started in.
+ */
+! if (put_line(fd, "if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0")
+ == FAIL)
+ return FAIL;
+ if (put_line(fd, " silent exe 'bwipe ' . s:wipebuf") == FAIL)
+*** ../vim-8.1.0148/src/testdir/test_mksession.vim 2018-06-12 16:49:26.366028607 +0200
+--- src/testdir/test_mksession.vim 2018-07-04 22:15:48.099410298 +0200
+***************
+*** 162,167 ****
+--- 162,214 ----
+ call delete('Xtest_mks.out')
+ endfunc
+
++ func Test_mksession_lcd_multiple_tabs()
++ tabnew
++ tabnew
++ lcd
++ tabfirst
++ lcd
++ mksession! Xtest_mks.out
++ tabonly
++ source Xtest_mks.out
++ call assert_true(haslocaldir(), 'Tab 1 localdir')
++ tabnext 2
++ call assert_true(!haslocaldir(), 'Tab 2 localdir')
++ tabnext 3
++ call assert_true(haslocaldir(), 'Tab 3 localdir')
++ call delete('Xtest_mks.out')
++ endfunc
++
++ func Test_mksession_blank_tabs()
++ tabnew
++ tabnew
++ tabnew
++ tabnext 3
++ mksession! Xtest_mks.out
++ tabnew
++ tabnew
++ tabnext 2
++ source Xtest_mks.out
++ call assert_equal(4, tabpagenr('$'), 'session restore should restore number of tabs')
++ call assert_equal(3, tabpagenr(), 'session restore should restore the active tab')
++ call delete('Xtest_mks.out')
++ endfunc
++
++ func Test_mksession_blank_windows()
++ split
++ split
++ split
++ 3 wincmd w
++ mksession! Xtest_mks.out
++ split
++ split
++ 2 wincmd w
++ source Xtest_mks.out
++ call assert_equal(4, winnr('$'), 'session restore should restore number of windows')
++ call assert_equal(3, winnr(), 'session restore should restore the active window')
++ call delete('Xtest_mks.out')
++ endfunc
++
+ if has('terminal')
+
+ func Test_mksession_terminal_shell()
+*** ../vim-8.1.0148/src/version.c 2018-07-04 22:12:19.880483379 +0200
+--- src/version.c 2018-07-04 22:18:05.734679485 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 149,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+179. You wonder why your household garbage can doesn't have an
+ "empty recycle bin" button.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0150 b/data/vim/patches/8.1.0150
new file mode 100644
index 000000000..a9ee674fe
--- /dev/null
+++ b/data/vim/patches/8.1.0150
@@ -0,0 +1,692 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0150
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0150
+Problem: Insufficient test coverage for Tcl.
+Solution: Add more tests. (Dominique Pelle, closes #3140)
+Files: src/testdir/test_tcl.vim
+
+
+*** ../vim-8.1.0149/src/testdir/test_tcl.vim 2017-01-29 23:18:53.000000000 +0100
+--- src/testdir/test_tcl.vim 2018-07-04 22:33:49.173452418 +0200
+***************
+*** 4,23 ****
+ finish
+ end
+
+! function Test_tcldo()
+ " Check deleting lines does not trigger ml_get error.
+ new
+ call setline(1, ['one', 'two', 'three'])
+ tcldo ::vim::command %d_
+ bwipe!
+
+! " Check switching to another buffer does not trigger ml_get error.
+ new
+ let wincount = winnr('$')
+ call setline(1, ['one', 'two', 'three'])
+ tcldo ::vim::command new
+ call assert_equal(wincount + 1, winnr('$'))
+ bwipe!
+ bwipe!
+ endfunc
+
+--- 4,637 ----
+ finish
+ end
+
+! " Helper function as there is no builtin tcleval() function similar
+! " to perleval, luaevel(), pyeval(), etc.
+! func TclEval(tcl_expr)
+! let s = split(execute('tcl ' . a:tcl_expr), "\n")
+! return (len(s) == 0) ? '' : s[-1]
+! endfunc
+!
+! func Test_tcldo()
+ " Check deleting lines does not trigger ml_get error.
+ new
+ call setline(1, ['one', 'two', 'three'])
+ tcldo ::vim::command %d_
+ bwipe!
+
+! " Check that switching to another buffer does not trigger ml_get error.
+ new
+ let wincount = winnr('$')
+ call setline(1, ['one', 'two', 'three'])
+ tcldo ::vim::command new
+ call assert_equal(wincount + 1, winnr('$'))
++ %bwipe!
++ endfunc
++
++ " Test :tcldo with a range
++ func Test_tcldo_range()
++ new
++ call setline(1, ['line1', 'line2', 'line3', 'line4'])
++ 2,3tcldo set line [string toupper $line]
++ call assert_equal(['line1', 'LINE2', 'LINE3', 'line4'], getline(1, '$'))
++ bwipe!
++ endfunc
++
++ " Test ::vim::beep
++ func Test_vim_beep()
++ call assert_beeps('tcl ::vim::beep')
++ call assert_fails('tcl ::vim::beep x', 'wrong # args: should be "::vim::beep"')
++ endfunc
++
++ " Test ::vim::buffer
++ func Test_vim_buffer()
++ " Test ::vim::buffer {nr}
++ e Xfoo1
++ call setline(1, ['foobar'])
++ let bn1 = bufnr('%')
++ let b1 = TclEval('::vim::buffer ' . bn1)
++ call assert_equal(b1, TclEval('set ::vim::current(buffer)'))
++
++ new Xfoo2
++ call setline(1, ['barfoo'])
++ let bn2 = bufnr('%')
++ let b2 = TclEval('::vim::buffer ' . bn2)
++ call assert_equal(b2, TclEval('set ::vim::current(buffer)'))
++
++ call assert_match('Xfoo1$', TclEval(b1 . ' name'))
++ call assert_match('Xfoo2$', TclEval(b2 . ' name'))
++
++ " Test ::vim::buffer exists {nr}
++ call assert_match('^[1-9]\d*$', TclEval('::vim::buffer exists ' . bn1))
++ call assert_match('^[1-9]\d*$', TclEval('::vim::buffer exists ' . bn2))
++ call assert_equal('0', TclEval('::vim::buffer exists 54321'))
++
++ " Test ::vim::buffer list
++ call assert_equal('2', TclEval('llength [::vim::buffer list]'))
++ call assert_equal(b1.' '.b2, TclEval('::vim::buffer list'))
++ tcl <<EOF
++ proc eachbuf { cmd } {
++ foreach b [::vim::buffer list] { $b command $cmd }
++ }
++ EOF
++ tcl eachbuf %s/foo/FOO/g
++ b! Xfoo1
++ call assert_equal(['FOObar'], getline(1, '$'))
++ b! Xfoo2
++ call assert_equal(['barFOO'], getline(1, '$'))
++
++ call assert_fails('tcl ::vim::buffer',
++ \ 'wrong # args: should be "::vim::buffer option"')
++ call assert_fails('tcl ::vim::buffer ' . bn1 . ' x',
++ \ 'wrong # args: should be "::vim::buffer bufNumber"')
++ call assert_fails('tcl ::vim::buffer 4321', 'invalid buffer number')
++ call assert_fails('tcl ::vim::buffer x',
++ \ 'bad option "x": must be exists or list')
++ call assert_fails('tcl ::vim::buffer exists',
++ \ 'wrong # args: should be "::vim::buffer exists bufNumber"')
++ call assert_fails('tcl ::vim::buffer exists x',
++ \ 'expected integer but got "x"')
++ call assert_fails('tcl ::vim::buffer list x',
++ \ 'wrong # args: should be "::vim::buffer list "')
++
++ tcl rename eachbuf ""
++ %bwipe!
++ endfunc
++
++ " Test ::vim::option
++ func Test_vim_option()
++ set cc=3,5
++
++ " Test getting option 'cc'
++ call assert_equal('3,5', TclEval('::vim::option cc'))
++ call assert_equal('3,5', &cc)
++
++ " Test setting option 'cc' (it returns the old option value)
++ call assert_equal('3,5', TclEval('::vim::option cc +4'))
++ call assert_equal('+4', &cc)
++ call assert_equal('+4', TclEval('::vim::option cc'))
++
++ call assert_fails('tcl ::vim::option xxx', 'unknown vimOption')
++ call assert_fails('tcl ::vim::option',
++ \ 'wrong # args: should be "::vim::option vimOption ?value?"')
++
++ set cc&
++ endfunc
++
++ " Test ::vim::expr
++ func Test_vim_expr()
++ call assert_equal(string(char2nr('X')),
++ \ TclEval('::vim::expr char2nr("X")'))
++
++ call assert_fails('tcl ::vim::expr x y',
++ \ 'wrong # args: should be "::vim::expr vimExpr"')
++ endfunc
++
++ " Test ::vim::command
++ func Test_vim_command()
++ call assert_equal('hello world',
++ \ TclEval('::vim::command {echo "hello world"}'))
++
++ " With the -quiet option, the error should silently be ignored.
++ call assert_equal('', TclEval('::vim::command -quiet xyz'))
++
++ call assert_fails('tcl ::vim::command',
++ \ 'wrong # args: should be "::vim::command ?-quiet? exCommand"')
++ call assert_fails('tcl ::vim::command -foo xyz', 'unknown flag: -foo')
++ call assert_fails('tcl ::vim::command xyz',
++ \ 'E492: Not an editor command: xyz')
++
++ " With the -quiet option, the error should silently be ignored.
++ call assert_equal('', TclEval('::vim::command -quiet xyz'))
++ endfunc
++
++ " Test ::vim::window list
++ func Test_vim_window_list()
++ e Xfoo1
++ new Xfoo2
++ let w2 = TclEval('set ::vim::current(window)')
++ wincmd j
++ let w1 = TclEval('set ::vim::current(window)')
++
++ call assert_equal('2', TclEval('llength [::vim::window list]'))
++ call assert_equal(w2.' '.w1, TclEval('::vim::window list'))
++
++ call assert_fails('tcl ::vim::window x', 'unknown option')
++ call assert_fails('tcl ::vim::window list x',
++ \ 'wrong # args: should be "::vim::window option"')
++
++ %bwipe
++ endfunc
++
++ " Test output messages
++ func Test_output()
++ call assert_fails('tcl puts vimerr "an error"', 'an error')
++ tcl puts vimout "a message"
++ tcl puts "another message"
++ let messages = split(execute('message'), "\n")
++ call assert_equal('a message', messages[-2])
++ call assert_equal('another message', messages[-1])
++
++ call assert_fails('tcl puts',
++ \ 'wrong # args: should be "puts ?-nonewline? ?channelId? string"')
++ endfunc
++
++ " Test $win height (get and set window height)
++ func Test_window_height()
++ new
++
++ " Test setting window height
++ tcl $::vim::current(window) height 2
++ call assert_equal(2, winheight(0))
++
++ " Test getting window height
++ call assert_equal('2', TclEval('$::vim::current(window) height'))
++
++ call assert_fails('tcl $::vim::current(window) height 2 2', 'wrong # args:')
++ call assert_fails('tcl $::vim::current(window) height x',
++ \ 'expected integer but got "x"')
++ bwipe
++ endfunc
++
++ " Test $win cursor (get and set cursor)
++ func Test_window_cursor()
++ new
++ call setline(1, ['line1', 'line2', 'line3', 'line5'])
++ tcl set win $::vim::current(window)
++
++ tcl $win cursor 2 4
++ call assert_equal([0, 2, 4, 0], getpos('.'))
++ call assert_equal('row 2 column 4', TclEval('$win cursor'))
++
++ " When setting ::vim::lbase to 0, line/col are counted from 0
++ " instead of 1.
++ tcl set ::vim::lbase 0
++ call assert_equal([0, 2, 4, 0], getpos('.'))
++ call assert_equal('row 1 column 3', TclEval('$win cursor'))
++ tcl $win cursor 2 4
++ call assert_equal([0, 3, 5, 0], getpos('.'))
++ call assert_equal('row 2 column 4', TclEval('$win cursor'))
++ tcl set ::vim::lbase 1
++ call assert_equal('row 3 column 5', TclEval('$win cursor'))
++ call assert_equal([0, 3, 5, 0], getpos('.'))
++
++ " test $win cursor {$var}
++ call cursor(2, 3)
++ tcl array set here [$win cursor]
++ call assert_equal([0, 2, 3, 0], getpos('.'))
++ call cursor(3, 1)
++ call assert_equal([0, 3, 1, 0], getpos('.'))
++ tcl $win cursor here
++ call assert_equal([0, 2, 3, 0], getpos('.'))
++ call cursor(3, 1)
++ call assert_equal([0, 3, 1, 0], getpos('.'))
++ tcl $win cursor $here(row) $here(column)
++ call assert_equal([0, 2, 3, 0], getpos('.'))
++
++ call assert_fails('tcl $win cursor 1 1 1', 'wrong # args:')
++
++ tcl unset win here
++ bwipe!
++ endfunc
++
++ " Test $win buffer
++ func Test_window_buffer()
++ new Xfoo1
++ new Xfoo2
++ tcl set b2 $::vim::current(buffer)
++ tcl set w2 $::vim::current(window)
++ wincmd j
++ tcl set b1 $::vim::current(buffer)
++ tcl set w1 $::vim::current(window)
++
++ call assert_equal(TclEval('set b1'), TclEval('$w1 buffer'))
++ call assert_equal(TclEval('set b2'), TclEval('$w2 buffer'))
++ call assert_equal(string(bufnr('Xfoo1')), TclEval('[$w1 buffer] number'))
++ call assert_equal(string(bufnr('Xfoo2')), TclEval('[$w2 buffer] number'))
++
++ call assert_fails('tcl $w1 buffer x', 'wrong # args:')
++
++ tcl unset b1 b2 w1 w2
++ %bwipe
++ endfunc
++
++ " Test $win command
++ func Test_window_command()
++ new Xfoo1
++ call setline(1, ['FOObar'])
++ new Xfoo2
++ call setline(1, ['fooBAR'])
++ tcl set w2 $::vim::current(window)
++ wincmd j
++ tcl set w1 $::vim::current(window)
++
++ tcl $w1 command "norm VU"
++ tcl $w2 command "norm Vu"
++ b! Xfoo1
++ call assert_equal('FOOBAR', getline(1))
++ b! Xfoo2
++ call assert_equal('foobar', getline(1))
++
++ call assert_fails('tcl $w1 command xyz',
++ \ 'E492: Not an editor command: xyz')
++ tcl $w1 command -quiet xyz
++
++ tcl unset w1 w2
++ %bwipe!
++ endfunc
++
++ " Test $win expr
++ func Test_window_expr()
++ new Xfoo1
++ new Xfoo2
++ tcl set w2 $::vim::current(window)
++ wincmd j
++ tcl set w1 $::vim::current(window)
++
++ call assert_equal('Xfoo1', TclEval('$w1 expr bufname("%")'))
++ call assert_equal('Xfoo2', TclEval('$w2 expr bufname("%")'))
++
++ call assert_fails('tcl $w1 expr', 'wrong # args:')
++ call assert_fails('tcl $w1 expr x x', 'wrong # args:')
++
++ tcl unset w1 w2
++ %bwipe
++ endfunc
++
++ " Test $win option
++ func Test_window_option()
++ new Xfoo1
++ new Xfoo2
++ tcl set w2 $::vim::current(window)
++ wincmd j
++ tcl set w1 $::vim::current(window)
++
++ " Test setting window option
++ tcl $w1 option syntax java
++ tcl $w2 option syntax rust
++
++ call assert_equal('java', &syntax)
++ wincmd k
++ call assert_equal('rust', &syntax)
++
++ " Test getting window option
++ call assert_equal('java', TclEval('$w1 option syntax'))
++ call assert_equal('rust', TclEval('$w2 option syntax'))
++
++ tcl unset w1 w2
++ %bwipe
++ endfunc
++
++ " Test $win delcmd {cmd}
++ func Test_window_delcmd()
++ new
++ tcl $::vim::current(window) delcmd [list set msg "window deleted"]
++ call assert_fails('tcl set msg', "can't read \"msg\": no such variable")
++ q
++ call assert_equal('window deleted', TclEval('set msg'))
++
++ call assert_fails('tcl $::vim::current(window) delcmd', 'wrong # args')
++
++ tcl unset msg
++ bwipe
++ endfunc
++
++ " Test $buf name
++ func Test_buffer_name()
++ " Test buffer name with a named buffer
++ new Xfoo
++ call assert_equal(expand('%:p'), TclEval('$::vim::current(buffer) name'))
++ bwipe
++
++ " Test buffer name with an unnamed buffer
++ new
++ call assert_equal('', TclEval('$::vim::current(buffer) name'))
++
++ call assert_fails('tcl $::vim::current(buffer) name x', 'wrong # args:')
++
++ bwipe
++ endfunc
++
++ " Test $buf number
++ func Test_buffer_number()
++ new
++ call assert_equal(string(bufnr('%')), TclEval('$::vim::current(buffer) number'))
++ new
++ call assert_equal(string(bufnr('%')), TclEval('$::vim::current(buffer) number'))
++
++ call assert_fails('tcl $::vim::current(buffer) number x', 'wrong # args:')
++
++ %bwipe
++ endfunc
++
++ " Test $buf count and $buf last
++ func Test_buffer_count()
++ new
++ call setline(1, ['one', 'two', 'three'])
++ call assert_equal('3', TclEval('$::vim::current(buffer) count'))
++ call assert_equal('3', TclEval('$::vim::current(buffer) last'))
++
++ " Check that $buf count and $buf last differ when ::vim::lbase is 0.
++ tcl set ::vim::lbase 0
++ call assert_equal('3', TclEval('$::vim::current(buffer) count'))
++ call assert_equal('2', TclEval('$::vim::current(buffer) last'))
++
++ call assert_fails('tcl $::vim::current(buffer) count x', 'wrong # args:')
++ call assert_fails('tcl $::vim::current(buffer) last x', 'wrong # args:')
++
++ tcl set ::vim::lbase 1
++ bwipe!
++ endfunc
++
++ " Test $buf delete (delete line(s) in buffer)
++ func Test_buffer_delete()
++ new
++ call setline(1, ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'])
++ tcl $::vim::current(buffer) delete 4 6
++ tcl $::vim::current(buffer) delete 2
++ call assert_equal(['one', 'three', 'seven', 'eight'], getline(1, '$'))
++
++ call assert_fails('tcl $::vim::current(buffer) delete -1', 'line number out of range')
++ call assert_fails('tcl $::vim::current(buffer) delete 0', 'line number out of range')
++ call assert_fails('tcl $::vim::current(buffer) delete 5', 'line number out of range')
++
++ call assert_fails('tcl $::vim::current(buffer) delete', 'wrong # args:')
++ call assert_fails('tcl $::vim::current(buffer) delete 1 2 3', 'wrong # args:')
++
++ bwipe!
++ endfunc
++
++ " Test $buf insert (insert line(s) in buffer)
++ func Test_buffer_insert()
++ new
++ tcl set buf $::vim::current(buffer)
++ tcl $buf insert 1 "first"
++ tcl $buf insert 2 "second"
++ tcl $buf insert 2 "third"
++ tcl $buf insert 4 "fourth"
++ tcl $buf insert 1 "fifth"
++ call assert_equal(['fifth', 'first', 'third', 'second', 'fourth', ''], getline(1, '$'))
++
++ call assert_fails('tcl $buf insert -1 "x"', 'line number out of range')
++ call assert_fails('tcl $buf insert 0 "x"', 'line number out of range')
++ call assert_fails('tcl $buf insert 7 "x"', 'line number out of range')
++
++ tcl unset buf
++ bwipe!
++ endfunc
++
++ " Test $buf append (append line in buffer)
++ func Test_buffer_append()
++ new
++ tcl set buf $::vim::current(buffer)
++ tcl $buf append 1 "first"
++ tcl $buf append 2 "second"
++ tcl $buf append 2 "third"
++ tcl $buf append 4 "fourth"
++ tcl $buf append 1 "fifth"
++ call assert_equal(['', 'fifth', 'first', 'third', 'second', 'fourth'], getline(1, '$'))
++
++ call assert_fails('tcl $buf append -1 "x"', 'line number out of range')
++ call assert_fails('tcl $buf append 0 "x"', 'line number out of range')
++ call assert_fails('tcl $buf append 7 "x"', 'line number out of range')
++
++ call assert_fails('tcl $buf append', 'wrong # args:')
++ call assert_fails('tcl $buf append 1 x x', 'wrong # args:')
++
++ tcl unset buf
++ bwipe!
++ endfunc
++
++ " Test $buf set (replacing line(s) in a buffer)
++ func Test_buffer_set()
++ new
++ call setline(1, ['line1', 'line2', 'line3', 'line4', 'line5'])
++ tcl $::vim::current(buffer) set 2 a
++ call assert_equal(['line1', 'a', 'line3', 'line4', 'line5'], getline(1, '$'))
++ tcl $::vim::current(buffer) set 3 4 b
++ call assert_equal(['line1', 'a', 'b', 'line5'], getline(1, '$'))
++ tcl $::vim::current(buffer) set 4 3 c
++ call assert_equal(['line1', 'a', 'c'], getline(1, '$'))
++
++ call assert_fails('tcl $::vim::current(buffer) set 0 "x"', 'line number out of range')
++ call assert_fails('tcl $::vim::current(buffer) set 5 "x"', 'line number out of range')
++
++ call assert_fails('tcl $::vim::current(buffer) set', 'wrong # args:')
++ bwipe!
++ endfunc
++
++ " Test $buf get (get line(s) from buffer)
++ func Test_buffer_get()
++ new
++ call setline(1, ['first line', 'two', 'three', 'last line'])
++ tcl set buf $::vim::current(buffer)
++
++ call assert_equal('first line', TclEval('$buf get top'))
++ call assert_equal('first line', TclEval('$buf get begin'))
++ call assert_equal('last line', TclEval('$buf get bottom'))
++ call assert_equal('last line', TclEval('$buf get last'))
++
++ call assert_equal('first line', TclEval('$buf get 1'))
++ call assert_equal('two', TclEval('$buf get 2'))
++ call assert_equal('three', TclEval('$buf get 3'))
++ call assert_equal('last line', TclEval('$buf get 4'))
++
++ call assert_equal('two three', TclEval('$buf get 2 3'))
++ call assert_equal('two three', TclEval('$buf get 3 2'))
++ call assert_equal('three {last line}', TclEval('$buf get 3 last'))
++
++ call assert_fails('tcl $buf get -1', 'line number out of range')
++ call assert_fails('tcl $buf get 0', 'line number out of range')
++ call assert_fails('tcl $buf get 5', 'line number out of range')
++ call assert_fails('tcl $buf get 0 1', 'line number out of range')
++
++ call assert_fails('tcl $::vim::current(buffer) get x', 'expected integer but got "x"')
++ call assert_fails('tcl $::vim::current(buffer) get 1 1 1', 'wrong # args:')
++
++ tcl unset buf
+ bwipe!
++ endfunc
++
++ " Test $buf mark (get position of a mark)
++ func Test_buffer_mark()
++ new
++ call setline(1, ['one', 'two', 'three', 'four'])
++ /three
++ norm! ma
++ norm! jllmB
++
++ call assert_equal('row 3 column 1', TclEval('$::vim::current(buffer) mark a'))
++ call assert_equal('row 4 column 3', TclEval('$::vim::current(buffer) mark B'))
++
++ call assert_fails('tcl $::vim::current(buffer) mark /', 'invalid mark name')
++ call assert_fails('tcl $::vim::current(buffer) mark z', 'mark not set')
++ call assert_fails('tcl $::vim::current(buffer) mark', 'wrong # args:')
++
++ delmarks aB
+ bwipe!
+ endfunc
+
++ " Test $buf option (test and set option in context of a buffer)
++ func Test_buffer_option()
++ new Xfoo1
++ tcl set b1 $::vim::current(buffer)
++ new Xfoo2
++ tcl set b2 $::vim::current(buffer)
++
++ tcl $b1 option foldcolumn 2
++ tcl $b2 option foldcolumn 3
++
++ call assert_equal(3, &foldcolumn)
++ wincmd j
++ call assert_equal(2, &foldcolumn)
++
++ call assert_equal('2', TclEval('$b1 option foldcolumn'))
++ call assert_equal('3', TclEval('$b2 option foldcolumn'))
++
++ call assert_fails('tcl $::vim::current(buffer) option', 'wrong # args:')
++
++ set foldcolumn&
++ tcl unset b1 b2
++ %bwipe
++ endfunc
++
++ " Test $buf expr (evaluate vim expression)
++ func Test_buffer_expr()
++ new Xfoo1
++ norm ifoo1
++ tcl set b1 $::vim::current(buffer)
++
++ new Xfoo2
++ norm ifoo2
++ tcl set b2 $::vim::current(buffer)
++
++ call assert_equal('foo1', TclEval('$b1 expr getline(1)'))
++ call assert_equal('foo2', TclEval('$b2 expr getline(1)'))
++
++ call assert_fails('tcl expr', 'wrong # args:')
++
++ tcl unset b1 b2
++ %bwipe!
++ endfunc
++
++ " Test $buf delcmd {cmd} (command executed when buffer is deleted)
++ func Test_buffer_delcmd()
++ new Xfoo
++ split
++ tcl $::vim::current(buffer) delcmd [list set msg "buffer deleted"]
++ q
++ call assert_fails('tcl set msg', "can't read \"msg\": no such variable")
++ q
++ call assert_equal('buffer deleted', TclEval('set msg'))
++
++ call assert_fails('tcl $::vim::current(window) delcmd', 'wrong # args')
++ call assert_fails('tcl $::vim::current(window) delcmd x x', 'wrong # args')
++
++ tcl unset msg
++ %bwipe
++ endfunc
++
++ func Test_vim_current()
++ " Only test errors as ::vim::current(...) is already indirectly
++ " tested by many other tests.
++ call assert_fails('tcl $::vim::current(buffer)', 'wrong # args:')
++ call assert_fails('tcl $::vim::current(window)', 'wrong # args:')
++ endfunc
++
++ " Test $buf windows (windows list of a buffer)
++ func Test_buffer_windows()
++ new Xfoo
++ split
++ new Xbar
++ split
++ vsplit
++
++ tcl set bar_wl [$::vim::current(buffer) windows]
++ 2wincmd j
++ tcl set foo_wl [$::vim::current(buffer) windows]
++
++ call assert_equal('2', TclEval('llength $foo_wl'))
++ call assert_equal('3', TclEval('llength $bar_wl'))
++
++ call assert_fails('tcl $::vim::current(buffer) windows x', 'wrong # args:')
++
++ tcl unset bar_wl foo_wl
++ %bwipe
++ endfunc
++
++ " Test :tclfile
++ func Test_tclfile()
++ call delete('Xtcl_file')
++ call writefile(['set pi [format "%.2f" [expr acos(-1.0)]]'], 'Xtcl_file')
++ call setfperm('Xtcl_file', 'r-xr-xr-x')
++
++ tclfile Xtcl_file
++ call assert_equal('3.14', TclEval('set pi'))
++
++ tcl unset pi
++ call delete('Xtcl_file')
++ endfunc
++
++ " Test :tclfile with syntax error in tcl script
++ func Test_tclfile_error()
++ call delete('Xtcl_file')
++ call writefile(['xyz'], 'Xtcl_file')
++ call setfperm('Xtcl_file', 'r-xr-xr-x')
++
++ call assert_fails('tclfile Xtcl_file', 'invalid command name "xyz"')
++
++ call delete('Xtcl_file')
++ endfunc
++
++ " Test exiting current Tcl interprepter and re-creating one.
++ func Test_tcl_exit()
++ tcl set foo "foo"
++ call assert_fails('tcl exit 3', 'E572: exit code 3')
++
++ " The Tcl interpreter should have been deleted and a new one
++ " is re-created with the next :tcl command.
++ call assert_fails('tcl set foo', "can't read \"foo\": no such variable")
++ tcl set bar "bar"
++ call assert_equal('bar', TclEval('set bar'))
++
++ tcl unset bar
++ endfunc
+*** ../vim-8.1.0149/src/version.c 2018-07-04 22:26:24.515946368 +0200
+--- src/version.c 2018-07-04 22:36:32.324478980 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 150,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+180. You maintain more than six e-mail addresses.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0151 b/data/vim/patches/8.1.0151
new file mode 100644
index 000000000..34c8d0068
--- /dev/null
+++ b/data/vim/patches/8.1.0151
@@ -0,0 +1,57 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0151
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0151
+Problem: Mksession test fails on MS-Windows.
+Solution: Always use an argument for :lcd.
+Files: src/testdir/test_mksession.vim
+
+
+*** ../vim-8.1.0150/src/testdir/test_mksession.vim 2018-07-04 22:26:24.515946368 +0200
+--- src/testdir/test_mksession.vim 2018-07-04 22:42:41.126071782 +0200
+***************
+*** 165,173 ****
+ func Test_mksession_lcd_multiple_tabs()
+ tabnew
+ tabnew
+! lcd
+ tabfirst
+! lcd
+ mksession! Xtest_mks.out
+ tabonly
+ source Xtest_mks.out
+--- 165,173 ----
+ func Test_mksession_lcd_multiple_tabs()
+ tabnew
+ tabnew
+! lcd .
+ tabfirst
+! lcd .
+ mksession! Xtest_mks.out
+ tabonly
+ source Xtest_mks.out
+*** ../vim-8.1.0150/src/version.c 2018-07-04 22:36:42.796407775 +0200
+--- src/version.c 2018-07-04 22:43:33.357743716 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 151,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+181. You still remember the "happy tune" your modem made
+ while dialing your ISP.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0152 b/data/vim/patches/8.1.0152
new file mode 100644
index 000000000..dc4db0b92
--- /dev/null
+++ b/data/vim/patches/8.1.0152
@@ -0,0 +1,512 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0152
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0152
+Problem: Cannot easily run individual tests on MS-Windows.
+Solution: Move the list of tests to a separate file. Add a build rule in
+ the MSVC makefile.
+Files: Filelist, src/Makefile, src/Make_all.mak, src/Make_mvc.mak
+
+
+*** ../vim-8.1.0151/Filelist 2018-06-30 17:08:56.064115274 +0200
+--- Filelist 2018-07-04 22:58:13.976431486 +0200
+***************
+*** 7,12 ****
+--- 7,13 ----
+ .lgtm.yml \
+ .travis.yml \
+ appveyor.yml \
++ src/Make_all.mak \
+ src/appveyor.bat \
+ src/README.txt \
+ src/alloc.h \
+*** ../vim-8.1.0151/src/Makefile 2018-07-02 20:51:21.035882093 +0200
+--- src/Makefile 2018-07-04 23:00:00.671802398 +0200
+***************
+*** 1524,1529 ****
+--- 1524,1532 ----
+ DEST_MAN_RU = $(DEST_MAN_TOP)/ru.KOI8-R$(MAN1DIR)
+ DEST_MAN_RU_U = $(DEST_MAN_TOP)/ru.UTF-8$(MAN1DIR)
+
++ # The list of tests is common to all systems.
++ include Make_all.mak
++
+ # BASIC_SRC: files that are always used
+ # GUI_SRC: extra GUI files for current configuration
+ # ALL_GUI_SRC: all GUI files for Unix
+***************
+*** 2125,2327 ****
+
+ # Run individual NEW style test.
+ # These do not depend on the executable, compile it when needed.
+! test_arglist \
+! test_arabic \
+! test_assert \
+! test_assign \
+! test_autochdir \
+! test_autocmd \
+! test_autoload \
+! test_backspace_opt \
+! test_blockedit \
+! test_breakindent \
+! test_bufline \
+! test_bufwintabinfo \
+! test_cd \
+! test_cdo \
+! test_changedtick \
+! test_changelist \
+! test_channel \
+! test_charsearch \
+! test_charsearch_utf8 \
+! test_cindent \
+! test_clientserver \
+! test_close_count \
+! test_cmdline \
+! test_command_count \
+! test_comparators \
+! test_compiler \
+! test_crypt \
+! test_cscope \
+! test_cursor_func \
+! test_curswant \
+! test_delete \
+! test_diffmode \
+! test_digraph \
+! test_display \
+! test_edit \
+! test_erasebackword \
+! test_escaped_glob \
+! test_eval_stuff \
+! test_ex_undo \
+! test_ex_z \
+! test_exit \
+! test_exec_while_if \
+! test_execute_func \
+! test_exists \
+! test_exists_autocmd \
+! test_expand \
+! test_expand_dllpath \
+! test_expr \
+! test_expr_utf8 \
+! test_farsi \
+! test_feedkeys \
+! test_file_perm \
+! test_file_size \
+! test_fileformat \
+! test_filetype \
+! test_filter_cmd \
+! test_filter_map \
+! test_find_complete \
+! test_findfile \
+! test_fixeol \
+! test_float_func \
+! test_fnameescape \
+! test_fnamemodify \
+! test_fold \
+! test_functions \
+! test_ga \
+! test_getcwd \
+! test_getvar \
+! test_gf \
+! test_glob2regpat \
+! test_global \
+! test_gn \
+! test_goto \
+! test_gui \
+! test_gui_init \
+! test_hardcopy \
+! test_help \
+! test_help_tagjump \
+! test_hide \
+! test_highlight \
+! test_history \
+! test_hlsearch \
+! test_iminsert \
+! test_increment \
+! test_increment_dbcs \
+! test_ins_complete \
+! test_job_fails \
+! test_join \
+! test_json \
+! test_jumplist \
+! test_jumps \
+! test_lambda \
+! test_langmap \
+! test_largefile \
+! test_let \
+! test_lineending \
+! test_lispwords \
+! test_listchars \
+! test_listdict \
+! test_listlbr \
+! test_listlbr_utf8 \
+! test_lua \
+! test_makeencoding \
+! test_man \
+! test_maparg \
+! test_mapping \
+! test_marks \
+! test_match \
+! test_matchadd_conceal \
+! test_matchadd_conceal_utf8 \
+! test_menu \
+! test_messages \
+! test_mksession \
+! test_mksession_utf8 \
+! test_nested_function \
+! test_netbeans \
+! test_normal \
+! test_number \
+! test_options \
+! test_packadd \
+! test_partial \
+! test_paste \
+! test_perl \
+! test_plus_arg_edit \
+! test_popup \
+! test_preview \
+! test_profile \
+! test_prompt_buffer \
+! test_put \
+! test_python2 \
+! test_python3 \
+! test_pyx2 \
+! test_pyx3 \
+! test_quickfix \
+! test_quotestar \
+! test_recover \
+! test_regex_char_classes \
+! test_regexp_latin \
+! test_regexp_utf8 \
+! test_registers \
+! test_reltime \
+! test_retab \
+! test_ruby \
+! test_scroll_opt \
+! test_scrollbind \
+! test_search \
+! test_searchpos \
+! test_set \
+! test_sha256 \
+! test_signs \
+! test_smartindent \
+! test_sort \
+! test_source_utf8 \
+! test_spell \
+! test_startup \
+! test_startup_utf8 \
+! test_stat \
+! test_statusline \
+! test_substitute \
+! test_swap \
+! test_syn_attr \
+! test_syntax \
+! test_system \
+! test_tab \
+! test_tabline \
+! test_tabpage \
+! test_tagcase \
+! test_tagjump \
+! test_taglist \
+! test_tcl \
+! test_terminal \
+! test_terminal_fail \
+! test_textformat \
+! test_textobjects \
+! test_timers \
+! test_true_false \
+! test_undo \
+! test_unlet \
+! test_usercommands \
+! test_utf8 \
+! test_utf8_comparisons \
+! test_vartabs \
+! test_viminfo \
+! test_vimscript \
+! test_virtualedit \
+! test_visual \
+! test_winbar \
+! test_winbuf_close \
+! test_window_cmd \
+! test_window_id \
+! test_windows_home \
+! test_wordcount \
+! test_writefile \
+! test_xxd \
+! test_alot_latin \
+! test_alot_utf8 \
+! test_alot:
+ cd testdir; rm -f $@.res test.log messages; $(MAKE) -f Makefile $@.res VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
+ @if test -f testdir/test.log; then \
+ cat testdir/test.log; \
+--- 2128,2134 ----
+
+ # Run individual NEW style test.
+ # These do not depend on the executable, compile it when needed.
+! $(NEW_TESTS):
+ cd testdir; rm -f $@.res test.log messages; $(MAKE) -f Makefile $@.res VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
+ @if test -f testdir/test.log; then \
+ cat testdir/test.log; \
+*** ../vim-8.1.0151/src/Make_all.mak 2018-07-04 23:04:22.810262212 +0200
+--- src/Make_all.mak 2018-07-04 22:58:28.564345380 +0200
+***************
+*** 0 ****
+--- 1,203 ----
++ #
++ # Common Makefile, defines the list of tests to run.
++ #
++
++ # Individual tests, including the ones part of test_alot
++ NEW_TESTS = \
++ test_arglist \
++ test_arabic \
++ test_assert \
++ test_assign \
++ test_autochdir \
++ test_autocmd \
++ test_autoload \
++ test_backspace_opt \
++ test_blockedit \
++ test_breakindent \
++ test_bufline \
++ test_bufwintabinfo \
++ test_cd \
++ test_cdo \
++ test_changedtick \
++ test_changelist \
++ test_channel \
++ test_charsearch \
++ test_charsearch_utf8 \
++ test_cindent \
++ test_clientserver \
++ test_close_count \
++ test_cmdline \
++ test_command_count \
++ test_comparators \
++ test_compiler \
++ test_crypt \
++ test_cscope \
++ test_cursor_func \
++ test_curswant \
++ test_delete \
++ test_diffmode \
++ test_digraph \
++ test_display \
++ test_edit \
++ test_erasebackword \
++ test_escaped_glob \
++ test_eval_stuff \
++ test_ex_undo \
++ test_ex_z \
++ test_exit \
++ test_exec_while_if \
++ test_execute_func \
++ test_exists \
++ test_exists_autocmd \
++ test_expand \
++ test_expand_dllpath \
++ test_expr \
++ test_expr_utf8 \
++ test_farsi \
++ test_feedkeys \
++ test_file_perm \
++ test_file_size \
++ test_fileformat \
++ test_filetype \
++ test_filter_cmd \
++ test_filter_map \
++ test_find_complete \
++ test_findfile \
++ test_fixeol \
++ test_float_func \
++ test_fnameescape \
++ test_fnamemodify \
++ test_fold \
++ test_functions \
++ test_ga \
++ test_getcwd \
++ test_getvar \
++ test_gf \
++ test_glob2regpat \
++ test_global \
++ test_gn \
++ test_goto \
++ test_gui \
++ test_gui_init \
++ test_hardcopy \
++ test_help \
++ test_help_tagjump \
++ test_hide \
++ test_highlight \
++ test_history \
++ test_hlsearch \
++ test_iminsert \
++ test_increment \
++ test_increment_dbcs \
++ test_ins_complete \
++ test_job_fails \
++ test_join \
++ test_json \
++ test_jumplist \
++ test_jumps \
++ test_lambda \
++ test_langmap \
++ test_largefile \
++ test_let \
++ test_lineending \
++ test_lispwords \
++ test_listchars \
++ test_listdict \
++ test_listlbr \
++ test_listlbr_utf8 \
++ test_lua \
++ test_makeencoding \
++ test_man \
++ test_maparg \
++ test_mapping \
++ test_marks \
++ test_match \
++ test_matchadd_conceal \
++ test_matchadd_conceal_utf8 \
++ test_menu \
++ test_messages \
++ test_mksession \
++ test_mksession_utf8 \
++ test_nested_function \
++ test_netbeans \
++ test_normal \
++ test_number \
++ test_options \
++ test_packadd \
++ test_partial \
++ test_paste \
++ test_perl \
++ test_plus_arg_edit \
++ test_popup \
++ test_preview \
++ test_profile \
++ test_prompt_buffer \
++ test_put \
++ test_python2 \
++ test_python3 \
++ test_pyx2 \
++ test_pyx3 \
++ test_quickfix \
++ test_quotestar \
++ test_recover \
++ test_regex_char_classes \
++ test_regexp_latin \
++ test_regexp_utf8 \
++ test_registers \
++ test_reltime \
++ test_retab \
++ test_ruby \
++ test_scroll_opt \
++ test_scrollbind \
++ test_search \
++ test_searchpos \
++ test_set \
++ test_sha256 \
++ test_signs \
++ test_smartindent \
++ test_sort \
++ test_source_utf8 \
++ test_spell \
++ test_startup \
++ test_startup_utf8 \
++ test_stat \
++ test_statusline \
++ test_substitute \
++ test_swap \
++ test_syn_attr \
++ test_syntax \
++ test_system \
++ test_tab \
++ test_tabline \
++ test_tabpage \
++ test_tagcase \
++ test_tagjump \
++ test_taglist \
++ test_tcl \
++ test_terminal \
++ test_terminal_fail \
++ test_textformat \
++ test_textobjects \
++ test_timers \
++ test_true_false \
++ test_undo \
++ test_unlet \
++ test_usercommands \
++ test_utf8 \
++ test_utf8_comparisons \
++ test_vartabs \
++ test_viminfo \
++ test_vimscript \
++ test_virtualedit \
++ test_visual \
++ test_winbar \
++ test_winbuf_close \
++ test_window_cmd \
++ test_window_id \
++ test_windows_home \
++ test_wordcount \
++ test_writefile \
++ test_xxd \
++ test_alot_latin \
++ test_alot_utf8 \
++ test_alot
+*** ../vim-8.1.0151/src/Make_mvc.mak 2018-06-19 18:58:04.010489820 +0200
+--- src/Make_mvc.mak 2018-07-04 23:01:41.003212115 +0200
+***************
+*** 693,698 ****
+--- 693,700 ----
+ ! endif
+ !endif # DEBUG
+
++ !include Make_all.mak
++
+ INCL = vim.h alloc.h arabic.h ascii.h ex_cmds.h farsi.h feature.h globals.h \
+ keymap.h macros.h option.h os_dos.h os_win32.h proto.h regexp.h \
+ spell.h structs.h term.h beval.h $(NBDEBUG_INCL)
+***************
+*** 1296,1301 ****
+--- 1298,1311 ----
+ $(MAKE) /NOLOGO -f Make_dos.mak clean
+ cd ..
+
++ $(NEW_TESTS):
++ cd testdir
++ - if exist $@.res del $@.res
++ $(MAKE) /NOLOGO -f Make_dos.mak nolog
++ $(MAKE) /NOLOGO -f Make_dos.mak $@.res
++ $(MAKE) /NOLOGO -f Make_dos.mak report
++ cd ..
++
+ ###########################################################################
+
+ # Create a default rule for transforming .c files to .obj files in $(OUTDIR)
+*** ../vim-8.1.0151/src/version.c 2018-07-04 22:44:05.273544402 +0200
+--- src/version.c 2018-07-04 22:56:31.145039418 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 152,
+ /**/
+
+--
+Wizards had always known that the act of observation changed the thing that
+was observed, and sometimes forgot that it also changed the observer too.
+ Terry Pratchett - Interesting times
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0153 b/data/vim/patches/8.1.0153
new file mode 100644
index 000000000..5d8a2e571
--- /dev/null
+++ b/data/vim/patches/8.1.0153
@@ -0,0 +1,53 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0153
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0153 (after 8.1.0152)
+Problem: Build with SHADOWDIR fails. (Elimar Riesebieter)
+Solution: Create a link for Make_all.mak. (Tony Mechelynck)
+Files: src/Makefile
+
+
+*** ../vim-8.1.0152/src/Makefile 2018-07-04 23:05:19.221931527 +0200
+--- src/Makefile 2018-07-05 17:08:32.727810237 +0200
+***************
+*** 2681,2687 ****
+
+ shadow: runtime pixmaps
+ $(MKDIR_P) $(SHADOWDIR)
+! cd $(SHADOWDIR); ln -s ../*.[chm] ../*.in ../*.sh ../*.xs ../*.xbm ../gui_gtk_res.xml ../toolcheck ../proto ../libvterm ../vimtutor ../gvimtutor ../install-sh .
+ mkdir $(SHADOWDIR)/auto
+ cd $(SHADOWDIR)/auto; ln -s ../../auto/configure .
+ $(MKDIR_P) $(SHADOWDIR)/po
+--- 2681,2687 ----
+
+ shadow: runtime pixmaps
+ $(MKDIR_P) $(SHADOWDIR)
+! cd $(SHADOWDIR); ln -s ../*.[chm] ../*.in ../*.sh ../*.xs ../*.xbm ../gui_gtk_res.xml ../toolcheck ../proto ../libvterm ../vimtutor ../gvimtutor ../install-sh ../Make_all.mak .
+ mkdir $(SHADOWDIR)/auto
+ cd $(SHADOWDIR)/auto; ln -s ../../auto/configure .
+ $(MKDIR_P) $(SHADOWDIR)/po
+*** ../vim-8.1.0152/src/version.c 2018-07-04 23:05:19.221931527 +0200
+--- src/version.c 2018-07-05 17:09:44.847425259 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 153,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+184. You no longer ask prospective dates what their sign is, instead
+ your line is "Hi, what's your URL?"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0154 b/data/vim/patches/8.1.0154
new file mode 100644
index 000000000..c22b71b97
--- /dev/null
+++ b/data/vim/patches/8.1.0154
@@ -0,0 +1,132 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0154
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0154
+Problem: Crash with "set smarttab shiftwidth=0 softtabstop=-1".
+Solution: Fall back to using 'tabstop'. (closes #3155)
+Files: src/edit.c, src/testdir/test_tab.vim
+
+
+*** ../vim-8.1.0153/src/edit.c 2018-07-02 20:51:21.031882115 +0200
+--- src/edit.c 2018-07-05 22:23:27.440802276 +0200
+***************
+*** 9347,9366 ****
+ && (!*inserted_space_p
+ || arrow_used))))))
+ {
+- #ifndef FEAT_VARTABS
+ int ts;
+- #endif
+ colnr_T vcol;
+ colnr_T want_vcol;
+ colnr_T start_vcol;
+
+ *inserted_space_p = FALSE;
+- #ifndef FEAT_VARTABS
+- if (p_sta && in_indent)
+- ts = (int)get_sw_value(curbuf);
+- else
+- ts = (int)get_sts_value();
+- #endif
+ /* Compute the virtual column where we want to be. Since
+ * 'showbreak' may get in the way, need to get the last column of
+ * the previous character. */
+--- 9347,9358 ----
+***************
+*** 9371,9381 ****
+ inc_cursor();
+ #ifdef FEAT_VARTABS
+ if (p_sta && in_indent)
+! want_vcol = (want_vcol / curbuf->b_p_sw) * curbuf->b_p_sw;
+ else
+ want_vcol = tabstop_start(want_vcol, get_sts_value(),
+ curbuf->b_p_vsts_array);
+ #else
+ want_vcol = (want_vcol / ts) * ts;
+ #endif
+
+--- 9363,9380 ----
+ inc_cursor();
+ #ifdef FEAT_VARTABS
+ if (p_sta && in_indent)
+! {
+! ts = (int)get_sw_value(curbuf);
+! want_vcol = (want_vcol / ts) * ts;
+! }
+ else
+ want_vcol = tabstop_start(want_vcol, get_sts_value(),
+ curbuf->b_p_vsts_array);
+ #else
++ if (p_sta && in_indent)
++ ts = (int)get_sw_value(curbuf);
++ else
++ ts = (int)get_sts_value();
+ want_vcol = (want_vcol / ts) * ts;
+ #endif
+
+***************
+*** 10200,10206 ****
+ #ifdef FEAT_VARTABS
+ if (p_sta && ind) /* insert tab in indent, use 'shiftwidth' */
+ {
+! temp = (int)curbuf->b_p_sw;
+ temp -= get_nolist_virtcol() % temp;
+ }
+ else if (tabstop_count(curbuf->b_p_vsts_array) > 0 || curbuf->b_p_sts != 0)
+--- 10199,10205 ----
+ #ifdef FEAT_VARTABS
+ if (p_sta && ind) /* insert tab in indent, use 'shiftwidth' */
+ {
+! temp = (int)get_sw_value(curbuf);
+ temp -= get_nolist_virtcol() % temp;
+ }
+ else if (tabstop_count(curbuf->b_p_vsts_array) > 0 || curbuf->b_p_sts != 0)
+*** ../vim-8.1.0153/src/testdir/test_tab.vim 2018-07-02 20:51:21.035882093 +0200
+--- src/testdir/test_tab.vim 2018-07-05 22:19:41.994015889 +0200
+***************
+*** 76,81 ****
+ exe "normal A\<BS>x\<Esc>"
+ call assert_equal("x x", getline(1))
+
+! set sts=0 sw=0 backspace&
+ bwipe!
+ endfunc
+--- 76,90 ----
+ exe "normal A\<BS>x\<Esc>"
+ call assert_equal("x x", getline(1))
+
+! call setline(1, 'x')
+! set sts=-1 sw=0 smarttab
+! exe "normal I\<Tab>\<Esc>"
+! call assert_equal("\tx", getline(1))
+!
+! call setline(1, 'x')
+! exe "normal I\<Tab>\<BS>\<Esc>"
+! call assert_equal("x", getline(1))
+!
+! set sts=0 sw=0 backspace& nosmarttab
+ bwipe!
+ endfunc
+*** ../vim-8.1.0153/src/version.c 2018-07-05 17:11:15.726937929 +0200
+--- src/version.c 2018-07-05 22:26:36.351782249 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 154,
+ /**/
+
+--
+A computer program does what you tell it to do, not what you want it to do.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0155 b/data/vim/patches/8.1.0155
new file mode 100644
index 000000000..bda4f000e
--- /dev/null
+++ b/data/vim/patches/8.1.0155
@@ -0,0 +1,44 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0155
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0155
+Problem: Evim.man missing from the distribution.
+Solution: Add it to the list.
+Files: Filelist
+
+
+*** ../vim-8.1.0154/Filelist 2018-07-04 23:05:19.221931527 +0200
+--- Filelist 2018-07-05 22:56:27.346990258 +0200
+***************
+*** 710,715 ****
+--- 710,716 ----
+
+ # runtime for Amiga (also in the extra archive)
+ RT_AMI_DOS = \
++ runtime/doc/evim.man \
+ runtime/doc/vim.man \
+ runtime/doc/vimdiff.man \
+ runtime/doc/vimtutor.man \
+*** ../vim-8.1.0154/src/version.c 2018-07-05 22:27:04.463630279 +0200
+--- src/version.c 2018-07-05 22:57:19.182722612 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 155,
+ /**/
+
+--
+I'm in shape. Round IS a shape.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0156 b/data/vim/patches/8.1.0156
new file mode 100644
index 000000000..6fffda959
--- /dev/null
+++ b/data/vim/patches/8.1.0156
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0156
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0156
+Problem: MS-Windows compiler warning.
+Solution: Add a type cast. (Mike Williams)
+Files: src/version.c
+
+
+*** ../vim-8.1.0155/src/version.c 2018-07-05 22:58:12.658446246 +0200
+--- src/version.c 2018-07-06 22:50:55.951147490 +0200
+***************
+*** 61,67 ****
+ + strlen(VIM_VERSION_DATE_ONLY)
+ + strlen(date_time);
+
+! longVersion = (char *)alloc(len);
+ if (longVersion == NULL)
+ longVersion = VIM_VERSION_LONG;
+ else
+--- 61,67 ----
+ + strlen(VIM_VERSION_DATE_ONLY)
+ + strlen(date_time);
+
+! longVersion = (char *)alloc((unsigned)len);
+ if (longVersion == NULL)
+ longVersion = VIM_VERSION_LONG;
+ else
+*** ../vim-8.1.0155/src/version.c 2018-07-05 22:58:12.658446246 +0200
+--- src/version.c 2018-07-06 22:50:55.951147490 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 156,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+192. Your boss asks you to "go fer" coffee and you come up with 235 FTP sites.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0157 b/data/vim/patches/8.1.0157
new file mode 100644
index 000000000..0608b5cdb
--- /dev/null
+++ b/data/vim/patches/8.1.0157
@@ -0,0 +1,76 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.01
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0157
+Problem: Old iTerm2 is not recognized, resulting in stray output.
+Solution: Recognize the termresponse.
+Files: src/term.c
+
+
+*** ../vim-8.1.0156/src/term.c 2018-07-03 17:16:55.626135028 +0200
+--- src/term.c 2018-07-06 23:07:26.257971889 +0200
+***************
+*** 4659,4675 ****
+
+ if (version == 95)
+ {
+! /* Mac Terminal.app sends 1;95;0 */
+ if (STRNCMP(tp + extra - 2, "1;95;0c", 7) == 0)
+ {
+ is_not_xterm = TRUE;
+ is_mac_terminal = TRUE;
+ }
+ # ifdef FEAT_MOUSE_SGR
+! /* iTerm2 sends 0;95;0 */
+ if (STRNCMP(tp + extra - 2, "0;95;0c", 7) == 0)
+ is_iterm2 = TRUE;
+ # endif
+ }
+
+ /* Only set 'ttymouse' automatically if it was not set
+--- 4659,4679 ----
+
+ if (version == 95)
+ {
+! // Mac Terminal.app sends 1;95;0
+ if (STRNCMP(tp + extra - 2, "1;95;0c", 7) == 0)
+ {
+ is_not_xterm = TRUE;
+ is_mac_terminal = TRUE;
+ }
+ # ifdef FEAT_MOUSE_SGR
+! // iTerm2 sends 0;95;0
+ if (STRNCMP(tp + extra - 2, "0;95;0c", 7) == 0)
+ is_iterm2 = TRUE;
++ else
+ # endif
++ // old iTerm2 sends 0;95;
++ if (STRNCMP(tp + extra - 2, "0;95;c", 6) == 0)
++ is_not_xterm = TRUE;
+ }
+
+ /* Only set 'ttymouse' automatically if it was not set
+*** ../vim-8.1.0156/src/version.c 2018-07-06 22:51:58.010808660 +0200
+--- src/version.c 2018-07-06 23:10:48.856915992 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 157,
+ /**/
+
+
+--
+Press any key to continue, press any other key to quit.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0158 b/data/vim/patches/8.1.0158
new file mode 100644
index 000000000..878bf2e15
--- /dev/null
+++ b/data/vim/patches/8.1.0158
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0158
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0158
+Problem: GUI: input() fails if CTRL-C was pressed before. (Michael Naumann)
+Solution: call vpeekc() to drop the CTRL-C from the input stream.
+Files: src/ex_docmd.c
+
+
+*** ../vim-8.1.0157/src/ex_docmd.c 2018-07-04 22:26:24.515946368 +0200
+--- src/ex_docmd.c 2018-07-07 16:11:37.571323580 +0200
+***************
+*** 9157,9162 ****
+--- 9157,9167 ----
+ parse_queued_messages();
+ #endif
+ }
++
++ // If CTRL-C was typed to interrupt the sleep, drop the CTRL-C from the
++ // input buffer, otherwise a following call to input() fails.
++ if (got_int)
++ (void)vpeekc();
+ }
+
+ static void
+*** ../vim-8.1.0157/src/version.c 2018-07-06 23:11:35.484671649 +0200
+--- src/version.c 2018-07-07 16:12:59.190883016 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 158,
+ /**/
+
+--
+Some of the well known MS-Windows errors:
+ EMULTI Multitasking attempted, system confused
+ EKEYBOARD Keyboard locked, try getting out of this one!
+ EXPLAIN Unexplained error, please tell us what happened
+ EFUTURE Reserved for our future mistakes
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0159 b/data/vim/patches/8.1.0159
new file mode 100644
index 000000000..27a8575b1
--- /dev/null
+++ b/data/vim/patches/8.1.0159
@@ -0,0 +1,77 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0159
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0159
+Problem: Completion for user names does not work if a prefix is also a full
+ matching name. (Nazri Ramliy)
+Solution: Accept both full and partial matches. (Dominique Pelle)
+Files: src/misc1.c, src/ex_docmd.c
+
+
+*** ../vim-8.1.0158/src/misc1.c 2018-06-23 19:22:45.610486284 +0200
+--- src/misc1.c 2018-07-07 16:35:08.759245918 +0200
+***************
+*** 4827,4833 ****
+ * 1 if name partially matches the beginning of a user name.
+ * 2 is name fully matches a user name.
+ */
+! int match_user(char_u* name)
+ {
+ int i;
+ int n = (int)STRLEN(name);
+--- 4827,4834 ----
+ * 1 if name partially matches the beginning of a user name.
+ * 2 is name fully matches a user name.
+ */
+! int
+! match_user(char_u *name)
+ {
+ int i;
+ int n = (int)STRLEN(name);
+*** ../vim-8.1.0158/src/ex_docmd.c 2018-07-07 16:18:09.345159549 +0200
+--- src/ex_docmd.c 2018-07-07 16:36:53.494751472 +0200
+***************
+*** 3764,3770 ****
+ * A full match ~user<Tab> will be replaced by user's home
+ * directory i.e. something like ~user<Tab> -> /home/user/ */
+ if (*p == NUL && p > xp->xp_pattern + 1
+! && match_user(xp->xp_pattern + 1) == 1)
+ {
+ xp->xp_context = EXPAND_USER;
+ ++xp->xp_pattern;
+--- 3764,3770 ----
+ * A full match ~user<Tab> will be replaced by user's home
+ * directory i.e. something like ~user<Tab> -> /home/user/ */
+ if (*p == NUL && p > xp->xp_pattern + 1
+! && match_user(xp->xp_pattern + 1) >= 1)
+ {
+ xp->xp_context = EXPAND_USER;
+ ++xp->xp_pattern;
+*** ../vim-8.1.0158/src/version.c 2018-07-07 16:18:09.349159526 +0200
+--- src/version.c 2018-07-07 16:40:39.866042630 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 159,
+ /**/
+
+--
+Some of the well known MS-Windows errors:
+ ETIME Wrong time, wait a little while
+ ECRASH Try again...
+ EDETECT Unable to detect errors
+ EOVER You lost! Play another game?
+ ENOCLUE Eh, what did you want?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0160 b/data/vim/patches/8.1.0160
new file mode 100644
index 000000000..4e3a75365
--- /dev/null
+++ b/data/vim/patches/8.1.0160
@@ -0,0 +1,46 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0160
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0160
+Problem: No Danish manual translations.
+Solution: Add the Danish manual translations to the file list.
+Files: Filelist
+
+
+*** ../vim-8.1.0159/Filelist 2018-07-05 22:58:12.658446246 +0200
+--- Filelist 2018-07-07 17:20:09.996801627 +0200
+***************
+*** 851,856 ****
+--- 851,858 ----
+
+ # generic language files
+ LANG_GEN = \
++ runtime/doc/*-da.1 \
++ runtime/doc/*-da.UTF-8.1 \
+ runtime/doc/*-de.1 \
+ runtime/doc/*-de.UTF-8.1 \
+ runtime/doc/*-fr.1 \
+*** ../vim-8.1.0159/src/version.c 2018-07-07 16:41:10.153931299 +0200
+--- src/version.c 2018-07-07 17:21:19.424337015 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 160,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+196. Your computer costs more than your car.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0161 b/data/vim/patches/8.1.0161
new file mode 100644
index 000000000..ff88d792f
--- /dev/null
+++ b/data/vim/patches/8.1.0161
@@ -0,0 +1,154 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0161
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0161
+Problem: Buffer not updated with 'autoread' set if file was deleted.
+ (Michael Naumann)
+Solution: Don't set the timestamp to zero. (closes #3165)
+Files: src/fileio.c, src/testdir/test_stat.vim
+
+
+*** ../vim-8.1.0160/src/fileio.c 2018-06-22 21:30:27.351186530 +0200
+--- src/fileio.c 2018-07-07 17:31:23.592491109 +0200
+***************
+*** 6923,6933 ****
+ {
+ retval = 1;
+
+! /* set b_mtime to stop further warnings (e.g., when executing
+! * FileChangedShell autocmd) */
+ if (stat_res < 0)
+ {
+! buf->b_mtime = 0;
+ buf->b_orig_size = 0;
+ buf->b_orig_mode = 0;
+ }
+--- 6923,6935 ----
+ {
+ retval = 1;
+
+! // set b_mtime to stop further warnings (e.g., when executing
+! // FileChangedShell autocmd)
+ if (stat_res < 0)
+ {
+! // When 'autoread' is set we'll check the file again to see if it
+! // re-appears.
+! buf->b_mtime = buf->b_p_ar;
+ buf->b_orig_size = 0;
+ buf->b_orig_mode = 0;
+ }
+*** ../vim-8.1.0160/src/testdir/test_stat.vim 2017-08-17 17:34:06.000000000 +0200
+--- src/testdir/test_stat.vim 2018-07-07 18:27:11.809270986 +0200
+***************
+*** 46,51 ****
+--- 46,60 ----
+ call assert_equal('rwx', getfperm(dname)[0:2])
+ endfunc
+
++ func SleepForTimestamp()
++ " FAT has a granularity of 2 seconds, otherwise it's usually 1 second
++ if has('win32')
++ sleep 2
++ else
++ sleep 1
++ endif
++ endfunc
++
+ func Test_checktime()
+ let fname = 'Xtest.tmp'
+
+***************
+*** 53,64 ****
+ call writefile(fl, fname)
+ set autoread
+ exec 'e' fname
+! " FAT has a granularity of 2 seconds, otherwise it's usually 1 second
+! if has('win32')
+! sleep 2
+! else
+! sleep 1
+! endif
+ let fl = readfile(fname)
+ let fl[0] .= ' - checktime'
+ call writefile(fl, fname)
+--- 62,68 ----
+ call writefile(fl, fname)
+ set autoread
+ exec 'e' fname
+! call SleepForTimestamp()
+ let fl = readfile(fname)
+ let fl[0] .= ' - checktime'
+ call writefile(fl, fname)
+***************
+*** 68,73 ****
+--- 72,117 ----
+ call delete(fname)
+ endfunc
+
++ func Test_autoread_file_deleted()
++ new Xautoread
++ set autoread
++ call setline(1, 'original')
++ w!
++
++ call SleepForTimestamp()
++ if has('win32')
++ silent !echo changed > Xautoread
++ else
++ silent !echo 'changed' > Xautoread
++ endif
++ checktime
++ call assert_equal('changed', trim(getline(1)))
++
++ call SleepForTimestamp()
++ messages clear
++ if has('win32')
++ silent !del Xautoread
++ else
++ silent !rm Xautoread
++ endif
++ checktime
++ call assert_match('E211:', execute('messages'))
++ call assert_equal('changed', trim(getline(1)))
++
++ call SleepForTimestamp()
++ if has('win32')
++ silent !echo recreated > Xautoread
++ else
++ silent !echo 'recreated' > Xautoread
++ endif
++ checktime
++ call assert_equal('recreated', trim(getline(1)))
++
++ call delete('Xautoread')
++ bwipe!
++ endfunc
++
++
+ func Test_nonexistent_file()
+ let fname = 'Xtest.tmp'
+
+*** ../vim-8.1.0160/src/version.c 2018-07-07 17:21:49.120140280 +0200
+--- src/version.c 2018-07-07 17:33:03.899873420 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 161,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+197. Your desk collapses under the weight of your computer peripherals.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0162 b/data/vim/patches/8.1.0162
new file mode 100644
index 000000000..95c3959e7
--- /dev/null
+++ b/data/vim/patches/8.1.0162
@@ -0,0 +1,149 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0162
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0162
+Problem: Danish and German man pages are not installed. (Tony Mechelynck)
+Solution: Adjust the makefile
+Files: src/Makefile
+
+
+*** ../vim-8.1.0161/src/Makefile Thu Jul 5 17:11:15 2018
+--- src/Makefile Sat Jul 7 22:19:17 2018
+***************
+*** 1511,1516 ****
+--- 1511,1522 ----
+ # directory first.
+ # FreeBSD uses ".../man/xx.ISO8859-1/man1" for latin1, use that one too.
+ DEST_MAN = $(DEST_MAN_TOP)$(MAN1DIR)
++ DEST_MAN_DA = $(DEST_MAN_TOP)/da$(MAN1DIR)
++ DEST_MAN_DA_I = $(DEST_MAN_TOP)/da.ISO8859-1$(MAN1DIR)
++ DEST_MAN_DA_U = $(DEST_MAN_TOP)/da.UTF-8$(MAN1DIR)
++ DEST_MAN_DE = $(DEST_MAN_TOP)/de$(MAN1DIR)
++ DEST_MAN_DE_I = $(DEST_MAN_TOP)/de.ISO8859-1$(MAN1DIR)
++ DEST_MAN_DE_U = $(DEST_MAN_TOP)/de.UTF-8$(MAN1DIR)
+ DEST_MAN_FR = $(DEST_MAN_TOP)/fr$(MAN1DIR)
+ DEST_MAN_FR_I = $(DEST_MAN_TOP)/fr.ISO8859-1$(MAN1DIR)
+ DEST_MAN_FR_U = $(DEST_MAN_TOP)/fr.UTF-8$(MAN1DIR)
+***************
+*** 2381,2386 ****
+--- 2387,2398 ----
+
+ # install the language specific files for tools, if they were unpacked
+ install-tool-languages:
++ -$(SHELL) ./installman.sh xxd $(DEST_MAN_DA) "-da" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh xxd $(DEST_MAN_DA_I) "-da" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh xxd $(DEST_MAN_DA_U) "-da.UTF-8" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh xxd $(DEST_MAN_DE) "-de" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh xxd $(DEST_MAN_DE_I) "-de" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh xxd $(DEST_MAN_DE_U) "-de.UTF-8" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh xxd $(DEST_MAN_FR) "-fr" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh xxd $(DEST_MAN_FR_I) "-fr" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh xxd $(DEST_MAN_FR_U) "-fr.UTF-8" $(INSTALLMANARGS)
+***************
+*** 2396,2401 ****
+--- 2408,2419 ----
+
+ # install the language specific files, if they were unpacked
+ install-languages: languages $(DEST_LANG) $(DEST_KMAP)
++ -$(SHELL) ./installman.sh install $(DEST_MAN_DA) "-da" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh install $(DEST_MAN_DA_I) "-da" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh install $(DEST_MAN_DA_U) "-da.UTF-8" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh install $(DEST_MAN_DE) "-de" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh install $(DEST_MAN_DE_I) "-de" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh install $(DEST_MAN_DE_U) "-de.UTF-8" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh install $(DEST_MAN_FR) "-fr" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh install $(DEST_MAN_FR_I) "-fr" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh install $(DEST_MAN_FR_U) "-fr.UTF-8" $(INSTALLMANARGS)
+***************
+*** 2409,2414 ****
+--- 2427,2444 ----
+ -$(SHELL) ./installman.sh install $(DEST_MAN_RU) "-ru" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh install $(DEST_MAN_RU_U) "-ru.UTF-8" $(INSTALLMANARGS)
+ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DA) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DA_I) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DA_U) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DE) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DE_I) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DE_U) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
+ $(DEST_MAN_FR) $(INSTALLMLARGS)
+ -$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
+ $(DEST_MAN_FR_I) $(INSTALLMLARGS)
+***************
+*** 2582,2587 ****
+--- 2612,2623 ----
+ # Note: the "rmdir" will fail if any files were added after "make install"
+ uninstall_runtime:
+ -$(SHELL) ./installman.sh uninstall $(DEST_MAN) "" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_DA) "" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_DA_I) "" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_DA_U) "" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_DE) "" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_DE_I) "" $(INSTALLMANARGS)
++ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_DE_U) "" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_FR) "" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_FR_I) "" $(INSTALLMANARGS)
+ -$(SHELL) ./installman.sh uninstall $(DEST_MAN_FR_U) "" $(INSTALLMANARGS)
+***************
+*** 2597,2602 ****
+--- 2633,2650 ----
+ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
+ $(DEST_MAN) $(INSTALLMLARGS)
+ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DA) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DA_I) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DA_U) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DE) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DE_I) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
++ $(DEST_MAN_DE_U) $(INSTALLMLARGS)
++ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
+ $(DEST_MAN_FR) $(INSTALLMLARGS)
+ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
+ $(DEST_MAN_FR_I) $(INSTALLMLARGS)
+***************
+*** 2621,2626 ****
+--- 2669,2676 ----
+ -$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
+ $(DEST_MAN_RU_U) $(INSTALLMLARGS)
+ -rm -f $(DEST_MAN)/xxd.1
++ -rm -f $(DEST_MAN_DA)/xxd.1 $(DEST_MAN_DA_I)/xxd.1 $(DEST_MAN_DA_U)/xxd.1
++ -rm -f $(DEST_MAN_DE)/xxd.1 $(DEST_MAN_DE_I)/xxd.1 $(DEST_MAN_DE_U)/xxd.1
+ -rm -f $(DEST_MAN_FR)/xxd.1 $(DEST_MAN_FR_I)/xxd.1 $(DEST_MAN_FR_U)/xxd.1
+ -rm -f $(DEST_MAN_IT)/xxd.1 $(DEST_MAN_IT_I)/xxd.1 $(DEST_MAN_IT_U)/xxd.1
+ -rm -f $(DEST_MAN_JA_U)/xxd.1
+*** ../vim-8.1.0161/src/version.c Sat Jul 7 18:34:08 2018
+--- src/version.c Sat Jul 7 22:20:11 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 162,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+199. You read this entire list of symptoms, looking for something
+ that doesn't describe you.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0163 b/data/vim/patches/8.1.0163
new file mode 100644
index 000000000..f85411a6b
--- /dev/null
+++ b/data/vim/patches/8.1.0163
@@ -0,0 +1,174 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0163
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0163
+Problem: Insufficient testing for Tcl.
+Solution: Add a few more tests. (Dominique Pelle, closes #3166)
+Files: src/testdir/test_tcl.vim
+
+
+*** ../vim-8.1.0162/src/testdir/test_tcl.vim Wed Jul 4 22:36:42 2018
+--- src/testdir/test_tcl.vim Sat Jul 7 22:39:36 2018
+***************
+*** 110,115 ****
+--- 110,126 ----
+ call assert_equal('+4', &cc)
+ call assert_equal('+4', TclEval('::vim::option cc'))
+
++ " Test boolean option with 'toggle', 'on' and 'off' keywords.
++ call assert_equal('0', TclEval('::vim::option nu toggle'))
++ call assert_equal(1, &nu)
++ call assert_equal('1', TclEval('::vim::option nu toggle'))
++ call assert_equal(0, &nu)
++ call assert_equal('0', TclEval('::vim::option nu on'))
++ call assert_equal(1, &nu)
++ call assert_equal('1', TclEval('::vim::option nu off'))
++ call assert_equal(0, &nu)
++
++ call assert_fails('tcl ::vim::option nu x', 'expected integer but got "x"')
+ call assert_fails('tcl ::vim::option xxx', 'unknown vimOption')
+ call assert_fails('tcl ::vim::option',
+ \ 'wrong # args: should be "::vim::option vimOption ?value?"')
+***************
+*** 124,129 ****
+--- 135,141 ----
+
+ call assert_fails('tcl ::vim::expr x y',
+ \ 'wrong # args: should be "::vim::expr vimExpr"')
++ call assert_fails('tcl ::vim::expr 1-', 'E15: Invalid expression: 1-')
+ endfunc
+
+ " Test ::vim::command
+***************
+*** 131,136 ****
+--- 143,153 ----
+ call assert_equal('hello world',
+ \ TclEval('::vim::command {echo "hello world"}'))
+
++ " Check that if ::vim::command created a new Tcl interpreter, it is removed.
++ tcl set foo 123
++ call assert_equal('321', TclEval('::vim::command "tcl set foo 321"'))
++ call assert_equal('123', TclEval('set foo'))
++
+ " With the -quiet option, the error should silently be ignored.
+ call assert_equal('', TclEval('::vim::command -quiet xyz'))
+
+***************
+*** 142,147 ****
+--- 159,166 ----
+
+ " With the -quiet option, the error should silently be ignored.
+ call assert_equal('', TclEval('::vim::command -quiet xyz'))
++
++ tcl unset foo
+ endfunc
+
+ " Test ::vim::window list
+***************
+*** 164,175 ****
+
+ " Test output messages
+ func Test_output()
+! call assert_fails('tcl puts vimerr "an error"', 'an error')
+! tcl puts vimout "a message"
+! tcl puts "another message"
+ let messages = split(execute('message'), "\n")
+! call assert_equal('a message', messages[-2])
+! call assert_equal('another message', messages[-1])
+
+ call assert_fails('tcl puts',
+ \ 'wrong # args: should be "puts ?-nonewline? ?channelId? string"')
+--- 183,197 ----
+
+ " Test output messages
+ func Test_output()
+! call assert_fails('tcl puts vimerr "error #1"', 'error #1')
+! call assert_fails('tcl puts stderr "error #2"', 'error #2')
+! tcl puts vimout "message #1"
+! tcl puts stdout "message #2"
+! tcl puts "message #3"
+ let messages = split(execute('message'), "\n")
+! call assert_equal('message #3', messages[-1])
+! call assert_equal('message #2', messages[-2])
+! call assert_equal('message #1', messages[-3])
+
+ call assert_fails('tcl puts',
+ \ 'wrong # args: should be "puts ?-nonewline? ?channelId? string"')
+***************
+*** 447,459 ****
+ call setline(1, ['line1', 'line2', 'line3', 'line4', 'line5'])
+ tcl $::vim::current(buffer) set 2 a
+ call assert_equal(['line1', 'a', 'line3', 'line4', 'line5'], getline(1, '$'))
+ tcl $::vim::current(buffer) set 3 4 b
+ call assert_equal(['line1', 'a', 'b', 'line5'], getline(1, '$'))
+ tcl $::vim::current(buffer) set 4 3 c
+ call assert_equal(['line1', 'a', 'c'], getline(1, '$'))
+
+ call assert_fails('tcl $::vim::current(buffer) set 0 "x"', 'line number out of range')
+! call assert_fails('tcl $::vim::current(buffer) set 5 "x"', 'line number out of range')
+
+ call assert_fails('tcl $::vim::current(buffer) set', 'wrong # args:')
+ bwipe!
+--- 469,489 ----
+ call setline(1, ['line1', 'line2', 'line3', 'line4', 'line5'])
+ tcl $::vim::current(buffer) set 2 a
+ call assert_equal(['line1', 'a', 'line3', 'line4', 'line5'], getline(1, '$'))
++
++ " Test with fewer replacing lines than replaced lines: lines get deleted.
+ tcl $::vim::current(buffer) set 3 4 b
+ call assert_equal(['line1', 'a', 'b', 'line5'], getline(1, '$'))
+ tcl $::vim::current(buffer) set 4 3 c
+ call assert_equal(['line1', 'a', 'c'], getline(1, '$'))
+
++ " Test with more replacing lines than replaced lines: lines get added.
++ tcl $::vim::current(buffer) set 2 3 {x y z}
++ call assert_equal(['line1', 'x', 'y', 'z'], getline(1, '$'))
++ tcl $::vim::current(buffer) set 3 2 {X Y Z}
++ call assert_equal(['line1', 'X', 'Y', 'Z', 'z'], getline(1, '$'))
++
+ call assert_fails('tcl $::vim::current(buffer) set 0 "x"', 'line number out of range')
+! call assert_fails('tcl $::vim::current(buffer) set 6 "x"', 'line number out of range')
+
+ call assert_fails('tcl $::vim::current(buffer) set', 'wrong # args:')
+ bwipe!
+***************
+*** 622,628 ****
+ call delete('Xtcl_file')
+ endfunc
+
+! " Test exiting current Tcl interprepter and re-creating one.
+ func Test_tcl_exit()
+ tcl set foo "foo"
+ call assert_fails('tcl exit 3', 'E572: exit code 3')
+--- 652,658 ----
+ call delete('Xtcl_file')
+ endfunc
+
+! " Test exiting current Tcl interpreter and re-creating one.
+ func Test_tcl_exit()
+ tcl set foo "foo"
+ call assert_fails('tcl exit 3', 'E572: exit code 3')
+*** ../vim-8.1.0162/src/version.c Sat Jul 7 22:26:49 2018
+--- src/version.c Sat Jul 7 22:39:52 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 163,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+200. You really believe in the concept of a "paperless" office.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0164 b/data/vim/patches/8.1.0164
new file mode 100644
index 000000000..a4982fcb9
--- /dev/null
+++ b/data/vim/patches/8.1.0164
@@ -0,0 +1,83 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0164
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0164
+Problem: luaeval('vim.buffer().name') returns an error.
+Solution: Return an empty string. (Dominique Pelle, closes #3167)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+
+*** ../vim-8.1.0163/src/if_lua.c Sun Jul 1 15:12:00 2018
+--- src/if_lua.c Sat Jul 7 23:04:53 2018
+***************
+*** 1123,1131 ****
+ {
+ const char *s = lua_tostring(L, 2);
+ if (strncmp(s, "name", 4) == 0)
+! lua_pushstring(L, (char *) b->b_sfname);
+ else if (strncmp(s, "fname", 5) == 0)
+! lua_pushstring(L, (char *) b->b_ffname);
+ else if (strncmp(s, "number", 6) == 0)
+ lua_pushinteger(L, b->b_fnum);
+ /* methods */
+--- 1123,1133 ----
+ {
+ const char *s = lua_tostring(L, 2);
+ if (strncmp(s, "name", 4) == 0)
+! lua_pushstring(L, (b->b_sfname == NULL)
+! ? "" : (char *) b->b_sfname);
+ else if (strncmp(s, "fname", 5) == 0)
+! lua_pushstring(L, (b->b_ffname == NULL)
+! ? "" : (char *) b->b_ffname);
+ else if (strncmp(s, "number", 6) == 0)
+ lua_pushinteger(L, b->b_fnum);
+ /* methods */
+*** ../vim-8.1.0163/src/testdir/test_lua.vim Mon Jul 2 22:54:32 2018
+--- src/testdir/test_lua.vim Sat Jul 7 23:04:53 2018
+***************
+*** 198,208 ****
+ " Test vim.buffer().name and vim.buffer().fname
+ func Test_buffer_name()
+ new
+! " FIXME: for an unnamed buffer, I would expect
+! " vim.buffer().name to give an empty string, but
+! " it returns 0. Is it a bug?
+! " so this assert_equal is commented out.
+! " call assert_equal('', luaeval('vim.buffer().name'))
+ bwipe!
+
+ new Xfoo
+--- 198,205 ----
+ " Test vim.buffer().name and vim.buffer().fname
+ func Test_buffer_name()
+ new
+! call assert_equal('', luaeval('vim.buffer().name'))
+! call assert_equal('', luaeval('vim.buffer().fname'))
+ bwipe!
+
+ new Xfoo
+*** ../vim-8.1.0163/src/version.c Sat Jul 7 22:41:57 2018
+--- src/version.c Sat Jul 7 23:06:18 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 164,
+ /**/
+
+--
+Spam seems to be something useful to novices. Later you realize that
+it's a bunch of indigestable junk that only clogs your system.
+Applies to both the food and the e-mail!
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0165 b/data/vim/patches/8.1.0165
new file mode 100644
index 000000000..39977900c
--- /dev/null
+++ b/data/vim/patches/8.1.0165
@@ -0,0 +1,123 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0165
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0165
+Problem: :clist output can be very long.
+Solution: Support filtering :clist entries. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+
+*** ../vim-8.1.0164/src/quickfix.c Tue Jul 3 16:54:18 2018
+--- src/quickfix.c Sun Jul 8 15:53:26 2018
+***************
+*** 3051,3056 ****
+--- 3051,3057 ----
+ int qfFileAttr;
+ int qfSepAttr;
+ int qfLineAttr;
++ int filter_entry;
+ int all = eap->forceit; /* if not :cl!, only show
+ recognised errors */
+ qf_info_T *qi = &ql_info;
+***************
+*** 3120,3126 ****
+ {
+ if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2)
+ {
+- msg_putchar('\n');
+ if (got_int)
+ break;
+
+--- 3121,3126 ----
+***************
+*** 3141,3146 ****
+--- 3141,3160 ----
+ vim_snprintf((char *)IObuff, IOSIZE, "%2d %s",
+ i, (char *)fname);
+ }
++
++ // Support for filtering entries using :filter /pat/ clist
++ filter_entry = 1;
++ if (qfp->qf_module != NULL && *qfp->qf_module != NUL)
++ filter_entry &= message_filtered(qfp->qf_module);
++ if (fname != NULL)
++ filter_entry &= message_filtered(fname);
++ if (qfp->qf_pattern != NULL)
++ filter_entry &= message_filtered(qfp->qf_pattern);
++ filter_entry &= message_filtered(qfp->qf_text);
++ if (filter_entry)
++ goto next_entry;
++
++ msg_putchar('\n');
+ msg_outtrans_attr(IObuff, i == qi->qf_lists[qi->qf_curlist].qf_index
+ ? HL_ATTR(HLF_QFL) : qfFileAttr);
+
+***************
+*** 3175,3180 ****
+--- 3189,3195 ----
+ out_flush(); /* show one line at a time */
+ }
+
++ next_entry:
+ qfp = qfp->qf_next;
+ if (qfp == NULL)
+ break;
+***************
+*** 4186,4191 ****
+--- 4201,4207 ----
+ }
+ if (res >= 0)
+ qf_list_changed(qi, qi->qf_curlist);
++
+ // Remember the current quickfix list identifier, so that we can
+ // check for autocommands changing the current quickfix list.
+ save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+*** ../vim-8.1.0164/src/testdir/test_quickfix.vim Tue Jul 3 19:15:56 2018
+--- src/testdir/test_quickfix.vim Sun Jul 8 15:53:26 2018
+***************
+*** 3487,3489 ****
+--- 3487,3506 ----
+ call Xautocmd_changelist('c')
+ call Xautocmd_changelist('l')
+ endfunc
++
++ " Tests for the ':filter /pat/ clist' command
++ func Test_filter_clist()
++ cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
++ call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
++ \ split(execute('filter /Line 15/ clist'), "\n"))
++ call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
++ \ split(execute('filter /Xfile1/ clist'), "\n"))
++ call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
++
++ call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
++ \ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
++ call assert_equal([' 2 pqr:pat2: '],
++ \ split(execute('filter /pqr/ clist'), "\n"))
++ call assert_equal([' 1 abc:pat1: '],
++ \ split(execute('filter /pat1/ clist'), "\n"))
++ endfunc
+*** ../vim-8.1.0164/src/version.c Sat Jul 7 23:07:35 2018
+--- src/version.c Sun Jul 8 15:54:40 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 165,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+204. You're being audited because you mailed your tax return to the IRC.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0166 b/data/vim/patches/8.1.0166
new file mode 100644
index 000000000..33266c94e
--- /dev/null
+++ b/data/vim/patches/8.1.0166
@@ -0,0 +1,1183 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0166
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0166
+Problem: Using dict_add_nr_str() is clumsy.
+Solution: Split into two functions. (Ozaki Kiichi, closes #3154)
+Files: src/channel.c, src/dict.c, src/edit.c, src/evalfunc.c,
+ src/ex_cmds2.c, src/ops.c, src/option.c, src/proto/dict.pro,
+ src/quickfix.c, src/tag.c, src/terminal.c, src/undo.c
+
+
+*** ../vim-8.1.0165/src/channel.c Sun Jun 17 19:36:30 2018
+--- src/channel.c Sun Jul 8 16:42:07 2018
+***************
+*** 2809,2815 ****
+ status = "buffered";
+ else
+ status = "closed";
+! dict_add_nr_str(dict, namebuf, 0, (char_u *)status);
+
+ STRCPY(namebuf + tail, "mode");
+ switch (chanpart->ch_mode)
+--- 2809,2815 ----
+ status = "buffered";
+ else
+ status = "closed";
+! dict_add_string(dict, namebuf, (char_u *)status);
+
+ STRCPY(namebuf + tail, "mode");
+ switch (chanpart->ch_mode)
+***************
+*** 2819,2825 ****
+ case MODE_JSON: s = "JSON"; break;
+ case MODE_JS: s = "JS"; break;
+ }
+! dict_add_nr_str(dict, namebuf, 0, (char_u *)s);
+
+ STRCPY(namebuf + tail, "io");
+ if (part == PART_SOCK)
+--- 2819,2825 ----
+ case MODE_JSON: s = "JSON"; break;
+ case MODE_JS: s = "JS"; break;
+ }
+! dict_add_string(dict, namebuf, (char_u *)s);
+
+ STRCPY(namebuf + tail, "io");
+ if (part == PART_SOCK)
+***************
+*** 2832,2853 ****
+ case JIO_BUFFER: s = "buffer"; break;
+ case JIO_OUT: s = "out"; break;
+ }
+! dict_add_nr_str(dict, namebuf, 0, (char_u *)s);
+
+ STRCPY(namebuf + tail, "timeout");
+! dict_add_nr_str(dict, namebuf, chanpart->ch_timeout, NULL);
+ }
+
+ void
+ channel_info(channel_T *channel, dict_T *dict)
+ {
+! dict_add_nr_str(dict, "id", channel->ch_id, NULL);
+! dict_add_nr_str(dict, "status", 0, (char_u *)channel_status(channel, -1));
+
+ if (channel->ch_hostname != NULL)
+ {
+! dict_add_nr_str(dict, "hostname", 0, (char_u *)channel->ch_hostname);
+! dict_add_nr_str(dict, "port", channel->ch_port, NULL);
+ channel_part_info(channel, dict, "sock", PART_SOCK);
+ }
+ else
+--- 2832,2853 ----
+ case JIO_BUFFER: s = "buffer"; break;
+ case JIO_OUT: s = "out"; break;
+ }
+! dict_add_string(dict, namebuf, (char_u *)s);
+
+ STRCPY(namebuf + tail, "timeout");
+! dict_add_number(dict, namebuf, chanpart->ch_timeout);
+ }
+
+ void
+ channel_info(channel_T *channel, dict_T *dict)
+ {
+! dict_add_number(dict, "id", channel->ch_id);
+! dict_add_string(dict, "status", (char_u *)channel_status(channel, -1));
+
+ if (channel->ch_hostname != NULL)
+ {
+! dict_add_string(dict, "hostname", (char_u *)channel->ch_hostname);
+! dict_add_number(dict, "port", channel->ch_port);
+ channel_part_info(channel, dict, "sock", PART_SOCK);
+ }
+ else
+***************
+*** 5737,5743 ****
+ list_T *l;
+ int i;
+
+! dict_add_nr_str(dict, "status", 0L, (char_u *)job_status(job));
+
+ item = dictitem_alloc((char_u *)"channel");
+ if (item == NULL)
+--- 5737,5743 ----
+ list_T *l;
+ int i;
+
+! dict_add_string(dict, "status", (char_u *)job_status(job));
+
+ item = dictitem_alloc((char_u *)"channel");
+ if (item == NULL)
+***************
+*** 5755,5769 ****
+ #else
+ nr = job->jv_proc_info.dwProcessId;
+ #endif
+! dict_add_nr_str(dict, "process", nr, NULL);
+! dict_add_nr_str(dict, "tty_in", 0L,
+! job->jv_tty_in != NULL ? job->jv_tty_in : (char_u *)"");
+! dict_add_nr_str(dict, "tty_out", 0L,
+! job->jv_tty_out != NULL ? job->jv_tty_out : (char_u *)"");
+!
+! dict_add_nr_str(dict, "exitval", job->jv_exitval, NULL);
+! dict_add_nr_str(dict, "exit_cb", 0L, job->jv_exit_cb);
+! dict_add_nr_str(dict, "stoponexit", 0L, job->jv_stoponexit);
+
+ l = list_alloc();
+ if (l != NULL)
+--- 5755,5767 ----
+ #else
+ nr = job->jv_proc_info.dwProcessId;
+ #endif
+! dict_add_number(dict, "process", nr);
+! dict_add_string(dict, "tty_in", job->jv_tty_in);
+! dict_add_string(dict, "tty_out", job->jv_tty_out);
+!
+! dict_add_number(dict, "exitval", job->jv_exitval);
+! dict_add_string(dict, "exit_cb", job->jv_exit_cb);
+! dict_add_string(dict, "stoponexit", job->jv_stoponexit);
+
+ l = list_alloc();
+ if (l != NULL)
+*** ../vim-8.1.0165/src/dict.c Sat Dec 16 18:21:39 2017
+--- src/dict.c Sun Jul 8 16:42:07 2018
+***************
+*** 327,342 ****
+ }
+
+ /*
+! * Add a number or string entry to dictionary "d".
+! * When "str" is NULL use number "nr", otherwise use "str".
+ * Returns FAIL when out of memory and when key already exists.
+ */
+ int
+! dict_add_nr_str(
+! dict_T *d,
+! char *key,
+! varnumber_T nr,
+! char_u *str)
+ {
+ dictitem_T *item;
+
+--- 327,337 ----
+ }
+
+ /*
+! * Add a number entry to dictionary "d".
+ * Returns FAIL when out of memory and when key already exists.
+ */
+ int
+! dict_add_number(dict_T *d, char *key, varnumber_T nr)
+ {
+ dictitem_T *item;
+
+***************
+*** 344,359 ****
+ if (item == NULL)
+ return FAIL;
+ item->di_tv.v_lock = 0;
+! if (str == NULL)
+! {
+! item->di_tv.v_type = VAR_NUMBER;
+! item->di_tv.vval.v_number = nr;
+! }
+! else
+ {
+! item->di_tv.v_type = VAR_STRING;
+! item->di_tv.vval.v_string = vim_strsave(str);
+ }
+ if (dict_add(d, item) == FAIL)
+ {
+ dictitem_free(item);
+--- 339,369 ----
+ if (item == NULL)
+ return FAIL;
+ item->di_tv.v_lock = 0;
+! item->di_tv.v_type = VAR_NUMBER;
+! item->di_tv.vval.v_number = nr;
+! if (dict_add(d, item) == FAIL)
+ {
+! dictitem_free(item);
+! return FAIL;
+ }
++ return OK;
++ }
++
++ /*
++ * Add a string entry to dictionary "d".
++ * Returns FAIL when out of memory and when key already exists.
++ */
++ int
++ dict_add_string(dict_T *d, char *key, char_u *str)
++ {
++ dictitem_T *item;
++
++ item = dictitem_alloc((char_u *)key);
++ if (item == NULL)
++ return FAIL;
++ item->di_tv.v_lock = 0;
++ item->di_tv.v_type = VAR_STRING;
++ item->di_tv.vval.v_string = str != NULL ? vim_strsave(str) : NULL;
+ if (dict_add(d, item) == FAIL)
+ {
+ dictitem_free(item);
+*** ../vim-8.1.0165/src/edit.c Thu Jul 5 22:27:04 2018
+--- src/edit.c Sun Jul 8 16:42:07 2018
+***************
+*** 4884,4901 ****
+ dict = dict_alloc_lock(VAR_FIXED);
+ if (dict != NULL)
+ {
+! dict_add_nr_str(dict, "word", 0L,
+! EMPTY_IF_NULL(compl_shown_match->cp_str));
+! dict_add_nr_str(dict, "abbr", 0L,
+! EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_ABBR]));
+! dict_add_nr_str(dict, "menu", 0L,
+! EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_MENU]));
+! dict_add_nr_str(dict, "kind", 0L,
+! EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_KIND]));
+! dict_add_nr_str(dict, "info", 0L,
+! EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_INFO]));
+! dict_add_nr_str(dict, "user_data", 0L,
+! EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_USER_DATA]));
+ }
+ set_vim_var_dict(VV_COMPLETED_ITEM, dict);
+ if (!in_compl_func)
+--- 4884,4896 ----
+ dict = dict_alloc_lock(VAR_FIXED);
+ if (dict != NULL)
+ {
+! dict_add_string(dict, "word", compl_shown_match->cp_str);
+! dict_add_string(dict, "abbr", compl_shown_match->cp_text[CPT_ABBR]);
+! dict_add_string(dict, "menu", compl_shown_match->cp_text[CPT_MENU]);
+! dict_add_string(dict, "kind", compl_shown_match->cp_text[CPT_KIND]);
+! dict_add_string(dict, "info", compl_shown_match->cp_text[CPT_INFO]);
+! dict_add_string(dict, "user_data",
+! compl_shown_match->cp_text[CPT_USER_DATA]);
+ }
+ set_vim_var_dict(VV_COMPLETED_ITEM, dict);
+ if (!in_compl_func)
+*** ../vim-8.1.0165/src/evalfunc.c Thu Jun 28 15:50:23 2018
+--- src/evalfunc.c Sun Jul 8 16:42:07 2018
+***************
+*** 4338,4346 ****
+
+ if (d != NULL)
+ {
+! dict_add_nr_str(d, "id", sign->id, NULL);
+! dict_add_nr_str(d, "lnum", sign->lnum, NULL);
+! dict_add_nr_str(d, "name", 0L, sign_typenr2name(sign->typenr));
+
+ list_append_dict(l, d);
+ }
+--- 4338,4346 ----
+
+ if (d != NULL)
+ {
+! dict_add_number(d, "id", sign->id);
+! dict_add_number(d, "lnum", sign->lnum);
+! dict_add_string(d, "name", sign_typenr2name(sign->typenr));
+
+ list_append_dict(l, d);
+ }
+***************
+*** 4363,4380 ****
+ if (dict == NULL)
+ return NULL;
+
+! dict_add_nr_str(dict, "bufnr", buf->b_fnum, NULL);
+! dict_add_nr_str(dict, "name", 0L,
+! buf->b_ffname != NULL ? buf->b_ffname : (char_u *)"");
+! dict_add_nr_str(dict, "lnum", buf == curbuf ? curwin->w_cursor.lnum
+! : buflist_findlnum(buf), NULL);
+! dict_add_nr_str(dict, "loaded", buf->b_ml.ml_mfp != NULL, NULL);
+! dict_add_nr_str(dict, "listed", buf->b_p_bl, NULL);
+! dict_add_nr_str(dict, "changed", bufIsChanged(buf), NULL);
+! dict_add_nr_str(dict, "changedtick", CHANGEDTICK(buf), NULL);
+! dict_add_nr_str(dict, "hidden",
+! buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0,
+! NULL);
+
+ /* Get a reference to buffer variables */
+ dict_add_dict(dict, "variables", buf->b_vars);
+--- 4363,4378 ----
+ if (dict == NULL)
+ return NULL;
+
+! dict_add_number(dict, "bufnr", buf->b_fnum);
+! dict_add_string(dict, "name", buf->b_ffname);
+! dict_add_number(dict, "lnum", buf == curbuf ? curwin->w_cursor.lnum
+! : buflist_findlnum(buf));
+! dict_add_number(dict, "loaded", buf->b_ml.ml_mfp != NULL);
+! dict_add_number(dict, "listed", buf->b_p_bl);
+! dict_add_number(dict, "changed", bufIsChanged(buf));
+! dict_add_number(dict, "changedtick", CHANGEDTICK(buf));
+! dict_add_number(dict, "hidden",
+! buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0);
+
+ /* Get a reference to buffer variables */
+ dict_add_dict(dict, "variables", buf->b_vars);
+***************
+*** 4663,4672 ****
+ return;
+ if (list_append_dict(l, d) == FAIL)
+ return;
+! dict_add_nr_str(d, "lnum", (long)buf->b_changelist[i].lnum, NULL);
+! dict_add_nr_str(d, "col", (long)buf->b_changelist[i].col, NULL);
+ # ifdef FEAT_VIRTUALEDIT
+! dict_add_nr_str(d, "coladd", (long)buf->b_changelist[i].coladd, NULL);
+ # endif
+ }
+ #endif
+--- 4661,4670 ----
+ return;
+ if (list_append_dict(l, d) == FAIL)
+ return;
+! dict_add_number(d, "lnum", (long)buf->b_changelist[i].lnum);
+! dict_add_number(d, "col", (long)buf->b_changelist[i].col);
+ # ifdef FEAT_VIRTUALEDIT
+! dict_add_number(d, "coladd", (long)buf->b_changelist[i].coladd);
+ # endif
+ }
+ #endif
+***************
+*** 4790,4798 ****
+ {
+ dict_T *dict = rettv->vval.v_dict;
+
+! dict_add_nr_str(dict, "char", 0L, last_csearch());
+! dict_add_nr_str(dict, "forward", last_csearch_forward(), NULL);
+! dict_add_nr_str(dict, "until", last_csearch_until(), NULL);
+ }
+ }
+
+--- 4788,4796 ----
+ {
+ dict_T *dict = rettv->vval.v_dict;
+
+! dict_add_string(dict, "char", last_csearch());
+! dict_add_number(dict, "forward", last_csearch_forward());
+! dict_add_number(dict, "until", last_csearch_until());
+ }
+ }
+
+***************
+*** 5193,5209 ****
+ return;
+ if (list_append_dict(l, d) == FAIL)
+ return;
+! dict_add_nr_str(d, "lnum", (long)wp->w_jumplist[i].fmark.mark.lnum,
+! NULL);
+! dict_add_nr_str(d, "col", (long)wp->w_jumplist[i].fmark.mark.col,
+! NULL);
+ # ifdef FEAT_VIRTUALEDIT
+! dict_add_nr_str(d, "coladd", (long)wp->w_jumplist[i].fmark.mark.coladd,
+! NULL);
+ # endif
+! dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL);
+ if (wp->w_jumplist[i].fname != NULL)
+! dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname);
+ }
+ #endif
+ }
+--- 5191,5204 ----
+ return;
+ if (list_append_dict(l, d) == FAIL)
+ return;
+! dict_add_number(d, "lnum", (long)wp->w_jumplist[i].fmark.mark.lnum);
+! dict_add_number(d, "col", (long)wp->w_jumplist[i].fmark.mark.col);
+ # ifdef FEAT_VIRTUALEDIT
+! dict_add_number(d, "coladd", (long)wp->w_jumplist[i].fmark.mark.coladd);
+ # endif
+! dict_add_number(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum);
+ if (wp->w_jumplist[i].fname != NULL)
+! dict_add_string(d, "filename", wp->w_jumplist[i].fname);
+ }
+ #endif
+ }
+***************
+*** 5321,5338 ****
+ }
+ else
+ {
+! dict_add_nr_str(dict, "pattern", 0L, cur->pattern);
+ }
+! dict_add_nr_str(dict, "group", 0L, syn_id2name(cur->hlg_id));
+! dict_add_nr_str(dict, "priority", (long)cur->priority, NULL);
+! dict_add_nr_str(dict, "id", (long)cur->id, NULL);
+ # if defined(FEAT_CONCEAL) && defined(FEAT_MBYTE)
+ if (cur->conceal_char)
+ {
+ char_u buf[MB_MAXBYTES + 1];
+
+ buf[(*mb_char2bytes)((int)cur->conceal_char, buf)] = NUL;
+! dict_add_nr_str(dict, "conceal", 0L, (char_u *)&buf);
+ }
+ # endif
+ list_append_dict(rettv->vval.v_list, dict);
+--- 5316,5333 ----
+ }
+ else
+ {
+! dict_add_string(dict, "pattern", cur->pattern);
+ }
+! dict_add_string(dict, "group", syn_id2name(cur->hlg_id));
+! dict_add_number(dict, "priority", (long)cur->priority);
+! dict_add_number(dict, "id", (long)cur->id);
+ # if defined(FEAT_CONCEAL) && defined(FEAT_MBYTE)
+ if (cur->conceal_char)
+ {
+ char_u buf[MB_MAXBYTES + 1];
+
+ buf[(*mb_char2bytes)((int)cur->conceal_char, buf)] = NUL;
+! dict_add_string(dict, "conceal", (char_u *)&buf);
+ }
+ # endif
+ list_append_dict(rettv->vval.v_list, dict);
+***************
+*** 5533,5539 ****
+ if (dict == NULL)
+ return NULL;
+
+! dict_add_nr_str(dict, "tabnr", tp_idx, NULL);
+
+ l = list_alloc();
+ if (l != NULL)
+--- 5528,5534 ----
+ if (dict == NULL)
+ return NULL;
+
+! dict_add_number(dict, "tabnr", tp_idx);
+
+ l = list_alloc();
+ if (l != NULL)
+***************
+*** 5649,5671 ****
+ if (dict == NULL)
+ return NULL;
+
+! dict_add_nr_str(dict, "tabnr", tpnr, NULL);
+! dict_add_nr_str(dict, "winnr", winnr, NULL);
+! dict_add_nr_str(dict, "winid", wp->w_id, NULL);
+! dict_add_nr_str(dict, "height", wp->w_height, NULL);
+ #ifdef FEAT_MENU
+! dict_add_nr_str(dict, "winbar", wp->w_winbar_height, NULL);
+ #endif
+! dict_add_nr_str(dict, "width", wp->w_width, NULL);
+! dict_add_nr_str(dict, "bufnr", wp->w_buffer->b_fnum, NULL);
+
+ #ifdef FEAT_TERMINAL
+! dict_add_nr_str(dict, "terminal", bt_terminal(wp->w_buffer), NULL);
+ #endif
+ #ifdef FEAT_QUICKFIX
+! dict_add_nr_str(dict, "quickfix", bt_quickfix(wp->w_buffer), NULL);
+! dict_add_nr_str(dict, "loclist",
+! (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL), NULL);
+ #endif
+
+ /* Add a reference to window variables */
+--- 5644,5666 ----
+ if (dict == NULL)
+ return NULL;
+
+! dict_add_number(dict, "tabnr", tpnr);
+! dict_add_number(dict, "winnr", winnr);
+! dict_add_number(dict, "winid", wp->w_id);
+! dict_add_number(dict, "height", wp->w_height);
+ #ifdef FEAT_MENU
+! dict_add_number(dict, "winbar", wp->w_winbar_height);
+ #endif
+! dict_add_number(dict, "width", wp->w_width);
+! dict_add_number(dict, "bufnr", wp->w_buffer->b_fnum);
+
+ #ifdef FEAT_TERMINAL
+! dict_add_number(dict, "terminal", bt_terminal(wp->w_buffer));
+ #endif
+ #ifdef FEAT_QUICKFIX
+! dict_add_number(dict, "quickfix", bt_quickfix(wp->w_buffer));
+! dict_add_number(dict, "loclist",
+! (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL));
+ #endif
+
+ /* Add a reference to window variables */
+***************
+*** 7652,7666 ****
+ char_u *mapmode = map_mode_to_chars(mp->m_mode);
+ dict_T *dict = rettv->vval.v_dict;
+
+! dict_add_nr_str(dict, "lhs", 0L, lhs);
+! dict_add_nr_str(dict, "rhs", 0L, mp->m_orig_str);
+! dict_add_nr_str(dict, "noremap", mp->m_noremap ? 1L : 0L , NULL);
+! dict_add_nr_str(dict, "expr", mp->m_expr ? 1L : 0L, NULL);
+! dict_add_nr_str(dict, "silent", mp->m_silent ? 1L : 0L, NULL);
+! dict_add_nr_str(dict, "sid", (long)mp->m_script_ID, NULL);
+! dict_add_nr_str(dict, "buffer", (long)buffer_local, NULL);
+! dict_add_nr_str(dict, "nowait", mp->m_nowait ? 1L : 0L, NULL);
+! dict_add_nr_str(dict, "mode", 0L, mapmode);
+
+ vim_free(lhs);
+ vim_free(mapmode);
+--- 7647,7661 ----
+ char_u *mapmode = map_mode_to_chars(mp->m_mode);
+ dict_T *dict = rettv->vval.v_dict;
+
+! dict_add_string(dict, "lhs", lhs);
+! dict_add_string(dict, "rhs", mp->m_orig_str);
+! dict_add_number(dict, "noremap", mp->m_noremap ? 1L : 0L);
+! dict_add_number(dict, "expr", mp->m_expr ? 1L : 0L);
+! dict_add_number(dict, "silent", mp->m_silent ? 1L : 0L);
+! dict_add_number(dict, "sid", (long)mp->m_script_ID);
+! dict_add_number(dict, "buffer", (long)buffer_local);
+! dict_add_number(dict, "nowait", mp->m_nowait ? 1L : 0L);
+! dict_add_string(dict, "mode", mapmode);
+
+ vim_free(lhs);
+ vim_free(mapmode);
+***************
+*** 13652,13664 ****
+ dict_T *dict = rettv->vval.v_dict;
+ list_T *list;
+
+! dict_add_nr_str(dict, "synced", (long)curbuf->b_u_synced, NULL);
+! dict_add_nr_str(dict, "seq_last", curbuf->b_u_seq_last, NULL);
+! dict_add_nr_str(dict, "save_last",
+! (long)curbuf->b_u_save_nr_last, NULL);
+! dict_add_nr_str(dict, "seq_cur", curbuf->b_u_seq_cur, NULL);
+! dict_add_nr_str(dict, "time_cur", (long)curbuf->b_u_time_cur, NULL);
+! dict_add_nr_str(dict, "save_cur", (long)curbuf->b_u_save_nr_cur, NULL);
+
+ list = list_alloc();
+ if (list != NULL)
+--- 13647,13658 ----
+ dict_T *dict = rettv->vval.v_dict;
+ list_T *list;
+
+! dict_add_number(dict, "synced", (long)curbuf->b_u_synced);
+! dict_add_number(dict, "seq_last", curbuf->b_u_seq_last);
+! dict_add_number(dict, "save_last", (long)curbuf->b_u_save_nr_last);
+! dict_add_number(dict, "seq_cur", curbuf->b_u_seq_cur);
+! dict_add_number(dict, "time_cur", (long)curbuf->b_u_time_cur);
+! dict_add_number(dict, "save_cur", (long)curbuf->b_u_save_nr_cur);
+
+ list = list_alloc();
+ if (list != NULL)
+***************
+*** 13882,13901 ****
+ return;
+ dict = rettv->vval.v_dict;
+
+! dict_add_nr_str(dict, "lnum", (long)curwin->w_cursor.lnum, NULL);
+! dict_add_nr_str(dict, "col", (long)curwin->w_cursor.col, NULL);
+ #ifdef FEAT_VIRTUALEDIT
+! dict_add_nr_str(dict, "coladd", (long)curwin->w_cursor.coladd, NULL);
+ #endif
+ update_curswant();
+! dict_add_nr_str(dict, "curswant", (long)curwin->w_curswant, NULL);
+
+! dict_add_nr_str(dict, "topline", (long)curwin->w_topline, NULL);
+ #ifdef FEAT_DIFF
+! dict_add_nr_str(dict, "topfill", (long)curwin->w_topfill, NULL);
+ #endif
+! dict_add_nr_str(dict, "leftcol", (long)curwin->w_leftcol, NULL);
+! dict_add_nr_str(dict, "skipcol", (long)curwin->w_skipcol, NULL);
+ }
+
+ /*
+--- 13876,13895 ----
+ return;
+ dict = rettv->vval.v_dict;
+
+! dict_add_number(dict, "lnum", (long)curwin->w_cursor.lnum);
+! dict_add_number(dict, "col", (long)curwin->w_cursor.col);
+ #ifdef FEAT_VIRTUALEDIT
+! dict_add_number(dict, "coladd", (long)curwin->w_cursor.coladd);
+ #endif
+ update_curswant();
+! dict_add_number(dict, "curswant", (long)curwin->w_curswant);
+
+! dict_add_number(dict, "topline", (long)curwin->w_topline);
+ #ifdef FEAT_DIFF
+! dict_add_number(dict, "topfill", (long)curwin->w_topfill);
+ #endif
+! dict_add_number(dict, "leftcol", (long)curwin->w_leftcol);
+! dict_add_number(dict, "skipcol", (long)curwin->w_skipcol);
+ }
+
+ /*
+*** ../vim-8.1.0165/src/ex_cmds2.c Thu Jun 28 12:05:07 2018
+--- src/ex_cmds2.c Sun Jul 8 16:42:07 2018
+***************
+*** 689,695 ****
+ }
+
+ /*
+! * ":breakadd".
+ */
+ void
+ ex_breakadd(exarg_T *eap)
+--- 689,695 ----
+ }
+
+ /*
+! * ":breakadd". Also used for ":profile".
+ */
+ void
+ ex_breakadd(exarg_T *eap)
+***************
+*** 1497,1512 ****
+ return;
+ list_append_dict(list, dict);
+
+! dict_add_nr_str(dict, "id", timer->tr_id, NULL);
+! dict_add_nr_str(dict, "time", (long)timer->tr_interval, NULL);
+
+ profile_start(&now);
+ remaining = proftime_time_left(&timer->tr_due, &now);
+! dict_add_nr_str(dict, "remaining", (long)remaining, NULL);
+
+! dict_add_nr_str(dict, "repeat",
+! (long)(timer->tr_repeat < 0 ? -1 : timer->tr_repeat + 1), NULL);
+! dict_add_nr_str(dict, "paused", (long)(timer->tr_paused), NULL);
+
+ di = dictitem_alloc((char_u *)"callback");
+ if (di != NULL)
+--- 1497,1512 ----
+ return;
+ list_append_dict(list, dict);
+
+! dict_add_number(dict, "id", timer->tr_id);
+! dict_add_number(dict, "time", (long)timer->tr_interval);
+
+ profile_start(&now);
+ remaining = proftime_time_left(&timer->tr_due, &now);
+! dict_add_number(dict, "remaining", (long)remaining);
+
+! dict_add_number(dict, "repeat",
+! (long)(timer->tr_repeat < 0 ? -1 : timer->tr_repeat + 1));
+! dict_add_number(dict, "paused", (long)(timer->tr_paused));
+
+ di = dictitem_alloc((char_u *)"callback");
+ if (di != NULL)
+*** ../vim-8.1.0165/src/ops.c Thu Jun 28 19:26:24 2018
+--- src/ops.c Sun Jul 8 16:42:07 2018
+***************
+*** 1723,1734 ****
+
+ buf[0] = (char_u)oap->regname;
+ buf[1] = NUL;
+! dict_add_nr_str(v_event, "regname", 0, buf);
+
+ buf[0] = get_op_char(oap->op_type);
+ buf[1] = get_extra_op_char(oap->op_type);
+ buf[2] = NUL;
+! dict_add_nr_str(v_event, "operator", 0, buf);
+
+ buf[0] = NUL;
+ buf[1] = NUL;
+--- 1723,1734 ----
+
+ buf[0] = (char_u)oap->regname;
+ buf[1] = NUL;
+! dict_add_string(v_event, "regname", buf);
+
+ buf[0] = get_op_char(oap->op_type);
+ buf[1] = get_extra_op_char(oap->op_type);
+ buf[2] = NUL;
+! dict_add_string(v_event, "operator", buf);
+
+ buf[0] = NUL;
+ buf[1] = NUL;
+***************
+*** 1741,1747 ****
+ reglen + 1);
+ break;
+ }
+! dict_add_nr_str(v_event, "regtype", 0, buf);
+
+ /* Lock the dictionary and its keys */
+ dict_set_items_ro(v_event);
+--- 1741,1747 ----
+ reglen + 1);
+ break;
+ }
+! dict_add_string(v_event, "regtype", buf);
+
+ /* Lock the dictionary and its keys */
+ dict_set_items_ro(v_event);
+***************
+*** 7641,7659 ****
+ #if defined(FEAT_EVAL)
+ if (dict != NULL)
+ {
+! dict_add_nr_str(dict, "words", word_count, NULL);
+! dict_add_nr_str(dict, "chars", char_count, NULL);
+! dict_add_nr_str(dict, "bytes", byte_count
+ # ifdef FEAT_MBYTE
+ + bom_count
+ # endif
+! , NULL);
+! dict_add_nr_str(dict, VIsual_active ? "visual_bytes" : "cursor_bytes",
+! byte_count_cursor, NULL);
+! dict_add_nr_str(dict, VIsual_active ? "visual_chars" : "cursor_chars",
+! char_count_cursor, NULL);
+! dict_add_nr_str(dict, VIsual_active ? "visual_words" : "cursor_words",
+! word_count_cursor, NULL);
+ }
+ #endif
+ }
+--- 7641,7659 ----
+ #if defined(FEAT_EVAL)
+ if (dict != NULL)
+ {
+! dict_add_number(dict, "words", word_count);
+! dict_add_number(dict, "chars", char_count);
+! dict_add_number(dict, "bytes", byte_count
+ # ifdef FEAT_MBYTE
+ + bom_count
+ # endif
+! );
+! dict_add_number(dict, VIsual_active ? "visual_bytes" : "cursor_bytes",
+! byte_count_cursor);
+! dict_add_number(dict, VIsual_active ? "visual_chars" : "cursor_chars",
+! char_count_cursor);
+! dict_add_number(dict, VIsual_active ? "visual_words" : "cursor_words",
+! word_count_cursor);
+ }
+ #endif
+ }
+*** ../vim-8.1.0165/src/option.c Mon Jul 2 20:51:21 2018
+--- src/option.c Sun Jul 8 16:42:07 2018
+***************
+*** 13222,13232 ****
+ if (varp != NULL)
+ {
+ if (opt->flags & P_STRING)
+! dict_add_nr_str(d, opt->fullname, 0L, *(char_u **)varp);
+ else if (opt->flags & P_NUM)
+! dict_add_nr_str(d, opt->fullname, *(long *)varp, NULL);
+ else
+! dict_add_nr_str(d, opt->fullname, *(int *)varp, NULL);
+ }
+ }
+ }
+--- 13222,13232 ----
+ if (varp != NULL)
+ {
+ if (opt->flags & P_STRING)
+! dict_add_string(d, opt->fullname, *(char_u **)varp);
+ else if (opt->flags & P_NUM)
+! dict_add_number(d, opt->fullname, *(long *)varp);
+ else
+! dict_add_number(d, opt->fullname, *(int *)varp);
+ }
+ }
+ }
+*** ../vim-8.1.0165/src/proto/dict.pro Thu May 17 13:52:31 2018
+--- src/proto/dict.pro Sun Jul 8 16:42:07 2018
+***************
+*** 12,18 ****
+ void dictitem_free(dictitem_T *item);
+ dict_T *dict_copy(dict_T *orig, int deep, int copyID);
+ int dict_add(dict_T *d, dictitem_T *item);
+! int dict_add_nr_str(dict_T *d, char *key, varnumber_T nr, char_u *str);
+ int dict_add_list(dict_T *d, char *key, list_T *list);
+ int dict_add_dict(dict_T *d, char *key, dict_T *dict);
+ long dict_len(dict_T *d);
+--- 12,19 ----
+ void dictitem_free(dictitem_T *item);
+ dict_T *dict_copy(dict_T *orig, int deep, int copyID);
+ int dict_add(dict_T *d, dictitem_T *item);
+! int dict_add_number(dict_T *d, char *key, varnumber_T nr);
+! int dict_add_string(dict_T *d, char *key, char_u *str);
+ int dict_add_list(dict_T *d, char *key, list_T *list);
+ int dict_add_dict(dict_T *d, char *key, dict_T *dict);
+ long dict_len(dict_T *d);
+*** ../vim-8.1.0165/src/quickfix.c Sun Jul 8 16:01:04 2018
+--- src/quickfix.c Sun Jul 8 16:42:07 2018
+***************
+*** 5360,5378 ****
+
+ buf[0] = qfp->qf_type;
+ buf[1] = NUL;
+! if ( dict_add_nr_str(dict, "bufnr", (long)bufnum, NULL) == FAIL
+! || dict_add_nr_str(dict, "lnum", (long)qfp->qf_lnum, NULL) == FAIL
+! || dict_add_nr_str(dict, "col", (long)qfp->qf_col, NULL) == FAIL
+! || dict_add_nr_str(dict, "vcol", (long)qfp->qf_viscol, NULL) == FAIL
+! || dict_add_nr_str(dict, "nr", (long)qfp->qf_nr, NULL) == FAIL
+! || dict_add_nr_str(dict, "module", 0L,
+! qfp->qf_module == NULL ? (char_u *)"" : qfp->qf_module) == FAIL
+! || dict_add_nr_str(dict, "pattern", 0L,
+! qfp->qf_pattern == NULL ? (char_u *)"" : qfp->qf_pattern) == FAIL
+! || dict_add_nr_str(dict, "text", 0L,
+! qfp->qf_text == NULL ? (char_u *)"" : qfp->qf_text) == FAIL
+! || dict_add_nr_str(dict, "type", 0L, buf) == FAIL
+! || dict_add_nr_str(dict, "valid", (long)qfp->qf_valid, NULL) == FAIL)
+ return FAIL;
+
+ qfp = qfp->qf_next;
+--- 5360,5375 ----
+
+ buf[0] = qfp->qf_type;
+ buf[1] = NUL;
+! if ( dict_add_number(dict, "bufnr", (long)bufnum) == FAIL
+! || dict_add_number(dict, "lnum", (long)qfp->qf_lnum) == FAIL
+! || dict_add_number(dict, "col", (long)qfp->qf_col) == FAIL
+! || dict_add_number(dict, "vcol", (long)qfp->qf_viscol) == FAIL
+! || dict_add_number(dict, "nr", (long)qfp->qf_nr) == FAIL
+! || dict_add_string(dict, "module", qfp->qf_module) == FAIL
+! || dict_add_string(dict, "pattern", qfp->qf_pattern) == FAIL
+! || dict_add_string(dict, "text", qfp->qf_text) == FAIL
+! || dict_add_string(dict, "type", buf) == FAIL
+! || dict_add_number(dict, "valid", (long)qfp->qf_valid) == FAIL)
+ return FAIL;
+
+ qfp = qfp->qf_next;
+***************
+*** 5576,5582 ****
+ int status = OK;
+
+ if (flags & QF_GETLIST_TITLE)
+! status = dict_add_nr_str(retdict, "title", 0L, (char_u *)"");
+ if ((status == OK) && (flags & QF_GETLIST_ITEMS))
+ {
+ list_T *l = list_alloc();
+--- 5573,5579 ----
+ int status = OK;
+
+ if (flags & QF_GETLIST_TITLE)
+! status = dict_add_string(retdict, "title", (char_u *)"");
+ if ((status == OK) && (flags & QF_GETLIST_ITEMS))
+ {
+ list_T *l = list_alloc();
+***************
+*** 5586,5604 ****
+ status = FAIL;
+ }
+ if ((status == OK) && (flags & QF_GETLIST_NR))
+! status = dict_add_nr_str(retdict, "nr", 0L, NULL);
+ if ((status == OK) && (flags & QF_GETLIST_WINID))
+! status = dict_add_nr_str(retdict, "winid", qf_winid(qi), NULL);
+ if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
+! status = dict_add_nr_str(retdict, "context", 0L, (char_u *)"");
+ if ((status == OK) && (flags & QF_GETLIST_ID))
+! status = dict_add_nr_str(retdict, "id", 0L, NULL);
+ if ((status == OK) && (flags & QF_GETLIST_IDX))
+! status = dict_add_nr_str(retdict, "idx", 0L, NULL);
+ if ((status == OK) && (flags & QF_GETLIST_SIZE))
+! status = dict_add_nr_str(retdict, "size", 0L, NULL);
+ if ((status == OK) && (flags & QF_GETLIST_TICK))
+! status = dict_add_nr_str(retdict, "changedtick", 0L, NULL);
+
+ return status;
+ }
+--- 5583,5601 ----
+ status = FAIL;
+ }
+ if ((status == OK) && (flags & QF_GETLIST_NR))
+! status = dict_add_number(retdict, "nr", 0);
+ if ((status == OK) && (flags & QF_GETLIST_WINID))
+! status = dict_add_number(retdict, "winid", qf_winid(qi));
+ if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
+! status = dict_add_string(retdict, "context", (char_u *)"");
+ if ((status == OK) && (flags & QF_GETLIST_ID))
+! status = dict_add_number(retdict, "id", 0);
+ if ((status == OK) && (flags & QF_GETLIST_IDX))
+! status = dict_add_number(retdict, "idx", 0);
+ if ((status == OK) && (flags & QF_GETLIST_SIZE))
+! status = dict_add_number(retdict, "size", 0);
+ if ((status == OK) && (flags & QF_GETLIST_TICK))
+! status = dict_add_number(retdict, "changedtick", 0);
+
+ return status;
+ }
+***************
+*** 5609,5620 ****
+ static int
+ qf_getprop_title(qf_info_T *qi, int qf_idx, dict_T *retdict)
+ {
+! char_u *t;
+!
+! t = qi->qf_lists[qf_idx].qf_title;
+! if (t == NULL)
+! t = (char_u *)"";
+! return dict_add_nr_str(retdict, "title", 0L, t);
+ }
+
+ /*
+--- 5606,5612 ----
+ static int
+ qf_getprop_title(qf_info_T *qi, int qf_idx, dict_T *retdict)
+ {
+! return dict_add_string(retdict, "title", qi->qf_lists[qf_idx].qf_title);
+ }
+
+ /*
+***************
+*** 5659,5665 ****
+ status = FAIL;
+ }
+ else
+! status = dict_add_nr_str(retdict, "context", 0L, (char_u *)"");
+
+ return status;
+ }
+--- 5651,5657 ----
+ status = FAIL;
+ }
+ else
+! status = dict_add_string(retdict, "context", (char_u *)"");
+
+ return status;
+ }
+***************
+*** 5674,5680 ****
+ if (qi->qf_lists[qf_idx].qf_count == 0)
+ /* For empty lists, qf_index is set to 1 */
+ idx = 0;
+! return dict_add_nr_str(retdict, "idx", idx, NULL);
+ }
+
+ /*
+--- 5666,5672 ----
+ if (qi->qf_lists[qf_idx].qf_count == 0)
+ /* For empty lists, qf_index is set to 1 */
+ idx = 0;
+! return dict_add_number(retdict, "idx", idx);
+ }
+
+ /*
+***************
+*** 5709,5732 ****
+ if (flags & QF_GETLIST_TITLE)
+ status = qf_getprop_title(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_NR))
+! status = dict_add_nr_str(retdict, "nr", qf_idx + 1, NULL);
+ if ((status == OK) && (flags & QF_GETLIST_WINID))
+! status = dict_add_nr_str(retdict, "winid", qf_winid(qi), NULL);
+ if ((status == OK) && (flags & QF_GETLIST_ITEMS))
+ status = qf_getprop_items(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
+ status = qf_getprop_ctx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_ID))
+! status = dict_add_nr_str(retdict, "id", qi->qf_lists[qf_idx].qf_id,
+! NULL);
+ if ((status == OK) && (flags & QF_GETLIST_IDX))
+ status = qf_getprop_idx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_SIZE))
+! status = dict_add_nr_str(retdict, "size",
+! qi->qf_lists[qf_idx].qf_count, NULL);
+ if ((status == OK) && (flags & QF_GETLIST_TICK))
+! status = dict_add_nr_str(retdict, "changedtick",
+! qi->qf_lists[qf_idx].qf_changedtick, NULL);
+
+ return status;
+ }
+--- 5701,5723 ----
+ if (flags & QF_GETLIST_TITLE)
+ status = qf_getprop_title(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_NR))
+! status = dict_add_number(retdict, "nr", qf_idx + 1);
+ if ((status == OK) && (flags & QF_GETLIST_WINID))
+! status = dict_add_number(retdict, "winid", qf_winid(qi));
+ if ((status == OK) && (flags & QF_GETLIST_ITEMS))
+ status = qf_getprop_items(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
+ status = qf_getprop_ctx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_ID))
+! status = dict_add_number(retdict, "id", qi->qf_lists[qf_idx].qf_id);
+ if ((status == OK) && (flags & QF_GETLIST_IDX))
+ status = qf_getprop_idx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_SIZE))
+! status = dict_add_number(retdict, "size",
+! qi->qf_lists[qf_idx].qf_count);
+ if ((status == OK) && (flags & QF_GETLIST_TICK))
+! status = dict_add_number(retdict, "changedtick",
+! qi->qf_lists[qf_idx].qf_changedtick);
+
+ return status;
+ }
+*** ../vim-8.1.0165/src/tag.c Sat Jun 30 22:40:39 2018
+--- src/tag.c Sun Jul 8 16:42:07 2018
+***************
+*** 905,915 ****
+ continue;
+ }
+
+! dict_add_nr_str(dict, "text", 0L, tag_name);
+! dict_add_nr_str(dict, "filename", 0L, fname);
+! dict_add_nr_str(dict, "lnum", lnum, NULL);
+ if (lnum == 0)
+! dict_add_nr_str(dict, "pattern", 0L, cmd);
+ }
+
+ vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag);
+--- 905,915 ----
+ continue;
+ }
+
+! dict_add_string(dict, "text", tag_name);
+! dict_add_string(dict, "filename", fname);
+! dict_add_number(dict, "lnum", lnum);
+ if (lnum == 0)
+! dict_add_string(dict, "pattern", cmd);
+ }
+
+ vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag);
+***************
+*** 3923,3929 ****
+ vim_strncpy(buf, start, len);
+ }
+ buf[len] = NUL;
+! retval = dict_add_nr_str(dict, field_name, 0L, buf);
+ vim_free(buf);
+ return retval;
+ }
+--- 3923,3929 ----
+ vim_strncpy(buf, start, len);
+ }
+ buf[len] = NUL;
+! retval = dict_add_string(dict, field_name, buf);
+ vim_free(buf);
+ return retval;
+ }
+***************
+*** 3968,3974 ****
+ tp.command_end) == FAIL
+ || add_tag_field(dict, "kind", tp.tagkind,
+ tp.tagkind_end) == FAIL
+! || dict_add_nr_str(dict, "static", is_static, NULL) == FAIL)
+ ret = FAIL;
+
+ vim_free(full_fname);
+--- 3968,3974 ----
+ tp.command_end) == FAIL
+ || add_tag_field(dict, "kind", tp.tagkind,
+ tp.tagkind_end) == FAIL
+! || dict_add_number(dict, "static", is_static) == FAIL)
+ ret = FAIL;
+
+ vim_free(full_fname);
+*** ../vim-8.1.0165/src/terminal.c Tue Jun 19 19:59:15 2018
+--- src/terminal.c Sun Jul 8 16:42:07 2018
+***************
+*** 4729,4739 ****
+ d = dict_alloc();
+ if (d != NULL)
+ {
+! dict_add_nr_str(d, "visible", term->tl_cursor_visible, NULL);
+! dict_add_nr_str(d, "blink", blink_state_is_inverted()
+! ? !term->tl_cursor_blink : term->tl_cursor_blink, NULL);
+! dict_add_nr_str(d, "shape", term->tl_cursor_shape, NULL);
+! dict_add_nr_str(d, "color", 0L, cursor_color_get(term->tl_cursor_color));
+ list_append_dict(l, d);
+ }
+ }
+--- 4729,4739 ----
+ d = dict_alloc();
+ if (d != NULL)
+ {
+! dict_add_number(d, "visible", term->tl_cursor_visible);
+! dict_add_number(d, "blink", blink_state_is_inverted()
+! ? !term->tl_cursor_blink : term->tl_cursor_blink);
+! dict_add_number(d, "shape", term->tl_cursor_shape);
+! dict_add_string(d, "color", cursor_color_get(term->tl_cursor_color));
+ list_append_dict(l, d);
+ }
+ }
+***************
+*** 5059,5076 ****
+ break;
+ list_append_dict(l, dcell);
+
+! dict_add_nr_str(dcell, "chars", 0, mbs);
+
+ vim_snprintf((char *)rgb, 8, "#%02x%02x%02x",
+ fg.red, fg.green, fg.blue);
+! dict_add_nr_str(dcell, "fg", 0, rgb);
+ vim_snprintf((char *)rgb, 8, "#%02x%02x%02x",
+ bg.red, bg.green, bg.blue);
+! dict_add_nr_str(dcell, "bg", 0, rgb);
+
+! dict_add_nr_str(dcell, "attr",
+! cell2attr(attrs, fg, bg), NULL);
+! dict_add_nr_str(dcell, "width", width, NULL);
+
+ ++pos.col;
+ if (width == 2)
+--- 5059,5075 ----
+ break;
+ list_append_dict(l, dcell);
+
+! dict_add_string(dcell, "chars", mbs);
+
+ vim_snprintf((char *)rgb, 8, "#%02x%02x%02x",
+ fg.red, fg.green, fg.blue);
+! dict_add_string(dcell, "fg", rgb);
+ vim_snprintf((char *)rgb, 8, "#%02x%02x%02x",
+ bg.red, bg.green, bg.blue);
+! dict_add_string(dcell, "bg", rgb);
+
+! dict_add_number(dcell, "attr", cell2attr(attrs, fg, bg));
+! dict_add_number(dcell, "width", width);
+
+ ++pos.col;
+ if (width == 2)
+*** ../vim-8.1.0165/src/undo.c Sun Jul 1 16:43:59 2018
+--- src/undo.c Sun Jul 8 16:42:07 2018
+***************
+*** 3567,3580 ****
+ dict = dict_alloc();
+ if (dict == NULL)
+ return;
+! dict_add_nr_str(dict, "seq", uhp->uh_seq, NULL);
+! dict_add_nr_str(dict, "time", (long)uhp->uh_time, NULL);
+ if (uhp == curbuf->b_u_newhead)
+! dict_add_nr_str(dict, "newhead", 1, NULL);
+ if (uhp == curbuf->b_u_curhead)
+! dict_add_nr_str(dict, "curhead", 1, NULL);
+ if (uhp->uh_save_nr > 0)
+! dict_add_nr_str(dict, "save", uhp->uh_save_nr, NULL);
+
+ if (uhp->uh_alt_next.ptr != NULL)
+ {
+--- 3567,3580 ----
+ dict = dict_alloc();
+ if (dict == NULL)
+ return;
+! dict_add_number(dict, "seq", uhp->uh_seq);
+! dict_add_number(dict, "time", (long)uhp->uh_time);
+ if (uhp == curbuf->b_u_newhead)
+! dict_add_number(dict, "newhead", 1);
+ if (uhp == curbuf->b_u_curhead)
+! dict_add_number(dict, "curhead", 1);
+ if (uhp->uh_save_nr > 0)
+! dict_add_number(dict, "save", uhp->uh_save_nr);
+
+ if (uhp->uh_alt_next.ptr != NULL)
+ {
+*** ../vim-8.1.0165/src/version.c Sun Jul 8 16:01:04 2018
+--- src/version.c Sun Jul 8 16:43:50 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 166,
+ /**/
+
+
+--
+hundred-and-one symptoms of being an internet addict:
+207. You're given one phone call in prison and you ask them for a laptop.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0167 b/data/vim/patches/8.1.0167
new file mode 100644
index 000000000..6cdbd2fd8
--- /dev/null
+++ b/data/vim/patches/8.1.0167
@@ -0,0 +1,206 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0167
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0167
+Problem: Lock flag in new dictitem is reset in many places.
+Solution: Always reset the lock flag.
+Files: src/dict.c, src/channel.c, src/ex_cmds2.c, src/userfunc.c,
+ src/if_perl.xs, src/if_py_both.h
+
+
+*** ../vim-8.1.0166/src/dict.c Sun Jul 8 16:50:33 2018
+--- src/dict.c Sun Jul 8 17:06:50 2018
+***************
+*** 188,194 ****
+ /*
+ * 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.
+ */
+ dictitem_T *
+--- 188,195 ----
+ /*
+ * Allocate a Dictionary item.
+ * The "key" is copied to the new item.
+! * Note that the type and value of the item "di_tv" still needs to be
+! * initialized!
+ * Returns NULL when out of memory.
+ */
+ dictitem_T *
+***************
+*** 201,206 ****
+--- 202,208 ----
+ {
+ STRCPY(di->di_key, key);
+ di->di_flags = DI_FLAGS_ALLOC;
++ di->di_tv.v_lock = 0;
+ }
+ return di;
+ }
+***************
+*** 338,344 ****
+ item = dictitem_alloc((char_u *)key);
+ if (item == NULL)
+ return FAIL;
+- item->di_tv.v_lock = 0;
+ item->di_tv.v_type = VAR_NUMBER;
+ item->di_tv.vval.v_number = nr;
+ if (dict_add(d, item) == FAIL)
+--- 340,345 ----
+***************
+*** 361,367 ****
+ item = dictitem_alloc((char_u *)key);
+ if (item == NULL)
+ return FAIL;
+- item->di_tv.v_lock = 0;
+ item->di_tv.v_type = VAR_STRING;
+ item->di_tv.vval.v_string = str != NULL ? vim_strsave(str) : NULL;
+ if (dict_add(d, item) == FAIL)
+--- 362,367 ----
+***************
+*** 384,390 ****
+ item = dictitem_alloc((char_u *)key);
+ if (item == NULL)
+ return FAIL;
+- item->di_tv.v_lock = 0;
+ item->di_tv.v_type = VAR_LIST;
+ item->di_tv.vval.v_list = list;
+ ++list->lv_refcount;
+--- 384,389 ----
+***************
+*** 408,414 ****
+ item = dictitem_alloc((char_u *)key);
+ if (item == NULL)
+ return FAIL;
+- item->di_tv.v_lock = 0;
+ item->di_tv.v_type = VAR_DICT;
+ item->di_tv.vval.v_dict = dict;
+ ++dict->dv_refcount;
+--- 407,412 ----
+*** ../vim-8.1.0166/src/channel.c Sun Jul 8 16:50:33 2018
+--- src/channel.c Sun Jul 8 17:05:44 2018
+***************
+*** 5742,5748 ****
+ item = dictitem_alloc((char_u *)"channel");
+ if (item == NULL)
+ return;
+- item->di_tv.v_lock = 0;
+ item->di_tv.v_type = VAR_CHANNEL;
+ item->di_tv.vval.v_channel = job->jv_channel;
+ if (job->jv_channel != NULL)
+--- 5742,5747 ----
+*** ../vim-8.1.0166/src/ex_cmds2.c Sun Jul 8 16:50:33 2018
+--- src/ex_cmds2.c Sun Jul 8 17:07:59 2018
+***************
+*** 1524,1530 ****
+ di->di_tv.v_type = VAR_FUNC;
+ di->di_tv.vval.v_string = vim_strsave(timer->tr_callback);
+ }
+- di->di_tv.v_lock = 0;
+ }
+ }
+
+--- 1524,1529 ----
+*** ../vim-8.1.0166/src/userfunc.c Sat Jun 30 18:27:59 2018
+--- src/userfunc.c Sun Jul 8 17:10:33 2018
+***************
+*** 2390,2396 ****
+ /* overwrite existing dict entry */
+ clear_tv(&fudi.fd_di->di_tv);
+ fudi.fd_di->di_tv.v_type = VAR_FUNC;
+- fudi.fd_di->di_tv.v_lock = 0;
+ fudi.fd_di->di_tv.vval.v_string = vim_strsave(name);
+
+ /* behave like "dict" was used */
+--- 2390,2395 ----
+*** ../vim-8.1.0166/src/if_perl.xs Tue Mar 6 12:22:50 2018
+--- src/if_perl.xs Sun Jul 8 17:11:10 2018
+***************
+*** 1200,1209 ****
+
+ if ((item = dictitem_alloc((char_u *)key)) == NULL)
+ break;
+!
+! item->di_tv.v_type = VAR_NUMBER;
+! item->di_tv.v_lock = 0;
+! item->di_tv.vval.v_number = 0;
+
+ if (dict_add(dict, item) == FAIL) {
+ dictitem_free(item);
+--- 1200,1207 ----
+
+ if ((item = dictitem_alloc((char_u *)key)) == NULL)
+ break;
+! item->di_tv.v_type = VAR_NUMBER;
+! item->di_tv.vval.v_number = 0;
+
+ if (dict_add(dict, item) == FAIL) {
+ dictitem_free(item);
+*** ../vim-8.1.0166/src/if_py_both.h Sun Jun 10 13:55:48 2018
+--- src/if_py_both.h Sun Jul 8 17:12:13 2018
+***************
+*** 1832,1838 ****
+ PyErr_NoMemory();
+ return -1;
+ }
+- di->di_tv.v_lock = 0;
+ di->di_tv.v_type = VAR_UNKNOWN;
+
+ if (dict_add(dict, di) == FAIL)
+--- 1832,1837 ----
+***************
+*** 2038,2044 ****
+ PyErr_NoMemory();
+ return NULL;
+ }
+- di->di_tv.v_lock = 0;
+ di->di_tv.v_type = VAR_UNKNOWN;
+
+ valObject = PySequence_Fast_GET_ITEM(fast, 1);
+--- 2037,2042 ----
+***************
+*** 5852,5858 ****
+ dict_unref(dict);
+ return -1;
+ }
+- di->di_tv.v_lock = 0;
+
+ if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1)
+ {
+--- 5850,5855 ----
+***************
+*** 5950,5956 ****
+ PyErr_NoMemory();
+ return -1;
+ }
+- di->di_tv.v_lock = 0;
+
+ if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1)
+ {
+--- 5947,5952 ----
+*** ../vim-8.1.0166/src/version.c Sun Jul 8 16:50:33 2018
+--- src/version.c Sun Jul 8 17:18:05 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 167,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+208. Your goals for the future are obtaining an T1 connection and
+ a 130 gig hard drive.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0168 b/data/vim/patches/8.1.0168
new file mode 100644
index 000000000..caf543f05
--- /dev/null
+++ b/data/vim/patches/8.1.0168
@@ -0,0 +1,138 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0168
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0168
+Problem: Output of :marks is too short with multi-byte chars. (Tony
+ Mechelynck)
+Solution: Get more bytes from the text line.
+Files: src/mark.c, src/testdir/test_marks.vim
+
+
+*** ../vim-8.1.0167/src/mark.c Tue Feb 13 13:31:39 2018
+--- src/mark.c Sun Jul 8 17:51:23 2018
+***************
+*** 686,695 ****
+
+ if (mp->lnum == 0 || mp->lnum > curbuf->b_ml.ml_line_count)
+ return vim_strsave((char_u *)"-invalid-");
+! s = vim_strnsave(skipwhite(ml_get(mp->lnum)), (int)Columns);
+ if (s == NULL)
+ return NULL;
+! /* Truncate the line to fit it in the window */
+ len = 0;
+ for (p = s; *p != NUL; MB_PTR_ADV(p))
+ {
+--- 686,696 ----
+
+ if (mp->lnum == 0 || mp->lnum > curbuf->b_ml.ml_line_count)
+ return vim_strsave((char_u *)"-invalid-");
+! // Allow for up to 5 bytes per character.
+! s = vim_strnsave(skipwhite(ml_get(mp->lnum)), (int)Columns * 5);
+ if (s == NULL)
+ return NULL;
+! // Truncate the line to fit it in the window.
+ len = 0;
+ for (p = s; *p != NUL; MB_PTR_ADV(p))
+ {
+*** ../vim-8.1.0167/src/testdir/test_marks.vim Sun Oct 8 21:36:50 2017
+--- src/testdir/test_marks.vim Sun Jul 8 17:50:33 2018
+***************
+*** 80,86 ****
+ w!
+
+ b Xone
+! let a=split(execute('marks'), "\n")
+ call assert_equal(9, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(" ' 2 0 bbb", a[1])
+--- 80,86 ----
+ w!
+
+ b Xone
+! let a = split(execute('marks'), "\n")
+ call assert_equal(9, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(" ' 2 0 bbb", a[1])
+***************
+*** 93,99 ****
+ call assert_equal(' . 2 0 bbb', a[8])
+
+ b Xtwo
+! let a=split(execute('marks'), "\n")
+ call assert_equal(9, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(" ' 1 0 ccc", a[1])
+--- 93,99 ----
+ call assert_equal(' . 2 0 bbb', a[8])
+
+ b Xtwo
+! let a = split(execute('marks'), "\n")
+ call assert_equal(9, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(" ' 1 0 ccc", a[1])
+***************
+*** 107,113 ****
+
+ b Xone
+ delmarks aB
+! let a=split(execute('marks aBcD'), "\n")
+ call assert_equal(2, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(' D 2 0 Xtwo', a[1])
+--- 107,113 ----
+
+ b Xone
+ delmarks aB
+! let a = split(execute('marks aBcD'), "\n")
+ call assert_equal(2, len(a))
+ call assert_equal('mark line col file/text', a[0])
+ call assert_equal(' D 2 0 Xtwo', a[1])
+***************
+*** 120,122 ****
+--- 120,141 ----
+ call delete('Xtwo')
+ %bwipe
+ endfunc
++
++ func Test_marks_cmd_multibyte()
++ if !has('multi_byte')
++ return
++ endif
++ new Xone
++ call setline(1, ['ááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááá'])
++ norm! ma
++
++ let a = split(execute('marks a'), "\n")
++ call assert_equal(2, len(a))
++ let expected = ' a 1 0 '
++ while strwidth(expected) < &columns - 1
++ let expected .= 'á'
++ endwhile
++ call assert_equal(expected, a[1])
++
++ bwipe!
++ endfunc
+*** ../vim-8.1.0167/src/version.c Sun Jul 8 17:18:58 2018
+--- src/version.c Sun Jul 8 17:51:37 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 168,
+ /**/
+
+--
+Your mouse has moved. Windows must be restarted for the change
+to take effect. Reboot now?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0169 b/data/vim/patches/8.1.0169
new file mode 100644
index 000000000..8b6702b98
--- /dev/null
+++ b/data/vim/patches/8.1.0169
@@ -0,0 +1,110 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0169
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0169 (after 8.1.0165)
+Problem: Calling message_filtered() a bit too often.
+Solution: Only call message_filtered() when filtering is already false.
+Files: src/quickfix.c, runtime/doc/quickfix.txt
+
+
+*** ../vim-8.1.0168/src/quickfix.c Sun Jul 8 16:50:33 2018
+--- src/quickfix.c Sun Jul 8 18:17:59 2018
+***************
+*** 3139,3156 ****
+ sprintf((char *)IObuff, "%2d", i);
+ else
+ vim_snprintf((char *)IObuff, IOSIZE, "%2d %s",
+! i, (char *)fname);
+ }
+
+ // Support for filtering entries using :filter /pat/ clist
+! filter_entry = 1;
+ if (qfp->qf_module != NULL && *qfp->qf_module != NUL)
+ filter_entry &= message_filtered(qfp->qf_module);
+! if (fname != NULL)
+ filter_entry &= message_filtered(fname);
+! if (qfp->qf_pattern != NULL)
+ filter_entry &= message_filtered(qfp->qf_pattern);
+! filter_entry &= message_filtered(qfp->qf_text);
+ if (filter_entry)
+ goto next_entry;
+
+--- 3139,3159 ----
+ sprintf((char *)IObuff, "%2d", i);
+ else
+ vim_snprintf((char *)IObuff, IOSIZE, "%2d %s",
+! i, (char *)fname);
+ }
+
+ // Support for filtering entries using :filter /pat/ clist
+! // Match against the module name, file name, search pattern and
+! // text of the entry.
+! filter_entry = TRUE;
+ if (qfp->qf_module != NULL && *qfp->qf_module != NUL)
+ filter_entry &= message_filtered(qfp->qf_module);
+! if (filter_entry && fname != NULL)
+ filter_entry &= message_filtered(fname);
+! if (filter_entry && qfp->qf_pattern != NULL)
+ filter_entry &= message_filtered(qfp->qf_pattern);
+! if (filter_entry)
+! filter_entry &= message_filtered(qfp->qf_text);
+ if (filter_entry)
+ goto next_entry;
+
+*** ../vim-8.1.0168/runtime/doc/quickfix.txt Thu May 17 13:42:02 2018
+--- runtime/doc/quickfix.txt Sun Jul 8 18:16:55 2018
+***************
+*** 298,303 ****
+--- 298,307 ----
+ from the last error backwards, -1 being the last error.
+ The 'switchbuf' settings are respected when jumping
+ to a buffer.
++ The |:filter| command can be used to display only the
++ quickfix entries matching a supplied pattern. The
++ pattern is matched against the filename, module name,
++ pattern and text of the entry.
+
+ :cl[ist] +{count} List the current and next {count} valid errors. This
+ is similar to ":clist from from+count", where "from"
+***************
+*** 1287,1293 ****
+ Changing directory
+
+ The following uppercase conversion characters specify the type of special
+! format strings. At most one of them may be given as a prefix at the begin
+ of a single comma-separated format pattern.
+ Some compilers produce messages that consist of directory names that have to
+ be prepended to each file name read by %f (example: GNU make). The following
+--- 1291,1297 ----
+ Changing directory
+
+ The following uppercase conversion characters specify the type of special
+! format strings. At most one of them may be given as a prefix at the beginning
+ of a single comma-separated format pattern.
+ Some compilers produce messages that consist of directory names that have to
+ be prepended to each file name read by %f (example: GNU make). The following
+*** ../vim-8.1.0168/src/version.c Sun Jul 8 17:57:30 2018
+--- src/version.c Sun Jul 8 18:16:48 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 169,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+211. Your husband leaves you...taking the computer with him and you
+ call him crying, and beg him to bring the computer back.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0170 b/data/vim/patches/8.1.0170
new file mode 100644
index 000000000..7c6ab3497
--- /dev/null
+++ b/data/vim/patches/8.1.0170
@@ -0,0 +1,296 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0170
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0170
+Problem: Invalid memory use with complicated pattern. (Andy Massimino)
+Solution: Reallocate the list of listids when needed. (closes #3175)
+ Remove unnecessary function prototypes.
+Files: src/regexp_nfa.c
+
+
+*** ../vim-8.1.0169/src/regexp_nfa.c Sat Jun 23 17:14:36 2018
+--- src/regexp_nfa.c Sun Jul 8 19:03:46 2018
+***************
+*** 282,322 ****
+ /* 0 for first call to nfa_regmatch(), 1 for recursive call. */
+ static int nfa_ll_index = 0;
+
+- static int nfa_regcomp_start(char_u *expr, int re_flags);
+- static int nfa_get_reganch(nfa_state_T *start, int depth);
+- static int nfa_get_regstart(nfa_state_T *start, int depth);
+- static char_u *nfa_get_match_text(nfa_state_T *start);
+ static int realloc_post_list(void);
+- static int nfa_recognize_char_class(char_u *start, char_u *end, int extra_newl);
+- static int nfa_emit_equi_class(int c);
+- static int nfa_regatom(void);
+- static int nfa_regpiece(void);
+- static int nfa_regconcat(void);
+- static int nfa_regbranch(void);
+ static int nfa_reg(int paren);
+ #ifdef DEBUG
+- static void nfa_set_code(int c);
+- static void nfa_postfix_dump(char_u *expr, int retval);
+- static void nfa_print_state(FILE *debugf, nfa_state_T *state);
+ static void nfa_print_state2(FILE *debugf, nfa_state_T *state, garray_T *indent);
+- static void nfa_dump(nfa_regprog_T *prog);
+ #endif
+- static int *re2post(void);
+- static nfa_state_T *alloc_state(int c, nfa_state_T *out, nfa_state_T *out1);
+- static void st_error(int *postfix, int *end, int *p);
+- static int nfa_max_width(nfa_state_T *startstate, int depth);
+- static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size);
+- static void nfa_postprocess(nfa_regprog_T *prog);
+- static int check_char_class(int class, int c);
+- static void nfa_save_listids(nfa_regprog_T *prog, int *list);
+- static void nfa_restore_listids(nfa_regprog_T *prog, int *list);
+- static int nfa_re_num_cmp(long_u val, int op, long_u pos);
+- static long nfa_regtry(nfa_regprog_T *prog, colnr_T col, proftime_T *tm, int *timed_out);
+- static long nfa_regexec_both(char_u *line, colnr_T col, proftime_T *tm, int *timed_out);
+- static regprog_T *nfa_regcomp(char_u *expr, int re_flags);
+- static void nfa_regfree(regprog_T *prog);
+- static int nfa_regexec_nl(regmatch_T *rmp, char_u *line, colnr_T col, int line_lbr);
+- static long nfa_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm, int *timed_out);
+ static int match_follows(nfa_state_T *startstate, int depth);
+ static int failure_chance(nfa_state_T *state, int depth);
+
+--- 282,292 ----
+***************
+*** 2876,2888 ****
+ };
+ typedef struct Frag Frag_T;
+
+- static Frag_T frag(nfa_state_T *start, Ptrlist *out);
+- static Ptrlist *list1(nfa_state_T **outp);
+- static void patch(Ptrlist *l, nfa_state_T *s);
+- static Ptrlist *append(Ptrlist *l1, Ptrlist *l2);
+- static void st_push(Frag_T s, Frag_T **p, Frag_T *stack_end);
+- static Frag_T st_pop(Frag_T **p, Frag_T *stack);
+-
+ /*
+ * Initialize a Frag_T struct and return it.
+ */
+--- 2846,2851 ----
+***************
+*** 3917,3925 ****
+ } nfa_list_T;
+
+ #ifdef ENABLE_LOG
+- static void log_subsexpr(regsubs_T *subs);
+ static void log_subexpr(regsub_T *sub);
+- static char *pim_info(nfa_pim_T *pim);
+
+ static void
+ log_subsexpr(regsubs_T *subs)
+--- 3880,3886 ----
+***************
+*** 3974,3998 ****
+ #endif
+
+ /* Used during execution: whether a match has been found. */
+! static int nfa_match;
+ #ifdef FEAT_RELTIME
+ static proftime_T *nfa_time_limit;
+ static int *nfa_timed_out;
+ static int nfa_time_count;
+ #endif
+
+- static void copy_pim(nfa_pim_T *to, nfa_pim_T *from);
+- static void clear_sub(regsub_T *sub);
+ static void copy_sub(regsub_T *to, regsub_T *from);
+- static void copy_sub_off(regsub_T *to, regsub_T *from);
+- static void copy_ze_off(regsub_T *to, regsub_T *from);
+- static int sub_equal(regsub_T *sub1, regsub_T *sub2);
+- static int match_backref(regsub_T *sub, int subidx, int *bytelen);
+- static int has_state_with_pos(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim);
+ static int pim_equal(nfa_pim_T *one, nfa_pim_T *two);
+- static int state_in_list(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs);
+- static regsubs_T *addstate(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs_arg, nfa_pim_T *pim, int off);
+- static void addstate_here(nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim, int *ip);
+
+ /*
+ * Copy postponed invisible match info from "from" to "to".
+--- 3935,3949 ----
+ #endif
+
+ /* Used during execution: whether a match has been found. */
+! static int nfa_match;
+ #ifdef FEAT_RELTIME
+ static proftime_T *nfa_time_limit;
+ static int *nfa_timed_out;
+ static int nfa_time_count;
+ #endif
+
+ static void copy_sub(regsub_T *to, regsub_T *from);
+ static int pim_equal(nfa_pim_T *one, nfa_pim_T *two);
+
+ /*
+ * Copy postponed invisible match info from "from" to "to".
+***************
+*** 5018,5025 ****
+
+ #ifdef FEAT_SYN_HL
+
+- static int match_zref(int subidx, int *bytelen);
+-
+ /*
+ * Check for a match with \z subexpression "subidx".
+ * Return TRUE if it matches.
+--- 4969,4974 ----
+***************
+*** 5095,5101 ****
+ return val == pos;
+ }
+
+- static int recursive_regmatch(nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T *prog, regsubs_T *submatch, regsubs_T *m, int **listids);
+ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *submatch, regsubs_T *m);
+
+ /*
+--- 5044,5049 ----
+***************
+*** 5110,5116 ****
+ nfa_regprog_T *prog,
+ regsubs_T *submatch,
+ regsubs_T *m,
+! int **listids)
+ {
+ int save_reginput_col = (int)(reginput - regline);
+ int save_reglnum = reglnum;
+--- 5058,5065 ----
+ nfa_regprog_T *prog,
+ regsubs_T *submatch,
+ regsubs_T *m,
+! int **listids,
+! int *listids_len)
+ {
+ int save_reginput_col = (int)(reginput - regline);
+ int save_reglnum = reglnum;
+***************
+*** 5212,5225 ****
+ {
+ /* Already calling nfa_regmatch() recursively. Save the lastlist[1]
+ * values and clear them. */
+! if (*listids == NULL)
+ {
+ *listids = (int *)lalloc(sizeof(int) * nstate, TRUE);
+ if (*listids == NULL)
+ {
+ EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
+ return 0;
+ }
+ }
+ nfa_save_listids(prog, *listids);
+ need_restore = TRUE;
+--- 5161,5176 ----
+ {
+ /* Already calling nfa_regmatch() recursively. Save the lastlist[1]
+ * values and clear them. */
+! if (*listids == NULL || *listids_len < nstate)
+ {
++ vim_free(*listids);
+ *listids = (int *)lalloc(sizeof(int) * nstate, TRUE);
+ if (*listids == NULL)
+ {
+ EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
+ return 0;
+ }
++ *listids_len = nstate;
+ }
+ nfa_save_listids(prog, *listids);
+ need_restore = TRUE;
+***************
+*** 5279,5287 ****
+ return result;
+ }
+
+- static int skip_to_start(int c, colnr_T *colp);
+- static long find_match_text(colnr_T startcol, int regstart, char_u *match_text);
+-
+ /*
+ * Estimate the chance of a match with "state" failing.
+ * empty match: 0
+--- 5230,5235 ----
+***************
+*** 5570,5575 ****
+--- 5518,5524 ----
+ nfa_list_T *thislist;
+ nfa_list_T *nextlist;
+ int *listids = NULL;
++ int listids_len = 0;
+ nfa_state_T *add_state;
+ int add_here;
+ int add_count;
+***************
+*** 5898,5904 ****
+ * follows.
+ */
+ result = recursive_regmatch(t->state, NULL, prog,
+! submatch, m, &listids);
+ if (result == NFA_TOO_EXPENSIVE)
+ {
+ nfa_match = result;
+--- 5847,5853 ----
+ * follows.
+ */
+ result = recursive_regmatch(t->state, NULL, prog,
+! submatch, m, &listids, &listids_len);
+ if (result == NFA_TOO_EXPENSIVE)
+ {
+ nfa_match = result;
+***************
+*** 6016,6022 ****
+
+ /* First try matching the pattern. */
+ result = recursive_regmatch(t->state, NULL, prog,
+! submatch, m, &listids);
+ if (result == NFA_TOO_EXPENSIVE)
+ {
+ nfa_match = result;
+--- 5965,5971 ----
+
+ /* First try matching the pattern. */
+ result = recursive_regmatch(t->state, NULL, prog,
+! submatch, m, &listids, &listids_len);
+ if (result == NFA_TOO_EXPENSIVE)
+ {
+ nfa_match = result;
+***************
+*** 6783,6789 ****
+ fprintf(log_fd, "\n");
+ #endif
+ result = recursive_regmatch(pim->state, pim,
+! prog, submatch, m, &listids);
+ pim->result = result ? NFA_PIM_MATCH : NFA_PIM_NOMATCH;
+ /* for \@! and \@<! it is a match when the result is
+ * FALSE */
+--- 6732,6738 ----
+ fprintf(log_fd, "\n");
+ #endif
+ result = recursive_regmatch(pim->state, pim,
+! prog, submatch, m, &listids, &listids_len);
+ pim->result = result ? NFA_PIM_MATCH : NFA_PIM_NOMATCH;
+ /* for \@! and \@<! it is a match when the result is
+ * FALSE */
+*** ../vim-8.1.0169/src/version.c Sun Jul 8 18:20:18 2018
+--- src/version.c Sun Jul 8 19:06:47 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 170,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+213. Your kids start referring to you as "that guy in front of the monitor."
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0171 b/data/vim/patches/8.1.0171
new file mode 100644
index 000000000..3ea192f73
--- /dev/null
+++ b/data/vim/patches/8.1.0171
@@ -0,0 +1,105 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0171
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0171
+Problem: Typing CTRL-W n in a terminal window causes ml_get error.
+Solution: When resizing the terminal outside of terminal_loop() make sure
+ the snapshot is complete.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+
+*** ../vim-8.1.0170/src/terminal.c Sun Jul 8 16:50:33 2018
+--- src/terminal.c Sun Jul 8 20:48:42 2018
+***************
+*** 3134,3146 ****
+
+ if (term->tl_rows != newrows || term->tl_cols != newcols)
+ {
+-
+-
+ term->tl_vterm_size_changed = TRUE;
+ vterm_set_size(vterm, newrows, newcols);
+ ch_log(term->tl_job->jv_channel, "Resizing terminal to %d lines",
+ newrows);
+ term_report_winsize(term, newrows, newcols);
+ }
+
+ /* The cursor may have been moved when resizing. */
+--- 3134,3149 ----
+
+ if (term->tl_rows != newrows || term->tl_cols != newcols)
+ {
+ term->tl_vterm_size_changed = TRUE;
+ vterm_set_size(vterm, newrows, newcols);
+ ch_log(term->tl_job->jv_channel, "Resizing terminal to %d lines",
+ newrows);
+ term_report_winsize(term, newrows, newcols);
++
++ // Updating the terminal size will cause the snapshot to be cleared.
++ // When not in terminal_loop() we need to restore it.
++ if (term != in_terminal_loop)
++ may_move_terminal_to_buffer(term, FALSE);
+ }
+
+ /* The cursor may have been moved when resizing. */
+*** ../vim-8.1.0170/src/testdir/test_terminal.vim Tue Jun 19 20:08:10 2018
+--- src/testdir/test_terminal.vim Sun Jul 8 20:46:08 2018
+***************
+*** 1525,1530 ****
+--- 1525,1556 ----
+ exe buf . 'bwipe!'
+ endfunc
+
++ " Resizing the terminal window caused an ml_get error.
++ " TODO: This does not reproduce the original problem.
++ func Test_terminal_resize()
++ set statusline=x
++ terminal
++ call assert_equal(2, winnr('$'))
++
++ " Fill the terminal with text.
++ if has('win32')
++ call feedkeys("dir\<CR>", 'xt')
++ else
++ call feedkeys("ls\<CR>", 'xt')
++ endif
++ " Go to Terminal-Normal mode for a moment.
++ call feedkeys("\<C-W>N", 'xt')
++ " Open a new window
++ call feedkeys("i\<C-W>n", 'xt')
++ call assert_equal(3, winnr('$'))
++ redraw
++
++ close
++ call assert_equal(2, winnr('$'))
++ call feedkeys("exit\<CR>", 'xt')
++ set statusline&
++ endfunc
++
+ " must be nearly the last, we can't go back from GUI to terminal
+ func Test_zz1_terminal_in_gui()
+ if !CanRunGui()
+*** ../vim-8.1.0170/src/version.c Sun Jul 8 19:07:16 2018
+--- src/version.c Sun Jul 8 20:46:58 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 171,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+215. Your mouse-clicking forearm rivals Popeye's.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0172 b/data/vim/patches/8.1.0172
new file mode 100644
index 000000000..e83559014
--- /dev/null
+++ b/data/vim/patches/8.1.0172
@@ -0,0 +1,54 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0172
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0172
+Problem: 'viminfofile' option does not behave like a file name.
+Solution: Add the P_EXPAND flag. (closes #3178)
+Files: src/option.c
+
+
+*** ../vim-8.1.0171/src/option.c Sun Jul 8 16:50:33 2018
+--- src/option.c Sun Jul 8 21:39:50 2018
+***************
+*** 2997,3003 ****
+ {(char_u *)0L, (char_u *)0L}
+ #endif
+ SCRIPTID_INIT},
+! {"viminfofile", "vif", P_STRING|P_ONECOMMA|P_NODUP|P_SECURE|P_VI_DEF,
+ #ifdef FEAT_VIMINFO
+ (char_u *)&p_viminfofile, PV_NONE,
+ {(char_u *)"", (char_u *)0L}
+--- 2997,3004 ----
+ {(char_u *)0L, (char_u *)0L}
+ #endif
+ SCRIPTID_INIT},
+! {"viminfofile", "vif", P_STRING|P_EXPAND|P_ONECOMMA|P_NODUP
+! |P_SECURE|P_VI_DEF,
+ #ifdef FEAT_VIMINFO
+ (char_u *)&p_viminfofile, PV_NONE,
+ {(char_u *)"", (char_u *)0L}
+*** ../vim-8.1.0171/src/version.c Sun Jul 8 20:49:03 2018
+--- src/version.c Sun Jul 8 21:44:15 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 172,
+ /**/
+
+--
+I noticed my daughter's Disney-net password on a sticky note:
+"MickeyMinnieGoofyPluto". I asked her why it was so long.
+"Because they say it has to have at least four characters."
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0173 b/data/vim/patches/8.1.0173
new file mode 100644
index 000000000..9712a07a3
--- /dev/null
+++ b/data/vim/patches/8.1.0173
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0173
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0173
+Problem: Compiler warning on MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/libvterm/src/state.c
+
+
+*** ../vim-8.1.0172/src/libvterm/src/state.c Tue Apr 24 18:21:11 2018
+--- src/libvterm/src/state.c Mon Jul 9 20:37:34 2018
+***************
+*** 268,274 ****
+ if(!npoints)
+ {
+ vterm_allocator_free(state->vt, codepoints);
+! return eaten;
+ }
+
+ if(state->gsingle_set && npoints)
+--- 268,274 ----
+ if(!npoints)
+ {
+ vterm_allocator_free(state->vt, codepoints);
+! return (int)eaten;
+ }
+
+ if(state->gsingle_set && npoints)
+*** ../vim-8.1.0172/src/version.c Sun Jul 8 21:46:52 2018
+--- src/version.c Mon Jul 9 20:38:11 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 173,
+ /**/
+
+--
+Don't be humble ... you're not that great.
+ -- Golda Meir
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0174 b/data/vim/patches/8.1.0174
new file mode 100644
index 000000000..73011d4b0
--- /dev/null
+++ b/data/vim/patches/8.1.0174
@@ -0,0 +1,130 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0174
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0174
+Problem: After paging up and down fold line is wrong.
+Solution: Correct the computation of w_topline and w_botline. (Hirohito
+ Higashi)
+Files: src/move.c, src/testdir/test_fold.vim
+
+
+*** ../vim-8.1.0173/src/move.c Sun Mar 4 20:06:26 2018
+--- src/move.c Tue Jul 10 14:50:55 2018
+***************
+*** 2457,2478 ****
+ beginline(BL_SOL | BL_FIX);
+ curwin->w_valid &= ~(VALID_WCOL|VALID_WROW|VALID_VIRTCOL);
+
+! /*
+! * Avoid the screen jumping up and down when 'scrolloff' is non-zero.
+! * But make sure we scroll at least one line (happens with mix of long
+! * wrapping lines and non-wrapping line).
+! */
+! if (retval == OK && dir == FORWARD && check_top_offset())
+ {
+! scroll_cursor_top(1, FALSE);
+! if (curwin->w_topline <= old_topline
+! && old_topline < curbuf->b_ml.ml_line_count)
+ {
+! curwin->w_topline = old_topline + 1;
+ #ifdef FEAT_FOLDING
+! (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
+ #endif
+ }
+ }
+
+ redraw_later(VALID);
+--- 2457,2483 ----
+ beginline(BL_SOL | BL_FIX);
+ curwin->w_valid &= ~(VALID_WCOL|VALID_WROW|VALID_VIRTCOL);
+
+! if (retval == OK && dir == FORWARD)
+ {
+! // Avoid the screen jumping up and down when 'scrolloff' is non-zero.
+! // But make sure we scroll at least one line (happens with mix of long
+! // wrapping lines and non-wrapping line).
+! if (check_top_offset())
+ {
+! scroll_cursor_top(1, FALSE);
+! if (curwin->w_topline <= old_topline
+! && old_topline < curbuf->b_ml.ml_line_count)
+! {
+! curwin->w_topline = old_topline + 1;
+ #ifdef FEAT_FOLDING
+! (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
+ #endif
++ }
+ }
++ #ifdef FEAT_FOLDING
++ else if (curwin->w_botline > curbuf->b_ml.ml_line_count)
++ (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
++ #endif
+ }
+
+ redraw_later(VALID);
+*** ../vim-8.1.0173/src/testdir/test_fold.vim Sun Nov 5 20:53:03 2017
+--- src/testdir/test_fold.vim Tue Jul 10 14:50:55 2018
+***************
+*** 1,5 ****
+--- 1,7 ----
+ " Test for folding
+
++ source view_util.vim
++
+ func PrepIndent(arg)
+ return [a:arg] + repeat(["\t".a:arg], 5)
+ endfu
+***************
+*** 648,650 ****
+--- 650,676 ----
+ endtry
+ call assert_match('E492:', a)
+ endfunc
++
++ func Test_fold_last_line_with_pagedown()
++ enew!
++ set fdm=manual
++
++ let expect = '+-- 11 lines: 9---'
++ let content = range(1,19)
++ call append(0, content)
++ normal dd9G
++ normal zfG
++ normal zt
++ call assert_equal('9', getline(foldclosed('.')))
++ call assert_equal('19', getline(foldclosedend('.')))
++ call assert_equal(expect, ScreenLines(1, len(expect))[0])
++ call feedkeys("\<C-F>", 'xt')
++ call assert_equal(expect, ScreenLines(1, len(expect))[0])
++ call feedkeys("\<C-F>", 'xt')
++ call assert_equal(expect, ScreenLines(1, len(expect))[0])
++ call feedkeys("\<C-B>\<C-F>\<C-F>", 'xt')
++ call assert_equal(expect, ScreenLines(1, len(expect))[0])
++
++ set fdm&
++ enew!
++ endfunc
+*** ../vim-8.1.0173/src/version.c Mon Jul 9 20:39:12 2018
+--- src/version.c Tue Jul 10 14:52:30 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 174,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+220. Your wife asks for sex and you tell her where to find you on IRC.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0175 b/data/vim/patches/8.1.0175
new file mode 100644
index 000000000..caabae101
--- /dev/null
+++ b/data/vim/patches/8.1.0175
@@ -0,0 +1,64 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0175
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0175
+Problem: Marks test fails in very wide window. (Vladimir Lomov)
+Solution: Extend the text to match 'columns'. (closes #3180, closes #3181)
+Files: src/testdir/test_marks.vim
+
+
+*** ../vim-8.1.0174/src/testdir/test_marks.vim Sun Jul 8 17:57:30 2018
+--- src/testdir/test_marks.vim Tue Jul 10 15:18:04 2018
+***************
+*** 126,140 ****
+ return
+ endif
+ new Xone
+! call setline(1, ['ááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááá'])
+ norm! ma
+
+ let a = split(execute('marks a'), "\n")
+ call assert_equal(2, len(a))
+! let expected = ' a 1 0 '
+! while strwidth(expected) < &columns - 1
+! let expected .= 'á'
+! endwhile
+ call assert_equal(expected, a[1])
+
+ bwipe!
+--- 126,137 ----
+ return
+ endif
+ new Xone
+! call setline(1, [repeat('á', &columns)])
+ norm! ma
+
+ let a = split(execute('marks a'), "\n")
+ call assert_equal(2, len(a))
+! let expected = ' a 1 0 ' . repeat('á', &columns - 16)
+ call assert_equal(expected, a[1])
+
+ bwipe!
+*** ../vim-8.1.0174/src/version.c Tue Jul 10 15:07:11 2018
+--- src/version.c Tue Jul 10 15:14:07 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 175,
+ /**/
+
+--
+Your fault: core dumped
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0176 b/data/vim/patches/8.1.0176
new file mode 100644
index 000000000..8530810f3
--- /dev/null
+++ b/data/vim/patches/8.1.0176
@@ -0,0 +1,52 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0176
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0176
+Problem: Overlapping string argument for strcpy(). (Coverity)
+Solution: Use STRMOVE() instead of STRCPY(). (Dominique Pelle, closes #3187)
+Files: src/term.c
+
+
+*** ../vim-8.1.0175/src/term.c Fri Jul 6 23:11:35 2018
+--- src/term.c Tue Jul 10 17:31:59 2018
+***************
+*** 1483,1489 ****
+ if (term_7to8bit(t))
+ {
+ *t = term_7to8bit(t);
+! STRCPY(t + 1, t + 2);
+ }
+ term_strings[p->bt_entry] = s;
+ set_term_option_alloced(&term_strings[p->bt_entry]);
+--- 1483,1489 ----
+ if (term_7to8bit(t))
+ {
+ *t = term_7to8bit(t);
+! STRMOVE(t + 1, t + 2);
+ }
+ term_strings[p->bt_entry] = s;
+ set_term_option_alloced(&term_strings[p->bt_entry]);
+*** ../vim-8.1.0175/src/version.c Tue Jul 10 15:22:28 2018
+--- src/version.c Tue Jul 10 17:32:50 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 176,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+223. You set up a web-cam as your home's security system.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0177 b/data/vim/patches/8.1.0177
new file mode 100644
index 000000000..7df24e759
--- /dev/null
+++ b/data/vim/patches/8.1.0177
@@ -0,0 +1,146 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0177
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0177
+Problem: Defining function in sandbox is inconsistent, cannot use :function
+ but can define a lambda.
+Solution: Allow defining a function in the sandbox, but also use the sandbox
+ when executing it. (closes #3182)
+Files: src/userfunc.c, src/ex_cmds.h
+
+
+*** ../vim-8.1.0176/src/userfunc.c Sun Jul 8 17:18:58 2018
+--- src/userfunc.c Tue Jul 10 19:30:35 2018
+***************
+*** 14,26 ****
+ #include "vim.h"
+
+ #if defined(FEAT_EVAL) || defined(PROTO)
+! /* function flags */
+! #define FC_ABORT 0x01 /* abort function on error */
+! #define FC_RANGE 0x02 /* function accepts range */
+! #define FC_DICT 0x04 /* Dict function, uses "self" */
+! #define FC_CLOSURE 0x08 /* closure, uses outer scope variables */
+! #define FC_DELETED 0x10 /* :delfunction used while uf_refcount > 0 */
+! #define FC_REMOVED 0x20 /* function redefined while uf_refcount > 0 */
+
+ /* From user function to hashitem and back. */
+ #define UF2HIKEY(fp) ((fp)->uf_name)
+--- 14,27 ----
+ #include "vim.h"
+
+ #if defined(FEAT_EVAL) || defined(PROTO)
+! // flags used in uf_flags
+! #define FC_ABORT 0x01 // abort function on error
+! #define FC_RANGE 0x02 // function accepts range
+! #define FC_DICT 0x04 // Dict function, uses "self"
+! #define FC_CLOSURE 0x08 // closure, uses outer scope variables
+! #define FC_DELETED 0x10 // :delfunction used while uf_refcount > 0
+! #define FC_REMOVED 0x20 // function redefined while uf_refcount > 0
+! #define FC_SANDBOX 0x40 // function defined in the sandbox
+
+ /* From user function to hashitem and back. */
+ #define UF2HIKEY(fp) ((fp)->uf_name)
+***************
+*** 296,301 ****
+--- 297,304 ----
+ if (prof_def_func())
+ func_do_profile(fp);
+ #endif
++ if (sandbox)
++ flags |= FC_SANDBOX;
+ fp->uf_varargs = TRUE;
+ fp->uf_flags = flags;
+ fp->uf_calls = 0;
+***************
+*** 688,693 ****
+--- 691,697 ----
+ char_u *save_sourcing_name;
+ linenr_T save_sourcing_lnum;
+ scid_T save_current_SID;
++ int using_sandbox = FALSE;
+ funccall_T *fc;
+ int save_did_emsg;
+ static int depth = 0;
+***************
+*** 854,859 ****
+--- 858,870 ----
+ save_sourcing_name = sourcing_name;
+ save_sourcing_lnum = sourcing_lnum;
+ sourcing_lnum = 1;
++
++ if (fp->uf_flags & FC_SANDBOX)
++ {
++ using_sandbox = TRUE;
++ ++sandbox;
++ }
++
+ /* need space for function name + ("function " + 3) or "[number]" */
+ len = (save_sourcing_name == NULL ? 0 : STRLEN(save_sourcing_name))
+ + STRLEN(fp->uf_name) + 20;
+***************
+*** 1020,1025 ****
+--- 1031,1038 ----
+ if (do_profiling == PROF_YES)
+ script_prof_restore(&wait_start);
+ #endif
++ if (using_sandbox)
++ --sandbox;
+
+ if (p_verbose >= 12 && sourcing_name != NULL)
+ {
+***************
+*** 2429,2434 ****
+--- 2442,2449 ----
+ func_do_profile(fp);
+ #endif
+ fp->uf_varargs = varargs;
++ if (sandbox)
++ flags |= FC_SANDBOX;
+ fp->uf_flags = flags;
+ fp->uf_calls = 0;
+ fp->uf_script_ID = current_SID;
+*** ../vim-8.1.0176/src/ex_cmds.h Tue Apr 3 22:07:59 2018
+--- src/ex_cmds.h Tue Jul 10 19:17:05 2018
+***************
+*** 584,590 ****
+ EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+ ADDR_LINES),
+ EX(CMD_function, "function", ex_function,
+! EXTRA|BANG|CMDWIN,
+ ADDR_LINES),
+ EX(CMD_global, "global", ex_global,
+ RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN,
+--- 584,590 ----
+ EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+ ADDR_LINES),
+ EX(CMD_function, "function", ex_function,
+! EXTRA|BANG|SBOXOK|CMDWIN,
+ ADDR_LINES),
+ EX(CMD_global, "global", ex_global,
+ RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN,
+*** ../vim-8.1.0176/src/version.c Tue Jul 10 17:33:41 2018
+--- src/version.c Tue Jul 10 19:38:37 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 177,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+224. You set up your own Web page. You set up a Web page for each
+ of your kids... and your pets.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0178 b/data/vim/patches/8.1.0178
new file mode 100644
index 000000000..fbba187e4
--- /dev/null
+++ b/data/vim/patches/8.1.0178
@@ -0,0 +1,55 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0178
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+
+Patch 8.1.0178
+Problem: Warning for passing pointer to non-pointer argument.
+Solution: Use zero instead of NULL.
+Files: src/if_ole.cpp
+
+
+*** ../vim-8.1.0177/src/if_ole.cpp Mon Aug 29 22:42:20 2016
+--- src/if_ole.cpp Wed Jul 11 22:55:56 2018
+***************
+*** 759,765 ****
+ hr = RegisterActiveObject(
+ app,
+ MYCLSID,
+! NULL,
+ &app_id);
+
+ if (FAILED(hr))
+--- 759,765 ----
+ hr = RegisterActiveObject(
+ app,
+ MYCLSID,
+! 0,
+ &app_id);
+
+ if (FAILED(hr))
+*** ../vim-8.1.0177/src/version.c Tue Jul 10 19:39:14 2018
+--- src/version.c Wed Jul 11 22:56:50 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 178,
+ /**/
+
+--
+The term "free software" is defined by Richard M. Stallman as
+being software that isn't necessarily for free. Confusing?
+Let's call it "Stallman software" then!
+ -- Bram Moolenaar
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0179 b/data/vim/patches/8.1.0179
new file mode 100644
index 000000000..e7e4aac00
--- /dev/null
+++ b/data/vim/patches/8.1.0179
@@ -0,0 +1,58 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0179
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0179
+Problem: Redundant condition for boundary check.
+Solution: Remove the condition. (Dominique Pelle). Change FALSE to FAIL.
+Files: src/undo.c
+
+
+*** ../vim-8.1.0178/src/undo.c 2018-07-08 16:50:33.111216814 +0200
+--- src/undo.c 2018-07-13 16:27:37.721354663 +0200
+***************
+*** 266,275 ****
+ if (undo_off)
+ return OK;
+
+! if (top > curbuf->b_ml.ml_line_count
+! || top >= bot
+! || bot > curbuf->b_ml.ml_line_count + 1)
+! return FALSE; /* rely on caller to do error messages */
+
+ if (top + 2 == bot)
+ u_saveline((linenr_T)(top + 1));
+--- 266,273 ----
+ if (undo_off)
+ return OK;
+
+! if (top >= bot || bot > curbuf->b_ml.ml_line_count + 1)
+! return FAIL; // rely on caller to give an error message
+
+ if (top + 2 == bot)
+ u_saveline((linenr_T)(top + 1));
+*** ../vim-8.1.0178/src/version.c 2018-07-11 22:57:47.947564638 +0200
+--- src/version.c 2018-07-13 16:29:28.492772093 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 179,
+ /**/
+
+--
+"The amigos also appear to be guilty of not citing the work of others who had
+gone before them. Even worse, they have a chapter about modeling time and
+space without making a single reference to Star Trek!"
+ (Scott Ambler, reviewing the UML User Guide)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0180 b/data/vim/patches/8.1.0180
new file mode 100644
index 000000000..b5494c45b
--- /dev/null
+++ b/data/vim/patches/8.1.0180
@@ -0,0 +1,160 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0180
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0180
+Problem: Static analysis errors in Lua interface. (Coverity)
+Solution: Check for NULL pointers.
+Files: src/if_lua.c
+
+
+*** ../vim-8.1.0179/src/if_lua.c Sat Jul 7 23:07:35 2018
+--- src/if_lua.c Fri Jul 13 22:05:37 2018
+***************
+*** 958,964 ****
+ typval_T v;
+ if (d->dv_lock)
+ luaL_error(L, "dict is locked");
+! if (key != NULL && *key == NUL)
+ luaL_error(L, "empty key");
+ if (!lua_isnil(L, 3)) { /* read value? */
+ luaV_checktypval(L, 3, &v, "setting dict item");
+--- 958,966 ----
+ typval_T v;
+ if (d->dv_lock)
+ luaL_error(L, "dict is locked");
+! if (key == NULL)
+! return 0;
+! if (*key == NUL)
+ luaL_error(L, "empty key");
+ if (!lua_isnil(L, 3)) { /* read value? */
+ luaV_checktypval(L, 3, &v, "setting dict item");
+***************
+*** 968,980 ****
+ di = dict_find(d, key, -1);
+ if (di == NULL) /* non-existing key? */
+ {
+! if (lua_isnil(L, 3)) return 0;
+ di = dictitem_alloc(key);
+! if (di == NULL) return 0;
+ if (dict_add(d, di) == FAIL)
+ {
+! vim_free(di);
+! return 0;
+ }
+ }
+ else
+--- 970,984 ----
+ di = dict_find(d, key, -1);
+ if (di == NULL) /* non-existing key? */
+ {
+! if (lua_isnil(L, 3))
+! return 0;
+ di = dictitem_alloc(key);
+! if (di == NULL)
+! return 0;
+ if (dict_add(d, di) == FAIL)
+ {
+! vim_free(di);
+! return 0;
+ }
+ }
+ else
+***************
+*** 1066,1080 ****
+
+ f->args.vval.v_list = list_alloc();
+ rettv.v_type = VAR_UNKNOWN; /* as in clear_tv */
+! for (i = 0; i < n; i++) {
+! luaV_checktypval(L, i + 2, &v, "calling funcref");
+! list_append_tv(f->args.vval.v_list, &v);
+! }
+! status = func_call(f->tv.vval.v_string, &f->args, NULL, f->self, &rettv);
+! if (status == OK)
+! luaV_pushtypval(L, &rettv);
+! clear_tv(&f->args);
+! clear_tv(&rettv);
+ if (status != OK)
+ luaL_error(L, "cannot call funcref");
+ return 1;
+--- 1070,1090 ----
+
+ f->args.vval.v_list = list_alloc();
+ rettv.v_type = VAR_UNKNOWN; /* as in clear_tv */
+! if (f->args.vval.v_list == NULL)
+! status = FAIL;
+! else
+! {
+! for (i = 0; i < n; i++) {
+! luaV_checktypval(L, i + 2, &v, "calling funcref");
+! list_append_tv(f->args.vval.v_list, &v);
+! }
+! status = func_call(f->tv.vval.v_string, &f->args,
+! NULL, f->self, &rettv);
+! if (status == OK)
+! luaV_pushtypval(L, &rettv);
+! clear_tv(&f->args);
+! clear_tv(&rettv);
+! }
+ if (status != OK)
+ luaL_error(L, "cannot call funcref");
+ return 1;
+***************
+*** 1560,1572 ****
+ char_u *key;
+ dictitem_T *di;
+ typval_T v;
+ lua_pushvalue(L, -2); /* dup key in case it's a number */
+ key = (char_u *) lua_tostring(L, -1);
+! if (key != NULL && *key == NUL)
+ luaL_error(L, "table has empty key");
+ luaV_checktypval(L, -2, &v, "vim.dict"); /* value */
+ di = dictitem_alloc(key);
+! if (di == NULL || dict_add(d, di) == FAIL) {
+ vim_free(di);
+ lua_pushnil(L);
+ return 1;
+--- 1570,1589 ----
+ char_u *key;
+ dictitem_T *di;
+ typval_T v;
++
+ lua_pushvalue(L, -2); /* dup key in case it's a number */
+ key = (char_u *) lua_tostring(L, -1);
+! if (key == NULL)
+! {
+! lua_pushnil(L);
+! return 1;
+! }
+! if (*key == NUL)
+ luaL_error(L, "table has empty key");
+ luaV_checktypval(L, -2, &v, "vim.dict"); /* value */
+ di = dictitem_alloc(key);
+! if (di == NULL || dict_add(d, di) == FAIL)
+! {
+ vim_free(di);
+ lua_pushnil(L);
+ return 1;
+*** ../vim-8.1.0179/src/version.c Fri Jul 13 16:31:11 2018
+--- src/version.c Fri Jul 13 22:05:56 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 180,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+240. You think Webster's Dictionary is a directory of WEB sites.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0181 b/data/vim/patches/8.1.0181
new file mode 100644
index 000000000..5235d20c3
--- /dev/null
+++ b/data/vim/patches/8.1.0181
@@ -0,0 +1,66 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0181
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0181
+Problem: Memory leak with trailing characters in skip expression.
+Solution: Free the return value.
+Files: src/eval.c, src/testdir/test_search.vim
+
+
+*** ../vim-8.1.0180/src/eval.c Tue Jun 12 22:05:10 2018
+--- src/eval.c Sat Jul 14 17:17:35 2018
+***************
+*** 729,734 ****
+--- 729,735 ----
+ return FAIL;
+ if (*s != NUL) /* check for trailing chars after expr */
+ {
++ clear_tv(rettv);
+ EMSG2(_(e_invexpr2), s);
+ return FAIL;
+ }
+*** ../vim-8.1.0180/src/testdir/test_search.vim Sun Jun 24 19:01:55 2018
+--- src/testdir/test_search.vim Sat Jul 14 17:14:23 2018
+***************
+*** 324,329 ****
+--- 324,339 ----
+ bw!
+ endfunc
+
++ func Test_searchpair_leak()
++ new
++ call setline(1, 'if one else another endif')
++
++ " The error in the skip expression caused memory to leak.
++ call assert_fails("call searchpair('\\<if\\>', '\\<else\\>', '\\<endif\\>', '', '\"foo\" 2')", 'E15:')
++
++ bwipe!
++ endfunc
++
+ func Test_searchc()
+ " These commands used to cause memory overflow in searchc().
+ new
+*** ../vim-8.1.0180/src/version.c Fri Jul 13 22:08:19 2018
+--- src/version.c Sat Jul 14 17:02:20 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 181,
+ /**/
+
+--
+"Marriage is when a man and woman become as one; the trouble starts
+when they try to decide which one"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0182 b/data/vim/patches/8.1.0182
new file mode 100644
index 000000000..bc93b8d96
--- /dev/null
+++ b/data/vim/patches/8.1.0182
@@ -0,0 +1,425 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0182
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0182
+Problem: Unicode standard was updated.
+Solution: Include the changes. (Christian Brabandt)
+Files: src/mbyte.c
+
+
+*** ../vim-8.1.0181/src/mbyte.c Wed Jun 13 21:27:20 2018
+--- src/mbyte.c Sat Jul 14 19:27:37 2018
+***************
+*** 1462,1468 ****
+ {0x3000, 0x303e},
+ {0x3041, 0x3096},
+ {0x3099, 0x30ff},
+! {0x3105, 0x312e},
+ {0x3131, 0x318e},
+ {0x3190, 0x31ba},
+ {0x31c0, 0x31e3},
+--- 1462,1468 ----
+ {0x3000, 0x303e},
+ {0x3041, 0x3096},
+ {0x3099, 0x30ff},
+! {0x3105, 0x312f},
+ {0x3131, 0x318e},
+ {0x3190, 0x31ba},
+ {0x31c0, 0x31e3},
+***************
+*** 1482,1488 ****
+ {0xff01, 0xff60},
+ {0xffe0, 0xffe6},
+ {0x16fe0, 0x16fe1},
+! {0x17000, 0x187ec},
+ {0x18800, 0x18af2},
+ {0x1b000, 0x1b11e},
+ {0x1b170, 0x1b2fb},
+--- 1482,1488 ----
+ {0xff01, 0xff60},
+ {0xffe0, 0xffe6},
+ {0x16fe0, 0x16fe1},
+! {0x17000, 0x187f1},
+ {0x18800, 0x18af2},
+ {0x1b000, 0x1b11e},
+ {0x1b170, 0x1b2fb},
+***************
+*** 1517,1529 ****
+ {0x1f6cc, 0x1f6cc},
+ {0x1f6d0, 0x1f6d2},
+ {0x1f6eb, 0x1f6ec},
+! {0x1f6f4, 0x1f6f8},
+ {0x1f910, 0x1f93e},
+! {0x1f940, 0x1f94c},
+! {0x1f950, 0x1f96b},
+! {0x1f980, 0x1f997},
+! {0x1f9c0, 0x1f9c0},
+! {0x1f9d0, 0x1f9e6},
+ {0x20000, 0x2fffd},
+ {0x30000, 0x3fffd}
+ };
+--- 1517,1531 ----
+ {0x1f6cc, 0x1f6cc},
+ {0x1f6d0, 0x1f6d2},
+ {0x1f6eb, 0x1f6ec},
+! {0x1f6f4, 0x1f6f9},
+ {0x1f910, 0x1f93e},
+! {0x1f940, 0x1f970},
+! {0x1f973, 0x1f976},
+! {0x1f97a, 0x1f97a},
+! {0x1f97c, 0x1f9a2},
+! {0x1f9b0, 0x1f9b9},
+! {0x1f9c0, 0x1f9c2},
+! {0x1f9d0, 0x1f9ff},
+ {0x20000, 0x2fffd},
+ {0x30000, 0x3fffd}
+ };
+***************
+*** 2348,2359 ****
+ {0x0730, 0x074a},
+ {0x07a6, 0x07b0},
+ {0x07eb, 0x07f3},
+ {0x0816, 0x0819},
+ {0x081b, 0x0823},
+ {0x0825, 0x0827},
+ {0x0829, 0x082d},
+ {0x0859, 0x085b},
+! {0x08d4, 0x08e1},
+ {0x08e3, 0x0903},
+ {0x093a, 0x093c},
+ {0x093e, 0x094f},
+--- 2350,2362 ----
+ {0x0730, 0x074a},
+ {0x07a6, 0x07b0},
+ {0x07eb, 0x07f3},
++ {0x07fd, 0x07fd},
+ {0x0816, 0x0819},
+ {0x081b, 0x0823},
+ {0x0825, 0x0827},
+ {0x0829, 0x082d},
+ {0x0859, 0x085b},
+! {0x08d3, 0x08e1},
+ {0x08e3, 0x0903},
+ {0x093a, 0x093c},
+ {0x093e, 0x094f},
+***************
+*** 2366,2371 ****
+--- 2369,2375 ----
+ {0x09cb, 0x09cd},
+ {0x09d7, 0x09d7},
+ {0x09e2, 0x09e3},
++ {0x09fe, 0x09fe},
+ {0x0a01, 0x0a03},
+ {0x0a3c, 0x0a3c},
+ {0x0a3e, 0x0a42},
+***************
+*** 2393,2399 ****
+ {0x0bc6, 0x0bc8},
+ {0x0bca, 0x0bcd},
+ {0x0bd7, 0x0bd7},
+! {0x0c00, 0x0c03},
+ {0x0c3e, 0x0c44},
+ {0x0c46, 0x0c48},
+ {0x0c4a, 0x0c4d},
+--- 2397,2403 ----
+ {0x0bc6, 0x0bc8},
+ {0x0bca, 0x0bcd},
+ {0x0bd7, 0x0bd7},
+! {0x0c00, 0x0c04},
+ {0x0c3e, 0x0c44},
+ {0x0c46, 0x0c48},
+ {0x0c4a, 0x0c4d},
+***************
+*** 2493,2498 ****
+--- 2497,2503 ----
+ {0xa880, 0xa881},
+ {0xa8b4, 0xa8c5},
+ {0xa8e0, 0xa8f1},
++ {0xa8ff, 0xa8ff},
+ {0xa926, 0xa92d},
+ {0xa947, 0xa953},
+ {0xa980, 0xa983},
+***************
+*** 2523,2543 ****
+ {0x10a38, 0x10a3a},
+ {0x10a3f, 0x10a3f},
+ {0x10ae5, 0x10ae6},
+ {0x11000, 0x11002},
+ {0x11038, 0x11046},
+ {0x1107f, 0x11082},
+ {0x110b0, 0x110ba},
+ {0x11100, 0x11102},
+ {0x11127, 0x11134},
+ {0x11173, 0x11173},
+ {0x11180, 0x11182},
+ {0x111b3, 0x111c0},
+! {0x111ca, 0x111cc},
+ {0x1122c, 0x11237},
+ {0x1123e, 0x1123e},
+ {0x112df, 0x112ea},
+ {0x11300, 0x11303},
+! {0x1133c, 0x1133c},
+ {0x1133e, 0x11344},
+ {0x11347, 0x11348},
+ {0x1134b, 0x1134d},
+--- 2528,2551 ----
+ {0x10a38, 0x10a3a},
+ {0x10a3f, 0x10a3f},
+ {0x10ae5, 0x10ae6},
++ {0x10d24, 0x10d27},
++ {0x10f46, 0x10f50},
+ {0x11000, 0x11002},
+ {0x11038, 0x11046},
+ {0x1107f, 0x11082},
+ {0x110b0, 0x110ba},
+ {0x11100, 0x11102},
+ {0x11127, 0x11134},
++ {0x11145, 0x11146},
+ {0x11173, 0x11173},
+ {0x11180, 0x11182},
+ {0x111b3, 0x111c0},
+! {0x111c9, 0x111cc},
+ {0x1122c, 0x11237},
+ {0x1123e, 0x1123e},
+ {0x112df, 0x112ea},
+ {0x11300, 0x11303},
+! {0x1133b, 0x1133c},
+ {0x1133e, 0x11344},
+ {0x11347, 0x11348},
+ {0x1134b, 0x1134d},
+***************
+*** 2546,2551 ****
+--- 2554,2560 ----
+ {0x11366, 0x1136c},
+ {0x11370, 0x11374},
+ {0x11435, 0x11446},
++ {0x1145e, 0x1145e},
+ {0x114b0, 0x114c3},
+ {0x115af, 0x115b5},
+ {0x115b8, 0x115c0},
+***************
+*** 2553,2558 ****
+--- 2562,2568 ----
+ {0x11630, 0x11640},
+ {0x116ab, 0x116b7},
+ {0x1171d, 0x1172b},
++ {0x1182c, 0x1183a},
+ {0x11a01, 0x11a0a},
+ {0x11a33, 0x11a39},
+ {0x11a3b, 0x11a3e},
+***************
+*** 2568,2573 ****
+--- 2578,2587 ----
+ {0x11d3c, 0x11d3d},
+ {0x11d3f, 0x11d45},
+ {0x11d47, 0x11d47},
++ {0x11d8a, 0x11d8e},
++ {0x11d90, 0x11d91},
++ {0x11d93, 0x11d97},
++ {0x11ef3, 0x11ef6},
+ {0x16af0, 0x16af4},
+ {0x16b30, 0x16b36},
+ {0x16f51, 0x16f7e},
+***************
+*** 2659,2670 ****
+ {0x2640, 0x2640},
+ {0x2642, 0x2642},
+ {0x2648, 0x2653},
+! {0x2660, 0x2660},
+ {0x2663, 0x2663},
+ {0x2665, 0x2666},
+ {0x2668, 0x2668},
+ {0x267b, 0x267b},
+! {0x267f, 0x267f},
+ {0x2692, 0x2697},
+ {0x2699, 0x2699},
+ {0x269b, 0x269c},
+--- 2673,2684 ----
+ {0x2640, 0x2640},
+ {0x2642, 0x2642},
+ {0x2648, 0x2653},
+! {0x265f, 0x2660},
+ {0x2663, 0x2663},
+ {0x2665, 0x2666},
+ {0x2668, 0x2668},
+ {0x267b, 0x267b},
+! {0x267e, 0x267f},
+ {0x2692, 0x2697},
+ {0x2699, 0x2699},
+ {0x269b, 0x269c},
+***************
+*** 2759,2773 ****
+ {0x1f6e9, 0x1f6e9},
+ {0x1f6eb, 0x1f6ec},
+ {0x1f6f0, 0x1f6f0},
+! {0x1f6f3, 0x1f6f8},
+ {0x1f910, 0x1f93a},
+ {0x1f93c, 0x1f93e},
+ {0x1f940, 0x1f945},
+! {0x1f947, 0x1f94c},
+! {0x1f950, 0x1f96b},
+! {0x1f980, 0x1f997},
+! {0x1f9c0, 0x1f9c0},
+! {0x1f9d0, 0x1f9e6}
+ };
+
+ /*
+--- 2773,2789 ----
+ {0x1f6e9, 0x1f6e9},
+ {0x1f6eb, 0x1f6ec},
+ {0x1f6f0, 0x1f6f0},
+! {0x1f6f3, 0x1f6f9},
+ {0x1f910, 0x1f93a},
+ {0x1f93c, 0x1f93e},
+ {0x1f940, 0x1f945},
+! {0x1f947, 0x1f970},
+! {0x1f973, 0x1f976},
+! {0x1f97a, 0x1f97a},
+! {0x1f97c, 0x1f9a2},
+! {0x1f9b0, 0x1f9b9},
+! {0x1f9c0, 0x1f9c2},
+! {0x1f9d0, 0x1f9ff}
+ };
+
+ /*
+***************
+*** 3034,3039 ****
+--- 3050,3057 ----
+ {0x1c86,0x1c86,-1,-6204},
+ {0x1c87,0x1c87,-1,-6180},
+ {0x1c88,0x1c88,-1,35267},
++ {0x1c90,0x1cba,1,-3008},
++ {0x1cbd,0x1cbf,1,-3008},
+ {0x1e00,0x1e94,2,1},
+ {0x1e9b,0x1e9b,-1,-58},
+ {0x1e9e,0x1e9e,-1,-7615},
+***************
+*** 3104,3116 ****
+ {0xa7b1,0xa7b1,-1,-42282},
+ {0xa7b2,0xa7b2,-1,-42261},
+ {0xa7b3,0xa7b3,-1,928},
+! {0xa7b4,0xa7b6,2,1},
+ {0xab70,0xabbf,1,-38864},
+ {0xff21,0xff3a,1,32},
+ {0x10400,0x10427,1,40},
+ {0x104b0,0x104d3,1,40},
+ {0x10c80,0x10cb2,1,64},
+ {0x118a0,0x118bf,1,32},
+ {0x1e900,0x1e921,1,34}
+ };
+
+--- 3122,3135 ----
+ {0xa7b1,0xa7b1,-1,-42282},
+ {0xa7b2,0xa7b2,-1,-42261},
+ {0xa7b3,0xa7b3,-1,928},
+! {0xa7b4,0xa7b8,2,1},
+ {0xab70,0xabbf,1,-38864},
+ {0xff21,0xff3a,1,32},
+ {0x10400,0x10427,1,40},
+ {0x104b0,0x104d3,1,40},
+ {0x10c80,0x10cb2,1,64},
+ {0x118a0,0x118bf,1,32},
++ {0x16e40,0x16e5f,1,32},
+ {0x1e900,0x1e921,1,34}
+ };
+
+***************
+*** 3256,3261 ****
+--- 3275,3282 ----
+ {0x10c7,0x10cd,6,7264},
+ {0x13a0,0x13ef,1,38864},
+ {0x13f0,0x13f5,1,8},
++ {0x1c90,0x1cba,1,-3008},
++ {0x1cbd,0x1cbf,1,-3008},
+ {0x1e00,0x1e94,2,1},
+ {0x1e9e,0x1e9e,-1,-7615},
+ {0x1ea0,0x1efe,2,1},
+***************
+*** 3324,3335 ****
+ {0xa7b1,0xa7b1,-1,-42282},
+ {0xa7b2,0xa7b2,-1,-42261},
+ {0xa7b3,0xa7b3,-1,928},
+! {0xa7b4,0xa7b6,2,1},
+ {0xff21,0xff3a,1,32},
+ {0x10400,0x10427,1,40},
+ {0x104b0,0x104d3,1,40},
+ {0x10c80,0x10cb2,1,64},
+ {0x118a0,0x118bf,1,32},
+ {0x1e900,0x1e921,1,34}
+ };
+
+--- 3345,3357 ----
+ {0xa7b1,0xa7b1,-1,-42282},
+ {0xa7b2,0xa7b2,-1,-42261},
+ {0xa7b3,0xa7b3,-1,928},
+! {0xa7b4,0xa7b8,2,1},
+ {0xff21,0xff3a,1,32},
+ {0x10400,0x10427,1,40},
+ {0x104b0,0x104d3,1,40},
+ {0x10c80,0x10cb2,1,64},
+ {0x118a0,0x118bf,1,32},
++ {0x16e40,0x16e5f,1,32},
+ {0x1e900,0x1e921,1,34}
+ };
+
+***************
+*** 3443,3448 ****
+--- 3465,3472 ----
+ {0x4cf,0x4cf,-1,-15},
+ {0x4d1,0x52f,2,-1},
+ {0x561,0x586,1,-48},
++ {0x10d0,0x10fa,1,3008},
++ {0x10fd,0x10ff,1,3008},
+ {0x13f8,0x13fd,1,-8},
+ {0x1c80,0x1c80,-1,-6254},
+ {0x1c81,0x1c81,-1,-6253},
+***************
+*** 3505,3511 ****
+ {0xa78c,0xa791,5,-1},
+ {0xa793,0xa797,4,-1},
+ {0xa799,0xa7a9,2,-1},
+! {0xa7b5,0xa7b7,2,-1},
+ {0xab53,0xab53,-1,-928},
+ {0xab70,0xabbf,1,-38864},
+ {0xff41,0xff5a,1,-32},
+--- 3529,3535 ----
+ {0xa78c,0xa791,5,-1},
+ {0xa793,0xa797,4,-1},
+ {0xa799,0xa7a9,2,-1},
+! {0xa7b5,0xa7b9,2,-1},
+ {0xab53,0xab53,-1,-928},
+ {0xab70,0xabbf,1,-38864},
+ {0xff41,0xff5a,1,-32},
+***************
+*** 3513,3518 ****
+--- 3537,3543 ----
+ {0x104d8,0x104fb,1,-40},
+ {0x10cc0,0x10cf2,1,-64},
+ {0x118c0,0x118df,1,-32},
++ {0x16e60,0x16e7f,1,-32},
+ {0x1e922,0x1e943,1,-34}
+ };
+
+*** ../vim-8.1.0181/src/version.c Sat Jul 14 17:24:57 2018
+--- src/version.c Sat Jul 14 19:30:14 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 182,
+ /**/
+
+--
+If you're sending someone Styrofoam, what do you pack it in?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0183 b/data/vim/patches/8.1.0183
new file mode 100644
index 000000000..f21beffc5
--- /dev/null
+++ b/data/vim/patches/8.1.0183
@@ -0,0 +1,130 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0183
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0183
+Problem: Lua API changed, breaking the build.
+Solution: Adjust prototype of lua_rawgeti(). (Ken Takata,
+ closes #3157, closes #3144)
+Files: src/if_lua.c
+
+
+*** ../vim-8.1.0182/src/if_lua.c Fri Jul 13 22:08:19 2018
+--- src/if_lua.c Sat Jul 14 20:48:49 2018
+***************
+*** 253,266 ****
+--- 253,275 ----
+ void (*dll_lua_pushboolean) (lua_State *L, int b);
+ void (*dll_lua_pushlightuserdata) (lua_State *L, void *p);
+ void (*dll_lua_getfield) (lua_State *L, int idx, const char *k);
++ #if LUA_VERSION_NUM <= 502
+ void (*dll_lua_rawget) (lua_State *L, int idx);
+ void (*dll_lua_rawgeti) (lua_State *L, int idx, int n);
++ #else
++ int (*dll_lua_rawget) (lua_State *L, int idx);
++ int (*dll_lua_rawgeti) (lua_State *L, int idx, lua_Integer n);
++ #endif
+ void (*dll_lua_createtable) (lua_State *L, int narr, int nrec);
+ void *(*dll_lua_newuserdata) (lua_State *L, size_t sz);
+ int (*dll_lua_getmetatable) (lua_State *L, int objindex);
+ void (*dll_lua_setfield) (lua_State *L, int idx, const char *k);
+ void (*dll_lua_rawset) (lua_State *L, int idx);
++ #if LUA_VERSION_NUM <= 502
+ void (*dll_lua_rawseti) (lua_State *L, int idx, int n);
++ #else
++ void (*dll_lua_rawseti) (lua_State *L, int idx, lua_Integer n);
++ #endif
+ int (*dll_lua_setmetatable) (lua_State *L, int objindex);
+ int (*dll_lua_next) (lua_State *L, int idx);
+ /* libs */
+***************
+*** 962,968 ****
+ return 0;
+ if (*key == NUL)
+ luaL_error(L, "empty key");
+! if (!lua_isnil(L, 3)) { /* read value? */
+ luaV_checktypval(L, 3, &v, "setting dict item");
+ if (d->dv_scope == VAR_DEF_SCOPE && v.v_type == VAR_FUNC)
+ luaL_error(L, "cannot assign funcref to builtin scope");
+--- 971,978 ----
+ return 0;
+ if (*key == NUL)
+ luaL_error(L, "empty key");
+! if (!lua_isnil(L, 3)) /* read value? */
+! {
+ luaV_checktypval(L, 3, &v, "setting dict item");
+ if (d->dv_scope == VAR_DEF_SCOPE && v.v_type == VAR_FUNC)
+ luaL_error(L, "cannot assign funcref to builtin scope");
+***************
+*** 1074,1080 ****
+ status = FAIL;
+ else
+ {
+! for (i = 0; i < n; i++) {
+ luaV_checktypval(L, i + 2, &v, "calling funcref");
+ list_append_tv(f->args.vval.v_list, &v);
+ }
+--- 1084,1091 ----
+ status = FAIL;
+ else
+ {
+! for (i = 0; i < n; i++)
+! {
+ luaV_checktypval(L, i + 2, &v, "calling funcref");
+ list_append_tv(f->args.vval.v_list, &v);
+ }
+***************
+*** 1531,1543 ****
+ else
+ {
+ luaV_newlist(L, l);
+! if (initarg) { /* traverse table to init dict */
+ int notnil, i = 0;
+ typval_T v;
+! do {
+ lua_rawgeti(L, 1, ++i);
+ notnil = !lua_isnil(L, -1);
+! if (notnil) {
+ luaV_checktypval(L, -1, &v, "vim.list");
+ list_append_tv(l, &v);
+ }
+--- 1542,1557 ----
+ else
+ {
+ luaV_newlist(L, l);
+! if (initarg) /* traverse table to init list */
+! {
+ int notnil, i = 0;
+ typval_T v;
+! do
+! {
+ lua_rawgeti(L, 1, ++i);
+ notnil = !lua_isnil(L, -1);
+! if (notnil)
+! {
+ luaV_checktypval(L, -1, &v, "vim.list");
+ list_append_tv(l, &v);
+ }
+*** ../vim-8.1.0182/src/version.c Sat Jul 14 19:30:32 2018
+--- src/version.c Sat Jul 14 20:49:07 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 183,
+ /**/
+
+--
+Hear about the guy who played a blank tape at full blast?
+The mime next door went nuts.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0184 b/data/vim/patches/8.1.0184
new file mode 100644
index 000000000..4d7901174
--- /dev/null
+++ b/data/vim/patches/8.1.0184
@@ -0,0 +1,122 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0184
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0184
+Problem: Not easy to figure out the window layout.
+Solution: Add "wincol" and "winrow" to what getwininfo() returns.
+Files: src/evalfunc.c, src/testdir/test_bufwintabinfo.vim,
+ runtime/doc/eval.txt
+
+
+*** ../vim-8.1.0183/src/evalfunc.c Sun Jul 8 16:50:33 2018
+--- src/evalfunc.c Sat Jul 14 21:17:08 2018
+***************
+*** 5648,5657 ****
+--- 5648,5659 ----
+ dict_add_number(dict, "winnr", winnr);
+ dict_add_number(dict, "winid", wp->w_id);
+ dict_add_number(dict, "height", wp->w_height);
++ dict_add_number(dict, "winrow", wp->w_winrow);
+ #ifdef FEAT_MENU
+ dict_add_number(dict, "winbar", wp->w_winbar_height);
+ #endif
+ dict_add_number(dict, "width", wp->w_width);
++ dict_add_number(dict, "wincol", wp->w_wincol);
+ dict_add_number(dict, "bufnr", wp->w_buffer->b_fnum);
+
+ #ifdef FEAT_TERMINAL
+*** ../vim-8.1.0183/src/testdir/test_bufwintabinfo.vim Sun Dec 10 21:02:56 2017
+--- src/testdir/test_bufwintabinfo.vim Sat Jul 14 21:34:20 2018
+***************
+*** 46,62 ****
+ let w2_id = win_getid()
+ tabnew | let w3_id = win_getid()
+ new | let w4_id = win_getid()
+! new | let w5_id = win_getid()
+ call setwinvar(0, 'signal', 'green')
+ tabfirst
+ let winlist = getwininfo()
+ call assert_equal(5, len(winlist))
+ call assert_equal(winbufnr(2), winlist[1].bufnr)
+ call assert_equal(winheight(2), winlist[1].height)
+ call assert_equal(1, winlist[2].winnr)
+ call assert_equal(2, winlist[3].tabnr)
+ call assert_equal('green', winlist[2].variables.signal)
+- call assert_equal(winwidth(1), winlist[0].width)
+ call assert_equal(w4_id, winlist[3].winid)
+ let winfo = getwininfo(w5_id)[0]
+ call assert_equal(2, winfo.tabnr)
+--- 46,79 ----
+ let w2_id = win_getid()
+ tabnew | let w3_id = win_getid()
+ new | let w4_id = win_getid()
+! vert new | let w5_id = win_getid()
+ call setwinvar(0, 'signal', 'green')
+ tabfirst
+ let winlist = getwininfo()
+ call assert_equal(5, len(winlist))
++ call assert_equal(winwidth(1), winlist[0].width)
++ call assert_equal(0, winlist[0].wincol)
++ call assert_equal(1, winlist[0].winrow) " tabline adds one
++
+ call assert_equal(winbufnr(2), winlist[1].bufnr)
+ call assert_equal(winheight(2), winlist[1].height)
++ call assert_equal(0, winlist[1].wincol)
++ call assert_equal(winheight(1) + 2, winlist[1].winrow)
++
+ call assert_equal(1, winlist[2].winnr)
++ call assert_equal(1, winlist[2].winrow)
++ call assert_equal(0, winlist[2].wincol)
++
++ call assert_equal(winlist[2].width + 1, winlist[3].wincol)
++ call assert_equal(0, winlist[4].wincol)
++
++ call assert_equal(1, winlist[0].tabnr)
++ call assert_equal(1, winlist[1].tabnr)
++ call assert_equal(2, winlist[2].tabnr)
+ call assert_equal(2, winlist[3].tabnr)
++ call assert_equal(2, winlist[4].tabnr)
++
+ call assert_equal('green', winlist[2].variables.signal)
+ call assert_equal(w4_id, winlist[3].winid)
+ let winfo = getwininfo(w5_id)[0]
+ call assert_equal(2, winfo.tabnr)
+*** ../vim-8.1.0183/runtime/doc/eval.txt Sat Jun 23 14:21:38 2018
+--- runtime/doc/eval.txt Sat Jul 14 21:24:39 2018
+***************
+*** 4993,5000 ****
+--- 4994,5003 ----
+ variables a reference to the dictionary with
+ window-local variables
+ width window width
++ wincol leftmost screen column of the window
+ winid |window-ID|
+ winnr window number
++ winrow topmost screen column of the window
+
+ To obtain all window-local variables use: >
+ gettabwinvar({tabnr}, {winnr}, '&')
+*** ../vim-8.1.0183/src/version.c Sat Jul 14 20:49:39 2018
+--- src/version.c Sat Jul 14 21:17:54 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 184,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+246. You use up your free 1 Gbyte in two days.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0185 b/data/vim/patches/8.1.0185
new file mode 100644
index 000000000..7009a25d0
--- /dev/null
+++ b/data/vim/patches/8.1.0185
@@ -0,0 +1,124 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0185
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0185
+Problem: Running tests writes lua.vim even though it is not used.
+Solution: Stop writing lua.vim.
+Files: src/testdir/test1.in, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile
+
+
+*** ../vim-8.1.0184/src/testdir/test1.in Sun Sep 22 14:52:43 2013
+--- src/testdir/test1.in Sat Jul 14 21:45:54 2018
+***************
+*** 15,21 ****
+ 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.
+- Similar logic is applied to the +lua feature, using lua.vim.
+
+ STARTTEST
+ :" If columns or lines are too small, create wrongtermsize.
+--- 15,20 ----
+***************
+*** 33,39 ****
+ qa!
+ :w! mbyte.vim
+ :w! mzscheme.vim
+- :w! lua.vim
+ :"
+ :" If +multi_byte feature supported, make mbyte.vim empty.
+ :if has("multi_byte") | sp another | w! mbyte.vim | q | endif
+--- 32,37 ----
+***************
+*** 41,49 ****
+ :" If +mzscheme feature supported, make mzscheme.vim empty.
+ :if has("mzscheme") | sp another | w! mzscheme.vim | q | endif
+ :"
+- :" If +lua feature supported, make lua.vim empty.
+- :if has("lua") | sp another | w! lua.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
+--- 39,44 ----
+*** ../vim-8.1.0184/src/testdir/Make_dos.mak Thu Nov 2 20:58:54 2017
+--- src/testdir/Make_dos.mak Sat Jul 14 21:46:31 2018
+***************
+*** 85,91 ****
+ -if exist tiny.vim del tiny.vim
+ -if exist mbyte.vim del mbyte.vim
+ -if exist mzscheme.vim del mzscheme.vim
+- -if exist lua.vim del lua.vim
+ -if exist Xdir1 rd /s /q Xdir1
+ -if exist Xfind rd /s /q Xfind
+ -if exist XfakeHOME rd /s /q XfakeHOME
+--- 85,90 ----
+*** ../vim-8.1.0184/src/testdir/Make_ming.mak Mon Dec 11 22:41:51 2017
+--- src/testdir/Make_ming.mak Sat Jul 14 21:46:35 2018
+***************
+*** 75,81 ****
+ -@if exist tiny.vim $(DEL) tiny.vim
+ -@if exist mbyte.vim $(DEL) mbyte.vim
+ -@if exist mzscheme.vim $(DEL) mzscheme.vim
+- -@if exist lua.vim $(DEL) lua.vim
+ -@if exist Xdir1 $(DELDIR) Xdir1
+ -@if exist Xfind $(DELDIR) Xfind
+ -@if exist XfakeHOME $(DELDIR) XfakeHOME
+--- 75,80 ----
+*** ../vim-8.1.0184/src/testdir/Make_vms.mms Sat Jun 30 21:50:16 2018
+--- src/testdir/Make_vms.mms Sat Jul 14 21:46:53 2018
+***************
+*** 208,213 ****
+ -@ 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("mzscheme.vim")'" .NES. "" then delete/noconfirm/nolog mzscheme.vim.*
+- -@ if "''F$SEARCH("lua.vim")'" .NES. "" then delete/noconfirm/nolog lua.vim.*
+ -@ if "''F$SEARCH("viminfo.*")'" .NES. "" then delete/noconfirm/nolog viminfo.*.*
+
+--- 208,212 ----
+*** ../vim-8.1.0184/src/testdir/Makefile Sat May 12 16:42:01 2018
+--- src/testdir/Makefile Sat Jul 14 21:47:13 2018
+***************
+*** 51,57 ****
+ $(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS): $(SCRIPTS_FIRST)
+
+ RM_ON_RUN = test.out X* viminfo
+! RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim lua.vim test.ok benchmark.out
+ RUN_VIM = VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(VALGRIND) $(VIMPROG) -f $(GUI_FLAG) -u unix.vim $(NO_INITS) -s dotest.in
+
+ clean:
+--- 51,57 ----
+ $(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS): $(SCRIPTS_FIRST)
+
+ RM_ON_RUN = test.out X* viminfo
+! RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim test.ok benchmark.out
+ RUN_VIM = VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(VALGRIND) $(VIMPROG) -f $(GUI_FLAG) -u unix.vim $(NO_INITS) -s dotest.in
+
+ clean:
+*** ../vim-8.1.0184/src/version.c Sat Jul 14 21:41:38 2018
+--- src/version.c Sat Jul 14 21:47:47 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 185,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+247. You use www.switchboard.com instead of dialing 411 and 555-12-12
+ for directory assistance.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0186 b/data/vim/patches/8.1.0186
new file mode 100644
index 000000000..c2c5353a5
--- /dev/null
+++ b/data/vim/patches/8.1.0186
@@ -0,0 +1,69 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0186
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0186
+Problem: Test for getwininfo() fails in GUI.
+Solution: Account for missing tabline.
+Files: src/testdir/test_bufwintabinfo.vim
+
+
+*** ../vim-8.1.0185/src/testdir/test_bufwintabinfo.vim Sat Jul 14 21:41:38 2018
+--- src/testdir/test_bufwintabinfo.vim Sat Jul 14 22:22:09 2018
+***************
+*** 53,67 ****
+ call assert_equal(5, len(winlist))
+ call assert_equal(winwidth(1), winlist[0].width)
+ call assert_equal(0, winlist[0].wincol)
+! call assert_equal(1, winlist[0].winrow) " tabline adds one
+
+ call assert_equal(winbufnr(2), winlist[1].bufnr)
+ call assert_equal(winheight(2), winlist[1].height)
+ call assert_equal(0, winlist[1].wincol)
+! call assert_equal(winheight(1) + 2, winlist[1].winrow)
+
+ call assert_equal(1, winlist[2].winnr)
+! call assert_equal(1, winlist[2].winrow)
+ call assert_equal(0, winlist[2].wincol)
+
+ call assert_equal(winlist[2].width + 1, winlist[3].wincol)
+--- 53,68 ----
+ call assert_equal(5, len(winlist))
+ call assert_equal(winwidth(1), winlist[0].width)
+ call assert_equal(0, winlist[0].wincol)
+! let tablineheight = winlist[0].winrow == 1 ? 1 : 0
+! call assert_equal(tablineheight, winlist[0].winrow) " tabline adds one
+
+ call assert_equal(winbufnr(2), winlist[1].bufnr)
+ call assert_equal(winheight(2), winlist[1].height)
+ call assert_equal(0, winlist[1].wincol)
+! call assert_equal(tablineheight + winheight(1) + 1, winlist[1].winrow)
+
+ call assert_equal(1, winlist[2].winnr)
+! call assert_equal(tablineheight, winlist[2].winrow)
+ call assert_equal(0, winlist[2].wincol)
+
+ call assert_equal(winlist[2].width + 1, winlist[3].wincol)
+*** ../vim-8.1.0185/src/version.c Sat Jul 14 21:48:42 2018
+--- src/version.c Sat Jul 14 22:23:06 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 186,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+248. You sign your letters with your e-mail address instead of your name.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0187 b/data/vim/patches/8.1.0187
new file mode 100644
index 000000000..0403ade73
--- /dev/null
+++ b/data/vim/patches/8.1.0187
@@ -0,0 +1,233 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0184
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0187 (after 8.1.0184)
+Problem: getwininfo() and win_screenpos() return different numbers.
+Solution: Add one to "wincol" and "winrow" from getwininfo().
+Files: src/evalfunc.c, src/testdir/test_bufwintabinfo.vim,
+ runtime/doc/eval.txt
+
+
+*** ../vim-8.1.0186/src/evalfunc.c Sat Jul 14 21:41:38 2018
+--- src/evalfunc.c Sun Jul 15 16:51:34 2018
+***************
+*** 5648,5659 ****
+ dict_add_number(dict, "winnr", winnr);
+ dict_add_number(dict, "winid", wp->w_id);
+ dict_add_number(dict, "height", wp->w_height);
+! dict_add_number(dict, "winrow", wp->w_winrow);
+ #ifdef FEAT_MENU
+ dict_add_number(dict, "winbar", wp->w_winbar_height);
+ #endif
+ dict_add_number(dict, "width", wp->w_width);
+! dict_add_number(dict, "wincol", wp->w_wincol);
+ dict_add_number(dict, "bufnr", wp->w_buffer->b_fnum);
+
+ #ifdef FEAT_TERMINAL
+--- 5648,5659 ----
+ dict_add_number(dict, "winnr", winnr);
+ dict_add_number(dict, "winid", wp->w_id);
+ dict_add_number(dict, "height", wp->w_height);
+! dict_add_number(dict, "winrow", wp->w_winrow + 1);
+ #ifdef FEAT_MENU
+ dict_add_number(dict, "winbar", wp->w_winbar_height);
+ #endif
+ dict_add_number(dict, "width", wp->w_width);
+! dict_add_number(dict, "wincol", wp->w_wincol + 1);
+ dict_add_number(dict, "bufnr", wp->w_buffer->b_fnum);
+
+ #ifdef FEAT_TERMINAL
+*** ../vim-8.1.0186/src/testdir/test_bufwintabinfo.vim Sat Jul 14 22:23:44 2018
+--- src/testdir/test_bufwintabinfo.vim Sun Jul 15 16:57:49 2018
+***************
+*** 52,72 ****
+ let winlist = getwininfo()
+ call assert_equal(5, len(winlist))
+ call assert_equal(winwidth(1), winlist[0].width)
+! call assert_equal(0, winlist[0].wincol)
+! let tablineheight = winlist[0].winrow == 1 ? 1 : 0
+! call assert_equal(tablineheight, winlist[0].winrow) " tabline adds one
+
+ call assert_equal(winbufnr(2), winlist[1].bufnr)
+ call assert_equal(winheight(2), winlist[1].height)
+! call assert_equal(0, winlist[1].wincol)
+! call assert_equal(tablineheight + winheight(1) + 1, winlist[1].winrow)
+
+ call assert_equal(1, winlist[2].winnr)
+! call assert_equal(tablineheight, winlist[2].winrow)
+! call assert_equal(0, winlist[2].wincol)
+
+! call assert_equal(winlist[2].width + 1, winlist[3].wincol)
+! call assert_equal(0, winlist[4].wincol)
+
+ call assert_equal(1, winlist[0].tabnr)
+ call assert_equal(1, winlist[1].tabnr)
+--- 52,73 ----
+ let winlist = getwininfo()
+ call assert_equal(5, len(winlist))
+ call assert_equal(winwidth(1), winlist[0].width)
+! call assert_equal(1, winlist[0].wincol)
+! " tabline adds one row in terminal, not in GUI
+! let tablineheight = winlist[0].winrow == 2 ? 1 : 0
+! call assert_equal(tablineheight + 1, winlist[0].winrow)
+
+ call assert_equal(winbufnr(2), winlist[1].bufnr)
+ call assert_equal(winheight(2), winlist[1].height)
+! call assert_equal(1, winlist[1].wincol)
+! call assert_equal(tablineheight + winheight(1) + 2, winlist[1].winrow)
+
+ call assert_equal(1, winlist[2].winnr)
+! call assert_equal(tablineheight + 1, winlist[2].winrow)
+! call assert_equal(1, winlist[2].wincol)
+
+! call assert_equal(winlist[2].width + 2, winlist[3].wincol)
+! call assert_equal(1, winlist[4].wincol)
+
+ call assert_equal(1, winlist[0].tabnr)
+ call assert_equal(1, winlist[1].tabnr)
+*** ../vim-8.1.0186/runtime/doc/eval.txt Sat Jul 14 21:41:38 2018
+--- runtime/doc/eval.txt Sun Jul 15 16:54:29 2018
+***************
+*** 2196,2202 ****
+ any variable {varname} in tab {nr} or {def}
+ gettabwinvar({tabnr}, {winnr}, {name} [, {def}])
+ any {name} in {winnr} in tab page {tabnr}
+! getwininfo([{winid}]) List list of windows
+ getwinpos([{timeout}]) List X and Y coord in pixels of the Vim window
+ getwinposx() Number X coord in pixels of the Vim window
+ getwinposy() Number Y coord in pixels of the Vim window
+--- 2196,2202 ----
+ any variable {varname} in tab {nr} or {def}
+ gettabwinvar({tabnr}, {winnr}, {name} [, {def}])
+ any {name} in {winnr} in tab page {tabnr}
+! getwininfo([{winid}]) List list of info about each window
+ getwinpos([{timeout}]) List X and Y coord in pixels of the Vim window
+ getwinposx() Number X coord in pixels of the Vim window
+ getwinposy() Number Y coord in pixels of the Vim window
+***************
+*** 4935,4940 ****
+--- 4936,4976 ----
+ :let list_is_on = gettabwinvar(1, 2, '&list')
+ :echo "myvar = " . gettabwinvar(3, 1, 'myvar')
+ <
++ getwininfo([{winid}]) *getwininfo()*
++ Returns information about windows as a List with Dictionaries.
++
++ If {winid} is given Information about the window with that ID
++ is returned. If the window does not exist the result is an
++ empty list.
++
++ Without {winid} information about all the windows in all the
++ tab pages is returned.
++
++ Each List item is a Dictionary with the following entries:
++ bufnr number of buffer in the window
++ height window height (excluding winbar)
++ winbar 1 if the window has a toolbar, 0
++ otherwise
++ loclist 1 if showing a location list
++ {only with the +quickfix feature}
++ quickfix 1 if quickfix or location list window
++ {only with the +quickfix feature}
++ terminal 1 if a terminal window
++ {only with the +terminal feature}
++ tabnr tab page number
++ variables a reference to the dictionary with
++ window-local variables
++ width window width
++ wincol leftmost screen column of the window,
++ col from |win_screenpos()|
++ winid |window-ID|
++ winnr window number
++ winrow topmost screen column of the window,
++ row from |win_screenpos()|
++
++ To obtain all window-local variables use: >
++ gettabwinvar({tabnr}, {winnr}, '&')
++
+ getwinpos([{timeout}]) *getwinpos()*
+ The result is a list with two numbers, the result of
+ getwinposx() and getwinposy() combined:
+***************
+*** 4968,5006 ****
+ The result will be -1 if the information is not available.
+ The value can be used with `:winpos`.
+
+- getwininfo([{winid}]) *getwininfo()*
+- Returns information about windows as a List with Dictionaries.
+-
+- If {winid} is given Information about the window with that ID
+- is returned. If the window does not exist the result is an
+- empty list.
+-
+- Without {winid} information about all the windows in all the
+- tab pages is returned.
+-
+- Each List item is a Dictionary with the following entries:
+- bufnr number of buffer in the window
+- height window height (excluding winbar)
+- winbar 1 if the window has a toolbar, 0
+- otherwise
+- loclist 1 if showing a location list
+- {only with the +quickfix feature}
+- quickfix 1 if quickfix or location list window
+- {only with the +quickfix feature}
+- terminal 1 if a terminal window
+- {only with the +terminal feature}
+- tabnr tab page number
+- variables a reference to the dictionary with
+- window-local variables
+- width window width
+- wincol leftmost screen column of the window
+- winid |window-ID|
+- winnr window number
+- winrow topmost screen column of the window
+-
+- To obtain all window-local variables use: >
+- gettabwinvar({tabnr}, {winnr}, '&')
+-
+ getwinvar({winnr}, {varname} [, {def}]) *getwinvar()*
+ Like |gettabwinvar()| for the current tabpage.
+ Examples: >
+--- 5004,5009 ----
+***************
+*** 9047,9053 ****
+ win_screenpos({nr}) *win_screenpos()*
+ Return the screen position of window {nr} as a list with two
+ numbers: [row, col]. The first window always has position
+! [1, 1].
+ {nr} can be the window number or the |window-ID|.
+ Return [0, 0] if the window cannot be found in the current
+ tabpage.
+--- 9051,9057 ----
+ win_screenpos({nr}) *win_screenpos()*
+ Return the screen position of window {nr} as a list with two
+ numbers: [row, col]. The first window always has position
+! [1, 1], unless there is a tabline, then it is [2, 1].
+ {nr} can be the window number or the |window-ID|.
+ Return [0, 0] if the window cannot be found in the current
+ tabpage.
+*** ../vim-8.1.0186/src/version.c Sat Jul 14 22:23:44 2018
+--- src/version.c Sun Jul 15 17:00:11 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 187,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+251. You've never seen your closest friends who usually live WAY too far away.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0188 b/data/vim/patches/8.1.0188
new file mode 100644
index 000000000..9c6023768
--- /dev/null
+++ b/data/vim/patches/8.1.0188
@@ -0,0 +1,63 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0188
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0188
+Problem: No test for ":cscope add".
+Solution: Add a test. (Dominique Pelle, closes #3212)
+Files: src/testdir/test_cscope.vim
+
+
+*** ../vim-8.1.0187/src/testdir/test_cscope.vim Thu Apr 5 19:04:00 2018
+--- src/testdir/test_cscope.vim Sun Jul 15 17:34:34 2018
+***************
+*** 254,260 ****
+--- 254,278 ----
+
+ " CleanUp
+ call CscopeSetupOrClean(0)
++ endfunc
++
++ " Test ":cs add {dir}" (add the {dir}/cscope.out database)
++ func Test_cscope_add_dir()
++ call mkdir('Xcscopedir', 'p')
++ call system('cscope -bk -fXcscopedir/cscope.out ../memfile_test.c')
++ cs add Xcscopedir
++ let a = execute('cscope show')
++ let lines = split(a, "\n", 1)
++ call assert_equal(3, len(lines))
++ call assert_equal(' # pid database name prepend path', lines[0])
++ call assert_equal('', lines[1])
++ call assert_match('^ 0 \d\+.*Xcscopedir/cscope.out\s\+<none>$', lines[2])
++
++ cs kill -1
++ call delete('Xcscopedir/cscope.out')
++ call assert_fails('cs add Xcscopedir', 'E563:')
+
++ call delete('Xcscopedir', 'd')
+ endfunc
+
+ func Test_cscopequickfix()
+*** ../vim-8.1.0187/src/version.c Sun Jul 15 17:01:06 2018
+--- src/version.c Sun Jul 15 17:35:29 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 188,
+ /**/
+
+--
+Emacs is a nice OS - but it lacks a good text editor.
+That's why I am using Vim. --Anonymous
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0189 b/data/vim/patches/8.1.0189
new file mode 100644
index 000000000..bb02fab77
--- /dev/null
+++ b/data/vim/patches/8.1.0189
@@ -0,0 +1,57 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0189
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0189
+Problem: Function defined in sandbox not tested.
+Solution: Add a text.
+Files: src/testdir/test_functions.vim
+
+
+*** ../vim-8.1.0188/src/testdir/test_functions.vim Tue Jun 19 19:46:01 2018
+--- src/testdir/test_functions.vim Tue Jul 10 19:30:01 2018
+***************
+*** 984,986 ****
+--- 984,1002 ----
+ call assert_fails("call libcall('Xdoesnotexist_', 'getenv', 'HOME')", 'E364:')
+ call assert_fails("call libcallnr('Xdoesnotexist_', 'strlen', 'abcd')", 'E364:')
+ endfunc
++
++ sandbox function Fsandbox()
++ normal ix
++ endfunc
++
++ func Test_func_sandbox()
++ sandbox let F = {-> 'hello'}
++ call assert_equal('hello', F())
++
++ sandbox let F = {-> execute("normal ix\<Esc>")}
++ call assert_fails('call F()', 'E48:')
++ unlet F
++
++ call assert_fails('call Fsandbox()', 'E48:')
++ delfunc Fsandbox
++ endfunc
+*** ../vim-8.1.0188/src/version.c Sun Jul 15 17:36:28 2018
+--- src/version.c Sun Jul 15 20:22:12 2018
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 189,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+252. You vote for foreign officials.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0190 b/data/vim/patches/8.1.0190
new file mode 100644
index 000000000..36f52ad9b
--- /dev/null
+++ b/data/vim/patches/8.1.0190
@@ -0,0 +1,269 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0190
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0190
+Problem: Perl refcounts are wrong.
+Solution: Improve refcounting. Add a test. (Damien)
+Files: src/if_perl.xs, src/testdir/test_perl.vim
+
+
+*** ../vim-8.1.0189/src/if_perl.xs 2018-07-08 17:18:58.416462371 +0200
+--- src/if_perl.xs 2018-07-16 17:34:41.750473682 +0200
+***************
+*** 845,850 ****
+--- 845,858 ----
+ return sv_bless(rv, gv_stashpv("VIBUF", TRUE));
+ }
+
++ #if 0
++ SV *__sv_save[1024];
++ int __sv_save_ix;
++ # define D_Save_Sv(sv) do { if (__sv_save_ix < 1024) __sv_save[__sv_save_ix++] = (sv); } while (0)
++ #else
++ # define D_Save_Sv(sv) NOOP
++ #endif
++
+ /*
+ * perl_win_free
+ * Remove all references to the window to be destroyed
+***************
+*** 852,868 ****
+ void
+ perl_win_free(win_T *wp)
+ {
+! if (wp->w_perl_private)
+! sv_setiv((SV *)wp->w_perl_private, 0);
+! return;
+ }
+
+ void
+ perl_buf_free(buf_T *bp)
+ {
+! if (bp->b_perl_private)
+! sv_setiv((SV *)bp->b_perl_private, 0);
+! return;
+ }
+
+ #ifndef PROTO
+--- 860,886 ----
+ void
+ perl_win_free(win_T *wp)
+ {
+! if (wp->w_perl_private && perl_interp != NULL)
+! {
+! SV *sv = (SV*)wp->w_perl_private;
+! D_Save_Sv(sv);
+! sv_setiv(sv, 0);
+! SvREFCNT_dec(sv);
+! }
+! wp->w_perl_private = NULL;
+ }
+
+ void
+ perl_buf_free(buf_T *bp)
+ {
+! if (bp->b_perl_private && perl_interp != NULL)
+! {
+! SV *sv = (SV *)bp->b_perl_private;
+! D_Save_Sv(sv);
+! sv_setiv(sv, 0);
+! SvREFCNT_dec(sv);
+! }
+! bp->b_perl_private = NULL;
+ }
+
+ #ifndef PROTO
+***************
+*** 885,896 ****
+ # endif
+ {
+ SV *rv;
+ if (iv == 0)
+ rv = newWINrv(newSV(0), curwin);
+ else
+ rv = newBUFrv(newSV(0), curbuf);
+! sv_setsv(sv, rv);
+! SvREFCNT_dec(SvRV(rv));
+ return 0;
+ }
+ #endif /* !PROTO */
+--- 903,921 ----
+ # endif
+ {
+ SV *rv;
++
+ if (iv == 0)
+ rv = newWINrv(newSV(0), curwin);
+ else
+ rv = newBUFrv(newSV(0), curbuf);
+!
+! if (SvRV(sv) == SvRV(rv))
+! SvREFCNT_dec(SvRV(rv));
+! else /* XXX: Not sure if the `else` condition are right
+! * Test_SvREFCNT() pass in all case.
+! */
+! sv_setsv(sv, rv);
+!
+ return 0;
+ }
+ #endif /* !PROTO */
+***************
+*** 1539,1545 ****
+ else
+ {
+ FOR_ALL_BUFFERS(vimbuf)
+! XPUSHs(newBUFrv(newSV(0), vimbuf));
+ }
+ }
+ else
+--- 1564,1570 ----
+ else
+ {
+ FOR_ALL_BUFFERS(vimbuf)
+! XPUSHs(sv_2mortal(newBUFrv(newSV(0), vimbuf)));
+ }
+ }
+ else
+***************
+*** 1564,1570 ****
+ {
+ vimbuf = buflist_findnr(b);
+ if (vimbuf)
+! XPUSHs(newBUFrv(newSV(0), vimbuf));
+ }
+ }
+ }
+--- 1589,1595 ----
+ {
+ vimbuf = buflist_findnr(b);
+ if (vimbuf)
+! XPUSHs(sv_2mortal(newBUFrv(newSV(0), vimbuf)));
+ }
+ }
+ }
+***************
+*** 1584,1590 ****
+ else
+ {
+ FOR_ALL_WINDOWS(vimwin)
+! XPUSHs(newWINrv(newSV(0), vimwin));
+ }
+ }
+ else
+--- 1609,1615 ----
+ else
+ {
+ FOR_ALL_WINDOWS(vimwin)
+! XPUSHs(sv_2mortal(newWINrv(newSV(0), vimwin)));
+ }
+ }
+ else
+***************
+*** 1594,1600 ****
+ w = (int) SvIV(ST(i));
+ vimwin = win_find_nr(w);
+ if (vimwin)
+! XPUSHs(newWINrv(newSV(0), vimwin));
+ }
+ }
+
+--- 1619,1625 ----
+ w = (int) SvIV(ST(i));
+ vimwin = win_find_nr(w);
+ if (vimwin)
+! XPUSHs(sv_2mortal(newWINrv(newSV(0), vimwin)));
+ }
+ }
+
+*** ../vim-8.1.0189/src/testdir/test_perl.vim 2017-03-18 19:45:55.000000000 +0100
+--- src/testdir/test_perl.vim 2018-07-16 17:34:41.754473657 +0200
+***************
+*** 219,238 ****
+ call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n"))
+ endfunc
+
+! func Test_SvREFCNT()
+ new t
+ perl <<--perl
+ my ($b, $w);
+! $b = $curbuf for 0 .. 10;
+! $w = $curwin for 0 .. 10;
+ VIM::DoCommand('bw! t');
+ if (exists &Internals::SvREFCNT) {
+ my $cb = Internals::SvREFCNT($$b);
+ my $cw = Internals::SvREFCNT($$w);
+! VIM::Eval("assert_equal(2, $cb)");
+! VIM::Eval("assert_equal(2, $cw)");
+ }
+ VIM::Eval("assert_false($$b)");
+ VIM::Eval("assert_false($$w)");
+ --perl
+ endfunc
+--- 219,260 ----
+ call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n"))
+ endfunc
+
+! " Run first to get a clean namespace
+! func Test_000_SvREFCNT()
+! for i in range(10)
+! exec 'new X'.i
+! endfor
+ new t
+ perl <<--perl
++ #line 5 "Test_000_SvREFCNT()"
+ my ($b, $w);
+!
+! $b = $curbuf for 0 .. 100;
+! $w = $curwin for 0 .. 100;
+! () = VIM::Buffers for 0 .. 100;
+! () = VIM::Windows for 0 .. 100;
+!
+ VIM::DoCommand('bw! t');
+ if (exists &Internals::SvREFCNT) {
+ my $cb = Internals::SvREFCNT($$b);
+ my $cw = Internals::SvREFCNT($$w);
+! VIM::Eval("assert_equal(2, $cb, 'T1')");
+! VIM::Eval("assert_equal(2, $cw, 'T2')");
+! foreach ( VIM::Buffers, VIM::Windows ) {
+! my $c = Internals::SvREFCNT($_);
+! VIM::Eval("assert_equal(2, $c, 'T3')");
+! $c = Internals::SvREFCNT($$_);
+! # Why only one ref?
+! # Look wrong but work. Maybe not portable...
+! VIM::Eval("assert_equal(1, $c, 'T4')");
+! }
+! $cb = Internals::SvREFCNT($$curbuf);
+! $cw = Internals::SvREFCNT($$curwin);
+! VIM::Eval("assert_equal(3, $cb, 'T5')");
+! VIM::Eval("assert_equal(3, $cw, 'T6')");
+ }
+ VIM::Eval("assert_false($$b)");
+ VIM::Eval("assert_false($$w)");
+ --perl
++ %bw!
+ endfunc
+*** ../vim-8.1.0189/src/version.c 2018-07-15 20:26:37.418459878 +0200
+--- src/version.c 2018-07-16 17:37:41.017344049 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 190,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+255. You work for a newspaper and your editor asks you to write an
+ article about Internet addiction...in the "first person."
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0191 b/data/vim/patches/8.1.0191
new file mode 100644
index 000000000..4bfe2a5ad
--- /dev/null
+++ b/data/vim/patches/8.1.0191
@@ -0,0 +1,53 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0191
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0191 (after 8.1.0190)
+Problem: Perl test fails in 24 line terminal.
+Solution: Create fewer windows.
+Files: src/testdir/test_perl.vim
+
+
+*** ../vim-8.1.0190/src/testdir/test_perl.vim 2018-07-16 17:45:16.998502685 +0200
+--- src/testdir/test_perl.vim 2018-07-16 18:05:22.631351923 +0200
+***************
+*** 221,227 ****
+
+ " Run first to get a clean namespace
+ func Test_000_SvREFCNT()
+! for i in range(10)
+ exec 'new X'.i
+ endfor
+ new t
+--- 221,227 ----
+
+ " Run first to get a clean namespace
+ func Test_000_SvREFCNT()
+! for i in range(8)
+ exec 'new X'.i
+ endfor
+ new t
+*** ../vim-8.1.0190/src/version.c 2018-07-16 17:45:16.998502685 +0200
+--- src/version.c 2018-07-16 18:08:33.894241240 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 191,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+256. You are able to write down over 250 symptoms of being an internet
+ addict, even though they only asked for 101.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0192 b/data/vim/patches/8.1.0192
new file mode 100644
index 000000000..8dfbf381c
--- /dev/null
+++ b/data/vim/patches/8.1.0192
@@ -0,0 +1,4274 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0192
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0192
+Problem: Executing regexp recursively fails with a crash.
+Solution: Move global variables into "rex".
+Files: src/regexp.c, src/regexp.h, src/regexp_nfa.c
+
+
+*** ../vim-8.1.0191/src/regexp.c 2018-06-23 15:09:02.351412460 +0200
+--- src/regexp.c 2018-07-17 05:32:30.971441868 +0200
+***************
+*** 344,350 ****
+
+ #define MAX_LIMIT (32767L << 16L)
+
+- static int re_multi_type(int);
+ static int cstrncmp(char_u *s1, char_u *s2, int *n);
+ static char_u *cstrchr(char_u *, int);
+
+--- 344,349 ----
+***************
+*** 371,376 ****
+--- 370,377 ----
+ #endif
+ static char_u e_missing_sb[] = N_("E69: Missing ] after %s%%[");
+ static char_u e_empty_sb[] = N_("E70: Empty %s%%[]");
++ static char_u e_recursive[] = N_("E956: Cannot use pattern recursively");
++
+ #define NOT_MULTI 0
+ #define MULTI_ONE 1
+ #define MULTI_MULT 2
+***************
+*** 426,439 ****
+ static char_u REGEXP_INRANGE[] = "]^-n\\";
+ static char_u REGEXP_ABBR[] = "nrtebdoxuU";
+
+- static int backslash_trans(int c);
+- static int get_char_class(char_u **pp);
+- static int get_equi_class(char_u **pp);
+- static void reg_equi_class(int c);
+- static int get_coll_element(char_u **pp);
+- static char_u *skip_anyof(char_u *p);
+- static void init_class_tab(void);
+-
+ /*
+ * Translate '\x' to its control character, except "\n", which is Magic.
+ */
+--- 427,432 ----
+***************
+*** 688,695 ****
+ * Forward declarations for vim_regcomp()'s friends.
+ */
+ static void initchr(char_u *);
+- static void save_parse_state(parse_state_T *ps);
+- static void restore_parse_state(parse_state_T *ps);
+ static int getchr(void);
+ static void skipchr_keepstart(void);
+ static int peekchr(void);
+--- 681,686 ----
+***************
+*** 1171,1177 ****
+ return 0;
+ }
+
+- static void get_cpo_flags(void);
+ static int reg_cpo_lit; /* 'cpoptions' contains 'l' flag */
+ static int reg_cpo_bsl; /* 'cpoptions' contains '\' flag */
+
+--- 1162,1167 ----
+***************
+*** 1322,1330 ****
+ return TRUE;
+ }
+
+- static regprog_T *bt_regcomp(char_u *expr, int re_flags);
+- static void bt_regfree(regprog_T *prog);
+-
+ /*
+ * bt_regcomp() - compile a regular expression into internal code for the
+ * traditional back track matcher.
+--- 1312,1317 ----
+***************
+*** 1373,1378 ****
+--- 1360,1366 ----
+ r = (bt_regprog_T *)lalloc(sizeof(bt_regprog_T) + regsize, TRUE);
+ if (r == NULL)
+ return NULL;
++ r->re_in_use = FALSE;
+
+ /*
+ * Second pass: emit code.
+***************
+*** 1525,1533 ****
+ }
+ #endif
+
+! /* variables for parsing reginput */
+! static int at_start; /* True when on the first character */
+! static int prev_at_start; /* True when on the second character */
+
+ /*
+ * Parse regular expression, i.e. main body or parenthesized thing.
+--- 1513,1521 ----
+ }
+ #endif
+
+! // variables used for parsing
+! static int at_start; // True when on the first character
+! static int prev_at_start; // True when on the second character
+
+ /*
+ * Parse regular expression, i.e. main body or parenthesized thing.
+***************
+*** 3443,3460 ****
+ * Global work variables for vim_regexec().
+ */
+
+- /* The current match-position is remembered with these variables: */
+- static linenr_T reglnum; /* line number, relative to first line */
+- static char_u *regline; /* start of current line */
+- static char_u *reginput; /* current input, points into "regline" */
+-
+- static int need_clear_subexpr; /* subexpressions still need to be
+- * cleared */
+- #ifdef FEAT_SYN_HL
+- static int need_clear_zsubexpr = FALSE; /* extmatch subexpressions
+- * still need to be cleared */
+- #endif
+-
+ /*
+ * Structure used to save the current input state, when it needs to be
+ * restored after trying a match. Used by reg_save() and reg_restore().
+--- 3431,3436 ----
+***************
+*** 3464,3471 ****
+ {
+ union
+ {
+! char_u *ptr; /* reginput pointer, for single-line regexp */
+! lpos_T pos; /* reginput pos, for multi-line regexp */
+ } rs_u;
+ int rs_len;
+ } regsave_T;
+--- 3440,3447 ----
+ {
+ union
+ {
+! char_u *ptr; /* rex.input pointer, for single-line regexp */
+! lpos_T pos; /* rex.input pos, for multi-line regexp */
+ } rs_u;
+ int rs_len;
+ } regsave_T;
+***************
+*** 3564,3576 ****
+ linenr_T reg_maxline;
+ int reg_line_lbr; /* "\n" in string is line break */
+
+ /* Internal copy of 'ignorecase'. It is set at each call to vim_regexec().
+ * Normally it gets the value of "rm_ic" or "rmm_ic", but when the pattern
+ * contains '\c' or '\C' the value is overruled. */
+ int reg_ic;
+
+ #ifdef FEAT_MBYTE
+! /* Similar to rex.reg_ic, but only for 'combining' characters. Set with \Z
+ * flag in the regexp. Defaults to false, always. */
+ int reg_icombine;
+ #endif
+--- 3540,3563 ----
+ linenr_T reg_maxline;
+ int reg_line_lbr; /* "\n" in string is line break */
+
++ // The current match-position is stord in these variables:
++ linenr_T lnum; // line number, relative to first line
++ char_u *line; // start of current line
++ char_u *input; // current input, points into "regline"
++
++ int need_clear_subexpr; // subexpressions still need to be cleared
++ #ifdef FEAT_SYN_HL
++ int need_clear_zsubexpr; // extmatch subexpressions still need to be
++ // cleared
++ #endif
++
+ /* Internal copy of 'ignorecase'. It is set at each call to vim_regexec().
+ * Normally it gets the value of "rm_ic" or "rmm_ic", but when the pattern
+ * contains '\c' or '\C' the value is overruled. */
+ int reg_ic;
+
+ #ifdef FEAT_MBYTE
+! /* Similar to "reg_ic", but only for 'combining' characters. Set with \Z
+ * flag in the regexp. Defaults to false, always. */
+ int reg_icombine;
+ #endif
+***************
+*** 3578,3583 ****
+--- 3565,3586 ----
+ /* Copy of "rmm_maxcol": maximum column to search for a match. Zero when
+ * there is no maximum. */
+ colnr_T reg_maxcol;
++
++ // State for the NFA engine regexec.
++ int nfa_has_zend; // NFA regexp \ze operator encountered.
++ int nfa_has_backref; // NFA regexp \1 .. \9 encountered.
++ int nfa_nsubexpr; // Number of sub expressions actually being used
++ // during execution. 1 if only the whole match
++ // (subexpr 0) is used.
++ // listid is global, so that it increases on recursive calls to
++ // nfa_regmatch(), which means we don't have to clear the lastlist field of
++ // all the states.
++ int nfa_listid;
++ int nfa_alt_listid;
++
++ #ifdef FEAT_SYN_HL
++ int nfa_has_zsubexpr; // NFA regexp has \z( ), set zsubexpr.
++ #endif
+ } regexec_T;
+
+ static regexec_T rex;
+***************
+*** 3619,3625 ****
+ {
+ save_se_T sesave;
+ regsave_T regsave;
+! } rs_un; /* room for saving reginput */
+ short rs_no; /* submatch nr or BEHIND/NOBEHIND */
+ } regitem_T;
+
+--- 3622,3628 ----
+ {
+ save_se_T sesave;
+ regsave_T regsave;
+! } rs_un; /* room for saving rex.input */
+ short rs_no; /* submatch nr or BEHIND/NOBEHIND */
+ } regitem_T;
+
+***************
+*** 3896,3903 ****
+ goto theend;
+ }
+
+! regline = line;
+! reglnum = 0;
+ reg_toolong = FALSE;
+
+ /* Simplest case: Anchored match need be tried only once. */
+--- 3899,3906 ----
+ goto theend;
+ }
+
+! rex.line = line;
+! rex.lnum = 0;
+ reg_toolong = FALSE;
+
+ /* Simplest case: Anchored match need be tried only once. */
+***************
+*** 3907,3916 ****
+
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! c = (*mb_ptr2char)(regline + col);
+ else
+ #endif
+! c = regline[col];
+ if (prog->regstart == NUL
+ || prog->regstart == c
+ || (rex.reg_ic && ((
+--- 3910,3919 ----
+
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! c = (*mb_ptr2char)(rex.line + col);
+ else
+ #endif
+! c = rex.line[col];
+ if (prog->regstart == NUL
+ || prog->regstart == c
+ || (rex.reg_ic && ((
+***************
+*** 3940,3954 ****
+ && !has_mbyte
+ #endif
+ )
+! s = vim_strbyte(regline + col, prog->regstart);
+ else
+! s = cstrchr(regline + col, prog->regstart);
+ if (s == NULL)
+ {
+ retval = 0;
+ break;
+ }
+! col = (int)(s - regline);
+ }
+
+ /* Check for maximum column to try. */
+--- 3943,3957 ----
+ && !has_mbyte
+ #endif
+ )
+! s = vim_strbyte(rex.line + col, prog->regstart);
+ else
+! s = cstrchr(rex.line + col, prog->regstart);
+ if (s == NULL)
+ {
+ retval = 0;
+ break;
+ }
+! col = (int)(s - rex.line);
+ }
+
+ /* Check for maximum column to try. */
+***************
+*** 3963,3978 ****
+ break;
+
+ /* if not currently on the first line, get it again */
+! if (reglnum != 0)
+ {
+! reglnum = 0;
+! regline = reg_getline((linenr_T)0);
+ }
+! if (regline[col] == NUL)
+ break;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! col += (*mb_ptr2len)(regline + col);
+ else
+ #endif
+ ++col;
+--- 3966,3981 ----
+ break;
+
+ /* if not currently on the first line, get it again */
+! if (rex.lnum != 0)
+ {
+! rex.lnum = 0;
+! rex.line = reg_getline((linenr_T)0);
+ }
+! if (rex.line[col] == NUL)
+ break;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! col += (*mb_ptr2len)(rex.line + col);
+ else
+ #endif
+ ++col;
+***************
+*** 4052,4058 ****
+ #endif
+
+ /*
+! * regtry - try match of "prog" with at regline["col"].
+ * Returns 0 for failure, number of lines contained in the match otherwise.
+ */
+ static long
+--- 4055,4061 ----
+ #endif
+
+ /*
+! * regtry - try match of "prog" with at rex.line["col"].
+ * Returns 0 for failure, number of lines contained in the match otherwise.
+ */
+ static long
+***************
+*** 4062,4073 ****
+ proftime_T *tm, /* timeout limit or NULL */
+ int *timed_out) /* flag set on timeout or NULL */
+ {
+! reginput = regline + col;
+! need_clear_subexpr = TRUE;
+ #ifdef FEAT_SYN_HL
+! /* Clear the external match subpointers if necessary. */
+! if (prog->reghasz == REX_SET)
+! need_clear_zsubexpr = TRUE;
+ #endif
+
+ if (regmatch(prog->program + 1, tm, timed_out) == 0)
+--- 4065,4075 ----
+ proftime_T *tm, /* timeout limit or NULL */
+ int *timed_out) /* flag set on timeout or NULL */
+ {
+! rex.input = rex.line + col;
+! rex.need_clear_subexpr = TRUE;
+ #ifdef FEAT_SYN_HL
+! // Clear the external match subpointers if necessary.
+! rex.need_clear_zsubexpr = (prog->reghasz == REX_SET);
+ #endif
+
+ if (regmatch(prog->program + 1, tm, timed_out) == 0)
+***************
+*** 4083,4101 ****
+ }
+ if (rex.reg_endpos[0].lnum < 0)
+ {
+! rex.reg_endpos[0].lnum = reglnum;
+! rex.reg_endpos[0].col = (int)(reginput - regline);
+ }
+ else
+ /* Use line number of "\ze". */
+! reglnum = rex.reg_endpos[0].lnum;
+ }
+ else
+ {
+ if (rex.reg_startp[0] == NULL)
+! rex.reg_startp[0] = regline + col;
+ if (rex.reg_endp[0] == NULL)
+! rex.reg_endp[0] = reginput;
+ }
+ #ifdef FEAT_SYN_HL
+ /* Package any found \z(...\) matches for export. Default is none. */
+--- 4085,4103 ----
+ }
+ if (rex.reg_endpos[0].lnum < 0)
+ {
+! rex.reg_endpos[0].lnum = rex.lnum;
+! rex.reg_endpos[0].col = (int)(rex.input - rex.line);
+ }
+ else
+ /* Use line number of "\ze". */
+! rex.lnum = rex.reg_endpos[0].lnum;
+ }
+ else
+ {
+ if (rex.reg_startp[0] == NULL)
+! rex.reg_startp[0] = rex.line + col;
+ if (rex.reg_endp[0] == NULL)
+! rex.reg_endp[0] = rex.input;
+ }
+ #ifdef FEAT_SYN_HL
+ /* Package any found \z(...\) matches for export. Default is none. */
+***************
+*** 4131,4137 ****
+ }
+ }
+ #endif
+! return 1 + reglnum;
+ }
+
+ #ifdef FEAT_MBYTE
+--- 4133,4139 ----
+ }
+ }
+ #endif
+! return 1 + rex.lnum;
+ }
+
+ #ifdef FEAT_MBYTE
+***************
+*** 4143,4151 ****
+ static int
+ reg_prev_class(void)
+ {
+! if (reginput > regline)
+! return mb_get_class_buf(reginput - 1
+! - (*mb_head_off)(regline, reginput - 1), rex.reg_buf);
+ return -1;
+ }
+ #endif
+--- 4145,4153 ----
+ static int
+ reg_prev_class(void)
+ {
+! if (rex.input > rex.line)
+! return mb_get_class_buf(rex.input - 1
+! - (*mb_head_off)(rex.line, rex.input - 1), rex.reg_buf);
+ return -1;
+ }
+ #endif
+***************
+*** 4153,4159 ****
+ static int reg_match_visual(void);
+
+ /*
+! * Return TRUE if the current reginput position matches the Visual area.
+ */
+ static int
+ reg_match_visual(void)
+--- 4155,4161 ----
+ static int reg_match_visual(void);
+
+ /*
+! * Return TRUE if the current rex.input position matches the Visual area.
+ */
+ static int
+ reg_match_visual(void)
+***************
+*** 4199,4211 ****
+ }
+ mode = curbuf->b_visual.vi_mode;
+ }
+! lnum = reglnum + rex.reg_firstlnum;
+ if (lnum < top.lnum || lnum > bot.lnum)
+ return FALSE;
+
+ if (mode == 'v')
+ {
+! col = (colnr_T)(reginput - regline);
+ if ((lnum == top.lnum && col < top.col)
+ || (lnum == bot.lnum && col >= bot.col + (*p_sel != 'e')))
+ return FALSE;
+--- 4201,4213 ----
+ }
+ mode = curbuf->b_visual.vi_mode;
+ }
+! lnum = rex.lnum + rex.reg_firstlnum;
+ if (lnum < top.lnum || lnum > bot.lnum)
+ return FALSE;
+
+ if (mode == 'v')
+ {
+! col = (colnr_T)(rex.input - rex.line);
+ if ((lnum == top.lnum && col < top.col)
+ || (lnum == bot.lnum && col >= bot.col + (*p_sel != 'e')))
+ return FALSE;
+***************
+*** 4220,4233 ****
+ end = end2;
+ if (top.col == MAXCOL || bot.col == MAXCOL)
+ end = MAXCOL;
+! cols = win_linetabsize(wp, regline, (colnr_T)(reginput - regline));
+ if (cols < start || cols > end - (*p_sel == 'e'))
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+! #define ADVANCE_REGINPUT() MB_PTR_ADV(reginput)
+
+ /*
+ * The arguments from BRACE_LIMITS are stored here. They are actually local
+--- 4222,4235 ----
+ end = end2;
+ if (top.col == MAXCOL || bot.col == MAXCOL)
+ end = MAXCOL;
+! cols = win_linetabsize(wp, rex.line, (colnr_T)(rex.input - rex.line));
+ if (cols < start || cols > end - (*p_sel == 'e'))
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+! #define ADVANCE_REGINPUT() MB_PTR_ADV(rex.input)
+
+ /*
+ * The arguments from BRACE_LIMITS are stored here. They are actually local
+***************
+*** 4247,4255 ****
+ * (that don't need to know whether the rest of the match failed) by a nested
+ * loop.
+ *
+! * Returns TRUE when there is a match. Leaves reginput and reglnum just after
+ * the last matched character.
+! * Returns FALSE when there is no match. Leaves reginput and reglnum in an
+ * undefined state!
+ */
+ static int
+--- 4249,4257 ----
+ * (that don't need to know whether the rest of the match failed) by a nested
+ * loop.
+ *
+! * Returns TRUE when there is a match. Leaves rex.input and rex.lnum just after
+ * the last matched character.
+! * Returns FALSE when there is no match. Leaves rex.input and rex.lnum in an
+ * undefined state!
+ */
+ static int
+***************
+*** 4349,4359 ****
+ op = OP(scan);
+ /* Check for character class with NL added. */
+ if (!rex.reg_line_lbr && WITH_NL(op) && REG_MULTI
+! && *reginput == NUL && reglnum <= rex.reg_maxline)
+ {
+ reg_nextline();
+ }
+! else if (rex.reg_line_lbr && WITH_NL(op) && *reginput == '\n')
+ {
+ ADVANCE_REGINPUT();
+ }
+--- 4351,4361 ----
+ op = OP(scan);
+ /* Check for character class with NL added. */
+ if (!rex.reg_line_lbr && WITH_NL(op) && REG_MULTI
+! && *rex.input == NUL && rex.lnum <= rex.reg_maxline)
+ {
+ reg_nextline();
+ }
+! else if (rex.reg_line_lbr && WITH_NL(op) && *rex.input == '\n')
+ {
+ ADVANCE_REGINPUT();
+ }
+***************
+*** 4363,4376 ****
+ op -= ADD_NL;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! c = (*mb_ptr2char)(reginput);
+ else
+ #endif
+! c = *reginput;
+ switch (op)
+ {
+ case BOL:
+! if (reginput != regline)
+ status = RA_NOMATCH;
+ break;
+
+--- 4365,4378 ----
+ op -= ADD_NL;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! c = (*mb_ptr2char)(rex.input);
+ else
+ #endif
+! c = *rex.input;
+ switch (op)
+ {
+ case BOL:
+! if (rex.input != rex.line)
+ status = RA_NOMATCH;
+ break;
+
+***************
+*** 4383,4395 ****
+ /* We're not at the beginning of the file when below the first
+ * line where we started, not at the start of the line or we
+ * didn't start at the first line of the buffer. */
+! if (reglnum != 0 || reginput != regline
+ || (REG_MULTI && rex.reg_firstlnum > 1))
+ status = RA_NOMATCH;
+ break;
+
+ case RE_EOF:
+! if (reglnum != rex.reg_maxline || c != NUL)
+ status = RA_NOMATCH;
+ break;
+
+--- 4385,4397 ----
+ /* We're not at the beginning of the file when below the first
+ * line where we started, not at the start of the line or we
+ * didn't start at the first line of the buffer. */
+! if (rex.lnum != 0 || rex.input != rex.line
+ || (REG_MULTI && rex.reg_firstlnum > 1))
+ status = RA_NOMATCH;
+ break;
+
+ case RE_EOF:
+! if (rex.lnum != rex.reg_maxline || c != NUL)
+ status = RA_NOMATCH;
+ break;
+
+***************
+*** 4397,4405 ****
+ /* Check if the buffer is in a window and compare the
+ * rex.reg_win->w_cursor position to the match position. */
+ if (rex.reg_win == NULL
+! || (reglnum + rex.reg_firstlnum
+ != rex.reg_win->w_cursor.lnum)
+! || ((colnr_T)(reginput - regline)
+ != rex.reg_win->w_cursor.col))
+ status = RA_NOMATCH;
+ break;
+--- 4399,4407 ----
+ /* Check if the buffer is in a window and compare the
+ * rex.reg_win->w_cursor position to the match position. */
+ if (rex.reg_win == NULL
+! || (rex.lnum + rex.reg_firstlnum
+ != rex.reg_win->w_cursor.lnum)
+! || ((colnr_T)(rex.input - rex.line)
+ != rex.reg_win->w_cursor.col))
+ status = RA_NOMATCH;
+ break;
+***************
+*** 4414,4426 ****
+ pos = getmark_buf(rex.reg_buf, mark, FALSE);
+ if (pos == NULL /* mark doesn't exist */
+ || pos->lnum <= 0 /* mark isn't set in reg_buf */
+! || (pos->lnum == reglnum + rex.reg_firstlnum
+! ? (pos->col == (colnr_T)(reginput - regline)
+ ? (cmp == '<' || cmp == '>')
+! : (pos->col < (colnr_T)(reginput - regline)
+ ? cmp != '>'
+ : cmp != '<'))
+! : (pos->lnum < reglnum + rex.reg_firstlnum
+ ? cmp != '>'
+ : cmp != '<')))
+ status = RA_NOMATCH;
+--- 4416,4428 ----
+ pos = getmark_buf(rex.reg_buf, mark, FALSE);
+ if (pos == NULL /* mark doesn't exist */
+ || pos->lnum <= 0 /* mark isn't set in reg_buf */
+! || (pos->lnum == rex.lnum + rex.reg_firstlnum
+! ? (pos->col == (colnr_T)(rex.input - rex.line)
+ ? (cmp == '<' || cmp == '>')
+! : (pos->col < (colnr_T)(rex.input - rex.line)
+ ? cmp != '>'
+ : cmp != '<'))
+! : (pos->lnum < rex.lnum + rex.reg_firstlnum
+ ? cmp != '>'
+ : cmp != '<')))
+ status = RA_NOMATCH;
+***************
+*** 4433,4456 ****
+ break;
+
+ case RE_LNUM:
+! if (!REG_MULTI || !re_num_cmp((long_u)(reglnum + rex.reg_firstlnum),
+ scan))
+ status = RA_NOMATCH;
+ break;
+
+ case RE_COL:
+! if (!re_num_cmp((long_u)(reginput - regline) + 1, scan))
+ status = RA_NOMATCH;
+ break;
+
+ case RE_VCOL:
+ if (!re_num_cmp((long_u)win_linetabsize(
+ rex.reg_win == NULL ? curwin : rex.reg_win,
+! regline, (colnr_T)(reginput - regline)) + 1, scan))
+ status = RA_NOMATCH;
+ break;
+
+! case BOW: /* \<word; reginput points to w */
+ if (c == NUL) /* Can't match at end of line */
+ status = RA_NOMATCH;
+ #ifdef FEAT_MBYTE
+--- 4435,4458 ----
+ break;
+
+ case RE_LNUM:
+! if (!REG_MULTI || !re_num_cmp((long_u)(rex.lnum + rex.reg_firstlnum),
+ scan))
+ status = RA_NOMATCH;
+ break;
+
+ case RE_COL:
+! if (!re_num_cmp((long_u)(rex.input - rex.line) + 1, scan))
+ status = RA_NOMATCH;
+ break;
+
+ case RE_VCOL:
+ if (!re_num_cmp((long_u)win_linetabsize(
+ rex.reg_win == NULL ? curwin : rex.reg_win,
+! rex.line, (colnr_T)(rex.input - rex.line)) + 1, scan))
+ status = RA_NOMATCH;
+ break;
+
+! case BOW: /* \<word; rex.input points to w */
+ if (c == NUL) /* Can't match at end of line */
+ status = RA_NOMATCH;
+ #ifdef FEAT_MBYTE
+***************
+*** 4459,4465 ****
+ int this_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(reginput, rex.reg_buf);
+ if (this_class <= 1)
+ status = RA_NOMATCH; /* not on a word at all */
+ else if (reg_prev_class() == this_class)
+--- 4461,4467 ----
+ int this_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(rex.input, rex.reg_buf);
+ if (this_class <= 1)
+ status = RA_NOMATCH; /* not on a word at all */
+ else if (reg_prev_class() == this_class)
+***************
+*** 4468,4481 ****
+ #endif
+ else
+ {
+! if (!vim_iswordc_buf(c, rex.reg_buf) || (reginput > regline
+! && vim_iswordc_buf(reginput[-1], rex.reg_buf)))
+ status = RA_NOMATCH;
+ }
+ break;
+
+! case EOW: /* word\>; reginput points after d */
+! if (reginput == regline) /* Can't match at start of line */
+ status = RA_NOMATCH;
+ #ifdef FEAT_MBYTE
+ else if (has_mbyte)
+--- 4470,4483 ----
+ #endif
+ else
+ {
+! if (!vim_iswordc_buf(c, rex.reg_buf) || (rex.input > rex.line
+! && vim_iswordc_buf(rex.input[-1], rex.reg_buf)))
+ status = RA_NOMATCH;
+ }
+ break;
+
+! case EOW: /* word\>; rex.input points after d */
+! if (rex.input == rex.line) /* Can't match at start of line */
+ status = RA_NOMATCH;
+ #ifdef FEAT_MBYTE
+ else if (has_mbyte)
+***************
+*** 4483,4489 ****
+ int this_class, prev_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(reginput, rex.reg_buf);
+ prev_class = reg_prev_class();
+ if (this_class == prev_class
+ || prev_class == 0 || prev_class == 1)
+--- 4485,4491 ----
+ int this_class, prev_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(rex.input, rex.reg_buf);
+ prev_class = reg_prev_class();
+ if (this_class == prev_class
+ || prev_class == 0 || prev_class == 1)
+***************
+*** 4492,4499 ****
+ #endif
+ else
+ {
+! if (!vim_iswordc_buf(reginput[-1], rex.reg_buf)
+! || (reginput[0] != NUL
+ && vim_iswordc_buf(c, rex.reg_buf)))
+ status = RA_NOMATCH;
+ }
+--- 4494,4501 ----
+ #endif
+ else
+ {
+! if (!vim_iswordc_buf(rex.input[-1], rex.reg_buf)
+! || (rex.input[0] != NUL
+ && vim_iswordc_buf(c, rex.reg_buf)))
+ status = RA_NOMATCH;
+ }
+***************
+*** 4515,4536 ****
+ break;
+
+ case SIDENT:
+! if (VIM_ISDIGIT(*reginput) || !vim_isIDc(c))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case KWORD:
+! if (!vim_iswordp_buf(reginput, rex.reg_buf))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case SKWORD:
+! if (VIM_ISDIGIT(*reginput)
+! || !vim_iswordp_buf(reginput, rex.reg_buf))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+--- 4517,4538 ----
+ break;
+
+ case SIDENT:
+! if (VIM_ISDIGIT(*rex.input) || !vim_isIDc(c))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case KWORD:
+! if (!vim_iswordp_buf(rex.input, rex.reg_buf))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case SKWORD:
+! if (VIM_ISDIGIT(*rex.input)
+! || !vim_iswordp_buf(rex.input, rex.reg_buf))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+***************
+*** 4544,4564 ****
+ break;
+
+ case SFNAME:
+! if (VIM_ISDIGIT(*reginput) || !vim_isfilec(c))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case PRINT:
+! if (!vim_isprintc(PTR2CHAR(reginput)))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case SPRINT:
+! if (VIM_ISDIGIT(*reginput) || !vim_isprintc(PTR2CHAR(reginput)))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+--- 4546,4566 ----
+ break;
+
+ case SFNAME:
+! if (VIM_ISDIGIT(*rex.input) || !vim_isfilec(c))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case PRINT:
+! if (!vim_isprintc(PTR2CHAR(rex.input)))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+ break;
+
+ case SPRINT:
+! if (VIM_ISDIGIT(*rex.input) || !vim_isprintc(PTR2CHAR(rex.input)))
+ status = RA_NOMATCH;
+ else
+ ADVANCE_REGINPUT();
+***************
+*** 4697,4708 ****
+
+ opnd = OPERAND(scan);
+ /* Inline the first byte, for speed. */
+! if (*opnd != *reginput
+ && (!rex.reg_ic || (
+ #ifdef FEAT_MBYTE
+ !enc_utf8 &&
+ #endif
+! MB_TOLOWER(*opnd) != MB_TOLOWER(*reginput))))
+ status = RA_NOMATCH;
+ else if (*opnd == NUL)
+ {
+--- 4699,4710 ----
+
+ opnd = OPERAND(scan);
+ /* Inline the first byte, for speed. */
+! if (*opnd != *rex.input
+ && (!rex.reg_ic || (
+ #ifdef FEAT_MBYTE
+ !enc_utf8 &&
+ #endif
+! MB_TOLOWER(*opnd) != MB_TOLOWER(*rex.input))))
+ status = RA_NOMATCH;
+ else if (*opnd == NUL)
+ {
+***************
+*** 4723,4729 ****
+ {
+ /* Need to match first byte again for multi-byte. */
+ len = (int)STRLEN(opnd);
+! if (cstrncmp(opnd, reginput, &len) != 0)
+ status = RA_NOMATCH;
+ }
+ #ifdef FEAT_MBYTE
+--- 4725,4731 ----
+ {
+ /* Need to match first byte again for multi-byte. */
+ len = (int)STRLEN(opnd);
+! if (cstrncmp(opnd, rex.input, &len) != 0)
+ status = RA_NOMATCH;
+ }
+ #ifdef FEAT_MBYTE
+***************
+*** 4731,4737 ****
+ * follows (skips over all composing chars). */
+ if (status != RA_NOMATCH
+ && enc_utf8
+! && UTF_COMPOSINGLIKE(reginput, reginput + len)
+ && !rex.reg_icombine
+ && OP(next) != RE_COMPOSING)
+ {
+--- 4733,4739 ----
+ * follows (skips over all composing chars). */
+ if (status != RA_NOMATCH
+ && enc_utf8
+! && UTF_COMPOSINGLIKE(rex.input, rex.input + len)
+ && !rex.reg_icombine
+ && OP(next) != RE_COMPOSING)
+ {
+***************
+*** 4742,4748 ****
+ }
+ #endif
+ if (status != RA_NOMATCH)
+! reginput += len;
+ }
+ }
+ break;
+--- 4744,4750 ----
+ }
+ #endif
+ if (status != RA_NOMATCH)
+! rex.input += len;
+ }
+ }
+ break;
+***************
+*** 4780,4789 ****
+ /* When only a composing char is given match at any
+ * position where that composing char appears. */
+ status = RA_NOMATCH;
+! for (i = 0; reginput[i] != NUL;
+! i += utf_ptr2len(reginput + i))
+ {
+! inpc = utf_ptr2char(reginput + i);
+ if (!utf_iscomposing(inpc))
+ {
+ if (i > 0)
+--- 4782,4791 ----
+ /* When only a composing char is given match at any
+ * position where that composing char appears. */
+ status = RA_NOMATCH;
+! for (i = 0; rex.input[i] != NUL;
+! i += utf_ptr2len(rex.input + i))
+ {
+! inpc = utf_ptr2char(rex.input + i);
+ if (!utf_iscomposing(inpc))
+ {
+ if (i > 0)
+***************
+*** 4792,4798 ****
+ else if (opndc == inpc)
+ {
+ /* Include all following composing chars. */
+! len = i + utfc_ptr2len(reginput + i);
+ status = RA_MATCH;
+ break;
+ }
+--- 4794,4800 ----
+ else if (opndc == inpc)
+ {
+ /* Include all following composing chars. */
+! len = i + utfc_ptr2len(rex.input + i);
+ status = RA_MATCH;
+ break;
+ }
+***************
+*** 4800,4811 ****
+ }
+ else
+ for (i = 0; i < len; ++i)
+! if (opnd[i] != reginput[i])
+ {
+ status = RA_NOMATCH;
+ break;
+ }
+! reginput += len;
+ }
+ else
+ status = RA_NOMATCH;
+--- 4802,4813 ----
+ }
+ else
+ for (i = 0; i < len; ++i)
+! if (opnd[i] != rex.input[i])
+ {
+ status = RA_NOMATCH;
+ break;
+ }
+! rex.input += len;
+ }
+ else
+ status = RA_NOMATCH;
+***************
+*** 4816,4823 ****
+ if (enc_utf8)
+ {
+ /* Skip composing characters. */
+! while (utf_iscomposing(utf_ptr2char(reginput)))
+! MB_CPTR_ADV(reginput);
+ }
+ #endif
+ break;
+--- 4818,4825 ----
+ if (enc_utf8)
+ {
+ /* Skip composing characters. */
+! while (utf_iscomposing(utf_ptr2char(rex.input)))
+! MB_CPTR_ADV(rex.input);
+ }
+ #endif
+ break;
+***************
+*** 5003,5009 ****
+ /* Compare current input with back-ref in the same
+ * line. */
+ len = (int)(rex.reg_endp[no] - rex.reg_startp[no]);
+! if (cstrncmp(rex.reg_startp[no], reginput, &len) != 0)
+ status = RA_NOMATCH;
+ }
+ }
+--- 5005,5011 ----
+ /* Compare current input with back-ref in the same
+ * line. */
+ len = (int)(rex.reg_endp[no] - rex.reg_startp[no]);
+! if (cstrncmp(rex.reg_startp[no], rex.input, &len) != 0)
+ status = RA_NOMATCH;
+ }
+ }
+***************
+*** 5017,5030 ****
+ }
+ else
+ {
+! if (rex.reg_startpos[no].lnum == reglnum
+! && rex.reg_endpos[no].lnum == reglnum)
+ {
+ /* Compare back-ref within the current line. */
+ len = rex.reg_endpos[no].col
+ - rex.reg_startpos[no].col;
+! if (cstrncmp(regline + rex.reg_startpos[no].col,
+! reginput, &len) != 0)
+ status = RA_NOMATCH;
+ }
+ else
+--- 5019,5032 ----
+ }
+ else
+ {
+! if (rex.reg_startpos[no].lnum == rex.lnum
+! && rex.reg_endpos[no].lnum == rex.lnum)
+ {
+ /* Compare back-ref within the current line. */
+ len = rex.reg_endpos[no].col
+ - rex.reg_startpos[no].col;
+! if (cstrncmp(rex.line + rex.reg_startpos[no].col,
+! rex.input, &len) != 0)
+ status = RA_NOMATCH;
+ }
+ else
+***************
+*** 5045,5051 ****
+ }
+
+ /* Matched the backref, skip over it. */
+! reginput += len;
+ }
+ break;
+
+--- 5047,5053 ----
+ }
+
+ /* Matched the backref, skip over it. */
+! rex.input += len;
+ }
+ break;
+
+***************
+*** 5069,5078 ****
+ {
+ len = (int)STRLEN(re_extmatch_in->matches[no]);
+ if (cstrncmp(re_extmatch_in->matches[no],
+! reginput, &len) != 0)
+ status = RA_NOMATCH;
+ else
+! reginput += len;
+ }
+ else
+ {
+--- 5071,5080 ----
+ {
+ len = (int)STRLEN(re_extmatch_in->matches[no]);
+ if (cstrncmp(re_extmatch_in->matches[no],
+! rex.input, &len) != 0)
+ status = RA_NOMATCH;
+ else
+! rex.input += len;
+ }
+ else
+ {
+***************
+*** 5319,5334 ****
+ case BHPOS:
+ if (REG_MULTI)
+ {
+! if (behind_pos.rs_u.pos.col != (colnr_T)(reginput - regline)
+! || behind_pos.rs_u.pos.lnum != reglnum)
+ status = RA_NOMATCH;
+ }
+! else if (behind_pos.rs_u.ptr != reginput)
+ status = RA_NOMATCH;
+ break;
+
+ case NEWL:
+! if ((c != NUL || !REG_MULTI || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ && (c != '\n' || !rex.reg_line_lbr))
+ status = RA_NOMATCH;
+--- 5321,5336 ----
+ case BHPOS:
+ if (REG_MULTI)
+ {
+! if (behind_pos.rs_u.pos.col != (colnr_T)(rex.input - rex.line)
+! || behind_pos.rs_u.pos.lnum != rex.lnum)
+ status = RA_NOMATCH;
+ }
+! else if (behind_pos.rs_u.ptr != rex.input)
+ status = RA_NOMATCH;
+ break;
+
+ case NEWL:
+! if ((c != NUL || !REG_MULTI || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ && (c != '\n' || !rex.reg_line_lbr))
+ status = RA_NOMATCH;
+***************
+*** 5562,5568 ****
+ if (limit > 0
+ && ((rp->rs_un.regsave.rs_u.pos.lnum
+ < behind_pos.rs_u.pos.lnum
+! ? (colnr_T)STRLEN(regline)
+ : behind_pos.rs_u.pos.col)
+ - rp->rs_un.regsave.rs_u.pos.col >= limit))
+ no = FAIL;
+--- 5564,5570 ----
+ if (limit > 0
+ && ((rp->rs_un.regsave.rs_u.pos.lnum
+ < behind_pos.rs_u.pos.lnum
+! ? (colnr_T)STRLEN(rex.line)
+ : behind_pos.rs_u.pos.col)
+ - rp->rs_un.regsave.rs_u.pos.col >= limit))
+ no = FAIL;
+***************
+*** 5578,5584 ****
+ {
+ reg_restore(&rp->rs_un.regsave, &backpos);
+ rp->rs_un.regsave.rs_u.pos.col =
+! (colnr_T)STRLEN(regline);
+ }
+ }
+ else
+--- 5580,5586 ----
+ {
+ reg_restore(&rp->rs_un.regsave, &backpos);
+ rp->rs_un.regsave.rs_u.pos.col =
+! (colnr_T)STRLEN(rex.line);
+ }
+ }
+ else
+***************
+*** 5600,5610 ****
+ }
+ else
+ {
+! if (rp->rs_un.regsave.rs_u.ptr == regline)
+ no = FAIL;
+ else
+ {
+! MB_PTR_BACK(regline, rp->rs_un.regsave.rs_u.ptr);
+ if (limit > 0 && (long)(behind_pos.rs_u.ptr
+ - rp->rs_un.regsave.rs_u.ptr) > limit)
+ no = FAIL;
+--- 5602,5612 ----
+ }
+ else
+ {
+! if (rp->rs_un.regsave.rs_u.ptr == rex.line)
+ no = FAIL;
+ else
+ {
+! MB_PTR_BACK(rex.line, rp->rs_un.regsave.rs_u.ptr);
+ if (limit > 0 && (long)(behind_pos.rs_u.ptr
+ - rp->rs_un.regsave.rs_u.ptr) > limit)
+ no = FAIL;
+***************
+*** 5678,5697 ****
+ * didn't match -- back up one char. */
+ if (--rst->count < rst->minval)
+ break;
+! if (reginput == regline)
+ {
+ /* backup to last char of previous line */
+! --reglnum;
+! regline = reg_getline(reglnum);
+ /* Just in case regrepeat() didn't count
+ * right. */
+! if (regline == NULL)
+ break;
+! reginput = regline + STRLEN(regline);
+ fast_breakcheck();
+ }
+ else
+! MB_PTR_BACK(regline, reginput);
+ }
+ else
+ {
+--- 5680,5699 ----
+ * didn't match -- back up one char. */
+ if (--rst->count < rst->minval)
+ break;
+! if (rex.input == rex.line)
+ {
+ /* backup to last char of previous line */
+! --rex.lnum;
+! rex.line = reg_getline(rex.lnum);
+ /* Just in case regrepeat() didn't count
+ * right. */
+! if (rex.line == NULL)
+ break;
+! rex.input = rex.line + STRLEN(rex.line);
+ fast_breakcheck();
+ }
+ else
+! MB_PTR_BACK(rex.line, rex.input);
+ }
+ else
+ {
+***************
+*** 5711,5718 ****
+ status = RA_NOMATCH;
+
+ /* If it could match, try it. */
+! if (rst->nextb == NUL || *reginput == rst->nextb
+! || *reginput == rst->nextb_ic)
+ {
+ reg_save(&rp->rs_un.regsave, &backpos);
+ scan = regnext(rp->rs_scan);
+--- 5713,5720 ----
+ status = RA_NOMATCH;
+
+ /* If it could match, try it. */
+! if (rst->nextb == NUL || *rex.input == rst->nextb
+! || *rex.input == rst->nextb_ic)
+ {
+ reg_save(&rp->rs_un.regsave, &backpos);
+ scan = regnext(rp->rs_scan);
+***************
+*** 5807,5813 ****
+
+ /*
+ * regrepeat - repeatedly match something simple, return how many.
+! * Advances reginput (and reglnum) to just after the matched chars.
+ */
+ static int
+ regrepeat(
+--- 5809,5815 ----
+
+ /*
+ * regrepeat - repeatedly match something simple, return how many.
+! * Advances rex.input (and rex.lnum) to just after the matched chars.
+ */
+ static int
+ regrepeat(
+***************
+*** 5820,5826 ****
+ int mask;
+ int testval = 0;
+
+! scan = reginput; /* Make local copy of reginput for speed. */
+ opnd = OPERAND(p);
+ switch (OP(p))
+ {
+--- 5822,5828 ----
+ int mask;
+ int testval = 0;
+
+! scan = rex.input; /* Make local copy of rex.input for speed. */
+ opnd = OPERAND(p);
+ switch (OP(p))
+ {
+***************
+*** 5835,5846 ****
+ ++count;
+ MB_PTR_ADV(scan);
+ }
+! if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr || count == maxcount)
+ break;
+ ++count; /* count the line-break */
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 5837,5848 ----
+ ++count;
+ MB_PTR_ADV(scan);
+ }
+! if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr || count == maxcount)
+ break;
+ ++count; /* count the line-break */
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 5860,5870 ****
+ }
+ else if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 5862,5872 ----
+ }
+ else if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 5891,5901 ****
+ }
+ else if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 5893,5903 ----
+ }
+ else if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 5921,5931 ****
+ }
+ else if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 5923,5933 ----
+ }
+ else if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 5947,5957 ****
+ {
+ if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 5949,5959 ----
+ {
+ if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 5979,5989 ****
+ #endif
+ if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 5981,5991 ----
+ #endif
+ if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 6144,6154 ****
+ #endif
+ if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || reglnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 6146,6156 ----
+ #endif
+ if (*scan == NUL)
+ {
+! if (!REG_MULTI || !WITH_NL(OP(p)) || rex.lnum > rex.reg_maxline
+ || rex.reg_line_lbr)
+ break;
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 6174,6180 ****
+
+ case NEWL:
+ while (count < maxcount
+! && ((*scan == NUL && reglnum <= rex.reg_maxline
+ && !rex.reg_line_lbr && REG_MULTI)
+ || (*scan == '\n' && rex.reg_line_lbr)))
+ {
+--- 6176,6182 ----
+
+ case NEWL:
+ while (count < maxcount
+! && ((*scan == NUL && rex.lnum <= rex.reg_maxline
+ && !rex.reg_line_lbr && REG_MULTI)
+ || (*scan == '\n' && rex.reg_line_lbr)))
+ {
+***************
+*** 6183,6189 ****
+ ADVANCE_REGINPUT();
+ else
+ reg_nextline();
+! scan = reginput;
+ if (got_int)
+ break;
+ }
+--- 6185,6191 ----
+ ADVANCE_REGINPUT();
+ else
+ reg_nextline();
+! scan = rex.input;
+ if (got_int)
+ break;
+ }
+***************
+*** 6197,6203 ****
+ break;
+ }
+
+! reginput = scan;
+
+ return (int)count;
+ }
+--- 6199,6205 ----
+ break;
+ }
+
+! rex.input = scan;
+
+ return (int)count;
+ }
+***************
+*** 6255,6261 ****
+ static void
+ cleanup_subexpr(void)
+ {
+! if (need_clear_subexpr)
+ {
+ if (REG_MULTI)
+ {
+--- 6257,6263 ----
+ static void
+ cleanup_subexpr(void)
+ {
+! if (rex.need_clear_subexpr)
+ {
+ if (REG_MULTI)
+ {
+***************
+*** 6268,6274 ****
+ vim_memset(rex.reg_startp, 0, sizeof(char_u *) * NSUBEXP);
+ vim_memset(rex.reg_endp, 0, sizeof(char_u *) * NSUBEXP);
+ }
+! need_clear_subexpr = FALSE;
+ }
+ }
+
+--- 6270,6276 ----
+ vim_memset(rex.reg_startp, 0, sizeof(char_u *) * NSUBEXP);
+ vim_memset(rex.reg_endp, 0, sizeof(char_u *) * NSUBEXP);
+ }
+! rex.need_clear_subexpr = FALSE;
+ }
+ }
+
+***************
+*** 6276,6282 ****
+ static void
+ cleanup_zsubexpr(void)
+ {
+! if (need_clear_zsubexpr)
+ {
+ if (REG_MULTI)
+ {
+--- 6278,6284 ----
+ static void
+ cleanup_zsubexpr(void)
+ {
+! if (rex.need_clear_zsubexpr)
+ {
+ if (REG_MULTI)
+ {
+***************
+*** 6289,6295 ****
+ vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP);
+ vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP);
+ }
+! need_clear_zsubexpr = FALSE;
+ }
+ }
+ #endif
+--- 6291,6297 ----
+ vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP);
+ vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP);
+ }
+! rex.need_clear_zsubexpr = FALSE;
+ }
+ }
+ #endif
+***************
+*** 6303,6312 ****
+ {
+ int i;
+
+! /* When "need_clear_subexpr" is set we don't need to save the values, only
+ * remember that this flag needs to be set again when restoring. */
+! bp->save_need_clear_subexpr = need_clear_subexpr;
+! if (!need_clear_subexpr)
+ {
+ for (i = 0; i < NSUBEXP; ++i)
+ {
+--- 6305,6314 ----
+ {
+ int i;
+
+! /* When "rex.need_clear_subexpr" is set we don't need to save the values, only
+ * remember that this flag needs to be set again when restoring. */
+! bp->save_need_clear_subexpr = rex.need_clear_subexpr;
+! if (!rex.need_clear_subexpr)
+ {
+ for (i = 0; i < NSUBEXP; ++i)
+ {
+***************
+*** 6333,6340 ****
+ int i;
+
+ /* Only need to restore saved values when they are not to be cleared. */
+! need_clear_subexpr = bp->save_need_clear_subexpr;
+! if (!need_clear_subexpr)
+ {
+ for (i = 0; i < NSUBEXP; ++i)
+ {
+--- 6335,6342 ----
+ int i;
+
+ /* Only need to restore saved values when they are not to be cleared. */
+! rex.need_clear_subexpr = bp->save_need_clear_subexpr;
+! if (!rex.need_clear_subexpr)
+ {
+ for (i = 0; i < NSUBEXP; ++i)
+ {
+***************
+*** 6353,6365 ****
+ }
+
+ /*
+! * Advance reglnum, regline and reginput to the next line.
+ */
+ static void
+ reg_nextline(void)
+ {
+! regline = reg_getline(++reglnum);
+! reginput = regline;
+ fast_breakcheck();
+ }
+
+--- 6355,6367 ----
+ }
+
+ /*
+! * Advance rex.lnum, rex.line and rex.input to the next line.
+ */
+ static void
+ reg_nextline(void)
+ {
+! rex.line = reg_getline(++rex.lnum);
+! rex.input = rex.line;
+ fast_breakcheck();
+ }
+
+***************
+*** 6371,6381 ****
+ {
+ if (REG_MULTI)
+ {
+! save->rs_u.pos.col = (colnr_T)(reginput - regline);
+! save->rs_u.pos.lnum = reglnum;
+ }
+ else
+! save->rs_u.ptr = reginput;
+ save->rs_len = gap->ga_len;
+ }
+
+--- 6373,6383 ----
+ {
+ if (REG_MULTI)
+ {
+! save->rs_u.pos.col = (colnr_T)(rex.input - rex.line);
+! save->rs_u.pos.lnum = rex.lnum;
+ }
+ else
+! save->rs_u.ptr = rex.input;
+ save->rs_len = gap->ga_len;
+ }
+
+***************
+*** 6387,6403 ****
+ {
+ if (REG_MULTI)
+ {
+! if (reglnum != save->rs_u.pos.lnum)
+ {
+ /* only call reg_getline() when the line number changed to save
+ * a bit of time */
+! reglnum = save->rs_u.pos.lnum;
+! regline = reg_getline(reglnum);
+ }
+! reginput = regline + save->rs_u.pos.col;
+ }
+ else
+! reginput = save->rs_u.ptr;
+ gap->ga_len = save->rs_len;
+ }
+
+--- 6389,6405 ----
+ {
+ if (REG_MULTI)
+ {
+! if (rex.lnum != save->rs_u.pos.lnum)
+ {
+ /* only call reg_getline() when the line number changed to save
+ * a bit of time */
+! rex.lnum = save->rs_u.pos.lnum;
+! rex.line = reg_getline(rex.lnum);
+ }
+! rex.input = rex.line + save->rs_u.pos.col;
+ }
+ else
+! rex.input = save->rs_u.ptr;
+ gap->ga_len = save->rs_len;
+ }
+
+***************
+*** 6408,6416 ****
+ reg_save_equal(regsave_T *save)
+ {
+ if (REG_MULTI)
+! return reglnum == save->rs_u.pos.lnum
+! && reginput == regline + save->rs_u.pos.col;
+! return reginput == save->rs_u.ptr;
+ }
+
+ /*
+--- 6410,6418 ----
+ reg_save_equal(regsave_T *save)
+ {
+ if (REG_MULTI)
+! return rex.lnum == save->rs_u.pos.lnum
+! && rex.input == rex.line + save->rs_u.pos.col;
+! return rex.input == save->rs_u.ptr;
+ }
+
+ /*
+***************
+*** 6424,6438 ****
+ save_se_multi(save_se_T *savep, lpos_T *posp)
+ {
+ savep->se_u.pos = *posp;
+! posp->lnum = reglnum;
+! posp->col = (colnr_T)(reginput - regline);
+ }
+
+ static void
+ save_se_one(save_se_T *savep, char_u **pp)
+ {
+ savep->se_u.ptr = *pp;
+! *pp = reginput;
+ }
+
+ /*
+--- 6426,6440 ----
+ save_se_multi(save_se_T *savep, lpos_T *posp)
+ {
+ savep->se_u.pos = *posp;
+! posp->lnum = rex.lnum;
+! posp->col = (colnr_T)(rex.input - rex.line);
+ }
+
+ static void
+ save_se_one(save_se_T *savep, char_u **pp)
+ {
+ savep->se_u.ptr = *pp;
+! *pp = rex.input;
+ }
+
+ /*
+***************
+*** 6475,6483 ****
+ {
+ /* Since getting one line may invalidate the other, need to make copy.
+ * Slow! */
+! if (regline != reg_tofree)
+ {
+! len = (int)STRLEN(regline);
+ if (reg_tofree == NULL || len >= (int)reg_tofreelen)
+ {
+ len += 50; /* get some extra */
+--- 6477,6485 ----
+ {
+ /* Since getting one line may invalidate the other, need to make copy.
+ * Slow! */
+! if (rex.line != reg_tofree)
+ {
+! len = (int)STRLEN(rex.line);
+ if (reg_tofree == NULL || len >= (int)reg_tofreelen)
+ {
+ len += 50; /* get some extra */
+***************
+*** 6487,6495 ****
+ return RA_FAIL; /* out of memory!*/
+ reg_tofreelen = len;
+ }
+! STRCPY(reg_tofree, regline);
+! reginput = reg_tofree + (reginput - regline);
+! regline = reg_tofree;
+ }
+
+ /* Get the line to compare with. */
+--- 6489,6497 ----
+ return RA_FAIL; /* out of memory!*/
+ reg_tofreelen = len;
+ }
+! STRCPY(reg_tofree, rex.line);
+! rex.input = reg_tofree + (rex.input - rex.line);
+! rex.line = reg_tofree;
+ }
+
+ /* Get the line to compare with. */
+***************
+*** 6499,6511 ****
+ else
+ len = (int)STRLEN(p + ccol);
+
+! if (cstrncmp(p + ccol, reginput, &len) != 0)
+ return RA_NOMATCH; /* doesn't match */
+ if (bytelen != NULL)
+ *bytelen += len;
+ if (clnum == end_lnum)
+ break; /* match and at end! */
+! if (reglnum >= rex.reg_maxline)
+ return RA_NOMATCH; /* text too short */
+
+ /* Advance to next line. */
+--- 6501,6513 ----
+ else
+ len = (int)STRLEN(p + ccol);
+
+! if (cstrncmp(p + ccol, rex.input, &len) != 0)
+ return RA_NOMATCH; /* doesn't match */
+ if (bytelen != NULL)
+ *bytelen += len;
+ if (clnum == end_lnum)
+ break; /* match and at end! */
+! if (rex.lnum >= rex.reg_maxline)
+ return RA_NOMATCH; /* text too short */
+
+ /* Advance to next line. */
+***************
+*** 6518,6524 ****
+ return RA_FAIL;
+ }
+
+! /* found a match! Note that regline may now point to a copy of the line,
+ * that should not matter. */
+ return RA_MATCH;
+ }
+--- 6520,6526 ----
+ return RA_FAIL;
+ }
+
+! /* found a match! Note that rex.line may now point to a copy of the line,
+ * that should not matter. */
+ return RA_MATCH;
+ }
+***************
+*** 8144,8151 ****
+--- 8146,8155 ----
+ regexp_engine = AUTOMATIC_ENGINE;
+ }
+ }
++ #ifdef DEBUG
+ bt_regengine.expr = expr;
+ nfa_regengine.expr = expr;
++ #endif
+
+ /*
+ * First try the NFA engine, unless backtracking was requested.
+***************
+*** 8243,8252 ****
+ regexec_T rex_save;
+ int rex_in_use_save = rex_in_use;
+
+ if (rex_in_use)
+! /* Being called recursively, save the state. */
+ rex_save = rex;
+ rex_in_use = TRUE;
+ rex.reg_startp = NULL;
+ rex.reg_endp = NULL;
+ rex.reg_startpos = NULL;
+--- 8247,8265 ----
+ regexec_T rex_save;
+ int rex_in_use_save = rex_in_use;
+
++ // Cannot use the same prog recursively, it contains state.
++ if (rmp->regprog->re_in_use)
++ {
++ EMSG(_(e_recursive));
++ return FALSE;
++ }
++ rmp->regprog->re_in_use = TRUE;
++
+ if (rex_in_use)
+! // Being called recursively, save the state.
+ rex_save = rex;
+ rex_in_use = TRUE;
++
+ rex.reg_startp = NULL;
+ rex.reg_endp = NULL;
+ rex.reg_startpos = NULL;
+***************
+*** 8281,8286 ****
+--- 8294,8300 ----
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use)
+ rex = rex_save;
++ rmp->regprog->re_in_use = FALSE;
+
+ return result > 0;
+ }
+***************
+*** 8353,8358 ****
+--- 8367,8380 ----
+ regexec_T rex_save;
+ int rex_in_use_save = rex_in_use;
+
++ // Cannot use the same prog recursively, it contains state.
++ if (rmp->regprog->re_in_use)
++ {
++ EMSG(_(e_recursive));
++ return FALSE;
++ }
++ rmp->regprog->re_in_use = TRUE;
++
+ if (rex_in_use)
+ /* Being called recursively, save the state. */
+ rex_save = rex;
+***************
+*** 8397,8402 ****
+--- 8419,8425 ----
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use)
+ rex = rex_save;
++ rmp->regprog->re_in_use = FALSE;
+
+ return result <= 0 ? 0 : result;
+ }
+*** ../vim-8.1.0191/src/regexp.h 2017-06-17 17:52:18.000000000 +0200
+--- src/regexp.h 2018-07-17 05:08:49.564483204 +0200
+***************
+*** 50,57 ****
+ {
+ regengine_T *engine;
+ unsigned regflags;
+! unsigned re_engine; /* automatic, backtracking or nfa engine */
+! unsigned re_flags; /* second argument for vim_regcomp() */
+ } regprog_T;
+
+ /*
+--- 50,58 ----
+ {
+ regengine_T *engine;
+ unsigned regflags;
+! unsigned re_engine; // automatic, backtracking or nfa engine
+! unsigned re_flags; // second argument for vim_regcomp()
+! int re_in_use; // prog is being executed
+ } regprog_T;
+
+ /*
+***************
+*** 65,71 ****
+ regengine_T *engine;
+ unsigned regflags;
+ unsigned re_engine;
+! unsigned re_flags; /* second argument for vim_regcomp() */
+
+ int regstart;
+ char_u reganch;
+--- 66,73 ----
+ regengine_T *engine;
+ unsigned regflags;
+ unsigned re_engine;
+! unsigned re_flags;
+! int re_in_use;
+
+ int regstart;
+ char_u reganch;
+***************
+*** 101,107 ****
+ regengine_T *engine;
+ unsigned regflags;
+ unsigned re_engine;
+! unsigned re_flags; /* second argument for vim_regcomp() */
+
+ nfa_state_T *start; /* points into state[] */
+
+--- 103,110 ----
+ regengine_T *engine;
+ unsigned regflags;
+ unsigned re_engine;
+! unsigned re_flags;
+! int re_in_use;
+
+ nfa_state_T *start; /* points into state[] */
+
+*** ../vim-8.1.0191/src/regexp_nfa.c 2018-07-08 19:07:16.159415508 +0200
+--- src/regexp_nfa.c 2018-07-17 05:08:49.568483181 +0200
+***************
+*** 244,284 ****
+ static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c");
+ static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %ld");
+
+! /* re_flags passed to nfa_regcomp() */
+! static int nfa_re_flags;
+!
+! /* NFA regexp \ze operator encountered. */
+! static int nfa_has_zend;
+!
+! /* NFA regexp \1 .. \9 encountered. */
+! static int nfa_has_backref;
+!
+! #ifdef FEAT_SYN_HL
+! /* NFA regexp has \z( ), set zsubexpr. */
+! static int nfa_has_zsubexpr;
+! #endif
+!
+! /* Number of sub expressions actually being used during execution. 1 if only
+! * the whole match (subexpr 0) is used. */
+! static int nfa_nsubexpr;
+!
+! static int *post_start; /* holds the postfix form of r.e. */
+ static int *post_end;
+ static int *post_ptr;
+!
+! static int nstate; /* Number of states in the NFA. Also used when
+! * executing. */
+! static int istate; /* Index in the state vector, used in alloc_state() */
+
+ /* If not NULL match must end at this position */
+ static save_se_T *nfa_endp = NULL;
+
+- /* listid is global, so that it increases on recursive calls to
+- * nfa_regmatch(), which means we don't have to clear the lastlist field of
+- * all the states. */
+- static int nfa_listid;
+- static int nfa_alt_listid;
+-
+ /* 0 for first call to nfa_regmatch(), 1 for recursive call. */
+ static int nfa_ll_index = 0;
+
+--- 244,260 ----
+ static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c");
+ static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %ld");
+
+! // Variables only used in nfa_regcomp() and descendants.
+! static int nfa_re_flags; // re_flags passed to nfa_regcomp()
+! static int *post_start; // holds the postfix form of r.e.
+ static int *post_end;
+ static int *post_ptr;
+! static int nstate; // Number of states in the NFA.
+! static int istate; // Index in the state vector, used in alloc_state()
+
+ /* If not NULL match must end at this position */
+ static save_se_T *nfa_endp = NULL;
+
+ /* 0 for first call to nfa_regmatch(), 1 for recursive call. */
+ static int nfa_ll_index = 0;
+
+***************
+*** 326,333 ****
+ return FAIL;
+ post_ptr = post_start;
+ post_end = post_start + nstate_max;
+! nfa_has_zend = FALSE;
+! nfa_has_backref = FALSE;
+
+ /* shared with BT engine */
+ regcomp_start(expr, re_flags);
+--- 302,309 ----
+ return FAIL;
+ post_ptr = post_start;
+ post_end = post_start + nstate_max;
+! rex.nfa_has_zend = FALSE;
+! rex.nfa_has_backref = FALSE;
+
+ /* shared with BT engine */
+ regcomp_start(expr, re_flags);
+***************
+*** 1422,1428 ****
+ if (!seen_endbrace(refnum + 1))
+ return FAIL;
+ EMIT(NFA_BACKREF1 + refnum);
+! nfa_has_backref = TRUE;
+ }
+ break;
+
+--- 1398,1404 ----
+ if (!seen_endbrace(refnum + 1))
+ return FAIL;
+ EMIT(NFA_BACKREF1 + refnum);
+! rex.nfa_has_backref = TRUE;
+ }
+ break;
+
+***************
+*** 1437,1443 ****
+ break;
+ case 'e':
+ EMIT(NFA_ZEND);
+! nfa_has_zend = TRUE;
+ if (re_mult_next("\\ze") == FAIL)
+ return FAIL;
+ break;
+--- 1413,1419 ----
+ break;
+ case 'e':
+ EMIT(NFA_ZEND);
+! rex.nfa_has_zend = TRUE;
+ if (re_mult_next("\\ze") == FAIL)
+ return FAIL;
+ break;
+***************
+*** 1455,1461 ****
+ if ((reg_do_extmatch & REX_USE) == 0)
+ EMSG_RET_FAIL(_(e_z1_not_allowed));
+ EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
+! /* No need to set nfa_has_backref, the sub-matches don't
+ * change when \z1 .. \z9 matches or not. */
+ re_has_z = REX_USE;
+ break;
+--- 1431,1437 ----
+ if ((reg_do_extmatch & REX_USE) == 0)
+ EMSG_RET_FAIL(_(e_z1_not_allowed));
+ EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
+! /* No need to set rex.nfa_has_backref, the sub-matches don't
+ * change when \z1 .. \z9 matches or not. */
+ re_has_z = REX_USE;
+ break;
+***************
+*** 2920,2930 ****
+ if (df)
+ {
+ fprintf(df, "Error popping the stack!\n");
+! #ifdef DEBUG
+ fprintf(df, "Current regexp is \"%s\"\n", nfa_regengine.expr);
+! #endif
+ fprintf(df, "Postfix form is: ");
+! #ifdef DEBUG
+ for (p2 = postfix; p2 < end; p2++)
+ {
+ nfa_set_code(*p2);
+--- 2896,2906 ----
+ if (df)
+ {
+ fprintf(df, "Error popping the stack!\n");
+! # ifdef DEBUG
+ fprintf(df, "Current regexp is \"%s\"\n", nfa_regengine.expr);
+! # endif
+ fprintf(df, "Postfix form is: ");
+! # ifdef DEBUG
+ for (p2 = postfix; p2 < end; p2++)
+ {
+ nfa_set_code(*p2);
+***************
+*** 2937,2943 ****
+ nfa_set_code(*p2);
+ fprintf(df, "%s, ", code);
+ }
+! #else
+ for (p2 = postfix; p2 < end; p2++)
+ {
+ fprintf(df, "%d, ", *p2);
+--- 2913,2919 ----
+ nfa_set_code(*p2);
+ fprintf(df, "%s, ", code);
+ }
+! # else
+ for (p2 = postfix; p2 < end; p2++)
+ {
+ fprintf(df, "%d, ", *p2);
+***************
+*** 2947,2953 ****
+ {
+ fprintf(df, "%d, ", *p2);
+ }
+! #endif
+ fprintf(df, "\n--------------------------\n");
+ fclose(df);
+ }
+--- 2923,2929 ----
+ {
+ fprintf(df, "%d, ", *p2);
+ }
+! # endif
+ fprintf(df, "\n--------------------------\n");
+ fclose(df);
+ }
+***************
+*** 3887,3893 ****
+ {
+ log_subexpr(&subs->norm);
+ # ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ log_subexpr(&subs->synt);
+ # endif
+ }
+--- 3863,3869 ----
+ {
+ log_subexpr(&subs->norm);
+ # ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ log_subexpr(&subs->synt);
+ # endif
+ }
+***************
+*** 3927,3933 ****
+ else
+ {
+ sprintf(buf, " PIM col %d", REG_MULTI ? (int)pim->end.pos.col
+! : (int)(pim->end.ptr - reginput));
+ }
+ return buf;
+ }
+--- 3903,3909 ----
+ else
+ {
+ sprintf(buf, " PIM col %d", REG_MULTI ? (int)pim->end.pos.col
+! : (int)(pim->end.ptr - rex.input));
+ }
+ return buf;
+ }
+***************
+*** 3955,3961 ****
+ to->state = from->state;
+ copy_sub(&to->subs.norm, &from->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub(&to->subs.synt, &from->subs.synt);
+ #endif
+ to->end = from->end;
+--- 3931,3937 ----
+ to->state = from->state;
+ copy_sub(&to->subs.norm, &from->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub(&to->subs.synt, &from->subs.synt);
+ #endif
+ to->end = from->end;
+***************
+*** 3967,3975 ****
+ if (REG_MULTI)
+ /* Use 0xff to set lnum to -1 */
+ vim_memset(sub->list.multi, 0xff,
+! sizeof(struct multipos) * nfa_nsubexpr);
+ else
+! vim_memset(sub->list.line, 0, sizeof(struct linepos) * nfa_nsubexpr);
+ sub->in_use = 0;
+ }
+
+--- 3943,3952 ----
+ if (REG_MULTI)
+ /* Use 0xff to set lnum to -1 */
+ vim_memset(sub->list.multi, 0xff,
+! sizeof(struct multipos) * rex.nfa_nsubexpr);
+ else
+! vim_memset(sub->list.line, 0,
+! sizeof(struct linepos) * rex.nfa_nsubexpr);
+ sub->in_use = 0;
+ }
+
+***************
+*** 4022,4028 ****
+ static void
+ copy_ze_off(regsub_T *to, regsub_T *from)
+ {
+! if (nfa_has_zend)
+ {
+ if (REG_MULTI)
+ {
+--- 3999,4005 ----
+ static void
+ copy_ze_off(regsub_T *to, regsub_T *from)
+ {
+! if (rex.nfa_has_zend)
+ {
+ if (REG_MULTI)
+ {
+***************
+*** 4073,4079 ****
+ != sub2->list.multi[i].start_col)
+ return FALSE;
+
+! if (nfa_has_backref)
+ {
+ if (i < sub1->in_use)
+ s1 = sub1->list.multi[i].end_lnum;
+--- 4050,4056 ----
+ != sub2->list.multi[i].start_col)
+ return FALSE;
+
+! if (rex.nfa_has_backref)
+ {
+ if (i < sub1->in_use)
+ s1 = sub1->list.multi[i].end_lnum;
+***************
+*** 4105,4111 ****
+ sp2 = NULL;
+ if (sp1 != sp2)
+ return FALSE;
+! if (nfa_has_backref)
+ {
+ if (i < sub1->in_use)
+ sp1 = sub1->list.line[i].end;
+--- 4082,4088 ----
+ sp2 = NULL;
+ if (sp1 != sp2)
+ return FALSE;
+! if (rex.nfa_has_backref)
+ {
+ if (i < sub1->in_use)
+ sp1 = sub1->list.line[i].end;
+***************
+*** 4139,4145 ****
+ else if (REG_MULTI)
+ col = sub->list.multi[0].start_col;
+ else
+! col = (int)(sub->list.line[0].start - regline);
+ nfa_set_code(state->c);
+ fprintf(log_fd, "> %s state %d to list %d. char %d: %s (start col %d)%s\n",
+ action, abs(state->id), lid, state->c, code, col,
+--- 4116,4122 ----
+ else if (REG_MULTI)
+ col = sub->list.multi[0].start_col;
+ else
+! col = (int)(sub->list.line[0].start - rex.line);
+ nfa_set_code(state->c);
+ fprintf(log_fd, "> %s state %d to list %d. char %d: %s (start col %d)%s\n",
+ action, abs(state->id), lid, state->c, code, col,
+***************
+*** 4167,4173 ****
+ if (thread->state->id == state->id
+ && sub_equal(&thread->subs.norm, &subs->norm)
+ #ifdef FEAT_SYN_HL
+! && (!nfa_has_zsubexpr
+ || sub_equal(&thread->subs.synt, &subs->synt))
+ #endif
+ && pim_equal(&thread->pim, pim))
+--- 4144,4150 ----
+ if (thread->state->id == state->id
+ && sub_equal(&thread->subs.norm, &subs->norm)
+ #ifdef FEAT_SYN_HL
+! && (!rex.nfa_has_zsubexpr
+ || sub_equal(&thread->subs.synt, &subs->synt))
+ #endif
+ && pim_equal(&thread->pim, pim))
+***************
+*** 4306,4312 ****
+ {
+ if (state->lastlist[nfa_ll_index] == l->id)
+ {
+! if (!nfa_has_backref || has_state_with_pos(l, state, subs, NULL))
+ return TRUE;
+ }
+ return FALSE;
+--- 4283,4289 ----
+ {
+ if (state->lastlist[nfa_ll_index] == l->id)
+ {
+! if (!rex.nfa_has_backref || has_state_with_pos(l, state, subs, NULL))
+ return TRUE;
+ }
+ return FALSE;
+***************
+*** 4390,4400 ****
+ /* "^" won't match past end-of-line, don't bother trying.
+ * Except when at the end of the line, or when we are going to the
+ * next line for a look-behind match. */
+! if (reginput > regline
+! && *reginput != NUL
+ && (nfa_endp == NULL
+ || !REG_MULTI
+! || reglnum == nfa_endp->se_u.pos.lnum))
+ goto skip_add;
+ /* FALLTHROUGH */
+
+--- 4367,4377 ----
+ /* "^" won't match past end-of-line, don't bother trying.
+ * Except when at the end of the line, or when we are going to the
+ * next line for a look-behind match. */
+! if (rex.input > rex.line
+! && *rex.input != NUL
+ && (nfa_endp == NULL
+ || !REG_MULTI
+! || rex.lnum == nfa_endp->se_u.pos.lnum))
+ goto skip_add;
+ /* FALLTHROUGH */
+
+***************
+*** 4432,4438 ****
+ * unless it is an MOPEN that is used for a backreference or
+ * when there is a PIM. For NFA_MATCH check the position,
+ * lower position is preferred. */
+! if (!nfa_has_backref && pim == NULL && !l->has_pim
+ && state->c != NFA_MATCH)
+ {
+ /* When called from addstate_here() do insert before
+--- 4409,4415 ----
+ * unless it is an MOPEN that is used for a backreference or
+ * when there is a PIM. For NFA_MATCH check the position,
+ * lower position is preferred. */
+! if (!rex.nfa_has_backref && pim == NULL && !l->has_pim
+ && state->c != NFA_MATCH)
+ {
+ /* When called from addstate_here() do insert before
+***************
+*** 4477,4483 ****
+ * copy before it becomes invalid. */
+ copy_sub(&temp_subs.norm, &subs->norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub(&temp_subs.synt, &subs->synt);
+ #endif
+ subs = &temp_subs;
+--- 4454,4460 ----
+ * copy before it becomes invalid. */
+ copy_sub(&temp_subs.norm, &subs->norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub(&temp_subs.synt, &subs->synt);
+ #endif
+ subs = &temp_subs;
+***************
+*** 4501,4507 ****
+ }
+ copy_sub(&thread->subs.norm, &subs->norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub(&thread->subs.synt, &subs->synt);
+ #endif
+ #ifdef ENABLE_LOG
+--- 4478,4484 ----
+ }
+ copy_sub(&thread->subs.norm, &subs->norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub(&thread->subs.synt, &subs->synt);
+ #endif
+ #ifdef ENABLE_LOG
+***************
+*** 4597,4610 ****
+ }
+ if (off == -1)
+ {
+! sub->list.multi[subidx].start_lnum = reglnum + 1;
+ sub->list.multi[subidx].start_col = 0;
+ }
+ else
+ {
+! sub->list.multi[subidx].start_lnum = reglnum;
+ sub->list.multi[subidx].start_col =
+! (colnr_T)(reginput - regline + off);
+ }
+ sub->list.multi[subidx].end_lnum = -1;
+ }
+--- 4574,4587 ----
+ }
+ if (off == -1)
+ {
+! sub->list.multi[subidx].start_lnum = rex.lnum + 1;
+ sub->list.multi[subidx].start_col = 0;
+ }
+ else
+ {
+! sub->list.multi[subidx].start_lnum = rex.lnum;
+ sub->list.multi[subidx].start_col =
+! (colnr_T)(rex.input - rex.line + off);
+ }
+ sub->list.multi[subidx].end_lnum = -1;
+ }
+***************
+*** 4625,4631 ****
+ }
+ sub->in_use = subidx + 1;
+ }
+! sub->list.line[subidx].start = reginput + off;
+ }
+
+ subs = addstate(l, state->out, subs, pim, off_arg);
+--- 4602,4608 ----
+ }
+ sub->in_use = subidx + 1;
+ }
+! sub->list.line[subidx].start = rex.input + off;
+ }
+
+ subs = addstate(l, state->out, subs, pim, off_arg);
+***************
+*** 4649,4655 ****
+ break;
+
+ case NFA_MCLOSE:
+! if (nfa_has_zend && (REG_MULTI
+ ? subs->norm.list.multi[0].end_lnum >= 0
+ : subs->norm.list.line[0].end != NULL))
+ {
+--- 4626,4632 ----
+ break;
+
+ case NFA_MCLOSE:
+! if (rex.nfa_has_zend && (REG_MULTI
+ ? subs->norm.list.multi[0].end_lnum >= 0
+ : subs->norm.list.line[0].end != NULL))
+ {
+***************
+*** 4708,4721 ****
+ save_multipos = sub->list.multi[subidx];
+ if (off == -1)
+ {
+! sub->list.multi[subidx].end_lnum = reglnum + 1;
+ sub->list.multi[subidx].end_col = 0;
+ }
+ else
+ {
+! sub->list.multi[subidx].end_lnum = reglnum;
+ sub->list.multi[subidx].end_col =
+! (colnr_T)(reginput - regline + off);
+ }
+ /* avoid compiler warnings */
+ save_ptr = NULL;
+--- 4685,4698 ----
+ save_multipos = sub->list.multi[subidx];
+ if (off == -1)
+ {
+! sub->list.multi[subidx].end_lnum = rex.lnum + 1;
+ sub->list.multi[subidx].end_col = 0;
+ }
+ else
+ {
+! sub->list.multi[subidx].end_lnum = rex.lnum;
+ sub->list.multi[subidx].end_col =
+! (colnr_T)(rex.input - rex.line + off);
+ }
+ /* avoid compiler warnings */
+ save_ptr = NULL;
+***************
+*** 4723,4729 ****
+ else
+ {
+ save_ptr = sub->list.line[subidx].end;
+! sub->list.line[subidx].end = reginput + off;
+ /* avoid compiler warnings */
+ vim_memset(&save_multipos, 0, sizeof(save_multipos));
+ }
+--- 4700,4706 ----
+ else
+ {
+ save_ptr = sub->list.line[subidx].end;
+! sub->list.line[subidx].end = rex.input + off;
+ /* avoid compiler warnings */
+ vim_memset(&save_multipos, 0, sizeof(save_multipos));
+ }
+***************
+*** 4929,4941 ****
+ if (sub->list.multi[subidx].start_lnum < 0
+ || sub->list.multi[subidx].end_lnum < 0)
+ goto retempty;
+! if (sub->list.multi[subidx].start_lnum == reglnum
+! && sub->list.multi[subidx].end_lnum == reglnum)
+ {
+ len = sub->list.multi[subidx].end_col
+ - sub->list.multi[subidx].start_col;
+! if (cstrncmp(regline + sub->list.multi[subidx].start_col,
+! reginput, &len) == 0)
+ {
+ *bytelen = len;
+ return TRUE;
+--- 4906,4918 ----
+ if (sub->list.multi[subidx].start_lnum < 0
+ || sub->list.multi[subidx].end_lnum < 0)
+ goto retempty;
+! if (sub->list.multi[subidx].start_lnum == rex.lnum
+! && sub->list.multi[subidx].end_lnum == rex.lnum)
+ {
+ len = sub->list.multi[subidx].end_col
+ - sub->list.multi[subidx].start_col;
+! if (cstrncmp(rex.line + sub->list.multi[subidx].start_col,
+! rex.input, &len) == 0)
+ {
+ *bytelen = len;
+ return TRUE;
+***************
+*** 4958,4964 ****
+ || sub->list.line[subidx].end == NULL)
+ goto retempty;
+ len = (int)(sub->list.line[subidx].end - sub->list.line[subidx].start);
+! if (cstrncmp(sub->list.line[subidx].start, reginput, &len) == 0)
+ {
+ *bytelen = len;
+ return TRUE;
+--- 4935,4941 ----
+ || sub->list.line[subidx].end == NULL)
+ goto retempty;
+ len = (int)(sub->list.line[subidx].end - sub->list.line[subidx].start);
+! if (cstrncmp(sub->list.line[subidx].start, rex.input, &len) == 0)
+ {
+ *bytelen = len;
+ return TRUE;
+***************
+*** 4989,4995 ****
+ }
+
+ len = (int)STRLEN(re_extmatch_in->matches[subidx]);
+! if (cstrncmp(re_extmatch_in->matches[subidx], reginput, &len) == 0)
+ {
+ *bytelen = len;
+ return TRUE;
+--- 4966,4972 ----
+ }
+
+ len = (int)STRLEN(re_extmatch_in->matches[subidx]);
+! if (cstrncmp(re_extmatch_in->matches[subidx], rex.input, &len) == 0)
+ {
+ *bytelen = len;
+ return TRUE;
+***************
+*** 5061,5070 ****
+ int **listids,
+ int *listids_len)
+ {
+! int save_reginput_col = (int)(reginput - regline);
+! int save_reglnum = reglnum;
+ int save_nfa_match = nfa_match;
+! int save_nfa_listid = nfa_listid;
+ save_se_T *save_nfa_endp = nfa_endp;
+ save_se_T endpos;
+ save_se_T *endposp = NULL;
+--- 5038,5047 ----
+ int **listids,
+ int *listids_len)
+ {
+! int save_reginput_col = (int)(rex.input - rex.line);
+! int save_reglnum = rex.lnum;
+ int save_nfa_match = nfa_match;
+! int save_nfa_listid = rex.nfa_listid;
+ save_se_T *save_nfa_endp = nfa_endp;
+ save_se_T endpos;
+ save_se_T *endposp = NULL;
+***************
+*** 5075,5083 ****
+ {
+ /* start at the position where the postponed match was */
+ if (REG_MULTI)
+! reginput = regline + pim->end.pos.col;
+ else
+! reginput = pim->end.ptr;
+ }
+
+ if (state->c == NFA_START_INVISIBLE_BEFORE
+--- 5052,5060 ----
+ {
+ /* start at the position where the postponed match was */
+ if (REG_MULTI)
+! rex.input = rex.line + pim->end.pos.col;
+ else
+! rex.input = pim->end.ptr;
+ }
+
+ if (state->c == NFA_START_INVISIBLE_BEFORE
+***************
+*** 5092,5099 ****
+ {
+ if (pim == NULL)
+ {
+! endpos.se_u.pos.col = (int)(reginput - regline);
+! endpos.se_u.pos.lnum = reglnum;
+ }
+ else
+ endpos.se_u.pos = pim->end.pos;
+--- 5069,5076 ----
+ {
+ if (pim == NULL)
+ {
+! endpos.se_u.pos.col = (int)(rex.input - rex.line);
+! endpos.se_u.pos.lnum = rex.lnum;
+ }
+ else
+ endpos.se_u.pos = pim->end.pos;
+***************
+*** 5101,5107 ****
+ else
+ {
+ if (pim == NULL)
+! endpos.se_u.ptr = reginput;
+ else
+ endpos.se_u.ptr = pim->end.ptr;
+ }
+--- 5078,5084 ----
+ else
+ {
+ if (pim == NULL)
+! endpos.se_u.ptr = rex.input;
+ else
+ endpos.se_u.ptr = pim->end.ptr;
+ }
+***************
+*** 5114,5152 ****
+ {
+ if (REG_MULTI)
+ {
+! regline = reg_getline(--reglnum);
+! if (regline == NULL)
+ /* can't go before the first line */
+! regline = reg_getline(++reglnum);
+ }
+! reginput = regline;
+ }
+ else
+ {
+! if (REG_MULTI && (int)(reginput - regline) < state->val)
+ {
+ /* Not enough bytes in this line, go to end of
+ * previous line. */
+! regline = reg_getline(--reglnum);
+! if (regline == NULL)
+ {
+ /* can't go before the first line */
+! regline = reg_getline(++reglnum);
+! reginput = regline;
+ }
+ else
+! reginput = regline + STRLEN(regline);
+ }
+! if ((int)(reginput - regline) >= state->val)
+ {
+! reginput -= state->val;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! reginput -= mb_head_off(regline, reginput);
+ #endif
+ }
+ else
+! reginput = regline;
+ }
+ }
+
+--- 5091,5129 ----
+ {
+ if (REG_MULTI)
+ {
+! rex.line = reg_getline(--rex.lnum);
+! if (rex.line == NULL)
+ /* can't go before the first line */
+! rex.line = reg_getline(++rex.lnum);
+ }
+! rex.input = rex.line;
+ }
+ else
+ {
+! if (REG_MULTI && (int)(rex.input - rex.line) < state->val)
+ {
+ /* Not enough bytes in this line, go to end of
+ * previous line. */
+! rex.line = reg_getline(--rex.lnum);
+! if (rex.line == NULL)
+ {
+ /* can't go before the first line */
+! rex.line = reg_getline(++rex.lnum);
+! rex.input = rex.line;
+ }
+ else
+! rex.input = rex.line + STRLEN(rex.line);
+ }
+! if ((int)(rex.input - rex.line) >= state->val)
+ {
+! rex.input -= state->val;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+! rex.input -= mb_head_off(rex.line, rex.input);
+ #endif
+ }
+ else
+! rex.input = rex.line;
+ }
+ }
+
+***************
+*** 5161,5189 ****
+ {
+ /* Already calling nfa_regmatch() recursively. Save the lastlist[1]
+ * values and clear them. */
+! if (*listids == NULL || *listids_len < nstate)
+ {
+ vim_free(*listids);
+! *listids = (int *)lalloc(sizeof(int) * nstate, TRUE);
+ if (*listids == NULL)
+ {
+ EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
+ return 0;
+ }
+! *listids_len = nstate;
+ }
+ nfa_save_listids(prog, *listids);
+ need_restore = TRUE;
+! /* any value of nfa_listid will do */
+ }
+ else
+ {
+ /* First recursive nfa_regmatch() call, switch to the second lastlist
+! * entry. Make sure nfa_listid is different from a previous recursive
+! * call, because some states may still have this ID. */
+ ++nfa_ll_index;
+! if (nfa_listid <= nfa_alt_listid)
+! nfa_listid = nfa_alt_listid;
+ }
+
+ /* Call nfa_regmatch() to check if the current concat matches at this
+--- 5138,5166 ----
+ {
+ /* Already calling nfa_regmatch() recursively. Save the lastlist[1]
+ * values and clear them. */
+! if (*listids == NULL || *listids_len < prog->nstate)
+ {
+ vim_free(*listids);
+! *listids = (int *)lalloc(sizeof(int) * prog->nstate, TRUE);
+ if (*listids == NULL)
+ {
+ EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
+ return 0;
+ }
+! *listids_len = prog->nstate;
+ }
+ nfa_save_listids(prog, *listids);
+ need_restore = TRUE;
+! /* any value of rex.nfa_listid will do */
+ }
+ else
+ {
+ /* First recursive nfa_regmatch() call, switch to the second lastlist
+! * entry. Make sure rex.nfa_listid is different from a previous
+! * recursive call, because some states may still have this ID. */
+ ++nfa_ll_index;
+! if (rex.nfa_listid <= rex.nfa_alt_listid)
+! rex.nfa_listid = rex.nfa_alt_listid;
+ }
+
+ /* Call nfa_regmatch() to check if the current concat matches at this
+***************
+*** 5196,5213 ****
+ else
+ {
+ --nfa_ll_index;
+! nfa_alt_listid = nfa_listid;
+ }
+
+ /* restore position in input text */
+! reglnum = save_reglnum;
+ if (REG_MULTI)
+! regline = reg_getline(reglnum);
+! reginput = regline + save_reginput_col;
+ if (result != NFA_TOO_EXPENSIVE)
+ {
+ nfa_match = save_nfa_match;
+! nfa_listid = save_nfa_listid;
+ }
+ nfa_endp = save_nfa_endp;
+
+--- 5173,5190 ----
+ else
+ {
+ --nfa_ll_index;
+! rex.nfa_alt_listid = rex.nfa_listid;
+ }
+
+ /* restore position in input text */
+! rex.lnum = save_reglnum;
+ if (REG_MULTI)
+! rex.line = reg_getline(rex.lnum);
+! rex.input = rex.line + save_reginput_col;
+ if (result != NFA_TOO_EXPENSIVE)
+ {
+ nfa_match = save_nfa_match;
+! rex.nfa_listid = save_nfa_listid;
+ }
+ nfa_endp = save_nfa_endp;
+
+***************
+*** 5407,5418 ****
+ && !has_mbyte
+ #endif
+ )
+! s = vim_strbyte(regline + *colp, c);
+ else
+! s = cstrchr(regline + *colp, c);
+ if (s == NULL)
+ return FAIL;
+! *colp = (int)(s - regline);
+ return OK;
+ }
+
+--- 5384,5395 ----
+ && !has_mbyte
+ #endif
+ )
+! s = vim_strbyte(rex.line + *colp, c);
+ else
+! s = cstrchr(rex.line + *colp, c);
+ if (s == NULL)
+ return FAIL;
+! *colp = (int)(s - rex.line);
+ return OK;
+ }
+
+***************
+*** 5436,5442 ****
+ for (len1 = 0; match_text[len1] != NUL; len1 += MB_CHAR2LEN(c1))
+ {
+ c1 = PTR2CHAR(match_text + len1);
+! c2 = PTR2CHAR(regline + col + len2);
+ if (c1 != c2 && (!rex.reg_ic || MB_TOLOWER(c1) != MB_TOLOWER(c2)))
+ {
+ match = FALSE;
+--- 5413,5419 ----
+ for (len1 = 0; match_text[len1] != NUL; len1 += MB_CHAR2LEN(c1))
+ {
+ c1 = PTR2CHAR(match_text + len1);
+! c2 = PTR2CHAR(rex.line + col + len2);
+ if (c1 != c2 && (!rex.reg_ic || MB_TOLOWER(c1) != MB_TOLOWER(c2)))
+ {
+ match = FALSE;
+***************
+*** 5448,5469 ****
+ #ifdef FEAT_MBYTE
+ /* check that no composing char follows */
+ && !(enc_utf8
+! && utf_iscomposing(PTR2CHAR(regline + col + len2)))
+ #endif
+ )
+ {
+ cleanup_subexpr();
+ if (REG_MULTI)
+ {
+! rex.reg_startpos[0].lnum = reglnum;
+ rex.reg_startpos[0].col = col;
+! rex.reg_endpos[0].lnum = reglnum;
+ rex.reg_endpos[0].col = col + len2;
+ }
+ else
+ {
+! rex.reg_startp[0] = regline + col;
+! rex.reg_endp[0] = regline + col + len2;
+ }
+ return 1L;
+ }
+--- 5425,5446 ----
+ #ifdef FEAT_MBYTE
+ /* check that no composing char follows */
+ && !(enc_utf8
+! && utf_iscomposing(PTR2CHAR(rex.line + col + len2)))
+ #endif
+ )
+ {
+ cleanup_subexpr();
+ if (REG_MULTI)
+ {
+! rex.reg_startpos[0].lnum = rex.lnum;
+ rex.reg_startpos[0].col = col;
+! rex.reg_endpos[0].lnum = rex.lnum;
+ rex.reg_endpos[0].col = col + len2;
+ }
+ else
+ {
+! rex.reg_startp[0] = rex.line + col;
+! rex.reg_endp[0] = rex.line + col + len2;
+ }
+ return 1L;
+ }
+***************
+*** 5493,5499 ****
+ /*
+ * Main matching routine.
+ *
+! * Run NFA to determine whether it matches reginput.
+ *
+ * When "nfa_endp" is not NULL it is a required end-of-match position.
+ *
+--- 5470,5476 ----
+ /*
+ * Main matching routine.
+ *
+! * Run NFA to determine whether it matches rex.input.
+ *
+ * When "nfa_endp" is not NULL it is a required end-of-match position.
+ *
+***************
+*** 5549,5560 ****
+ nfa_match = FALSE;
+
+ /* Allocate memory for the lists of nodes. */
+! size = (nstate + 1) * sizeof(nfa_thread_T);
+
+ list[0].t = (nfa_thread_T *)lalloc(size, TRUE);
+! list[0].len = nstate + 1;
+ list[1].t = (nfa_thread_T *)lalloc(size, TRUE);
+! list[1].len = nstate + 1;
+ if (list[0].t == NULL || list[1].t == NULL)
+ goto theend;
+
+--- 5526,5537 ----
+ nfa_match = FALSE;
+
+ /* Allocate memory for the lists of nodes. */
+! size = (prog->nstate + 1) * sizeof(nfa_thread_T);
+
+ list[0].t = (nfa_thread_T *)lalloc(size, TRUE);
+! list[0].len = prog->nstate + 1;
+ list[1].t = (nfa_thread_T *)lalloc(size, TRUE);
+! list[1].len = prog->nstate + 1;
+ if (list[0].t == NULL || list[1].t == NULL)
+ goto theend;
+
+***************
+*** 5584,5590 ****
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "(---) STARTSTATE first\n");
+ #endif
+! thislist->id = nfa_listid + 1;
+
+ /* Inline optimized code for addstate(thislist, start, m, 0) if we know
+ * it's the first MOPEN. */
+--- 5561,5567 ----
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "(---) STARTSTATE first\n");
+ #endif
+! thislist->id = rex.nfa_listid + 1;
+
+ /* Inline optimized code for addstate(thislist, start, m, 0) if we know
+ * it's the first MOPEN. */
+***************
+*** 5592,5602 ****
+ {
+ if (REG_MULTI)
+ {
+! m->norm.list.multi[0].start_lnum = reglnum;
+! m->norm.list.multi[0].start_col = (colnr_T)(reginput - regline);
+ }
+ else
+! m->norm.list.line[0].start = reginput;
+ m->norm.in_use = 1;
+ addstate(thislist, start->out, m, NULL, 0);
+ }
+--- 5569,5579 ----
+ {
+ if (REG_MULTI)
+ {
+! m->norm.list.multi[0].start_lnum = rex.lnum;
+! m->norm.list.multi[0].start_col = (colnr_T)(rex.input - rex.line);
+ }
+ else
+! m->norm.list.line[0].start = rex.input;
+ m->norm.in_use = 1;
+ addstate(thislist, start->out, m, NULL, 0);
+ }
+***************
+*** 5620,5632 ****
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+ {
+! curc = (*mb_ptr2char)(reginput);
+! clen = (*mb_ptr2len)(reginput);
+ }
+ else
+ #endif
+ {
+! curc = *reginput;
+ clen = 1;
+ }
+ if (curc == NUL)
+--- 5597,5609 ----
+ #ifdef FEAT_MBYTE
+ if (has_mbyte)
+ {
+! curc = (*mb_ptr2char)(rex.input);
+! clen = (*mb_ptr2len)(rex.input);
+ }
+ else
+ #endif
+ {
+! curc = *rex.input;
+ clen = 1;
+ }
+ if (curc == NUL)
+***************
+*** 5640,5648 ****
+ nextlist = &list[flag ^= 1];
+ nextlist->n = 0; /* clear nextlist */
+ nextlist->has_pim = FALSE;
+! ++nfa_listid;
+ if (prog->re_engine == AUTOMATIC_ENGINE
+! && (nfa_listid >= NFA_MAX_STATES
+ # ifdef FEAT_EVAL
+ || nfa_fail_for_testing
+ # endif
+--- 5617,5625 ----
+ nextlist = &list[flag ^= 1];
+ nextlist->n = 0; /* clear nextlist */
+ nextlist->has_pim = FALSE;
+! ++rex.nfa_listid;
+ if (prog->re_engine == AUTOMATIC_ENGINE
+! && (rex.nfa_listid >= NFA_MAX_STATES
+ # ifdef FEAT_EVAL
+ || nfa_fail_for_testing
+ # endif
+***************
+*** 5653,5664 ****
+ goto theend;
+ }
+
+! thislist->id = nfa_listid;
+! nextlist->id = nfa_listid + 1;
+
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "------------------------------------------\n");
+! fprintf(log_fd, ">>> Reginput is \"%s\"\n", reginput);
+ fprintf(log_fd, ">>> Advanced one character... Current char is %c (code %d) \n", curc, (int)curc);
+ fprintf(log_fd, ">>> Thislist has %d states available: ", thislist->n);
+ {
+--- 5630,5641 ----
+ goto theend;
+ }
+
+! thislist->id = rex.nfa_listid;
+! nextlist->id = rex.nfa_listid + 1;
+
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "------------------------------------------\n");
+! fprintf(log_fd, ">>> Reginput is \"%s\"\n", rex.input);
+ fprintf(log_fd, ">>> Advanced one character... Current char is %c (code %d) \n", curc, (int)curc);
+ fprintf(log_fd, ">>> Thislist has %d states available: ", thislist->n);
+ {
+***************
+*** 5710,5716 ****
+ else if (REG_MULTI)
+ col = t->subs.norm.list.multi[0].start_col;
+ else
+! col = (int)(t->subs.norm.list.line[0].start - regline);
+ nfa_set_code(t->state->c);
+ fprintf(log_fd, "(%d) char %d %s (start col %d)%s... \n",
+ abs(t->state->id), (int)t->state->c, code, col,
+--- 5687,5693 ----
+ else if (REG_MULTI)
+ col = t->subs.norm.list.multi[0].start_col;
+ else
+! col = (int)(t->subs.norm.list.line[0].start - rex.line);
+ nfa_set_code(t->state->c);
+ fprintf(log_fd, "(%d) char %d %s (start col %d)%s... \n",
+ abs(t->state->id), (int)t->state->c, code, col,
+***************
+*** 5738,5744 ****
+ nfa_match = TRUE;
+ copy_sub(&submatch->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub(&submatch->synt, &t->subs.synt);
+ #endif
+ #ifdef ENABLE_LOG
+--- 5715,5721 ----
+ nfa_match = TRUE;
+ copy_sub(&submatch->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub(&submatch->synt, &t->subs.synt);
+ #endif
+ #ifdef ENABLE_LOG
+***************
+*** 5746,5752 ****
+ #endif
+ /* Found the left-most longest match, do not look at any other
+ * states at this position. When the list of states is going
+! * to be empty quit without advancing, so that "reginput" is
+ * correct. */
+ if (nextlist->n == 0)
+ clen = 0;
+--- 5723,5729 ----
+ #endif
+ /* Found the left-most longest match, do not look at any other
+ * states at this position. When the list of states is going
+! * to be empty quit without advancing, so that "rex.input" is
+ * correct. */
+ if (nextlist->n == 0)
+ clen = 0;
+***************
+*** 5772,5794 ****
+ {
+ if (REG_MULTI)
+ fprintf(log_fd, "Current lnum: %d, endp lnum: %d; current col: %d, endp col: %d\n",
+! (int)reglnum,
+ (int)nfa_endp->se_u.pos.lnum,
+! (int)(reginput - regline),
+ nfa_endp->se_u.pos.col);
+ else
+ fprintf(log_fd, "Current col: %d, endp col: %d\n",
+! (int)(reginput - regline),
+! (int)(nfa_endp->se_u.ptr - reginput));
+ }
+ #endif
+ /* If "nfa_endp" is set it's only a match if it ends at
+ * "nfa_endp" */
+ if (nfa_endp != NULL && (REG_MULTI
+! ? (reglnum != nfa_endp->se_u.pos.lnum
+! || (int)(reginput - regline)
+ != nfa_endp->se_u.pos.col)
+! : reginput != nfa_endp->se_u.ptr))
+ break;
+
+ /* do not set submatches for \@! */
+--- 5749,5771 ----
+ {
+ if (REG_MULTI)
+ fprintf(log_fd, "Current lnum: %d, endp lnum: %d; current col: %d, endp col: %d\n",
+! (int)rex.lnum,
+ (int)nfa_endp->se_u.pos.lnum,
+! (int)(rex.input - rex.line),
+ nfa_endp->se_u.pos.col);
+ else
+ fprintf(log_fd, "Current col: %d, endp col: %d\n",
+! (int)(rex.input - rex.line),
+! (int)(nfa_endp->se_u.ptr - rex.input));
+ }
+ #endif
+ /* If "nfa_endp" is set it's only a match if it ends at
+ * "nfa_endp" */
+ if (nfa_endp != NULL && (REG_MULTI
+! ? (rex.lnum != nfa_endp->se_u.pos.lnum
+! || (int)(rex.input - rex.line)
+ != nfa_endp->se_u.pos.col)
+! : rex.input != nfa_endp->se_u.ptr))
+ break;
+
+ /* do not set submatches for \@! */
+***************
+*** 5796,5802 ****
+ {
+ copy_sub(&m->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub(&m->synt, &t->subs.synt);
+ #endif
+ }
+--- 5773,5779 ----
+ {
+ copy_sub(&m->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub(&m->synt, &t->subs.synt);
+ #endif
+ }
+***************
+*** 5838,5844 ****
+ * of what happens on success below. */
+ copy_sub_off(&m->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub_off(&m->synt, &t->subs.synt);
+ #endif
+
+--- 5815,5821 ----
+ * of what happens on success below. */
+ copy_sub_off(&m->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub_off(&m->synt, &t->subs.synt);
+ #endif
+
+***************
+*** 5866,5872 ****
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&t->subs.norm, &m->norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub_off(&t->subs.synt, &m->synt);
+ #endif
+ /* If the pattern has \ze and it matched in the
+--- 5843,5849 ----
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&t->subs.norm, &m->norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub_off(&t->subs.synt, &m->synt);
+ #endif
+ /* If the pattern has \ze and it matched in the
+***************
+*** 5899,5909 ****
+ #endif
+ if (REG_MULTI)
+ {
+! pim.end.pos.col = (int)(reginput - regline);
+! pim.end.pos.lnum = reglnum;
+ }
+ else
+! pim.end.ptr = reginput;
+
+ /* t->state->out1 is the corresponding END_INVISIBLE
+ * node; Add its out to the current list (zero-width
+--- 5876,5886 ----
+ #endif
+ if (REG_MULTI)
+ {
+! pim.end.pos.col = (int)(rex.input - rex.line);
+! pim.end.pos.lnum = rex.lnum;
+ }
+ else
+! pim.end.ptr = rex.input;
+
+ /* t->state->out1 is the corresponding END_INVISIBLE
+ * node; Add its out to the current list (zero-width
+***************
+*** 5959,5965 ****
+ * happens afterwards. */
+ copy_sub_off(&m->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub_off(&m->synt, &t->subs.synt);
+ #endif
+
+--- 5936,5942 ----
+ * happens afterwards. */
+ copy_sub_off(&m->norm, &t->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub_off(&m->synt, &t->subs.synt);
+ #endif
+
+***************
+*** 5982,5988 ****
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&t->subs.norm, &m->norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub_off(&t->subs.synt, &m->synt);
+ #endif
+ /* Now we need to skip over the matched text and then
+--- 5959,5965 ----
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&t->subs.norm, &m->norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub_off(&t->subs.synt, &m->synt);
+ #endif
+ /* Now we need to skip over the matched text and then
+***************
+*** 5990,5998 ****
+ if (REG_MULTI)
+ /* TODO: multi-line match */
+ bytelen = m->norm.list.multi[0].end_col
+! - (int)(reginput - regline);
+ else
+! bytelen = (int)(m->norm.list.line[0].end - reginput);
+
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "NFA_START_PATTERN length: %d\n", bytelen);
+--- 5967,5975 ----
+ if (REG_MULTI)
+ /* TODO: multi-line match */
+ bytelen = m->norm.list.multi[0].end_col
+! - (int)(rex.input - rex.line);
+ else
+! bytelen = (int)(m->norm.list.line[0].end - rex.input);
+
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "NFA_START_PATTERN length: %d\n", bytelen);
+***************
+*** 6025,6031 ****
+ }
+
+ case NFA_BOL:
+! if (reginput == regline)
+ {
+ add_here = TRUE;
+ add_state = t->state->out;
+--- 6002,6008 ----
+ }
+
+ case NFA_BOL:
+! if (rex.input == rex.line)
+ {
+ add_here = TRUE;
+ add_state = t->state->out;
+***************
+*** 6051,6057 ****
+ int this_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(reginput, rex.reg_buf);
+ if (this_class <= 1)
+ result = FALSE;
+ else if (reg_prev_class() == this_class)
+--- 6028,6034 ----
+ int this_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(rex.input, rex.reg_buf);
+ if (this_class <= 1)
+ result = FALSE;
+ else if (reg_prev_class() == this_class)
+***************
+*** 6059,6066 ****
+ }
+ #endif
+ else if (!vim_iswordc_buf(curc, rex.reg_buf)
+! || (reginput > regline
+! && vim_iswordc_buf(reginput[-1], rex.reg_buf)))
+ result = FALSE;
+ if (result)
+ {
+--- 6036,6043 ----
+ }
+ #endif
+ else if (!vim_iswordc_buf(curc, rex.reg_buf)
+! || (rex.input > rex.line
+! && vim_iswordc_buf(rex.input[-1], rex.reg_buf)))
+ result = FALSE;
+ if (result)
+ {
+***************
+*** 6071,6077 ****
+
+ case NFA_EOW:
+ result = TRUE;
+! if (reginput == regline)
+ result = FALSE;
+ #ifdef FEAT_MBYTE
+ else if (has_mbyte)
+--- 6048,6054 ----
+
+ case NFA_EOW:
+ result = TRUE;
+! if (rex.input == rex.line)
+ result = FALSE;
+ #ifdef FEAT_MBYTE
+ else if (has_mbyte)
+***************
+*** 6079,6093 ****
+ int this_class, prev_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(reginput, rex.reg_buf);
+ prev_class = reg_prev_class();
+ if (this_class == prev_class
+ || prev_class == 0 || prev_class == 1)
+ result = FALSE;
+ }
+ #endif
+! else if (!vim_iswordc_buf(reginput[-1], rex.reg_buf)
+! || (reginput[0] != NUL
+ && vim_iswordc_buf(curc, rex.reg_buf)))
+ result = FALSE;
+ if (result)
+--- 6056,6070 ----
+ int this_class, prev_class;
+
+ /* Get class of current and previous char (if it exists). */
+! this_class = mb_get_class_buf(rex.input, rex.reg_buf);
+ prev_class = reg_prev_class();
+ if (this_class == prev_class
+ || prev_class == 0 || prev_class == 1)
+ result = FALSE;
+ }
+ #endif
+! else if (!vim_iswordc_buf(rex.input[-1], rex.reg_buf)
+! || (rex.input[0] != NUL
+ && vim_iswordc_buf(curc, rex.reg_buf)))
+ result = FALSE;
+ if (result)
+***************
+*** 6098,6104 ****
+ break;
+
+ case NFA_BOF:
+! if (reglnum == 0 && reginput == regline
+ && (!REG_MULTI || rex.reg_firstlnum == 1))
+ {
+ add_here = TRUE;
+--- 6075,6081 ----
+ break;
+
+ case NFA_BOF:
+! if (rex.lnum == 0 && rex.input == rex.line
+ && (!REG_MULTI || rex.reg_firstlnum == 1))
+ {
+ add_here = TRUE;
+***************
+*** 6107,6113 ****
+ break;
+
+ case NFA_EOF:
+! if (reglnum == rex.reg_maxline && curc == NUL)
+ {
+ add_here = TRUE;
+ add_state = t->state->out;
+--- 6084,6090 ----
+ break;
+
+ case NFA_EOF:
+! if (rex.lnum == rex.reg_maxline && curc == NUL)
+ {
+ add_here = TRUE;
+ add_state = t->state->out;
+***************
+*** 6159,6165 ****
+ * Get them into cchars[] first. */
+ while (len < clen)
+ {
+! mc = mb_ptr2char(reginput + len);
+ cchars[ccount++] = mc;
+ len += mb_char2len(mc);
+ if (ccount == MAX_MCO)
+--- 6136,6142 ----
+ * Get them into cchars[] first. */
+ while (len < clen)
+ {
+! mc = mb_ptr2char(rex.input + len);
+ cchars[ccount++] = mc;
+ len += mb_char2len(mc);
+ if (ccount == MAX_MCO)
+***************
+*** 6194,6200 ****
+
+ case NFA_NEWL:
+ if (curc == NUL && !rex.reg_line_lbr && REG_MULTI
+! && reglnum <= rex.reg_maxline)
+ {
+ go_to_nextline = TRUE;
+ /* Pass -1 for the offset, which means taking the position
+--- 6171,6177 ----
+
+ case NFA_NEWL:
+ if (curc == NUL && !rex.reg_line_lbr && REG_MULTI
+! && rex.lnum <= rex.reg_maxline)
+ {
+ go_to_nextline = TRUE;
+ /* Pass -1 for the offset, which means taking the position
+***************
+*** 6323,6335 ****
+ break;
+
+ case NFA_KWORD: /* \k */
+! result = vim_iswordp_buf(reginput, rex.reg_buf);
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+ case NFA_SKWORD: /* \K */
+ result = !VIM_ISDIGIT(curc)
+! && vim_iswordp_buf(reginput, rex.reg_buf);
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+--- 6300,6312 ----
+ break;
+
+ case NFA_KWORD: /* \k */
+! result = vim_iswordp_buf(rex.input, rex.reg_buf);
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+ case NFA_SKWORD: /* \K */
+ result = !VIM_ISDIGIT(curc)
+! && vim_iswordp_buf(rex.input, rex.reg_buf);
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+***************
+*** 6344,6355 ****
+ break;
+
+ case NFA_PRINT: /* \p */
+! result = vim_isprintc(PTR2CHAR(reginput));
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+ case NFA_SPRINT: /* \P */
+! result = !VIM_ISDIGIT(curc) && vim_isprintc(PTR2CHAR(reginput));
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+--- 6321,6332 ----
+ break;
+
+ case NFA_PRINT: /* \p */
+! result = vim_isprintc(PTR2CHAR(rex.input));
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+ case NFA_SPRINT: /* \P */
+! result = !VIM_ISDIGIT(curc) && vim_isprintc(PTR2CHAR(rex.input));
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+
+***************
+*** 6552,6558 ****
+ case NFA_LNUM_LT:
+ result = (REG_MULTI &&
+ nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
+! (long_u)(reglnum + rex.reg_firstlnum)));
+ if (result)
+ {
+ add_here = TRUE;
+--- 6529,6535 ----
+ case NFA_LNUM_LT:
+ result = (REG_MULTI &&
+ nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
+! (long_u)(rex.lnum + rex.reg_firstlnum)));
+ if (result)
+ {
+ add_here = TRUE;
+***************
+*** 6564,6570 ****
+ case NFA_COL_GT:
+ case NFA_COL_LT:
+ result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
+! (long_u)(reginput - regline) + 1);
+ if (result)
+ {
+ add_here = TRUE;
+--- 6541,6547 ----
+ case NFA_COL_GT:
+ case NFA_COL_LT:
+ result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
+! (long_u)(rex.input - rex.line) + 1);
+ if (result)
+ {
+ add_here = TRUE;
+***************
+*** 6577,6583 ****
+ case NFA_VCOL_LT:
+ {
+ int op = t->state->c - NFA_VCOL;
+! colnr_T col = (colnr_T)(reginput - regline);
+ win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win;
+
+ /* Bail out quickly when there can't be a match, avoid the
+--- 6554,6560 ----
+ case NFA_VCOL_LT:
+ {
+ int op = t->state->c - NFA_VCOL;
+! colnr_T col = (colnr_T)(rex.input - rex.line);
+ win_T *wp = rex.reg_win == NULL ? curwin : rex.reg_win;
+
+ /* Bail out quickly when there can't be a match, avoid the
+***************
+*** 6601,6607 ****
+ }
+ if (!result)
+ result = nfa_re_num_cmp(t->state->val, op,
+! (long_u)win_linetabsize(wp, regline, col) + 1);
+ if (result)
+ {
+ add_here = TRUE;
+--- 6578,6584 ----
+ }
+ if (!result)
+ result = nfa_re_num_cmp(t->state->val, op,
+! (long_u)win_linetabsize(wp, rex.line, col) + 1);
+ if (result)
+ {
+ add_here = TRUE;
+***************
+*** 6619,6631 ****
+ /* Compare the mark position to the match position. */
+ result = (pos != NULL /* mark doesn't exist */
+ && pos->lnum > 0 /* mark isn't set in reg_buf */
+! && (pos->lnum == reglnum + rex.reg_firstlnum
+! ? (pos->col == (colnr_T)(reginput - regline)
+ ? t->state->c == NFA_MARK
+! : (pos->col < (colnr_T)(reginput - regline)
+ ? t->state->c == NFA_MARK_GT
+ : t->state->c == NFA_MARK_LT))
+! : (pos->lnum < reglnum + rex.reg_firstlnum
+ ? t->state->c == NFA_MARK_GT
+ : t->state->c == NFA_MARK_LT)));
+ if (result)
+--- 6596,6608 ----
+ /* Compare the mark position to the match position. */
+ result = (pos != NULL /* mark doesn't exist */
+ && pos->lnum > 0 /* mark isn't set in reg_buf */
+! && (pos->lnum == rex.lnum + rex.reg_firstlnum
+! ? (pos->col == (colnr_T)(rex.input - rex.line)
+ ? t->state->c == NFA_MARK
+! : (pos->col < (colnr_T)(rex.input - rex.line)
+ ? t->state->c == NFA_MARK_GT
+ : t->state->c == NFA_MARK_LT))
+! : (pos->lnum < rex.lnum + rex.reg_firstlnum
+ ? t->state->c == NFA_MARK_GT
+ : t->state->c == NFA_MARK_LT)));
+ if (result)
+***************
+*** 6638,6646 ****
+
+ case NFA_CURSOR:
+ result = (rex.reg_win != NULL
+! && (reglnum + rex.reg_firstlnum
+ == rex.reg_win->w_cursor.lnum)
+! && ((colnr_T)(reginput - regline)
+ == rex.reg_win->w_cursor.col));
+ if (result)
+ {
+--- 6615,6623 ----
+
+ case NFA_CURSOR:
+ result = (rex.reg_win != NULL
+! && (rex.lnum + rex.reg_firstlnum
+ == rex.reg_win->w_cursor.lnum)
+! && ((colnr_T)(rex.input - rex.line)
+ == rex.reg_win->w_cursor.col));
+ if (result)
+ {
+***************
+*** 6701,6707 ****
+ /* If rex.reg_icombine is not set only skip over the character
+ * itself. When it is set skip over composing characters. */
+ if (result && enc_utf8 && !rex.reg_icombine)
+! clen = utf_ptr2len(reginput);
+ #endif
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+--- 6678,6684 ----
+ /* If rex.reg_icombine is not set only skip over the character
+ * itself. When it is set skip over composing characters. */
+ if (result && enc_utf8 && !rex.reg_icombine)
+! clen = utf_ptr2len(rex.input);
+ #endif
+ ADD_STATE_IF_MATCH(t->state);
+ break;
+***************
+*** 6746,6752 ****
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&pim->subs.norm, &m->norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub_off(&pim->subs.synt, &m->synt);
+ #endif
+ }
+--- 6723,6729 ----
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&pim->subs.norm, &m->norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub_off(&pim->subs.synt, &m->synt);
+ #endif
+ }
+***************
+*** 6773,6779 ****
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&t->subs.norm, &pim->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (nfa_has_zsubexpr)
+ copy_sub_off(&t->subs.synt, &pim->subs.synt);
+ #endif
+ }
+--- 6750,6756 ----
+ /* Copy submatch info from the recursive call */
+ copy_sub_off(&t->subs.norm, &pim->subs.norm);
+ #ifdef FEAT_SYN_HL
+! if (rex.nfa_has_zsubexpr)
+ copy_sub_off(&t->subs.synt, &pim->subs.synt);
+ #endif
+ }
+***************
+*** 6817,6833 ****
+ * Also don't start a match past the first line. */
+ if (nfa_match == FALSE
+ && ((toplevel
+! && reglnum == 0
+ && clen != 0
+ && (rex.reg_maxcol == 0
+! || (colnr_T)(reginput - regline) < rex.reg_maxcol))
+ || (nfa_endp != NULL
+ && (REG_MULTI
+! ? (reglnum < nfa_endp->se_u.pos.lnum
+! || (reglnum == nfa_endp->se_u.pos.lnum
+! && (int)(reginput - regline)
+ < nfa_endp->se_u.pos.col))
+! : reginput < nfa_endp->se_u.ptr))))
+ {
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "(---) STARTSTATE\n");
+--- 6794,6810 ----
+ * Also don't start a match past the first line. */
+ if (nfa_match == FALSE
+ && ((toplevel
+! && rex.lnum == 0
+ && clen != 0
+ && (rex.reg_maxcol == 0
+! || (colnr_T)(rex.input - rex.line) < rex.reg_maxcol))
+ || (nfa_endp != NULL
+ && (REG_MULTI
+! ? (rex.lnum < nfa_endp->se_u.pos.lnum
+! || (rex.lnum == nfa_endp->se_u.pos.lnum
+! && (int)(rex.input - rex.line)
+ < nfa_endp->se_u.pos.col))
+! : rex.input < nfa_endp->se_u.ptr))))
+ {
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "(---) STARTSTATE\n");
+***************
+*** 6843,6849 ****
+ {
+ if (nextlist->n == 0)
+ {
+! colnr_T col = (colnr_T)(reginput - regline) + clen;
+
+ /* Nextlist is empty, we can skip ahead to the
+ * character that must appear at the start. */
+--- 6820,6826 ----
+ {
+ if (nextlist->n == 0)
+ {
+! colnr_T col = (colnr_T)(rex.input - rex.line) + clen;
+
+ /* Nextlist is empty, we can skip ahead to the
+ * character that must appear at the start. */
+***************
+*** 6851,6865 ****
+ break;
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, " Skipping ahead %d bytes to regstart\n",
+! col - ((colnr_T)(reginput - regline) + clen));
+ #endif
+! reginput = regline + col - clen;
+ }
+ else
+ {
+ /* Checking if the required start character matches is
+ * cheaper than adding a state that won't match. */
+! c = PTR2CHAR(reginput + clen);
+ if (c != prog->regstart && (!rex.reg_ic
+ || MB_TOLOWER(c) != MB_TOLOWER(prog->regstart)))
+ {
+--- 6828,6842 ----
+ break;
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, " Skipping ahead %d bytes to regstart\n",
+! col - ((colnr_T)(rex.input - rex.line) + clen));
+ #endif
+! rex.input = rex.line + col - clen;
+ }
+ else
+ {
+ /* Checking if the required start character matches is
+ * cheaper than adding a state that won't match. */
+! c = PTR2CHAR(rex.input + clen);
+ if (c != prog->regstart && (!rex.reg_ic
+ || MB_TOLOWER(c) != MB_TOLOWER(prog->regstart)))
+ {
+***************
+*** 6875,6883 ****
+ {
+ if (REG_MULTI)
+ m->norm.list.multi[0].start_col =
+! (colnr_T)(reginput - regline) + clen;
+ else
+! m->norm.list.line[0].start = reginput + clen;
+ addstate(nextlist, start->out, m, NULL, clen);
+ }
+ }
+--- 6852,6860 ----
+ {
+ if (REG_MULTI)
+ m->norm.list.multi[0].start_col =
+! (colnr_T)(rex.input - rex.line) + clen;
+ else
+! m->norm.list.line[0].start = rex.input + clen;
+ addstate(nextlist, start->out, m, NULL, clen);
+ }
+ }
+***************
+*** 6900,6908 ****
+ /* Advance to the next character, or advance to the next line, or
+ * finish. */
+ if (clen != 0)
+! reginput += clen;
+ else if (go_to_nextline || (nfa_endp != NULL && REG_MULTI
+! && reglnum < nfa_endp->se_u.pos.lnum))
+ reg_nextline();
+ else
+ break;
+--- 6877,6885 ----
+ /* Advance to the next character, or advance to the next line, or
+ * finish. */
+ if (clen != 0)
+! rex.input += clen;
+ else if (go_to_nextline || (nfa_endp != NULL && REG_MULTI
+! && rex.lnum < nfa_endp->se_u.pos.lnum))
+ reg_nextline();
+ else
+ break;
+***************
+*** 6942,6948 ****
+ }
+
+ /*
+! * Try match of "prog" with at regline["col"].
+ * Returns <= 0 for failure, number of lines contained in the match otherwise.
+ */
+ static long
+--- 6919,6925 ----
+ }
+
+ /*
+! * Try match of "prog" with at rex.line["col"].
+ * Returns <= 0 for failure, number of lines contained in the match otherwise.
+ */
+ static long
+***************
+*** 6960,6966 ****
+ FILE *f;
+ #endif
+
+! reginput = regline + col;
+ #ifdef FEAT_RELTIME
+ nfa_time_limit = tm;
+ nfa_timed_out = timed_out;
+--- 6937,6943 ----
+ FILE *f;
+ #endif
+
+! rex.input = rex.line + col;
+ #ifdef FEAT_RELTIME
+ nfa_time_limit = tm;
+ nfa_timed_out = timed_out;
+***************
+*** 6975,6981 ****
+ #ifdef DEBUG
+ fprintf(f, "\tRegexp is \"%s\"\n", nfa_regengine.expr);
+ #endif
+! fprintf(f, "\tInput text is \"%s\" \n", reginput);
+ fprintf(f, "\t=======================================================\n\n");
+ nfa_print_state(f, start);
+ fprintf(f, "\n\n");
+--- 6952,6958 ----
+ #ifdef DEBUG
+ fprintf(f, "\tRegexp is \"%s\"\n", nfa_regengine.expr);
+ #endif
+! fprintf(f, "\tInput text is \"%s\" \n", rex.input);
+ fprintf(f, "\t=======================================================\n\n");
+ nfa_print_state(f, start);
+ fprintf(f, "\n\n");
+***************
+*** 7018,7029 ****
+ if (rex.reg_endpos[0].lnum < 0)
+ {
+ /* pattern has a \ze but it didn't match, use current end */
+! rex.reg_endpos[0].lnum = reglnum;
+! rex.reg_endpos[0].col = (int)(reginput - regline);
+ }
+ else
+ /* Use line number of "\ze". */
+! reglnum = rex.reg_endpos[0].lnum;
+ }
+ else
+ {
+--- 6995,7006 ----
+ if (rex.reg_endpos[0].lnum < 0)
+ {
+ /* pattern has a \ze but it didn't match, use current end */
+! rex.reg_endpos[0].lnum = rex.lnum;
+! rex.reg_endpos[0].col = (int)(rex.input - rex.line);
+ }
+ else
+ /* Use line number of "\ze". */
+! rex.lnum = rex.reg_endpos[0].lnum;
+ }
+ else
+ {
+***************
+*** 7034,7042 ****
+ }
+
+ if (rex.reg_startp[0] == NULL)
+! rex.reg_startp[0] = regline + col;
+ if (rex.reg_endp[0] == NULL)
+! rex.reg_endp[0] = reginput;
+ }
+
+ #ifdef FEAT_SYN_HL
+--- 7011,7019 ----
+ }
+
+ if (rex.reg_startp[0] == NULL)
+! rex.reg_startp[0] = rex.line + col;
+ if (rex.reg_endp[0] == NULL)
+! rex.reg_endp[0] = rex.input;
+ }
+
+ #ifdef FEAT_SYN_HL
+***************
+*** 7077,7083 ****
+ }
+ #endif
+
+! return 1 + reglnum;
+ }
+
+ /*
+--- 7054,7060 ----
+ }
+ #endif
+
+! return 1 + rex.lnum;
+ }
+
+ /*
+***************
+*** 7131,7159 ****
+ rex.reg_icombine = TRUE;
+ #endif
+
+! regline = line;
+! reglnum = 0; /* relative to line */
+
+! nfa_has_zend = prog->has_zend;
+! nfa_has_backref = prog->has_backref;
+! nfa_nsubexpr = prog->nsubexp;
+! nfa_listid = 1;
+! nfa_alt_listid = 2;
+ nfa_regengine.expr = prog->pattern;
+
+ if (prog->reganch && col > 0)
+ return 0L;
+
+! need_clear_subexpr = TRUE;
+ #ifdef FEAT_SYN_HL
+ /* Clear the external match subpointers if necessary. */
+ if (prog->reghasz == REX_SET)
+ {
+! nfa_has_zsubexpr = TRUE;
+! need_clear_zsubexpr = TRUE;
+ }
+ else
+! nfa_has_zsubexpr = FALSE;
+ #endif
+
+ if (prog->regstart != NUL)
+--- 7108,7141 ----
+ rex.reg_icombine = TRUE;
+ #endif
+
+! rex.line = line;
+! rex.lnum = 0; /* relative to line */
+
+! rex.nfa_has_zend = prog->has_zend;
+! rex.nfa_has_backref = prog->has_backref;
+! rex.nfa_nsubexpr = prog->nsubexp;
+! rex.nfa_listid = 1;
+! rex.nfa_alt_listid = 2;
+! #ifdef DEBUG
+ nfa_regengine.expr = prog->pattern;
++ #endif
+
+ if (prog->reganch && col > 0)
+ return 0L;
+
+! rex.need_clear_subexpr = TRUE;
+ #ifdef FEAT_SYN_HL
+ /* Clear the external match subpointers if necessary. */
+ if (prog->reghasz == REX_SET)
+ {
+! rex.nfa_has_zsubexpr = TRUE;
+! rex.need_clear_zsubexpr = TRUE;
+ }
+ else
+! {
+! rex.nfa_has_zsubexpr = FALSE;
+! rex.need_clear_zsubexpr = FALSE;
+! }
+ #endif
+
+ if (prog->regstart != NUL)
+***************
+*** 7177,7184 ****
+ if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol)
+ goto theend;
+
+! nstate = prog->nstate;
+! for (i = 0; i < nstate; ++i)
+ {
+ prog->state[i].id = i;
+ prog->state[i].lastlist[0] = 0;
+--- 7159,7168 ----
+ if (rex.reg_maxcol > 0 && col >= rex.reg_maxcol)
+ goto theend;
+
+! // Set the "nstate" used by nfa_regcomp() to zero to trigger an error when
+! // it's accidentally used during execution.
+! nstate = 0;
+! for (i = 0; i < prog->nstate; ++i)
+ {
+ prog->state[i].id = i;
+ prog->state[i].lastlist[0] = 0;
+***************
+*** 7187,7193 ****
+--- 7171,7179 ----
+
+ retval = nfa_regtry(prog, col, tm, timed_out);
+
++ #ifdef DEBUG
+ nfa_regengine.expr = NULL;
++ #endif
+
+ theend:
+ return retval;
+***************
+*** 7207,7213 ****
+--- 7193,7201 ----
+ if (expr == NULL)
+ return NULL;
+
++ #ifdef DEBUG
+ nfa_regengine.expr = expr;
++ #endif
+ nfa_re_flags = re_flags;
+
+ init_class_tab();
+***************
+*** 7255,7260 ****
+--- 7243,7249 ----
+ if (prog == NULL)
+ goto fail;
+ state_ptr = prog->state;
++ prog->re_in_use = FALSE;
+
+ /*
+ * PASS 2
+***************
+*** 7267,7274 ****
+ prog->regflags = regflags;
+ prog->engine = &nfa_regengine;
+ prog->nstate = nstate;
+! prog->has_zend = nfa_has_zend;
+! prog->has_backref = nfa_has_backref;
+ prog->nsubexp = regnpar;
+
+ nfa_postprocess(prog);
+--- 7256,7263 ----
+ prog->regflags = regflags;
+ prog->engine = &nfa_regengine;
+ prog->nstate = nstate;
+! prog->has_zend = rex.nfa_has_zend;
+! prog->has_backref = rex.nfa_has_backref;
+ prog->nsubexp = regnpar;
+
+ nfa_postprocess(prog);
+***************
+*** 7286,7292 ****
+--- 7275,7283 ----
+ prog->reghasz = re_has_z;
+ #endif
+ prog->pattern = vim_strsave(expr);
++ #ifdef DEBUG
+ nfa_regengine.expr = NULL;
++ #endif
+
+ out:
+ VIM_CLEAR(post_start);
+***************
+*** 7299,7305 ****
+--- 7290,7298 ----
+ #ifdef ENABLE_LOG
+ nfa_postfix_dump(expr, FAIL);
+ #endif
++ #ifdef DEBUG
+ nfa_regengine.expr = NULL;
++ #endif
+ goto out;
+ }
+
+*** ../vim-8.1.0191/src/version.c 2018-07-16 18:08:56.326109917 +0200
+--- src/version.c 2018-07-17 05:10:12.956018803 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 192,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+262. Your computer has it's own phone line - but your daughter doesn't.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0193 b/data/vim/patches/8.1.0193
new file mode 100644
index 000000000..4cb55fb6f
--- /dev/null
+++ b/data/vim/patches/8.1.0193
@@ -0,0 +1,57 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0193
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0193
+Problem: Terminal debugger buttons don't always work. (Dominique Pelle)
+Solution: Set 'cpo' to its default value.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0192/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-23 14:36:13.778666585 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-07-17 05:50:55.632645723 +0200
+***************
+*** 56,61 ****
+--- 56,64 ----
+ finish
+ endif
+
++ let s:keepcpo = &cpo
++ set cpo&vim
++
+ " The command that starts debugging, e.g. ":Termdebug vim".
+ " To end type "quit" in the gdb window.
+ command -nargs=* -complete=file -bang Termdebug call s:StartDebug(<bang>0, <f-args>)
+***************
+*** 943,945 ****
+--- 946,951 ----
+ endif
+ endfor
+ endfunc
++
++ let &cpo = s:keepcpo
++ unlet s:keepcpo
+*** ../vim-8.1.0192/src/version.c 2018-07-17 05:43:50.487214724 +0200
+--- src/version.c 2018-07-17 05:53:02.215885517 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 193,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+264. You turn to the teletext page "surfing report" and are surprised that it
+ is about sizes of waves and a weather forecast for seaside resorts.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0194 b/data/vim/patches/8.1.0194
new file mode 100644
index 000000000..36cb442fa
--- /dev/null
+++ b/data/vim/patches/8.1.0194
@@ -0,0 +1,104 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0194
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0194
+Problem: Possibly use of NULL pointer. (Coverity)
+Solution: Reset the re_in_use flag earlier.
+Files: src/regexp.c
+
+
+*** ../vim-8.1.0193/src/regexp.c 2018-07-17 05:43:50.483214748 +0200
+--- src/regexp.c 2018-07-18 06:00:16.581305145 +0200
+***************
+*** 8266,8271 ****
+--- 8266,8272 ----
+ rex.reg_endpos = NULL;
+
+ result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl);
++ rmp->regprog->re_in_use = FALSE;
+
+ /* NFA engine aborted because it's very slow. */
+ if (rmp->regprog->re_engine == AUTOMATIC_ENGINE
+***************
+*** 8284,8290 ****
+--- 8285,8295 ----
+ #endif
+ rmp->regprog = vim_regcomp(pat, re_flags);
+ if (rmp->regprog != NULL)
++ {
++ rmp->regprog->re_in_use = TRUE;
+ result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl);
++ rmp->regprog->re_in_use = FALSE;
++ }
+ vim_free(pat);
+ }
+
+***************
+*** 8294,8300 ****
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use)
+ rex = rex_save;
+- rmp->regprog->re_in_use = FALSE;
+
+ return result > 0;
+ }
+--- 8299,8304 ----
+***************
+*** 8382,8387 ****
+--- 8386,8392 ----
+
+ result = rmp->regprog->engine->regexec_multi(
+ rmp, win, buf, lnum, col, tm, timed_out);
++ rmp->regprog->re_in_use = FALSE;
+
+ /* NFA engine aborted because it's very slow. */
+ if (rmp->regprog->re_engine == AUTOMATIC_ENGINE
+***************
+*** 8409,8416 ****
+--- 8414,8425 ----
+ #endif
+
+ if (rmp->regprog != NULL)
++ {
++ rmp->regprog->re_in_use = TRUE;
+ result = rmp->regprog->engine->regexec_multi(
+ rmp, win, buf, lnum, col, tm, timed_out);
++ rmp->regprog->re_in_use = FALSE;
++ }
+ vim_free(pat);
+ }
+ p_re = save_p_re;
+***************
+*** 8419,8425 ****
+ rex_in_use = rex_in_use_save;
+ if (rex_in_use)
+ rex = rex_save;
+- rmp->regprog->re_in_use = FALSE;
+
+ return result <= 0 ? 0 : result;
+ }
+--- 8428,8433 ----
+*** ../vim-8.1.0193/src/version.c 2018-07-17 05:55:07.031195486 +0200
+--- src/version.c 2018-07-18 06:01:05.753045215 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 194,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+267. You get an extra phone line so you can get phone calls.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0195 b/data/vim/patches/8.1.0195
new file mode 100644
index 000000000..4eeb253ed
--- /dev/null
+++ b/data/vim/patches/8.1.0195
@@ -0,0 +1,59 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0195
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0195
+Problem: Terminal debugger commands don't always work. (Dominique Pelle)
+Solution: Set 'cpo' to its default value when defining commands. (Christian
+ Brabandt)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0194/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-07-17 05:55:07.031195486 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-07-19 01:42:45.109411754 +0200
+***************
+*** 566,571 ****
+--- 566,574 ----
+
+ " Install commands in the current window to control the debugger.
+ func s:InstallCommands()
++ let save_cpo = &cpo
++ set cpo&vim
++
+ command Break call s:SetBreakpoint()
+ command Clear call s:ClearBreakpoint()
+ command Step call s:SendCommand('-exec-step')
+***************
+*** 603,608 ****
+--- 606,613 ----
+ an 1.230 PopUp.Evaluate :Evaluate<CR>
+ endif
+ endif
++
++ let &cpo = save_cpo
+ endfunc
+
+ let s:winbar_winids = []
+*** ../vim-8.1.0194/src/version.c 2018-07-18 06:02:04.084736178 +0200
+--- src/version.c 2018-07-19 01:44:14.191196349 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 195,
+ /**/
+
+--
+God made the integers; all else is the work of Man.
+ -- Kronecker
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0196 b/data/vim/patches/8.1.0196
new file mode 100644
index 000000000..5ea32f3a2
--- /dev/null
+++ b/data/vim/patches/8.1.0196
@@ -0,0 +1,56 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0196
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0196
+Problem: Terminal debugger error with .gdbinit file.
+Solution: Check two lines for the "new ui" response. (hint from Hirohito
+ Higashi)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+
+*** ../vim-8.1.0195/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-07-19 02:54:56.593615126 +0200
+--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-07-19 04:00:32.045002542 +0200
+***************
+*** 200,206 ****
+ let response = ''
+ for lnum in range(1,200)
+ if term_getline(s:gdbbuf, lnum) =~ 'new-ui mi '
+! let response = term_getline(s:gdbbuf, lnum + 1)
+ if response =~ 'Undefined command'
+ echoerr 'Sorry, your gdb is too old, gdb 7.12 is required'
+ exe 'bwipe! ' . s:ptybuf
+--- 200,207 ----
+ let response = ''
+ for lnum in range(1,200)
+ if term_getline(s:gdbbuf, lnum) =~ 'new-ui mi '
+! " response can be in the same line or the next line
+! let response = term_getline(s:gdbbuf, lnum) . term_getline(s:gdbbuf, lnum + 1)
+ if response =~ 'Undefined command'
+ echoerr 'Sorry, your gdb is too old, gdb 7.12 is required'
+ exe 'bwipe! ' . s:ptybuf
+*** ../vim-8.1.0195/src/version.c 2018-07-19 02:54:56.597615110 +0200
+--- src/version.c 2018-07-19 04:07:59.074400369 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 196,
+ /**/
+
+--
+GALAHAD: Camelot ...
+LAUNCELOT: Camelot ...
+GAWAIN: It's only a model.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0197 b/data/vim/patches/8.1.0197
new file mode 100644
index 000000000..f8af4058c
--- /dev/null
+++ b/data/vim/patches/8.1.0197
@@ -0,0 +1,74 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0197
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0197
+Problem: Windows GUI: title for search/replace is wrong.
+Solution: Remove remark about doubling backslash. (closes #3230)
+Files: src/gui_win32.c
+
+
+*** ../vim-8.1.0196/src/gui_w32.c 2018-06-28 12:05:07.085006926 +0200
+--- src/gui_w32.c 2018-07-20 04:55:11.444216436 +0200
+***************
+*** 2820,2827 ****
+ s_findrep_hwnd = FindText((LPFINDREPLACE) &s_findrep_struct);
+ }
+
+! set_window_title(s_findrep_hwnd,
+! _("Find string (use '\\\\' to find a '\\')"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = TRUE;
+--- 2820,2826 ----
+ s_findrep_hwnd = FindText((LPFINDREPLACE) &s_findrep_struct);
+ }
+
+! set_window_title(s_findrep_hwnd, _("Find string"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = TRUE;
+***************
+*** 2855,2862 ****
+ (LPFINDREPLACE) &s_findrep_struct);
+ }
+
+! set_window_title(s_findrep_hwnd,
+! _("Find & Replace (use '\\\\' to find a '\\')"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = FALSE;
+--- 2854,2860 ----
+ (LPFINDREPLACE) &s_findrep_struct);
+ }
+
+! set_window_title(s_findrep_hwnd, _("Find & Replace"));
+ (void)SetFocus(s_findrep_hwnd);
+
+ s_findrep_is_find = FALSE;
+*** ../vim-8.1.0196/src/version.c 2018-07-19 04:13:30.332453051 +0200
+--- src/version.c 2018-07-20 05:00:43.838081685 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 197,
+ /**/
+
+--
+MAN: You don't frighten us, English pig-dog! Go and boil your bottoms,
+ son of a silly person. I blow my nose on you, so-called Arthur-king,
+ you and your silly English K...kaniggets.
+ He puts hands to his ears and blows a raspberry.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0198 b/data/vim/patches/8.1.0198
new file mode 100644
index 000000000..0cac7b146
--- /dev/null
+++ b/data/vim/patches/8.1.0198
@@ -0,0 +1,88 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0198
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0198
+Problem: There is no hint that syntax is disabled for 'redrawtime'.
+Solution: Add a message.
+Files: src/syntax.c
+
+
+*** ../vim-8.1.0197/src/syntax.c 2018-06-23 14:21:38.459484976 +0200
+--- src/syntax.c 2018-07-20 19:54:46.527523073 +0200
+***************
+*** 3355,3362 ****
+ }
+ #endif
+ #ifdef FEAT_RELTIME
+! if (timed_out)
+ syn_win->w_s->b_syn_slow = TRUE;
+ #endif
+
+ if (r > 0)
+--- 3355,3365 ----
+ }
+ #endif
+ #ifdef FEAT_RELTIME
+! if (timed_out && !syn_win->w_s->b_syn_slow)
+! {
+ syn_win->w_s->b_syn_slow = TRUE;
++ MSG(_("'redrawtime' exceeded, syntax highlighting disabled"));
++ }
+ #endif
+
+ if (r > 0)
+***************
+*** 3575,3585 ****
+ if (*arg == NUL)
+ {
+ MSG_PUTS("\n");
+- MSG_PUTS(_("syntax iskeyword "));
+ if (curwin->w_s->b_syn_isk != empty_option)
+ msg_outtrans(curwin->w_s->b_syn_isk);
+ else
+! msg_outtrans((char_u *)"not set");
+ }
+ else
+ {
+--- 3578,3590 ----
+ if (*arg == NUL)
+ {
+ MSG_PUTS("\n");
+ if (curwin->w_s->b_syn_isk != empty_option)
++ {
++ MSG_PUTS(_("syntax iskeyword "));
+ msg_outtrans(curwin->w_s->b_syn_isk);
++ }
+ else
+! msg_outtrans((char_u *)_("syntax iskeyword not set"));
+ }
+ else
+ {
+*** ../vim-8.1.0197/src/version.c 2018-07-20 05:03:10.565146691 +0200
+--- src/version.c 2018-07-20 19:49:51.905211855 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 198,
+ /**/
+
+--
+ A KNIGHT rides into shot and hacks him to the ground. He rides off.
+ We stay for a moment on the glade. A MIDDLE-AGED LADY in a C. & A.
+ twin-set emerges from the trees and looks in horror at the body of her
+ HUSBAND.
+MRS HISTORIAN: FRANK!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0199 b/data/vim/patches/8.1.0199
new file mode 100644
index 000000000..643ae3ed7
--- /dev/null
+++ b/data/vim/patches/8.1.0199
@@ -0,0 +1,48 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0199
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0199
+Problem: spellbadword() does not check for caps error. (Dominique Pelle)
+Solution: Adjust capcol when advancing.
+Files: src/evalfunc.c
+
+
+*** ../vim-8.1.0198/src/evalfunc.c 2018-07-15 17:01:06.357425513 +0200
+--- src/evalfunc.c 2018-07-20 20:21:30.289814377 +0200
+***************
+*** 11639,11644 ****
+--- 11639,11645 ----
+ break;
+ }
+ str += len;
++ capcol -= len;
+ }
+ }
+ }
+*** ../vim-8.1.0198/src/version.c 2018-07-20 19:56:06.006997358 +0200
+--- src/version.c 2018-07-20 20:27:36.763686510 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 199,
+ /**/
+
+--
+ Bravely bold Sir Robin, rode forth from Camelot,
+ He was not afraid to die, Oh Brave Sir Robin,
+ He was not at all afraid to be killed in nasty ways
+ Brave, brave, brave, brave Sir Robin.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0200 b/data/vim/patches/8.1.0200
new file mode 100644
index 000000000..e02ced27a
--- /dev/null
+++ b/data/vim/patches/8.1.0200
@@ -0,0 +1,93 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0200
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0200
+Problem: spellbadword() not tested.
+Solution: Add a test. (Dominique Pelle, closes #3235)
+Files: src/testdir/test_spell.vim
+
+
+*** ../vim-8.1.0199/src/testdir/test_spell.vim 2017-12-21 20:24:51.000000000 +0100
+--- src/testdir/test_spell.vim 2018-07-20 23:33:17.188338957 +0200
+***************
+*** 68,73 ****
+--- 68,114 ----
+ bwipe!
+ endfunc
+
++ " Test spellbadword() with argument
++ func Test_spellbadword()
++ set spell
++
++ call assert_equal(['bycycle', 'bad'], spellbadword('My bycycle.'))
++ call assert_equal(['another', 'caps'], spellbadword('A sentence. another sentence'))
++
++ set spelllang=en
++ call assert_equal(['', ''], spellbadword('centre'))
++ call assert_equal(['', ''], spellbadword('center'))
++ set spelllang=en_us
++ call assert_equal(['centre', 'local'], spellbadword('centre'))
++ call assert_equal(['', ''], spellbadword('center'))
++ set spelllang=en_gb
++ call assert_equal(['', ''], spellbadword('centre'))
++ call assert_equal(['center', 'local'], spellbadword('center'))
++
++ " Create a small word list to test that spellbadword('...')
++ " can return ['...', 'rare'].
++ e Xwords
++ insert
++ foo
++ foobar/?
++ .
++ w!
++ mkspell! Xwords.spl Xwords
++ set spelllang=Xwords.spl
++ call assert_equal(['foobar', 'rare'], spellbadword('foo foobar'))
++
++ " Typo should not be detected without the 'spell' option.
++ set spelllang=en_gb nospell
++ call assert_equal(['', ''], spellbadword('centre'))
++ call assert_equal(['', ''], spellbadword('My bycycle.'))
++ call assert_equal(['', ''], spellbadword('A sentence. another sentence'))
++
++ call delete('Xwords.spl')
++ call delete('Xwords')
++ set spelllang&
++ set spell&
++ endfunc
++
+ func Test_spellreall()
+ new
+ set spell
+*** ../vim-8.1.0199/src/version.c 2018-07-20 20:28:44.855379332 +0200
+--- src/version.c 2018-07-20 23:34:21.732001781 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 200,
+ /**/
+
+--
+The greatest lies of all time:
+ (1) The check is in the mail.
+ (2) We have a really challenging assignment for you.
+ (3) I love you.
+ (4) All bugs have been fixed.
+ (5) This won't hurt a bit.
+ (6) Honey, I just need to debug this program and be home in 5 minutes.
+ (7) I have just sent you an e-mail about that.
+ (8) Of course I'll respect you in the morning.
+ (9) I'm from the government, and I'm here to help you.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0201 b/data/vim/patches/8.1.0201
new file mode 100644
index 000000000..b978d9642
--- /dev/null
+++ b/data/vim/patches/8.1.0201
@@ -0,0 +1,332 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0201
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0201
+Problem: Newer Python uses "importlib" instead of "imp".
+Solution: Use "importlib" for newer Python versions. (closes #3163)
+Files: src/if_py_both.h, src/testdir/test87.in
+
+
+*** ../vim-8.1.0200/src/if_py_both.h 2018-07-08 17:18:58.420462346 +0200
+--- src/if_py_both.h 2018-07-22 04:05:36.131054785 +0200
+***************
+*** 88,95 ****
+--- 88,99 ----
+ static PyObject *vim_module;
+ static PyObject *vim_special_path_object;
+
++ #if PY_VERSION_HEX >= 0x030700f0
++ static PyObject *py_find_spec;
++ #else
+ static PyObject *py_find_module;
+ static PyObject *py_load_module;
++ #endif
+
+ static PyObject *VimError;
+
+***************
+*** 539,544 ****
+--- 543,549 ----
+ return 0;
+ }
+
++ #if PY_VERSION_HEX < 0x030700f0
+ typedef struct
+ {
+ PyObject_HEAD
+***************
+*** 567,572 ****
+--- 572,578 ----
+ {"load_module", (PyCFunction)LoaderLoadModule, METH_VARARGS, ""},
+ { NULL, NULL, 0, NULL}
+ };
++ #endif
+
+ /* Check to see whether a Vim error has been reported, or a keyboard
+ * interrupt has been detected.
+***************
+*** 1163,1168 ****
+--- 1169,1205 ----
+ return ret;
+ }
+
++ #if PY_VERSION_HEX >= 0x030700f0
++ static PyObject *
++ FinderFindSpec(PyObject *self, PyObject *args)
++ {
++ char *fullname;
++ PyObject *paths;
++ PyObject *target = Py_None;
++ PyObject *spec;
++
++ if (!PyArg_ParseTuple(args, "s|O", &fullname, &target))
++ return NULL;
++
++ if (!(paths = Vim_GetPaths(self)))
++ return NULL;
++
++ spec = PyObject_CallFunction(py_find_spec, "sNN", fullname, paths, target);
++
++ Py_DECREF(paths);
++
++ if (!spec)
++ {
++ if (PyErr_Occurred())
++ return NULL;
++
++ Py_INCREF(Py_None);
++ return Py_None;
++ }
++
++ return spec;
++ }
++ #else
+ static PyObject *
+ call_load_module(char *name, int len, PyObject *find_module_result)
+ {
+***************
+*** 1305,1310 ****
+--- 1342,1348 ----
+
+ return (PyObject *) loader;
+ }
++ #endif
+
+ static PyObject *
+ VimPathHook(PyObject *self UNUSED, PyObject *args)
+***************
+*** 1336,1342 ****
+--- 1374,1384 ----
+ {"chdir", (PyCFunction)VimChdir, METH_VARARGS|METH_KEYWORDS, "Change directory"},
+ {"fchdir", (PyCFunction)VimFchdir, METH_VARARGS|METH_KEYWORDS, "Change directory"},
+ {"foreach_rtp", VimForeachRTP, METH_O, "Call given callable for each path in &rtp"},
++ #if PY_VERSION_HEX >= 0x030700f0
++ {"find_spec", FinderFindSpec, METH_VARARGS, "Internal use only, returns spec object for any input it receives"},
++ #else
+ {"find_module", FinderFindModule, METH_VARARGS, "Internal use only, returns loader object for any input it receives"},
++ #endif
+ {"path_hook", VimPathHook, METH_VARARGS, "Hook function to install in sys.path_hooks"},
+ {"_get_paths", (PyCFunction)Vim_GetPaths, METH_NOARGS, "Get &rtp-based additions to sys.path"},
+ { NULL, NULL, 0, NULL}
+***************
+*** 6545,6550 ****
+--- 6587,6593 ----
+ OptionsType.tp_traverse = (traverseproc)OptionsTraverse;
+ OptionsType.tp_clear = (inquiry)OptionsClear;
+
++ #if PY_VERSION_HEX < 0x030700f0
+ vim_memset(&LoaderType, 0, sizeof(LoaderType));
+ LoaderType.tp_name = "vim.Loader";
+ LoaderType.tp_basicsize = sizeof(LoaderObject);
+***************
+*** 6552,6557 ****
+--- 6595,6601 ----
+ LoaderType.tp_doc = "vim message object";
+ LoaderType.tp_methods = LoaderMethods;
+ LoaderType.tp_dealloc = (destructor)LoaderDestructor;
++ #endif
+
+ #if PY_MAJOR_VERSION >= 3
+ vim_memset(&vimmodule, 0, sizeof(vimmodule));
+***************
+*** 6583,6589 ****
+--- 6627,6635 ----
+ PYTYPE_READY(FunctionType);
+ PYTYPE_READY(OptionsType);
+ PYTYPE_READY(OutputType);
++ #if PY_VERSION_HEX < 0x030700f0
+ PYTYPE_READY(LoaderType);
++ #endif
+ return 0;
+ }
+
+***************
+*** 6707,6713 ****
+--- 6753,6761 ----
+ {"List", (PyObject *)&ListType},
+ {"Function", (PyObject *)&FunctionType},
+ {"Options", (PyObject *)&OptionsType},
++ #if PY_VERSION_HEX < 0x030700f0
+ {"_Loader", (PyObject *)&LoaderType},
++ #endif
+ };
+
+ #define ADD_OBJECT(m, name, obj) \
+***************
+*** 6729,6734 ****
+--- 6777,6786 ----
+ PyObject *other_module;
+ PyObject *attr;
+ PyObject *imp;
++ #if PY_VERSION_HEX >= 0x030700f0
++ PyObject *dict;
++ PyObject *cls;
++ #endif
+
+ for (i = 0; i < (int)(sizeof(numeric_constants)
+ / sizeof(struct numeric_constant));
+***************
+*** 6801,6806 ****
+--- 6853,6880 ----
+
+ ADD_OBJECT(m, "VIM_SPECIAL_PATH", vim_special_path_object);
+
++ #if PY_VERSION_HEX >= 0x030700f0
++ if (!(imp = PyImport_ImportModule("importlib.machinery")))
++ return -1;
++
++ dict = PyModule_GetDict(imp);
++
++ if (!(cls = PyDict_GetItemString(dict, "PathFinder")))
++ {
++ Py_DECREF(imp);
++ return -1;
++ }
++
++ if (!(py_find_spec = PyObject_GetAttrString(cls, "find_spec")))
++ {
++ Py_DECREF(imp);
++ return -1;
++ }
++
++ Py_DECREF(imp);
++
++ ADD_OBJECT(m, "_find_spec", py_find_spec);
++ #else
+ if (!(imp = PyImport_ImportModule("imp")))
+ return -1;
+
+***************
+*** 6821,6826 ****
+--- 6895,6901 ----
+
+ ADD_OBJECT(m, "_find_module", py_find_module);
+ ADD_OBJECT(m, "_load_module", py_load_module);
++ #endif
+
+ return 0;
+ }
+*** ../vim-8.1.0200/src/testdir/test87.in 2017-03-05 18:33:37.000000000 +0100
+--- src/testdir/test87.in 2018-07-22 04:05:36.131054785 +0200
+***************
+*** 219,224 ****
+--- 219,225 ----
+ import re
+
+ py33_type_error_pattern = re.compile('^__call__\(\) takes (\d+) positional argument but (\d+) were given$')
++ py37_exception_repr = re.compile(r'([^\(\),])(\)+)$')
+
+ def ee(expr, g=globals(), l=locals()):
+ cb = vim.current.buffer
+***************
+*** 227,243 ****
+ exec(expr, g, l)
+ except Exception as e:
+ if sys.version_info >= (3, 3) and e.__class__ is AttributeError and str(e).find('has no attribute')>=0 and not str(e).startswith("'vim."):
+! cb.append(expr + ':' + repr((e.__class__, AttributeError(str(e)[str(e).rfind(" '") + 2:-1]))))
+ elif sys.version_info >= (3, 3) and e.__class__ is ImportError and str(e).find('No module named \'') >= 0:
+! cb.append(expr + ':' + repr((e.__class__, ImportError(str(e).replace("'", '')))))
+ elif sys.version_info >= (3, 6) and e.__class__ is ModuleNotFoundError:
+ # Python 3.6 gives ModuleNotFoundError, change it to an ImportError
+! cb.append(expr + ':' + repr((ImportError, ImportError(str(e).replace("'", '')))))
+ elif sys.version_info >= (3, 3) and e.__class__ is TypeError:
+ m = py33_type_error_pattern.search(str(e))
+ if m:
+ msg = '__call__() takes exactly {0} positional argument ({1} given)'.format(m.group(1), m.group(2))
+! cb.append(expr + ':' + repr((e.__class__, TypeError(msg))))
+ else:
+ msg = repr((e.__class__, e))
+ # Messages changed with Python 3.6, change new to old.
+--- 228,244 ----
+ exec(expr, g, l)
+ except Exception as e:
+ if sys.version_info >= (3, 3) and e.__class__ is AttributeError and str(e).find('has no attribute')>=0 and not str(e).startswith("'vim."):
+! msg = repr((e.__class__, AttributeError(str(e)[str(e).rfind(" '") + 2:-1])))
+ elif sys.version_info >= (3, 3) and e.__class__ is ImportError and str(e).find('No module named \'') >= 0:
+! msg = repr((e.__class__, ImportError(str(e).replace("'", ''))))
+ elif sys.version_info >= (3, 6) and e.__class__ is ModuleNotFoundError:
+ # Python 3.6 gives ModuleNotFoundError, change it to an ImportError
+! msg = repr((ImportError, ImportError(str(e).replace("'", ''))))
+ elif sys.version_info >= (3, 3) and e.__class__ is TypeError:
+ m = py33_type_error_pattern.search(str(e))
+ if m:
+ msg = '__call__() takes exactly {0} positional argument ({1} given)'.format(m.group(1), m.group(2))
+! msg = repr((e.__class__, TypeError(msg)))
+ else:
+ msg = repr((e.__class__, e))
+ # Messages changed with Python 3.6, change new to old.
+***************
+*** 249,257 ****
+ oldmsg2 = '''"Can't convert 'int' object to str implicitly"'''
+ if msg.find(newmsg2) > -1:
+ msg = msg.replace(newmsg2, oldmsg2)
+- cb.append(expr + ':' + msg)
+ elif sys.version_info >= (3, 5) and e.__class__ is ValueError and str(e) == 'embedded null byte':
+! cb.append(expr + ':' + repr((TypeError, TypeError('expected bytes with no null'))))
+ else:
+ msg = repr((e.__class__, e))
+ # Some Python versions say can't, others cannot.
+--- 250,257 ----
+ oldmsg2 = '''"Can't convert 'int' object to str implicitly"'''
+ if msg.find(newmsg2) > -1:
+ msg = msg.replace(newmsg2, oldmsg2)
+ elif sys.version_info >= (3, 5) and e.__class__ is ValueError and str(e) == 'embedded null byte':
+! msg = repr((TypeError, TypeError('expected bytes with no null')))
+ else:
+ msg = repr((e.__class__, e))
+ # Some Python versions say can't, others cannot.
+***************
+*** 262,272 ****
+ msg = msg.replace('"cannot ', '\'cannot ')
+ if msg.find(' attributes"') > -1:
+ msg = msg.replace(' attributes"', ' attributes\'')
+! cb.append(expr + ':' + msg)
+ else:
+ cb.append(expr + ':NOT FAILED')
+ except Exception as e:
+! cb.append(expr + '::' + repr((e.__class__, e)))
+ EOF
+ :fun New(...)
+ : return ['NewStart']+a:000+['NewEnd']
+--- 262,277 ----
+ msg = msg.replace('"cannot ', '\'cannot ')
+ if msg.find(' attributes"') > -1:
+ msg = msg.replace(' attributes"', ' attributes\'')
+! if sys.version_info >= (3, 7):
+! msg = py37_exception_repr.sub(r'\1,\2', msg)
+! cb.append(expr + ':' + msg)
+ else:
+ cb.append(expr + ':NOT FAILED')
+ except Exception as e:
+! msg = repr((e.__class__, e))
+! if sys.version_info >= (3, 7):
+! msg = py37_exception_repr.sub(r'\1,\2', msg)
+! cb.append(expr + '::' + msg)
+ EOF
+ :fun New(...)
+ : return ['NewStart']+a:000+['NewEnd']
+*** ../vim-8.1.0200/src/version.c 2018-07-20 23:36:21.171368602 +0200
+--- src/version.c 2018-07-22 04:24:39.197154869 +0200
+***************
+*** 791,792 ****
+--- 791,794 ----
+ { /* Add new patch number below this line */
++ /**/
++ 201,
+ /**/
+
+--
+FIRST HEAD: All right! All right! We'll kill him first and then have tea and
+ biscuits.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0202 b/data/vim/patches/8.1.0202
new file mode 100644
index 000000000..67523f7c4
--- /dev/null
+++ b/data/vim/patches/8.1.0202
@@ -0,0 +1,72 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0202
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0202
+Problem: :version always shows +packages. (Takuya Fujiwara)
+Solution: Add #ifdef (closes #3198) Also for has().
+Files: src/version.c, src/evalfunc.c
+
+
+*** ../vim-8.1.0201/src/version.c 2018-07-22 04:30:16.372005905 +0200
+--- src/version.c 2018-07-22 05:03:36.372998336 +0200
+***************
+*** 493,499 ****
+--- 493,503 ----
+ "-ole",
+ # endif
+ #endif
++ #ifdef FEAT_EVAL
+ "+packages",
++ #else
++ "-packages",
++ #endif
+ #ifdef FEAT_PATH_EXTRA
+ "+path_extra",
+ #else
+*** ../vim-8.1.0201/src/evalfunc.c 2018-07-20 20:28:44.851379341 +0200
+--- src/evalfunc.c 2018-07-22 05:04:06.032807050 +0200
+***************
+*** 6302,6308 ****
+--- 6302,6310 ----
+ #ifdef FEAT_OLE
+ "ole",
+ #endif
++ #ifdef FEAT_EVAL
+ "packages",
++ #endif
+ #ifdef FEAT_PATH_EXTRA
+ "path_extra",
+ #endif
+*** ../vim-8.1.0201/src/version.c 2018-07-22 04:30:16.372005905 +0200
+--- src/version.c 2018-07-22 05:03:36.372998336 +0200
+***************
+*** 791,792 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 202,
+ /**/
+
+--
+ When danger reared its ugly head,
+ He bravely turned his tail and fled
+ Yes, Brave Sir Robin turned about
+ And gallantly he chickened out
+ Bravely taking to his feet
+ He beat a very brave retreat
+ Bravest of the brave Sir Robin
+ Petrified of being dead
+ Soiled his pants then brave Sir Robin
+ Turned away and fled.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0203 b/data/vim/patches/8.1.0203
new file mode 100644
index 000000000..5b07544a8
--- /dev/null
+++ b/data/vim/patches/8.1.0203
@@ -0,0 +1,132 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0203
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0203
+Problem: Building with Perl 5.28 fails on Windows.
+Solution: Define Perl_mg_get. (closes #3196)
+Files: src/if_perl.xs
+
+
+*** ../vim-8.1.0202/src/if_perl.xs 2018-07-16 17:45:16.998502685 +0200
+--- src/if_perl.xs 2018-07-22 06:13:58.852007931 +0200
+***************
+*** 199,204 ****
+--- 199,207 ----
+ # define Perl_gv_stashpv dll_Perl_gv_stashpv
+ # define Perl_markstack_grow dll_Perl_markstack_grow
+ # define Perl_mg_find dll_Perl_mg_find
++ # if (PERL_REVISION == 5) && (PERL_VERSION >= 28)
++ # define Perl_mg_get dll_Perl_mg_get
++ # endif
+ # define Perl_newXS dll_Perl_newXS
+ # define Perl_newSV dll_Perl_newSV
+ # define Perl_newSViv dll_Perl_newSViv
+***************
+*** 342,347 ****
+--- 345,353 ----
+ static void (*Perl_markstack_grow)(pTHX);
+ # endif
+ static MAGIC* (*Perl_mg_find)(pTHX_ SV*, int);
++ # if (PERL_REVISION == 5) && (PERL_VERSION >= 28)
++ static int (*Perl_mg_get)(pTHX_ SV*);
++ # endif
+ static CV* (*Perl_newXS)(pTHX_ char*, XSUBADDR_t, char*);
+ static SV* (*Perl_newSV)(pTHX_ STRLEN);
+ static SV* (*Perl_newSViv)(pTHX_ IV);
+***************
+*** 494,499 ****
+--- 500,508 ----
+ {"Perl_gv_stashpv", (PERL_PROC*)&Perl_gv_stashpv},
+ {"Perl_markstack_grow", (PERL_PROC*)&Perl_markstack_grow},
+ {"Perl_mg_find", (PERL_PROC*)&Perl_mg_find},
++ # if (PERL_REVISION == 5) && (PERL_VERSION >= 28)
++ {"Perl_mg_get", (PERL_PROC*)&Perl_mg_get},
++ # endif
+ {"Perl_newXS", (PERL_PROC*)&Perl_newXS},
+ {"Perl_newSV", (PERL_PROC*)&Perl_newSV},
+ {"Perl_newSViv", (PERL_PROC*)&Perl_newSViv},
+***************
+*** 862,869 ****
+ {
+ if (wp->w_perl_private && perl_interp != NULL)
+ {
+! SV *sv = (SV*)wp->w_perl_private;
+! D_Save_Sv(sv);
+ sv_setiv(sv, 0);
+ SvREFCNT_dec(sv);
+ }
+--- 871,878 ----
+ {
+ if (wp->w_perl_private && perl_interp != NULL)
+ {
+! SV *sv = (SV*)wp->w_perl_private;
+! D_Save_Sv(sv);
+ sv_setiv(sv, 0);
+ SvREFCNT_dec(sv);
+ }
+***************
+*** 875,882 ****
+ {
+ if (bp->b_perl_private && perl_interp != NULL)
+ {
+! SV *sv = (SV *)bp->b_perl_private;
+! D_Save_Sv(sv);
+ sv_setiv(sv, 0);
+ SvREFCNT_dec(sv);
+ }
+--- 884,891 ----
+ {
+ if (bp->b_perl_private && perl_interp != NULL)
+ {
+! SV *sv = (SV *)bp->b_perl_private;
+! D_Save_Sv(sv);
+ sv_setiv(sv, 0);
+ SvREFCNT_dec(sv);
+ }
+***************
+*** 911,919 ****
+
+ if (SvRV(sv) == SvRV(rv))
+ SvREFCNT_dec(SvRV(rv));
+! else /* XXX: Not sure if the `else` condition are right
+! * Test_SvREFCNT() pass in all case.
+! */
+ sv_setsv(sv, rv);
+
+ return 0;
+--- 920,927 ----
+
+ if (SvRV(sv) == SvRV(rv))
+ SvREFCNT_dec(SvRV(rv));
+! else // XXX: Not sure if the `else` condition are right
+! // Test_SvREFCNT() pass in all case.
+ sv_setsv(sv, rv);
+
+ return 0;
+*** ../vim-8.1.0202/src/version.c 2018-07-22 05:08:06.827299787 +0200
+--- src/version.c 2018-07-22 06:40:39.675217593 +0200
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 203,
+ /**/
+
+--
+ GALAHAD turns back. We see from his POV the lovely ZOOT standing by him
+ smiling enchantingly and a number of equally delectable GIRLIES draped
+ around in the seductively poulticed room. They look at him smilingly and
+ wave.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0204 b/data/vim/patches/8.1.0204
new file mode 100644
index 000000000..1f7766673
--- /dev/null
+++ b/data/vim/patches/8.1.0204
@@ -0,0 +1,58 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0204
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0204
+Problem: inputlist() is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3240)
+Files: src/testdir/test_functions.vim
+
+
+*** ../vim-8.1.0203/src/testdir/test_functions.vim 2018-07-15 20:24:25.827299588 +0200
+--- src/testdir/test_functions.vim 2018-07-22 19:33:58.235966937 +0200
+***************
+*** 810,815 ****
+--- 810,826 ----
+ bw!
+ endfunc
+
++ func Test_inputlist()
++ call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>1\<cr>", 'tx')
++ call assert_equal(1, c)
++ call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>2\<cr>", 'tx')
++ call assert_equal(2, c)
++ call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>3\<cr>", 'tx')
++ call assert_equal(3, c)
++
++ call assert_fails('call inputlist("")', 'E686:')
++ endfunc
++
+ func Test_balloon_show()
+ if has('balloon_eval')
+ " This won't do anything but must not crash either.
+*** ../vim-8.1.0203/src/version.c 2018-07-22 07:31:04.742472292 +0200
+--- src/version.c 2018-07-22 19:35:05.935590559 +0200
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 204,
+ /**/
+
+--
+DINGO: Wicked wicked Zoot ... she is a bad person and she must pay the
+ penalty. And here in Castle Anthrax, we have but one punishment
+ ... you must tie her down on a bed ... and spank her. Come!
+GIRLS: A spanking! A spanking!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0205 b/data/vim/patches/8.1.0205
new file mode 100644
index 000000000..f7f78afc2
--- /dev/null
+++ b/data/vim/patches/8.1.0205
@@ -0,0 +1,226 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0205
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0205
+Problem: Invalid memory access with invalid modeline.
+Solution: Pass pointer limit. Add a test. (closes #3241)
+Files: src/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_modeline.vim, src/option.c
+
+
+*** ../vim-8.1.0204/src/Make_all.mak 2018-07-04 23:05:19.221931527 +0200
+--- src/Make_all.mak 2018-07-23 03:54:45.950888854 +0200
+***************
+*** 118,123 ****
+--- 118,124 ----
+ test_messages \
+ test_mksession \
+ test_mksession_utf8 \
++ test_modeline \
+ test_nested_function \
+ test_netbeans \
+ test_normal \
+*** ../vim-8.1.0204/src/testdir/test_alot.vim 2018-05-19 15:00:48.841017887 +0200
+--- src/testdir/test_alot.vim 2018-07-23 03:56:07.742401442 +0200
+***************
+*** 37,42 ****
+--- 37,43 ----
+ source test_match.vim
+ source test_menu.vim
+ source test_messages.vim
++ source test_modeline.vim
+ source test_partial.vim
+ source test_popup.vim
+ source test_put.vim
+*** ../vim-8.1.0204/src/testdir/test_modeline.vim 2018-07-23 04:10:49.533248182 +0200
+--- src/testdir/test_modeline.vim 2018-07-23 04:02:57.055992973 +0200
+***************
+*** 0 ****
+--- 1,8 ----
++ " Tests for parsing the modeline.
++
++ func Test_invalid()
++ " This was reading before allocated memory.
++ call writefile(['vi:0', 'nothing'], 'Xmodeline')
++ call assert_fails('split Xmodeline', 'E518:')
++ bwipe!
++ endfunc
+*** ../vim-8.1.0204/src/option.c 2018-07-08 21:46:52.859037899 +0200
+--- src/option.c 2018-07-23 04:09:28.641716577 +0200
+***************
+*** 3316,3322 ****
+ static char_u *set_num_option(int opt_idx, char_u *varp, long value, char_u *errbuf, size_t errbuflen, int opt_flags);
+ static void check_redraw(long_u flags);
+ static int findoption(char_u *);
+! static int find_key_option(char_u *);
+ static void showoptions(int all, int opt_flags);
+ static int optval_default(struct vimoption *, char_u *varp);
+ static void showoneopt(struct vimoption *, int opt_flags);
+--- 3316,3322 ----
+ static char_u *set_num_option(int opt_idx, char_u *varp, long value, char_u *errbuf, size_t errbuflen, int opt_flags);
+ static void check_redraw(long_u flags);
+ static int findoption(char_u *);
+! static int find_key_option(char_u *arg_arg, int has_lt);
+ static void showoptions(int all, int opt_flags);
+ static int optval_default(struct vimoption *, char_u *varp);
+ static void showoneopt(struct vimoption *, int opt_flags);
+***************
+*** 4492,4498 ****
+ opt_idx = findoption(arg + 1);
+ arg[len++] = '>'; /* restore '>' */
+ if (opt_idx == -1)
+! key = find_key_option(arg + 1);
+ }
+ else
+ {
+--- 4492,4498 ----
+ opt_idx = findoption(arg + 1);
+ arg[len++] = '>'; /* restore '>' */
+ if (opt_idx == -1)
+! key = find_key_option(arg + 1, TRUE);
+ }
+ else
+ {
+***************
+*** 4510,4516 ****
+ opt_idx = findoption(arg);
+ arg[len] = nextchar; /* restore nextchar */
+ if (opt_idx == -1)
+! key = find_key_option(arg);
+ }
+
+ /* remember character after option name */
+--- 4510,4516 ----
+ opt_idx = findoption(arg);
+ arg[len] = nextchar; /* restore nextchar */
+ if (opt_idx == -1)
+! key = find_key_option(arg, FALSE);
+ }
+
+ /* remember character after option name */
+***************
+*** 5362,5368 ****
+ string_to_key(char_u *arg, int multi_byte)
+ {
+ if (*arg == '<')
+! return find_key_option(arg + 1);
+ if (*arg == '^')
+ return Ctrl_chr(arg[1]);
+ if (multi_byte)
+--- 5362,5368 ----
+ string_to_key(char_u *arg, int multi_byte)
+ {
+ if (*arg == '<')
+! return find_key_option(arg + 1, TRUE);
+ if (*arg == '^')
+ return Ctrl_chr(arg[1]);
+ if (multi_byte)
+***************
+*** 9541,9547 ****
+ int key;
+
+ if (STRLEN(name) == 4 && name[0] == 't' && name[1] == '_'
+! && (key = find_key_option(name)) != 0)
+ {
+ char_u key_name[2];
+ char_u *p;
+--- 9541,9547 ----
+ int key;
+
+ if (STRLEN(name) == 4 && name[0] == 't' && name[1] == '_'
+! && (key = find_key_option(name, FALSE)) != 0)
+ {
+ char_u key_name[2];
+ char_u *p;
+***************
+*** 9831,9837 ****
+ int key;
+
+ if (STRLEN(name) == 4 && name[0] == 't' && name[1] == '_'
+! && (key = find_key_option(name)) != 0)
+ {
+ char_u key_name[2];
+
+--- 9831,9837 ----
+ int key;
+
+ if (STRLEN(name) == 4 && name[0] == 't' && name[1] == '_'
+! && (key = find_key_option(name, FALSE)) != 0)
+ {
+ char_u key_name[2];
+
+***************
+*** 9952,9963 ****
+
+ /*
+ * Translate a string like "t_xx", "<t_xx>" or "<S-Tab>" to a key number.
+ */
+ static int
+! find_key_option(char_u *arg)
+ {
+! int key;
+ int modifiers;
+
+ /*
+ * Don't use get_special_key_code() for t_xx, we don't want it to call
+--- 9952,9966 ----
+
+ /*
+ * Translate a string like "t_xx", "<t_xx>" or "<S-Tab>" to a key number.
++ * When "has_lt" is true there is a '<' before "*arg_arg".
++ * Returns 0 when the key is not recognized.
+ */
+ static int
+! find_key_option(char_u *arg_arg, int has_lt)
+ {
+! int key = 0;
+ int modifiers;
++ char_u *arg = arg_arg;
+
+ /*
+ * Don't use get_special_key_code() for t_xx, we don't want it to call
+***************
+*** 9965,9971 ****
+ */
+ if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3])
+ key = TERMCAP2KEY(arg[2], arg[3]);
+! else
+ {
+ --arg; /* put arg at the '<' */
+ modifiers = 0;
+--- 9968,9974 ----
+ */
+ if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3])
+ key = TERMCAP2KEY(arg[2], arg[3]);
+! else if (has_lt)
+ {
+ --arg; /* put arg at the '<' */
+ modifiers = 0;
+*** ../vim-8.1.0204/src/version.c 2018-07-22 19:36:29.255125833 +0200
+--- src/version.c 2018-07-23 03:55:34.482599313 +0200
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 205,
+ /**/
+
+--
+DINGO: You must spank her well and after you have spanked her you
+ may deal with her as you like and then ... spank me.
+AMAZING: And spank me!
+STUNNER: And me.
+LOVELY: And me.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0206 b/data/vim/patches/8.1.0206
new file mode 100644
index 000000000..22faed481
--- /dev/null
+++ b/data/vim/patches/8.1.0206
@@ -0,0 +1,80 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0206
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0206 (after 8.1.0205)
+Problem: Duplicate test function name.
+Solution: Rename both functions.
+Files: src/testdir/test_modeline.vim, src/testdir/test_glob2regpat.vim
+
+
+*** ../vim-8.1.0205/src/testdir/test_modeline.vim 2018-07-23 04:11:37.648969780 +0200
+--- src/testdir/test_modeline.vim 2018-07-23 04:27:46.940228868 +0200
+***************
+*** 1,6 ****
+ " Tests for parsing the modeline.
+
+! func Test_invalid()
+ " This was reading before allocated memory.
+ call writefile(['vi:0', 'nothing'], 'Xmodeline')
+ call assert_fails('split Xmodeline', 'E518:')
+--- 1,6 ----
+ " Tests for parsing the modeline.
+
+! func Test_modeline_invalid()
+ " This was reading before allocated memory.
+ call writefile(['vi:0', 'nothing'], 'Xmodeline')
+ call assert_fails('split Xmodeline', 'E518:')
+*** ../vim-8.1.0205/src/testdir/test_glob2regpat.vim 2016-08-10 23:02:33.000000000 +0200
+--- src/testdir/test_glob2regpat.vim 2018-07-23 04:29:20.587735994 +0200
+***************
+*** 1,12 ****
+ " Test glob2regpat()
+
+! func Test_invalid()
+ call assert_fails('call glob2regpat(1.33)', 'E806:')
+ call assert_fails('call glob2regpat("}")', 'E219:')
+ call assert_fails('call glob2regpat("{")', 'E220:')
+ endfunc
+
+! func Test_valid()
+ call assert_equal('^foo\.', glob2regpat('foo.*'))
+ call assert_equal('^foo.$', glob2regpat('foo?'))
+ call assert_equal('\.vim$', glob2regpat('*.vim'))
+--- 1,12 ----
+ " Test glob2regpat()
+
+! func Test_glob2regpat_invalid()
+ call assert_fails('call glob2regpat(1.33)', 'E806:')
+ call assert_fails('call glob2regpat("}")', 'E219:')
+ call assert_fails('call glob2regpat("{")', 'E220:')
+ endfunc
+
+! func Test_glob2regpat_valid()
+ call assert_equal('^foo\.', glob2regpat('foo.*'))
+ call assert_equal('^foo.$', glob2regpat('foo?'))
+ call assert_equal('\.vim$', glob2regpat('*.vim'))
+*** ../vim-8.1.0205/src/version.c 2018-07-23 04:11:37.652969757 +0200
+--- src/version.c 2018-07-23 04:49:06.929104402 +0200
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 206,
+ /**/
+
+--
+GALAHAD: No. Look, I can tackle this lot single-handed!
+GIRLS: Yes, yes, let him Tackle us single-handed!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0207 b/data/vim/patches/8.1.0207
new file mode 100644
index 000000000..e6736dbcd
--- /dev/null
+++ b/data/vim/patches/8.1.0207
@@ -0,0 +1,67 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0207
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0207
+Problem: Need many menu translation files to cover regions.
+Solution: When there is no region match, try without. (Christian Brabandt)
+Files: runtime/menu.vim
+
+
+*** ../vim-8.1.0206/runtime/menu.vim 2018-05-17 12:39:14.000000000 +0200
+--- runtime/menu.vim 2018-07-23 05:07:00.697989266 +0200
+***************
+*** 56,61 ****
+--- 56,68 ----
+ let s:lang = substitute(s:lang, '\.[^.]*', "", "")
+ exe "runtime! lang/menu_" . s:lang . "[^a-z]*vim"
+
++ if !exists("did_menu_trans") && s:lang =~ '_'
++ " If the language includes a region try matching without that region.
++ " (e.g. find menu_de.vim if s:lang == de_DE).
++ let langonly = substitute(s:lang, '_.*', "", "")
++ exe "runtime! lang/menu_" . langonly . "[^a-z]*vim"
++ endif
++
+ if !exists("did_menu_trans") && strlen($LANG) > 1 && s:lang !~ '^en_us'
+ " On windows locale names are complicated, try using $LANG, it might
+ " have been set by set_init_1(). But don't do this for "en" or "en_us".
+***************
+*** 809,815 ****
+ let name = a:fname
+ if name == ''
+ if !exists("g:menutrans_no_file")
+! let g:menutrans_no_file = "[No file]"
+ endif
+ let name = g:menutrans_no_file
+ else
+--- 816,822 ----
+ let name = a:fname
+ if name == ''
+ if !exists("g:menutrans_no_file")
+! let g:menutrans_no_file = "[No Name]"
+ endif
+ let name = g:menutrans_no_file
+ else
+*** ../vim-8.1.0206/src/version.c 2018-07-23 04:49:17.225024903 +0200
+--- src/version.c 2018-07-23 05:05:44.138454667 +0200
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 207,
+ /**/
+
+--
+ ### Hiroshima 45, Chernobyl 86, Windows 95 ###
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0208 b/data/vim/patches/8.1.0208
new file mode 100644
index 000000000..1ad3c514b
--- /dev/null
+++ b/data/vim/patches/8.1.0208
@@ -0,0 +1,48 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0208
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0208 (after 8.1.0205)
+Problem: File left behind after running individual test.
+Solution: Delete the file.
+Files: src/testdir/test_modeline.vim
+
+
+*** ../vim-8.1.0207/src/testdir/test_modeline.vim 2018-07-23 04:49:17.225024903 +0200
+--- src/testdir/test_modeline.vim 2018-07-24 04:43:26.033462800 +0200
+***************
+*** 5,8 ****
+--- 5,9 ----
+ call writefile(['vi:0', 'nothing'], 'Xmodeline')
+ call assert_fails('split Xmodeline', 'E518:')
+ bwipe!
++ call delete('Xmodeline')
+ endfunc
+*** ../vim-8.1.0207/src/version.c 2018-07-23 05:09:05.593235641 +0200
+--- src/version.c 2018-07-24 04:44:21.565053744 +0200
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 208,
+ /**/
+
+--
+E M A C S
+s e l o h
+c t t n i
+a a t f
+p r t
+e o
+ l
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0209 b/data/vim/patches/8.1.0209
new file mode 100644
index 000000000..01f570da6
--- /dev/null
+++ b/data/vim/patches/8.1.0209
@@ -0,0 +1,83 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0209
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0209
+Problem: Stderr output from Ruby messes up display.
+Solution: Turn the stderr output into a Vim message. (Masataka Pocke
+ Kuwabara, closes #3238)
+Files: src/if_ruby.c
+
+
+*** ../vim-8.1.0208/src/if_ruby.c 2018-05-17 13:07:54.000000000 +0200
+--- src/if_ruby.c 2018-07-24 05:32:31.520411688 +0200
+***************
+*** 232,237 ****
+--- 232,238 ----
+ # define rb_define_singleton_method dll_rb_define_singleton_method
+ # define rb_define_virtual_variable dll_rb_define_virtual_variable
+ # define rb_stdout (*dll_rb_stdout)
++ # define rb_stderr (*dll_rb_stderr)
+ # define rb_eArgError (*dll_rb_eArgError)
+ # define rb_eIndexError (*dll_rb_eIndexError)
+ # define rb_eRuntimeError (*dll_rb_eRuntimeError)
+***************
+*** 360,365 ****
+--- 361,367 ----
+ static void (*dll_rb_define_singleton_method) (VALUE,const char*,VALUE(*)(),int);
+ static void (*dll_rb_define_virtual_variable) (const char*,VALUE(*)(),void(*)());
+ static VALUE *dll_rb_stdout;
++ static VALUE *dll_rb_stderr;
+ static VALUE *dll_rb_eArgError;
+ static VALUE *dll_rb_eIndexError;
+ static VALUE *dll_rb_eRuntimeError;
+***************
+*** 553,558 ****
+--- 555,561 ----
+ {"rb_define_singleton_method", (RUBY_PROC*)&dll_rb_define_singleton_method},
+ {"rb_define_virtual_variable", (RUBY_PROC*)&dll_rb_define_virtual_variable},
+ {"rb_stdout", (RUBY_PROC*)&dll_rb_stdout},
++ {"rb_stderr", (RUBY_PROC*)&dll_rb_stderr},
+ {"rb_eArgError", (RUBY_PROC*)&dll_rb_eArgError},
+ {"rb_eIndexError", (RUBY_PROC*)&dll_rb_eIndexError},
+ {"rb_eRuntimeError", (RUBY_PROC*)&dll_rb_eRuntimeError},
+***************
+*** 1542,1552 ****
+--- 1545,1559 ----
+ {
+ #ifndef DYNAMIC_RUBY
+ RUBYEXTERN VALUE rb_stdout;
++ RUBYEXTERN VALUE rb_stderr;
+ #endif
+
+ rb_stdout = rb_obj_alloc(rb_cObject);
++ rb_stderr = rb_obj_alloc(rb_cObject);
+ rb_define_singleton_method(rb_stdout, "write", vim_message, 1);
+ rb_define_singleton_method(rb_stdout, "flush", f_nop, 0);
++ rb_define_singleton_method(rb_stderr, "write", vim_message, 1);
++ rb_define_singleton_method(rb_stderr, "flush", f_nop, 0);
+ rb_define_global_function("p", f_p, -1);
+ }
+
+*** ../vim-8.1.0208/src/version.c 2018-07-24 04:51:15.698271642 +0200
+--- src/version.c 2018-07-24 05:33:59.439933605 +0200
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 209,
+ /**/
+
+--
+Back up my hard drive? I can't find the reverse switch!
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0210 b/data/vim/patches/8.1.0210
new file mode 100644
index 000000000..3c13732ed
--- /dev/null
+++ b/data/vim/patches/8.1.0210
@@ -0,0 +1,115 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0210
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0210
+Problem: Still a few K&R function declarations.
+Solution: Use ANSI function declarations (Hirohito Higashi)
+Files: src/eval.c, src/evalfunc.c, src/list.c
+
+
+*** ../vim-8.1.0209/src/eval.c Sat Jul 14 17:24:57 2018
+--- src/eval.c Wed Jul 25 19:18:42 2018
+***************
+*** 9387,9394 ****
+ }
+
+ char_u *
+! typval_tostring(arg)
+! typval_T *arg;
+ {
+ char_u *tofree;
+ char_u numbuf[NUMBUFLEN];
+--- 9387,9393 ----
+ }
+
+ char_u *
+! typval_tostring(typval_T *arg)
+ {
+ char_u *tofree;
+ char_u numbuf[NUMBUFLEN];
+*** ../vim-8.1.0209/src/evalfunc.c Sun Jul 22 05:08:06 2018
+--- src/evalfunc.c Wed Jul 25 19:18:42 2018
+***************
+*** 2857,2865 ****
+ * "deletebufline()" function
+ */
+ static void
+! f_deletebufline(argvars, rettv)
+! typval_T *argvars;
+! typval_T *rettv;
+ {
+ buf_T *buf;
+ linenr_T first, last;
+--- 2857,2863 ----
+ * "deletebufline()" function
+ */
+ static void
+! f_deletebufline(typval_T *argvars, typval_T *rettv)
+ {
+ buf_T *buf;
+ linenr_T first, last;
+***************
+*** 10502,10510 ****
+ * "setbufline()" function
+ */
+ static void
+! f_setbufline(argvars, rettv)
+! typval_T *argvars;
+! typval_T *rettv;
+ {
+ linenr_T lnum;
+ buf_T *buf;
+--- 10500,10506 ----
+ * "setbufline()" function
+ */
+ static void
+! f_setbufline(typval_T *argvars, typval_T *rettv)
+ {
+ linenr_T lnum;
+ buf_T *buf;
+*** ../vim-8.1.0209/src/list.c Sat Feb 10 19:49:08 2018
+--- src/list.c Wed Jul 25 19:18:42 2018
+***************
+*** 479,487 ****
+ * Return FAIL when out of memory.
+ */
+ int
+! list_append_list(list1, list2)
+! list_T *list1;
+! list_T *list2;
+ {
+ listitem_T *li = listitem_alloc();
+
+--- 479,485 ----
+ * Return FAIL when out of memory.
+ */
+ int
+! list_append_list(list_T *list1, list_T *list2)
+ {
+ listitem_T *li = listitem_alloc();
+
+*** ../vim-8.1.0209/src/version.c Tue Jul 24 05:41:25 2018
+--- src/version.c Wed Jul 25 19:49:06 2018
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 210,
+ /**/
+
+--
+Even got a Datapoint 3600(?) with a DD50 connector instead of the
+usual DB25... what a nightmare trying to figure out the pinout
+for *that* with no spex...
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0211 b/data/vim/patches/8.1.0211
new file mode 100644
index 000000000..3ce6e3644
--- /dev/null
+++ b/data/vim/patches/8.1.0211
@@ -0,0 +1,228 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0211
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0211
+Problem: Expanding a file name "~" results in $HOME. (Aidan Shafran)
+Solution: Change "~" to "./~" before expanding. (closes #3072)
+Files: src/testdir/test_expand.vim, src/ex_docmd.c, src/eval.c,
+ src/proto/eval.pro, src/evalfunc.c, src/if_cscope.c, src/misc1.c
+
+
+*** ../vim-8.1.0210/src/testdir/test_expand.vim Sun Jan 17 18:33:03 2016
+--- src/testdir/test_expand.vim Wed Jul 25 21:05:55 2018
+***************
+*** 39,41 ****
+--- 39,49 ----
+ call delete('Xdir ~ dir', 'd')
+ call assert_false(isdirectory('Xdir ~ dir'))
+ endfunc
++
++ func Test_expand_tilde_filename()
++ split ~
++ call assert_equal('~', expand('%'))
++ call assert_notequal(expand('%:p'), expand('~/'))
++ call assert_match('\~', expand('%:p'))
++ bwipe!
++ endfunc
+*** ../vim-8.1.0210/src/ex_docmd.c Sat Jul 7 16:41:10 2018
+--- src/ex_docmd.c Wed Jul 25 21:03:33 2018
+***************
+*** 10654,10659 ****
+--- 10654,10660 ----
+ int resultlen;
+ buf_T *buf;
+ int valid = VALID_HEAD + VALID_PATH; /* assume valid result */
++ int tilde_file = FALSE;
+ int spec_idx;
+ #ifdef FEAT_MODIFY_FNAME
+ int skip_mod = FALSE;
+***************
+*** 10720,10726 ****
+--- 10721,10730 ----
+ valid = 0; /* Must have ":p:h" to be valid */
+ }
+ else
++ {
+ result = curbuf->b_fname;
++ tilde_file = STRCMP(result, "~") == 0;
++ }
+ break;
+
+ case SPEC_HASH: /* '#' or "#99": alternate file */
+***************
+*** 10784,10790 ****
+--- 10788,10797 ----
+ valid = 0; /* Must have ":p:h" to be valid */
+ }
+ else
++ {
+ result = buf->b_fname;
++ tilde_file = STRCMP(result, "~") == 0;
++ }
+ }
+ break;
+
+***************
+*** 10877,10883 ****
+ #ifdef FEAT_MODIFY_FNAME
+ else if (!skip_mod)
+ {
+! valid |= modify_fname(src, usedlen, &result, &resultbuf,
+ &resultlen);
+ if (result == NULL)
+ {
+--- 10884,10890 ----
+ #ifdef FEAT_MODIFY_FNAME
+ else if (!skip_mod)
+ {
+! valid |= modify_fname(src, tilde_file, usedlen, &result, &resultbuf,
+ &resultlen);
+ if (result == NULL)
+ {
+*** ../vim-8.1.0210/src/eval.c Wed Jul 25 19:49:41 2018
+--- src/eval.c Wed Jul 25 21:05:06 2018
+***************
+*** 9690,9700 ****
+ */
+ int
+ modify_fname(
+! char_u *src, /* string with modifiers */
+! int *usedlen, /* characters after src that are used */
+! char_u **fnamep, /* file name so far */
+! char_u **bufp, /* buffer for allocated file name or NULL */
+! int *fnamelen) /* length of fnamep */
+ {
+ int valid = 0;
+ char_u *tail;
+--- 9690,9701 ----
+ */
+ int
+ modify_fname(
+! char_u *src, // string with modifiers
+! int tilde_file, // "~" is a file name, not $HOME
+! int *usedlen, // characters after src that are used
+! char_u **fnamep, // file name so far
+! char_u **bufp, // buffer for allocated file name or NULL
+! int *fnamelen) // length of fnamep
+ {
+ int valid = 0;
+ char_u *tail;
+***************
+*** 9724,9731 ****
+ || (*fnamep)[1] == '\\'
+ # endif
+ || (*fnamep)[1] == NUL)
+-
+ #endif
+ )
+ {
+ *fnamep = expand_env_save(*fnamep);
+--- 9725,9732 ----
+ || (*fnamep)[1] == '\\'
+ # endif
+ || (*fnamep)[1] == NUL)
+ #endif
++ && !(tilde_file && (*fnamep)[1] == NUL)
+ )
+ {
+ *fnamep = expand_env_save(*fnamep);
+*** ../vim-8.1.0210/src/proto/eval.pro Tue Jun 12 22:05:10 2018
+--- src/proto/eval.pro Wed Jul 25 21:03:50 2018
+***************
+*** 136,142 ****
+ int typval_compare(typval_T *typ1, typval_T *typ2, exptype_T type, int type_is, int ic);
+ char_u *typval_tostring(typval_T *arg);
+ int var_exists(char_u *var);
+! int modify_fname(char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen);
+ char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, typval_T *expr, char_u *flags);
+ void filter_map(typval_T *argvars, typval_T *rettv, int map);
+ /* vim: set ft=c : */
+--- 136,142 ----
+ int typval_compare(typval_T *typ1, typval_T *typ2, exptype_T type, int type_is, int ic);
+ char_u *typval_tostring(typval_T *arg);
+ int var_exists(char_u *var);
+! int modify_fname(char_u *src, int tilde_file, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen);
+ char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, typval_T *expr, char_u *flags);
+ void filter_map(typval_T *argvars, typval_T *rettv, int map);
+ /* vim: set ft=c : */
+*** ../vim-8.1.0210/src/evalfunc.c Wed Jul 25 19:49:41 2018
+--- src/evalfunc.c Wed Jul 25 21:01:17 2018
+***************
+*** 3801,3807 ****
+ else
+ {
+ len = (int)STRLEN(fname);
+! (void)modify_fname(mods, &usedlen, &fname, &fbuf, &len);
+ }
+
+ rettv->v_type = VAR_STRING;
+--- 3801,3807 ----
+ else
+ {
+ len = (int)STRLEN(fname);
+! (void)modify_fname(mods, FALSE, &usedlen, &fname, &fbuf, &len);
+ }
+
+ rettv->v_type = VAR_STRING;
+*** ../vim-8.1.0210/src/if_cscope.c Sun Mar 4 16:07:23 2018
+--- src/if_cscope.c Wed Jul 25 21:10:45 2018
+***************
+*** 519,525 ****
+ #ifdef FEAT_MODIFY_FNAME
+ len = (int)STRLEN(fname);
+ fbuf = (char_u *)fname;
+! (void)modify_fname((char_u *)":p", &usedlen,
+ (char_u **)&fname, &fbuf, &len);
+ if (fname == NULL)
+ goto add_err;
+--- 519,525 ----
+ #ifdef FEAT_MODIFY_FNAME
+ len = (int)STRLEN(fname);
+ fbuf = (char_u *)fname;
+! (void)modify_fname((char_u *)":p", FALSE, &usedlen,
+ (char_u **)&fname, &fbuf, &len);
+ if (fname == NULL)
+ goto add_err;
+*** ../vim-8.1.0210/src/misc1.c Sat Jul 7 16:41:10 2018
+--- src/misc1.c Wed Jul 25 21:11:10 2018
+***************
+*** 4908,4914 ****
+ char_u *fbuf = NULL;
+
+ flen = (int)STRLEN(homedir_env);
+! (void)modify_fname((char_u *)":p", &usedlen,
+ &homedir_env, &fbuf, &flen);
+ flen = (int)STRLEN(homedir_env);
+ if (flen > 0 && vim_ispathsep(homedir_env[flen - 1]))
+--- 4908,4914 ----
+ char_u *fbuf = NULL;
+
+ flen = (int)STRLEN(homedir_env);
+! (void)modify_fname((char_u *)":p", FALSE, &usedlen,
+ &homedir_env, &fbuf, &flen);
+ flen = (int)STRLEN(homedir_env);
+ if (flen > 0 && vim_ispathsep(homedir_env[flen - 1]))
+*** ../vim-8.1.0210/src/version.c Wed Jul 25 19:49:41 2018
+--- src/version.c Wed Jul 25 21:18:08 2018
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 211,
+ /**/
+
+--
+You were lucky to have a LAKE! There were a hundred and sixty of
+us living in a small shoebox in the middle of the road.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0212 b/data/vim/patches/8.1.0212
new file mode 100644
index 000000000..aed136ba9
--- /dev/null
+++ b/data/vim/patches/8.1.0212
@@ -0,0 +1,253 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0212
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0212
+Problem: Preferred cursor column not set in interfaces.
+Solution: Set w_set_curswant when setting the cursor. (David Hotham,
+ closes #3060)
+Files: src/if_lua.c, src/if_mzsch.c, src/if_perl.xs, src/if_py_both.h,
+ src/if_ruby.c, src/if_tcl.c, src/testdir/test_lua.vim,
+ src/testdir/test_perl.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_ruby.vim,
+ src/testdir/test_tcl.vim
+
+
+*** ../vim-8.1.0211/src/if_lua.c Sat Jul 14 20:49:39 2018
+--- src/if_lua.c Wed Jul 25 21:55:11 2018
+***************
+*** 1377,1382 ****
+--- 1377,1383 ----
+ luaV_checksandbox(L);
+ #endif
+ w->w_cursor.col = v - 1;
++ w->w_set_curswant = TRUE;
+ update_screen(VALID);
+ }
+ else if (strncmp(s, "width", 5) == 0)
+*** ../vim-8.1.0211/src/if_mzsch.c Sun Oct 8 17:29:02 2017
+--- src/if_mzsch.c Wed Jul 25 21:55:11 2018
+***************
+*** 2132,2137 ****
+--- 2132,2138 ----
+
+ win->win->w_cursor.lnum = lnum;
+ win->win->w_cursor.col = col;
++ win->win->w_set_curswant = TRUE;
+ update_screen(VALID);
+
+ raise_if_error();
+*** ../vim-8.1.0211/src/if_perl.xs Sun Jul 22 07:31:04 2018
+--- src/if_perl.xs Wed Jul 25 21:55:11 2018
+***************
+*** 1691,1696 ****
+--- 1691,1697 ----
+ col = (int) SvIV(ST(2));
+ win->w_cursor.lnum = lnum;
+ win->w_cursor.col = col;
++ win->w_set_curswant = TRUE;
+ check_cursor(); /* put cursor on an existing line */
+ update_screen(NOT_VALID);
+ }
+*** ../vim-8.1.0211/src/if_py_both.h Sun Jul 22 04:30:16 2018
+--- src/if_py_both.h Wed Jul 25 21:55:11 2018
+***************
+*** 3985,3990 ****
+--- 3985,3991 ----
+
+ self->win->w_cursor.lnum = lnum;
+ self->win->w_cursor.col = col;
++ self->win->w_set_curswant = TRUE;
+ #ifdef FEAT_VIRTUALEDIT
+ self->win->w_cursor.coladd = 0;
+ #endif
+*** ../vim-8.1.0211/src/if_ruby.c Tue Jul 24 05:41:25 2018
+--- src/if_ruby.c Wed Jul 25 21:55:11 2018
+***************
+*** 1517,1522 ****
+--- 1517,1523 ----
+ col = RARRAY_PTR(pos)[1];
+ win->w_cursor.lnum = NUM2LONG(lnum);
+ win->w_cursor.col = NUM2UINT(col);
++ win->w_set_curswant = TRUE;
+ check_cursor(); /* put cursor on an existing line */
+ update_screen(NOT_VALID);
+ return Qnil;
+*** ../vim-8.1.0211/src/if_tcl.c Wed Jul 4 22:12:19 2018
+--- src/if_tcl.c Wed Jul 25 21:55:11 2018
+***************
+*** 1091,1096 ****
+--- 1091,1097 ----
+ /* TODO: should check column */
+ win->w_cursor.lnum = val1;
+ win->w_cursor.col = col2vim(val2);
++ win->w_set_curswant = TRUE;
+ flags |= FL_UPDATE_SCREEN;
+ break;
+
+*** ../vim-8.1.0211/src/testdir/test_lua.vim Sat Jul 7 23:07:35 2018
+--- src/testdir/test_lua.vim Wed Jul 25 21:55:11 2018
+***************
+*** 555,557 ****
+--- 555,574 ----
+ call delete('Xlua_file')
+ bwipe!
+ endfunc
++
++ func Test_set_cursor()
++ " Check that setting the cursor position works.
++ new
++ call setline(1, ['first line', 'second line'])
++ normal gg
++ lua << EOF
++ w = vim.window()
++ w.line = 1
++ w.col = 5
++ EOF
++ call assert_equal([1, 5], [line('.'), col('.')])
++
++ " Check that movement after setting cursor position keeps current column.
++ normal j
++ call assert_equal([2, 5], [line('.'), col('.')])
++ endfunc
+*** ../vim-8.1.0211/src/testdir/test_perl.vim Mon Jul 16 18:08:56 2018
+--- src/testdir/test_perl.vim Wed Jul 25 21:55:11 2018
+***************
+*** 258,260 ****
+--- 258,273 ----
+ --perl
+ %bw!
+ endfunc
++
++ func Test_set_cursor()
++ " Check that setting the cursor position works.
++ new
++ call setline(1, ['first line', 'second line'])
++ normal gg
++ perldo $curwin->Cursor(1, 5)
++ call assert_equal([1, 6], [line('.'), col('.')])
++
++ " Check that movement after setting cursor position keeps current column.
++ normal j
++ call assert_equal([2, 6], [line('.'), col('.')])
++ endfunc
+*** ../vim-8.1.0211/src/testdir/test_python2.vim Sun Jan 29 21:20:44 2017
+--- src/testdir/test_python2.vim Wed Jul 25 21:55:11 2018
+***************
+*** 22,24 ****
+--- 22,38 ----
+ bwipe!
+ bwipe!
+ endfunc
++
++ func Test_set_cursor()
++ " Check that setting the cursor position works.
++ py import vim
++ new
++ call setline(1, ['first line', 'second line'])
++ normal gg
++ pydo vim.current.window.cursor = (1, 5)
++ call assert_equal([1, 6], [line('.'), col('.')])
++
++ " Check that movement after setting cursor position keeps current column.
++ normal j
++ call assert_equal([2, 6], [line('.'), col('.')])
++ endfunc
+*** ../vim-8.1.0211/src/testdir/test_python3.vim Sun Jan 29 21:26:04 2017
+--- src/testdir/test_python3.vim Wed Jul 25 21:55:11 2018
+***************
+*** 1,4 ****
+! " Test for python 2 commands.
+ " TODO: move tests from test88.in here.
+
+ if !has('python3')
+--- 1,4 ----
+! " Test for python 3 commands.
+ " TODO: move tests from test88.in here.
+
+ if !has('python3')
+***************
+*** 22,24 ****
+--- 22,38 ----
+ bwipe!
+ bwipe!
+ endfunc
++
++ func Test_set_cursor()
++ " Check that setting the cursor position works.
++ py3 import vim
++ new
++ call setline(1, ['first line', 'second line'])
++ normal gg
++ py3do vim.current.window.cursor = (1, 5)
++ call assert_equal([1, 6], [line('.'), col('.')])
++
++ " Check that movement after setting cursor position keeps current column.
++ normal j
++ call assert_equal([2, 6], [line('.'), col('.')])
++ endfunc
+*** ../vim-8.1.0211/src/testdir/test_ruby.vim Wed Jan 31 20:11:21 2018
+--- src/testdir/test_ruby.vim Wed Jul 25 21:55:11 2018
+***************
+*** 57,59 ****
+--- 57,72 ----
+ call assert_fails('rubyfile ' . tempfile)
+ call delete(tempfile)
+ endfunc
++
++ func Test_set_cursor()
++ " Check that setting the cursor position works.
++ new
++ call setline(1, ['first line', 'second line'])
++ normal gg
++ rubydo $curwin.cursor = [1, 5]
++ call assert_equal([1, 6], [line('.'), col('.')])
++
++ " Check that movement after setting cursor position keeps current column.
++ normal j
++ call assert_equal([2, 6], [line('.'), col('.')])
++ endfunc
+*** ../vim-8.1.0211/src/testdir/test_tcl.vim Sat Jul 7 22:41:57 2018
+--- src/testdir/test_tcl.vim Wed Jul 25 21:58:09 2018
+***************
+*** 665,667 ****
+--- 665,680 ----
+
+ tcl unset bar
+ endfunc
++
++ func Test_set_cursor()
++ " Check that setting the cursor position works.
++ new
++ call setline(1, ['first line', 'second line'])
++ normal gg
++ tcldo $::vim::current(window) cursor 1 5
++ call assert_equal([1, 5], [line('.'), col('.')])
++
++ " Check that movement after setting cursor position keeps current column.
++ normal j
++ call assert_equal([2, 5], [line('.'), col('.')])
++ endfunc
+*** ../vim-8.1.0211/src/version.c Wed Jul 25 21:19:09 2018
+--- src/version.c Wed Jul 25 21:59:58 2018
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 212,
+ /**/
+
+--
+Yah, well, we had to carve our electrons out of driftwood we'd
+find. In the winter. Uphill. Both ways.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
diff --git a/data/vim/patches/8.1.0213 b/data/vim/patches/8.1.0213
new file mode 100644
index 000000000..ce975306c
--- /dev/null
+++ b/data/vim/patches/8.1.0213
@@ -0,0 +1,197 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0213
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0213
+Problem: CTRL-W CR does not work properly in a quickfix window.
+Solution: Split the window if needed. (Jason Franklin)
+Files: src/normal.c, src/proto/quickfix.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim, src/window.c
+
+
+*** ../vim-8.1.0212/src/normal.c Tue Jun 12 22:05:10 2018
+--- src/normal.c Wed Jul 25 22:14:24 2018
+***************
+*** 6202,6219 ****
+ cap->arg = FORWARD;
+ nv_page(cap);
+ }
+- else
+ #if defined(FEAT_QUICKFIX)
+! /* In a quickfix window a <CR> jumps to the error under the cursor. */
+! if (bt_quickfix(curbuf) && cap->cmdchar == CAR)
+! {
+! if (curwin->w_llist_ref == NULL)
+! do_cmdline_cmd((char_u *)".cc"); /* quickfix window */
+! else
+! do_cmdline_cmd((char_u *)".ll"); /* location list window */
+! }
+! else
+ #endif
+ {
+ #ifdef FEAT_CMDWIN
+ /* In the cmdline window a <CR> executes the command. */
+--- 6202,6213 ----
+ cap->arg = FORWARD;
+ nv_page(cap);
+ }
+ #if defined(FEAT_QUICKFIX)
+! /* Quickfix window only: view the result under the cursor. */
+! else if (bt_quickfix(curbuf) && cap->cmdchar == CAR)
+! qf_view_result(FALSE);
+ #endif
++ else
+ {
+ #ifdef FEAT_CMDWIN
+ /* In the cmdline window a <CR> executes the command. */
+*** ../vim-8.1.0212/src/proto/quickfix.pro Thu May 17 13:52:49 2018
+--- src/proto/quickfix.pro Wed Jul 25 22:14:24 2018
+***************
+*** 7,12 ****
+--- 7,13 ----
+ void qf_age(exarg_T *eap);
+ void qf_history(exarg_T *eap);
+ void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after);
++ void qf_view_result(int split);
+ void ex_cwindow(exarg_T *eap);
+ void ex_cclose(exarg_T *eap);
+ void ex_copen(exarg_T *eap);
+*** ../vim-8.1.0212/src/quickfix.c Sun Jul 8 18:20:18 2018
+--- src/quickfix.c Wed Jul 25 22:35:13 2018
+***************
+*** 3490,3495 ****
+--- 3490,3531 ----
+ }
+
+ /*
++ * When "split" is FALSE: Open the entry/result under the cursor.
++ * When "split" is TRUE: Open the entry/result under the cursor in a new window.
++ */
++ void
++ qf_view_result(int split)
++ {
++ qf_info_T *qi = &ql_info;
++
++ if (!bt_quickfix(curbuf))
++ return;
++
++ if (IS_LL_WINDOW(curwin))
++ qi = GET_LOC_LIST(curwin);
++
++ if (qi == NULL || qi->qf_lists[qi->qf_curlist].qf_count == 0)
++ {
++ EMSG(_(e_quickfix));
++ return;
++ }
++
++ if (split)
++ {
++ char_u cmd[32];
++
++ vim_snprintf((char *)cmd, sizeof(cmd), "split +%ld%s",
++ (long)curwin->w_cursor.lnum,
++ IS_LL_WINDOW(curwin) ? "ll" : "cc");
++ if (do_cmdline_cmd(cmd) == OK)
++ do_cmdline_cmd((char_u *) "clearjumps");
++ return;
++ }
++
++ do_cmdline_cmd((char_u *)(IS_LL_WINDOW(curwin) ? ".ll" : ".cc"));
++ }
++
++ /*
+ * ":cwindow": open the quickfix window if we have errors to display,
+ * close it if not.
+ * ":lwindow": open the location list window if we have locations to display,
+*** ../vim-8.1.0212/src/testdir/test_quickfix.vim Sun Jul 8 16:01:04 2018
+--- src/testdir/test_quickfix.vim Wed Jul 25 22:14:24 2018
+***************
+*** 3504,3506 ****
+--- 3504,3524 ----
+ call assert_equal([' 1 abc:pat1: '],
+ \ split(execute('filter /pat1/ clist'), "\n"))
+ endfunc
++
++ " Tests for the "CTRL-W <CR>" command.
++ func Xview_result_split_tests(cchar)
++ call s:setup_commands(a:cchar)
++
++ " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
++ call g:Xsetlist([])
++ Xopen
++ let l:win_count = winnr('$')
++ call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42')
++ call assert_equal(l:win_count, winnr('$'))
++ Xclose
++ endfunc
++
++ func Test_view_result_split()
++ call Xview_result_split_tests('c')
++ call Xview_result_split_tests('l')
++ endfunc
+*** ../vim-8.1.0212/src/window.c Sun Jun 17 16:23:29 2018
+--- src/window.c Wed Jul 25 22:14:24 2018
+***************
+*** 520,542 ****
+ break;
+ #endif
+
+ case K_KENTER:
+ case CAR:
+- #if defined(FEAT_QUICKFIX)
+- /*
+- * In a quickfix window a <CR> jumps to the error under the
+- * cursor in a new window.
+- */
+ if (bt_quickfix(curbuf))
+! {
+! sprintf((char *)cbuf, "split +%ld%s",
+! (long)curwin->w_cursor.lnum,
+! (curwin->w_llist_ref == NULL) ? "cc" : "ll");
+! do_cmdline_cmd(cbuf);
+! }
+! #endif
+ break;
+!
+
+ /* CTRL-W g extended commands */
+ case 'g':
+--- 520,533 ----
+ break;
+ #endif
+
++ /* Quickfix window only: view the result under the cursor in a new split. */
++ #if defined(FEAT_QUICKFIX)
+ case K_KENTER:
+ case CAR:
+ if (bt_quickfix(curbuf))
+! qf_view_result(TRUE);
+ break;
+! #endif
+
+ /* CTRL-W g extended commands */
+ case 'g':
+*** ../vim-8.1.0212/src/version.c Wed Jul 25 22:02:32 2018
+--- src/version.c Wed Jul 25 22:23:40 2018
+***************
+*** 795,796 ****
+--- 795,798 ----
+ { /* Add new patch number below this line */
++ /**/
++ 213,
+ /**/
+
+--
+You got to work at a mill? Lucky! I got sent back to work in the
+acid-mines for my daily crust of stale bread... which not even the
+birds would eat.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///